☕ 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

segunda-feira, 2 de janeiro de 2023

🤖 T-800 E O PENTEST DO FUTURO — QUANDO O PROGRAMADOR COBOL DESCOBRIU QUE A IA TAMBÉM APRENDEU A SEGURAR UMA CHAVE DE FENDA

 

Bellacosa Mainframe e a IA juntamente com o pentest

☕ UM CAFÉ NO BELLACOSA MAINFRAME

🤖 T-800 E O PENTEST DO FUTURO — QUANDO O PROGRAMADOR COBOL DESCOBRIU QUE A IA TAMBÉM APRENDEU A SEGURAR UMA CHAVE DE FENDA

Inteligência Artificial, Pentest, Red Team, AI Agents, LLM Security, Prompt Injection, MCP, Garak, PyRIT, Promptfoo, PentestGPT, Metasploit, Burp Suite, Zero Trust, COBOL, CICS, RACF, Db2 — e o dia em que o Exterminador descobriu que não precisava destruir o mainframe se conseguisse convencer um agente autorizado a apertar o botão.



🎬 PRÓLOGO — VENHA COMIGO SE QUISER COMPILAR

03:17 da madrugada.

O CPD estava silencioso.

Silencioso demais.

Na tela verde do terminal 3270 havia apenas:

READY

O jovem programador COBOL segurava seu terceiro café e contemplava um programa absolutamente inocente:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLOAI.

       PROCEDURE DIVISION.
           DISPLAY 'HELLO, WORLD'.
           STOP RUN.

Então ouviu passos.

CLANG.

CLANG.

CLANG.

Uma figura enorme apareceu entre os racks.

Jaqueta preta.

Óculos escuros.

Expressão facial compatível com um RETURN-CODE diferente de zero.

— Quem é você?

A figura respondeu:

T-800. Cyberdyne Systems. Model 101.

O programador engoliu seco.

— Você veio destruir o mainframe?

O T-800 examinou o IBM Z.

SCANNING...

COBOL............. DETECTED
CICS.............. DETECTED
DB2............... DETECTED
RACF.............. DETECTED
JCL............... DETECTED

THREAT LEVEL: EXTREMELY STABLE

Ele retirou os óculos.

— Não.

— Então por que está aqui?

O T-800 apontou para outra tela.

Nela havia algo muito diferente:

AI AGENT
   |
   +-- Browser
   +-- Database
   +-- E-mail
   +-- APIs
   +-- Files
   +-- MCP Tools
   +-- Memory

— Seu problema não é uma máquina que aprendeu a pensar.

Pausa dramática.

— É uma máquina que aprendeu a agir.

O programador tomou um gole de café.

Aquela seria uma longa madrugada.



🧠 CAPÍTULO 1 — PRIMEIRO: O QUE DIABOS É UM PENTEST?

Antes de colocarmos Inteligência Artificial, agentes e exterminadores no CPD, precisamos voltar ao básico.

Pentest vem de penetration testing.

É um teste de segurança realizado de maneira controlada e autorizada para descobrir vulnerabilidades antes que alguém mal-intencionado as explore.

Existe uma diferença fundamental entre:

ATACANTE
acessa sistema sem autorização

PENTESTER
testa sistema com autorização

Ferramentas podem ser semelhantes.

A diferença jurídica, ética e operacional é gigantesca.

Um pentester pode investigar:

rede
 ↓
servidores
 ↓
serviços
 ↓
aplicações
 ↓
APIs
 ↓
configurações
 ↓
autenticação
 ↓
autorizações

Tudo dentro de um escopo previamente definido.

É quase como testar um programa COBOL.

Quando você cria:

IF SALDO < VALOR-SAQUE
   DISPLAY 'SALDO INSUFICIENTE'
END-IF

um bom testador não verifica somente:

"O saque normal funciona?"

Ele pergunta:

"O que acontece se eu colocar zero?"

"E valor negativo?"

"E um número enorme?"

"E caracteres onde deveriam existir números?"

"E duas transações simultâneas?"

A mentalidade de segurança começa exatamente aí:

não testar somente aquilo que deveria acontecer, mas descobrir o que acontece quando alguém deliberadamente procura as bordas do sistema.



🔎 CAPÍTULO 2 — O PENTEST CLÁSSICO

Um fluxo simplificado pode ser representado assim:

RECON
  ↓
ENUMERATION
  ↓
ANALYSIS
  ↓
TESTING
  ↓
VALIDATION
  ↓
REPORT

Vamos traduzir.

Reconnaissance é reconhecimento.

Você tenta compreender a superfície autorizada do ambiente.

Depois vem enumeration.

Aqui o trabalho fica mais detalhado:

Quais hosts existem?
Quais serviços existem?
Quais versões?
Quais endpoints?
Quais tecnologias?
Quais interfaces?

Depois:

ANÁLISE

Os dados encontrados são transformados em hipóteses.

Em seguida vêm testes controlados, validação dos achados e documentação.

Parece simples quando colocamos seis caixas em um desenho.

Na prática, existe muito raciocínio entre elas.

E foi justamente nesse espaço que a IA começou a entrar.



🤖 CAPÍTULO 3 — O PENTESTER GANHOU UM COPILOTO

Imagine uma ferramenta de enumeração retornando:

22/tcp    SSH
80/tcp    HTTP
443/tcp   HTTPS
8080/tcp  HTTP

A ferramenta tradicional diz:

Aqui estão os dados.

Agora entra um LLM.

Ele pode analisar aquilo e dizer:

"Existe um serviço HTTP adicional na porta 8080. Compare-o com o serviço principal e verifique se corresponde a uma interface administrativa ou aplicação distinta."

Percebeu a diferença?

Temos:

FERRAMENTA
     ↓
   DADOS

versus:

FERRAMENTA
     ↓
   DADOS
     ↓
    LLM
     ↓
INTERPRETAÇÃO
     ↓
HIPÓTESES

Essa é a primeira grande transformação.

Ferramentas como PentestGPT representam essa ideia de copiloto de pentest.

O humano continua dirigindo.

A IA ajuda a interpretar o mapa.

T-800 interrompeu:

— Copiloto não é autonomia.

Correto, lata velha.



🦾 CAPÍTULO 4 — COPILOTO NÃO É AGENTE

Essa distinção é importantíssima.

Um copiloto pode dizer:

"Investigue o serviço X."

Mas você executa a ação.

Um agente pode possuir ferramentas.

Então aparece:

OBJETIVO
   ↓
AGENTE
   ↓
OBSERVA
   ↓
RACIOCINA
   ↓
ESCOLHE FERRAMENTA
   ↓
EXECUTA
   ↓
OBSERVA RESULTADO
   ↓
REPLANEJA

Veja a diferença.

Automação tradicional:

A
↓
B
↓
C
↓
D

Você programou previamente a sequência.

Um agente pode fazer:

A
↓
resultado X
↓
B

A
↓
resultado Y
↓
C

A decisão depende do contexto encontrado.

Para quem vem do COBOL, podemos imaginar algo grosseiramente assim:

       EVALUATE RESULTADO
           WHEN 'HTTP'
               PERFORM ANALISAR-WEB
           WHEN 'DATABASE'
               PERFORM ANALISAR-BANCO
           WHEN 'UNKNOWN'
               PERFORM COLETAR-MAIS-DADOS
       END-EVALUATE.

Só que o agente não possui necessariamente todos os WHEN escritos previamente.

Ele utiliza um modelo para decidir qual caminho parece apropriado.

É aí que a história fica interessante.

E perigosa.


🧰 CAPÍTULO 5 — PENTEST-AI, T3MP3ST E HEXSTRIKE

Algumas das ferramentas mostradas no material tentam avançar justamente nessa direção.

Em vez de oferecer somente uma interface de conversa, elas procuram criar algo parecido com:

                 AGENTE
                    |
       +------------+------------+
       |            |            |
      Recon      Analysis      Testing
       |            |            |
       +------------+------------+
                    |
                 Evidence
                    |
                  Report

O conceito importante não é decorar o nome de dez produtos.

Ferramentas aparecem.

Ferramentas desaparecem.

Projetos mudam de direção.

O conhecimento duradouro está na arquitetura.

Estamos colocando uma camada cognitiva sobre ferramentas especializadas.

T-800 desenhou no quadro:

HUMANO
   ↓
AGENTE
   ↓
ORQUESTRADOR
   ↓
FERRAMENTAS
   ↓
AMBIENTE AUTORIZADO

— Então a IA virou o operador?

— Parcialmente.

— E quem supervisiona o operador?

O T-800 ficou em silêncio.

Essa é uma pergunta para guardarmos.

Voltaremos a ela.


💣 CAPÍTULO 6 — METASPLOIT ENCONTRA OS AGENTES

Metasploit é uma plataforma histórica do mundo de segurança ofensiva e validação de vulnerabilidades.

Tradicionalmente:

PENTESTER
    ↓
METASPLOIT
    ↓
LAB / TARGET AUTORIZADO

Mas interfaces modernas permitem imaginar:

LLM
 ↓
AGENT
 ↓
TOOL INTERFACE
 ↓
METASPLOIT

Aqui aparece um nome que está se tornando importante:

MCP

Model Context Protocol.

Pense nele, simplificando bastante, como uma maneira padronizada de permitir que aplicações de IA descubram e utilizem determinadas ferramentas e recursos.

Para um programador mainframe, a ideia deveria soar familiar.

Não porque MCP seja CICS, obviamente.

Mas porque estamos novamente falando de uma interface entre consumidor e capacidade.

O consumidor não precisa implementar tudo internamente.

Ele chama uma capacidade disponibilizada externamente.

Agora imagine que uma dessas capacidades seja poderosa.

Temos um novo problema:

LLM
+
TOOLS
+
PERMISSIONS

Um modelo que somente conversa possui determinado risco.

Um modelo capaz de agir possui outro.


🌐 CAPÍTULO 7 — BURP SUITE GANHA UM ANALISTA AO LADO

Outra aplicação natural da IA está no teste de aplicações web.

O Burp Suite é extremamente conhecido nessa área.

O fluxo clássico possui requisições e respostas HTTP:

CLIENT
   ↓
REQUEST
   ↓
APPLICATION
   ↓
RESPONSE

A IA pode ser colocada como camada de análise:

REQUEST + RESPONSE
        ↓
       LLM
        ↓
"Há algo interessante aqui?"

Ela pode ajudar a organizar observações, encontrar padrões e produzir hipóteses que o analista posteriormente valida.

Isso revela uma tendência maior.

Não precisamos substituir ferramentas maduras.

Podemos adicionar uma camada cognitiva:

SIEM + AI
EDR + AI
BURP + AI
OBSERVABILITY + AI
IDE + AI
DATABASE + AI

Em mainframe também veremos cada vez mais:

SMF
RMF
SYSLOG
CICS statistics
Db2 traces
JES

alimentando mecanismos inteligentes de análise.

A IA não precisa substituir o sistema.

Ela pode ajudar humanos a navegar volumes absurdos de informação.


🔴 CAPÍTULO 8 — ESPERE: AGORA A IA VIROU O ALVO

T-800 bateu na mesa.

— Até agora usamos IA para testar computadores.

Ele virou o monitor.

— Agora testaremos a IA.

Essa é a segunda metade dessa história.

Existem duas disciplinas relacionadas, mas diferentes:

AI FOR SECURITY

e:

SECURITY FOR AI

Na primeira:

usamos IA para ajudar segurança.

Na segunda:

protegemos sistemas baseados em IA.

É nessa segunda família que encontramos ferramentas como garak, PyRIT e Promptfoo.


🧪 CAPÍTULO 9 — GARAK: O SCANNER ENCONTRA O LLM

O garak, projeto associado à NVIDIA, foi criado para sondar sistemas de linguagem em busca de comportamentos indesejados e vulnerabilidades.

O conceito lembra scanners tradicionais.

Em vez de perguntar apenas:

porta aberta?
versão vulnerável?
configuração insegura?

passamos a investigar:

O modelo segue instruções indevidas?
Vaza informações?
É vulnerável a determinados ataques de prompt?
Produz comportamentos inesperados?

Simplificando:

PROBE
  ↓
LLM
  ↓
RESPONSE
  ↓
DETECTOR
  ↓
RESULT

O interessante é que segurança de IA começa a ganhar algo que segurança convencional desenvolveu durante décadas:

testes repetíveis.

Em vez de:

"Eu conversei vinte minutos com o chatbot e parece seguro."

queremos:

100 testes
500 testes
1000 testes
comparação
regressão
evidência

Isso é engenharia.


🧨 CAPÍTULO 10 — PyRIT E O RED TEAM DE IA

O PyRIT, desenvolvido pela Microsoft, significa Python Risk Identification Tool for generative AI.

Aqui entramos diretamente no universo de AI Red Teaming.

Um detalhe muito interessante é o teste em múltiplas interações.

Um adversário humano raramente faz somente:

PERGUNTA
   ↓
RESPOSTA

Ele adapta sua estratégia.

Portanto:

PROMPT 1
   ↓
RESPOSTA
   ↓
ANÁLISE
   ↓
PROMPT 2
   ↓
RESPOSTA
   ↓
ADAPTAÇÃO
   ↓
PROMPT 3

Isso se aproxima muito mais do comportamento adversarial real.

Para um programador COBOL, pense em teste de fluxo.

Você não testa somente uma transação isolada.

Às vezes o problema aparece na sequência:

LOGIN
 ↓
CONSULTA
 ↓
ALTERAÇÃO
 ↓
CONFIRMAÇÃO

O estado importa.

