Hướng dẫn · 8 phút đọc

Hầu Hết Công Cụ Hiện Đại Hóa COBOL Chỉ Dừng Lại Ở Chương Trình. Nơi Các Dự Án Di Trú Thực Sự Đổ Vỡ Là Job Batch Gọi Nó.

Các công cụ ánh xạ phụ thuộc xoay quanh COBOL thường coi JCL chỉ là một lớp bọc mỏng — một tên job và vài câu lệnh DD. Nhưng phân nhánh theo mã điều kiện, PROC lồng nhau, và các thế hệ GDG mang theo luồng điều khiển thực sự của riêng chúng, và điều này thường xuyên bị bỏ sót khỏi đồ thị phụ thuộc. Vì sao Legacy Dragon phân tích cú pháp JCL như một ngôn ngữ hạng nhất trong cùng một AST, chứ không phải như siêu dữ liệu gắn thêm sau này.

Hầu Hết Công Cụ Hiện Đại Hóa COBOL Chỉ Dừng Lại Ở Chương Trình. Nơi Các Dự Án Di Trú Thực Sự Đổ Vỡ Là Job Batch Gọi Nó.

Dự Án Di Trú Vượt Qua Mọi Bài Kiểm Thử Nhưng Vẫn Trễ Khung Giờ Chạy Batch

Một khuôn mẫu thất bại lặp đi lặp lại trong hiện đại hóa mainframe chẳng liên quan gì đến việc COBOL đã dịch có biên dịch được hay không, hay có cho ra đúng kết quả với một đầu vào cụ thể hay không. Hệ thống vượt qua toàn bộ kiểm thử chức năng, được đưa lên production, rồi lại trễ khung giờ xử lý ngay trong môi trường thực — không phải vì một chương trình cụ thể nào đó sai, mà vì thứ tự thực thi, hành vi checkpoint/restart, và các phụ thuộc về khung giờ chạy batch — những thứ từng chi phối việc job chạy khi nào và chạy như thế nào — chưa bao giờ được đưa vào thiết kế của hệ thống sau di trú. Những đợt đánh giá batch đủ sớm để phát hiện ra điều này là những đợt đánh giá vượt ra ngoài logic chương trình, xem xét cả luồng job, định nghĩa của bộ lập lịch, quan hệ trước-sau giữa các job, và cách xử lý khi job kết thúc bất thường (abend) — tức là lớp vận hành nằm phía trên bất kỳ chương trình đơn lẻ nào.

Lớp vận hành đó có tên gọi riêng, và nó không phải là COBOL. Đó là JCL.

Những Gì Một Bản Đồ Phụ Thuộc Thường Bỏ Sót

Phần lớn công cụ hiện đại hóa COBOL coi JCL chỉ là khung đỡ: một job card, cùng vài câu lệnh EXEC và DD nêu tên chương trình cần chạy và các tệp mà nó thao tác. Đồ thị phụ thuộc thực sự được xây dựng từ phía COBOL — chương trình, copybook, câu lệnh CALL — còn JCL bị thu gọn thành siêu dữ liệu chỉ cho biết chương trình nào chạy vào lúc nào.

Cách nhìn đó bỏ lỡ phần lớn nơi mà sự kết hợp (coupling) trong mainframe thực sự tồn tại. Các tham số ký hiệu (symbolic parameter) của JCL phải được giải quyết thông qua bước mở rộng JCL để lộ ra chương trình nào thực sự đang được job stream gọi tới, thay vì chỉ là các tham chiếu mẫu (template) chưa được giải quyết mà một lượt quét kiểm kê thông thường sẽ báo cáo. Các bước JCL thực thi có điều kiện dựa trên mã trả về (return code) của bước trước đó tạo ra sự kết hợp về luồng điều khiển giữa các chương trình chưa bao giờ trực tiếp gọi nhau trong mã nguồn — và sự kết hợp này hoàn toàn vô hình trong bất kỳ bản kiểm kê nào chỉ dựa trên tài liệu. Cộng thêm các copybook được chia sẻ giữa hàng chục chương trình và các lệnh CALL được giải quyết động lúc chạy, câu trả lời trung thực là: phần lớn tài liệu về phụ thuộc trong mainframe không chỉ thiếu sót — mà mặc định là sai. Một job COBOL duy nhất có thể vừa chuyển tiền, vừa kích hoạt kiểm tra tuân thủ, vừa cập nhật hàng chục báo cáo ở tầng dưới — và trong một lần chạy cụ thể, điều nào thực sự xảy ra có thể phụ thuộc hoàn toàn vào một mã điều kiện được thiết lập từ ba bước job trước đó.

