COBOL coding standards provide guidelines for writing clear, maintainable, and consistent code. Following these standards becomes especially important when multiple developers work on the same codebase or when programs need to be maintained over many years or even decades.
Component | Description |
---|---|
Naming Conventions | Rules for naming variables, procedures, and modules |
Documentation Standards | Guidelines for program headers, comments, and documentation |
Formatting Guidelines | Standards for indentation, spacing, and layout |
Modular Programming | Techniques for structuring code into logical, reusable modules |
Self-Documenting Code | Practices that make code more intuitive without excessive comments |
Naming conventions provide consistency and clarity in how program elements are named. Well-chosen names communicate the purpose and usage of variables, paragraphs, sections, and programs, making the code easier to understand and maintain.
Data items should be named according to these guidelines:
Element | Naming Convention | Examples |
---|---|---|
Working Storage Items | Prefix with WS- and use descriptive names | WS-COUNTER, WS-EMPLOYEE-NAME |
File Description Items | Prefix with file name abbreviation | CUST-ID, EMP-SALARY |
Flags/Indicators | Use -FLAG, -SW (switch), or -IND (indicator) suffix | EOF-FLAG, VALID-DATA-SW |
Counters | Use -COUNT, -CTR, or -COUNTER suffix | RECORD-COUNT, ERROR-CTR |
Numeric Totals | Use -TOTAL, -SUM, or -AMT suffix | INVOICE-TOTAL, SALES-AMT |
Tables/Arrays | Use -TABLE suffix or plural form | PRODUCT-TABLE, EMPLOYEES |
Table Indexes | Use -IDX or -INDEX suffix with table name | PRODUCT-IDX, EMPLOYEE-INDEX |
Condition Names (88) | Use descriptive state names | VALID-CUSTOMER, FILE-IS-OPEN |
Element | Naming Convention | Examples |
---|---|---|
Programs | Short, descriptive name indicating purpose | CUSTMNT (Customer Maintenance), INVPROC (Invoice Processing) |
Sections | Descriptive with -SECTION suffix (optional) | MAIN-PROCESSING, FILE-HANDLING-SECTION |
Paragraphs | Verb-noun combination describing action | PROCESS-CUSTOMER, CALCULATE-TOTALS |
Initialization Paragraphs | Prefix with INIT- or INITIALIZE- | INIT-PROGRAM, INITIALIZE-VARIABLES |
Exit/Termination Paragraphs | Prefix with EXIT- or TERMINATE- | EXIT-PROGRAM, TERMINATE-PROCESSING |
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586IDENTIFICATION DIVISION. PROGRAM-ID. CUSTMNT. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO CUSTFILE ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS CUST-ID. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUST-ID PIC X(6). 05 CUST-NAME PIC X(30). 05 CUST-ADDRESS PIC X(50). 05 CUST-TYPE PIC X. 88 CUST-RETAIL VALUE 'R'. 88 CUST-WHOLESALE VALUE 'W'. 05 CUST-STATUS PIC X. 88 CUST-ACTIVE VALUE 'A'. 88 CUST-INACTIVE VALUE 'I'. 88 CUST-SUSPENDED VALUE 'S'. WORKING-STORAGE SECTION. 01 WS-FLAGS. 05 WS-EOF-FLAG PIC X VALUE 'N'. 88 WS-END-OF-FILE VALUE 'Y'. 05 WS-VALID-DATA-SW PIC X VALUE 'N'. 88 WS-VALID-DATA VALUE 'Y'. 01 WS-COUNTERS. 05 WS-RECORDS-READ PIC 9(5) VALUE ZEROS. 05 WS-UPDATE-COUNT PIC 9(5) VALUE ZEROS. 05 WS-ERROR-COUNT PIC 9(5) VALUE ZEROS. PROCEDURE DIVISION. MAIN-CONTROL SECTION. PERFORM INITIALIZE-PROGRAM PERFORM PROCESS-CUSTOMERS UNTIL WS-END-OF-FILE PERFORM TERMINATE-PROGRAM STOP RUN. INITIALIZE-PROGRAM. OPEN I-O CUSTOMER-FILE PERFORM READ-FIRST-CUSTOMER. PROCESS-CUSTOMERS. PERFORM VALIDATE-CUSTOMER-DATA IF WS-VALID-DATA PERFORM UPDATE-CUSTOMER-RECORD ADD 1 TO WS-UPDATE-COUNT ELSE ADD 1 TO WS-ERROR-COUNT END-IF PERFORM READ-NEXT-CUSTOMER. READ-FIRST-CUSTOMER. READ CUSTOMER-FILE NEXT RECORD AT END SET WS-END-OF-FILE TO TRUE END-READ ADD 1 TO WS-RECORDS-READ. READ-NEXT-CUSTOMER. READ CUSTOMER-FILE NEXT RECORD AT END SET WS-END-OF-FILE TO TRUE END-READ ADD 1 TO WS-RECORDS-READ. VALIDATE-CUSTOMER-DATA. SET WS-VALID-DATA TO TRUE IF CUST-NAME = SPACES SET WS-VALID-DATA TO FALSE END-IF. UPDATE-CUSTOMER-RECORD. * Update logic would go here REWRITE CUSTOMER-RECORD. TERMINATE-PROGRAM. CLOSE CUSTOMER-FILE DISPLAY "Records read: " WS-RECORDS-READ DISPLAY "Records updated: " WS-UPDATE-COUNT DISPLAY "Errors found: " WS-ERROR-COUNT.
This example demonstrates consistent naming conventions throughout the program, from file and record names to working storage items, flags, and procedure names. Note how each name clearly indicates its purpose and how prefixes and suffixes help distinguish different types of data items.
Documentation standards ensure that COBOL programs are well-documented, making them easier to understand, maintain, and modify. Good documentation explains program purpose, logic, assumptions, and business rules that might not be immediately obvious from the code itself.
Every COBOL program should begin with a comprehensive header comment:
1234567891011121314151617181920212223***************************************************************** * PROGRAM ID: INVPROC * * * * DESCRIPTION: Invoice Processing Program. * * Processes daily invoice transactions and * * updates master customer file. * * * * INPUTS: INVTRAN - Daily invoice transaction file * * CUSTMAST - Customer master file * * * * OUTPUTS: CUSTMAST - Updated customer master file * * INVPROC-REPORT - Processing report * * * * AUTHOR: Jane Smith * * DATE: 2023-05-15 * * * * MAINTENANCE: * * DATE PERSON DESCRIPTION * * ---------- ------ ----------------------------------------- * * 2023-06-10 JDS Added credit limit validation check * * 2023-07-22 JDS Modified report format per user request * * 2023-09-15 TJR Added error handling for missing records * *****************************************************************
The program header should include:
Sections and paragraphs should be documented to explain their purpose and logic:
1234567891011121314151617181920212223242526***************************************************************** * VALIDATE-CUSTOMER Section * * Performs validation checks on customer data. * * Validates customer ID, name, and credit limit. * * Sets WS-VALID-CUSTOMER flag based on validation results. * ***************************************************************** VALIDATE-CUSTOMER SECTION. SET WS-VALID-CUSTOMER TO TRUE. * Check if customer ID is valid IF CUST-ID = SPACES OR CUST-ID = ZEROS DISPLAY "Error: Invalid Customer ID" SET WS-VALID-CUSTOMER TO FALSE END-IF. * Verify customer name is not blank IF CUST-NAME = SPACES DISPLAY "Error: Customer name cannot be blank" SET WS-VALID-CUSTOMER TO FALSE END-IF. * Verify credit limit is within acceptable range IF CUST-CREDIT-LIMIT < 0 OR CUST-CREDIT-LIMIT > 100000 DISPLAY "Error: Credit limit out of acceptable range" SET WS-VALID-CUSTOMER TO FALSE END-IF.
Section and paragraph comments should include:
In-line comments should be used judiciously to explain complex logic, business rules, or non-obvious decisions:
1234567891011121314151617181920212223* Apply discount based on customer type and order amount COMPUTE WS-DISCOUNT-AMOUNT = 0. EVALUATE TRUE WHEN CUST-PREFERRED AND ORDER-AMOUNT > 1000 * Preferred customers get 15% discount on orders over $1000 COMPUTE WS-DISCOUNT-AMOUNT = ORDER-AMOUNT * 0.15 WHEN CUST-PREFERRED * Preferred customers get 10% discount on all other orders COMPUTE WS-DISCOUNT-AMOUNT = ORDER-AMOUNT * 0.10 WHEN ORDER-AMOUNT > 5000 * Regular customers get 8% discount on orders over $5000 COMPUTE WS-DISCOUNT-AMOUNT = ORDER-AMOUNT * 0.08 WHEN ORDER-AMOUNT > 1000 * Regular customers get 5% discount on orders over $1000 COMPUTE WS-DISCOUNT-AMOUNT = ORDER-AMOUNT * 0.05 END-EVALUATE. * Round discount to nearest cent (business requirement #BR-2468) COMPUTE WS-DISCOUNT-AMOUNT ROUNDED = WS-DISCOUNT-AMOUNT.
Effective inline comments should:
Consistent code formatting improves readability and makes it easier to navigate through COBOL programs. Good formatting practices make the structure and logic of the program visually apparent and reduce the cognitive load when reading the code.
Proper indentation helps to visually represent the hierarchical structure of COBOL code:
1234567891011121314151617181920212223242526272829303132IDENTIFICATION DIVISION. PROGRAM-ID. STRUCTURED-CODE. PROCEDURE DIVISION. MAIN-LOGIC. PERFORM INITIALIZATION PERFORM PROCESS-DATA UNTIL END-OF-FILE PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN INPUT CUSTOMER-FILE OUTPUT REPORT-FILE PERFORM READ-FIRST-RECORD. PROCESS-DATA. IF VALID-CUSTOMER-RECORD PERFORM PROCESS-CUSTOMER ELSE PERFORM HANDLE-INVALID-RECORD END-IF PERFORM READ-NEXT-RECORD. PROCESS-CUSTOMER. MOVE SPACES TO REPORT-LINE MOVE CUSTOMER-ID TO RL-CUSTOMER-ID MOVE CUSTOMER-NAME TO RL-CUSTOMER-NAME IF CUSTOMER-BALANCE > ZERO COMPUTE RL-AMOUNT = CUSTOMER-BALANCE * 1.05 WRITE REPORT-RECORD END-IF.
Element | Formatting Practice |
---|---|
Division Headers | Followed by a blank line for visual separation |
Section Headers | Preceded by a blank line to create visual separation |
Paragraph Names | Preceded by a blank line except when immediately following a section header |
Data Definitions | Align level numbers, data names, PIC clauses, and VALUE clauses in columns |
Conditional Statements | Use consistent spacing around operators (=, >, <) and logical connectors (AND, OR) |
Statement Groups | Group related statements together with blank lines between logical groups |
Proper alignment in the DATA DIVISION improves readability:
1234567891011121314151617181920212223DATA DIVISION. WORKING-STORAGE SECTION. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC 9(6). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS. 10 STREET-ADDRESS PIC X(25). 10 CITY PIC X(20). 10 STATE PIC XX. 10 ZIP-CODE PIC 9(5). 05 CUSTOMER-DETAILS. 10 ACCOUNT-NUMBER PIC X(10). 10 CREDIT-LIMIT PIC 9(7)V99. 10 CURRENT-BALANCE PIC S9(7)V99. 10 LAST-PAYMENT-DATE PIC 9(8). 01 FLAGS-AND-INDICATORS. 05 EOF-FLAG PIC X VALUE 'N'. 88 END-OF-FILE VALUE 'Y'. 05 VALID-RECORD-FLAG PIC X VALUE 'Y'. 88 VALID-RECORD VALUE 'Y'. 88 INVALID-RECORD VALUE 'N'. 05 RECORD-COUNT PIC 9(6) VALUE ZERO.
Note how the level numbers, data names, PIC clauses, and VALUE clauses are aligned in columns. This vertical alignment makes it easier to scan the data definitions and understand the structure.
COBOL code can be formatted in fixed-format (traditional) or free-format (modern) style:
Format | Characteristics | When to Use |
---|---|---|
Fixed Format |
|
|
Free Format |
|
|
Modular programming in COBOL involves breaking a program into smaller, logical, and manageable components or modules. Each module performs a specific function and can be developed, tested, and maintained independently. This approach enhances program structure, readability, and reusability.
Technique | Description | Best Used For |
---|---|---|
Paragraphs | Simplest form of modules; named sections of code that can be invoked with PERFORM | Small, simple operations within a program |
Sections | Groups of related paragraphs that form a logical unit | Organizing related operations within a program |
Subprograms | Separate COBOL programs that can be called from other programs | Reusable functionality across multiple programs |
Copybooks | External source code included in the program during compilation | Sharing common data definitions or procedures |
Called Programs | External programs invoked using the CALL statement | Complex, independent functionality |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172IDENTIFICATION DIVISION. PROGRAM-ID. MODULAR-EXAMPLE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. COPY STDFILES. *> Copybook containing standard file definitions DATA DIVISION. FILE SECTION. COPY FILEDEF. *> Copybook containing file record layouts WORKING-STORAGE SECTION. COPY WSVARS. *> Copybook containing common variables 01 PROGRAM-FLAGS. 05 EOF-FLAG PIC X VALUE 'N'. 88 END-OF-FILE VALUE 'Y'. PROCEDURE DIVISION. 0000-MAIN-LOGIC. PERFORM 1000-INITIALIZATION PERFORM 2000-PROCESS-DATA UNTIL END-OF-FILE PERFORM 3000-TERMINATION STOP RUN. *> Initialization module 1000-INITIALIZATION. DISPLAY "Starting program execution" PERFORM 1100-OPEN-FILES PERFORM 1200-READ-FIRST-RECORD. 1100-OPEN-FILES. OPEN INPUT CUSTOMER-FILE OUTPUT REPORT-FILE. 1200-READ-FIRST-RECORD. READ CUSTOMER-FILE AT END SET END-OF-FILE TO TRUE END-READ. *> Processing module 2000-PROCESS-DATA. EVALUATE TRUE WHEN VALID-CUSTOMER PERFORM 2100-PROCESS-VALID-CUSTOMER WHEN INACTIVE-CUSTOMER PERFORM 2200-PROCESS-INACTIVE-CUSTOMER WHEN OTHER PERFORM 2300-PROCESS-INVALID-RECORD END-EVALUATE PERFORM 2900-READ-NEXT-RECORD. 2100-PROCESS-VALID-CUSTOMER. CALL 'CUSTPROC' USING CUSTOMER-RECORD, REPORT-RECORD PERFORM 2110-WRITE-REPORT-RECORD. *> Additional processing paragraphs... 2900-READ-NEXT-RECORD. READ CUSTOMER-FILE AT END SET END-OF-FILE TO TRUE END-READ. *> Termination module 3000-TERMINATION. CLOSE CUSTOMER-FILE REPORT-FILE DISPLAY "Program completed successfully" DISPLAY "Processed " RECORD-COUNT " records" .
This example demonstrates several modular programming techniques:
When designing modules in COBOL, follow these guidelines:
Development Benefits
Maintenance Benefits
Self-documenting code is code that clearly communicates its intent through careful design, meaningful naming, and logical structure, reducing the need for extensive comments. Well-written COBOL code should be largely self-explanatory, making it easier to understand and maintain.
Poor Naming | Self-Documenting Naming | Improvement |
---|---|---|
P1 | CALCULATE-MONTHLY-PAYMENT | Clearly communicates the paragraph's purpose |
FLG | VALID-TRANSACTION-FLAG | Indicates what the flag represents |
AMT1 | GROSS-SALARY-AMOUNT | Specifies which amount and its type |
CTR | EMPLOYEE-RECORD-COUNTER | Indicates what is being counted |
PRCS-REC | PROCESS-CUSTOMER-RECORD | Uses complete words for clarity |
Using 88-level condition names makes code more readable and self-documenting:
123456789101112131415161718192021*> Instead of this: IF CUSTOMER-STATUS = 'A' PERFORM PROCESS-ACTIVE-CUSTOMER ELSE IF CUSTOMER-STATUS = 'I' PERFORM PROCESS-INACTIVE-CUSTOMER END-IF *> Use this: 01 CUSTOMER-DETAILS. 05 CUSTOMER-STATUS PIC X. 88 ACTIVE-CUSTOMER VALUE 'A'. 88 INACTIVE-CUSTOMER VALUE 'I'. 88 NEW-CUSTOMER VALUE 'N'. 88 CLOSED-ACCOUNT VALUE 'C'. *> Which enables this clear code: IF ACTIVE-CUSTOMER PERFORM PROCESS-ACTIVE-CUSTOMER ELSE IF INACTIVE-CUSTOMER PERFORM PROCESS-INACTIVE-CUSTOMER END-IF
The 88-level condition names serve as self-documenting boolean tests, making the code more readable and resilient to changes in the underlying values.
Organizing code in a logical structure enhances self-documentation:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556*> Poorly structured, hard to follow: PROCESS-RECORDS. READ INPUT-FILE AT END MOVE 'Y' TO EOF-FLAG END-READ IF EOF-FLAG NOT = 'Y' IF RECORD-TYPE = 'C' MOVE CORR INPUT-RECORD TO CUSTOMER-RECORD WRITE CUSTOMER-RECORD ADD 1 TO CUSTOMER-COUNT ELSE IF RECORD-TYPE = 'O' MOVE CORR INPUT-RECORD TO ORDER-RECORD WRITE ORDER-RECORD ADD 1 TO ORDER-COUNT ELSE ADD 1 TO ERROR-COUNT END-IF END-IF GO TO PROCESS-RECORDS END-IF. *> Better structured, self-documenting: PROCESS-RECORDS. PERFORM UNTIL END-OF-FILE PERFORM READ-NEXT-RECORD IF NOT END-OF-FILE EVALUATE RECORD-TYPE WHEN 'C' PERFORM PROCESS-CUSTOMER-RECORD WHEN 'O' PERFORM PROCESS-ORDER-RECORD WHEN OTHER PERFORM PROCESS-ERROR-RECORD END-EVALUATE END-IF END-PERFORM. READ-NEXT-RECORD. READ INPUT-FILE AT END SET END-OF-FILE TO TRUE END-READ. PROCESS-CUSTOMER-RECORD. MOVE CORRESPONDING INPUT-RECORD TO CUSTOMER-RECORD WRITE CUSTOMER-RECORD ADD 1 TO CUSTOMER-COUNT. PROCESS-ORDER-RECORD. MOVE CORRESPONDING INPUT-RECORD TO ORDER-RECORD WRITE ORDER-RECORD ADD 1 TO ORDER-COUNT. PROCESS-ERROR-RECORD. ADD 1 TO ERROR-COUNT.
The second example is more self-documenting because:
Even with self-documenting code, strategic comments are valuable in certain cases:
Comment Type | When to Use |
---|---|
Business Rules | cobol
|
Complex Algorithms | cobol
|
Performance Optimizations | cobol
|
Non-Obvious Workarounds | cobol
|
Over-Commented | Self-Documenting |
---|---|
cobol
| cobol
|
The self-documenting version uses meaningful names, clearly structured code, and condition names to express intent without needing comments that simply restate what the code is doing.
1. Why are naming conventions important in COBOL programs?
2. What is a recommended practice for COBOL variable naming?
3. What is a key aspect of self-documenting code in COBOL?
4. What is the purpose of modular programming in COBOL?
5. Which of the following is a good practice for COBOL code formatting?
Rewrite the following data definitions using more descriptive and self-documenting names:
1234567891001 REC1. 05 FLD1 PIC X(5). 05 FLD2 PIC 9(6). 05 FLD3 PIC X(25). 05 FLD4 PIC 9(8). 05 FLD5 PIC 9(7)V99. 01 CNTR PIC 9(4) VALUE ZERO. 01 F PIC X VALUE 'N'. 01 ST PIC 99 VALUE ZERO.
123456789101112131401 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC X(5). 05 ACCOUNT-NUMBER PIC 9(6). 05 CUSTOMER-NAME PIC X(25). 05 BIRTH-DATE PIC 9(8). 05 ACCOUNT-BALANCE PIC 9(7)V99. 01 RECORD-COUNTER PIC 9(4) VALUE ZERO. 01 EOF-FLAG PIC X VALUE 'N'. 88 END-OF-FILE VALUE 'Y'. 01 STATUS-CODE PIC 99 VALUE ZERO. 88 STATUS-SUCCESS VALUE 0. 88 STATUS-NOT-FOUND VALUE 10. 88 STATUS-ERROR VALUE 99.
Refactor the following monolithic code into well-structured, modular code with appropriate paragraphs:
1234567891011121314151617181920212223242526272829303132333435363738PROCEDURE DIVISION. MAIN-LOGIC. OPEN INPUT CUSTOMER-FILE OUTPUT REPORT-FILE READ CUSTOMER-FILE AT END MOVE 'Y' TO EOF-FLAG END-READ PERFORM UNTIL EOF-FLAG = 'Y' MOVE SPACES TO REPORT-RECORD MOVE CUSTOMER-NAME TO REPORT-NAME MOVE CUSTOMER-ID TO REPORT-ID IF ACCOUNT-TYPE = 'S' COMPUTE INTEREST = BALANCE * 0.02 ELSE IF ACCOUNT-TYPE = 'C' COMPUTE INTEREST = BALANCE * 0.01 ELSE MOVE 0 TO INTEREST END-IF END-IF ADD INTEREST TO BALANCE MOVE BALANCE TO REPORT-BALANCE MOVE INTEREST TO REPORT-INTEREST WRITE REPORT-RECORD READ CUSTOMER-FILE AT END MOVE 'Y' TO EOF-FLAG END-READ END-PERFORM CLOSE CUSTOMER-FILE REPORT-FILE STOP RUN.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455PROCEDURE DIVISION. MAIN-LOGIC. PERFORM 1000-INITIALIZATION PERFORM 2000-PROCESS-RECORDS UNTIL END-OF-FILE PERFORM 3000-TERMINATION STOP RUN. 1000-INITIALIZATION. OPEN INPUT CUSTOMER-FILE OUTPUT REPORT-FILE PERFORM 1100-READ-FIRST-RECORD. 1100-READ-FIRST-RECORD. READ CUSTOMER-FILE AT END SET END-OF-FILE TO TRUE END-READ. 2000-PROCESS-RECORDS. PERFORM 2100-PREPARE-REPORT-RECORD PERFORM 2200-CALCULATE-INTEREST PERFORM 2300-UPDATE-BALANCE PERFORM 2400-WRITE-REPORT PERFORM 2500-READ-NEXT-RECORD. 2100-PREPARE-REPORT-RECORD. MOVE SPACES TO REPORT-RECORD MOVE CUSTOMER-NAME TO REPORT-NAME MOVE CUSTOMER-ID TO REPORT-ID. 2200-CALCULATE-INTEREST. EVALUATE ACCOUNT-TYPE WHEN 'S' COMPUTE INTEREST = BALANCE * 0.02 WHEN 'C' COMPUTE INTEREST = BALANCE * 0.01 WHEN OTHER MOVE ZERO TO INTEREST END-EVALUATE. 2300-UPDATE-BALANCE. ADD INTEREST TO BALANCE MOVE BALANCE TO REPORT-BALANCE MOVE INTEREST TO REPORT-INTEREST. 2400-WRITE-REPORT. WRITE REPORT-RECORD. 2500-READ-NEXT-RECORD. READ CUSTOMER-FILE AT END SET END-OF-FILE TO TRUE END-READ. 3000-TERMINATION. CLOSE CUSTOMER-FILE REPORT-FILE.
Create a basic COBOL coding standards document for a team project. Your document should include:
COBOL Coding Standards for [Project Name]
Naming Conventions
Formatting Guidelines
Documentation Requirements
Module Design
Good/Bad Examples
Understanding how to structure procedures in COBOL.
How to implement modular design with subprograms.
The fundamental structure of a COBOL program.
Methods for finding and fixing bugs in COBOL programs.
How to document and maintain COBOL programs effectively.