☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

quarta-feira, 24 de abril de 2024

WarGames Entra no CPD — O Dia em que o WOPR Deu S0C7, Joshua Pediu um Dump e o Programador COBOL Descobriu que ABEND Não Significa “Acabou o Mundo”

 

Bellacosa Mainframe e os abends em mainframe

☕ Um Café no Bellacosa Mainframe

WarGames Entra no CPD — O Dia em que o WOPR Deu S0C7, Joshua Pediu um Dump e o Programador COBOL Descobriu que ABEND Não Significa “Acabou o Mundo”

Ou: como S0C4, S0C7, SB37, S322, S806, dumps, JES2, JCL, datasets, storage, load libraries e um pouco de sangue-frio transformam “JOB ABENDED” de mensagem apocalíptica em pista de investigação — e por que a melhor maneira de vencer um ABEND talvez seja aprender a não jogar adivinhação


“Shall we play a game?”

A tela 3270 ficou silenciosa.

O programador COBOL Padawan tinha acabado de submeter seu primeiro JOB sozinho.

No canto superior da tela:

IKJ56250I JOB COBTST1(JOB01234) SUBMITTED

Ele sorriu.

— Funcionou.

Joshua, instalado misteriosamente em algum lugar entre uma LPAR de desenvolvimento, um terminal antigo e o NORAD, respondeu:

PROCESSING...

Alguns segundos depois:

IEF450I COBTST1 STEP01 - ABEND=S0C7

Silêncio.

O Padawan olhou para a tela.

Olhou para o café.

Olhou novamente para a tela.

— Destruí o mainframe?

Joshua respondeu:

WOULD YOU LIKE TO PLAY
GLOBAL THERMONUCLEAR WAR?

— Não, obrigado. Só queria executar um COBOL.

Bem-vindo ao universo dos ABENDs.

E antes que alguém aperte o botão vermelho, precisamos entender uma coisa fundamental:

ABEND não significa que o mainframe morreu.

Normalmente significa apenas:

um programa, step ou tarefa terminou de maneira anormal.

E isso muda completamente a investigação.



1. Primeiro contato — afinal, o que é ABEND?

ABEND é abreviação histórica de:

ABnormal END

Ou seja:

término anormal.

Em um processamento normal, imaginamos algo parecido com:

JOB
 |
 +-- STEP01
 |
 +-- STEP02
 |
 +-- STEP03
 |
 `-- FIM

Cada programa termina conforme esperado.

Por exemplo:

RETURN CODE = 0000

Mas algo pode acontecer durante a execução:

JOB
 |
 +-- STEP01   RC=0000
 |
 +-- STEP02   ABEND S0C7
 |
 X

O sistema interrompe aquele processamento.

A primeira coisa que o iniciante precisa aprender é não misturar três conceitos:

RETURN CODE
ABEND
SQLCODE

Eles podem aparecer no mesmo trabalho, mas não significam a mesma coisa.

Um RC=0004, por exemplo, normalmente indica que determinado programa terminou e devolveu um código.

Já:

S0C7

significa que houve uma exceção durante a execução.

E:

SQLCODE -811

é uma condição reportada pelo Db2.

São universos relacionados, mas distintos.



2. O detalhe que engana todo Padawan: é zero, não letra O

Observe:

S0C4
S0C7

O caractere depois do S é:

0

zero.

Não:

O

Portanto:

S0C7

e não:

SOC7

Essa pequena diferença já entregou muitos novatos aos Sith Lords do suporte.

Também encontramos códigos como:

S806
SB37
S322

O formato varia porque esses códigos representam diferentes System Completion Codes.



3. Quem realmente matou o JOB?

Em WarGames, o drama nasce porque todo mundo olha para uma tela e começa a imaginar imediatamente o pior cenário possível.

No mainframe acontece algo parecido.

O operador vê:

ABEND S0C7

O programador conclui:

— Problema no sistema operacional.

O sysprog responde:

— É seu COBOL.

O DBA fala:

— Não tem nada a ver com Db2.

O storage pergunta:

— Por que vocês estão me chamando?

Joshua observa silenciosamente.

O procedimento correto é muito menos cinematográfico:

1. identificar o JOB
2. identificar o STEP
3. identificar o ABEND
4. localizar as mensagens
5. consultar dump/log
6. identificar programa/instrução
7. verificar causa
8. corrigir
9. recompilar, se necessário
10. executar novamente

Isso é investigação.

Não adivinhação.


4. O primeiro jogo de Joshua — S0C7

Talvez seja o ABEND mais famoso entre programadores COBOL.

S0C7

Geralmente está associado a uma Data Exception.

Traduzindo para o mundo COBOL:

algum dado que deveria ser numérico não contém uma representação numérica válida para a operação executada.

Imagine:

01  WS-VALOR      PIC 9(05).

E por algum problema de arquivo, layout ou movimentação, a área contém algo incompatível.

Então executamos:

ADD 1 TO WS-VALOR

O processador tenta realizar uma operação decimal.

Só que os bytes armazenados não representam o número esperado.

Resultado possível:

S0C7

O clássico culpado

Considere:

01 WS-NUMERO PIC 9(5).

MOVE '12A45' TO WS-NUMERO.
ADD 1 TO WS-NUMERO.

Dependendo da representação e do contexto, temos material perfeito para uma exceção de dados quando aquela área for usada aritmeticamente.

O verdadeiro problema, entretanto, nem sempre está na linha que deu o ABEND.

Esse é um princípio crucial.

A instrução:

COMPUTE WS-TOTAL = WS-VALOR + WS-TAXA

pode apenas ser o lugar onde a corrupção foi descoberta.

A corrupção talvez tenha acontecido 500 linhas antes.


5. Packed decimal — onde o S0C7 encontra seu habitat favorito

No COBOL empresarial encontramos muito:

PIC S9(7)V99 COMP-3

Isso é packed decimal.

Os dígitos são armazenados compactados em nibbles.

Por exemplo, conceitualmente, os valores são codificados em hexadecimal em vez de armazenados simplesmente como caracteres ASCII/EBCDIC visíveis.

O último nibble normalmente contém o sinal.

Valores típicos de sinal incluem:

C = positivo
D = negativo
F = unsigned/positivo em determinados contextos

Se uma área COMP-3 recebe bytes inválidos e depois participa de uma operação decimal, temos forte candidato a:

S0C7

Imagine um layout errado:

Arquivo real:

01 REGISTRO-REAL.
   05 CODIGO       PIC X(05).
   05 VALOR        PIC S9(7)V99 COMP-3.

Seu programa acredita que seja:

01 REGISTRO-ERRADO.
   05 CODIGO       PIC X(06).
   05 VALOR        PIC S9(7)V99 COMP-3.

Um byte mudou de posição.

Agora você não está lendo VALOR.

Está lendo uma mistura de bytes.

Joshua pergunta:

“Would you like to play S0C7?”


6. Checklist Bellacosa para um S0C7

Quando aparecer:

S0C7

não saia alterando código aleatoriamente.

Investigue:

O campo é DISPLAY?
COMP?
COMP-3?

O layout do arquivo está correto?

O copybook é a versão correta?

Houve REDEFINES?

Existe MOVE entre campos incompatíveis?

O registro possui o comprimento esperado?

O programa inicializou todas as áreas?

Existe arquivo antigo sendo processado com layout novo?

O erro apareceu depois de alteração de copybook?

E uma pergunta particularmente poderosa:

Qual era o conteúdo hexadecimal do campo no momento do ABEND?

O dump pode responder isso.

Aqui começamos a perceber por que um dump não é lixo.

Ele é a fotografia da cena do crime.


7. Segundo jogo — S0C4

Agora Joshua resolve jogar com memória.

S0C4

Esse ABEND está geralmente ligado a problemas de acesso à memória, proteção ou endereçamento.

Em linguagem humana:

o programa tentou acessar uma área de storage que não deveria ou não poderia acessar daquela maneira.

A imagem apresentada resume isso como:

Protection / memory access error.

É uma boa simplificação para o iniciante.

Mas o universo real é mais profundo.

Um S0C4 pode surgir por diversas situações, incluindo erros de endereço, referências inválidas, subscripts incorretos e problemas relacionados ao uso de storage.


8. O array que atravessou a fronteira do NORAD

Considere:

01 WS-TABELA.
   05 WS-ITEM PIC X(10) OCCURS 10 TIMES.

01 WS-I PIC 99.

Agora:

MOVE 50 TO WS-I

DISPLAY WS-ITEM(WS-I)

Temos apenas:

1 até 10

mas estamos tentando acessar:

50

Dependendo do programa, compilação e circunstâncias, podemos acabar acessando storage além da estrutura esperada.

Esse tipo de erro é especialmente perigoso porque memória não respeita a nossa intenção.

O processador não pensa:

“Ah, Vagner queria provavelmente o elemento número 5.”

Ele usa o endereço calculado.

Se estiver errado, estará errado em velocidade de mainframe.


9. Subscript versus index

COBOL possui mecanismos de tabelas que o iniciante precisa compreender.

Por exemplo:

05 WS-CLIENTE OCCURS 100 TIMES
   INDEXED BY IDX-CLIENTE.

Podemos navegar com índice:

SET IDX-CLIENTE TO 1

ou utilizar subscripts em determinadas definições:

MOVE WS-CLIENTE(WS-I)

Erros nessa lógica podem produzir acesso a áreas inesperadas.

Uma proteção importante durante desenvolvimento é utilizar opções adequadas de compilação e runtime para ajudar a detectar referências fora dos limites.

Em ambientes Enterprise COBOL modernos, opções como verificação de limites podem transformar bugs misteriosos em diagnósticos muito melhores.

Ou seja:

debugabilidade também é uma decisão de compilação.


10. S0C4 não significa automaticamente “memória cheia”

Essa confusão merece destaque.

S0C4 não deve ser traduzido simplesmente como:

acabou memória.

Normalmente o raciocínio é mais próximo de:

ocorreu uma exceção relacionada ao acesso/proteção/endereço de storage.

É diferente de:

não há memória suficiente

Por isso precisamos ler as mensagens associadas e o dump.

O código do ABEND é uma pista.

Não é necessariamente o diagnóstico completo.


11. Terceiro jogo — SB37

Agora o míssil nuclear é substituído por algo aparentemente muito menos dramático:

um dataset.

O JOB escreve:

AAAA
BBBB
CCCC
...

E continua.

E continua.

Até o z/OS dizer:

SB37

Em termos simplificados:

o dataset ficou sem espaço disponível para continuar a alocação necessária.

É o equivalente mainframe daquele momento:

Disk full

Mas com detalhes importantes relacionados a datasets, volumes, extents e alocação.


12. SPACE no JCL — a pequena linha que pode derrubar o STEP

Observe:

//OUTFILE DD DSN=BELLACOSA.TESTE.OUT,
//            DISP=(NEW,CATLG,DELETE),
//            SPACE=(TRK,(10,5)),
//            UNIT=SYSDA

Simplificando:

10 tracks = alocação primária
 5 tracks = incrementos secundários

Quando o dataset precisa crescer, o sistema tenta obter espaço adicional.

Se não conseguir continuar expandindo adequadamente, podemos encontrar situações como:

SB37

Há outros ABENDs relacionados a espaço, como:

SD37
SE37

E eles não devem ser tratados como absolutamente equivalentes.

Cada um fornece pistas sobre o que aconteceu durante a tentativa de alocação/extensão.


13. O erro nem sempre é “aumente o SPACE”

Aqui mora uma armadilha maravilhosa.

O programador vê:

SB37

e faz:

SPACE=(CYL,(9999,9999))

Problema resolvido?

Talvez.

Ou talvez tenha escondido algo muito pior.

Imagine que seu programa deveria escrever:

100.000 registros

mas devido a um loop:

PERFORM UNTIL EOF
    WRITE REG-SAIDA
END-PERFORM

o EOF nunca muda.

O programa escreve eternamente.

O dataset cresce.

Até acabar espaço.

O sintoma é:

SB37

Mas a causa lógica é:

LOOP INFINITO

Joshua está aprendendo.

E agora está fabricando registros em velocidade industrial.


14. Quarto jogo — S322

Se existe um código perfeito para um crossover entre JCL e WarGames, é:

S322

Em termos gerais, ele indica que o STEP excedeu determinado limite de tempo de execução permitido.

A imagem resume:

Job exceeded time limit.

Para o iniciante funciona.

Tecnicamente é bom lembrar que o problema normalmente é associado ao step/processamento e seu limite de CPU/tempo aplicável, não necessariamente ao JOB inteiro da forma genérica sugerida pela frase.

Uma causa clássica?

Loop.

PERFORM UNTIL WS-FIM = 'S'
    CONTINUE
END-PERFORM

Se:

WS-FIM

jamais se tornar:

S

parabéns.

Você inventou o moto-perpétuo COBOL.

O sistema, menos otimista, eventualmente intervém.


15. TIME no JCL

Podemos encontrar parâmetros como:

//STEP01 EXEC PGM=MEUPGM,TIME=5

O significado exato deve ser interpretado conforme a sintaxe e contexto do JCL, mas o ponto é que limites de execução podem existir.

Então, diante de S322, pergunte:

O programa entrou em loop?

O volume processado aumentou?

Existe READ que não avança?

Existe PERFORM sem saída?

Um SQL está extremamente custoso?

Houve mudança no comportamento de I/O?

O limite configurado é simplesmente inadequado para o workload?

Não conclua imediatamente:

“Preciso aumentar TIME.”

É o equivalente a descobrir que o carro está com acelerador preso e resolver o problema instalando um tanque de combustível maior.


16. O clássico loop de arquivo

Observe esta beleza:

PERFORM UNTIL WS-EOF = 'S'

    IF WS-TIPO = 'A'
       PERFORM PROCESSA-A
    END-IF

END-PERFORM.

Cadê o:

READ ARQUIVO

?

Joshua responde:

INTERESTING GAME.
THE ONLY WINNING MOVE IS TO READ THE NEXT RECORD.

17. Quinto jogo — S806

A imagem mostra:

806
Load module not found

Para nosso treinamento, vamos escrever corretamente o código de sistema como:

S806

Esse é um dos mais didáticos para entender a relação entre:

JCL
programa
load module
load library
STEPLIB
JOBLIB
link-edit

Imagine:

//STEP01 EXEC PGM=BELL001

O sistema precisa localizar um módulo executável chamado:

BELL001

Mas ele não aparece nas bibliotecas onde a busca está sendo realizada.

Resultado possível:

S806

18. “Mas o source existe!”

Essa frase já ecoou em milhares de CPDs:

— O programa existe! Estou vendo o membro no PDS!

Sim.

Mas você pode estar olhando para:

BELLACOSA.COBOL.SOURCE(BELL001)

Isso é source.

O sistema precisa executar o load module/program object correspondente.

Conceitualmente:

SOURCE
   |
   v
COMPILER
   |
   v
OBJECT
   |
   v
LINK-EDIT / BINDER
   |
   v
LOAD MODULE / PROGRAM OBJECT

Executar COBOL não significa o z/OS abrir seu source e interpretar:

MOVE A TO B

O programa precisa ter passado pelo processo necessário para produzir algo executável.


19. STEPLIB — o mapa que Joshua perdeu

Imagine:

//STEP01 EXEC PGM=BELL001
//STEPLIB DD DSN=BELLACOSA.LOADLIB,DISP=SHR

Estamos indicando uma biblioteca onde o sistema poderá procurar o programa.

Agora imagine:

BELL001 está em:

BELLACOSA.LOAD.PROD

mas o JCL usa:

BELLACOSA.LOAD.TEST

Joshua procura.

Não encontra.

S806

Perguntas úteis:

O nome em PGM= está correto?

O módulo foi link-editado?

O binder terminou com sucesso?

O módulo está realmente nessa LOADLIB?

STEPLIB aponta para a biblioteca correta?

JOBLIB interfere na busca?

Existe diferença entre ambiente DEV, QA e PROD?

Uma nova versão foi compilada mas não implantada?

20. O grande mapa dos cinco ABENDs

Guarde esta associação inicial:

CódigoPense primeiro em
S0C4acesso/endereço/proteção de storage
S0C7dados numéricos inválidos / data exception
SB37problema de espaço/extensão de dataset
S322limite de execução/tempo excedido
S806programa/load module não localizado

Mas acrescente mentalmente:

“Pense primeiro em...”

e não:

“A causa obrigatoriamente é...”

Essa diferença separa troubleshooting de superstição.


21. O verdadeiro professor chama-se JES

Depois do ABEND, uma das primeiras paradas costuma ser a saída do JOB.

No universo z/OS, frequentemente estamos navegando por elementos como:

JES2
SDSF
JESMSGLG
JESJCL
JESYSMSG
SYSOUT
SYSPRINT
CEEDUMP
SYSUDUMP
SYSABEND

Nem todos aparecerão em todos os casos.

Mas isso cria uma regra:

Nunca investigue um ABEND olhando apenas para o código final.

Leia as mensagens próximas ao momento da falha.

Por exemplo:

IEF...
IGD...
IEC...
CEE...
IGZ...

Os prefixos das mensagens já podem indicar qual componente está conversando com você.

O z/OS é quase uma cidade onde cada repartição começa suas cartas com uma assinatura diferente.


22. SDSF — nossa sala de guerra

O Padawan abre o SDSF.

Entra no painel de jobs.

Localiza:

COBTST1

E começa a investigação.

Fluxo mental:

ST
 |
 +--> localizar JOB
       |
       +--> verificar RC / ABEND
             |
             +--> localizar STEP
                   |
                   +--> mensagens
                         |
                         +--> SYSOUT
                               |
                               +--> dump

A pergunta não é:

“Onde está escrito S0C7?”

A pergunta é:

“O que estava acontecendo imediatamente antes do S0C7?”


23. Procure o STEP, não apenas o JOB

Imagine:

//JOB01 JOB ...
//STEP10 EXEC PGM=PROGA
//STEP20 EXEC PGM=PROGB
//STEP30 EXEC PGM=PROGC

Resultado:

STEP10 RC=0000
STEP20 ABEND=S0C7
STEP30 FLUSH

Temos uma informação gigantesca:

PROGA provavelmente terminou
PROGB falhou
PROGC nem executou

Então não comece depurando PROGC.

Parece óbvio.

Sob pressão de produção às 02:37, deixa de ser.


24. Cond code e ABEND não são irmãos gêmeos

Outro conceito importante.

Um programa pode terminar:

RC=0000

Outro:

RC=0004

Outro:

RC=0008

Outro pode sofrer:

ABEND S0C7

Return codes são definidos/conduzidos pelo software conforme sua lógica e convenções.

ABENDs representam término anormal.

Por exemplo, COBOL pode fazer:

MOVE 8 TO RETURN-CODE
GOBACK

O programa terminou deliberadamente com RC 8.

Isso não é igual a sofrer uma exceção e acabar em S0C7.


25. E o misterioso Uxxxx?

Nem todo ABEND começa com S.

Você também poderá encontrar algo como:

U4038

O U remete a user abend.

Ou seja, o término foi solicitado por software/aplicação/runtime em determinada condição.

Um clássico em ambientes Language Environment pode envolver códigos dessa família associados a erros detectados durante execução.

Isso nos dá dois grandes mundos conceituais:

Sxxx = System completion code
Uxxxx = User completion code

Para o Padawan, essa distinção já vale ouro.


26. Dump — a autópsia do programa

Um dump pode parecer inicialmente uma espécie de pergaminho Sith:

PSW
GPR0
GPR1
GPR2
...
OFFSET
TRACEBACK
STORAGE
HEX
MODULE

O iniciante pensa:

— Preciso aprender hexadecimal, assembler e arquitetura z/Architecture inteira antes de corrigir meu COBOL?

Não.

Mas, conforme você evolui, aprender a ler informações de dump muda radicalmente sua capacidade de suporte.

Procure inicialmente:

Nome do programa
Código do ABEND
Offset
Statement
Entry point
Call chain
Variáveis relevantes
Mensagem do runtime

Compilação com informações adequadas de debug pode permitir uma correlação muito melhor entre:

OFFSET

e:

linha COBOL

Essa é uma das grandes vantagens de manter listings de compilação.


27. Nunca jogue fora o compile listing

O compile listing parece inútil enquanto tudo funciona.

Quando o programa cai em produção:

OFFSET +00001A72

de repente aquele listing vira o Santo Graal.

Dependendo das opções e tooling utilizados, ele pode ajudar a relacionar:

offset
paragraph
statement
generated code
data definitions

Por isso equipes maduras conservam artefatos apropriados das builds.

Não somente:

SOURCE.COBOL

Mas também aquilo que permite provar:

qual versão foi compilada, como foi compilada e qual executável foi gerado.

Isso é DevOps antes de DevOps receber esse nome.


28. Curiosidade Bellacosa — ABEND é quase uma filosofia operacional

Mainframes nasceram em um mundo em que jobs podiam processar volumes enormes sem alguém olhando continuamente para a tela.

Logo o sistema precisava dizer precisamente:

terminou?

Se sim:

como terminou?

E se algo deu errado:

por quê?

Por isso temos uma cultura inteira ao redor de:

completion codes
return codes
messages
logs
dumps

Cloud, Kubernetes e observabilidade moderna redescobriram ideias semelhantes com:

exit codes
logs
events
traces
metrics
crash dumps
health checks

O CPD de 1975 provavelmente reconheceria muita coisa em uma War Room de 2026.

Só perguntaria por que colocaram emojis no dashboard.


29. Método Bellacosa de sete perguntas

Quando um programa cair, faça estas perguntas nesta ordem:

1. Qual JOB falhou?

JOBNAME?
JOBID?

2. Qual STEP falhou?

STEP10?
STEP20?
PROCSTEP?

3. Qual programa estava rodando?

PGM=?

4. Qual foi o ABEND?

S0C7?
S0C4?
S806?
...

5. Que mensagens apareceram antes e depois?

Não leia apenas uma linha.

Contexto importa.

6. Qual foi a última alteração?

Pergunta brutalmente poderosa:

Novo source?
Novo copybook?
Novo arquivo?
Novo JCL?
Nova loadlib?
Novo volume de dados?
Nova versão do compilador?

7. Consigo reproduzir?

O problema reproduzível deixa de ser fantasma.

Vira experimento.


30. O jogo mais perigoso chama-se “tentar coisas”

Joshua apresenta:

S0C7

O programador altera:

REGION=0M

Não resolveu.

Aumenta SPACE.

Não resolveu.

Troca DISP.

Não resolveu.

Recompila.

Não resolveu.

Executa novamente.

Não resolveu.

Troca a STEPLIB.

Agora surge:

S806

Parabéns.

Transformamos um incidente em dois.

Troubleshooting profissional segue hipóteses:

EVIDÊNCIA
   ↓
HIPÓTESE
   ↓
TESTE
   ↓
RESULTADO
   ↓
CONCLUSÃO

Não:

ABEND
 ↓
PÂNICO
 ↓
ALTERA TUDO
 ↓
REZA

31. Easter egg — Joshua encontra o JCL

Joshua pergunta:

SHALL WE PLAY A GAME?

O operador responde:

//WARGAME JOB (NORAD),'JOSHUA',
//        CLASS=A,
//        MSGCLASS=X
//STEP01 EXEC PGM=WOPR
//STEPLIB DD DSN=NORAD.DEFENSE.LOAD,DISP=SHR
//INPUT   DD *
GLOBAL THERMONUCLEAR WAR
/*

JES2:

JOB SUBMITTED

Três segundos depois:

IEF450I WARGAME STEP01 - ABEND=S806

Operador:

— Graças a Deus esqueceram de instalar o load module.

Às vezes um S806 salva a humanidade.


32. O exercício do Padawan — provoque um erro controladamente

Em laboratório, entender falhas controladas é excelente treinamento.

Nunca faça isso em produção.

Crie programas simples destinados especificamente a estudar:

S0C7
limites de OCCURS
arquivo crescendo
loops
STEPLIB incorreta

A ideia não é memorizar cinco códigos.

É aprender a cadeia:

CÓDIGO
   ↓
COMPILAÇÃO
   ↓
LINK
   ↓
JCL
   ↓
EXECUÇÃO
   ↓
JES
   ↓
ABEND
   ↓
DIAGNÓSTICO

Quando você entende a cadeia, dezenas de códigos deixam de parecer mágicos.


33. Laboratório mental 1 — S0C7

Você tem:

01 WS-TOTAL PIC S9(7)V99 COMP-3.

O programa sofre:

S0C7

Pergunte:

Quem escreveu nessa área?

Foi MOVE?

Foi arquivo?

Foi Db2?

Foi outra estrutura?

Existe REDEFINES?

O copybook coincide com o registro físico?

Não olhe apenas para:

ADD WS-TOTAL TO ...

A instrução pode ser apenas a vítima que encontrou o cadáver.


34. Laboratório mental 2 — S0C4

Programa cai após:

MOVE WS-TABELA(WS-I) TO WS-SAIDA

Pergunte imediatamente:

Qual valor de WS-I?

Qual OCCURS?

Existe DEPENDING ON?

Existe subscript fora da faixa?

Alguma área foi sobrescrita?

Existe CALL utilizando parâmetros incorretos?

Interfaces entre programas são particularmente interessantes.

Se:

CALL 'PGM2' USING A B C

mas PGM2 interpreta parâmetros incompatíveis, podemos produzir estragos memoráveis.


35. Laboratório mental 3 — SB37

Dataset lotou.

Antes de simplesmente aumentar espaço, verifique:

Quantos registros eram esperados?

Quantos foram escritos?

LRECL?

RECFM?

SPACE?

Primário/secundário?

Volume disponível?

Extents?

Houve crescimento anormal?

Se ontem o arquivo tinha:

500 MB

e hoje tentou chegar a:

80 GB

não comece culpando o storage.

Pergunte por quê.


36. Laboratório mental 4 — S322

Pergunte:

Onde o programa estava?

Quantos registros processou?

Existe progresso no contador?

READ avança?

Cursor Db2 avança?

Laço tem condição de saída?

Foi aumento legítimo de workload?

Um contador de diagnóstico pode ajudar enormemente em desenvolvimento:

ADD 1 TO WS-CONTADOR

IF FUNCTION MOD(WS-CONTADOR 10000) = 0
   DISPLAY 'PROCESSADOS: ' WS-CONTADOR
END-IF

Não necessariamente colocaríamos exatamente isso em toda produção eternamente.

Mas como técnica de investigação, observar progresso é ouro.


37. Laboratório mental 5 — S806

Seu JCL:

//STEP01 EXEC PGM=ABC123

Cheque:

ABC123 existe?

Foi bindado/link-editado?

Está na biblioteca correta?

STEPLIB está certa?

O módulo tem esse nome?

Deploy ocorreu?

Existe alias?

Ambiente está apontando para QA ou DEV?

Um detalhe delicioso:

o source pode chamar-se:

PROGRAMA1

e o executável implantado possuir outro nome conforme processo de build.

Nunca presuma.

Verifique.


38. ABEND também ensina arquitetura

Esses cinco códigos parecem erros isolados.

Mas observe o que aprendemos:

S0C7

Ensina:

representação de dados
PIC
COMP-3
layouts
copybooks

S0C4

Ensina:

storage
endereçamento
arrays
CALL
memória

SB37

Ensina:

datasets
DASD
SPACE
extents
JCL

S322

Ensina:

CPU
loops
execução batch
limites
performance

S806

Ensina:

build
binder
load libraries
STEPLIB
execução

Ou seja:

estudar ABEND é estudar o próprio mainframe.


39. O erro moderno: pedir imediatamente à IA

Em 2026 temos outra personagem sentada na sala do WOPR.

O programador copia:

ABEND S0C7

para uma IA e pergunta:

“Corrija meu programa.”

A IA pode explicar brilhantemente as causas comuns.

Mas faltam informações.

Ela não viu:

dump
layout
input
listing
JCL
alteração recente
conteúdo hexadecimal

A pergunta melhor seria:

Meu STEP STEP20 executando programa FATU001
terminou com S0C7.

O dump aponta para o statement 1487.
A variável usada é WS-VALOR PIC S9(7)V99 COMP-3.
O valor veio do campo ARQ-VALOR de um copybook alterado ontem.

Quais hipóteses devo testar?

Agora existe contexto.

IA não elimina troubleshooting.

Ela pode acelerar troubleshooting bem feito.


40. Nunca coloque dados sensíveis do dump em qualquer IA pública

Aqui aparece nosso RACF imaginário.

Dumps podem conter:

nomes
contas
identificadores
dados financeiros
credenciais
tokens
dados pessoais
informações de infraestrutura

Portanto:

sanitizar dados faz parte do diagnóstico moderno.

Não copie um dump de produção inteiro para um serviço externo apenas porque quer descobrir um S0C7.

Joshua pode ser simpático.

Compliance talvez não seja.


41. O pequeno dicionário do sobrevivente

O Padawan deve reconhecer:

ABEND

Término anormal.

RC

Return Code.

CC

Condition Code, dependendo do contexto.

STEP

Unidade executável de um JOB.

SYSOUT

Saída gerada durante execução.

DUMP

Estado capturado para diagnóstico.

LOADLIB

Biblioteca contendo programas executáveis.

STEPLIB

DD utilizado para definir bibliotecas privadas de busca para aquele step.

JOBLIB

Biblioteca de busca aplicável aos steps do job dentro das regras pertinentes.

SPACE

Parâmetro relacionado à alocação de espaço do dataset.

OCCURS

Estrutura de repetição/tabela COBOL.

COMP-3

Representação decimal packed.


42. Uma rotina realista de incidente

Agora estamos às 03:00.

Produção.

JOB:

FATUR001

falhou.

Passo a passo:

1. Abrir SDSF

Encontrar:

FATUR001
2. Identificar step

Resultado:

STEP040
3. Identificar programa
FATU847
4. Identificar falha
S0C7
5. Ler mensagens

Buscar runtime/dump.

6. Identificar statement/offset

Suponha:

PARAGRAPH CALCULA-TOTAL
7. Identificar operandos
VALOR-BRUTO
TAXA
TOTAL
8. Inspecionar dados

Descobre-se que VALOR-BRUTO contém representação inválida.

9. Descobrir origem

Veio do arquivo produzido por STEP030.

10. Descobrir alteração

Copybook mudou ontem.

Agora temos causa provável.

Não:

“COBOL é antigo.”

Não:

“mainframe travou.”

Não:

“Db2 está estranho.”

Temos evidência.


43. O detalhe mais importante: encontre a causa raiz

Imagine que corrigimos um registro manualmente.

JOB roda.

Vitória?

Ainda não.

Precisamos perguntar:

Por que aquele registro ficou inválido?

Talvez:

programa produtor incorreto
copybook incompatível
deploy parcial
arquivo antigo
campo não inicializado
erro de interface
conversão equivocada

Caso contrário, amanhã:

S0C7

volta.

E Joshua pergunta novamente:

SHALL WE PLAY A GAME?

44. Prevenindo em vez de apenas corrigindo

O Jedi Mainframe não é aquele que conhece 500 ABEND codes de cabeça.

É aquele que cria sistemas que fornecem evidências boas.

Algumas práticas:

  • mantenha listings e artefatos de build;

  • versionamento de source e copybooks;

  • valide layouts;

  • controle deploy de load modules;

  • adote testes;

  • use opções de compilação apropriadas;

  • registre entradas críticas;

  • monitore crescimento de datasets;

  • monitore CPU e elapsed time;

  • trate arquivos e SQLCODE corretamente;

  • mantenha documentação de JCL;

  • preserve rastreabilidade entre source e executável.

A maior evolução acontece quando o sistema deixa de responder apenas:

DEU ERRO

e começa a responder:

ONDE
QUANDO
COM QUAL DADO
EM QUAL VERSÃO
DEPOIS DE QUAL ALTERAÇÃO

Isso é observabilidade.


45. Curiosidade — o mainframe já fazia “observabilidade” quando a palavra nem era moda

Hoje ouvimos:

logs
metrics
traces
telemetry
observability

O ecossistema mainframe possui há décadas uma enorme cultura de:

SMF
JES logs
system messages
dumps
accounting
performance data
audit records

Não são exatamente a mesma coisa das stacks modernas, claro.

Mas a filosofia é familiar:

um sistema crítico precisa deixar rastros suficientes para explicar o que aconteceu.

Os hipsters do Kubernetes descobriram o SYSOUT.

Só trocaram a fonte verde por Grafana.


46. A regra WarGames do ABEND

No final de WarGames, Joshua aprende algo fundamental examinando todas as possibilidades.

No mainframe, o programador também precisa parar de jogar:

“Qual alteração aleatória fará o JOB ficar verde?”

O jogo correto é:

“Qual evidência explica por que ele ficou vermelho?”

São filosofias completamente diferentes.

A primeira produz:

tentativa
erro
tentativa
erro
tentativa
milagre

A segunda produz:

observação
hipótese
teste
causa
correção
prevenção

47. Cheatsheet do Padawan

Quando aparecer:

S0C7

Pense:

DADO NUMÉRICO INVÁLIDO

Procure:

COMP-3
MOVE
arquivo
copybook
REDEFINES
layout
campo não inicializado

S0C4

Pense:

ACESSO/ENDEREÇO DE STORAGE

Procure:

OCCURS
subscript
index
CALL
ponteiros/referências
área sobrescrita

SB37

Pense:

ESPAÇO DO DATASET

Procure:

SPACE
volume
extents
crescimento
loop de escrita

S322

Pense:

TEMPO/EXECUÇÃO EXCESSIVA

Procure:

loop
READ
volume
SQL
CPU
condição de saída

S806

Pense:

PROGRAMA NÃO ENCONTRADO

Procure:

PGM=
STEPLIB
JOBLIB
LOADLIB
binder
deploy
nome do módulo

48. O mapa completo

Nossa aventura começou com cinco códigos.

Mas agora eles formam uma pequena arquitetura:

                    +------------------+
                    |       JOB        |
                    +--------+---------+
                             |
                             v
                    +------------------+
                    |       JCL        |
                    +--------+---------+
                             |
            +----------------+----------------+
            |                                 |
            v                                 v
       +---------+                       +-----------+
       | PROGRAM |                       | DATASETS  |
       +----+----+                       +-----+-----+
            |                                  |
            |                                  +--> SB37
            |
            +--> dados inválidos ------------> S0C7
            |
            +--> storage inválido -----------> S0C4
            |
            +--> loop/tempo -----------------> S322

      Antes de executar:
             |
             +--> módulo ausente ------------> S806

Esse desenho vale mais do que decorar uma tabela.

Ele mostra onde procurar.


49. Easter egg final — WOPR pede acesso à produção

Joshua:

ACCESS PRODUCTION?

RACF:

ICH408I USER(JOSHUA) GROUP(NORAD)
  INSUFFICIENT ACCESS AUTHORITY

Joshua:

A STRANGE GAME.
THE ONLY WINNING MOVE IS NOT TO DEPLOY ON FRIDAY.

O sysprog lentamente fecha o terminal.

O Padawan COBOL anota no caderno:

REGRA 1:
NUNCA CONFUNDIR S0C7 COM SOC7.

REGRA 2:
LER O JES.

REGRA 3:
OLHAR O STEP.

REGRA 4:
NÃO ALTERAR TUDO AO MESMO TEMPO.

REGRA 5:
DESCOBRIR CAUSA RAIZ.

REGRA 6:
NÃO DAR UPDATE EM PRODUÇÃO PARA JOSHUA.

Essa última não está no manual IBM.

Mas deveria.


Epílogo — a única jogada vencedora é aprender a ler a evidência

No início desta viagem, aqueles códigos pareciam mensagens criptografadas:

S0C4
S0C7
SB37
S322
S806

Agora podemos enxergá-los como pistas.

S0C4 pode nos levar ao mundo de storage e endereçamento.

S0C7 nos obriga a entender representação numérica, COMP-3, layouts e dados.

SB37 abre a porta para datasets, DASD e alocação.

S322 ensina sobre execução, loops, CPU e limites.

S806 revela toda a cadeia de compilação, binder, LOADLIB, STEPLIB e deploy.

E talvez esta seja a maior lição para quem começa em COBOL:

um ABEND não é apenas um erro.

É uma aula de arquitetura embrulhada em uma mensagem desagradável.

O programador iniciante olha:

JOB ABENDED

e pensa:

“Algo quebrou.”

O programador experiente olha a mesma mensagem e pergunta:

Qual JOB?
Qual STEP?
Qual programa?
Qual código?
Qual mensagem?
Qual offset?
Qual dado?
Qual versão?
O que mudou?

Essa mudança de mentalidade é gigantesca.

Porque mainframe não exige que você conheça todas as respostas.

Ele exige que você saiba onde procurar as perguntas certas.

Joshua finalmente apaga da tela:

GLOBAL THERMONUCLEAR WAR

e escreve:

S0C7 DIAGNOSTIC LAB

O Padawan toma um gole de café.

— Podemos jogar.

Joshua responde:

EXCELLENT.

PLEASE PROVIDE:
JOBNAME
STEPNAME
PROGRAM NAME
ABEND CODE
COMPILE LISTING
DUMP

O Padawan sorri.

Agora sim.

Não temos mais um jogador apertando botões aleatórios.

Temos um programador mainframe investigando uma falha.

E no Bellacosa Mainframe, essa é a diferença entre alguém que simplesmente executa COBOL...

...e alguém que começa realmente a entender z/OS.

☕ Fim de JOB.

IEF142I WARGAME STEP99 - STEP WAS EXECUTED - COND CODE 0000

A humanidade sobreviveu.

E melhor ainda:

o Padawan aprendeu a abrir o SDSF antes de culpar o mainframe.

terça-feira, 23 de abril de 2024

Tensei Shitara Dai Nana Ōji Datta node, Kimama ni Majutsu o Kiwamemasu

 

Bellacosa Mainframe apresenta o anime Tensei Shitara Dai Nana

☕ Bellacosa Anime 

Tensei Shitara Dai Nana Ōji Datta node, Kimama ni Majutsu o Kiwamemasu

🧙 Quando um maluco por magia ganha acesso de administrador ao universo

Título original: 転生したら第七王子だったので、気ままに魔術を極めます
Romaji: Tensei Shitara Dai Nana Ōji Datta node, Kimama ni Majutsu o Kiwamemasu
Ocidental: I Was Reincarnated as the 7th Prince so I Can Take My Time Perfecting My Magical Ability

Autor: Kenkyo na Circle
Ilustrações da light novel: Meru
Mangá: Yōsuke Kokuzawa
Direção do anime: Jin Tamamura
Estúdio: Tsumugi Akita Animation Lab
Gêneros: fantasia, ação, aventura, comédia, reencarnação/isekai, magia
Estreia do anime: 1º de abril de 2024
Temporada 2: julho a setembro de 2025
Episódios: 12 + 12 = 24 episódios
Status do mangá: em publicação. (KManga)

E já começo com uma ressalva importante:

Lloyd é overpower para cacete.

Normalmente isso seria justamente um dos motivos para eu colocar um enorme sinal amarelo diante deste anime. Só que Dai Nana Ōji encontra uma maneira bastante inteligente — e completamente insana — de transformar o defeito em sua principal característica.

Porque Lloyd não está tentando tornar-se o homem mais poderoso do mundo.

Ele simplesmente quer saber como a magia funciona.

E isso muda tudo.



🧙‍♂️ A história

Na vida anterior, nosso protagonista era um mago comum absolutamente apaixonado por magia.

O problema era que naquele universo dedicação não bastava. Linhagem, aptidão e talento mágico importavam enormemente.

Ele não tinha os recursos necessários.

E morreu.

Seu último grande desejo não foi riqueza, vingança, mulheres ou poder político.

Era basicamente:

"Eu queria ter estudado mais magia."

Então o sujeito abre os olhos novamente.

Só que o RNG da reencarnação enlouqueceu.

Ele agora é Lloyd de Saloum, o sétimo príncipe do Reino de Saloum.

E nasceu praticamente com tudo aquilo que lhe faltava anteriormente: linhagem excepcional, recursos, acesso ao conhecimento e uma quantidade monstruosa de mana.

A própria apresentação oficial define Lloyd como um "magic otaku". (YouTube)

Imagine morrer sendo um programador que queria desesperadamente aprender mainframe e renascer dentro da IBM com:

USER-ID especial, RACF SPECIAL, acesso ao source de tudo, biblioteca inteira, CPU ilimitada e ninguém cobrando suas horas de laboratório.

Lloyd encontrou o paraíso.



👑 Só existe um pequeno problema: Lloyd é completamente maluco

Esse é o ponto em que o anime começa a ficar realmente divertido.

Um protagonista convencional encontra uma magia desconhecida:

"Isso pode ser perigoso."

Lloyd:

"QUE PORRA É ESSA? EU PRECISO DESMONTAR ISSO!"

😂

O garoto possui uma curiosidade quase patológica.

E isso produz uma inversão maravilhosa.

Os monstros começam a ter medo dele.

Demônios observam aquele garotinho aparentemente inofensivo e gradualmente percebem:

"Tem alguma coisa muito errada com essa criança."

E têm razão.



👿 Grim — quando o demônio percebe que escolheu o humano errado

Grim, ou Grimoire, é uma das melhores engrenagens dessa comédia.

Ele deveria representar o sobrenatural perigoso.

Só que encontra Lloyd.

A relação acaba subvertendo completamente a fórmula tradicional de "humano encontra demônio".

Porque existe um momento implícito recorrente na série:

o demônio começa a perceber que talvez o verdadeiro monstro da história seja aquele garotinho sorridente.

E Grim funciona também como nosso medidor.

Se até o demônio olha para alguma coisa que Lloyd está fazendo e pensa:

"Isso é absurdo!"

sabemos que o ponteiro já passou do vermelho.


⚔️ Sylpha — a espada ao lado da bomba nuclear

Sylpha é outra presença importante.

Ela é a criada e instrutora de esgrima de Lloyd e uma combatente extremamente competente.

Em praticamente qualquer outro anime, alguém com suas capacidades poderia facilmente ocupar o papel principal.

Aqui existe uma ironia interessante.

Sylpha vê Lloyd como alguém que precisa ser protegido.

Nós sabemos que isso é mais ou menos equivalente a:

proteger um IBM z17 usando um Commodore 64 como firewall.

Mas o relacionamento funciona justamente porque Lloyd continua ocupando socialmente o papel de criança/príncipe mesmo sendo uma aberração mágica.


🥋 Tao — outro sistema operacional

Tao é particularmente interessante porque introduz outra abordagem para o poder.

Ela trabalha com Qi, algo diferente da magia convencional que Lloyd conhece.

E sabemos imediatamente o que isso significa.

Lloyd não pensa:

"Não é magia, portanto não me interessa."

Ele pensa aproximadamente:

"Existe OUTRO mecanismo de energia funcionando neste universo?!"

Pronto.

Começa outra investigação.

Essa é uma característica muito boa da construção da série: novas técnicas funcionam como novas tecnologias para Lloyd estudar.

Magia, encantamento, Qi, poderes demoníacos, magia sagrada...

O anime vai acrescentando APIs ao mundo.

E Lloyd quer documentação de todas elas.


🧪 Lloyd não aprende magia. Ele faz engenharia reversa

Aqui está provavelmente a parte de 7th Prince que mais me agrada.

Lloyd não possui apenas poder.

Ele possui curiosidade técnica.

Existe uma enorme diferença.

O típico protagonista overpower recebe:

SKILL: INFINITE FIREBALL
POWER: 999999

e dispara.

Lloyd quer saber:

Como FIREBALL funciona?

Quem criou?

Qual é a estrutura?

Posso alterar?

Posso combinar?

Qual é o limite?

O que acontece se eu remover isto?

E se aumentar aquilo?

E se executar de uma maneira que ninguém jamais tentou?

Isso é muito mais interessante.

Ele transforma magia em pesquisa aplicada.


💻 Bellacosa Mainframe explica Lloyd usando COBOL

Imagine este programa:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. MAGIC01.

       PROCEDURE DIVISION.

           PERFORM FIREBALL
           PERFORM TELEPORT
           PERFORM BARRIER

           STOP RUN.

Um usuário normal executaria MAGIC01.

Lloyd perguntaria:

"Cadê o source?"

Entregamos o source.

Cinco minutos depois:

"Onde está o assembler gerado?"

Entregamos.

Depois:

"Quero entender o runtime."

Depois:

"E se eu alterar diretamente a memória?"

Depois:

"Posso executar FIREBALL dentro de TELEPORT?"

Nesse momento Grim entra correndo:

"LLOYD, PELO AMOR DOS DEUSES, PARE!"

😂

Essa é a série.


🩸 E existe algo perturbador em Lloyd

Por baixo da comédia existe uma característica que acho bastante interessante.

Lloyd tem uma relação estranha com perigo.

Quando encontra algo extraordinariamente poderoso, ele frequentemente demonstra mais fascinação do que medo.

Isso faz sentido psicologicamente dentro da premissa.

Na primeira vida, ele morreu limitado por aquilo que não podia aprender.

Agora possui uma segunda oportunidade.

Portanto, para ele, encontrar algo desconhecido é quase irresistível.

É aí que o personagem deixa de ser simplesmente:

criança overpower.

e passa a ser:

pesquisador obsessivo que casualmente possui poder suficiente para destruir o laboratório.


⛪ Segunda temporada — descobriram outra API: Holy Magic

Depois do arco de Guisarme, Lloyd descobre algo que imediatamente aciona seus neurônios:

magia sagrada.

A segunda temporada começa em 9 de julho de 2025 e leva Lloyd em direção à Igreja justamente porque ele quer compreender esse novo tipo de magia. A divulgação da Bandai Namco Filmworks descreveu explicitamente a temporada como a busca de Lloyd pelos segredos da Holy Magic. (Dai Nanao Ji)

Isso é perfeitamente coerente com o personagem.

Ele não está interessado na Igreja primeiramente pela religião.

Está interessado porque alguém mostrou uma tecnologia mágica que ele ainda não domina.

É quase:

LLOYD> DISPLAY MAGIC,SYSTEM

ARCANE     ACTIVE
QI         ACTIVE
DEMONIC    ACTIVE
HOLY       UNKNOWN

LLOYD> INVESTIGATE HOLY

GRIM> NÃO.

LLOYD> CONFIRM

SYSTEM> INVESTIGATION STARTED

Grim: "Merda."


⛪ Magia sagrada e Guitane

Aqui a série ganha uma oportunidade de explorar algo um pouco mais interessante que simplesmente "magia nova".

A magia sagrada envolve conceitos ligados a purificação, fé e Igreja.

E Lloyd novamente tenta compreender algo que tradicionalmente seria apresentado como transcendental.

Isso cria um contraste interessante:

religião trata o fenômeno como sagrado; Lloyd trata o fenômeno como pesquisável.

A temporada culmina no confronto envolvendo Guitane, com o episódio 12 trabalhando justamente a tentativa de Lloyd de usar a Purificação sobre ele. (Prime Video)

É quase o conflito eterno entre:

"É um milagre."

e

"Legal. Agora me mostre a documentação."


🎨 A estética engana bastante

Este é outro elemento peculiar.

Visualmente, Lloyd é extremamente delicado.

Pequeno.

Bonitinho.

Quase andrógino.

Olhos enormes.

Expressões exageradas.

Personagens coloridos.

Grim frequentemente parece mascote.

Então começa a batalha.

BOOOOOOM.

A animação subitamente apresenta círculos mágicos enormes, criaturas grotescas, energia, deformações, explosões e escalas de poder absurdas.

Essa diferença entre design fofo e violência mágica gigantesca é deliberada.

O mangá é especialmente conhecido pelo trabalho visual de Yōsuke Kokuzawa. Em entrevista publicada pela própria K Manga/Kodansha, ele explicou que escolheu adaptar a obra porque enxergou justamente a combinação entre momentos engraçados, batalhas intensas e a personalidade peculiar de Lloyd. (K MANGA)


📚 Light novel → mangá → anime

A genealogia da obra também é interessante.

A história começou como web novel de Kenkyo na Circle, posteriormente virou light novel da Kodansha com ilustrações de Meru.

Depois veio o mangá de Yōsuke Kokuzawa.

E finalmente o anime.

A Kodansha continua publicando oficialmente o mangá; em agosto de 2026, o K Manga estava no capítulo 222, o que deixa bastante material além daquilo que vimos nas duas temporadas do anime. (KManga)

Mangá oficial no K Manga/Kodansha

Isso também significa algo importante:

os 24 episódios não encerram a história.

Há muito mais mundo depois deles.


🎮 Games?

A franquia não nasceu de game e a estrutura narrativa também não depende daquela interface explícita de RPG encontrada em muitos isekais.

E isso é uma vantagem.

Não precisamos assistir Lloyd abrindo constantemente:

LEVEL 999
MAGIC +500
SKILL ACQUIRED

O sistema de poder pode ser exagerado, mas a graça está mais em descobrir, compreender e modificar magia do que simplesmente acumular pontos.


🧠 A mensagem escondida que eu encontro em 7th Prince

Por trás de toda a palhaçada existe uma ideia curiosamente bonita:

ter capacidade não elimina a necessidade de continuar aprendendo.

Lloyd poderia simplesmente aceitar:

"Sou o mais poderoso."

Fim.

Mas não.

Quanto mais sabe, mais coisas descobre que ainda não sabe.

Isso é extremamente próximo da experiência de alguém que trabalha décadas com tecnologia.

Você aprende COBOL.

Descobre CICS.

Aprende CICS.

Descobre Db2.

Aprende Db2.

Descobre RACF.

Depois MQ.

IMS.

REXX.

JCL.

USS.

APIs.

Containers.

DevOps.

IA.

E finalmente percebe:

o mapa ficou maior conforme você aprendeu.

Essa talvez seja a melhor mensagem escondida de Dai Nana Ōji.


🥚 Easter egg Bellacosa

Imagino Lloyd entrando pela primeira vez num datacenter IBM.

Ele observa o mainframe.

Silêncio.

Encosta a mão no rack.

Seus olhos começam a brilhar.

Grim imediatamente pergunta:

"Lloyd... o que você está pensando?"

Lloyd:

"Uma arquitetura criada há mais de 60 anos ainda executa aplicações antigas e modernas no mesmo ecossistema..."

Grim:

"Lloyd..."

Lloyd:

"Quero ver o microcode."

Grim:

"LLOYD, NÃO!"

Às 03:17, surge no console:

ICH408I USER(LLOYD)
ACCESS DENIED

Cinco segundos depois:

ICH408I USER(GRIM)
ACCESS DENIED

Grim:

"POR QUE MEU USER-ID ESTÁ AQUI?!"

😂


⚖️ Classificação Bellacosa Anime

Eu colocaria assim:

História: ⭐⭐⭐⭐☆
Construção do mundo: ⭐⭐⭐⭐☆
Personagens: ⭐⭐⭐⭐☆
Animação nas batalhas: ⭐⭐⭐⭐⭐
Comédia: ⭐⭐⭐⭐☆
Originalidade dentro da reencarnação: ⭐⭐⭐⭐☆
Protagonista: ⭐⭐⭐⭐☆
Perigo real para Lloyd: ⭐☆☆☆☆
Síndrome overpower: ⭐⭐⭐⭐⭐
Diversão: ⭐⭐⭐⭐⭐
Vontade de descobrir a próxima maluquice: ⭐⭐⭐⭐⭐

Nota Bellacosa: 8,4/10

O overpower continua sendo seu maior problema. Quem procura tensão semelhante a Goblin Slayer, consequências brutais como em Teogonia ou evolução sofrida como em Mushoku Tensei provavelmente vai sentir falta de risco.

Mas 7th Prince faz algo inteligente:

não tenta fingir que Lloyd não é overpower.

Abraça completamente o absurdo.

E troca a pergunta:

"Será que Lloyd conseguirá derrotar o inimigo?"

por uma muito mais divertida:

"O que esse pequeno psicopata científico vai fazer quando descobrir como o poder do inimigo funciona?"

Aí o anime encontrou sua personalidade.

E é justamente por isso que Tensei Shitara Dai Nana Ōji consegue sobreviver ao pecado que mata tantos isekais:

Lloyd não quer chegar ao nível máximo.

Ele quer abrir o sistema e descobrir como foi programado.

E para um programador, isso é perigosamente fácil de entender. 😈

segunda-feira, 22 de abril de 2024

Uncharted Entra no CPD — A IA Encontrou o COBOL, Mas o Tesouro Estava Escondido no JCL

 

Bellacosa Mainframe e a ia encontrou o mainframe cobol

☕ Um Café no Bellacosa Mainframe

Uncharted Entra no CPD — A IA Encontrou o COBOL, Mas o Tesouro Estava Escondido no JCL

Ou: por que Nathan Drake consegue ler o mapa, mas ainda precisa descobrir a passagem secreta, o CALL dinâmico, a PROC esquecida e o scheduler que alguém alterou em 2009

Existe uma cena clássica em qualquer aventura de Uncharted.

Nathan Drake encontra um mapa.

O papel está amarelado.

Há símbolos misteriosos.

Uma anotação feita há duzentos anos aponta para algum lugar impossível.

Sully olha para aquilo e provavelmente pensa:

— Garoto, isso vai dar problema.

Nathan responde alguma coisa otimista, pega a mochila, recarrega a arma e vai atrás do tesouro.

O erro seria imaginar que, porque ele encontrou o mapa, a aventura acabou.

Na realidade, foi exatamente naquele momento que ela começou.

Bem-vindo à modernização de aplicações mainframe com Inteligência Artificial.

Hoje temos ferramentas fantásticas capazes de pegar milhões de linhas COBOL, PL/I, Assembler, JCL e copybooks e fazer coisas que vinte anos atrás exigiriam equipes inteiras.

Elas podem:

  • explicar programas;

  • encontrar referências;

  • montar árvores de chamadas;

  • gerar documentação;

  • sugerir regras de negócio;

  • criar testes;

  • traduzir código;

  • localizar dependências;

  • produzir diagramas;

  • auxiliar numa migração.

Um programador COBOL iniciante olha para isso e pensa:

“Pronto. Coloca o repositório na IA e ela descobre o sistema.”

Calma, jovem explorador.

Você encontrou o mapa do tesouro.

Não encontrou necessariamente o tesouro.

E talvez nem saiba ainda onde estão as cobras.



Prólogo — Nathan Drake encontrou o COBOL

Imagine que chegamos a uma empresa fictícia chamada Bellacosa International Treasure Bank.

O banco possui:

18.000 programas COBOL
9.400 copybooks
26.000 JCLs
4.000 PROCs
centenas de tabelas Db2
milhares de datasets
CICS
IMS
MQ
VSAM
Assembler
REXX
sort cards
scheduler

Além disso, algumas pessoas que criaram partes importantes do sistema já se aposentaram.

Outras trabalham ali há trinta anos e sabem coisas que nunca foram documentadas.

A diretoria anuncia:

“Vamos modernizar.”

A palavra ecoa pelo CPD.

Modernizar.

Maravilhosa palavra.

Pode significar desde:

compilar COBOL com versão mais nova

até:

migrar metade da empresa para cloud
e descobrir seis meses depois
que alguém esqueceu um arquivo EBCDIC.

Para ajudar, chega a Inteligência Artificial.

Jogamos nela:

PAY001.CBL

A IA analisa o programa.

Encontra:

CALL 'PAY002'
CALL 'PAY003'

EXEC SQL
   SELECT ...
END-EXEC

Ela produz:

PAY001
 ├── PAY002
 ├── PAY003
 └── DB2

Excelente.

Nathan Drake encontrou o primeiro pedaço do mapa.

Só que existe isto:

CALL WS-PROGRAM USING WS-AREA

Sully imediatamente pergunta:

“E quem diabos é WS-PROGRAM?”

Ótima pergunta.


1. O primeiro templo — programa não é aplicação

Essa é provavelmente uma das lições mais importantes para quem começa em mainframe.

Quando estudamos programação, pensamos:

programa = aplicação

Isso pode funcionar num pequeno exercício.

Você tem:

CALCULA.CBL

O programa lê valores, calcula alguma coisa e termina.

Mas aplicações corporativas que nasceram há décadas são outra criatura.

Um sistema real pode ser:

COBOL
+
COPYBOOK
+
JCL
+
PROC
+
DB2
+
VSAM
+
CICS
+
IMS
+
MQ
+
Scheduler
+
Control Tables
+
Assembler
+
REXX
+
Configuração
+
Dados
+
Operação
+
Conhecimento humano

O COBOL é importante.

Mas ele é apenas uma sala do templo.

E algumas das passagens secretas ficam fora dela.


2. O mapa encontrado pela IA

Vamos usar um programa simples.

IDENTIFICATION DIVISION.
PROGRAM-ID. PAY001.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 WS-PROGRAM PIC X(8).

PROCEDURE DIVISION.

    MOVE 'PAY002' TO WS-PROGRAM

    CALL WS-PROGRAM

    GOBACK.

Um analisador consegue identificar:

CALL variável

Mas o destino pode depender de lógica anterior.

Agora imagine:

EXEC SQL
   SELECT PROGRAM_NAME
     INTO :WS-PROGRAM
     FROM CONTROL_TABLE
    WHERE OPERATION = :WS-OPERATION
END-EXEC

CALL WS-PROGRAM.

O programa chamado não está literalmente escrito no comando CALL.

Pode ser:

PAY002
PAY003
PAY099
PAY777

dependendo do conteúdo da tabela.

A IA pode perceber que existe uma chamada dinâmica.

Mas sem conhecer os valores possíveis daquela tabela, ela não consegue afirmar com certeza qual programa será chamado.

Portanto:

SOURCE CODE

diz:

“Existe uma chamada dinâmica.”

Enquanto:

RUNTIME

pode dizer:

“Nas últimas 48 horas, PAY002 foi chamado 800 mil vezes e PAY777 foi chamado três vezes.”

Essas três execuções podem ser exatamente as três que movem cinquenta milhões de reais.

Agora você entende por que quantidade de execução e importância de negócio não são a mesma coisa.


3. Curiosidade Bellacosa — o código que quase nunca executa pode ser o mais importante

Um iniciante normalmente pensa:

“Se roda pouco, deve ser pouco importante.”

Não necessariamente.

Imagine:

ROTINA-A

executa 4 milhões de vezes por dia.

Ela formata um nome.

Agora:

ROTINA-B

executa uma vez por ano.

Ela fecha o exercício fiscal.

Qual você prefere quebrar?

Pois é.

Modernização exige algo que Uncharted ensina muito bem:

Nem toda porta escondida guarda o mesmo perigo.


4. O segundo templo — COPYBOOK não é só Ctrl+C corporativo

No começo, copybook parece simples.

COPY CLIENTE.

E dentro:

01 CLIENTE.
   05 CODIGO PIC 9(08).
   05 TIPO   PIC X.
   05 SALDO  PIC S9(11)V99 COMP-3.

Você pensa:

“É apenas uma estrutura compartilhada.”

Sim.

E não.

Esse layout pode ser usado por:

programa COBOL online
batch noturno
Easytrieve
SORT
MQ
arquivo VSAM
interface externa
warehouse
Java
Python
ETL

Agora alguém altera:

01 CLIENTE.
   05 CODIGO PIC 9(08).
   05 PAIS   PIC X(02).
   05 TIPO   PIC X.
   05 SALDO  PIC S9(11)V99 COMP-3.

Do ponto de vista da aplicação que recompilou:

Tudo certo.

Mas talvez exista um programa distante que não tenha copybook algum.

Ele simplesmente sabe:

byte 9 = tipo do cliente

Você inseriu dois bytes antes desse campo.

Agora:

byte 9

não significa mais a mesma coisa.

Parabéns.

Você acabou de descobrir uma armadilha do templo.


5. Nathan Drake encontra REDEFINES e quase cai num abismo

Agora chegamos numa das maravilhas do COBOL:

01 WS-REGISTRO.
   05 WS-TIPO PIC X.
   05 WS-DADOS PIC X(100).

01 WS-CLIENTE REDEFINES WS-REGISTRO.
   05 ...

01 WS-CONTA REDEFINES WS-REGISTRO.
   05 ...

O mesmo conjunto de bytes pode ser interpretado de formas diferentes.

Para um analisador estático:

layout CLIENTE existe
layout CONTA existe

Perfeito.

Mas qual deles é usado em produção?

Talvez:

CLIENTE = 99,98%
CONTA   = 0,02%

O problema é que aqueles 0,02% podem aparecer somente no encerramento anual.

Você migra o sistema em maio.

Testa maio.

Testa junho.

Testa julho.

Tudo verde.

Chega dezembro.

O velho sistema olha para você e diz:

SOC7

Feliz Natal.


6. Terceiro templo — JCL é parte da aplicação

Aqui muitos programadores iniciantes cometem um erro.

Eles estudam COBOL e enxergam JCL como:

“A coisa estranha que executa meu programa.”

Só que JCL pode mudar drasticamente o comportamento real.

Considere:

//STEP10 EXEC PGM=PAY001
//INPUT  DD DSN=PROD.PAY.INPUT

Você conclui:

PAY001 recebe PROD.PAY.INPUT

Agora descubra que o job verdadeiro chama uma PROC:

//STEP10 EXEC PROC=PAYPROC

e depois faz override:

//STEP10.RUN.INPUT DD DSN=PROD.SPECIAL.PAY.INPUT

Pronto.

A informação originalmente lida na PROC não corresponde necessariamente ao dataset utilizado naquela execução.

É exatamente como encontrar um mapa do templo mostrando uma porta.

Só que alguém construiu uma passagem lateral em 2004.

E nunca atualizou o mapa.


7. PROC — a passagem secreta atrás da estante

Cataloged procedures existem para reutilizar JCL.

Ótimo conceito.

Mas imagine décadas de alterações.

Temos:

JOB
 ↓
PROC
 ↓
PROC
 ↓
override
 ↓
symbolic parameter
 ↓
dataset

A IA precisa resolver isso tudo.

Porque:

JCL que você vê

não é necessariamente:

JCL efetivamente executado

Antes de modernizar um fluxo batch, tente produzir a versão resolvida do JCL.

Ou seja:

qual PGM?
qual PARM?
qual dataset?
qual DISP?
qual STEPLIB?
qual PROC?
qual override?

Essa é uma excelente prática de discovery.


8. Quarto templo — scheduler contém lógica de negócio

A primeira vez que alguém percebe isso geralmente fica olhando para a tela alguns segundos.

Imagine:

JOBB

executa somente se:

JOBA terminou OK
AND hoje é último dia útil
AND FILE-X chegou
AND país != feriado
AND JOBZ não está rodando

Onde está essa lógica?

Talvez não esteja no COBOL.

Talvez nem no JCL.

Está no:

Control-M
IBM Workload Scheduler
CA-7
ESP
ou outro scheduler

Portanto:

scheduler configuration

é parte da aplicação.

Se durante uma migração você copiar:

COBOL
JCL
DB2

mas não reproduzir corretamente a orquestração, você poderá ter um sistema funcional que executa na hora errada.

E em processamento financeiro, “certo na hora errada” costuma significar simplesmente:

ERRADO

9. Quinto templo — control table é código disfarçado de dado

Aqui Nathan Drake acende a tocha.

Imagine esta tabela:

OPERATION   PROGRAM
---------------------
PAYMENT     PAY001
REFUND      REF010
REVERSAL    REV777

E o COBOL:

SELECT PROGRAM
INTO WS-PROGRAM
FROM CONTROL_TABLE
WHERE OPERATION = WS-OPERATION.

CALL WS-PROGRAM.

Agora alguém executa:

UPDATE CONTROL_TABLE
SET PROGRAM = 'PAY900'
WHERE OPERATION = 'PAYMENT';

Pergunta:

O source COBOL mudou?

Não.

Houve novo compile?

Não.

Houve link-edit?

Não.

O comportamento da aplicação mudou?

SIM.

Logo:

Alguns dados são, na prática, configuração executável.

Essa é uma das razões pelas quais repositório de source não representa obrigatoriamente todo o sistema.


10. Sexto templo — compiler options também importam

Agora entramos numa área que muitos iniciantes ignoram.

Você possui:

PAY001.CBL

e imagina que o source define tudo.

Mas programas COBOL são compilados.

E opções do compilador podem alterar comportamento.

Entre elas encontramos temas relacionados a:

aritmética
truncamento
debug
otimização
chamadas
compatibilidade
representação
runtime checking

Ou seja:

mesmo source
+
configuração diferente
=
possível comportamento diferente

É por isso que discovery sério deve coletar:

source
compiler listing
compiler options
binder information
load module information

A IA não deveria simplesmente olhar um .CBL solitário e proclamar:

“Eu compreendi tudo.”

Nathan Drake olhando uma inscrição na parede não sabe automaticamente qual mecanismo ela aciona.

Ele precisa olhar o chão também.


11. Sétimo templo — Db2 Package: o mapa que lembra como chegar ao dado

Com SQL estático em COBOL, existe outra peça importante.

Você escreve:

EXEC SQL
   SELECT SALDO
     INTO :WS-SALDO
     FROM CONTA
    WHERE CONTA_ID = :WS-CONTA
END-EXEC

Mas o ecossistema de execução envolve também elementos de Db2 como:

DBRM
BIND
PACKAGE
PLAN
access path

Dependendo do ambiente e da arquitetura.

Para modernization discovery, você quer saber:

qual programa usa qual package?
qual package referencia quais objetos?
qual versão?
qual bind?

Porque a arquitetura real não termina no EXEC SQL.


12. Oitavo templo — runtime é o chão onde as pegadas aparecem

Chegamos ao conceito mais poderoso do artigo original.

Static analysis diz:

“Isso pode acontecer.”

Runtime diz:

“Isso aconteceu.”

É uma diferença brutal.

Considere:

PGMA pode chamar:
PGMB
PGMC
PGMD

Static analysis apresenta três caminhos.

Mas produção mostra:

PGMB = 9.000.000 execuções
PGMC = 37 execuções
PGMD = 0 execuções

Agora temos evidência operacional.

Podemos olhar:

SMF
logs
CICS
Db2 traces
IMS
MQ
scheduler history
dataset activity
job history
APM

Cada plataforma terá fontes diferentes.

O objetivo é confrontar:

POSSIBLE

contra:

OBSERVED

Isso é ouro para discovery.


13. Mas cuidado: “não observado” não significa “não existe”

Essa é outra armadilha.

Suponha:

PGMD = 0 execuções em 90 dias

Podemos aposentá-lo?

Talvez.

Mas pergunte:

ele roda mensalmente?
trimestralmente?
anualmente?
só em desastre?
somente em fechamento?
somente em contingência?

Um programa DR pode não executar durante cinco anos e continuar essencial.

Portanto:

NOT OBSERVED

não significa automaticamente:

DEAD CODE

Isso precisa virar hipótese.


14. A grande tabela do explorador: D, R, H e U

Uma técnica extremamente útil seria classificar cada descoberta.

Use:

[D] Deterministic
[R] Runtime observed
[H] Hypothesis
[U] Unknown

Por exemplo:

[D] PAY001 contém CALL PAY002.

[D] JOBPAY executa PAY001.

[R] PAY001 executou 8.231 vezes em 30 dias.

[R] PAY002 foi carregado 7.994 vezes.

[H] Parte das demais execuções seleciona PAY010 dinamicamente.

[U] 237 targets ainda não resolvidos.

Isso muda completamente a conversa.

Em vez de dizer:

“Mapeamos a aplicação.”

Você diz:

“Temos 91% das relações críticas confirmadas, 7% observadas apenas em runtime e quatro dependências de alto impacto ainda não resolvidas.”

Muito mais profissional.


15. Curiosidade — 100% de linhas analisadas pode significar quase nada

Imagine o relatório:

18 milhões de linhas analisadas
100% repository coverage

Executivo feliz.

PowerPoint verde.

Mas escondido numa nota:

11 dynamic CALLs unresolved
3 vendor modules sem source
2 interfaces externas desconhecidas
1 scheduler condition não documentada

Então temos:

100% CODE SCANNED

mas não:

100% SYSTEM UNDERSTOOD

Por isso o objetivo de discovery não deveria ser obsessão por “completude”.

Deveria ser redução controlada de incerteza.


16. O conceito Bellacosa de UNKNOWN WITH CONSEQUENCE

Nem todo desconhecido merece a mesma energia.

Imagine:

UnknownContextoRisco
CALL desconhecidorelatório internobaixo
arquivo desconhecidoprocesso mensalmédio
consumidor desconhecidopagamentocrítico
módulo sem sourcesettlementcrítico

Agora discovery passa a priorizar risco.

Podemos usar uma heurística:

RISCO =
PROBABILIDADE
× IMPACTO
× INCERTEZA

Não precisa ser ciência matemática perfeita.

É uma ferramenta de decisão.

Exemplo:

Dynamic CALL X

Probabilidade: 5
Impacto:       5
Incerteza:     4

Risco = 100

Compare com:

Relatório antigo

Probabilidade: 1
Impacto:       1
Incerteza:     4

Risco = 4

Você sabe onde colocar Nathan Drake primeiro.


17. Nono templo — conhecimento tribal

Agora chegamos ao inimigo final.

Pergunte:

“Por que JOBABC não pode rodar antes do JOBXYZ?”

Resposta:

“Porque dá problema.”

Pergunte:

“Onde está documentado?”

Resposta:

“Não está.”

“Scheduler?”

“Também não.”

“JCL?”

“Não.”

“Então como vocês sabem?”

Resposta:

“O Cláudio sabe.”

Cláudio está na empresa desde 1987.

Cláudio sabe que:

quando último dia útil cai numa sexta-feira
e segunda é feriado
JOBABC precisa esperar arquivo X

Onde está essa regra?

Na cabeça do Cláudio.

Isso se chama:

institutional knowledge

ou, informalmente:

conhecimento tribal.

É patrimônio operacional.

E é também um risco enorme.


18. Aqui IA pode virar Indiana Jones... quer dizer, Nathan Drake corporativo

Entrevistas com SMEs podem ser transcritas.

A IA pode extrair afirmações.

Exemplo:

Cláudio diz:

“PAY099 só roda quando há reversão manual.”

Transformamos isso em:

[H] PAY099 executa apenas em reversões manuais.

Depois verificamos:

runtime history
scheduler
transactions
JCL
Db2

Se confirmar:

[D/R] CONFIRMED

Se não:

CONTRADICTION

Isso é muito mais poderoso do que simplesmente produzir atas de reunião.

Estamos transformando memória humana em hipóteses verificáveis.


19. O grande perigo — IA verificando IA

Agora chegamos à armadilha mais moderna de todas.

Imagine:

IF STATUS = 'A'

A IA interpreta:

A = ACTIVE

Só que no sistema:

A = AWAITING SETTLEMENT

A IA gera documentação:

STATUS A means ACTIVE

Depois cria teste:

Given an active account
STATUS = A

Depois gera Java.

Depois executa seus próprios testes.

Resultado:

PASS
PASS
PASS
PASS

A diretoria comemora.

Só existe um pequeno problema.

Tudo está errado.

Mas está coerentemente errado.

Esse é um dos maiores perigos da geração automática.


20. Regra Bellacosa: quem escreve a prova não pode sozinho corrigir a própria prova

Ou, tecnicamente:

Verification must exist outside the generation loop.

Se IA:

interpreta
gera
testa
valida

tudo usando a mesma hipótese inicial, ela pode perpetuar o erro.

Precisamos de fontes externas de verdade.

Exemplos:

compiler output
runtime traces
immutable specs
regression suites
parallel run
production reconciliation
known datasets
SME validation

Ou seja:

AI OUTPUT
     ↓
INDEPENDENT EVIDENCE

e não:

AI OUTPUT
     ↓
AI CHECKS AI
     ↓
PARABÉNS

21. O décimo templo — parallel run

Uma técnica poderosíssima em modernização é executar:

sistema antigo

e:

sistema novo

em paralelo.

Mesmas entradas.

Depois comparar:

saídas
saldos
transações
contagens
erros
tempos
efeitos

Exemplo:

LEGACY:
10.000.000 transações
resultado financeiro X

NEW:
10.000.000 transações
resultado financeiro X

Excelente.

Agora imagine:

NEW divergiu em 17 transações

Essas 17 são lixo?

Ou são justamente:

clientes judiciais
contas especiais
operações antigas
casos de fechamento

A reconciliação encontra justamente as pequenas exceções que documentação gerada pode esconder.


22. O verdadeiro mapa: Evidence Graph

Se eu estivesse montando uma arquitetura de discovery moderna, criaria um grafo.

Nós:

PROGRAM
COPYBOOK
JOB
PROC
STEP
DATASET
TABLE
PACKAGE
TRANSACTION
QUEUE
API
SCHEDULER
CONTROL TABLE
LOAD MODULE

Relacionamentos:

CALLS
READS
WRITES
EXECUTES
USES
BINDS
TRIGGERS
CONSUMES
PRODUCES
DEPENDS ON

Mas não basta guardar a relação.

Precisamos guardar a evidência.

Exemplo:

PAY001
   |
   | CALLS
   |
PAY002

Metadata:

source: compiler listing
type: deterministic
confidence: 100%

Outro:

PAY001
   |
   | CALLS
   |
PAY099

Metadata:

source: runtime trace
observed: 37 times
type: runtime

Outro:

PAY001
   |
   | POSSIBLY CALLS
   |
PAY777

Metadata:

source: LLM inference
type: hypothesis
confidence: 63%

Agora sim temos algo valioso.

Não apenas:

knowledge graph.

Mas:

evidence-backed knowledge graph.


23. Passo a passo para um iniciante fazer discovery

Vamos transformar tudo isso numa sequência prática.

Passo 1 — escolha uma capacidade pequena

Não comece:

“Vamos entender o banco inteiro.”

Comece:

“Vamos entender consulta de saldo.”

Ou:

“Vamos entender pagamento.”

Passo 2 — encontre os pontos de entrada

Pode ser:

CICS transaction
JCL
API
MQ
IMS transaction
batch

Pergunte:

como essa capacidade começa?

Passo 3 — descubra os programas

Mapeie:

programas chamados
CALLs estáticos
CALLs dinâmicos
subprogramas
assembler
utilities

Passo 4 — expanda COPYBOOKs

Não analise apenas:

COPY ACCOUNT.

Resolva o conteúdo real.

Observe:

offset
length
REDEFINES
OCCURS
COMP
COMP-3

Passo 5 — resolva JCL e PROC

Descubra o job efetivo.

Inclua:

symbolics
overrides
datasets
STEPLIB
PARM
COND

Passo 6 — analise acesso a dados

Procure:

Db2
VSAM
QSAM
IMS
MQ
files

Passo 7 — busque configuração externa

Inclua:

scheduler
control tables
CICS definitions
IMS definitions
Db2 package info
MQ configuration

Passo 8 — olhe produção

Pergunte:

o que realmente executou?

Use evidência disponível.


Passo 9 — registre unknowns

Exemplo:

U-001 Dynamic CALL unresolved
U-002 Consumer of dataset unknown
U-003 Vendor module source unavailable

Passo 10 — classifique risco

Algo como:

LOW
MEDIUM
HIGH
CRITICAL

Passo 11 — use IA para correlação

Agora sim.

Entregue os fatos.

Peça:

explique
correlacione
documente
sugira testes
aponte inconsistências

A IA passa a trabalhar sobre evidência.


Passo 12 — valide fora da IA

Use:

compiler
runtime
SME
tests
parallel run

24. Easter egg — “Sic Parvis Magna”

Fãs de Uncharted reconhecerão imediatamente:

Sic Parvis Magna

“Grandeza a partir de pequenos começos.”

É praticamente uma metodologia perfeita para modernização.

Não tente modernizar:

30 milhões de linhas

de uma vez.

Comece:

1 capability
1 fluxo
1 domínio
1 slice

Descubra.

Valide.

Execute.

Aprenda.

Atualize o mapa.

Depois avance.

small slice
↓
evidence
↓
deployment
↓
observation
↓
new evidence
↓
next slice

Sic Parvis Magna, versão z/OS.


25. Discovery não deve terminar numa enciclopédia

Outro erro comum:

Passamos nove meses criando:

4.000 páginas de documentação

Todos ficam felizes.

Seis meses depois:

20% já está desatualizado.

Discovery não existe para produzir a Wikipédia definitiva do mainframe.

Existe para permitir decisão.

Exemplo:

RETAIN
EXPOSE
REPLACE
RETIRE
REIMAGINE

26. RETAIN — não mexa no templo que está funcionando

Às vezes você descobre:

COBOL
estável
rápido
barato
confiável
bem testado

Então por que reescrever?

Modernização pode significar:

novo compiler
CI/CD
APIs
testes
observabilidade
Git
DevOps

mantendo o core.


27. EXPOSE — abra uma porta moderna

Imagine:

CICS → COBOL

que funciona há vinte anos.

Talvez a necessidade moderna seja:

Mobile
   ↓
REST API
   ↓
CICS
   ↓
COBOL

Você não precisa necessariamente destruir o castelo.

Talvez baste construir uma ponte.


28. REPLACE — troque o que realmente perdeu sentido

Existem partes que podem ser substituídas.

Exemplo:

relatório antigo
utility obsoleto
interface redundante

Mas a decisão deve nascer da descoberta.

Não do preconceito:

“É COBOL, portanto precisa morrer.”


29. RETIRE — finalmente aposente o fantasma

Discovery pode encontrar programas que:

não executam
não são chamados
não têm consumidores
não possuem valor

Ótimo candidato a aposentadoria.

Mas lembre:

not observed
≠
not needed

Cheque ciclos anuais, contingência e requisitos regulatórios.


30. REIMAGINE — não traduza o passado linha por linha

Aqui mora uma das maiores confusões de modernization.

Você pega:

COBOL

e traduz para:

Java

Parabéns.

Agora você pode ter:

um sistema COBOL escrito em Java.

As mesmas:

dependências
batch windows
control tables
arquivos
acoplamentos
processos

continuam lá.

Modernizar não é necessariamente trocar linguagem.

Reimaginar significa perguntar:

“Como essa capacidade deveria existir hoje?”

Isso pode gerar uma arquitetura completamente diferente.


31. Migration e modernization são parentes, não gêmeos

Migrar:

A → B

Modernizar:

A → algo melhor

Às vezes coincidem.

Às vezes não.

Você pode migrar sem modernizar.

Pode modernizar sem migrar.

E pode realizar uma migração tão ruim que termina com um sistema mais complexo do que antes.

Nathan Drake também sabe disso.

Nem todo caminho novo leva ao tesouro.

Alguns levam ao precipício.


32. Métricas que não impressionariam Sully

Evite celebrar apenas:

20 milhões de linhas escaneadas
50 milhões de tokens
900 diagramas gerados
10 mil páginas documentadas

Essas são métricas de atividade.

Pergunte:

Quantos riscos críticos fechamos?

Quantas decisões foram tomadas?

Quantas dependências foram confirmadas?

Quantos unknowns de alto impacto restam?

Quantas mudanças chegaram com segurança à produção?

Qual KPI melhorou?

Isso é resultado.


33. A aventura completa

No final, nosso mapa fica assim:

SOURCE
   ↓
STATIC ANALYSIS
   ↓
CONFIGURATION
   ↓
RUNTIME
   ↓
EVIDENCE
   ↓
AI
   ↓
INTERPRETATION
   ↓
HYPOTHESES
   ↓
VALIDATION
   ↓
RISK
   ↓
DECISION

E finalmente:

RETAIN
EXPOSE
REPLACE
RETIRE
REIMAGINE

Essa é uma metodologia muito mais saudável do que:

COBOL
 ↓
LLM
 ↓
Java
 ↓
PRODUCTION

Se alguém propuser exatamente esse último diagrama numa reunião, recomendo verificar se Sully já está preparando o avião para fugir.


Epílogo — o tesouro nunca esteve apenas no COBOL

O programador iniciante chega ao mainframe e pensa:

“Preciso aprender COBOL.”

Correto.

Depois descobre:

JCL

Depois:

Db2

Depois:

VSAM

Depois:

CICS

Depois:

IMS

Depois:

MQ

Depois:

scheduler

Depois:

RACF

Depois vê control tables, compiler options, PROCs, SMF, load libraries, binder, copybooks e pessoas que conhecem regras de 1993.

Nesse momento ele entende:

Mainframe não é uma linguagem. É um ecossistema.

E aplicações antigas são frequentemente organismos históricos.

Foram construídas em camadas.

Uma mudança em 1988.

Outra em 1994.

Um workaround em 1999.

Euro em 2002.

Regulatório em 2008.

Novo canal em 2013.

API em 2018.

Cloud em 2024.

IA em 2026.

Cada geração deixou alguma coisa no templo.

O trabalho da Inteligência Artificial não é fingir que conhece todas as câmaras escondidas.

É ajudar você a encontrá-las.

Ela pode ler inscrições numa velocidade impossível para uma equipe humana.

Pode conectar copybooks.

Pode explicar COBOL.

Pode comparar milhares de programas.

Pode gerar hipóteses.

Pode localizar padrões.

Pode transformar documentação ruim em algo utilizável.

Pode auxiliar na geração de testes.

Pode tornar discovery dramaticamente mais rápido.

Mas ainda precisamos perguntar:

De onde veio essa afirmação?

É fato?

É runtime?

É hipótese?

É unknown?

Qual o risco se estiver errada?

Essa é a diferença entre demonstração bonita e engenharia de modernização.

Portanto, quando alguém disser:

“Nossa IA analisou 100% do COBOL.”

Sorria.

Tome um gole de café.

Olhe para o horizonte como Nathan Drake olhando para mais uma cidade perdida.

E pergunte:

“Ótimo. Agora me mostre os CALLs dinâmicos, os overrides de JCL, as tabelas de controle, o histórico do scheduler, os consumidores dos arquivos, os packages Db2, o runtime e aquilo que ainda não sabemos.”

Se a sala ficar silenciosa...

parabéns.

Você acabou de encontrar a entrada da próxima ruína.

☕

E, lá no fundo do CPD, provavelmente existe uma placa antiga dizendo:

SIC PARVIS MAGNA

Grandeza a partir de pequenos começos.

Ou, em português de mainframe:

Não tente mapear o planeta inteiro antes de descobrir quem está alterando o DDNAME do STEP030.

Alan Turing Entra na Sala de Mudanças — O Dia em que o Agile Descobriu que um Programa COBOL Não Chega Sozinho à Produção

 

Bellacosa Mainframe e as metodologias Ageis para um coboleiro

☕ Um Café no Bellacosa Mainframe

Alan Turing Entra na Sala de Mudanças — O Dia em que o Agile Descobriu que um Programa COBOL Não Chega Sozinho à Produção

Ou: por que uma sprint não termina quando o compilador sorri, o que RACF, Db2, JCL, UX e Operação estão fazendo na mesma história e como não transformar Agile em Waterfall de post-it

 

Imagine Alan Turing entrando numa sala de projeto em 2026. Há um quadro com colunas coloridas: To do, Doing, Done. Alguém aponta para um cartão e anuncia, muito satisfeito: “acabou; o COBOL compilou”. Turing olha para o cartão, para o café frio ao lado do terminal e faz a pergunta que estraga metade das celebrações corporativas:

“Acabou para quem?”

O programa compilou. Ótimo. Mas o pacote Db2 foi validado? O acesso RACF existe e obedece ao menor privilégio? O job está no scheduler correto? A operação sabe interpretar um RC=8? A massa de testes representa o volume de fim de mês? A interface explica ao cliente que o processamento é assíncrono? Existe um plano de retorno se a alteração abrir um buraco no universo — ou, pior, na conciliação financeira?

Para o programador COBOL iniciante, esta é uma descoberta importante: em um projeto mainframe, você não entrega apenas um programa. Você entrega uma mudança dentro de um ecossistema que processa dados valiosos, conversa com muitas plataformas e, em vários casos, não pode errar por cinco minutos sem alguém perceber no extrato, no caixa, na folha ou no jornal.

Este artigo é um mapa para entender a diferença entre Agile e Waterfall, o papel dos dados e da IA, e por que o mainframe exige uma forma mais adulta de agilidade: rápida para aprender, rigorosa para produzir.



1. Agile não é correria; Waterfall não é vilão

O modelo Waterfall — a famosa cascata — costuma organizar o projeto em grandes etapas sequenciais:

Requisitos → análise → desenho → desenvolvimento → testes → implantação.

Ele faz sentido quando o problema é estável e bem conhecido. Uma adequação regulatória com regras fechadas, uma troca controlada de infraestrutura ou uma alteração obrigatória de layout podem exigir muito planejamento antes de escrever a primeira linha. Em sistemas críticos, isso não é burocracia por esporte; é controle de risco.

O defeito aparece quando tratamos algo incerto como se estivesse completamente decidido. O time passa meses documentando, desenvolve por meses adicionais e só no fim descobre que o cliente não entendia o fluxo, que uma integração não suporta a carga ou que a regra de negócio tinha uma exceção escondida num e-mail de 2017.

O Agile trabalha diferente. Ele divide a jornada em partes pequenas: construir, testar, mostrar, aprender e ajustar. Não é ausência de planejamento. É planejamento em fatias, com aprendizado antecipado.

PerguntaWaterfallAgile maduro
Quando aprendemos se a solução serve?Mais perto do fimEm entregas curtas
O requisito pode mudar?Tende a virar exceção formalPode ser repriorizado com evidência
Como o risco aparece?Às vezes tardeDeve surgir em cada ciclo
O que significa progresso?Fase concluídaValor entregue, testado e operável

Nem todo projeto precisa ser 100% de um modelo. No mainframe, o mais comum e sensato é um híbrido: Agile para construir e validar valor; controles mais sequenciais para governança, auditoria, segurança, janela de mudança e produção.

O problema não é usar Waterfall. O problema é fingir que ele continua funcionando quando o negócio ainda está descobrindo o que quer. E o problema do Agile não é ter ritos; é fingir que uma daily de quinze minutos resolve uma dependência que atravessa cinco departamentos.



2. Quando os dados entram: a agilidade deixa de ser opinião

O infográfico que motivou nossa conversa diz que o futuro do Agile será orientado por dados e IA. A frase é boa, desde que não seja traduzida como “compremos uma plataforma e ela decidirá por nós”.

Dados úteis respondem perguntas simples e duras:

  • Quanto tempo uma mudança leva desde o pedido até a produção?

  • Em qual fila o trabalho fica parado?

  • Quantos defeitos escapam para produção?

  • O cliente usa a funcionalidade entregue?

  • O batch ainda cabe na janela?

  • A nova consulta Db2 aumentou CPU ou I/O?

  • Qual permissão RACF foi solicitada, por quem, para quê e até quando?

No Kanban, por exemplo, lead time mede a espera do solicitante; cycle time, o tempo de trabalho ativo; throughput, quantos itens foram concluídos; e WIP (work in progress), quantos itens estão abertos ao mesmo tempo. Se há trinta histórias abertas e três concluídas por semana, o quadro não está “agitado”: está congestionado.

Em Scrum, a velocidade pode ajudar o próprio time a planejar. Mas cuidado: story point não é hora, salário, inteligência nem medalha. Comparar a velocidade de duas equipes é como comparar o número de páginas de dois livros para decidir qual é melhor. A métrica serve para observar tendência local, não para fabricar ranking e medo.

IA pode resumir incidentes, classificar chamados, sugerir testes, localizar padrões em logs e apontar que uma fila está crescendo. Ela é um ótimo Dr. Watson de silício: organiza pistas. Mas não substitui Sherlock, muito menos o dono da regra de negócio. Um modelo pode prever atraso; não sabe, sozinho, que a causa real é a única DBA estar em férias ou que a regra depende de um contrato assinado há vinte anos.



3. XP, Scrum, Kanban e os parentes menos convidados para o café

As metodologias citadas no infográfico não são feitiços concorrentes. Cada uma ilumina uma parte do problema.

Extreme Programming (XP) reforça engenharia: TDD, integração contínua, programação em pares, pequenas mudanças e refatoração. Para COBOL, isso significa abandonar a ideia de que teste é apenas executar um job e olhar se “não deu abend”. Teste unitário, dados conhecidos, validação de regras e regressão tornam uma mudança mais segura. Se alterou juros, decimal, data, sinal ou arredondamento, tenha casos que provem o comportamento antes e depois.

Scrum organiza trabalho em sprints: backlog priorizado, planejamento, revisão e retrospectiva. É útil quando há produto evoluindo e necessidade de alinhamento frequente. Mas uma história Scrum não pode ser “codificar o programa X” se a produção depende também de autorização, bind, operação e homologação. Isso é só uma tarefa de desenvolvimento disfarçada de entrega.

Kanban é excelente para sustentação e fluxo contínuo: incidentes, pequenas manutenções, pedidos de acesso e correções. Ele mostra onde o serviço enrosca. Se todo cartão fica parado em “aguardando validação”, não adianta cobrar mais velocidade de quem codifica; é necessário corrigir o gargalo.

Feature-Driven Development (FDD) puxa a conversa para funcionalidades de negócio: “consultar saldo”, “calcular limite”, “emitir boleto”. Isso protege o time de entregar componentes tecnicamente elegantes que não resolvem nada importante. Dados de uso e feedback ajudam a priorizar, mas não eliminam criticidade: um processo usado uma vez por mês pode ser vital para uma obrigação legal.

APF, ASD, DSDM e XPM lembram que há projetos onde a incerteza é parte do trabalho. Eles valorizam adaptação, protótipos, colaboração e aprendizado. Em modernização, isso é ouro: primeiro confirme se a API atende, se a tela faz sentido e se o legado suporta a carga; depois escale. Um protótipo bonito não prova que há segurança, transação, recuperação ou capacidade de produção.

4. A história que atravessa o mainframe

Uma funcionalidade bancária aparentemente modesta — “permitir consultar uma fatura no aplicativo” — pode envolver Business Analyst, UX/UI, desenvolvedor, DBA, RACF, qualidade, gerente de sistemas e operações.

O Business Analyst traduz objetivo em regra. Não basta escrever “mostrar fatura”; é preciso dizer quais clientes podem consultar, quais períodos, o que acontece para fatura fechada, renegociada, indisponível ou protegida por sigilo.

O UX/UI desenha a jornada. Mas precisa saber se a resposta é imediata, se depende de batch, se há limites de consulta e qual mensagem humana será exibida quando um serviço estiver indisponível. A tela não pode prometer “pronto agora” quando o processo real conclui à noite.

O System Developer implementa lógica, integrações, programas COBOL, copybooks, APIs, CICS, MQ, JCL ou o que a arquitetura pedir. Seu trabalho inclui analisar impacto: quem chama este programa? Qual layout será alterado? Um campo novo quebra um consumidor antigo? Há tratamento para valor nulo, arquivo ausente e retorno inesperado?

O DBA olha além do resultado correto. A consulta funciona com cem registros? E com cinquenta milhões? Ela usa índice? Há risco de lock, timeout, deadlock, aumento de CPU ou alteração de plano de acesso após o BIND? Uma query que “funciona na homologação” pode virar o monstro da janela noturna em produção.

O especialista de RACF e segurança desenha identidade e autorização. Quem acessa? Pessoa, aplicação, job batch ou ID de serviço? Qual dataset, transação CICS, recurso Db2 ou certificado é necessário? A regra é menor privilégio, segregação de funções e prazo claro para acessos temporários. RACF não é uma cancela colocada no fim da estrada; é parte da arquitetura.

Qualidade cria cenários positivos, negativos, integrados e de volume. “O caminho feliz funcionou” é apenas o primeiro capítulo. E se o arquivo chegar vazio? E se houver caractere inválido e surgir um S0C7? E se o job receber RC=8? E se a atualização parcial precisar de rollback?

System Manager avalia plataforma, versões, capacidade, configuração e impacto de mudança. Operações prepara execução, agendamento, monitoração e resposta ao incidente. Se a equipe operacional precisa telefonar ao desenvolvedor para descobrir o que significa um erro, a mudança chegou sem manual de sobrevivência.

5. O cadáver na sprint: “pronto” para desenvolvimento, incompleto para produção

Eis o defeito mais comum: cada área usa uma definição privada de pronto.

Para Desenvolvimento, pronto é código compilado. Para Qualidade, teste executado. Para Segurança, perfil aprovado. Para Operações, job agendado e monitorado. Para o negócio, pronto é cliente receber o resultado correto. Todas as definições são legítimas — mas isoladas formam um Frankenstein organizacional.

Uma Definition of Done comum deve estabelecer, proporcionalmente ao risco, que a mudança possui:

  • regra e critérios de aceite validados;

  • código revisado, versionado, compilado e testado;

  • análise de impacto em copybooks, programas, arquivos, APIs e consumidores;

  • revisão Db2, EXPLAIN e BIND quando aplicável;

  • permissões RACF e segregação de funções definidas;

  • testes integrados, negativos e de regressão;

  • JCL, PROC, GDG, dataset, parâmetros e scheduler revisados;

  • plano de implantação e backout;

  • monitoração, logs, códigos de retorno e runbook operacional;

  • evidência de homologação e validação pós-produção.

Isso não obriga uma correção de rótulo de tela a passar pelo mesmo rito de uma alteração de saldo. O segredo é uma matriz de impacto. Marque, no refinamento: toca Db2? RACF? CICS? MQ? VSAM? JCL? dados pessoais? scheduler? interface externa? auditoria? Quanto maior o impacto, maior a necessidade de envolvimento antecipado.

6. Passo a passo: como levar uma história até produção sem ritual de pânico

1. Comece pelo valor e pelas exceções. O BA e o dono do negócio descrevem o que muda e como medir sucesso. “Reduzir ligações sobre segunda via” é melhor que “criar tela de segunda via”. Acrescente cenários de erro e regras de borda.

2. Faça análise de impacto antes de prometer a data. Desenvolvimento identifica módulos, layouts, chamadas, tabelas, jobs e interfaces. Segurança, DBA e operação entram cedo somente quando houver impacto real. Não coloque vinte pessoas na daily; coloque as pessoas certas no refinamento certo.

3. Divida verticalmente. Em vez de uma sprint para tela, outra para API e outra para COBOL, entregue uma pequena jornada completa. Talvez apenas consulta de uma fatura recente, com autorização, rastreabilidade e erro bem tratado. A fatia prova valor e reduz a hipótese.

4. Automatize o repetível. Build, testes, análise estática, promoção de artefatos e registro de evidências não deveriam depender de e-mails e memória humana. Em ambiente z/OS, ferramentas e pipelines modernos ajudam, mas automação só presta se respeitar os controles da organização.

5. Teste como se a produção fosse real. Use massa protegida e representativa. Teste volume, falha de integração, retorno inesperado, recuperação e janela batch. O objetivo não é provar que o sistema funciona em condições ideais; é descobrir como ele falha e se recupera.

6. Entregue para operação antes da operação precisar socorrer você. O runbook deve informar o que mudou, jobs e transações afetados, entradas e saídas, RCs esperados, alertas, validação pós-implantação e retorno. É conhecimento operacional, não papelada decorativa.

7. Observe e aprenda. Após produção, acompanhe uso, tempo de resposta, erro, custo e chamados. Se o recurso foi entregue e ninguém o usa, a equipe produziu software; ainda não produziu valor.

7. Easter egg de Turing: a máquina não entende intenção

Turing nos deixou uma lição que vale para COBOL e para IA: máquinas executam regras e padrões; intenção humana precisa ser expressa, validada e verificada.

Um compilador não sabe que um campo deveria ter duas casas decimais. Ele só sabe o que foi codificado. Um modelo de IA não sabe que uma permissão concedida por conveniência viola segregação de funções. Ele só encontra padrões nos dados que recebeu. Um dashboard não sabe que um item parado há dez dias representa o pagamento de pensão de milhares de pessoas.

Portanto, use IA como copiloto: para sugerir cenários de teste, resumir tickets, encontrar padrões em logs e apontar anomalias. Não a use como autorização para abandonar revisão humana, testes, controles de acesso ou responsabilidade profissional.

Epílogo — o verdadeiro Done

O jovem programador COBOL costuma imaginar que seu programa termina no GOBACK. Em uma empresa real, ele só começa ali. A alteração atravessa banco de dados, controles de acesso, testes, operação, negócio, tela, integração, auditoria e pessoas que acordarão se algo der errado às duas da manhã.

Agile bem aplicado ao mainframe não é um ataque à governança. É a forma de trazer segurança, DBA, qualidade e operações para mais perto do momento em que a decisão ainda é barata.

Turing provavelmente olharia novamente para o cartão marcado como Done e faria a pergunta final:

“O sistema apenas executa, ou a organização consegue explicar, operar, proteger e recuperar o que acabou de mudar?”

Quando a resposta for “sim”, então o cartão pode, finalmente, atravessar a última coluna.




Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...