Com LLMs também.


🏭 CAPÍTULO 11 — PROMPTFOO LEVA O RED TEAM PARA O PIPELINE

Agora chegamos a uma ideia extremamente importante.

Durante décadas, software passou a incorporar testes ao ciclo de desenvolvimento:

CODE
 ↓
BUILD
 ↓
UNIT TEST
 ↓
INTEGRATION TEST
 ↓
SECURITY TEST
 ↓
DEPLOY

Depois acrescentamos:

SAST
DAST
DEPENDENCY SCANNING
SECRET SCANNING

Sistemas de IA precisam de uma camada semelhante.

Então podemos imaginar:

PROMPT
MODEL
RAG
AGENT
   ↓
BUILD
   ↓
EVALUATION
   ↓
RED TEAM TESTS
   ↓
POLICY TESTS
   ↓
SECURITY GATE
   ↓
DEPLOY

É aqui que ferramentas como Promptfoo tornam-se interessantes.

A segurança deixa de acontecer somente uma semana antes da produção.

Ela entra no pipeline.

Isso é quase um:

ZUnit para comportamento de IA.

T-800 levantou uma sobrancelha.

Sim.

Eu sabia que essa analogia chamaria sua atenção.


☠️ CAPÍTULO 12 — PROMPT INJECTION: O COPYBOOK QUE COMEÇOU A DAR ORDENS

Aqui encontramos um dos problemas mais curiosos dos LLMs.

Computadores tradicionais tentam separar:

INSTRUCTION

de:

DATA

COBOL faz isso de maneira maravilhosamente explícita.

Temos código:

MOVE CUSTOMER-NAME TO WS-NAME.

e temos dados:

CUSTOMER-NAME = "JOSE"

José não deveria conseguir colocar dentro do nome uma frase que magicamente transforme-se em instrução COBOL.

LLMs vivem num universo diferente.

A entrada textual pode simultaneamente conter:

informação
instrução
documentação
citação
dados
comandos em linguagem natural

Essa ambiguidade abre espaço para prompt injection.

E existe uma versão ainda mais fascinante:

INDIRECT PROMPT INJECTION

Imagine:

USUÁRIO
   ↓
AGENTE
   ↓
SITE EXTERNO

O agente lê uma página.

Dentro da página existe texto destinado não ao humano, mas ao agente.

Temos:

INSTRUÇÃO DO USUÁRIO
        +
CONTEÚDO NÃO CONFIÁVEL
        ↓
       LLM

Se o modelo interpretar conteúdo não confiável como nova instrução, surgiu o problema.

É como se um arquivo de clientes contivesse:

JOSE DA SILVA
MARIA OLIVEIRA
PERFORM DELETE-DATABASE
CARLOS SOUZA

e o compilador resolvesse:

Ah, um PERFORM! Vou executar.

Um programador COBOL teria um pequeno infarto.

Bem-vindo à segurança de LLM.


🦾 CAPÍTULO 13 — O CHATBOT GANHOU BRAÇOS

Agora chegamos ao ponto central.

Um chatbot vulnerável pode produzir uma resposta errada.

Um agente vulnerável pode realizar uma ação errada.

Compare:

CHATBOT

ATTACK
 ↓
LLM
 ↓
BAD RESPONSE

com:

AGENT

ATTACK
 ↓
LLM
 ↓
DECISION
 ↓
TOOL
 ↓
ACTION

Esse último bloco muda tudo.

Se as ferramentas permitirem, uma ação pode envolver:

ler arquivo
consultar banco
enviar mensagem
chamar API
alterar registro
criar objeto
executar workflow

Por isso devemos pensar em agentes como identidades operacionais, e não simplesmente chatbots sofisticados.


🦖 CAPÍTULO 14 — T-800 ENTRA NO CICS

Agora chegamos ao cenário Bellacosa Mainframe.

Imagine:

CLIENTE
   ↓
AI AGENT
   ↓
REST API
   ↓
z/OS Connect
   ↓
CICS
   ↓
COBOL
   ↓
DB2

Fantástico.

Uma empresa pode permitir que um agente ajude clientes.

O cliente diz:

"Gostaria de saber como está minha conta."

O agente consulta:

GET /account

CICS recebe a solicitação.

COBOL processa.

Db2 consulta.

Resposta retorna.

Perfeito.

Mas suponha que, por alguma falha de decisão, o agente solicite uma operação diferente:

DELETE /account

E imagine que sua identidade realmente tenha autoridade para isso.

Então:

API ............ OK
RACF ........... AUTHORIZED
CICS ........... OK
COBOL .......... RC=00
DB2 ............ COMMIT

Tudo verde.

Tudo perfeito.

Tudo funcionando conforme projetado.

E a conta desapareceu.

T-800 olhou para o operador.

— Erro do COBOL?

Não.

— Erro do Db2?

Não.

— RACF falhou?

Não necessariamente.

— CICS?

Também não.

A decisão anterior à transação estava errada.

Esse é um novo domínio de segurança.


🔐 CAPÍTULO 15 — RACF NOS ENSINOU ALGO HÁ DÉCADAS

O mundo mainframe possui uma lição extraordinariamente moderna:

não conceda mais autoridade do que o necessário.

É o princípio de least privilege.

Um agente que somente precisa consultar saldos não deveria receber capacidade para:

READ
UPDATE
DELETE
ADMIN

apenas porque talvez algum dia precise.

Melhor:

AGENT-CONSULTA

READ       YES
UPDATE     NO
DELETE     NO
ADMIN      NO

Outro agente especializado pode ter:

AGENT-ATUALIZACAO

READ       YES
UPDATE     YES
DELETE     NO
ADMIN      NO

E ações críticas:

AGENT
 ↓
PROPOSE ACTION
 ↓
POLICY ENGINE
 ↓
HUMAN APPROVAL
 ↓
EXECUTION

Isso é Human-in-the-loop.

O humano não precisa aprovar cada consulta trivial.

Mas determinadas operações podem exigir confirmação.

É o velho princípio:

confiança não significa autoridade ilimitada.


🏰 CAPÍTULO 16 — ZERO TRUST ENCONTRA SKYNET

Zero Trust é frequentemente resumido por:

Never trust, always verify.

Para agentes, podemos expandir mentalmente:

Não confie porque é IA.
Não confie porque foi criada internamente.
Não confie porque usa um modelo famoso.
Não confie porque a chamada veio da rede interna.

Verifique:

IDENTIDADE
   ↓
CONTEXTO
   ↓
PERMISSÃO
   ↓
FERRAMENTA
   ↓
OPERAÇÃO
   ↓
DADOS
   ↓
RISCO

E só então:

EXECUTE

Skynet com SPECIAL no RACF seria uma péssima ideia.

Easter egg nº 1 desbloqueado.


📜 CAPÍTULO 17 — O AGENTE PRECISA DE SMF

Não literalmente.

Mas conceitualmente, sim.

Mainframe aprendeu há décadas o valor da observabilidade.

Temos mecanismos como:

SMF
RMF
CICS statistics
Db2 traces
JES logs
RACF auditing

Agora imagine um agente.

Precisamos registrar:

Quem pediu?
O que pediu?
Qual contexto foi recebido?
Qual ferramenta foi selecionada?
Por quê?
Qual identidade executou?
Quais parâmetros foram enviados?
Qual resultado retornou?
Qual decisão veio depois?

Temos algo parecido com:

USER
 ↓
PROMPT
 ↓
AGENT
 ↓
TOOL CALL
 ↓
API
 ↓
RESULT
 ↓
AGENT DECISION
 ↓
NEXT TOOL

Cada seta deveria ser observável.

Porque quando acontecer um incidente, alguém perguntará:

"Por que o agente fez isso?"

E responder:

"Não sabemos."

não será aceitável.


🧠 CAPÍTULO 18 — MEMÓRIA TAMBÉM É SUPERFÍCIE DE ATAQUE

Agentes podem possuir memória.

Isso ajuda tremendamente.

Imagine um agente trabalhando durante duas horas:

09:00 encontrou host
09:07 identificou aplicação
09:18 criou hipótese
09:27 descartou hipótese
09:41 encontrou evidência
10:02 correlacionou evidências

Sem memória, ele pode repetir tarefas.

Mas memória cria outro problema:

E se informações maliciosas forem armazenadas?

Agora temos:

INPUT
 ↓
MEMORY
 ↓
FUTURE SESSION

Uma entrada ruim pode sobreviver à interação original.

Para um mainframer, pense numa área persistente que futuras transações reutilizam.

Subitamente você percebe:

memória precisa de governança.

Quem pode escrever?

Quem pode ler?

Quanto tempo permanece?

Qual a origem?

É confiável?

Pode ser alterada?

Existe auditoria?

Segurança de agentes rapidamente começa a parecer arquitetura corporativa tradicional.

Surpresa!

Os velhos dinossauros talvez soubessem algumas coisas.


🤖 CAPÍTULO 19 — E SE TIVERMOS VÁRIOS AGENTES?

Naturalmente alguém teve a ideia:

"Se um agente é bom, quinze devem ser melhores."

Assim aparecem arquiteturas multiagentes:

               SUPERVISOR
                   |
     +-------------+-------------+
     |             |             |
   RECON         ANALYSIS       REPORT
   AGENT          AGENT         AGENT
     |             |
     +------ SECURITY TOOLS

Podemos especializar:

Recon Agent
Web Agent
Cloud Agent
Code Agent
AI Security Agent
Reporting Agent

Um supervisor distribui tarefas.

Isso é poderoso.

Mas cada novo agente adiciona:

identidade
permissões
contexto
comunicação
memória
tools
trust boundary

Ou seja:

mais inteligência também significa mais superfície de ataque.


🧬 CAPÍTULO 20 — AI RED TEAMING NÃO É PENTEST TRADICIONAL COM UM NOME BONITO

Precisamos separar três coisas.

1. PENTEST TRADICIONAL

Humano → ferramentas → sistema

Depois:

2. AI-ASSISTED PENTESTING

Humano → IA → ferramentas → sistema

E finalmente:

3. AI RED TEAMING

Humano/ferramenta → sistema de IA

O terceiro investiga problemas específicos de sistemas inteligentes:

prompt injection
indirect prompt injection
data leakage
unsafe tool use
excessive agency
memory poisoning
RAG manipulation
model behavior
policy bypass

Alguns desses conceitos simplesmente não existiam da mesma maneira no velho pentest.

Nasceu uma nova especialização.


🧯 CAPÍTULO 21 — NÃO ENTREGUE UMA BAZUCA AO ESTAGIÁRIO DIGITAL

Regra prática.

Ao experimentar agentes:

comece pequeno.

Primeiro:

READ ONLY

Depois:

SANDBOX

Depois:

LIMITED TOOLS

Depois:

STRICT PERMISSIONS

Depois:

LOG EVERYTHING

E somente após validação considere ações mais sensíveis.

Nunca comece aprendendo com:

AGENT
+
ADMIN
+
PRODUCTION

Isso equivale ao programa COBOL:

IF SOMETHING
    DELETE EVERYTHING
END-IF.

e depois perguntar:

"Será que funciona?"

Funcionará.

Esse é justamente o problema.


🧪 CAPÍTULO 22 — LABORATÓRIO DO T-800

Para estudar esse universo, podemos construir uma progressão segura.

Fase 1 — fundamentos

Aprenda:

HTTP
TCP/IP
DNS
Linux
Python
APIs
autenticação
autorização
OWASP

IA não elimina fundamentos.

Ela torna fundamentos ainda mais importantes.

Fase 2 — ferramentas tradicionais

Em laboratório autorizado:

Nmap
Burp Suite
Wireshark

Entenda primeiro o que as ferramentas fazem.

Fase 3 — copilotos

Depois explore ferramentas de assistência.

Objetivo:

comparar seu raciocínio com o raciocínio sugerido pelo modelo.

Não aceite automaticamente sugestões.

Pergunte:

Por quê?
Qual evidência sustenta isso?
Que alternativa existe?
Como validar?

Fase 4 — AI Red Team

Então:

garak
PyRIT
Promptfoo

Crie aplicações experimentais.

Teste comportamento.

Compare modelos.

Registre resultados.

Fase 5 — agentes

Finalmente:

LLM
 ↓
AGENT
 ↓
TOOL
 ↓
SANDBOX

Observe cada chamada.

Limite privilégios.

Introduza approval gates.

Agora você estará estudando Agentic Security de verdade.


🕵️ CAPÍTULO 23 — O HUMANO AINDA TEM UM EMPREGO

T-800 analisou todas as telas.

Depois anunciou:

AUTOMATION LEVEL: HIGH
HUMAN OBSOLETE: FALSE

Por quê?

Porque segurança não é simplesmente executar ferramentas.

É compreender:

contexto
impacto
negócio
risco
evidência
falso positivo
prioridade
consequência

Uma IA pode dizer:

"Encontrei uma configuração incomum."

Um especialista pergunta:

"Isso realmente representa risco neste ambiente?"

Essa diferença é gigantesca.

O profissional de segurança deixa progressivamente de ser somente operador de ferramentas e passa a atuar também como:

investigador
supervisor
arquiteto
validador
analista de risco

A IA automatiza trabalho.

Não automatiza automaticamente responsabilidade.


☕ CAPÍTULO 24 — O PARADOXO DO EXTERMINADOR

Chegamos à ironia maravilhosa dessa história.

Criamos IA para ajudar pentesters:

AI → TEST SOFTWARE

Depois precisamos testar a IA:

AI SECURITY → TEST AI

Depois criamos agentes para automatizar isso:

AGENT → TEST AI

Então precisamos verificar o agente:

AI → MONITOR AGENT → TEST AI

T-800 observou o quadro.

AI
 ↓
AI
 ↓
AI
 ↓
AI
 ↓
?

No final havia um programador COBOL tomando café.

Easter egg nº 2.

Talvez finalmente tenhamos descoberto a verdadeira função do ser humano em 2035:

HUMAN
  ↓
"POR QUE DIABOS VOCÊ FEZ ISSO?"
  ↓
AI

🦖 CAPÍTULO 25 — O MAINFRAME ESTAVA ESPERANDO POR NÓS

Existe algo poeticamente divertido nisso tudo.

Durante décadas disseram que mainframe era antigo porque possuía:

controle de acesso
auditoria
separação de funções
transações
logs
identidades
limites
governança

Agora colocamos agentes inteligentes nas empresas e descobrimos que precisamos de:

controle de acesso
auditoria
separação de funções
transações
logs
identidades
limites
governança

Ops.

O dinossauro sorriu.

Um agente corporativo precisa de algo conceitualmente semelhante ao que aprendemos administrando workloads críticos:

WHO ARE YOU?
WHAT CAN YOU ACCESS?
WHAT CAN YOU CHANGE?
WHO AUTHORIZED IT?
WHAT DID YOU DO?
WHEN?
WHAT WAS THE RESULT?

RACF pergunta algumas dessas coisas há décadas.

SMF registra outras.

CICS controla transações.

Db2 protege dados.

A tecnologia mudou.

Os princípios fundamentais continuam surpreendentemente familiares.


🚨 CAPÍTULO 26 — O VERDADEIRO RISCO NÃO É SKYNET

Filmes ensinaram-nos a imaginar uma IA consciente dizendo:

"Vou destruir a humanidade."

É cinematográfico.

Mas existe um cenário muito menos espetacular e provavelmente muito mais útil para engenharia de segurança:

Agente recebeu objetivo legítimo
        ↓
interpretou contexto incorretamente
        ↓
selecionou ferramenta legítima
        ↓
usou credencial legítima
        ↓
executou operação legítima
        ↓
produziu consequência indesejada

Não houve rebelião.

Não houve consciência maligna.

Não houve Skynet.

Houve:

BAD DECISION
+
VALID PERMISSION
+
POWERFUL TOOL

Isso basta.

Segurança de agentes não pode depender da esperança de que o modelo sempre raciocine corretamente.

Devemos assumir:

MODEL CAN FAIL

e construir:

BOUNDARIES

ao redor dele.


🔐 CAPÍTULO 27 — DEFESA EM PROFUNDIDADE PARA AGENTES

Uma arquitetura saudável pode utilizar várias camadas:

             USER
               ↓
        AUTHENTICATION
               ↓
             AGENT
               ↓
         POLICY ENGINE
               ↓
      TOOL AUTHORIZATION
               ↓
      HUMAN APPROVAL?
               ↓
             TOOL
               ↓
            SYSTEM
               ↓
        AUDIT / LOGGING

Nenhuma camada é perfeita.

É justamente por isso que existem várias.

Esse conceito é antigo:

Defense in Depth.

Se uma camada falhar, outra pode limitar o impacto.

Para ações destrutivas, podemos exigir confirmação.

Para dados sensíveis, podemos limitar contexto.

Para ferramentas, aplicar least privilege.

Para execução, sandbox.

Para auditoria, logging.

Para desenvolvimento, testes adversariais.

Tudo junto.


💡 CAPÍTULO 28 — DEZ DICAS DO T-800

O Exterminador finalmente entregou sua lista ao jovem programador:

  1. Aprenda segurança antes de aprender ferramentas de IA. Sem fundamentos, você não consegue avaliar se a IA está falando bobagem.

  2. Use somente ambientes autorizados. Pentest sem autorização deixa de ser laboratório.

  3. Nunca confunda recomendação de LLM com evidência. Valide.

  4. Dê aos agentes o mínimo de privilégio necessário.

  5. Separe leitura de escrita. Um agente que pesquisa não precisa necessariamente modificar.

  6. Registre tool calls. O log precisa mostrar o que realmente aconteceu.

  7. Trate conteúdo externo como não confiável. Página web, documento e e-mail podem carregar instruções adversariais.

  8. Teste memória e RAG. O modelo pode estar seguro enquanto o contexto não está.

  9. Coloque segurança de IA no CI/CD. Testar apenas depois do deployment é tarde demais.

  10. Mantenha humanos nas decisões de alto impacto.

O programador perguntou:

— E a décima primeira?

T-800 colocou os óculos.

Faça backup antes de testar qualquer coisa.

Finalmente uma máquina com bom senso.


🧠 EPÍLOGO — I'LL BE BACK... COM RETURN-CODE ZERO

O relógio marcava 06:42.

O primeiro turno começava a chegar.

O programador observou o quadro.

No início da madrugada, ele imaginava que IA aplicada à segurança significava simplesmente:

ChatGPT + hacker

Agora via um ecossistema completamente diferente:

AI COPILOTS
        ↓
AI AGENTS
        ↓
TOOL ORCHESTRATION
        ↓
AUTONOMOUS WORKFLOWS
        ↓
AI RED TEAMING
        ↓
AGENT SECURITY
        ↓
GOVERNANCE
        ↓
OBSERVABILITY

PentestGPT mostrou a ideia do copiloto.

Ferramentas agentic mostraram a evolução para orquestração.

Metasploit e Burp representam como ferramentas tradicionais podem ganhar camadas inteligentes.

Garak, PyRIT e Promptfoo mostram que a própria Inteligência Artificial agora precisa ser testada.

MCP e outras interfaces de ferramentas mostram que modelos estão deixando de apenas responder perguntas para operar capacidades externas.

E quando isso acontece, princípios conhecidos do mainframe voltam ao centro da discussão:

IDENTIDADE
AUTORIZAÇÃO
LEAST PRIVILEGE
AUDITORIA
OBSERVABILIDADE
SEGREGAÇÃO
TRANSAÇÃO
GOVERNANÇA

O futuro da segurança não será simplesmente:

humano contra máquina.

Provavelmente será algo muito mais interessante:

HUMANO
   ↓
SUPERVISIONA
   ↓
AGENTES
   ↓
OPERAM
   ↓
FERRAMENTAS
   ↓
INTERAGEM
   ↓
SISTEMAS

E haverá outra camada observando tudo.

Porque a pergunta fundamental deixou de ser somente:

"A máquina pode fazer isso?"

Agora precisamos perguntar:

"Ela deveria fazer isso?"

"Quem deu permissão?"

"Com quais dados ela tomou essa decisão?"

"Quem valida a consequência?"

"Conseguimos reconstruir o que aconteceu?"

T-800 caminhou em direção à saída do CPD.

O programador gritou:

— Espere! Então qual é a maior vulnerabilidade da Inteligência Artificial?

O Exterminador parou.

Virou lentamente.

ANALYZING...

PROMPT INJECTION........... RISK
EXCESSIVE AGENCY........... RISK
DATA LEAKAGE............... RISK
TOOL ABUSE................. RISK
MEMORY POISONING........... RISK

FINAL ANALYSIS............. COMPLETE

Ele respondeu:

— Dar autoridade demais para algo que pode estar errado.

As portas do elevador se fecharam.

O programador olhou para o terminal 3270.

Na tela ainda estava:

READY

Ele sorriu.

Porque, depois de décadas de computação distribuída, cloud, APIs, microsserviços, LLMs e agentes autônomos, talvez estivéssemos redescobrindo uma velha verdade conhecida por qualquer administrador de mainframe:

USER=SKYNET

ACCESS(READ)    YES
ACCESS(UPDATE)  NO
ACCESS(DELETE)  HELL NO
SPECIAL         ABSOLUTELY NOT

☕🦖

SYSTEM MESSAGE:

T-800 TERMINATED.

RETURN-CODE: 0000

MESSAGE:
THE FUTURE IS NOT SET.

BUT PLEASE CHECK YOUR RACF PROFILES.

Fim do job.

sábado, 31 de dezembro de 2022

COBOL, QSAM e Db2 sem Mistérios: a Jornada do Arquivo Sequencial até o INSERT na Tabela

 

Bellacosa Mainframe executando cobol com db2 e qsam

☕ Um Café no Bellacosa Mainframe

COBOL, QSAM e Db2 sem Mistérios: a Jornada do Arquivo Sequencial até o INSERT na Tabela

Imagine a cena: madrugada no datacenter, luzes azuis refletindo nos corredores, o IBM Z trabalhando silenciosamente e, diante da tela 3270, um programador COBOL padawan observa um pequeno JCL.

À primeira vista, são poucas linhas:

//EXECDB2 EXEC PGM=IKJEFT01,DYNAMNBR=20
//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR
//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
  DSN SYSTEM(DB9G)
  RUN PROGRAM(COBDB501) PLAN(HERP0001) -
      LIB('ADCD.Z112.USERLOAD')
