
Ibm Mainframe
- 42 installs
- 14 repo stars
- Updated January 23, 2026
- dauquangthanh/hanoi-rainbow
ibm-mainframe is a Hanoi Rainbow agent skill that documents z/OS administration and application practices so developers can run and modernize IBM mainframe systems.
About
The ibm-mainframe skill delivers comprehensive IBM z/OS guidance spanning system administration, JCL batch processing, COBOL and CICS development, DB2 usage, security systems, and modernization strategies. It routes tasks to detailed references for ISPF operations, compile workflows, and cloud integration options such as z/OS Connect and CDC. Reach for it when you maintain or modernize IBM mainframe environments and need structured agent help across operations, application code, and migration planning.
- Reference paths for z/OS admin, JCL batch, COBOL programming, and modernization
- Covers CICS, IMS, DB2, VSAM, GDG, RACF, and JES2/JES3 operations
- Documents Git via USS, Zowe CLI, DBB builds, and IDE extensions
- Outlines rehost, replatform, refactor, and retire modernization approaches
Ibm Mainframe by the numbers
- 42 all-time installs (skills.sh)
- Ranked #3,272 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dauquangthanh/hanoi-rainbow --skill ibm-mainframeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 42 |
|---|---|
| repo stars | ★ 14 |
| Last updated | January 23, 2026 |
| Repository | dauquangthanh/hanoi-rainbow ↗ |
How do you administer, develop on, or modernize z/OS workloads without missing JCL, CICS, or security conventions?
Guides z/OS administration, JCL batch, COBOL and CICS development, DB2 operations, security, and mainframe-to-cloud modernization paths.
Who is it for?
Developers and operators working on z/OS, JCL, COBOL, CICS, IMS, or DB2 who need reference-backed procedures and modernization options.
Skip if: Teams with no IBM mainframe footprint or cloud-only microservice work unrelated to z/OS assets.
When should I use this skill?
Users mention mainframe, z/OS, MVS, TSO, ISPF, JCL, CICS, IMS, VSAM, RACF, or mainframe modernization.
What you get
Task-specific guidance from z/OS, JCL, COBOL, or modernization reference files plus recommended integration or migration approaches.
Files
IBM Mainframe
Overview
Comprehensive guidance for IBM Mainframe (z/OS) administration, development, operations, and modernization. Covers system programming, application development, middleware configuration, database management, and migration strategies for mainframe environments.
Quick Start Guide
Choose your task and load the appropriate reference:
1. z/OS System Administration → Load zos-administration.md for system operations, address spaces, JES2/JES3, TSO/ISPF commands, dataset management, and USS 2. JCL Development & Batch Processing → Load jcl-batch-processing.md for JCL syntax, utilities (IEBGENER, SORT, IDCAMS), procedures, GDG management, and job scheduling 3. COBOL Programming → Load cobol-programming.md for COBOL structure, file handling, DB2/CICS integration, compile/link procedures, and debugging 4. Mainframe Modernization → Load mainframe-modernization.md for migration strategies, assessment, rehost/replatform/refactor approaches, and cloud integration
Core Mainframe Concepts
z/OS Operating System
- MVS (Multiple Virtual Storage): Core OS components
- JES2/JES3: Job Entry Subsystems for batch processing
- TSO/ISPF: Time Sharing Option / Interactive System Productivity Facility
- USS: Unix System Services (POSIX environment on z/OS)
- Address Spaces: Isolated execution environments (ASID)
Key Subsystems
- CICS: Customer Information Control System (transaction processing)
- IMS: Information Management System (hierarchical DB + transaction manager)
- DB2: Relational database management system
- MQ: Message queuing middleware
- WebSphere: Application server for Java applications
Data Management
- VSAM: Virtual Storage Access Method (indexed, sequential, relative record)
- Sequential Files: PS (Physical Sequential), PDS (Partitioned Data Set), PDSE
- GDG: Generation Data Group (versioned datasets)
- SMS: Storage Management Subsystem (automated data management)
Security Systems
- RACF: Resource Access Control Facility (IBM)
- ACF2: Access Control Facility 2 (CA Technologies)
- Top Secret: Security system (CA Technologies)
Common Mainframe Tasks
For detailed syntax, examples, and procedures, load the appropriate reference file:
Administration & Operations
- JCL job submission & monitoring: Load jcl-batch-processing.md
- Dataset management: Load zos-administration.md
- VSAM file operations: Load jcl-batch-processing.md
Application Development
- COBOL programming: Load cobol-programming.md
- CICS transaction management: Load cobol-programming.md
- DB2 operations: Load cobol-programming.md
System Management
- Security (RACF/ACF2): Load zos-administration.md
- Performance monitoring: Load zos-administration.md
Mainframe Development Workflow
For complete development procedures, compile JCL, version control integration, and testing strategies, load cobol-programming.md.
Typical development cycle:
1. Edit source code (ISPF or modern IDE) 2. Compile and link programs 3. Test in development environment 4. Version control and promotion 5. Deploy to production
Modern development approaches:
- Git integration via USS (Unix System Services)
- Zowe CLI for remote access and CI/CD
- DBB (Dependency Based Build) for automated builds
- Eclipse/VS Code with mainframe extensions
Mainframe Modernization Strategies
For comprehensive migration guidance, assessment procedures, and specific migration patterns, load mainframe-modernization.md.
Key approaches:
1. Rehost (Lift & Shift): Mainframe emulators on x86/cloud (fastest, minimal changes) 2. Replatform: Migrate to modern languages (Java, C#) with automated conversion 3. Refactor: Redesign as microservices with modern architecture patterns 4. Retire/Replace: Replace with COTS or modern SaaS alternatives
Integration options:
- z/OS Connect for RESTful APIs
- IBM MQ for messaging
- CDC (Change Data Capture) for data replication
- DevOps integration with Zowe, Jenkins, Git
Best Practices
Development
1. Use structured programming (avoid ALTER, computed GO TO) 2. Modular design with focused paragraphs/sections 3. Comprehensive error handling (EXEC CICS HANDLE, SQL SQLCODE checks) 4. Clear documentation with meaningful variable names 5. Performance optimization (minimize I/O, efficient SQL, proper indexing)
Operations
1. Automation with JCL procedures, REXX scripts, automation tools 2. Proactive monitoring with alerts and performance baselines 3. Regular backup & recovery with DR testing 4. Capacity planning to monitor trends and forecast growth 5. Security with least privilege, regular audits, compliance
Migration
1. Phased approach to reduce risk incrementally 2. Data integrity validation before and after migration 3. Parallel running of old and new systems 4. Maintain rollback plans 5. Extensive documentation and team training
For detailed procedures, load the appropriate reference file.
Tooling Ecosystem
IBM Native Tools
- ISPF: Primary development interface
- SDSF: Job and output management
- RMF/SMF: Performance monitoring and system logging
- OMVS: Unix shell environment on z/OS
Modern Mainframe Tools
- Zowe: Open-source framework for mainframe modernization
- DBB: Dependency Based Build for DevOps
- IBM Wazi: Cloud-native development environment
- Topaz/IBM Developer for z/OS: Modern IDEs
Migration Tools
- Micro Focus Enterprise Suite: Rehost solution
- LzLabs/AWS Mainframe Modernization: Cloud migration platforms
- IBM Rational/CAST: Application analysis tools
For detailed tool usage, configuration, and examples, load the appropriate reference file.
Common Issues & Solutions
Job Failures
- S0C7 (Data exception): Invalid numeric data, uninitialized variables, data conversion errors
- S806 (Program not found): Missing STEPLIB/JOBLIB, linking issues, wrong load library
- S322 (Time out): Infinite loop, long-running query, insufficient TIME parameter
- S013/S213/S413 (OPEN failure): Dataset allocation issues, DISP conflicts, missing dataset
Performance Issues
- High CPU: Inefficient code, missing indexes, excessive I/O
- Long response time: Network latency, database contention, poor SQL
- Memory constraints: Virtual storage shortage, insufficient region size
Security Issues
- Access denied: Check RACF permissions and group memberships
- Unauthorized program: Not in APF library or not properly authorized
- Dataset protection: Review UACC and specific permits
For detailed troubleshooting procedures, load the appropriate reference file.
Key Concepts Glossary
- DASD: Direct Access Storage Device (disk storage)
- ABEND: Abnormal End (program crash)
- IPL: Initial Program Load (system boot)
- LPAR: Logical Partition (virtual machine)
- SYSPLEX: System Complex (cluster of z/OS systems)
- Coupling Facility: High-speed memory for parallel sysplex
- HCD/HCM: Hardware Configuration Dialog/Manager
- SMP/E: System Modification Program/Extended (maintenance)
- ISPF: Interactive System Productivity Facility
- REXX: Restructured Extended Executor (scripting language)
Critical Considerations
Data Integrity
- VSAM files require proper SHAREOPTIONS
- DB2 locking and isolation levels must be configured correctly
- GDG generation management for versioned datasets
- Always backup before changes
System Performance
- Batch window constraints (limited time for batch jobs)
- Online transaction response time requirements (sub-second)
- Resource contention management (CPU, I/O, memory)
- Capacity planning for growth
Security & Compliance
- RACF/ACF2 configuration and maintenance
- Audit trails and compliance requirements (SOX, PCI-DSS, GDPR)
- Separation of duties enforcement
High Availability
- Parallel Sysplex for redundancy
- GDPS (Geographically Dispersed Parallel Sysplex) for disaster recovery
- Continuous availability requirements
Output Requirements
When analyzing or documenting mainframe systems, provide:
1. System inventory: Operating system version, middleware, applications 2. Architecture diagram: LPAR layout, subsystems, connectivity 3. Dependency mapping: Job dependencies, program CALL trees, data flows 4. Security assessment: User access, dataset protection, compliance gaps 5. Performance baseline: CPU, I/O, response times, throughput 6. Modernization roadmap: Assessment results, approach, timeline, risks (load mainframe-modernization.md) 7. Migration plan: Phased approach, cutover strategy, rollback procedures 8. Documentation: Technical specifications, runbooks, operational procedures
For specific output formats and templates, load the appropriate reference file.
Next Steps
For specific tasks, load the relevant reference file from the Quick Start Guide above. Each reference provides detailed procedures, commands, examples, and troubleshooting guidance for that specific area of mainframe operations.
COBOL Programming on Mainframe
COBOL Program Structure
Complete Program Template
IDENTIFICATION DIVISION.
PROGRAM-ID. CUSTINQ.
AUTHOR. DEVELOPMENT TEAM.
DATE-WRITTEN. 2024-01-15.
*****************************************************************
* PROGRAM: CUSTINQ - Customer Inquiry *
* PURPOSE: Query customer data from DB2 *
* INPUT: Customer ID from terminal *
* OUTPUT: Customer details to terminal *
*****************************************************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-Z15.
OBJECT-COMPUTER. IBM-Z15.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CUSTOMER-FILE
ASSIGN TO CUSTMAST
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS CUST-ID
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD CUSTOMER-FILE
RECORDING MODE IS F
BLOCK CONTAINS 0 RECORDS.
01 CUSTOMER-RECORD.
05 CUST-ID PIC 9(10).
05 CUST-NAME PIC X(50).
05 CUST-ADDRESS PIC X(100).
05 CUST-BALANCE PIC S9(11)V99 COMP-3.
05 CUST-STATUS PIC X(01).
88 ACTIVE-CUSTOMER VALUE 'A'.
88 INACTIVE-CUSTOMER VALUE 'I'.
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS PIC XX.
88 FILE-SUCCESS VALUE '00'.
88 EOF-REACHED VALUE '10'.
88 RECORD-NOT-FOUND VALUE '23'.
01 WS-COUNTERS.
05 WS-RECORDS-READ PIC 9(07) COMP VALUE ZERO.
05 WS-RECORDS-WRITTEN PIC 9(07) COMP VALUE ZERO.
01 WS-DISPLAYS.
05 WS-EDIT-BALANCE PIC ZZZ,ZZZ,ZZ9.99-.
PROCEDURE DIVISION.
0000-MAIN-ROUTINE.
PERFORM 1000-INITIALIZE
PERFORM 2000-PROCESS-RECORDS
PERFORM 3000-FINALIZE
STOP RUN.
1000-INITIALIZE.
OPEN INPUT CUSTOMER-FILE
IF NOT FILE-SUCCESS
DISPLAY 'ERROR OPENING CUSTOMER FILE: ' WS-FILE-STATUS
MOVE 16 TO RETURN-CODE
STOP RUN
END-IF
DISPLAY 'INITIALIZATION COMPLETE'.
2000-PROCESS-RECORDS.
PERFORM 2100-READ-CUSTOMER
PERFORM UNTIL EOF-REACHED
PERFORM 2200-PROCESS-CUSTOMER
PERFORM 2100-READ-CUSTOMER
END-PERFORM.
2100-READ-CUSTOMER.
READ CUSTOMER-FILE NEXT
AT END
SET EOF-REACHED TO TRUE
NOT AT END
ADD 1 TO WS-RECORDS-READ
END-READ.
2200-PROCESS-CUSTOMER.
IF ACTIVE-CUSTOMER
MOVE CUST-BALANCE TO WS-EDIT-BALANCE
DISPLAY 'CUSTOMER: ' CUST-NAME
DISPLAY 'BALANCE: ' WS-EDIT-BALANCE
ADD 1 TO WS-RECORDS-WRITTEN
END-IF.
3000-FINALIZE.
CLOSE CUSTOMER-FILE
DISPLAY 'RECORDS READ: ' WS-RECORDS-READ
DISPLAY 'RECORDS WRITTEN: ' WS-RECORDS-WRITTEN
DISPLAY 'PROCESSING COMPLETE'.Data Types & Definitions
Numeric Types
* Display numeric (EBCDIC)
01 WS-AMOUNT-1 PIC 9(07)V99 VALUE ZERO.
* Signed display numeric
01 WS-AMOUNT-2 PIC S9(07)V99 VALUE ZERO.
* Binary (COMP)
01 WS-COUNTER PIC 9(07) COMP VALUE ZERO.
01 WS-INDEX PIC S9(04) COMP VALUE ZERO.
* Packed decimal (COMP-3) - Recommended for calculations
01 WS-BALANCE PIC S9(11)V99 COMP-3 VALUE ZERO.
01 WS-TOTAL PIC S9(13)V99 COMP-3 VALUE ZERO.Character Types
* Alphanumeric
01 WS-NAME PIC X(50) VALUE SPACES.
01 WS-ADDRESS PIC X(100) VALUE SPACES.
* Alphabetic
01 WS-ALPHA-FIELD PIC A(30) VALUE SPACES.
* National (Unicode)
01 WS-UNICODE-NAME PIC N(50) VALUE SPACES.Group Items & Structures
01 CUSTOMER-RECORD.
05 CUST-KEY.
10 CUST-TYPE PIC X(02).
10 CUST-ID PIC 9(10).
05 CUST-DATA.
10 CUST-NAME PIC X(50).
10 CUST-ADDRESS.
15 ADDR-LINE-1 PIC X(40).
15 ADDR-LINE-2 PIC X(40).
15 ADDR-CITY PIC X(30).
15 ADDR-STATE PIC X(02).
15 ADDR-ZIP PIC 9(05).
05 CUST-FINANCIAL.
10 CUST-BALANCE PIC S9(11)V99 COMP-3.
10 CUST-CREDIT-LIMIT PIC S9(09)V99 COMP-3.Arrays (OCCURS)
* Fixed array
01 MONTHLY-SALES.
05 MONTH-SALE PIC S9(09)V99 COMP-3
OCCURS 12 TIMES.
* Variable array
01 TRANSACTION-TABLE.
05 TXN-COUNT PIC 9(04) COMP.
05 TXN-ENTRY OCCURS 1 TO 9999 TIMES
DEPENDING ON TXN-COUNT.
10 TXN-DATE PIC 9(08).
10 TXN-AMOUNT PIC S9(09)V99 COMP-3.
* Indexed array
01 PRODUCT-TABLE.
05 PRODUCT-ENTRY OCCURS 500 TIMES
INDEXED BY PROD-IDX.
10 PROD-CODE PIC X(10).
10 PROD-DESC PIC X(50).
10 PROD-PRICE PIC S9(07)V99 COMP-3.Condition Names (88 Levels)
01 RECORD-STATUS PIC X(01).
88 STATUS-ACTIVE VALUE 'A'.
88 STATUS-INACTIVE VALUE 'I'.
88 STATUS-PENDING VALUE 'P'.
88 STATUS-CLOSED VALUE 'C'.
88 VALID-STATUS VALUES 'A' 'I' 'P' 'C'.
01 TRANSACTION-TYPE PIC XX.
88 DEBIT-TXN VALUE '01' '02' '05'.
88 CREDIT-TXN VALUE '10' '11' '15'.REDEFINES
01 DATE-FIELD.
05 DATE-NUMERIC PIC 9(08).
05 DATE-PARTS REDEFINES DATE-NUMERIC.
10 DATE-YEAR PIC 9(04).
10 DATE-MONTH PIC 9(02).
10 DATE-DAY PIC 9(02).
01 ACCOUNT-KEY.
05 ACCOUNT-NUMBER PIC X(10).
05 ACCOUNT-BREAKDOWN REDEFINES ACCOUNT-NUMBER.
10 ACCT-BRANCH PIC X(03).
10 ACCT-TYPE PIC X(02).
10 ACCT-SEQUENCE PIC X(05).File Processing
Sequential File
FILE-CONTROL.
SELECT INPUT-FILE
ASSIGN TO INFILE
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-INPUT-STATUS.
PROCEDURE DIVISION.
OPEN INPUT INPUT-FILE
PERFORM READ-RECORD
PERFORM UNTIL EOF-INPUT
PERFORM PROCESS-RECORD
PERFORM READ-RECORD
END-PERFORM
CLOSE INPUT-FILE.
READ-RECORD.
READ INPUT-FILE
AT END
SET EOF-INPUT TO TRUE
END-READ.Indexed File (VSAM KSDS)
FILE-CONTROL.
SELECT MASTER-FILE
ASSIGN TO MASTER
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS MASTER-KEY
ALTERNATE RECORD KEY IS MASTER-ALT-KEY
WITH DUPLICATES
FILE STATUS IS WS-MASTER-STATUS.
PROCEDURE DIVISION.
* Random read
MOVE '1234567890' TO MASTER-KEY
READ MASTER-FILE
INVALID KEY
DISPLAY 'RECORD NOT FOUND'
END-READ.
* Sequential read
OPEN INPUT MASTER-FILE
PERFORM READ-NEXT
PERFORM UNTIL EOF-MASTER
PERFORM PROCESS-RECORD
PERFORM READ-NEXT
END-PERFORM.
READ-NEXT.
READ MASTER-FILE NEXT
AT END
SET EOF-MASTER TO TRUE
END-READ.
* Update
MOVE '1234567890' TO MASTER-KEY
READ MASTER-FILE UPDATE
IF FILE-SUCCESS
MOVE 'NEW VALUE' TO MASTER-DATA
REWRITE MASTER-RECORD
END-IF.
* Write new record
MOVE '9999999999' TO MASTER-KEY
MOVE 'NEW CUSTOMER' TO MASTER-NAME
WRITE MASTER-RECORD
INVALID KEY
DISPLAY 'DUPLICATE KEY'
END-WRITE.
* Delete
MOVE '1234567890' TO MASTER-KEY
DELETE MASTER-FILE
INVALID KEY
DISPLAY 'RECORD NOT FOUND'
END-DELETE.DB2 Integration
SQL Declaration
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE CUSTOMER
END-EXEC.
EXEC SQL DECLARE CUSTCUR CURSOR FOR
SELECT CUST_ID, CUST_NAME, CUST_BALANCE
FROM CUSTOMER
WHERE CUST_STATUS = 'A'
ORDER BY CUST_NAME
END-EXEC.
01 WS-CUST-ID PIC 9(10).
01 WS-CUST-NAME PIC X(50).
01 WS-CUST-BALANCE PIC S9(11)V99 COMP-3.SQL Operations
PROCEDURE DIVISION.
* Single row SELECT
EXEC SQL
SELECT CUST_NAME, CUST_BALANCE
INTO :WS-CUST-NAME, :WS-CUST-BALANCE
FROM CUSTOMER
WHERE CUST_ID = :WS-CUST-ID
END-EXEC
IF SQLCODE = 0
DISPLAY 'CUSTOMER: ' WS-CUST-NAME
ELSE
IF SQLCODE = 100
DISPLAY 'CUSTOMER NOT FOUND'
ELSE
DISPLAY 'SQL ERROR: ' SQLCODE
END-IF
END-IF.
* Cursor processing
EXEC SQL
OPEN CUSTCUR
END-EXEC
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH CUSTCUR
INTO :WS-CUST-ID, :WS-CUST-NAME, :WS-CUST-BALANCE
END-EXEC
IF SQLCODE = 0
PERFORM PROCESS-CUSTOMER
END-IF
END-PERFORM
EXEC SQL
CLOSE CUSTCUR
END-EXEC.
* INSERT
EXEC SQL
INSERT INTO CUSTOMER
(CUST_ID, CUST_NAME, CUST_BALANCE)
VALUES
(:WS-CUST-ID, :WS-CUST-NAME, :WS-CUST-BALANCE)
END-EXEC.
* UPDATE
EXEC SQL
UPDATE CUSTOMER
SET CUST_BALANCE = :WS-CUST-BALANCE
WHERE CUST_ID = :WS-CUST-ID
END-EXEC.
* DELETE
EXEC SQL
DELETE FROM CUSTOMER
WHERE CUST_ID = :WS-CUST-ID
END-EXEC.
* COMMIT/ROLLBACK
IF PROCESSING-OK
EXEC SQL
COMMIT
END-EXEC
ELSE
EXEC SQL
ROLLBACK
END-EXEC
END-IF.CICS Programming
CICS Commands
WORKING-STORAGE SECTION.
01 WS-COMMAREA.
05 CA-FUNCTION PIC X(08).
05 CA-CUST-ID PIC 9(10).
05 CA-CUST-DATA PIC X(200).
01 WS-RESP PIC S9(08) COMP.
01 WS-RESP2 PIC S9(08) COMP.
PROCEDURE DIVISION.
* Receive input
EXEC CICS RECEIVE
INTO(WS-INPUT-AREA)
LENGTH(WS-INPUT-LENGTH)
RESP(WS-RESP)
END-EXEC.
* Read from file
EXEC CICS READ
FILE('CUSTMAST')
INTO(CUSTOMER-RECORD)
RIDFLD(WS-CUST-ID)
RESP(WS-RESP)
END-EXEC
EVALUATE WS-RESP
WHEN DFHRESP(NORMAL)
PERFORM PROCESS-CUSTOMER
WHEN DFHRESP(NOTFND)
DISPLAY 'CUSTOMER NOT FOUND'
WHEN OTHER
PERFORM ERROR-ROUTINE
END-EVALUATE.
* Write/Update
EXEC CICS WRITE
FILE('CUSTMAST')
FROM(CUSTOMER-RECORD)
RIDFLD(WS-CUST-ID)
RESP(WS-RESP)
END-EXEC.
EXEC CICS REWRITE
FILE('CUSTMAST')
FROM(CUSTOMER-RECORD)
RESP(WS-RESP)
END-EXEC.
* Link to another program
EXEC CICS LINK
PROGRAM('CUSTVAL')
COMMAREA(WS-COMMAREA)
LENGTH(LENGTH OF WS-COMMAREA)
RESP(WS-RESP)
END-EXEC.
* Return to CICS
EXEC CICS RETURN
END-EXEC.
* Send output
EXEC CICS SEND
FROM(WS-OUTPUT-AREA)
LENGTH(WS-OUTPUT-LENGTH)
ERASE
END-EXEC.Copybooks
Data Structure Copybook
*****************************************************************
* COPYBOOK: CUSTCOPY *
* PURPOSE: Customer record structure *
*****************************************************************
01 CUSTOMER-RECORD.
05 CUST-KEY.
10 CUST-ID PIC 9(10).
05 CUST-PERSONAL.
10 CUST-FIRST-NAME PIC X(30).
10 CUST-LAST-NAME PIC X(30).
10 CUST-DOB PIC 9(08).
05 CUST-ADDRESS.
10 CUST-STREET PIC X(40).
10 CUST-CITY PIC X(30).
10 CUST-STATE PIC X(02).
10 CUST-ZIP PIC 9(05).
05 CUST-FINANCIAL.
10 CUST-BALANCE PIC S9(11)V99 COMP-3.
10 CUST-CREDIT-LIMIT PIC S9(09)V99 COMP-3.
05 CUST-AUDIT.
10 CUST-CREATE-DATE PIC 9(08).
10 CUST-UPDATE-DATE PIC 9(08).
10 CUST-UPDATE-USER PIC X(08).Using Copybook
DATA DIVISION.
FILE SECTION.
FD CUSTOMER-FILE.
COPY CUSTCOPY.
WORKING-STORAGE SECTION.
01 WS-CUSTOMER-REC.
COPY CUSTCOPY.Subprograms & Calls
Main Program
WORKING-STORAGE SECTION.
01 WS-PARM-AREA.
05 PARM-FUNCTION PIC X(08).
05 PARM-INPUT PIC X(100).
05 PARM-OUTPUT PIC X(200).
05 PARM-RETURN-CODE PIC 9(04) COMP.
PROCEDURE DIVISION.
MOVE 'VALIDATE' TO PARM-FUNCTION
MOVE CUSTOMER-ID TO PARM-INPUT
CALL 'VALIDSUB' USING WS-PARM-AREA
IF PARM-RETURN-CODE = 0
PERFORM PROCESS-VALID-CUSTOMER
ELSE
PERFORM HANDLE-VALIDATION-ERROR
END-IF.Subprogram
IDENTIFICATION DIVISION.
PROGRAM-ID. VALIDSUB.
DATA DIVISION.
LINKAGE SECTION.
01 LS-PARM-AREA.
05 LS-FUNCTION PIC X(08).
05 LS-INPUT PIC X(100).
05 LS-OUTPUT PIC X(200).
05 LS-RETURN-CODE PIC 9(04) COMP.
PROCEDURE DIVISION USING LS-PARM-AREA.
MOVE ZERO TO LS-RETURN-CODE
EVALUATE LS-FUNCTION
WHEN 'VALIDATE'
PERFORM VALIDATE-INPUT
WHEN 'FORMAT '
PERFORM FORMAT-OUTPUT
WHEN OTHER
MOVE 9999 TO LS-RETURN-CODE
END-EVALUATE
GOBACK.
VALIDATE-INPUT.
IF LS-INPUT IS NUMERIC
MOVE 'VALID INPUT' TO LS-OUTPUT
ELSE
MOVE 'INVALID INPUT' TO LS-OUTPUT
MOVE 0001 TO LS-RETURN-CODE
END-IF.Date & Time Functions
Intrinsic Functions
01 WS-CURRENT-DATE-TIME.
05 WS-CURRENT-DATE.
10 WS-CURRENT-YEAR PIC 9(04).
10 WS-CURRENT-MONTH PIC 9(02).
10 WS-CURRENT-DAY PIC 9(02).
05 WS-CURRENT-TIME.
10 WS-CURRENT-HOUR PIC 9(02).
10 WS-CURRENT-MINUTE PIC 9(02).
10 WS-CURRENT-SECOND PIC 9(02).
05 WS-CURRENT-MS PIC 9(02).
05 WS-DIFF-FROM-GMT PIC S9(04).
PROCEDURE DIVISION.
* Get current date/time
MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-TIME
DISPLAY 'DATE: ' WS-CURRENT-DATE
DISPLAY 'TIME: ' WS-CURRENT-TIME.
* Date arithmetic
COMPUTE WS-INTEGER-DATE =
FUNCTION INTEGER-OF-DATE(20240115)
ADD 30 TO WS-INTEGER-DATE
COMPUTE WS-NEW-DATE =
FUNCTION DATE-OF-INTEGER(WS-INTEGER-DATE).
* Date validation
IF FUNCTION TEST-DATE-YYYYMMDD(WS-DATE-FIELD) = 0
DISPLAY 'VALID DATE'
ELSE
DISPLAY 'INVALID DATE'
END-IF.Error Handling
Comprehensive Error Handling
01 WS-ERROR-HANDLING.
05 WS-ERROR-OCCURRED PIC X(01) VALUE 'N'.
88 ERROR-YES VALUE 'Y'.
88 ERROR-NO VALUE 'N'.
05 WS-ERROR-CODE PIC 9(04) COMP VALUE ZERO.
05 WS-ERROR-MESSAGE PIC X(100) VALUE SPACES.
PROCEDURE DIVISION.
PERFORM 1000-INITIALIZE
IF ERROR-NO
PERFORM 2000-PROCESS
END-IF
PERFORM 3000-FINALIZE
IF ERROR-YES
MOVE WS-ERROR-CODE TO RETURN-CODE
END-IF
STOP RUN.
1000-INITIALIZE.
OPEN INPUT MASTER-FILE
IF NOT FILE-SUCCESS
MOVE 'Y' TO WS-ERROR-OCCURRED
MOVE 0100 TO WS-ERROR-CODE
STRING 'OPEN ERROR: ' DELIMITED BY SIZE
WS-FILE-STATUS DELIMITED BY SIZE
INTO WS-ERROR-MESSAGE
PERFORM 9000-LOG-ERROR
END-IF.
9000-LOG-ERROR.
DISPLAY 'ERROR CODE: ' WS-ERROR-CODE
DISPLAY 'ERROR MSG: ' WS-ERROR-MESSAGE
* Write to error log file
WRITE ERROR-LOG-RECORD FROM WS-ERROR-HANDLING.Compilation & Linkage
Compile JCL
//COMPILE EXEC PGM=IGYCRCTL,
// PARM='LIST,MAP,XREF,RENT,SSRANGE'
//STEPLIB DD DSN=IGY.V6R3M0.SIGYCOMP,DISP=SHR
//SYSLIB DD DSN=PROD.COPYLIB,DISP=SHR
// DD DSN=DB2.DCLGENS,DISP=SHR
//SYSIN DD DSN=DEV.SOURCE(CUSTINQ),DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSN=&&LOADSET,
// DISP=(MOD,PASS),
// SPACE=(CYL,(1,1)),
// UNIT=SYSDALink-Edit JCL
//LKED EXEC PGM=IEWL,
// PARM='LIST,MAP,XREF,RENT,REUS'
//SYSLIB DD DSN=CEE.SCEELKED,DISP=SHR
// DD DSN=DB2.SDSNLOAD,DISP=SHR
// DD DSN=CICS.SDFHLOAD,DISP=SHR
//SYSLIN DD DSN=&&LOADSET,DISP=(OLD,DELETE)
// DD DDNAME=SYSIN
//SYSLMOD DD DSN=PROD.LOAD(CUSTINQ),DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
ENTRY CUSTINQ
NAME CUSTINQ(R)
/*Best Practices
1. Use COMP-3 for numeric calculations - Better performance 2. Avoid ALTER statement - Use structured programming 3. Use explicit scope terminators - END-IF, END-PERFORM, etc. 4. Initialize variables - Use VALUE clauses or INITIALIZE 5. Check FILE STATUS - After every I/O operation 6. Use meaningful names - Self-documenting code 7. Modularize code - Small, focused paragraphs 8. Document complex logic - Comments for maintainability 9. Handle errors comprehensively - Check SQLCODE, FILE-STATUS 10. Use copybooks - Reduce redundancy, ensure consistency
JCL & Batch Processing
JCL Fundamentals
Job Statement
//JOBNAME JOB (account),'programmer-name',
// CLASS=A,
// MSGCLASS=X,
// MSGLEVEL=(1,1),
// NOTIFY=&SYSUID,
// REGION=0M,
// TIME=(0,30)Parameters:
- CLASS: Job class for execution priority
- MSGCLASS: Output class for job logs
- MSGLEVEL: (statements,messages) for job log detail
- NOTIFY: User to notify on completion
- REGION: Memory allocation (0M = unlimited)
- TIME: Maximum execution time (minutes,seconds)
EXEC Statement
//STEPNAME EXEC PGM=program-name,
// PARM='parameters',
// COND=(code,operator),
// TIME=(0,10),
// REGION=4MOr call a procedure:
//STEPNAME EXEC procedure-name,
// PARM.stepname='parameters'DD Statement
//ddname DD DSN=dataset-name,
// DISP=(status,normal-end,abnormal-end),
// SPACE=(unit,(primary,secondary),RLSE),
// UNIT=device-type,
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=800)Common JCL Patterns
1. Copy Dataset
//COPY EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT1 DD DSN=SOURCE.DATA,DISP=SHR
//SYSUT2 DD DSN=TARGET.DATA,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(100,10),RLSE),
// UNIT=SYSDA,
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920)2. Sort Data
//SORT EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=INPUT.DATA,DISP=SHR
//SORTOUT DD DSN=SORTED.DATA,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(10,5),RLSE),
// UNIT=SYSDA
//SYSIN DD *
SORT FIELDS=(1,10,CH,A,20,5,ZD,D)
SUM FIELDS=(30,8,ZD)
/*3. Conditional Execution
//STEP1 EXEC PGM=PROG1
//STEP2 EXEC PGM=PROG2,COND=(0,NE,STEP1)
//STEP3 EXEC PGM=PROG3,COND=((0,NE,STEP1),(0,NE,STEP2))Or using IF/THEN/ELSE:
//STEP1 EXEC PGM=PROG1
//IF1 IF (STEP1.RC = 0) THEN
//STEP2 EXEC PGM=PROG2
//ENDIF ENDIF4. GDG (Generation Data Group)
//DEFINE EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE GDG(NAME(MY.GDG.BASE) -
LIMIT(7) -
SCRATCH -
NOEMPTY)
/*
//CREATE EXEC PGM=IEBGENER
//SYSUT1 DD *
data
/*
//SYSUT2 DD DSN=MY.GDG.BASE(+1),
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(10,5)),
// UNIT=SYSDA
//SYSIN DD DUMMY
//SYSPRINT DD SYSOUT=*Reference GDG versions:
(0)= Current generation(+1)= New generation(-1)= Previous generation(-2)= Two generations back
5. Concatenated Datasets
//INPUT DD DSN=FILE1.DATA,DISP=SHR
// DD DSN=FILE2.DATA,DISP=SHR
// DD DSN=FILE3.DATA,DISP=SHR6. In-stream Data
//SYSIN DD *
input data line 1
input data line 2
/*
//Or with delimiter:
//SYSIN DD DATA,DLM=$$
input data with /* inside
$$7. Temporary Datasets
//TEMP1 DD DSN=&&TEMPFILE,
// DISP=(NEW,PASS),
// SPACE=(CYL,(5,1)),
// UNIT=SYSDAJCL Utilities
IEFBR14 - Allocate/Delete
//ALLOC EXEC PGM=IEFBR14
//NEWFILE DD DSN=MY.NEW.FILE,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(10,5)),
// UNIT=SYSDA,
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920)
//DELETE EXEC PGM=IEFBR14
//OLDFILE DD DSN=MY.OLD.FILE,DISP=(OLD,DELETE,DELETE)IEBGENER - Copy
//COPY EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=INPUT,DISP=SHR
//SYSUT2 DD DSN=OUTPUT,DISP=(NEW,CATLG)
//SYSIN DD *
GENERATE MAXFLDS=1
RECORD FIELD=(80,1,,1)
/*IEBCOPY - Copy PDS
//COPY EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=*
//INDD DD DSN=SOURCE.PDS,DISP=SHR
//OUTDD DD DSN=TARGET.PDS,DISP=(NEW,CATLG)
//SYSIN DD *
COPY INDD=INDD,OUTDD=OUTDD
SELECT MEMBER=(MEM1,MEM2,MEM3)
/*IEBUPDTE - Update PDS
//UPDATE EXEC PGM=IEBUPDTE
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=MY.PDS,DISP=OLD
//SYSUT2 DD DSN=MY.PDS,DISP=OLD
//SYSIN DD *
./ ADD NAME=MEMBER1,LIST=ALL
source line 1
source line 2
./ ENDUP
/*DFSORT - Sort/Merge
//SORT EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=INPUT,DISP=SHR
//SORTOUT DD DSN=OUTPUT,DISP=(NEW,CATLG)
//SYSIN DD *
SORT FIELDS=(1,10,CH,A,15,5,ZD,D)
INCLUDE COND=(20,2,CH,EQ,C'NY')
OUTREC FIELDS=(1,80,100X)
/*Advanced sort:
//SYSIN DD *
SORT FIELDS=(1,10,CH,A)
SUM FIELDS=(20,8,ZD,30,8,PD)
OUTFIL FNAMES=OUT1,INCLUDE=(15,2,CH,EQ,C'CA'),
BUILD=(1,10,15,20)
OUTFIL FNAMES=OUT2,INCLUDE=(15,2,CH,EQ,C'NY'),
BUILD=(1,10,15,20)
/*IDCAMS - Catalog Management
//IDCAMS EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
/* Define VSAM cluster */
DEFINE CLUSTER( -
NAME(MY.VSAM.FILE) -
KEYS(10 0) -
RECORDSIZE(100 100) -
CYLINDERS(5 1) -
INDEXED -
SHAREOPTIONS(2 3)) -
DATA( -
NAME(MY.VSAM.FILE.DATA)) -
INDEX( -
NAME(MY.VSAM.FILE.INDEX))
/* Copy */
REPRO INFILE(INDD) OUTFILE(OUTDD)
/* Delete */
DELETE MY.OLD.FILE CLUSTER
/* List catalog */
LISTCAT ENTRIES(MY.VSAM.FILE) ALL
/*Procedures (PROCs)
Define Procedure
//MYPROC PROC MBR=,LIB=USER.LOAD
//STEP1 EXEC PGM=PROG1
//STEPLIB DD DSN=&LIB,DISP=SHR
//INPUT DD DSN=INPUT.&MBR,DISP=SHR
//OUTPUT DD DSN=OUTPUT.&MBR,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(5,1)),
// UNIT=SYSDACall Procedure
//CALL EXEC MYPROC,MBR=TEST01,LIB=PROD.LOADOverride DD in Procedure
//CALL EXEC MYPROC
//STEP1.INPUT DD DSN=ALTERNATE.INPUT,DISP=SHR
//STEP1.OUTPUT DD DSN=ALTERNATE.OUTPUT,DISP=(NEW,CATLG)Symbolic Parameters
JCL Symbols
//SET1 SET ENV='PROD'
//SET2 SET DATE='&YYMMDD'
//STEP1 EXEC PGM=PROG1
//INPUT DD DSN=&ENV..DATA.&DATE,DISP=SHRSystem symbols:
&SYSUID- User ID&SYSDATE- Current date (yyddd)&SYSTIME- Current time (hhmm)&LDAY- Day of month (dd)&LMONTH- Month (mm)&LYEAR- Year (yyyy)
Example with Symbols
//BACKUP JOB
//SET1 SET DATE='&LYEAR&LMONTH&LDAY'
//STEP1 EXEC PGM=IEBGENER
//SYSUT1 DD DSN=PROD.DATA,DISP=SHR
//SYSUT2 DD DSN=BACKUP.DATA.D&DATE,
// DISP=(NEW,CATLG)
//SYSIN DD DUMMY
//SYSPRINT DD SYSOUT=*Batch Scheduling
Job Dependencies
Using JES2 job dependency:
//JOB1 JOB
//STEP1 EXEC PGM=PROG1
//STEP2 EXEC PGM=PROG2
//JOB2 JOB
//*AFTER JOB1
//STEP1 EXEC PGM=PROG3Using automation tools:
- TWS (Tivoli Workload Scheduler)
- Control-M
- CA-7
- Zeke
Job Submission Automation
Submit via TSO SUBMIT:
SUBMIT 'MY.JCL(JOBNAME)'Submit via automation:
/* REXX script */
QUEUE "//JOBNAME JOB"
QUEUE "//STEP1 EXEC PGM=IEFBR14"
"SUBMIT * END(/*)"Performance Optimization
Efficient JCL Practices
1. Block size optimization:
//FILE DD DSN=MY.DATA,
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=27920)
/* Optimal: BLKSIZE = track size - control bytes */
/* For 3390: ~27920 for LRECL=80 */1. Space allocation:
//FILE DD SPACE=(CYL,(primary,secondary),RLSE)
/* Use RLSE to release unused space */
/* Allocate enough primary to avoid secondary extends */1. Temporary datasets:
//TEMP DD DSN=&&TEMP,
// DISP=(NEW,PASS),
// SPACE=(CYL,(10,5)),
// UNIT=VIO /* Virtual I/O in memory */1. Concatenation order:
/* Put most frequently accessed first */
//STEPLIB DD DSN=FREQUENT.LOAD,DISP=SHR
// DD DSN=LESS.FREQUENT.LOAD,DISP=SHRParallel Execution
Independent steps:
//STEP1A EXEC PGM=PROG1A
//STEP1B EXEC PGM=PROG1B
//STEP2 EXEC PGM=PROG2,COND=((0,NE,STEP1A),(0,NE,STEP1B))Multiple jobs: Submit multiple independent jobs to run in parallel.
Error Handling
Return Codes
Check in JCL:
//STEP1 EXEC PGM=PROG1
//IF1 IF (STEP1.RC = 0) THEN
//SUCCESS EXEC PGM=SUCCESS
//ELSE ELSE
//FAILURE EXEC PGM=FAILURE
//ENDIF ENDIFCondition codes:
//STEP2 EXEC PGM=PROG2,COND=(4,LT,STEP1)
/* Execute STEP2 if STEP1 RC < 4 */
/* Operators: EQ NE LT LE GT GE */ABEND Handling
Catch ABEND:
//STEP1 EXEC PGM=PROG1
//IF1 IF (STEP1.ABEND = TRUE) THEN
//CLEANUP EXEC PGM=CLEANUP
//ENDIF ENDIFCommon ABENDs:
- S0C7: Data exception (invalid numeric)
- S0C4: Protection exception (memory access)
- S806: Program not found
- S322: Time out
- S013: OPEN error (dataset)
Advanced Techniques
Dynamic Allocation
IEFBR14 with dynamic:
//ALLOC EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
ALLOC DA('MY.NEW.FILE') NEW -
SPACE(5,1) CYLINDERS -
RECFM(F B) LRECL(80) BLKSIZE(27920) -
UNIT(SYSDA) CATALOG
FREE DA('MY.OLD.FILE') DELETE
/*JCL Include
Member in JCLLIB:
//MYJOB JOB
// JCLLIB ORDER=MY.PROCLIB
// INCLUDE MEMBER=COMMON
//STEP1 EXEC PGM=PROG1COMMON member:
//STEPLIB DD DSN=MY.LOAD.LIB,DISP=SHR
//SYSPRINT DD SYSOUT=*REXX Integration
//REXX EXEC PGM=IKJEFT01
//SYSEXEC DD DSN=MY.REXX.LIB,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
%MYSCRIPT parm1 parm2
/*Best Practices
Naming Conventions
- Job names: 8 characters max, alphanumeric
- Step names: meaningful, describe function
- DD names: standard names (SYSOUT, SYSPRINT, etc.)
- Dataset names: hierarchical, logical grouping
Documentation
//*********************************************************
//* Job: MONTHEND *
//* Purpose: Monthly closing batch *
//* Schedule: Last day of month, 8 PM *
//* Dependencies: DAILYUPD must complete first *
//* Runtime: Approximately 2 hours *
//* Contact: Operations Team (x1234) *
//*********************************************************Testing
1. Test with small datasets first 2. Use TYPRUN=SCAN to check syntax 3. Validate with COND=(0,EQ) for conditional testing 4. Keep test and production jobs separate
Maintenance
1. Use procedures for repeated logic 2. Symbolic parameters for flexibility 3. Comment complex logic 4. Version control JCL members 5. Regular cleanup of old jobs
Troubleshooting
JCL Errors
JCL ERROR:
- Syntax errors in JCL statements
- Check JESMSGLG for details
S806 (Program not found):
//STEPLIB DD DSN=CORRECT.LOAD.LIB,DISP=SHRS013 (OPEN error):
- Dataset not found
- DISP conflict
- Volume not mounted
- Insufficient space
S0C4 (Protection):
- Program error accessing memory
- Check SYSUDUMP/SYSABEND
Performance Issues
Long run time:
1. Check sort efficiency 2. Optimize I/O 3. Review dataset allocation 4. Check for contention
Space issues:
/* Use RLSE to return unused space */
//FILE DD SPACE=(CYL,(10,5),RLSE)
/* Or use compression */
//TAPE DD DSN=BACKUP,UNIT=TAPE,
// DISP=(NEW,CATLG),
// DCB=TRTCH=COMPMigration to Modern Batch
Spring Batch Equivalent
JCL batch job:
//DAILY JOB
//STEP1 EXEC PGM=EXTRACT
//STEP2 EXEC PGM=TRANSFORM
//STEP3 EXEC PGM=LOADSpring Batch:
@Bean
public Job dailyJob() {
return jobBuilderFactory.get("dailyJob")
.start(extractStep())
.next(transformStep())
.next(loadStep())
.build();
}Airflow DAG Equivalent
from airflow import DAG
from airflow.operators.bash import BashOperator
dag = DAG('daily_batch', schedule_interval='@daily')
extract = BashOperator(task_id='extract', bash_command='extract.sh', dag=dag)
transform = BashOperator(task_id='transform', bash_command='transform.sh', dag=dag)
load = BashOperator(task_id='load', bash_command='load.sh', dag=dag)
extract >> transform >> loadMainframe Modernization
Assessment Framework
Discovery Phase
1. Application Inventory
Component Analysis:
- Number of programs (COBOL, PL/I, Assembler, REXX)
- Total lines of code by language
- JCL jobs and procedures
- CICS/IMS transactions
- Copybooks and include files
- Database schemas (DB2, IMS, VSAM)
- Screens/maps (BMS, MFS)
- External interfaces2. Technical Complexity Scoring
For each program, score:
- Lines of code (1-5 points based on size)
- External calls (1 point per CALL)
- File I/O operations (2 points per file)
- Database operations (2 points per table accessed)
- CICS commands (3 points if CICS-enabled)
- Dynamic program calls (5 points each)
- Computed GO TO / ALTER (10 points each - high risk)
- Embedded assembler (10 points)
Complexity Rating:
0-20: Low
21-50: Medium
51-100: High
100+: Very High3. Business Criticality Matrix
Rate each application:
- Transaction volume (1-5)
- Revenue impact (1-5)
- Customer-facing (1-5)
- Regulatory requirements (1-5)
- Frequency of change (1-5)
Priority = Sum of ratings
20-25: Critical
15-19: High
10-14: Medium
5-9: LowDependency Analysis
Program Call Hierarchy:
# Extract CALL statements from COBOL
grep -r "CALL '" *.cbl | \
sed "s/.*CALL '\([^']*\)'.*/\1/" | \
sort | uniq > call-hierarchy.txt
# Visualize with GraphViz
echo "digraph calls {" > calls.dot
while read line; do
echo " \"$program\" -> \"$line\";" >> calls.dot
done < call-hierarchy.txt
echo "}" >> calls.dot
dot -Tpng calls.dot -o call-hierarchy.pngData Dependencies:
Map:
- VSAM files → Programs that read/write
- DB2 tables → Programs that access
- Copybooks → Programs that include them
- JCL datasets → Jobs that use them
- GDG relationshipsIntegration Points:
Identify:
- MQ message flows
- CICS/IMS communication
- File transfers (NDM, FTP)
- Web services (z/OS Connect)
- Batch scheduling dependencies
- External system interfacesMigration Strategies
1. Rehost (Lift & Shift)
Approach:
- Migrate to mainframe emulator (Micro Focus, LzLabs, Raincode)
- Run on x86 servers or cloud
- Minimal code changes
Pros:
- Fastest migration (6-12 months)
- Lowest risk
- Preserve existing skills
- Quick cloud benefits
Cons:
- Technical debt remains
- Limited modernization
- Ongoing emulator licensing
- Performance may vary
Best For:
- Time-sensitive migrations
- Limited budget
- Stable applications
- Skills shortage
Implementation Steps:
1. Select emulator platform
2. Install and configure emulator
3. Migrate source code
4. Recompile programs
5. Migrate data files
6. Test functionality
7. Performance tune
8. CutoverExample: Micro Focus Enterprise Server
# Compile COBOL to native code
cblc -C "anim" CUSTINQ.cbl
# Deploy to server
cobrun CUSTINQ
# Or compile to .NET/JVM
cblc -C "netmf" CUSTINQ.cbl2. Replatform
Approach:
- Migrate to modern platform
- Keep similar architecture
- Update technology stack
Pros:
- Moderate risk
- Some modernization
- Better performance
- Cloud-native deployment
Cons:
- Longer timeline (12-24 months)
- More complex
- Requires reskilling
- Testing overhead
Best For:
- Moderate complexity apps
- Need for scalability
- Hybrid approach
- Gradual modernization
Implementation: COBOL to Java
COBOL Source:
PROCEDURE DIVISION.
PERFORM READ-CUSTOMER
IF CUSTOMER-FOUND
PERFORM CALCULATE-BALANCE
PERFORM UPDATE-RECORD
END-IF.Java Equivalent:
public class CustomerProcessor {
public void processCustomer(String customerId) {
Customer customer = customerRepository.findById(customerId);
if (customer != null) {
BigDecimal balance = calculateBalance(customer);
customer.setBalance(balance);
customerRepository.save(customer);
}
}
private BigDecimal calculateBalance(Customer customer) {
return customer.getCredits()
.subtract(customer.getDebits());
}
}3. Refactor (Microservices)
Approach:
- Decompose monolith
- Build microservices
- API-first design
Pros:
- Full modernization
- Cloud-native
- Agile development
- Technology flexibility
Cons:
- Longest timeline (24-36 months)
- Highest risk
- Complete reskilling
- Significant investment
Best For:
- Complex applications
- Long-term strategy
- Digital transformation
- Scalability needs
Architecture Transformation:
Before (Monolithic):
CICS Region
├── Customer Management Programs
├── Account Management Programs
├── Transaction Processing Programs
└── Reporting ProgramsAfter (Microservices):
API Gateway
├── Customer Service (Spring Boot)
├── Account Service (Node.js)
├── Transaction Service (Java)
└── Reporting Service (Python)Example Microservice:
@RestController
@RequestMapping("/api/v1/customers")
public class CustomerController {
@Autowired
private CustomerService customerService;
@GetMapping("/{id}")
public ResponseEntity<CustomerDTO> getCustomer(
@PathVariable String id) {
return customerService.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping
public ResponseEntity<CustomerDTO> createCustomer(
@Valid @RequestBody CustomerDTO customer) {
CustomerDTO created = customerService.create(customer);
return ResponseEntity.created(
URI.create("/api/v1/customers/" + created.getId()))
.body(created);
}
@PutMapping("/{id}")
public ResponseEntity<CustomerDTO> updateCustomer(
@PathVariable String id,
@Valid @RequestBody CustomerDTO customer) {
return customerService.update(id, customer)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
}4. Retire & Replace
Approach:
- Replace with COTS/SaaS
- Commercial alternatives
- Modern platforms
Pros:
- No development
- Modern features
- Vendor support
- Quick deployment
Cons:
- Customization limits
- Data migration
- Process changes
- Vendor lock-in
Best For:
- Commodity functions
- Standard processes
- Budget constraints
- Quick wins
Hybrid Integration Patterns
Pattern 1: API Wrapper (Strangler Fig)
Expose mainframe as API:
External Systems → API Gateway → z/OS Connect → CICS/IMSz/OS Connect Configuration:
{
"serviceName": "CustomerInquiry",
"serviceProvider": "CICS",
"endpoint": {
"program": "CUSTINQ",
"commarea": {
"customerNumber": "string",
"requestType": "string"
}
},
"apiDefinition": {
"path": "/customers/{id}",
"method": "GET",
"requestMapping": {
"id": "customerNumber"
}
}
}API Gateway (Kong/Apigee):
services:
- name: customer-service
url: https://zosconnect.company.com/api/customers
routes:
- name: get-customer
paths:
- /api/customers
plugins:
- name: rate-limiting
config:
minute: 100
- name: authentication
config:
type: oauth2Pattern 2: Data Replication (CDC)
Real-time data sync:
Mainframe DB2 → CDC (IBM InfoSphere) → Kafka → Cloud DatabaseCDC Configuration:
-- Source (DB2 z/OS)
CREATE TABLE CUSTOMER (
CUST_ID INT PRIMARY KEY,
CUST_NAME VARCHAR(50),
LAST_UPDATE TIMESTAMP
);
-- Enable CDC
ALTER TABLE CUSTOMER
DATA CAPTURE CHANGES;
-- CDC capture
CREATE SUBSCRIPTION CUST_SUB FOR TABLE CUSTOMER;Kafka Consumer:
@KafkaListener(topics = "mainframe.customer")
public void processCustomerUpdate(CustomerEvent event) {
switch(event.getOperation()) {
case INSERT:
cloudRepository.save(event.getData());
break;
case UPDATE:
cloudRepository.update(event.getData());
break;
case DELETE:
cloudRepository.delete(event.getKey());
break;
}
}Pattern 3: Event-Driven Integration
Asynchronous messaging:
CICS/IMS → IBM MQ → Message Broker → Cloud ServicesCICS to MQ:
EXEC CICS WRITEQ TS
QUEUE('CUSTOMER.UPDATES')
FROM(CUSTOMER-RECORD)
LENGTH(LENGTH OF CUSTOMER-RECORD)
END-EXEC.Spring Boot Consumer:
@JmsListener(destination = "CUSTOMER.UPDATES")
public void handleCustomerUpdate(CustomerMessage msg) {
log.info("Received customer update: {}", msg.getCustomerId());
customerService.processUpdate(msg);
}Data Migration Strategy
Phase 1: Analysis
1. Data profiling
- Volume
- Quality issues
- Relationships
- Dependencies
2. Schema mapping
- Source to target
- Type conversions
- Transformation rules
- Default values
3. Validation rules
- Business rules
- Referential integrity
- Data quality checksPhase 2: Design
VSAM to Relational Database:
Source (VSAM):
01 CUSTOMER-RECORD.
05 CUST-ID PIC 9(10).
05 CUST-NAME PIC X(50).
05 CUST-BALANCE PIC S9(11)V99 COMP-3.
05 CUST-STATUS PIC X(01).Target (PostgreSQL):
CREATE TABLE customer (
cust_id BIGINT PRIMARY KEY,
cust_name VARCHAR(50) NOT NULL,
cust_balance NUMERIC(13,2) DEFAULT 0.00,
cust_status CHAR(1) CHECK (cust_status IN ('A','I')),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT valid_balance CHECK (cust_balance >= 0)
);
CREATE INDEX idx_customer_status ON customer(cust_status);
CREATE INDEX idx_customer_name ON customer(cust_name);Phase 3: ETL Process
Extract from DB2:
-- DB2 z/OS
UNLOAD EXTERNAL TABLE CUSTOMER
TO '/data/customer_extract.dat'
USING DELIMITER ','
WITH HEADER;Transform & Load:
import pandas as pd
from sqlalchemy import create_engine
# Extract
df = pd.read_csv('customer_extract.dat')
# Transform
df['cust_id'] = pd.to_numeric(df['cust_id'])
df['cust_balance'] = pd.to_numeric(df['cust_balance']) / 100
df['cust_status'] = df['cust_status'].str.strip()
df['created_at'] = pd.to_datetime('now')
df['updated_at'] = pd.to_datetime('now')
# Validate
assert df['cust_id'].is_unique, "Duplicate customer IDs"
assert df['cust_status'].isin(['A', 'I']).all(), "Invalid status"
assert (df['cust_balance'] >= 0).all(), "Negative balance"
# Load
engine = create_engine('postgresql://host/database')
df.to_sql('customer', engine, if_exists='append', index=False)
print(f"Loaded {len(df)} records")Phase 4: Validation
Reconciliation Query:
-- Source count
SELECT COUNT(*) FROM CUSTOMER WHERE CUST_STATUS = 'A';
-- Target count
SELECT COUNT(*) FROM customer WHERE cust_status = 'A';
-- Balance total
SELECT SUM(CUST_BALANCE) FROM CUSTOMER;
SELECT SUM(cust_balance) FROM customer;DevOps Integration
CI/CD Pipeline for Mainframe
1. Source Control (Git):
# Clone mainframe source
git clone https://github.com/company/mainframe-apps.git
# Structure
mainframe-apps/
├── cobol/
│ ├── programs/
│ ├── copybooks/
│ └── tests/
├── jcl/
├── bms/
├── db2/
└── .github/workflows/2. Build Pipeline (Jenkins):
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/company/mainframe-apps.git'
}
}
stage('Compile') {
steps {
script {
// Use Zowe CLI or DBB
sh '''
zowe files upload file-to-data-set \
"cobol/programs/CUSTINQ.cbl" \
"DEV.SOURCE(CUSTINQ)"
zowe jobs submit data-set "DEV.JCL(COMPILE)" \
--wait-for-output
'''
}
}
}
stage('Test') {
steps {
sh '''
zowe jobs submit data-set "DEV.JCL(UNITTEST)" \
--wait-for-output
'''
}
}
stage('Deploy') {
when {
branch 'main'
}
steps {
sh '''
zowe files copy data-set \
"DEV.LOAD(CUSTINQ)" \
"PROD.LOAD(CUSTINQ)"
'''
}
}
}
}3. Testing Strategy:
// Unit test for migrated code
@Test
public void testCalculateBalance() {
Customer customer = new Customer();
customer.setCredits(new BigDecimal("1000.00"));
customer.setDebits(new BigDecimal("250.50"));
BigDecimal balance = customerService.calculateBalance(customer);
assertEquals(new BigDecimal("749.50"), balance);
}
// Integration test
@SpringBootTest
@AutoConfigureMockMvc
public class CustomerAPITest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetCustomer() throws Exception {
mockMvc.perform(get("/api/customers/1234567890"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.customerId").value("1234567890"))
.andExpect(jsonPath("$.balance").value(1000.00));
}
}Migration Tools
Automated Code Conversion
1. COBOL to Java (AWS Blu Age):
# Convert COBOL program
blu-age convert \
--source cobol/CUSTINQ.cbl \
--target java/CustomerInquiry.java \
--framework spring-boot
# Generated Spring Boot service2. Micro Focus Visual COBOL:
# Compile COBOL to .NET
cobc -m -x CUSTINQ.cbl -o CustomerInquiry.dll
# Or to JVM
cobc -m -x CUSTINQ.cbl -t java -o CustomerInquiry.jar3. LzLabs SDM (Software Defined Mainframe):
# Deploy workload to container
lzlabs deploy \
--programs cobol/*.cbl \
--jcl jcl/*.jcl \
--data vsam/*.dat \
--target kubernetesStatic Analysis
Analyze code quality:
# SonarQube for COBOL
sonar-scanner \
-Dsonar.projectKey=mainframe-app \
-Dsonar.sources=cobol \
-Dsonar.language=cobol
# Code metrics
sloccount cobol/
# Output: Lines of code, complexity, maintainabilityMigration Timeline Example
18-Month Replatform Project
Months 1-3: Discovery & Planning
- Application inventory
- Dependency mapping
- Complexity assessment
- Tool selection
- Team training
Months 4-6: Proof of Concept
- Select pilot application
- Convert and deploy
- Performance testing
- Lessons learned
Months 7-12: Bulk Migration
- Wave 1: Low complexity (months 7-8)
- Wave 2: Medium complexity (months 9-10)
- Wave 3: High complexity (months 11-12)
Months 13-15: Integration & Testing
- End-to-end testing
- Performance tuning
- Security hardening
- User acceptance testing
Months 16-18: Cutover & Stabilization
- Production deployment
- Parallel running
- Issue resolution
- Knowledge transfer
Post-Migration
Decommissioning Checklist
□ Verify all data migrated
□ Confirm all integrations working
□ Archive mainframe code
□ Document new architecture
□ Train operations team
□ Establish monitoring
□ Update disaster recovery
□ Release mainframe resources
□ Contract negotiations
□ Celebrate success!Cost Optimization
Before (Mainframe):
- MIPS charges: $1M/year
- Storage: $200K/year
- Software licenses: $500K/year
Total: $1.7M/year
After (Cloud):
- Compute (VMs): $300K/year
- Storage: $50K/year
- Software licenses: $200K/year
Total: $550K/year
Savings: $1.15M/year (68% reduction)
ROI: Migration cost recovered in 18 monthsSuccess Factors
1. Executive sponsorship - Critical for funding and support 2. Incremental approach - Reduce risk, show progress 3. Skill development - Train team on new technologies 4. Automated testing - Ensure functional equivalence 5. Data quality - Clean data before migration 6. Documentation - Knowledge capture throughout 7. Change management - Prepare organization 8. Risk mitigation - Backout plans at every stage
z/OS System Administration
System Operations
IPL (Initial Program Load)
Cold start:
1. Issue QUIESCE command
2. Select IPL volume
3. Specify LOADPARM parameters
4. Monitor console for IPL messagesWarm start (system restart):
C U=CPU,RESTART /* Restart specific CPU */Console Commands
Display commands:
/D A,ALL /* All active address spaces */
/D A,L /* Address spaces by LPAR */
/D M=CPU /* CPU usage */
/D M=STOR /* Storage usage */
/D U,ALL /* All units */
/D PROG,APF /* APF authorized libraries */
/D PROD,STATE /* Product status */
/D IOS,CONFIG /* I/O configuration */
/D SMS,STORGRP(ALL) /* Storage groups */System control:
/V OFFLINE /* Vary device offline */
/V ONLINE /* Vary device online */
/STOP subsystem /* Stop subsystem */
/START subsystem /* Start subsystem */
/CANCEL jobname /* Cancel job */
/F jobname,command /* Send command to job */JES2 Commands
Job management:
/$DA /* Display active jobs */
/$DQ /* Display job queue */
/$DJ jobname /* Display job status */
/$PJOBNAME /* Purge job */
/$CANCEL jobname /* Cancel job */Device management:
/$DSPL /* Display spool */
/$DDEV /* Display devices */
/$S PRINTER1 /* Start printer */
/$P PRINTER1 /* Stop printer */Configuration:
/$T A=ALL /* Display all options */
/$T JOBCLASS(A),QHOLD /* Hold job class */
/$T JOBCLASS(A),QREL /* Release job class */Storage Management
SMS (Storage Management Subsystem)
Storage groups:
DEFINE STORAGEGROUP(STGRP1)
VOLUMES(VOL001 VOL002 VOL003)
VSAMDATACLASS(VSAM1)
AVGREC(U)
LISTCAT STORAGEGROUP(STGRP1) ALLManagement classes:
DEFINE MANAGEMENTCLASS(MGMT1)
MIGRATION(DAYS(30))
BACKUP(DAYS(7))
RETENTION(DAYS(365))Data classes:
DEFINE DATACLASS(DCLASS1)
RECFM(FB)
LRECL(80)
SPACEAVG(100 CYL)Dataset Migration & Backup
DFHSM (HSM) commands:
HSEND MIGRATE DSN('USER.DATA.**')
HSEND RECALL DSN('USER.DATA.FILE')
HSEND BACKUP DSN('USER.DATA.**')
HSEND RECOVER DSN('USER.DATA.FILE')
HSEND DELETE BACKUP DSN('USER.DATA.FILE')ADRDSSU (DSS) backup:
//BACKUP EXEC PGM=ADRDSSU
//SYSPRINT DD SYSOUT=*
//DASD1 DD UNIT=SYSDA,VOL=SER=WORK01,DISP=OLD
//TAPE1 DD DSN=BACKUP.TAPE,UNIT=TAPE,
// VOL=SER=TAPE01,DISP=(NEW,CATLG)
//SYSIN DD *
DUMP DATASET( -
INCLUDE(**) -
BY(DSORG(PS,PO)) ) -
INDDNAME(DASD1) -
OUTDDNAME(TAPE1) -
COMPRESS
/*System Maintenance
SMP/E (System Modification Program)
Apply maintenance:
SET BDY(GLOBAL)
RECEIVE S(PTF12345)
SET BDY(TARGET)
APPLY S(PTF12345) CHECK
APPLY S(PTF12345)
SET BDY(DLIB)
ACCEPT S(PTF12345)List maintenance:
LIST PTFS
LIST SYSMOD(PTF12345)
LIST MOD(IEFBR14)LLA (Library Lookaside)
Refresh LLA:
/F LLA,UPDATE=xx
/F LLA,REFRESH
/F LLA,DISPLAYSystem Parameters (PARMLIB)
IPL parameters (LOADxx):
SYSCAT CATALOG.MASTER
NUCLEUS 01
PARMLIB SYS1.PARMLIB
SYSPLEX PLEXNAMESystem options (IEASYSxx):
APF=00 /* APF list */
CMD=00 /* Commands */
CON=00 /* Consoles */
GRS=YES /* Global Resource Serialization */
PROG=00 /* Programs */
SMF=00 /* SMF parameters */Subsystem Management
Subsystem Initialization Table (IEFSSNxx)
SUBSYS SUBNAME(JES2)
INITRTN(HASJES20)
INITPARM('WARM')
SUBSYS SUBNAME(CICS)
INITRTN(DFHSIP)
SUBSYS SUBNAME(DB2P)
INITRTN(DSNMSTR)Dynamic Subsystem Control
Add subsystem:
/SETSSI ADD,S=subsys,I=initrtnDelete subsystem:
/SETSSI DELETE,S=subsysPerformance Monitoring
RMF (Resource Measurement Facility)
Start RMF:
/S RMF,PARM=xx
/F RMF,START(type)RMF reports:
- Monitor I: CPU activity
- Monitor II: DASD activity
- Monitor III: Workload activity
- OVERVIEW: System summary
- WKLD: Workload by service class
SMF (System Management Facilities)
SMF parameters (SMFPRMxx):
SYS(INTERVAL(30))
SUB(TYPE(0,30,70,80,89,90))
REC(EXITS(SYS(ON),SUBSYS(ON)))
JWT(INTERVAL(15))Extract SMF data:
//EXTRACT EXEC PGM=IFASMFDP
//SYSPRINT DD SYSOUT=*
//DUMPIN DD DISP=SHR,DSN=SYS1.MANX
//DUMPOUT DD DISP=(NEW,CATLG),DSN=SMF.EXTRACT,
// SPACE=(CYL,(50,10))
//SYSIN DD *
INDD(DUMPIN,OPTIONS(DUMP))
OUTDD(DUMPOUT,TYPE(30,80))
DATE(2024001,2024365)
/*Automation
Automation Table (ATx00)
Define automated responses:
IF MSGID = 'IEF404I' THEN
EXEC(PGM=CLEANUP,PARM='&JOBNAME')
ENDIF
IF TEXT = 'HASP395' THEN
DO
SUB('RESTART.JCL')
DONE
ENDIFNetView Automation
AutoOps definitions:
IF (MSGID = 'IEE361I') THEN
DO
WRITE('MOUNT VOLUME &1')
WAIT(MSGID = 'IEA511I')
CLIST(AUTOVOLM,&1)
DONE
ENDIFDisaster Recovery
Parallel Sysplex
Coupling Facility structures:
STRNAME TYPE SIZE POLICY
LOCK01 LOCK 256KB SIZE(256)
SCA01 SCA 512KB SIZE(512)
LOGR01 LOGR 1024KB SIZE(1024)XCF (Cross-System Coupling Facility):
/D XCF /* Display XCF status */
/D XCF,STR,STRNAME=ALL /* Display structures */
/D XCF,GROUP /* Display groups */GDPS (Geographically Dispersed Parallel Sysplex)
Configuration:
- Primary site with active workload
- Secondary site with standby systems
- Metro Mirror or Global Mirror for data replication
- Automation for workload failover
System Tuning
LPAR Configuration
Adjust LPAR weights:
/T LPAR=LPAR1,WEIGHT=50
/D GRS,RES=(*,*) /* Display GRS resources */Workload Manager (WLM)
Service classes:
SERVICE CLASS: CICS_PROD
IMPORTANCE: 1
GOALS: RESPONSE(90%,0.2SEC)
SERVICE CLASS: BATCH
IMPORTANCE: 3
GOALS: VELOCITY(50)Application environments:
- Define Java, CICS, IMS environments
- Resource limits (CPU, memory, threads)
- Classification rules
System Security
APF (Authorized Program Facility)
APF list (PROGxx):
APF ADD DSNAME(SYS1.USERLIB) VOLUME(SYSR01)
APF DELETE DSNAME(OLD.LOAD.LIB)Dynamic APF:
SETPROG APF,ADD,DSNAME=SYS1.NEWLIB,VOLUME=VOL001
SETPROG APF,DELETE,DSNAME=OLD.LOAD.LIBProgram Properties Table (PPT)
Define in SCHEDxx:
PPT PGMNAME(MYPROG)
KEY(7)
NOSWAP
PRIV
PASSConsole Operations
Master Console (MSTR)
Console definition (CONSOLxx):
CONSOLE DEVNUM(001C)
NAME(MSTCONS)
AUTH(MASTER)
CMDSYS(ALL)
AREA(F)
ROUTCDE(ALL)
MSCOPE(*)
CONSOLE DEVNUM(001D)
NAME(SYSTEC)
AUTH(SYS)Console Security
RACF console profiles:
RDEFINE OPERCMDS MVS.VARY.TAPE.* UACC(NONE)
PERMIT MVS.VARY.TAPE.* CLASS(OPERCMDS) ID(OPERGRP) ACCESS(UPDATE)
SETROPTS RACLIST(OPERCMDS) REFRESHSystem Capacity Planning
Monitoring Points
CPU:
- LPAR utilization
- Service class CPU consumption
- Transaction response times
Storage:
- Real storage usage
- Auxiliary storage usage
- Common area usage
I/O:
- DASD response times
- Channel utilization
- Cache hit ratios
Capacity Modeling
Data collection:
1. RMF data (CPU, storage, I/O) 2. SMF records (workload characteristics) 3. CICS statistics 4. DB2 statistics
Analysis:
- Peak usage times
- Growth trends
- Resource bottlenecks
- Service level compliance
Planning:
- Hardware upgrades
- LPAR weight adjustments
- Workload balancing
- Storage expansion
Troubleshooting
System Dumps
Initiate dump:
/DUMP COMM=('System dump reason')IPCS (Interactive Problem Control System):
IPCS
SETDEF FILE(dataset) DSNAME('DUMP.DATA')
STATUS
SYSTRACE CT
SUMMARY
VERBEXIT CBFORMATWait States
Common wait codes:
- 001: WTOR (Write To Operator with Reply)
- 021: Master trace buffer full
- 02E: Trace table full
- 091: Unit check on DASD
Performance Issues
High CPU:
/D A,ALL /* Check active jobs */
/F RMF,D /* RMF display */
/D PROG,LNKLST /* Check link list */Storage shortage:
/D M=STOR /* Display storage */
/D ASM /* Display auxiliary storage */
/D GRS,RES=(*,*) /* Check for serialization */Best Practices
Daily Operations
1. Review system logs (SYSLOG, OPERLOG) 2. Check job completion status 3. Monitor space utilization 4. Review SMF data for anomalies 5. Verify backup completion
Change Management
1. Test in development environment first 2. Schedule maintenance windows 3. Document all changes 4. Have backout procedures ready 5. Communicate with stakeholders
Security
1. Regular RACF audits 2. Review unauthorized attempts 3. Monitor privileged access 4. Keep security patches current 5. Implement separation of duties
Performance
1. Baseline normal operations 2. Trend analysis 3. Proactive tuning 4. Regular capacity reviews 5. Workload balancing
Related skills
FAQ
Which subsystems are covered?
The skill lists CICS, IMS, DB2, MQ, WebSphere, VSAM, and security systems such as RACF and ACF2.
Does it include DevOps tooling?
It mentions Git via USS, Zowe CLI, Dependency Based Build, and Eclipse or VS Code extensions.
What modernization paths exist?
It describes rehost, replatform, refactor, and retire or replace strategies in the modernization section.