Generation Data Group (GDG) khiến khoảng trống này càng lớn hơn. Một GDG không tham chiếu tới “tệp đó” — nó tham chiếu tới một thế hệ tương đối hoặc tuyệt đối trong một họ dataset xoay vòng, với các quy tắc lưu giữ và dọn dẹp riêng, đến mức các nền tảng hiện đại hóa đã phải xây dựng hẳn phần hỗ trợ chuyên biệt chỉ để giữ đúng ý nghĩa đó thay vì làm phẳng nó thành một tham chiếu tệp tĩnh duy nhất. Một đồ thị phụ thuộc không hiểu các thế hệ GDG sẽ không biết lần chạy job nào thực sự đã tạo ra dữ liệu đầu vào mà bước job tiếp theo sắp đọc.

Ngành Công Cụ Đã Biết Rõ Điều Này

Đây không phải là một quan sát mới mẻ — đó chính là lý do tồn tại cả một nhóm công cụ chuyên để tái dựng lại những phần của đồ thị phụ thuộc mà tài liệu không nắm bắt được. Các sản phẩm như SMART TS XL xây dựng bản đồ phụ thuộc trải rộng qua chương trình COBOL, job JCL, copybook và cấu trúc dữ liệu cùng lúc, chính vì phân tích tĩnh COBOL một cách đơn lẻ chỉ hé lộ một phần độ phức tạp thực sự quyết định chi phí và tiến độ di trú. Luận điểm lớn hơn mà các phân tích ngành liên tục đi đến là: ánh xạ JCL sang COBOL về bản chất là một hoạt động quản trị rủi ro — mọi thay đổi trên hệ thống mainframe đều kéo theo hệ quả vượt ra ngoài phạm vi thành phần thực sự bị thay đổi, và JCL thường chính là nơi “bán kính ảnh hưởng” đó lan tới.

Không có điều nào trong số này là vấn đề nhỏ nếu làm sai. Hơn 71% doanh nghiệp trong danh sách Fortune 500 vẫn đang vận hành các khối lượng công việc trọng yếu trên mainframe, và mainframe đảm nhận khoảng 68% khối lượng công việc IT sản xuất trên toàn cầu trong khi chỉ chiếm khoảng 6% chi tiêu IT — đây là quy mô hạ tầng mà sai sót trong ánh xạ phụ thuộc đặt vào rủi ro sản xuất thực sự, chứ không phải một bài tập trong phòng thí nghiệm.

Vì Sao Legacy Dragon Phân Tích JCL Như Một Ngôn Ngữ Hạng Nhất, Không Phải Tệp Đi Kèm

Legacy Dragon phân tích cú pháp mười ngôn ngữ nguồn — COBOL, JCL, PL/I, VB6, VB.NET, PowerBuilder, Assembly, SQL/DB2, CICS và REXX — thành một đồ thị AST và đồ thị phụ thuộc duy nhất, và trong danh sách đó, JCL đứng ngang hàng với COBOL, chứ không phải như một tệp siêu dữ liệu mô tả nó. Đây là một lựa chọn thiết kế có chủ đích, với cùng lý do khiến việc xử lý bảng mã ký tự của đồ thị này nằm bên trong bộ phân tích cú pháp thay vì trong một script tiền xử lý: một đồ thị được xây dựng bằng cách coi JCL chỉ là khung đỡ sẽ thừa hưởng đúng điểm mù mà mọi bản kiểm kê dựa trên tài liệu đều mắc phải — các nhánh mã điều kiện chưa từng được giải quyết, các thế hệ GDG không thể phân biệt, các tham số ký hiệu chưa được mở rộng. Một đồ thị phân tích JCL như một ngôn ngữ thực sự với luồng điều khiển thực sự có thể biểu diễn một bước job, mã điều kiện mà nó dùng để rẽ nhánh, chương trình mà nó gọi tới, và thế hệ GDG mà nó đọc hoặc ghi — tất cả như các cạnh trong cùng một cấu trúc vốn đã theo dõi đoạn COBOL nào gọi tới copybook nào.