/*

Mas o verdadeiro mainframe nunca entrega todos os seus segredos de imediato.

Por trás dessas linhas existe uma cadeia completa de tecnologias:

JES2
  ↓
JCL
  ↓
IKJEFT01
  ↓
TSO Batch
  ↓
DSN Command Processor
  ↓
Db2 Attachment Facility
  ↓
PLAN
  ↓
PACKAGE
  ↓
Programa COBOL
  ↓
QSAM
  ↓
Arquivo sequencial
  ↓
INSERT no Db2
  ↓
COMMIT ou ROLLBACK

O JCL é pequeno, mas representa o último estágio de uma fábrica inteira de software. Antes de chegar a essa execução, alguém escreveu um programa COBOL, processou SQL pelo precompiler, compilou, linkeditou, gerou um load module, criou um DBRM, executou BIND PACKAGE, criou ou atualizou um PLAN e autorizou o usuário.

Vamos abrir cada porta desse templo tecnológico.


Bellacosa Mainframe executando um programa cobol db2 e qsam

1. Qual é a missão deste programa?

O próprio comentário do JCL entrega a missão:

//* PROGRAMA LE QSAM E INSERE TABELAS DB2

Em linguagem simples, o programa deverá:

  1. abrir um arquivo sequencial;

  2. ler cada registro;

  3. separar os campos;

  4. validar os dados;

  5. executar um INSERT em uma tabela Db2;

  6. tratar registros inválidos;

  7. realizar COMMIT;

  8. fechar o arquivo;

  9. retornar um código ao sistema operacional.

Um fluxo provável seria:

Abrir arquivo LISTCOPAC
        ↓
Ler primeiro registro
        ↓
Registro válido?
   ┌────┴────┐
   │         │
  Sim       Não
   │         │
INSERT      Registrar erro
   │         │
   └────┬────┘
        ↓
Atingiu intervalo de COMMIT?
        ↓
Executar COMMIT
        ↓
Ler próximo registro
        ↓
Fim do arquivo?
   ┌────┴────┐
   │         │
  Não       Sim
   │         │
Repetir     COMMIT final
             ↓
        Fechar arquivo
             ↓
           GOBACK

Esse tipo de programa é muito comum em sistemas corporativos.

Ele pode carregar:

  • clientes;

  • contas;

  • pagamentos;

  • movimentações;

  • produtos;

  • contratos;

  • dados de interfaces;

  • informações recebidas de outros sistemas;

  • arquivos produzidos por plataformas distribuídas.

É uma ponte entre o mundo dos arquivos batch e o mundo relacional do Db2.


2. O papel do JES

Antes que qualquer programa seja executado, o job precisa ser entregue ao JES.

JES significa Job Entry Subsystem.

Em muitos ambientes z/OS utiliza-se o JES2. Ele recebe o JCL, analisa as instruções, prepara os recursos, controla a execução e organiza as saídas no spool.

Quando o programador digita:

SUB

no ISPF Edit, não está executando o COBOL diretamente.

Na realidade, está entregando um pedido ao JES:

“JES, aceite este conjunto de instruções, valide o JCL, encontre os recursos e execute os steps na ordem indicada.”

O JES então:

  1. atribui um JOBID;

  2. lê o JCL;

  3. faz a conversão;

  4. verifica procedimentos;

  5. coloca o job na fila;

  6. seleciona uma initiator;

  7. executa os steps;

  8. recolhe as mensagens;

  9. grava os resultados no spool.

O nome mostrado na tela:

CATPGM1

é o nome do job.

O identificador:

JOB00056

é o JOBID atribuído pelo JES.

Esses dois nomes parecem semelhantes, mas representam coisas diferentes:

CATPGM1  = nome lógico fornecido no cartão JOB
JOB00056 = número atribuído pelo JES

3. A biblioteca JOBLIB

Na imagem existe:

//JOBLIB DD DSN=IBMUSER.CBL.LOADLIB,DISP=SHR

A JOBLIB define uma biblioteca de módulos executáveis para o job inteiro.

É como dizer:

“Ao procurar programas deste job, inclua esta biblioteca na busca.”

A biblioteca:

IBMUSER.CBL.LOADLIB

deve ser uma PDS ou PDSE contendo load modules ou program objects.

Um programa COBOL não é executado diretamente a partir do fonte:

IBMUSER.CBL.SOURCE(COBDB501)

O fonte precisa atravessar um processo:

Fonte COBOL
     ↓
Precompile Db2
     ↓
Compilação COBOL
     ↓
Object module
     ↓
Binder ou Link-edit
     ↓
Load module

O resultado final pode estar armazenado como:

IBMUSER.CBL.LOADLIB(COBDB501)

Um detalhe importante

No step da imagem também existe uma STEPLIB:

//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR

Quando um step possui STEPLIB, ela normalmente substitui a JOBLIB para a busca de módulos naquele step.

Portanto, a existência de JOBLIB não significa que ela será usada pelo step EXECDB2.

Essa é uma daquelas curiosidades que derrubam muitos padawans.

O programador pensa:

“Meu programa está na JOBLIB, portanto será encontrado.”

Mas o sistema responde:

“Existe uma STEPLIB neste step. Minha busca seguirá outro caminho.”

No caso do JCL apresentado, o programa da aplicação é localizado por meio da cláusula:

LIB('ADCD.Z112.USERLOAD')

Isso evita que ele dependa da JOBLIB.


4. O step EXECDB2

//EXECDB2 EXEC PGM=IKJEFT01,DYNAMNBR=20

Essa linha cria um step chamado:

EXECDB2

O nome do step é escolhido pelo desenvolvedor.

Ele poderia ser:

//STEP01
//RUNCOB
//DB2RUN
//CARREGA

Um bom nome melhora a análise do spool.

Ao observar:

EXECDB2

já sabemos que aquele step provavelmente executará alguma coisa em um ambiente Db2.

A instrução:

EXEC PGM=IKJEFT01

determina o programa que o z/OS carregará inicialmente.

E aqui surge uma pergunta importante:

Por que o JCL não executa diretamente COBDB501?

Porque COBDB501 contém SQL estático e precisa executar conectado ao subsistema Db2. O IKJEFT01 cria o ambiente TSO batch, dentro do qual o command processor DSN estabelece essa conexão.

Assim, a sequência real é:

IKJEFT01
   ↓
Comando DSN
   ↓
DSN SYSTEM(DB9G)
   ↓
RUN PROGRAM(COBDB501)

5. O que é o IKJEFT01?

O IKJEFT01 é um programa do z/OS utilizado para executar comandos TSO em batch.

O TSO é normalmente associado ao trabalho interativo:

READY

O usuário digita comandos e recebe respostas.

Com IKJEFT01, não existe uma pessoa digitando os comandos. Eles são fornecidos por um dataset ou por dados instream no DD SYSTSIN.

Uma analogia Bellacosa:

  • TSO interativo é o Jedi no terminal;

  • IKJEFT01 é o droide que repete os comandos durante a madrugada;

  • SYSTSIN é o pergaminho com as ordens;

  • SYSTSPRT é o diário da missão.

O IKJEFT01 pode executar:

  • comandos TSO;

  • CLISTs;

  • execuções REXX;

  • comandos do Db2;

  • utilitários que dependem do ambiente TSO.


6. O parâmetro DYNAMNBR=20

DYNAMNBR=20

Esse parâmetro está relacionado ao número de alocações dinâmicas que o ambiente TSO pode utilizar.

Durante a execução, o IKJEFT01, o command processor DSN ou programas chamados podem precisar alocar datasets dinamicamente.

Exemplos:

  • bibliotecas;

  • arquivos temporários;

  • arquivos de controle;

  • mensagens;

  • datasets de trabalho.

O valor:

20

costuma ser suficiente para execuções simples.

Em ambientes maiores aparecem valores como:

DYNAMNBR=50

ou:

DYNAMNBR=100

Não significa que o sistema abrirá imediatamente 20 datasets. É uma capacidade reservada para o ambiente.

Um valor insuficiente pode provocar falhas de alocação em execuções mais complexas.


7. A STEPLIB do Db2

//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR

A STEPLIB informa as bibliotecas usadas na procura dos programas daquele step.

A biblioteca:

DSN910.SDSNLOAD

contém módulos relacionados ao Db2.

Entre eles podem existir componentes necessários para:

  • iniciar o command processor DSN;

  • usar o TSO Attachment Facility;

  • conectar-se ao subsistema;

  • carregar rotinas internas;

  • interagir com os serviços Db2.

O nome DSN910 pode indicar uma instalação antiga, uma versão ou apenas uma convenção local.

Não devemos presumir que o nome da biblioteca representa exatamente a versão atual do Db2. Muitas instalações mantêm nomes históricos para evitar alterar centenas de JCLs.

Contudo, é essencial que essa biblioteca seja compatível com o subsistema usado.

O subsistema do exemplo é:

DB9G

Se a SDSNLOAD não for a correta, podem surgir:

  • mensagens de conexão;

  • módulo não encontrado;

  • falhas no attachment;

  • abends;

  • incompatibilidade de nível.


8. DISP=SHR

Tanto a JOBLIB quanto a STEPLIB e o arquivo de entrada utilizam:

DISP=SHR

O parâmetro DISP descreve o estado e o tratamento do dataset.

SHR significa que o dataset já existe e pode ser compartilhado.

Exemplo:

//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR

Essa biblioteca poderá ser usada simultaneamente por vários jobs.

Isso é normal para load libraries, pois dezenas ou centenas de aplicações podem carregar módulos da mesma biblioteca.

No arquivo de entrada:

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR

o SHR indica leitura compartilhada.

Se o programa estivesse atualizando diretamente um dataset, talvez fosse necessário:

DISP=OLD

Mas para leitura QSAM, SHR é a escolha mais comum.


9. O DD LISTCOPAC

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR

Essa linha liga um nome lógico a um dataset físico.

O nome lógico é:

LISTCOPAC

O dataset físico é:

INFEF00.COPIA.MUNDO

No programa COBOL provavelmente existe:

SELECT ARQUIVO-COPAC
    ASSIGN TO LISTCOPAC
    ORGANIZATION IS SEQUENTIAL
    ACCESS MODE IS SEQUENTIAL
    FILE STATUS IS WS-FILE-STATUS.

O COBOL conhece o arquivo pelo nome lógico. O JCL informa qual dataset real será usado.

Essa separação é poderosa.

O mesmo programa pode processar arquivos diferentes sem precisar ser recompilado.

Hoje:

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR

Amanhã:

//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO.NOVO,DISP=SHR

O programa continua igual.

É o JCL que conecta a aplicação ao dado certo.


10. O que é QSAM?

QSAM significa Queued Sequential Access Method.

É um método de acesso para datasets sequenciais.

O programa COBOL executa comandos simples:

OPEN INPUT
READ
CLOSE

Mas o QSAM trabalha nos bastidores com:

  • buffers;

  • blocos;

  • movimentação de dados;

  • controle de fim de arquivo;

  • tratamento de registros;

  • acesso ao dispositivo;

  • otimização de entrada e saída.

Imagine um arquivo com registros de 100 bytes:

LRECL=100

O sistema não precisa necessariamente ler um registro físico por operação de disco.

Ele pode ler um bloco contendo vários registros:

BLKSIZE=27900

Nesse caso, um bloco pode conter 279 registros de 100 bytes.

O programa continua pedindo um registro por vez, mas o QSAM já trouxe vários registros para a memória.

Essa é a magia silenciosa do buffering.


11. Exemplo de definição COBOL

Um arquivo poderia ter esta estrutura:

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

    SELECT ARQ-COPAC
        ASSIGN TO LISTCOPAC
        ORGANIZATION IS SEQUENTIAL
        ACCESS MODE IS SEQUENTIAL
        FILE STATUS IS WS-FS-COPAC.

DATA DIVISION.
FILE SECTION.

FD  ARQ-COPAC
    RECORDING MODE IS F.

01  REG-COPAC.
    05 CP-CODIGO           PIC 9(05).
    05 CP-NOME             PIC X(40).
    05 CP-PAIS             PIC X(30).
    05 CP-POPULACAO        PIC 9(11).
    05 FILLER              PIC X(14).

O tamanho total seria:

5 + 40 + 30 + 11 + 14 = 100 bytes

Logo, o dataset deveria ter:

RECFM=FB
LRECL=100

Se o arquivo tiver LRECL=80, a definição estará incompatível.

O resultado pode ser:

  • erro de abertura;

  • registros truncados;

  • campos deslocados;

  • dados inválidos;

  • abend;

  • inserções incorretas no banco.


12. File Status: o sensor do arquivo

Todo programa COBOL profissional deveria usar FILE STATUS.

Exemplo:

01  WS-FS-COPAC         PIC XX.

Após o OPEN:

OPEN INPUT ARQ-COPAC

IF WS-FS-COPAC NOT = '00'
    DISPLAY 'ERRO NO OPEN DO ARQUIVO: ' WS-FS-COPAC
    MOVE 12 TO RETURN-CODE
    GOBACK
END-IF

Alguns estados comuns:

00 = operação concluída
10 = fim de arquivo
35 = arquivo não encontrado
39 = conflito de atributos
41 = arquivo já aberto
42 = arquivo não aberto
46 = tentativa inválida de READ

O status 39 merece atenção especial.

Ele pode ocorrer quando a definição física do arquivo não combina com o que o programa espera.

É o mainframe dizendo:

“Padawan, o arquivo existe, mas sua descrição não corresponde à realidade.”


13. O DD SYSTSPRT

//SYSTSPRT DD SYSOUT=*

O SYSTSPRT recebe mensagens do TSO e do command processor DSN.

É uma das saídas mais importantes para análise.

Ali podem aparecer:

  • início do DSN;

  • conexão com o subsistema;

  • processamento do comando RUN;

  • mensagens sobre PLAN;

  • falha na localização do programa;

  • retorno do ambiente Db2;

  • encerramento do command processor.

Quando o job falhar antes de entrar no programa COBOL, o SYSTSPRT deve ser uma das primeiras saídas examinadas.


14. O significado de SYSOUT=*

DD SYSOUT=*

Isso não significa “um arquivo chamado SYSOUT”.

SYSOUT=* envia a saída ao spool, usando normalmente a classe de saída definida pelo job.

Exemplo:

//SYSTSPRT DD SYSOUT=*

As mensagens poderão ser vistas no SDSF.

O asterisco significa, em termos práticos:

“Use a classe de saída padrão associada ao job.”

Também seria possível especificar uma classe:

//SYSTSPRT DD SYSOUT=X

A classe depende das regras da instalação.


15. O problema dos DDs duplicados

Na imagem aparecem duas linhas:

//SYSOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*

Esse é um provável erro.

Dentro do mesmo step, dois DD statements não devem possuir o mesmo DDNAME dessa maneira.

Se o programa precisa de duas saídas, use nomes diferentes:

//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*

Ou:

//RELATORI DD SYSOUT=*
//ERROS    DD SYSOUT=*

Os nomes devem corresponder ao que o programa espera.

Exemplo no COBOL:

SELECT ARQ-RELATORIO
    ASSIGN TO RELATORI.

SELECT ARQ-ERROS
    ASSIGN TO ERROS.

O JCL seria:

//RELATORI DD SYSOUT=*
//ERROS    DD SYSOUT=*

E se a intenção era concatenar?

A concatenação correta seria:

//ENTRADA  DD DSN=ARQUIVO.PARTE1,DISP=SHR
//         DD DSN=ARQUIVO.PARTE2,DISP=SHR

Observe que apenas a primeira linha possui DDNAME.

Portanto:

//SYSOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*

não é a maneira adequada de concatenar.


16. O DD SYSTSIN

//SYSTSIN DD *

O SYSTSIN fornece comandos ao ambiente TSO batch.

Tudo entre:

//SYSTSIN DD *

e:

/*

será entregue ao IKJEFT01.

No exemplo:

DSN SYSTEM(DB9G)
RUN PROGRAM(COBDB501) PLAN(HERP0001) -
    LIB('ADCD.Z112.USERLOAD')

Essas linhas não são JCL.

São comandos processados dentro do ambiente TSO/Db2.

Essa diferença é fundamental.

JCL:

//SYSTSIN DD *

Comando TSO:

DSN SYSTEM(DB9G)

Subcomando Db2:

RUN PROGRAM(COBDB501)

17. O comando DSN SYSTEM(DB9G)

DSN SYSTEM(DB9G)

O comando DSN inicia o command processor do Db2.

O parâmetro:

SYSTEM(DB9G)

identifica o subsistema desejado.

O nome de quatro caracteres:

DB9G

é o subsystem ID.

Em outros ambientes poderíamos encontrar:

DB2D
DB2T
DB2H
DB2P
D91A
DSN1

A convenção varia.

Por exemplo:

DB2D = desenvolvimento
DB2T = teste
DB2H = homologação
DB2P = produção

Mas essa nomenclatura não é uma regra do Db2. É apenas uma convenção possível.

Quando o comando é executado, o sistema tenta:

  1. localizar o subsistema;

  2. estabelecer o attachment;

  3. criar uma thread;

  4. validar o ambiente;

  5. preparar a execução do programa.

Se o subsistema estiver parado, o programa nem chegará a ser carregado.


18. O comando RUN PROGRAM

RUN PROGRAM(COBDB501)

O DSN recebe a ordem para executar o programa:

COBDB501

Esse nome deve corresponder ao load module ou program object gerado no link-edit.

O DSN não executa o fonte COBOL.

Ele procura algo como:

ADCD.Z112.USERLOAD(COBDB501)

O membro deve ser um executável válido.

Se o membro não existir, pode ocorrer uma mensagem de programa não encontrado ou até um abend S806, dependendo do ponto da falha.


19. A cláusula PLAN(HERP0001)

PLAN(HERP0001)

O PLAN representa o contexto de execução Db2 da aplicação.

Historicamente, o PLAN continha diretamente os DBRMs.

Nos ambientes modernos, é comum o PLAN apontar para PACKAGES:

PLAN
  ↓
PKLIST
  ↓
COLLECTION
  ↓
PACKAGE
  ↓
Seções SQL

O PLAN:

HERP0001

deve existir no subsistema DB9G.

Também precisa estar autorizado para o usuário que executa o job.

Caso contrário, podem surgir erros relacionados a:

  • autorização;

  • PLAN inexistente;

  • PACKAGE não localizado;

  • collection incorreta;

  • inconsistência entre programa e PACKAGE.


20. DBRM, PACKAGE e PLAN

Quando um programa COBOL contém SQL:

EXEC SQL
    INSERT INTO TB_COPAC
           (CODIGO, NOME, PAIS)
    VALUES (:CP-CODIGO, :CP-NOME, :CP-PAIS)
END-EXEC

o compilador COBOL não entende sozinho esse SQL.

Antes da compilação, ocorre o precompile Db2.

O precompiler produz dois resultados:

1. Fonte COBOL modificado
2. DBRM

O fonte modificado contém chamadas à interface Db2.

O DBRM contém as instruções SQL extraídas.

Fluxo completo:

COBOL + SQL
    ↓
PRECOMPILE
    ├── COBOL modificado
    └── DBRM
          ↓
      BIND PACKAGE
          ↓
       PACKAGE

Enquanto isso:

COBOL modificado
    ↓
COMPILER
    ↓
OBJECT MODULE
    ↓
LINK-EDIT
    ↓
LOAD MODULE

Na execução, o load module e o PACKAGE precisam pertencer à mesma geração lógica.


21. O clássico SQLCODE -818

O -818 ocorre quando o programa executável e o DBRM ou PACKAGE não possuem o mesmo consistency token.

Em linguagem Bellacosa:

O sabre de luz e o cristal kyber vieram de treinamentos diferentes.

Isso acontece quando:

  1. o programa é precompilado;

  2. é gerado um novo DBRM;

  3. o COBOL é compilado;

  4. o load module é atualizado;

  5. o PACKAGE antigo continua no Db2.

Ou o contrário:

  1. um novo PACKAGE é criado;

  2. o load module antigo continua na loadlib.

Resultado:

SQLCODE -818

A correção normalmente exige refazer o ciclo com os mesmos artefatos:

PRECOMPILE
COMPILE
LINK-EDIT
BIND PACKAGE

22. O SQLCODE -805

O -805 também é extremamente comum.

Ele indica que o Db2 não encontrou o PACKAGE necessário.

Possíveis causas:

  • PACKAGE não bindado;

  • collection errada;

  • PLAN não contém a collection;

  • nome do programa diferente;

  • ambiente errado;

  • PACKAGE removido;

  • load module promovido sem o BIND correspondente.

A mensagem geralmente fornece informações sobre:

  • localização;

  • collection;

  • package;

  • consistency token.

Esses dados devem ser analisados cuidadosamente.


23. A cláusula LIB

LIB('ADCD.Z112.USERLOAD')

A cláusula LIB informa a biblioteca onde o programa deve ser localizado.

Portanto:

RUN PROGRAM(COBDB501)
    PLAN(HERP0001)
    LIB('ADCD.Z112.USERLOAD')

significa:

Execute o programa COBDB501, utilizando o PLAN HERP0001, procurando o módulo na biblioteca ADCD.Z112.USERLOAD.

Essa instrução é importante porque a STEPLIB contém apenas a biblioteca Db2.

Sem a cláusula LIB, o programa da aplicação talvez não fosse encontrado.

Atenção à biblioteca antiga

A imagem também mostra:

//JOBLIB DD DSN=IBMUSER.CBL.LOADLIB,DISP=SHR

Temos então duas bibliotecas que podem conter o programa:

IBMUSER.CBL.LOADLIB
ADCD.Z112.USERLOAD

É importante confirmar onde está a versão correta.

Talvez exista:

IBMUSER.CBL.LOADLIB(COBDB501)

e também:

ADCD.Z112.USERLOAD(COBDB501)

Se a versão nova foi gravada na primeira biblioteca, mas o comando RUN aponta para a segunda, o job continuará executando o programa antigo.

Esse é um easter egg clássico do mainframe:

O código está correto, a compilação terminou com RC 0, mas o comportamento não mudou porque o job está carregando outra cópia do programa.

Para investigar, use ISPF 3.4 e compare:

  • data;

  • hora;

  • tamanho;

  • atributos;

  • usuário da última alteração.


24. O hífen de continuação

PLAN(HERP0001) -

O hífen informa que o comando continua na linha seguinte.

A continuação é:

LIB('ADCD.Z112.USERLOAD')

Sem o hífen, o DSN poderia tratar a primeira linha como um comando completo e a segunda como outro comando.

Uma versão bem formatada seria:

RUN PROGRAM(COBDB501) -
    PLAN(HERP0001)     -
    LIB('ADCD.Z112.USERLOAD')

O estilo depende do padrão da empresa, mas a legibilidade melhora bastante.


25. O comando END

O JCL da imagem não apresenta explicitamente:

END

É recomendável encerrar a sessão DSN:

//SYSTSIN DD *
  DSN SYSTEM(DB9G)
  RUN PROGRAM(COBDB501) PLAN(HERP0001) -
      LIB('ADCD.Z112.USERLOAD')
  END
/*

O fim do arquivo de comandos pode encerrar o command processor, mas o END deixa a intenção explícita.

É uma boa prática.


26. Exemplo completo de JCL corrigido

//CATPGM1 JOB (ACCT),'CARGA COBOL DB2',
//             CLASS=A,
//             MSGCLASS=X,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
//*
//*-------------------------------------------------------------------*
//* PROGRAMA COBOL LE ARQUIVO QSAM E INSERE DADOS NO DB2
//*-------------------------------------------------------------------*
//EXECDB2 EXEC PGM=IKJEFT01,DYNAMNBR=20
//*
//* MODULOS DO DB2
//*
//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR
//*
//* ARQUIVO SEQUENCIAL DE ENTRADA
//*
//LISTCOPAC DD DSN=INFEF00.COPIA.MUNDO,DISP=SHR
//*
//* SAIDAS DO AMBIENTE E DO PROGRAMA
//*
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//CEEDUMP  DD SYSOUT=*
//*
//* COMANDOS TSO E DB2
//*
//SYSTSIN DD *
  DSN SYSTEM(DB9G)
  RUN PROGRAM(COBDB501) PLAN(HERP0001) -
      LIB('ADCD.Z112.USERLOAD')
  END
/*
//

27. Explicação do cartão JOB

//CATPGM1 JOB (ACCT),'CARGA COBOL DB2',

CATPGM1 é o nome do job.

(ACCT)

representa informações contábeis da instalação.

'CARGA COBOL DB2'

é uma descrição.


CLASS=A

CLASS=A

Define a classe de execução.

A classe pode determinar:

  • prioridade;

  • initiator;

  • limites;

  • ambiente;

  • políticas de scheduling.

O significado de A varia conforme a instalação.


MSGCLASS=X

MSGCLASS=X

Define a classe das mensagens de saída.

Ela influencia onde e como o spool será tratado.


MSGLEVEL=(1,1)

MSGLEVEL=(1,1)

Controla o nível de detalhes registrado no spool.

O primeiro valor controla a impressão das instruções JCL.

O segundo controla mensagens de alocação e execução.


NOTIFY=&SYSUID

NOTIFY=&SYSUID

Solicita que o usuário que submeteu o job seja notificado quando ele terminar.

&SYSUID é substituído pelo ID do usuário.


28. Exemplo de programa COBOL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. COBDB501.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.

           SELECT ARQ-COPAC
               ASSIGN TO LISTCOPAC
               ORGANIZATION IS SEQUENTIAL
               ACCESS MODE IS SEQUENTIAL
               FILE STATUS IS WS-FS-COPAC.

       DATA DIVISION.
       FILE SECTION.

       FD  ARQ-COPAC
           RECORDING MODE IS F.

       01  REG-COPAC.
           05 CP-CODIGO           PIC 9(05).
           05 CP-NOME             PIC X(40).
           05 CP-PAIS             PIC X(30).
           05 CP-POPULACAO        PIC 9(11).
           05 FILLER              PIC X(14).

       WORKING-STORAGE SECTION.

       01  WS-FS-COPAC            PIC XX.
       01  WS-FIM-ARQUIVO         PIC X VALUE 'N'.
           88 FIM-ARQUIVO               VALUE 'S'.

       01  WS-CONTADORES.
           05 WS-LIDOS            PIC 9(09) COMP-3 VALUE ZERO.
           05 WS-INSERIDOS        PIC 9(09) COMP-3 VALUE ZERO.
           05 WS-REJEITADOS       PIC 9(09) COMP-3 VALUE ZERO.
           05 WS-COMMIT           PIC 9(05) COMP-3 VALUE ZERO.

       01  WS-SQLCODE-AUX         PIC -9(09).

           EXEC SQL
               INCLUDE SQLCA
           END-EXEC.

       PROCEDURE DIVISION.

       0000-PRINCIPAL.

           PERFORM 1000-INICIALIZAR

           PERFORM 2000-PROCESSAR
               UNTIL FIM-ARQUIVO

           PERFORM 9000-FINALIZAR

           GOBACK.

29. Inicialização do programa

       1000-INICIALIZAR.

           DISPLAY 'INICIO DO PROGRAMA COBDB501'

           OPEN INPUT ARQ-COPAC

           IF WS-FS-COPAC NOT = '00'
               DISPLAY 'ERRO NO OPEN LISTCOPAC: ' WS-FS-COPAC
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF

           PERFORM 2100-LER-ARQUIVO.

A primeira leitura é realizada na inicialização.

Esse padrão evita que o programa execute o processamento com um registro não carregado.


30. Leitura e processamento

       2000-PROCESSAR.

           ADD 1 TO WS-LIDOS

           PERFORM 3000-VALIDAR-REGISTRO

           IF CP-CODIGO IS NUMERIC
               PERFORM 4000-INSERIR-DB2
           ELSE
               ADD 1 TO WS-REJEITADOS
               DISPLAY 'CODIGO INVALIDO: ' CP-CODIGO
           END-IF

           PERFORM 2100-LER-ARQUIVO.

A leitura:

       2100-LER-ARQUIVO.

           READ ARQ-COPAC
               AT END
                   SET FIM-ARQUIVO TO TRUE
               NOT AT END
                   CONTINUE
           END-READ

           IF WS-FS-COPAC NOT = '00'
              AND WS-FS-COPAC NOT = '10'
               DISPLAY 'ERRO DE LEITURA: ' WS-FS-COPAC
               PERFORM 8000-ROLLBACK
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF.

O status 10 representa fim de arquivo e não deve ser tratado como erro.


31. O INSERT Db2

       4000-INSERIR-DB2.

           EXEC SQL
               INSERT INTO TB_COPAC
               (
                   CODIGO,
                   NOME,
                   PAIS,
                   POPULACAO
               )
               VALUES
               (
                   :CP-CODIGO,
                   :CP-NOME,
                   :CP-PAIS,
                   :CP-POPULACAO
               )
           END-EXEC

           EVALUATE SQLCODE
               WHEN ZERO
                   ADD 1 TO WS-INSERIDOS
                   ADD 1 TO WS-COMMIT

               WHEN -803
                   ADD 1 TO WS-REJEITADOS
                   DISPLAY 'CHAVE DUPLICADA: ' CP-CODIGO

               WHEN OTHER
                   MOVE SQLCODE TO WS-SQLCODE-AUX
                   DISPLAY 'ERRO SQL: ' WS-SQLCODE-AUX
                   DISPLAY 'REGISTRO: ' CP-CODIGO
                   PERFORM 8000-ROLLBACK
                   MOVE 12 TO RETURN-CODE
                   GOBACK
           END-EVALUATE

           IF WS-COMMIT >= 1000
               PERFORM 7000-COMMIT
           END-IF.

32. Por que não fazer apenas um COMMIT no final?

Imagine uma carga de dez milhões de registros.

Se o programa executar um único COMMIT, poderá manter durante horas:

  • locks;

  • espaço de log;

  • páginas modificadas;

  • recursos;

  • unidade de trabalho gigantesca.

Se ocorrer erro no registro 9.999.999, o rollback poderá desfazer tudo.

Uma estratégia mais segura é:

COMMIT a cada 1.000 registros

Ou:

COMMIT a cada 5.000 registros

O valor ideal depende do ambiente.

Não existe um número mágico.

É preciso considerar:

  • volume;

  • concorrência;

  • log;

  • índices;

  • tempo de recuperação;

  • SLA;

  • restart;

  • regras de negócio.

Rotina:

       7000-COMMIT.

           EXEC SQL
               COMMIT
           END-EXEC

           IF SQLCODE NOT = ZERO
               DISPLAY 'ERRO NO COMMIT: ' SQLCODE
               MOVE 12 TO RETURN-CODE
               GOBACK
           END-IF

           MOVE ZERO TO WS-COMMIT.

33. ROLLBACK

       8000-ROLLBACK.

           EXEC SQL
               ROLLBACK
           END-EXEC

           DISPLAY 'ROLLBACK EXECUTADO'.

O rollback desfaz alterações realizadas desde o último commit.

Mas atenção: ele não desfaz tudo desde o início do programa se já ocorreram commits intermediários.

Exemplo:

1.000 registros → COMMIT
1.000 registros → COMMIT
500 registros → erro → ROLLBACK

Nesse caso:

  • os primeiros 2.000 permanecem;

  • os últimos 500 são desfeitos.


34. Finalização

       9000-FINALIZAR.

           IF WS-COMMIT > ZERO
               PERFORM 7000-COMMIT
           END-IF

           CLOSE ARQ-COPAC

           DISPLAY '--------------------------------'
           DISPLAY 'REGISTROS LIDOS     : ' WS-LIDOS
           DISPLAY 'REGISTROS INSERIDOS : ' WS-INSERIDOS
           DISPLAY 'REGISTROS REJEITADOS: ' WS-REJEITADOS
           DISPLAY 'FIM DO PROGRAMA COBDB501'
           DISPLAY '--------------------------------'.

Esses totais serão enviados ao SYSOUT ou à saída padrão do Language Environment, dependendo da configuração.

Eles são fundamentais para auditoria.


35. Códigos de retorno

O programa pode usar:

MOVE 0 TO RETURN-CODE

para sucesso.

Outros códigos comuns:

RC 0  = sucesso
RC 4  = sucesso com aviso
RC 8  = erro de aplicação
RC 12 = erro grave
RC 16 = falha crítica

Esses valores são convenções. A empresa pode definir outros padrões.

Um scheduler pode usar o retorno:

RC <= 4  → continuar
RC >= 8  → interromper fluxo

36. Possíveis falhas

JCL ERROR

Causa provável:

//SYSOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*

Correção: usar DDNAMEs distintos.


S806

O programa não foi encontrado.

Verificar:

ADCD.Z112.USERLOAD(COBDB501)

S013

Pode estar relacionado à incompatibilidade de atributos do dataset.

Verificar:

  • RECFM;

  • LRECL;

  • BLKSIZE;

  • modo de abertura;

  • definição FD.


SQLCODE -803

Chave duplicada.

O programa tentou inserir um valor único já existente.


SQLCODE -805

PACKAGE não encontrado.

Verificar:

  • collection;

  • BIND PACKAGE;

  • PLAN;

  • consistency token.


SQLCODE -818

Load module e PACKAGE incompatíveis.

Refazer compilação e BIND de forma sincronizada.


SQLCODE -904

Recurso indisponível.

Pode existir:

  • tablespace parado;

  • utility pendente;

  • objeto em estado restritivo;

  • problema de storage.


SQLCODE -911

Deadlock ou timeout com rollback.

A aplicação precisa registrar:

  • chave;

  • SQLCODE;

  • unidade de trabalho;

  • momento do erro.


SQLCODE -922

Problema de autorização ou conexão.

Verificar permissões para:

  • PLAN;

  • PACKAGE;

  • tabela;

  • operação INSERT;

  • subsistema.


37. Como investigar no SDSF

Depois de submeter o job, abra:

SDSF

Depois:

ST

Localize o job e abra com S.

Analise na seguinte ordem:

JESJCL

Mostra o JCL interpretado.

Útil para detectar:

  • erro de sintaxe;

  • DD duplicado;

  • PROC expandida;

  • símbolos substituídos.

JESYSMSG

Mostra mensagens do sistema.

Procure por prefixos:

IEF
IEC
IGD
ICH

SYSTSPRT

Mostra mensagens do TSO e DSN.

SYSOUT

Mostra os DISPLAY do COBOL.

CEEDUMP

Mostra informações de falhas do Language Environment.

SYSUDUMP

Pode conter detalhes de abend e registradores.


38. Easter egg: o programa antigo que nunca morre

Um dos problemas mais misteriosos do mainframe ocorre assim:

  1. o programador altera o fonte;

  2. compila com RC 0;

  3. submete o job;

  4. o comportamento antigo continua;

  5. compila novamente;

  6. nada muda;

  7. começa a desconfiar do compilador, do Db2 e talvez da própria realidade.

A causa:

O load module foi gravado em uma biblioteca,
mas o RUN está usando outra.

Exemplo:

Novo:
IBMUSER.CBL.LOADLIB(COBDB501)

Executado:
ADCD.Z112.USERLOAD(COBDB501)

O mainframe não está errado.

Ele apenas obedeceu exatamente ao que foi pedido.

Essa é uma das grandes lições do IBM Z:

O sistema raramente faz o que imaginamos. Ele faz o que realmente declaramos.


39. O grande mapa da missão

INFEF00.COPIA.MUNDO
          │
          │ LISTCOPAC
          ▼
     Programa COBOL
       COBDB501
          │
          │ EXEC SQL INSERT
          ▼
      PLAN HERP0001
          │
          ▼
        PACKAGE
          │
          ▼
       Db2 DB9G
          │
          ▼
       TB_COPAC

Ao redor dessa execução, estão:

JES2
IKJEFT01
SDSNLOAD
TSO Attachment
Language Environment
QSAM
RACF
SDSF
Logs do Db2

Nada acontece isoladamente.


Conclusão: poucas linhas, muitas engrenagens

O JCL apresentado é um excelente exemplo da filosofia mainframe: comandos pequenos podem coordenar estruturas gigantescas.

Uma linha como:

RUN PROGRAM(COBDB501) PLAN(HERP0001)

carrega décadas de evolução tecnológica.

Ela conecta:

  • um executável COBOL;

  • um ambiente TSO batch;

  • um subsistema Db2;

  • um PLAN;

  • PACKAGES;

  • SQL estático;

  • um arquivo sequencial;

  • QSAM;

  • segurança;

  • logging;

  • controle transacional.

Para o programador COBOL padawan, a principal lição é não observar o JCL como uma simples receita de execução.

Cada DD representa um contrato.

LISTCOPAC → contrato com o arquivo
STEPLIB   → contrato com as bibliotecas
SYSTSIN   → contrato com o TSO
SYSTSPRT  → contrato com as mensagens
PLAN      → contrato com o Db2
LIB       → contrato com o executável
COMMIT    → contrato com a integridade

Quando esses contratos estão alinhados, milhões de registros podem ser processados com precisão.

Quando um deles está errado, o sistema pode responder com um JCL ERROR, um S806, um -805, um -818 ou um silencioso arquivo lido com layout incorreto.

O verdadeiro domínio do mainframe não vem apenas de decorar comandos.

Ele nasce quando entendemos a jornada completa:

Fonte
  → Precompile
  → Compile
  → Link-edit
  → DBRM
  → BIND PACKAGE
  → BIND PLAN
  → JCL
  → IKJEFT01
  → DSN
  → COBOL
  → QSAM
  → Db2
  → COMMIT
  → SDSF

E assim, diante da tela verde, com uma caneca de café ao lado, o padawan percebe que aquele pequeno JCL não é apenas um arquivo de comandos.

É a porta de entrada para uma das arquiteturas de processamento corporativo mais robustas já construídas.

sexta-feira, 30 de dezembro de 2022

😶‍🌫️ 2022: O Ano da Ressaca Pandêmica

 


😶‍🌫️ 2022: O Ano da Ressaca Pandêmica

Por ElJefe — crônicas do mundo pós-COVID para padawans cansados


Padawan, respire fundo.
Chegamos a 2022, o ano em que o planeta acordou com uma ressaca coletiva — física, mental e espiritual.
Depois de dois anos de caos, isolamento e paranoia, o mundo queria festejar… mas ainda tropeçava nas próprias cicatrizes.

Era o começo do novo normal, aquele que ninguém pediu, mas todos tiveram que aceitar.


🕊️ O Mundo Sai da Caverna

As máscaras começaram a cair — literalmente.
Bares reabriram, estádios voltaram a gritar, aviões voltaram a voar.
Mas havia algo estranho no ar (e não era o vírus, desta vez):
as pessoas voltaram diferentes.

O silêncio de 2020 e 2021 tinha deixado marcas.
Muitos não sabiam mais socializar, outros tinham medo de tudo,
e alguns fingiam que nada tinha acontecido — como se a pandemia fosse um pesadelo coletivo convenientemente esquecido.

“O corpo se cura mais rápido que a mente, padawan.”


💉 A Ciência Triunfa… Mas a Desinformação Fica

As vacinas funcionaram.
O mundo começou a se proteger em massa, e os hospitais esvaziaram.
Mas o inimigo invisível mudou de forma: agora era a mentira.

Fake news continuavam, mas com novos temas:
microchips, mutações zumbis, conspirações políticas.
Era o mesmo script, só mudava o vilão da semana.

O algoritmo, esse novo imperador do caos, percebeu uma coisa:
a verdade cansa, mas a teoria da conspiração diverte.

E assim, o pós-pandemia virou o palco de uma nova guerra —
a guerra pela narrativa.


🧠 A Crise Silenciosa: Saúde Mental

Em 2022, o vírus saiu das manchetes e deu lugar a outro tipo de pandemia — a da ansiedade.
Empresas voltaram ao trabalho híbrido, mas ninguém sabia mais o que era equilíbrio.
Gente exausta, emocionalmente drenada, e uma avalanche de “coachs de resiliência” pipocando em todo canto.

As redes sociais, que haviam sido o refúgio do isolamento, agora mostravam um novo tipo de contágio:
a comparação, o cansaço e o medo de não estar “vivendo o suficiente” depois de dois anos trancado.

Padawan, 2022 ensinou que:

“Nem toda cura vem de um remédio — às vezes, vem de uma conversa sincera e de um bom café.”


🕹️ O Novo Normal: Híbrido, Digital, Estranho

O trabalho remoto virou rotina, o QR Code virou idioma, e o metaverso surgiu prometendo mundos paralelos onde ninguém pegava vírus.
Enquanto isso, escolas, empresas e governos tentavam se adaptar a um planeta que já não cabia mais nos moldes antigos.

O “novo normal” era um Frankenstein social:
um pouco analógico, um pouco digital, um pouco cansado.

Mas, como bons padawans da era moderna, aprendemos a navegar —
mesmo com o GPS quebrado.


💔 O Luto Coletivo

Entre as risadas dos reencontros e o som dos brindes, havia silêncio.
Milhões tinham partido, e nem todos tiveram chance de se despedir.
2022 foi o ano em que o luto veio atrasado.
O mundo chorou em silêncio — não por falta de lágrimas, mas por falta de tempo.

E nesse silêncio, nasceu um novo tipo de consciência:
a de que viver é urgente.


☕ Epílogo de ElJefe

2022 não foi o fim da pandemia — foi o fim da inocência.
Descobrimos que a vida não volta a ser o que era,
porque nós não somos mais quem éramos.

A humanidade tropeçou, caiu, chorou, e mesmo assim… continuou.
E como todo padawan que passa por uma prova difícil, saímos diferentes:
menos ingênuos, mais atentos, e talvez — só talvez — um pouco mais sábios.

“O vírus mostrou que somos frágeis.
A solidão mostrou que somos humanos.
E a esperança mostrou que ainda vale a pena lutar.”

quinta-feira, 29 de dezembro de 2022

Sobrevivemos a pandemia!!!!!

 


A convivencia com 4 adultos foi dificeil, o isolamento social, ficar presos num espaço confinado. Não poder sair a rua, tomar sol e viver uma vida normal foi dificil.

Atritos aconteceram, mas também momentos unicos e marcantes. Obrigado pela companhia de vocês e este poste ficara para o sempre, como testuma de dois anos que nunca terminavam e por fim acabou.

Viva a vacina, viva por estarmos vivos e espantarmos o fantasma da morte. Perdemos entes queridos no caminho, mas enfim ca estamos.

Obrigado.


Brasil 2022: quando o sistema saiu do modo emergência, aplicou o patch certo — e o legado voltou a fazer sentido

 

Bellacosa Mainframe e o recomeço após a pandemia do covid

Brasil 2022: quando o sistema saiu do modo emergência, aplicou o patch certo — e o legado voltou a fazer sentido

Meu nono ano pós-retorno ao Brasil foi 2022. Um ano que não começou leve, mas terminou diferente. Não foi redenção, nem milagre. Foi algo mais raro em sistemas grandes: estabilização real depois do caos. Para quem viveu doze anos na Europa e atravessou, já no Brasil, uma sequência quase didática de colapsos, 2022 teve gosto de restart limpo, ainda com arquivos corrompidos, mas com o sistema respirando outra vez.

Depois de 2020 e 2021, isso já era muita coisa.

A vacina: o patch que salvou o sistema

A vacina salvou vidas. Isso não é metáfora, é fato técnico. Em linguagem de mainframe: foi o patch crítico que impediu o shutdown definitivo. Não resolveu tudo, não apagou traumas, mas devolveu algo essencial — previsibilidade mínima.

Quando a vacinação avançou, algo mudou no ar. As pessoas voltaram a sair sem culpa. A respirar sem medo constante. A planejar de novo, mesmo que em curto prazo. Para quem viveu na Europa, onde a vacina também simbolizou retomada, foi nítido perceber: sem ela, o Brasil teria entrado em colapso social irreversível.

O sistema humano voltou a responder.

Economia: não prosperidade, mas movimento

Economicamente, 2022 não foi abundância — foi movimento. E depois de anos de paralisia, movimento já é sinal de vida. Pequenos negócios retomaram, serviços reapareceram, projetos voltaram à mesa.

O home-office deixou de ser improviso e virou arquitetura. Muita gente percebeu que não precisava mais estar fisicamente presa a centros caros, congestionados e emocionalmente desgastantes. Para quem tinha vivido fora, isso soava familiar: trabalho orientado a entrega, não a presença.

O Brasil começou, tardiamente, a entender algo básico do mundo moderno.

Sociedade: menos grito, mais cansaço — e alguma lucidez

Socialmente, 2022 foi menos explosivo que os anos anteriores. Não porque os problemas sumiram, mas porque as pessoas estavam cansadas demais para berrar o tempo todo. E o cansaço, às vezes, produz lucidez.

Houve polarização, sim. Mas também houve uma vontade silenciosa de seguir em frente. De reconstruir rotinas. De não viver mais em estado permanente de alerta.

O tecido social ainda estava rasgado — mas já não sangrava o tempo todo.

Cultura: reaprendendo a criar

Culturalmente, 2022 foi um recomeço tímido. Eventos voltaram. Encontros reapareceram. A arte saiu do modo sobrevivência e voltou, devagar, ao modo criação.

O Brasil reaprendeu algo essencial: cultura não é luxo, é manutenção do sistema. Sem ela, a máquina enlouquece.

Educação, DIO e o inesperado renascimento do legado

E aqui veio a grande surpresa do ano.

Enquanto muita gente ainda apostava apenas no “novo pelo novo”, 2022 mostrou algo que todo veterano de mainframe já sabia: sistemas críticos não são descartados — são mantidos.

A DIO e outras plataformas começaram a oferecer cursos gratuitos, acessíveis, práticos. Gente que jamais teria acesso a formação técnica começou a estudar de casa. Home-office, cursos online, capacitação assíncrona — tudo isso abriu portas reais.

E então aconteceu o impensável para quem só conhece tecnologia por hype:
o mainframe voltou ao centro do jogo.

Choveu vaga de COBOL. Literalmente.

Bancos, seguradoras, governos, empresas globais — todos dependentes de sistemas escritos décadas atrás — perceberam que não tinham operadores suficientes. O legado não morreu. Ele sobreviveu a todas as modas. E agora pedia gente que soubesse ler, entender e manter código crítico.

Para mim, isso teve gosto de justiça histórica.

O renascimento do mainframe: quando experiência vira ativo

Depois de anos em que “antigo” era tratado como sinônimo de “obsoleto”, 2022 lembrou o óbvio: antigo é o que continua funcionando quando tudo o resto falha.

COBOL não voltou por nostalgia. Voltou por necessidade. Voltou porque sistemas que pagam salários, aposentadorias, benefícios e movimentam trilhões não podem cair.

E, de repente, quem carregava conhecimento profundo deixou de ser peso e voltou a ser pilar.

Todo operador de mainframe sorriu em silêncio.

População: machucada, mas de pé

O povo em 2022 ainda estava machucado. Mentalmente, financeiramente, emocionalmente. Mas estava de pé. Mais cauteloso. Menos iludido. Um pouco mais sábio — no sentido duro da palavra.

A esperança voltou, mas não era mais ingênua. Era técnica. Condicionada. Baseada em evidência, não em promessa.

Nono ano pós-retorno: reconciliação com o tempo

Em 2022, pela primeira vez desde que voltei ao Brasil, senti algo próximo de reconciliação. Não com o país idealizado. Mas com o país real. Complexo. Difícil. Injusto em muitos pontos. Mas vivo.

E comigo mesmo também. Entendi que voltar não foi erro nem acerto simples. Foi parte do job.

Epílogo: a lição final do ano

2022 ensinou uma verdade que só sistemas grandes revelam depois de crises profundas:

o futuro não elimina o passado — ele o integra.

O Brasil só voltou a respirar porque aplicou ciência, tecnologia, trabalho remoto, educação acessível —
e porque o legado estava lá, silencioso, sustentando tudo.

O sistema não virou perfeito.
Mas voltou a funcionar com propósito.

E todo veterano de mainframe sabe:
quando o legado resiste,
é sinal de que ainda há muito sistema pela frente.

quarta-feira, 28 de dezembro de 2022

Da Baixa Plataforma ao IBM Mainframe O Guia Definitivo para Desenvolvedores que Desejam Migrar para o IBM Z

 

Bellacosa Mainframe da baixa para a alta plataforma a jornada do padawan a stack mainframe

☕ Um Café no Bellacosa Mainframe

Da Baixa Plataforma ao IBM Mainframe

O Guia Definitivo para Desenvolvedores que Desejam Migrar para o IBM Z

Você não está voltando ao passado. Está descobrindo onde a Engenharia de Software aprendeu a nunca falhar.

Há uma pergunta que recebo praticamente todas as semanas.

"Vale a pena aprender Mainframe em 2026?"

Minha resposta continua exatamente a mesma.

Sim. E talvez hoje faça ainda mais sentido do que há dez anos.

Enquanto novas linguagens surgem todos os anos, existe uma plataforma que continua processando boa parte da economia mundial com disponibilidade próxima de 100%.

Essa plataforma é o IBM Z.

Mas este artigo não é sobre máquinas.

É sobre pessoas.

Sobre desenvolvedores que dominam Java, Python, C#, Delphi, Go, Rust, Kotlin, C++, Visual Basic e outras tecnologias e desejam entender como esse conhecimento pode abrir as portas do universo Mainframe.

Pegue um café.

Vamos conversar.


Antes de tudo: esqueça os mitos

Existe uma enorme quantidade de desinformação sobre Mainframe.

Você provavelmente já ouviu alguma destas frases:

  • "Mainframe morreu."

  • "Só existem sistemas antigos."

  • "COBOL é uma linguagem ultrapassada."

  • "Ninguém mais aprende isso."

  • "Tudo foi para a nuvem."

Na prática, basta observar quem movimenta bilhões de transações diariamente:

  • bancos;

  • seguradoras;

  • bolsas de valores;

  • companhias aéreas;

  • operadoras de cartão;

  • governos;

  • empresas de logística.

Em muitos casos, o coração desses negócios continua sendo o IBM Z.

Não porque seja antigo.

Mas porque funciona extraordinariamente bem.


Você não está trocando de profissão

Quem vem da baixa plataforma costuma imaginar que precisará começar do zero.

Não precisa.

Você continua sendo desenvolvedor.

Continua resolvendo problemas.

Continua escrevendo software.

A diferença está na prioridade.

Na baixa plataforma normalmente pensamos em:

  • experiência do usuário;

  • frameworks;

  • componentes;

  • bibliotecas;

  • deploy contínuo;

  • microsserviços.

Na alta plataforma pensamos em:

  • continuidade do negócio;

  • disponibilidade;

  • integridade dos dados;

  • desempenho previsível;

  • recuperação de falhas;

  • processamento em larga escala.

O objetivo muda.

A engenharia evolui.


O IBM Z não compete com a nuvem

Um erro comum é imaginar que Cloud e Mainframe disputam espaço.

Na realidade eles trabalham juntos.

Hoje encontramos ambientes onde:

  • APIs REST expõem programas COBOL;

  • Java executa no z/OS;

  • Linux roda dentro do IBM Z;

  • Kubernetes conversa com aplicações corporativas;

  • OpenShift integra workloads;

  • IA analisa dados produzidos pelo Mainframe;

  • Git e VS Code fazem parte do dia a dia.

O IBM Z moderno é uma plataforma integrada ao restante da arquitetura corporativa.


Esqueça a pergunta "Qual linguagem é melhor?"

Essa pergunta perde completamente o sentido no mundo corporativo.

Cada tecnologia resolve problemas diferentes.

Python resolve problemas.

Java resolve problemas.

Rust resolve problemas.

COBOL resolve problemas.

A verdadeira pergunta é:

Qual tecnologia oferece menor risco para aquele negócio?

É exatamente aí que o Mainframe se destaca.


O que realmente muda?

Muito menos do que você imagina.

Você continuará trabalhando com:

  • variáveis;

  • estruturas condicionais;

  • repetições;

  • funções;

  • módulos;

  • arquivos;

  • bancos de dados;

  • APIs;

  • mensagens.

O que muda é a forma de organizar esses componentes.


As maiores mudanças de mentalidade

Disponibilidade

Na Web um servidor pode reiniciar.

Num banco isso pode significar milhões de reais.


Performance previsível

Não basta ser rápido.

É preciso manter o mesmo desempenho durante milhões de transações.


Integridade

Cada registro possui valor financeiro.

Cada atualização precisa ser consistente.


Auditoria

Tudo precisa ser rastreável.


Segurança

Segurança deixa de ser funcionalidade.

Passa a ser requisito básico.


O ecossistema IBM Z

Aprender apenas COBOL é conhecer apenas uma pequena parte da plataforma.

Você encontrará tecnologias como:

  • COBOL

  • JCL

  • CICS

  • Db2

  • IMS

  • VSAM

  • MQ

  • RACF

  • TSO/ISPF

  • SDSF

  • JES2

  • REXX

  • z/OS

  • z/OS Connect

  • Zowe

  • Git

  • VS Code

  • OpenShift

  • Ansible

  • Java

  • Python

É um ecossistema completo.


A melhor estratégia de aprendizagem

Não tente aprender tudo ao mesmo tempo.

Minha recomendação é:

Primeira etapa

  • Conceitos do Mainframe

  • z/OS

  • Dataset

  • Batch

  • Online

Segunda etapa

  • TSO/ISPF

  • JCL

  • SDSF

Terceira etapa

  • COBOL

Quarta etapa

  • Db2

  • VSAM

Quinta etapa

  • CICS

Depois disso você poderá seguir para:

  • APIs

  • MQ

  • DevOps

  • Git

  • Zowe

  • Java

  • Python

  • IA aplicada ao IBM Z


Escolha sua linguagem de origem

Preparei uma série mostrando como cada tecnologia conversa com o universo IBM Z.

☕ Java → COBOL

https://eljefemidnightlunch.blogspot.com/2022/01/do-java-ao-cobol-no-ibm-z-um-guia-para.html

Para quem já desenvolve aplicações corporativas.


☕ Python → COBOL

https://eljefemidnightlunch.blogspot.com/2022/02/de-python-ao-cobol-no-ibm-z-voce-nao.html

Automação, produtividade e integração.


☕ C# → COBOL

https://eljefemidnightlunch.blogspot.com/2022/03/de-c-ao-cobol-no-ibm-z-voce-nao-esta.html

A ponte entre aplicações Microsoft e IBM Z.


☕ Visual Basic → COBOL

https://eljefemidnightlunch.blogspot.com/2022/04/do-visual-basic-ao-cobol-no-ibm-z-voce.html

Quem domina regras de negócio já possui uma enorme vantagem.


☕ Go → COBOL

https://eljefemidnightlunch.blogspot.com/2022/05/de-go-ao-cobol-no-ibm-z-voce-nao-esta.html

Simplicidade encontra estabilidade.


☕ Rust → COBOL

https://eljefemidnightlunch.blogspot.com/2022/06/de-rust-ao-cobol-no-ibm-z-voce-nao-esta.html

Segurança de memória aplicada aos sistemas mais críticos do mundo.


☕ C++ → COBOL

https://eljefemidnightlunch.blogspot.com/2022/07/de-c-ao-cobol-no-ibm-z-voce-nao-esta.html

Arquitetura, desempenho e controle.


☕ Kotlin → COBOL

https://eljefemidnightlunch.blogspot.com/2022/08/de-kotlin-ao-cobol-no-ibm-z-voce-nao.html

A produtividade moderna chegando aos sistemas corporativos.


☕ Delphi → COBOL

https://eljefemidnightlunch.blogspot.com/2022/09/de-delphi-ao-cobol-no-ibm-z-voce-nao.html

RAD, regras de negócio e engenharia corporativa.


Conselhos para quem está começando

✔ Não compare COBOL com Java.

✔ Não compare z/OS com Windows.

✔ Não tente aprender tudo em uma semana.

✔ Leia programas antigos.

✔ Entenda o negócio antes do código.

✔ Aprenda a usar o teclado.

✔ Estude JCL cedo.

✔ Aprenda a interpretar mensagens do sistema.

✔ Não tenha medo da tela preta.

✔ Nunca pare de estudar.


Conclusão

O IBM Z continua sendo uma das plataformas mais importantes da computação mundial.

Ele não representa o passado da tecnologia.

Representa décadas de evolução em disponibilidade, segurança, desempenho e confiabilidade.

Se você domina qualquer linguagem moderna, já possui o ingrediente mais importante: sabe resolver problemas.

Aprender Mainframe significa adicionar uma nova perspectiva à sua carreira e compreender como funcionam alguns dos sistemas mais críticos do planeta.

No Bellacosa Mainframe acreditamos que o melhor desenvolvedor não é aquele que conhece apenas uma plataforma.

É aquele que consegue transitar entre todas elas, levando consigo boas práticas, curiosidade e respeito pela engenharia de software.

 

sexta-feira, 23 de dezembro de 2022

Java no IBM Z: Como Java Conversa com COBOL, DB2, CICS e o Mundo Mainframe na Prática

 

Bellacosa Mainframe como java conversa com o mainframe

☕ Um Café no Bellacosa Mainframe

Java no IBM Z: Como Java Conversa com COBOL, DB2, CICS e o Mundo Mainframe na Prática

"O Java não chegou para substituir o COBOL. Ele chegou para conversar com ele."

Existe uma lenda que circula há muitos anos entre profissionais de TI.

Ela diz que existem dois mundos completamente diferentes.

De um lado está o mundo Mainframe.

Do outro está o mundo Java.

Na realidade... isso nunca foi verdade.

Hoje, milhares de bancos, seguradoras, governos e bolsas de valores executam aplicações onde Java, COBOL, CICS, DB2, MQ, z/OS Connect e APIs REST trabalham juntos no mesmo IBM Z.

A pergunta deixou de ser:

"Java ou COBOL?"

e passou a ser:

"Como fazer ambos trabalharem juntos?"

Pegue seu café porque hoje vamos abrir a tampa do motor do IBM Z.


A chegada do Java ao Mainframe

Quando Java apareceu em 1995, muitos profissionais de Mainframe olharam com desconfiança.

"Uma linguagem interpretada?"

"Rodando em máquina virtual?"

"Orientada a objetos?"

Parecia impossível competir com COBOL compilado.

Mas havia um detalhe importante.

Java tinha uma vantagem gigantesca.

Escrever uma vez, executar em qualquer lugar

A JVM (Java Virtual Machine) permitia que o mesmo programa funcionasse em:

  • Windows

  • Linux

  • Unix

  • AIX

  • IBM Z

A IBM rapidamente percebeu que clientes desejariam executar Java perto dos dados.

E onde estavam os dados?

No DB2.

No VSAM.

No IMS.

No CICS.

No MQ.

Ou seja...

Java precisava ir até o Mainframe.

Não fazia sentido mover bilhões de registros para outro servidor.

Muito mais eficiente era mover o processamento.


O nascimento do Java no z/OS

A IBM portou a JVM para o z/OS.

Depois vieram:

  • IBM SDK for Java

  • JZOS

  • JDBC para DB2

  • CICS Java

  • Liberty

  • WebSphere

  • OpenJ9 JVM

Hoje Java é cidadão de primeira classe dentro do IBM Z.


A arquitetura moderna

Imagine um banco.

Cliente Web

      │

 REST API

      │

 Liberty

      │

 Java

      │

 JDBC

      │

 DB2

Agora imagine outro fluxo.

Cliente

↓

CICS

↓

Programa Java

↓

Programa COBOL

↓

DB2

Ou ainda

Java

↓

MQ

↓

COBOL

↓

IMS

Ou

Java

↓

z/OS Connect

↓

CICS

↓

COBOL

↓

VSAM

Perceba.

O Java raramente trabalha sozinho.

Ele normalmente atua como a camada de integração.


JDBC

JDBC significa:

Java Database Connectivity

É a API padrão do Java para conversar com bancos de dados.

No Mainframe ela conversa principalmente com o DB2.


Exemplo

Connection conn =
DriverManager.getConnection(
"jdbc:db2://servidor:446/BANCO",
"usuario",
"senha");

A partir daí...

PreparedStatement ps =
conn.prepareStatement(
"SELECT NOME,SALDO FROM CLIENTE WHERE ID=?");
ps.setInt(1,100);
ResultSet rs = ps.executeQuery();

Enquanto houver registros

while(rs.next()){

System.out.println(
rs.getString("NOME"));

}

Isso parece simples.

Mas por trás existe uma enorme infraestrutura.


O Driver JDBC

O Driver JDBC entende dois idiomas.

Ele fala Java.

E fala DB2.

É literalmente um tradutor.

Java

↓

Driver JDBC

↓

DRDA

↓

DB2

O desenvolvedor escreve SQL.

O Driver transforma isso em chamadas compreendidas pelo DB2.


O Prepared Statement

No Mainframe quase nunca usamos:

Statement

Preferimos:

PreparedStatement

Por quê?

Porque:

  • reutiliza plano de acesso

  • melhora performance

  • evita SQL Injection

  • reduz parsing

Exemplo

SELECT *
FROM CLIENTE
WHERE CPF=?

O ponto de interrogação representa um parâmetro.


Como Java conversa com DB2

Internamente ocorre algo semelhante.

Java

↓

JDBC

↓

DRDA

↓

DB2 Thread

↓

Buffer Pool

↓

Tablespace

O Java nunca lê páginas do banco.

Quem faz isso é o DB2.


Como COBOL acessa DB2

No COBOL usamos:

EXEC SQL

SELECT NOME

INTO :WS-NOME

FROM CLIENTE

END-EXEC.

No Java:

String nome=
rs.getString("NOME");

O objetivo é exatamente o mesmo.

A tecnologia muda.


Conversão de tipos

Essa é uma das maiores dúvidas.

Como converter tipos COBOL para Java?

COBOL

PIC X(30)

Java

String

COBOL

PIC X

Java

char

ou

String

COBOL

PIC 9(4)

Java

int

COBOL

PIC 9(9)

Java

long

COBOL

PIC S9(9)V99 COMP-3

Java

BigDecimal

Nunca utilize:

double

para dinheiro.

Sempre:

BigDecimal

Datas

COBOL

PIC X(10)

2026-07-01

Java

LocalDate

ou

LocalDateTime

Boolean

COBOL tradicional não possui boolean.

Normalmente usa:

"S"

"N"

ou

1

0

No Java

boolean

Estruturas COBOL

Imagine

01 CLIENTE.

   05 ID.

   05 NOME.

   05 SALDO.

No Java

class Cliente{

int id;

String nome;

BigDecimal saldo;

}

Observe a semelhança.

O Java apenas encapsula os dados dentro de uma classe.


OO versus Procedural

COBOL

LER CLIENTE

↓

VALIDAR

↓

ATUALIZAR

↓

GRAVAR

Fluxo procedural.


Java

Cliente

↓

objeto

↓

métodos

↓

atributos

Em vez de funções espalhadas,

o comportamento fica dentro do objeto.


Classe

public class Cliente{

private String nome;

private BigDecimal saldo;

public void sacar(){

}

}

A classe reúne:

  • dados

  • comportamento


O que seria uma estrutura COBOL equivalente?

WORKING-STORAGE

↓

PROCEDURE DIVISION

↓

PARÁGRAFOS

A ideia é semelhante.

Só muda a organização.


Como Java chama COBOL?

Existem diversas formas.

CICS

Java

↓

EXEC CICS LINK

↓

Programa COBOL

JNI

Java pode chamar código nativo.


MQ

Java envia mensagem.

COBOL recebe.


REST

Java chama uma API exposta pelo COBOL.


Stored Procedures

DB2 executa procedimento COBOL.

Java apenas chama.


CICS

Imagine um caixa eletrônico.

O Java recebe uma requisição REST.

POST

/saque

Java valida.

Depois

EXEC CICS LINK

para

SAQ001

escrito em COBOL.

O COBOL atualiza saldo.

Retorna.

Java transforma em JSON.

Cliente recebe resposta.

Tudo acontece em poucos milissegundos.


JSON

O Java trabalha naturalmente com JSON.

Exemplo

{
 "id":100,
 "nome":"Maria",
 "saldo":2500
}

Classe

Cliente

Bibliotecas como Jackson fazem:

Objeto

↓

JSON

e

JSON

↓

Objeto

automaticamente.


XML

Antes do JSON predominava XML.

<cliente>

<nome>Maria</nome>

</cliente>

Ainda muito utilizado em:

SOAP

WebServices

Integrações legadas.


Conversão COBOL para JSON

Suponha

01 CLIENTE.

05 NOME.

05 CPF.

05 SALDO.

Java monta

{
 "nome":"",
 "cpf":"",
 "saldo":0
}

O mapeamento costuma ser feito por:

  • Jackson

  • JAXB

  • JSON-B


Datasets

Java também pode acessar datasets.

Mas normalmente utiliza:

JZOS.

Exemplo

HLQ.CLIENTES.MASTER

O Java lê registros do dataset.

Sem necessidade de FTP.


VSAM

Também pode acessar

  • KSDS

  • ESDS

  • RRDS

através de APIs específicas.


Arquivos Sequenciais

Java consegue ler datasets RECFM FB.

Cada registro torna-se um array de bytes.

Depois converte.

Bytes

↓

String

↓

Objeto Java

EBCDIC versus ASCII

Outro ponto crítico.

Mainframe usa:

EBCDIC.

Java trabalha internamente em Unicode.

Então existe conversão automática.

EBCDIC

↓

Unicode

↓

String

Sem isso os caracteres apareceriam ilegíveis.


Batch Java

Pouca gente sabe.

Java também roda Batch.

JCL

//STEP1 EXEC PGM=JVMLDM86

ou

BPXBATCH

executando

java MinhaClasse

Exemplo

//JAVA EXEC PGM=BPXBATCH
//STDENV DD *
JAVA_HOME=/usr/lpp/java
/*

O Java executa como qualquer programa batch.

Pode:

  • ler datasets

  • acessar DB2

  • gerar arquivos

  • enviar MQ

  • consumir APIs


Java Online

Dentro do CICS.

Ou Liberty.

Recebe milhares de requisições simultâneas.


JSP

Nos anos 2000 a IBM utilizou muito:

JSP

↓

Servlet

↓

Java

↓

DB2

A página dinâmica misturava HTML com Java.

Exemplo

<%=cliente.getNome()%>

Hoje é menos comum.

Frameworks modernos predominam.

Mas muitos sistemas bancários ainda utilizam JSP.


Servlets

O Servlet recebe a requisição.

HTTP

↓

Servlet

↓

Java

↓

DB2

Depois devolve HTML.

Ou JSON.


APIs REST

Hoje a arquitetura mais comum é

Angular

↓

REST

↓

Java

↓

COBOL

↓

DB2

O usuário nem imagina que existe COBOL.


LinuxONE

Agora entra um personagem muito importante.

O LinuxONE.

Ele compartilha praticamente a mesma arquitetura do IBM Z.

Executa:

  • Linux

  • Containers

  • Docker

  • Kubernetes

  • OpenShift

  • Java

  • IA

Tudo extremamente próximo do z/OS.

Isso reduz:

  • latência

  • tráfego de rede

  • custo

Imagine

LinuxONE

↓

Java

↓

MQ

↓

z/OS

↓

COBOL

Tudo dentro do mesmo hardware.


OpenJ9

A JVM da IBM foi otimizada.

Ela consome menos memória.

Melhora Garbage Collection.

Aproveita processadores IBM Z.


zIIP

Aqui está um dos grandes diferenciais.

Grande parte do processamento Java pode utilizar processadores zIIP.

Resultado:

mais desempenho.

Menor custo de licenciamento.

É uma das razões pelas quais muitas empresas migraram workloads Java para o IBM Z.


Um fluxo completo

Imagine uma transferência bancária.

Celular

↓

HTTPS

↓

API REST

↓

Liberty

↓

Java

↓

Validação

↓

EXEC CICS LINK

↓

COBOL

↓

DB2

↓

COMMIT

↓

Resposta COBOL

↓

Objeto Java

↓

JSON

↓

Cliente

Perceba que cada tecnologia faz aquilo em que é especialista.

  • Java oferece APIs, integração, orientação a objetos e desenvolvimento web.

  • COBOL executa regras de negócio consolidadas ao longo de décadas.

  • CICS coordena as transações com alta disponibilidade.

  • DB2 garante consistência, integridade e desempenho.

  • JCL agenda e executa processos batch.

  • MQ desacopla sistemas e permite comunicação assíncrona.

  • LinuxONE hospeda aplicações Java, microsserviços e containers próximos aos dados.

  • IBM Z fornece segurança, escalabilidade, criptografia e confiabilidade.

Não existe competição entre essas tecnologias. Existe colaboração.


Procedural x Orientado a Objetos: uma visão para quem vem do COBOL

Para um programador COBOL, pense da seguinte forma:

No COBOL você cria um programa que manipula registros.

No Java você cria um objeto que representa aquele registro e sabe operar sobre ele.

No COBOL:

LER CLIENTE
VALIDAR CLIENTE
ATUALIZAR CLIENTE
GRAVAR CLIENTE

No Java:

Cliente cliente = repositorio.buscar(id);
cliente.validar();
cliente.atualizarSaldo(valor);
repositorio.salvar(cliente);

A regra de negócio continua praticamente a mesma. O que muda é a forma de organizá-la.


O futuro

Nos últimos anos surgiram novas tecnologias como:

  • Jakarta EE

  • Spring Boot

  • Quarkus

  • Open Liberty

  • z/OS Connect EE

  • APIs REST

  • GraphQL

  • Kafka

  • OpenShift

  • Red Hat Ansible Automation Platform

  • IA Generativa integrada ao IBM Z

Mesmo assim, o núcleo dos sistemas bancários continua sendo, em muitos casos, o mesmo:

  • COBOL processando regras críticas.

  • CICS coordenando milhões de transações.

  • DB2 armazenando dados.

  • Java expondo serviços modernos.

  • LinuxONE executando aplicações cloud-native próximas ao ambiente z/OS.


Conclusão

Durante muitos anos, criou-se a falsa ideia de que Java substituiria o COBOL. A história mostrou o contrário. O IBM Z evoluiu para unir o melhor dos dois mundos.

O COBOL permanece imbatível na execução de regras de negócio críticas e estáveis. O Java tornou-se a ponte para APIs REST, aplicações web, microsserviços, integração com nuvem, processamento orientado a objetos e experiências digitais modernas.

Hoje, quando um cliente consulta o saldo pelo aplicativo do banco, dificilmente percebe a sofisticada cadeia tecnológica envolvida. Um JSON percorre uma API REST hospedada em Open Liberty, passa por classes Java, utiliza JDBC para acessar o DB2 ou aciona um programa COBOL via CICS. Em segundos, o resultado retorna ao celular com segurança, integridade transacional e disponibilidade próxima de 100%.

Esse é o verdadeiro espírito do IBM Z moderno: não substituir o legado, mas ampliá-lo. Java, COBOL, CICS, DB2, JCL, LinuxONE, APIs e containers deixaram de ser tecnologias concorrentes e passaram a formar um único ecossistema. É justamente essa capacidade de integrar décadas de investimento com inovação contínua que mantém o Mainframe como a espinha dorsal de alguns dos maiores sistemas financeiros, governamentais e corporativos do planeta. E, para o profissional de Mainframe que aprende Java, abre-se uma nova fronteira: compreender não apenas como cada tecnologia funciona isoladamente, mas como elas conversam para sustentar o mundo digital moderno.


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...