Đó cũng là lý do JCL và điều phối batch là phần mở rộng tự nhiên của phân tích tác động, chứ không phải một tính năng tách biệt: câu hỏi “thay đổi này ảnh hưởng đến những gì” chưa bao giờ có thể trả lời được chỉ từ COBOL, trong trường hợp sự kết hợp thực sự giữa hai chương trình tưởng chừng không liên quan lại chính là một mã điều kiện được thiết lập trong một bước job mà mã nguồn của cả hai chương trình đều chưa bao giờ nhắc tới.

Vượt Ra Ngoài Legacy Dragon

Đây không phải là lập luận rằng điều phối batch khó hơn logic COBOL mà nó kích hoạt, hay rằng JCL xứng đáng được chú ý nhiều hơn những hệ thống mà nó thường bị gộp chung như một chi tiết phụ. Đây là một khẳng định hẹp hơn: một đồ thị phụ thuộc chỉ đầy đủ đến mức các ngôn ngữ mà nó thực sự được xây dựng để phân tích cho phép. Và trên mainframe, một phần đáng kể nguyên nhân thực sự làm đổ vỡ các dự án di trú được viết bằng một ngôn ngữ điều khiển công việc (job control language), không phải một ngôn ngữ lập trình — và phần lớn công cụ được xây dựng chỉ xoay quanh COBOL chưa bao giờ được thiết kế để nhìn thấy nó.


Muốn biết đồ thị phụ thuộc sẽ trông như thế nào khi JCL được phân tích như một ngôn ngữ hạng nhất thay vì khung đỡ quanh COBOL? Xem Legacy Dragon tại dragon.aitytech.com, đọc thêm về vì sao đồ thị AST được xây dựng trước hết như một công cụ phân tích tác động, hoặc liên hệ chúng tôi tại [email protected].

Xem sản phẩm của chúng tôi

Từ MinuteAI đến AgentKits — khám phá các sản phẩm và dự án chúng tôi đã triển khai.

Xem danh mục

Bài viết liên quan

Hướng dẫn

Vì sao tìm kiếm hybrid của AgentKits Memory phải giải quyết tiếng Nhật hai lần

BM25 bỏ lỡ ý nghĩa. Tìm kiếm vector bỏ lỡ chuỗi lỗi chính xác. AgentKits Memory kết hợp cả hai — nhưng với truy vấn tiếng Nhật, tiếng Trung, tiếng Hàn, nửa 'từ khóa' của phép kết hợp đó cần thêm một quyết định nữa bên dưới.

Hướng dẫn

322 Giọng Nói, 142 Ngôn Ngữ, Không Máy Chủ: Để Nhét Được Từng Đó Giọng Nói Vào Một Tab Trình Duyệt

Công cụ chuyển văn bản thành giọng nói của PrivateAI phủ hơn 322 giọng trên 142 ngôn ngữ, chạy hoàn toàn trên thiết bị. Tại sao độ phủ giọng nói và ngôn ngữ — chứ không phải tốc độ — mới là bài toán khó thực sự với TTS chạy trong trình duyệt, và con số này so với các lựa chọn mã nguồn mở và trả phí ra sao.

Hướng dẫn

AgentKits Marketing có 28 kỹ năng. Nhưng không bao giờ nạp quá 5 kỹ năng cùng lúc

File skills-registry.json của Marketing Kit phân loại 28 kỹ năng vào 5 danh mục, kèm một sơ đồ phụ thuộc đầy đủ. Tài liệu nghiên cứu nội bộ của dự án nêu thẳng lý do phải giới hạn số lượng nạp cùng lúc: 'context rot' (suy thoái do ngữ cảnh quá tải). Đây là cách bộ chọn kỹ năng thực tế vận hành, và vì sao nó đơn giản hơn nhiều so với đề xuất nghiên cứu ban đầu.