☕ 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

Mostrar mensagens com a etiqueta Boas Práticas. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Boas Práticas. Mostrar todas as mensagens

quarta-feira, 8 de julho de 2026

PERFORM Recursivo em COBOL: O Warning que Todo Padawan Ignora (Até o Job Estourar o TIME e o REGION)

 

Bellacosa e o perigo do perform recursivo

☕ Um Café no Bellacosa Mainframe

PERFORM Recursivo em COBOL: O Warning que Todo Padawan Ignora (Até o Job Estourar o TIME e o REGION)

"Recursão é uma ferramenta fantástica... exceto quando você tenta usá-la como estrutura de repetição dentro de um programa COBOL Batch."

Quem vem de Java, C#, Python ou C costuma achar natural escrever funções recursivas.

Quem cresceu no COBOL aprende rapidamente uma regra quase sagrada:

Nunca faça um PERFORM recursivo em um parágrafo ou seção.

Mas por quê?

Vamos abrir o capô do compilador.


Primeiro: o que é um PERFORM recursivo?

Imagine algo assim:

0000-PRINCIPAL.

    PERFORM 1000-PROCESSA

    STOP RUN.

1000-PROCESSA.

    DISPLAY "PROCESSANDO"

    PERFORM 1000-PROCESSA.

O programa chama...

...que chama...

...que chama...

...que chama novamente...

Nunca termina.


O warning da compilação

O Enterprise COBOL consegue detectar algumas formas óbvias de recursão.

Durante a compilação pode surgir mensagens semelhantes a:

IGYPSxxxx-W

Recursive PERFORM detected.

ou

Possible recursive PERFORM.

O compilador está dizendo:

"Existe um caminho onde este PERFORM pode executar novamente antes do anterior terminar."

Nem sempre é erro.

Mas quase sempre indica problema de projeto.


Por que isso é perigoso?

Porque PERFORM não foi criado para funcionar como chamada infinita de procedimentos.

Cada PERFORM precisa guardar informações como:

  • endereço de retorno

  • contexto de execução

  • pilha de controle

  • informações internas do runtime

A cada nova chamada tudo isso cresce.

PERFORM A
    ↓
PERFORM A
    ↓
PERFORM A
    ↓
PERFORM A
    ↓
PERFORM A

A pilha nunca é liberada.


O que acontece durante a execução?

Enquanto houver memória:

Stack

+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+

Cada PERFORM adiciona um novo frame.

Quando acaba a pilha...

Boom.


O programa pode terminar com

Dependendo do ambiente:

  • S0C1

  • S0C4

  • S0CB

  • S878

  • S80A

Ou simplesmente:

ABEND

Tudo depende de onde ocorreu a falha.


O erro de TIME no JCL

Muito antes da memória acabar...

o Job pode morrer por tempo.

Exemplo:

//STEP1 EXEC PGM=MEUPROG,TIME=1

ou

TIME=1440

Mesmo com TIME=1440...

o programa nunca termina.

O JES percebe que o tempo máximo foi atingido.

Resultado:

S322

Ou mensagens semelhantes indicando limite de CPU excedido.

Não foi o COBOL.

Foi o JCL protegendo o sistema.


O erro de REGION

Outro clássico.

Cada PERFORM recursivo consome mais memória.

Em algum momento:

REGION=0M

não resolve.

Porque memória infinita não existe.

O resultado costuma ser:

S878

ou

S80A

Falta de armazenamento.


"Mas REGION=0M não é infinito?"

Não.

É apenas o máximo permitido pela instalação.

Existe limite de:

  • memória virtual

  • stack

  • storage abaixo da linha

  • storage acima da linha

  • política do sistema

Nada disso é infinito.


O maior problema: lógica

Suponha:

1000-ROTINA.

    IF WS-FIM = 'N'
       PERFORM 1000-ROTINA
    END-IF.

Quem altera:

WS-FIM

Se ninguém alterar...

Nunca haverá saída.

É um loop infinito disfarçado.


Por que não usar recursão em parágrafos e seções?

Porque COBOL foi projetado para outro paradigma.

A linguagem nasceu para processamento sequencial.

Ela possui comandos próprios para repetição.

Como:

PERFORM UNTIL
PERFORM VARYING
SEARCH
SEARCH ALL

Essas estruturas:

  • são previsíveis

  • ocupam pouca memória

  • facilitam depuração

  • têm melhor desempenho


"Mas COBOL suporta recursão."

Sim.

Desde o Enterprise COBOL moderno existe:

RECURSIVE PROGRAM-ID.

ou

PROGRAM-ID. MEUPROG RECURSIVE.

Isso significa que o programa pode chamar a si próprio.

Exemplo clássico:

  • árvore binária

  • parsing

  • algoritmos matemáticos

  • estruturas hierárquicas

Mesmo assim...

Não significa que seja recomendado para processamento batch tradicional.


A diferença importante

Errado

Parágrafo
↓

PERFORM

↓

Mesmo parágrafo

Recursão interna.

Difícil de manter.


Correto

Programa A

CALL Programa A

Novo contexto

Retorna

Quando realmente houver necessidade de recursão.


Curiosidade

Os compiladores antigos praticamente desencorajavam qualquer tipo de recursão.

O foco sempre foi:

  • velocidade

  • previsibilidade

  • baixo consumo de memória

A maioria dos sistemas bancários jamais precisou de recursão.


Como um sênior resolveria?

Em vez disso:

PERFORM UNTIL WS-FIM = 'S'

    ...

END-PERFORM

ou

PERFORM VARYING IDX FROM 1 BY 1
        UNTIL IDX > TOTAL

Muito mais claro.

Muito mais rápido.

Muito mais seguro.


Boas práticas

✅ Prefira PERFORM UNTIL para laços controlados.

✅ Use PERFORM VARYING para contadores.

✅ Evite PERFORM chamando o próprio parágrafo.

✅ Revise IFs que nunca alteram a condição de saída.

✅ Analise os warnings do compilador; eles frequentemente apontam defeitos reais de lógica.

✅ Monitore consumo de CPU e storage no SDSF durante testes.

✅ Se precisar de recursão, utilize programas declarados RECURSIVE e valide cuidadosamente profundidade máxima e condição de parada.

✅ Sempre tenha uma condição de saída claramente identificável.


Dicas de depuração

Se um Job "não termina":

  1. Verifique se a CPU continua aumentando no SDSF.

  2. Procure PERFORMs que retornam ao mesmo parágrafo.

  3. Confirme se a variável de controle realmente muda.

  4. Ative SSRANGE em ambiente de teste para detectar erros relacionados a índices e referências inválidas.

  5. Gere um compile listing (LIST, MAP, XREF) para acompanhar o fluxo de chamadas.

  6. Revise mensagens do compilador; um warning ignorado hoje pode virar um ABEND amanhã.


Caminho para o Padawan COBOL

Antes de pensar em recursão, domine completamente:

  1. PERFORM

  2. PERFORM THRU

  3. PERFORM UNTIL

  4. PERFORM VARYING

  5. Estrutura de parágrafos e seções

  6. Escopo explícito (END-IF, END-PERFORM)

  7. Fluxo estruturado sem GO TO

  8. Subprogramas com CALL

  9. Programas RECURSIVE apenas quando o problema realmente exigir

Quando você entender por que o COBOL prefere estruturas iterativas, começará a enxergar o sistema como os arquitetos do IBM Z enxergam: programas previsíveis, eficientes e fáceis de manter. Em ambientes que processam milhões de transações por dia, previsibilidade vale muito mais do que elegância acadêmica.


quinta-feira, 2 de julho de 2026

As 16 Recomendações da IBM que Todo Programador COBOL Padawan Deveria Conhecer

 

Bellacosa Mainframe e 16 recomendacoes Jedi para seu programa COBOL século XXI

☕ Um Café no Bellacosa Mainframe

As 16 Recomendações da IBM que Todo Programador COBOL Padawan Deveria Conhecer

Da Era dos Cartões Perfurados ao IBM Z Moderno: Como Escrever COBOL Preparado para os Próximos 30 Anos

"A maior diferença entre um Programador COBOL Júnior e um Arquiteto Mainframe não está em quantos comandos ele conhece, mas em entender por que a linguagem evoluiu."

Existe uma frase muito comum entre desenvolvedores iniciantes:

"Sempre fizemos assim."

Ela parece inofensiva.

Mas, no mundo Mainframe, ela pode esconder décadas de dívida técnica.

Muitos sistemas COBOL que ainda executam hoje foram escritos quando:

  • o IBM System/360 ainda era novidade;

  • cartões perfurados eram utilizados;

  • memória era medida em kilobytes;

  • não existia Internet;

  • não existia Java;

  • não existia JSON;

  • ninguém imaginava APIs REST.

Mesmo assim, esses sistemas continuam processando bilhões de dólares diariamente.

Então surge uma pergunta inevitável:

Se eles funcionam tão bem, por que a IBM continua evoluindo o COBOL?

A resposta é simples.

Porque o mundo mudou.

O hardware mudou.

Os processadores IBM Z mudaram.

O Language Environment (LE) mudou.

As aplicações passaram a conversar com Java, Python, Node.js, microsserviços, OpenShift, APIs REST e serviços em nuvem.

O COBOL também precisou evoluir.

E é exatamente isso que veremos neste café.


A filosofia da IBM

Existe um detalhe curioso.

A IBM raramente muda uma linguagem apenas porque existe uma novidade tecnológica.

Ela muda quando existe ganho real.

Os princípios normalmente são:

  • mais segurança

  • mais desempenho

  • menos CPU

  • menos manutenção

  • melhor integração

  • melhor diagnóstico

  • maior reutilização

Sempre que surgir uma recomendação da IBM, pergunte:

"Qual problema essa mudança resolveu?"

Essa pergunta transforma um Padawan em um profissional que entende arquitetura.


1. STOP RUN → GOBACK

Provavelmente a recomendação mais conhecida.

Durante décadas escrevíamos:

STOP RUN.

Hoje, novos projetos costumam utilizar:

GOBACK.

Por quê?

Imagine um restaurante.

Você pede um café.

O garçom leva até sua mesa.

Quando termina de beber, o correto é devolver a xícara ao garçom.

Não faz sentido fechar o restaurante inteiro.

Foi exatamente isso que aconteceu com o COBOL.

Nos anos 60 o programa era praticamente o dono da execução.

Hoje ele normalmente é apenas um componente.

Pode ser chamado por:

  • outro COBOL

  • CICS

  • IMS

  • Java

  • API REST

  • MQ

  • z/OS Connect

Se um módulo chamado executar STOP RUN...

Toda a Run Unit termina.

Com GOBACK...

O controle simplesmente retorna ao chamador.

Dica Bellacosa

Sempre imagine:

"Meu programa está prestando um serviço."

Quem chamou deve decidir quando terminar a aplicação.


2. NUMCHECK

Todo programador já viu um S0C7.

Normalmente ele aparece na madrugada.

Em produção.

Na sexta-feira.

O motivo quase sempre é simples.

Dados inválidos.

Exemplo:

MOVE "ABC" TO WS-VALOR.
ADD 10 TO WS-VALOR.

Visualmente parece correto.

Na prática...

Explode.

NUMCHECK faz o compilador inserir verificações para identificar esse tipo de problema antes que ele vire um incidente.

Curiosidade

Muitos S0C7 não nascem onde ocorrem.

O dado inválido pode ter sido gravado horas antes por outro programa.


3. SSRANGE

Imagine um armário com 100 gavetas.

Você tenta abrir a gaveta 101.

Ela simplesmente não existe.

Sem SSRANGE...

Seu programa pode acessar memória indevida.

Com SSRANGE...

O erro é detectado imediatamente.

Exemplo:

01 TABELA.
   05 ITEM OCCURS 100 TIMES.

MOVE "X" TO ITEM(101).

Esse erro pode permanecer escondido durante anos.

Até que um dia...

Produção.


Curiosidade

Grande parte dos erros difíceis de reproduzir está relacionada ao acesso indevido de memória.

SSRANGE ajuda justamente nisso.


4. TEST

Quantos DISPLAY você já encontrou em produção?

DISPLAY "CHEGUEI AQUI".

DISPLAY SQLCODE.

DISPLAY WS-CLIENTE.

Eles ajudam?

Sim.

Mas apenas temporariamente.

Hoje existem ferramentas de Debug muito mais completas.

Com TEST, o programa pode ser analisado sem transformar o código em uma árvore de DISPLAY.


5. Unicode

Durante décadas tudo era EBCDIC.

Hoje recebemos:

  • JSON

  • XML

  • APIs

  • Web

  • Smartphones

  • Emojis

  • Idiomas internacionais

O COBOL moderno suporta Unicode.

Isso significa muito mais integração.

Imagine um banco atendendo clientes no Japão, Brasil e Alemanha.

Tudo utilizando a mesma aplicação.


Curiosidade

Muitos desenvolvedores COBOL nunca perceberam que o Enterprise COBOL moderno possui excelente suporte a Unicode.


6. JSON PARSE

Há alguns anos montar JSON significava algo parecido com isto:

STRING "{"

...

"}"

Muito código.

Muito risco.

Muito difícil de manter.

Hoje basta utilizar:

JSON GENERATE.

Ou

JSON PARSE.

O compilador faz praticamente todo o trabalho.


Isso muda completamente a modernização

Imagine integrar COBOL com:

  • React

  • Angular

  • Flutter

  • Java

  • Python

JSON virou a linguagem universal.


7. XML PARSE

O mesmo aconteceu com XML.

Antes era comum utilizar:

UNSTRING.

INSPECT.

STRING.

Hoje o compilador entende XML nativamente.

Menos código.

Menos bugs.

Mais produtividade.


8. RENT

Talvez uma das opções menos conhecidas pelos iniciantes.

RENT significa:

Reentrant.

Ou seja...

O programa pode ser executado simultaneamente por diversos usuários.

Imagine um banco.

Cinco mil clientes consultando saldo.

O mesmo programa atende todos.

Isso só funciona porque ele foi escrito corretamente.


Dica

Sempre evite gravar informações temporárias em áreas compartilhadas.


9. DYNAM

No passado quase tudo era ligado durante o Link-Edit.

Hoje queremos mais flexibilidade.

CALL dinâmico permite substituir módulos sem reconstruir toda a aplicação.

É um grande aliado em ambientes modernos.


10. EVALUATE

Existe um momento na vida de todo Padawan em que ele escreve isto:

IF
ELSE
IF
ELSE
IF
ELSE

Depois de alguns meses...

Nem ele entende mais.

EVALUATE resolve exatamente isso.

Exemplo:

EVALUATE WS-TIPO

WHEN 1

WHEN 2

WHEN 3

WHEN OTHER

END-EVALUATE

Muito mais limpo.


11. END-IF

Antigamente muitos programas dependiam de ponto final e NEXT SENTENCE.

Isso gerava ambiguidades.

Hoje escrevemos:

IF ...

END-IF

O compilador entende exatamente onde cada bloco termina.


12. Intrinsic Functions

Durante muitos anos criávamos rotinas para tudo.

Hoje o compilador já oferece dezenas de funções.

Exemplos:

FUNCTION CURRENT-DATE

FUNCTION LENGTH

FUNCTION TRIM

FUNCTION LOWER-CASE

FUNCTION UPPER-CASE

Além de deixar o código mais elegante, elas costumam ser mais eficientes.


13. Evitar ALTER

ALTER era considerado brilhante.

Na década de 70.

Hoje virou pesadelo.

Ele altera dinamicamente o fluxo do programa.

Resultado:

  • difícil de entender;

  • difícil de depurar;

  • difícil de otimizar.

Por isso praticamente desapareceu dos novos projetos.


14. Reduzir GO TO

Existe um mito.

GO TO não é proibido.

Mas o excesso dele transforma um programa em um labirinto.

Imagine tentar seguir uma história cuja página seguinte muda aleatoriamente.

É exatamente essa sensação.

PERFORM e EVALUATE tornam o fluxo muito mais claro.


15. Migrar para Enterprise COBOL 6.x

Essa talvez seja a maior evolução dos últimos anos.

O compilador moderno entende muito melhor os processadores IBM Z atuais.

Isso significa:

  • menos CPU;

  • otimizações automáticas;

  • melhores diagnósticos;

  • suporte ampliado a JSON e XML;

  • novas funções intrínsecas.

Em muitos casos, apenas recompilar um programa com ajustes adequados já produz ganhos perceptíveis de desempenho.


16. Pensar em Integração

Esta talvez seja a maior mudança cultural.

Antes escrevíamos programas Batch.

Hoje escrevemos serviços corporativos.

Um programa COBOL pode atender:

  • Mobile Banking

  • Internet Banking

  • PIX

  • APIs REST

  • Java

  • Python

  • Node.js

  • OpenShift

  • Mensageria MQ

O código precisa nascer preparado para esse mundo.


O impacto nos programas antigos

A boa notícia é que a IBM sempre valorizou compatibilidade. Muitos programas escritos há décadas ainda compilam e executam nas versões atuais do Enterprise COBOL.

Isso, porém, não significa que estejam aproveitando os recursos modernos.

É comum encontrar aplicações com:

  • STOP RUN em todos os módulos;

  • dezenas de GO TO;

  • ALTER;

  • manipulação manual de XML e JSON;

  • ausência de verificações de dados;

  • poucas opções de diagnóstico.

Esses programas continuam funcionando, mas tendem a ser mais difíceis de manter, testar e integrar.

Modernizar não significa reescrever tudo. Em muitos casos, basta evoluir gradualmente: substituir comandos antigos, ativar opções do compilador, introduzir funções intrínsecas e organizar melhor o código.


A evolução de um Programador COBOL

Todo desenvolvedor passa por etapas.

Padawan

Aprende a sintaxe.

Consegue compilar.

Resolve problemas.

Programador

Começa a reutilizar código.

Escreve módulos.

Documenta interfaces.

Desenvolvedor Sênior

Pensa em desempenho.

CPU.

Memória.

Escalabilidade.

Arquiteto

Pensa no sistema inteiro.

Integração.

Disponibilidade.

Evolução.

Governança.

Perceba que, à medida que você cresce, a linguagem deixa de ser o foco principal. O importante passa a ser a qualidade das decisões.


O Mainframe moderno

Existe um mito antigo de que o Mainframe "parou no tempo".

Nada poderia estar mais distante da realidade.

Hoje um IBM Z pode:

  • expor APIs REST;

  • consumir serviços externos;

  • executar aplicações Java;

  • trabalhar com contêineres;

  • integrar-se ao OpenShift;

  • processar JSON e XML;

  • utilizar DevOps, Git e pipelines CI/CD;

  • compartilhar dados em tempo real com aplicações distribuídas.

O COBOL moderno acompanha essa evolução. As recomendações da IBM existem justamente para que o código continue relevante nesse novo cenário.


Conclusão

Existe uma frase que resume toda essa evolução:

"O melhor código não é aquele que apenas funciona hoje; é aquele que continuará funcionando, sendo compreendido e evoluído daqui a vinte anos."

As recomendações da IBM não representam uma ruptura com o passado. Elas representam a continuidade de uma filosofia que sempre guiou o Mainframe: estabilidade, desempenho, confiabilidade e evolução gradual.

Trocar STOP RUN por GOBACK, utilizar NUMCHECK, adotar SSRANGE nos testes, explorar JSON PARSE, JSON GENERATE, XML PARSE, RENT, funções intrínsecas e estruturas mais legíveis não é seguir uma moda. É escrever código preparado para um ambiente onde COBOL conversa diariamente com APIs, microsserviços, aplicações móveis e plataformas em nuvem.

Como Programador COBOL Padawan, seu objetivo não deve ser apenas aprender comandos. Deve ser entender por que eles existem, quando utilizá-los e como eles ajudam a construir sistemas capazes de sobreviver por décadas.

No Bellacosa Mainframe, costumamos dizer que a verdadeira modernização não começa com uma nova tecnologia. Ela começa quando o desenvolvedor muda sua forma de pensar. O compilador evolui, o hardware evolui, o IBM Z evolui — e o profissional que acompanha essa jornada deixa de apenas escrever programas para construir soluções que atravessam gerações.


Dos Cartões Perfurados ao Enterprise COBOL: A Evolução do STOP RUN e do GOBACK

 

Bellacosa Mainframe e as diferencas entre o goback e o stop run


Dos Cartões Perfurados ao Enterprise COBOL: A Evolução do STOP RUN e do GOBACK

Essa é uma excelente pergunta, e a resposta curta é:

Hoje, em projetos modernos de Enterprise COBOL para z/OS, a IBM e a maioria das empresas recomendam usar GOBACK em vez de STOP RUN. Não é apenas modismo; existem razões técnicas, arquiteturais e de reutilização do ambiente de execução (Language Environment). (IBM)

Vamos analisar como um arquiteto de Mainframe faria.


A origem do STOP RUN

Quando COBOL surgiu na década de 1960, praticamente todos os programas eram executados diretamente pelo sistema operacional.

O fluxo era simples:

JCL
 │
 ▼
Programa COBOL
 │
STOP RUN
 │
 ▼
MVS

Naquela época:

  • não existiam APIs REST;

  • não existiam aplicações reutilizáveis;

  • praticamente não existiam subprogramas complexos;

  • o programa começava e terminava.

O STOP RUN fazia exatamente isso:

"Acabei. Pode encerrar tudo."


O surgimento do GOBACK

Com o crescimento dos sistemas apareceram:

  • subprogramas

  • bibliotecas

  • módulos reutilizáveis

  • CICS

  • IMS

  • DB2

  • Language Environment (LE)

Agora um programa não era mais necessariamente o "programa principal".

Exemplo:

JCL

  MAIN01

     │

 CALL CLIENTE

     │

 CALL CALCJURO

     │

 CALL VALIDA

Imagine se CALCJURO executasse:

STOP RUN

O que aconteceria?

Toda a aplicação terminaria imediatamente.

Não apenas o módulo.

Todo o Run Unit.

É exatamente isso que a IBM documenta. STOP RUN termina toda a Run Unit; já GOBACK retorna ao chamador quando usado em um programa chamado. (IBM)


A grande diferença

STOP RUN

Programa

↓

encerra TODA a Run Unit

↓

retorna ao sistema operacional

GOBACK

Programa

↓

retorna para quem chamou

↓

continua a execução

Se o programa for o principal:

GOBACK

↓

faz praticamente o mesmo trabalho do STOP RUN

A IBM afirma isso explicitamente:

Em um programa principal, GOBACK funciona como STOP RUN. Em um subprograma, GOBACK funciona como EXIT PROGRAM. (IBM)


Exemplo prático

Programa principal

MAIN
CALL "A"

DISPLAY "FIM"

STOP RUN

Programa A

DISPLAY "A"

STOP RUN

Resultado

A

O DISPLAY "FIM"

nunca acontece.


Agora usando GOBACK

Programa A

DISPLAY "A"

GOBACK

Resultado

A

FIM

Porque voltou para o MAIN.


Então por que muitas empresas proíbem STOP RUN?

Não porque ele esteja errado.

Mas porque ele cria risco.

Imagine um programa hoje.

Batch

↓

Framework

↓

Biblioteca

↓

Serviço

↓

Seu Programa

Você nem sempre sabe quem chamou seu módulo.

Se usar

STOP RUN

você encerra toda a aplicação.

Se usar

GOBACK

o programa simplesmente devolve o controle.

Muito mais seguro.


O princípio da reutilização

Hoje escrevemos programas para serem reutilizados.

Um módulo pode ser chamado por:

  • Batch

  • CICS

  • IMS

  • API REST

  • MQ

  • Java

  • z/OS Connect

  • outro COBOL

O módulo não deve assumir que é o "dono" da aplicação.

Ele apenas faz seu trabalho.

Depois devolve o controle.

Isso é exatamente o comportamento do GOBACK.


O impacto no Language Environment (LE)

Aqui está uma das razões mais importantes.

O Enterprise COBOL roda sobre o Language Environment (LE).

O LE controla:

  • memória

  • pilha

  • heap

  • tratamento de exceções

  • inicialização

  • reutilização do runtime

Quando ocorre

STOP RUN

o LE encerra o Run Unit.

Quando ocorre

GOBACK

ele apenas retorna ao chamador.

Isso permite reutilizar o ambiente de execução em muitos cenários. (IBM)


O caso do RTEREUS

Pouca gente conhece essa opção.

Existe um parâmetro do LE chamado

RTEREUS

(Runtime Reuse)

Ele permite reutilizar o ambiente de execução COBOL.

A IBM afirma claramente:

Para obter os benefícios do RTEREUS, substitua STOP RUN por GOBACK. STOP RUN encerra o ambiente reutilizável. (IBM)

Ou seja:

STOP RUN

↓

destrói o ambiente

↓

novo ambiente precisa ser criado

Enquanto

GOBACK

↓

reutiliza o ambiente

↓

menos overhead

Performance

O ganho normalmente não é enorme em um programa isolado.

Mas imagine milhares de execuções por minuto.

1000 programas

↓

cada um recria o Runtime

↓

mais CPU

Com reutilização:

Runtime permanece ativo

↓

menos inicialização

↓

menos CPU

É exatamente por isso que grandes bancos adotam GOBACK como padrão.


E no CICS?

No CICS normalmente termina-se com

EXEC CICS RETURN

e não com

STOP RUN

porque quem controla a aplicação é o CICS.

O mesmo raciocínio vale para IMS.

O programa devolve o controle ao ambiente.

Não encerra a Run Unit.


Um exemplo interessante: DFSORT

A IBM é ainda mais direta na documentação de user exits do DFSORT:

User exits escritos em COBOL não devem usar STOP RUN. Para retornar ao DFSORT, use GOBACK. (IBM)

Ou seja,

STOP RUN

↓

encerra tudo

↓

ERRADO
GOBACK

↓

retorna ao DFSORT

↓

CORRETO

Existe recomendação oficial da IBM?

Sim.

A documentação oficial afirma que:

  • em programas principais, GOBACK tem o mesmo efeito de STOP RUN;

  • em subprogramas, GOBACK retorna ao chamador, enquanto STOP RUN termina toda a Run Unit. (IBM)

Além disso, para ambientes reutilizáveis (RTEREUS), a IBM recomenda trocar STOP RUN por GOBACK. (IBM)

Documentação oficial da IBM:

Minha recomendação para um COBOL Padawan

Se você está desenvolvendo em Enterprise COBOL moderno, adote esta regra simples:

SituaçãoRecomendação
Programa Batch principalGOBACK
Subprograma (CALL)GOBACK
Biblioteca reutilizávelGOBACK
Módulo chamado por Java, CICS, IMS ou APIsGOBACK
Novo desenvolvimentoGOBACK como padrão

Na prática, GOBACK é um superconjunto de STOP RUN: ele faz o papel de STOP RUN quando está no programa principal e o de EXIT PROGRAM quando está em um programa chamado. Isso reduz riscos, melhora a reutilização do runtime e torna o código mais flexível para arquiteturas modernas. Por esse conjunto de vantagens, a preferência atual por GOBACK é muito mais uma decisão de engenharia do que um simples modismo.

Design Patterns no COBOL Mainframe Os Padrões que os Grandes Programadores Sempre Usaram (Mesmo Antes de Eles Receberem um Nome)

 

Bellacosa Mainframe e os design pattern em cobol mainframe

☕ Um Café no Bellacosa Mainframe

Design Patterns no COBOL Mainframe

Os Padrões que os Grandes Programadores Sempre Usaram (Mesmo Antes de Eles Receberem um Nome)

"Todo programador COBOL iniciante acredita que um bom sistema nasce de um bom código. O programador experiente sabe que um bom sistema nasce de boas decisões de arquitetura."

Existe uma curiosidade fascinante na história da computação.

Quando ouvimos falar em Design Patterns, quase todo mundo lembra imediatamente do famoso livro Design Patterns: Elements of Reusable Object-Oriented Software, publicado em 1994 pelo famoso Gang of Four (GoF).

Muitos acreditam que os padrões nasceram ali.

Mas isso não é verdade.

Na realidade, os profissionais de Mainframe utilizavam padrões muito antes de eles receberem nomes elegantes.

Os sistemas bancários dos anos 70, 80 e 90 já possuíam separação de responsabilidades, reutilização de código, módulos especializados, camadas de acesso a banco, mecanismos de validação, tratamento centralizado de erros, componentes compartilhados e arquiteturas extremamente organizadas.

Eles simplesmente não chamavam isso de Pattern.

Chamavam de:

"Boa programação."

E existe um motivo simples.

Quando um sistema precisa sobreviver por 40 anos, processar bilhões de transações e nunca parar, improvisação não funciona.

É por isso que aprender Patterns em COBOL significa aprender como os grandes sistemas do mundo realmente funcionam.

Hoje vamos explorar essa jornada.

Pegue seu café.

Vamos entrar na mente dos arquitetos que construíram os sistemas que movimentam praticamente todo o dinheiro do planeta.


O que é um Pattern?

Pattern significa literalmente:

Padrão de solução.

Não é código.

Não é framework.

Não é biblioteca.

É uma maneira comprovada de resolver um problema recorrente.

Sempre que um problema aparece repetidamente, alguém encontra uma solução elegante.

Depois de milhares de aplicações, essa solução vira um padrão.


A origem dos Patterns

Antes mesmo da computação, um arquiteto chamado Christopher Alexander estudava cidades e construções.

Ele percebeu algo interessante.

As melhores cidades do mundo utilizavam soluções semelhantes para problemas semelhantes.

Uma praça.

Uma rua.

Uma entrada.

Uma janela.

Tudo seguia padrões.

Em 1977 ele publicou:

A Pattern Language.

Décadas depois, programadores perceberam:

"Software também possui problemas repetitivos."

Assim nasceram os Design Patterns modernos.


Mas... e o Mainframe?

Enquanto isso...

Em grandes bancos...

Seguradoras...

Governos...

Empresas aéreas...

Os analistas já utilizavam exatamente a mesma filosofia.

Um exemplo clássico.

Em vez de cada programa acessar DB2 diretamente...

Criava-se um módulo responsável apenas por isso.

Hoje chamaríamos isso de:

DAO Pattern.

Na época era apenas:

"O módulo que conversa com o banco."


Por que Patterns são importantes?

Imagine um hospital.

Você não quer que cada médico invente sua própria forma de operar.

Existe um procedimento.

Uma sequência.

Uma organização.

Software crítico funciona da mesma forma.

Patterns tornam sistemas:

  • previsíveis

  • fáceis de manter

  • fáceis de evoluir

  • seguros

  • reutilizáveis


Pattern 1 — Modularização

O primeiro pattern da história do Mainframe.

Um programa enorme faz tudo.

Depois de alguns anos...

Ninguém entende mais nada.

A solução?

Separar responsabilidades.

Exemplo:

Programa Principal

Validação

Regras de Negócio

DB2

Relatórios

Logs

Cada módulo possui apenas uma função.

Hoje isso parece óbvio.

Na década de 70 era revolucionário.


Como aplicar

Nunca escreva um programa de 5.000 linhas.

Pergunte:

Esta rotina pode virar um subprograma?

Se a resposta for sim...

Faça isso.


Pattern 2 — COPYBOOK Pattern

Uma das maiores invenções do COBOL.

Em vez de repetir estruturas...

Criamos COPYBOOKS.

Exemplo:

Cliente

Conta

Saldo

Endereço

CPF

Esses campos aparecem em centenas de programas.

Sem COPYBOOK...

Bastaria alterar um campo para criar centenas de inconsistências.

Com COPYBOOK...

Uma alteração.

Todos utilizam.


Boas práticas

Nunca copie estruturas manualmente.

Sempre centralize.


Pattern 3 — Validation Layer

Nunca misture validação com regra de negócio.

Errado:

Recebe CPF

Consulta DB2

Calcula juros

Valida CPF

Atualiza saldo

Tudo misturado.

Certo:

Entrada

Validação

Negócio

Persistência


Benefícios

Código mais limpo.

Testes mais simples.

Menos bugs.


Pattern 4 — Error Handler Centralizado

Um clássico absoluto.

Em vez de cada programa escrever mensagens diferentes...

Existe um módulo especializado.

Exemplo:

DISPLAY

ABEND

LOG

RETURN-CODE

Tudo passa por um componente comum.


Vantagens

Padronização.

Auditoria.

Facilidade de suporte.


Pattern 5 — File Access Layer

Em vez de cada programa abrir arquivos VSAM...

Criamos uma camada.

Programa

Arquivo Layer

VSAM

Se amanhã o arquivo virar DB2...

O programa quase não muda.


Isso é desacoplamento

A lógica de negócio não conhece detalhes físicos.

Esse conceito ficou famoso décadas depois.

No Mainframe já era realidade.


Pattern 6 — Database Access Layer

Muito comum em DB2.

Programa

Subprograma SQL

DB2

O programa não conhece SQL.

Conhece apenas serviços.

Exemplo:

Consultar Cliente

Atualizar Saldo

Inserir Conta

Excluir Registro

Muito semelhante aos Repository Patterns modernos.


Pattern 7 — Service Programs

Grandes empresas possuem centenas de programas.

Algumas regras aparecem em todos.

Cálculo de CPF.

Validação de agência.

Máscara.

Data.

Moeda.

Essas regras viram serviços.


Exemplo

CALL "CALCJURO"

CALL "VALIDCPF"

CALL "FORMATA"

CALL "DATAUTIL"

Isso reduz milhares de linhas duplicadas.


Pattern 8 — Dispatcher

Muito usado em CICS.

Um programa recebe uma operação.

Dependendo da função...

Chama outro programa.

Entrada

Dispatcher

Consulta

Inclusão

Alteração

Exclusão

Hoje chamamos isso de Command Dispatcher.


Pattern 9 — Table Driven Programming

Em vez de dezenas de IF...

Utilize tabelas.

Errado:

IF UF = SP

IF UF = RJ

IF UF = MG

...

Melhor:

Tabela de estados.

Pesquisa.

Resultado.

Menos código.

Mais manutenção.


Pattern 10 — Configuration Pattern

Nunca coloque constantes espalhadas.

Crie parâmetros.

Copybooks.

Arquivos.

Tabelas.

Isso evita recompilar programas para pequenas mudanças.


Pattern 11 — Batch Pipeline

Muito usado em processamento noturno.

Leitura

Validação

Transformação

Classificação

Carga

Cada etapa faz apenas uma coisa.

Se uma falhar...

A anterior permanece íntegra.


Pattern 12 — Restart Pattern

Um dos mais importantes.

Imagine um Batch de 8 horas.

Na hora 7 ocorre falha.

Sem Restart...

Tudo começa novamente.

Com Restart...

Continua do último checkpoint.

Essa ideia economiza milhões de dólares todos os anos.


Pattern 13 — Checkpoint Pattern

Muito usado com IMS.

A cada quantidade de registros...

Grava-se um ponto seguro.

Em caso de falha...

Retorna dali.


Pattern 14 — Logging Pattern

Nunca dependa apenas do DISPLAY.

Registre:

Programa

Data

Hora

Usuário

Arquivo

SQLCODE

Chave

Operação

Isso salva equipes inteiras durante incidentes.


Pattern 15 — Retry Pattern

DB2 indisponível?

Arquivo bloqueado?

MQ ocupado?

Em vez de falhar imediatamente...

Tente novamente algumas vezes.

Mas cuidado.

Retry infinito vira desastre.


Pattern 16 — Circuit Breaker (Modernização)

Muito usado via APIs.

Se um serviço externo está indisponível...

Pare de chamá-lo temporariamente.

Evita sobrecarga.


Pattern 17 — Adapter

Muito utilizado na modernização.

Sistema antigo

Adapter

API REST

O COBOL permanece praticamente igual.


Pattern 18 — Facade

Imagine vinte programas acessando vinte módulos.

Complicado.

Criamos uma fachada.

Programa

Facade

Serviços internos

Tudo fica mais simples.


Pattern 19 — Strategy

O cálculo muda conforme o produto.

Em vez de centenas de IF...

Criamos estratégias.

Produto A

Regra A

Produto B

Regra B

Produto C

Regra C


Pattern 20 — Template Process

Muito comum em Batch.

Todos os programas fazem:

Inicialização

Leitura

Processamento

Gravação

Fechamento

Apenas a lógica muda.

A estrutura permanece.


Como identificar quando usar um Pattern

Faça cinco perguntas:

  1. Estou repetindo código?

  2. Esse módulo possui mais de uma responsabilidade?

  3. Se mudar amanhã, quantos programas serão alterados?

  4. Consigo testar isoladamente?

  5. Outra equipe entenderia isso facilmente?

Se várias respostas forem "não"...

Provavelmente existe um Pattern melhor.


Os erros mais comuns dos iniciantes

O famoso "programa monolítico".

Tudo dentro da PROCEDURE DIVISION.

Milhares de linhas.

GO TO para todos os lados.

Variáveis globais.

DISPLAY espalhados.

SQL misturado.

Validação misturada.

Regras misturadas.

Esse tipo de programa funciona...

Até o primeiro incidente em produção.


Como evoluir como Programador COBOL

Existe uma evolução natural.

Nível 1

Aprende sintaxe.

MOVE.

IF.

PERFORM.

READ.

WRITE.


Nível 2

Aprende organização.

Seções.

Parágrafos.

COPYBOOKS.

Subprogramas.


Nível 3

Aprende Patterns.

Reutilização.

Arquitetura.

Modularização.


Nível 4

Aprende integração.

DB2.

CICS.

IMS.

MQ.

REST.

JSON.


Nível 5

Pensa como arquiteto.

Nesse ponto, você não escreve apenas programas.

Você desenha soluções.


Curiosidades

  • Muitos sistemas bancários escritos há mais de 35 anos continuam ativos porque seguiram padrões consistentes.

  • Diversos conceitos popularizados em Java, C# e outras linguagens já eram praticados em ambientes COBOL, ainda que com nomes diferentes.

  • O uso disciplinado de COPYBOOKS foi um dos fatores que permitiu manter aplicações enormes sincronizadas por décadas.

  • Grandes equipes de Mainframe costumam definir padrões internos de nomenclatura, tratamento de erros, chamadas de subprogramas e acesso a dados para reduzir riscos operacionais.


Melhores práticas para o dia a dia

  • Dê a cada programa uma responsabilidade clara.

  • Evite duplicação de lógica.

  • Centralize estruturas em COPYBOOKS.

  • Padronize mensagens de erro.

  • Isole acesso a arquivos e bancos de dados.

  • Documente interfaces de subprogramas.

  • Use nomes consistentes para programas, parágrafos e variáveis.

  • Escreva código pensando em quem fará a manutenção daqui a dez anos.

  • Prefira simplicidade à esperteza.

  • Revise continuamente seu código procurando oportunidades de extrair novos módulos reutilizáveis.


O futuro dos Patterns no Mainframe

O Mainframe moderno conversa com APIs REST, mensageria, microsserviços, Kubernetes, aplicações Java, Python e serviços em nuvem. Nesse cenário, os Patterns clássicos continuam mais relevantes do que nunca. Adapter, Facade, Retry, Circuit Breaker, Service Layer e Repository ajudam a integrar aplicações COBOL com tecnologias modernas sem sacrificar estabilidade.

O profissional que domina esses conceitos deixa de ser apenas um desenvolvedor de programas e passa a ser um engenheiro de soluções. Ele entende quando reutilizar, quando desacoplar, quando encapsular e quando simplificar. Esse conhecimento vale muito mais do que decorar comandos da linguagem.


Conclusão

Existe uma frase muito conhecida entre arquitetos de software:

"Código ruim pode funcionar. Arquitetura ruim cobra juros."

No universo IBM Z, essa cobrança aparece em horas extras, incidentes de produção, dificuldades de manutenção e projetos de modernização cada vez mais caros.

Os Patterns existem justamente para evitar esse cenário. Eles representam décadas de experiência acumulada por milhares de profissionais que enfrentaram os mesmos problemas e encontraram soluções elegantes, reutilizáveis e seguras.

Se você é um Programador COBOL Padawan, não tente memorizar todos os Patterns de uma vez. Comece pelos mais importantes: modularização, COPYBOOKS, validação, tratamento centralizado de erros, acesso a dados desacoplado e reutilização de serviços. À medida que sua experiência crescer, você perceberá que esses padrões aparecem naturalmente em praticamente todos os grandes sistemas corporativos.

Lembre-se: escrever código é uma habilidade. Escrever código que continuará funcionando e sendo compreendido daqui a vinte anos é uma arte. E essa arte é construída com disciplina, boas práticas e padrões sólidos.

No Bellacosa Mainframe, costumamos dizer que o verdadeiro poder de um Programador COBOL não está na quantidade de comandos que ele conhece, mas na qualidade das decisões que toma antes mesmo de começar a digitar a primeira linha de código.

Esse é o caminho que transforma um Padawan em um verdadeiro Mestre do Mainframe.

Se desejar, posso criar a Parte 2 com mais de 3.000 palavras, abordando 40+ Design Patterns específicos para COBOL, CICS, DB2, IMS, Batch, APIs REST, MQ e modernização no IBM Z, com exemplos completos de código COBOL para cada padrão.


sábado, 13 de junho de 2026

Guard Rails, COBOL, Mainframe, Engenharia de Software, Desenvolvimento COBOL, Sistemas Críticos, Confiabilidade, Governança de TI, DevOps, Arquitetura de Software, Batch Processing, Segurança da Informação, SRE, Boas Práticas, Tecnologia Bancária

 

Bellacosa Mainframe e o guard rails em desenvolvimento de software

Guard Rails: A Arte de Impedir que um Desenvolvedor Derrube o Banco

Uma conversa que todo desenvolvedor COBOL deveria ter

Imagine a seguinte situação.

Você acabou de entrar em uma instituição financeira.

É seu terceiro mês como desenvolvedor COBOL.

Depois de semanas corrigindo pequenos bugs, finalmente recebe uma tarefa importante.

Uma rotina responsável pelo envio de notificações para clientes.

O gerente explica:

— Precisamos incluir um novo tipo de comunicação.

Você faz a alteração.

Compila.

Executa os testes.

Tudo parece funcionar.

A mudança é promovida para produção.

Horas depois, milhares de clientes recebem uma mensagem errada.

O call center entra em colapso.

O aplicativo registra picos de acesso.

O time de negócios inicia uma reunião de emergência.

A diretoria quer explicações.

E então surge a pergunta:

Como isso foi possível?

A resposta geralmente não é:

"Porque o desenvolvedor errou."

A resposta correta costuma ser:

"Porque o sistema permitiu que um erro chegasse à produção."

É exatamente nesse ponto que surge um dos conceitos mais importantes da engenharia moderna:

Guard Rails.


O que são Guard Rails?

A tradução literal seria:

"trilhos de proteção".

A inspiração vem das rodovias.

Quando um carro sai da pista, existe uma barreira metálica para impedir que ele caia de um penhasco.

O guard rail não evita o erro do motorista.

Ele reduz as consequências.

Na engenharia de software acontece exatamente a mesma coisa.

Os desenvolvedores inevitavelmente cometerão erros.

Os analistas inevitavelmente esquecerão requisitos.

Os operadores inevitavelmente clicarão em algo errado.

Os administradores inevitavelmente executarão comandos incorretos.

O objetivo não é eliminar o erro humano.

O objetivo é impedir que o erro se transforme em desastre.


O erro é inevitável

Desenvolvedores juniores costumam acreditar que sistemas caem porque alguém não sabia programar.

Essa visão desaparece rapidamente em ambientes corporativos.

Os maiores incidentes da história da tecnologia não foram causados por programadores incompetentes.

Foram causados por profissionais experientes trabalhando sob pressão.

Pessoas excelentes.

Pessoas inteligentes.

Pessoas treinadas.

Pessoas humanas.

A questão nunca foi:

"Quem errou?"

A questão sempre foi:

"Por que o sistema permitiu?"

Essa diferença muda completamente a forma de construir software.


Um exemplo COBOL simples

Considere um programa que realiza transferência bancária.

Versão sem Guard Rails:

IF SALDO-CONTA > 0
   SUBTRACT VALOR FROM SALDO-CONTA
END-IF.

Parece correto.

Mas existe um problema.

Suponha:

Saldo = 100

Transferência = 1000

O programa permitirá saldo negativo.

Agora uma versão mais segura.

IF VALOR > SALDO-CONTA
   DISPLAY "TRANSFERENCIA NEGADA"
   GO TO FIM-PROGRAMA
END-IF.

O sistema agora protege o negócio.

Isso é um Guard Rail.


Guard Rail não é regra de negócio

Esse é um erro comum.

Muitos desenvolvedores confundem os dois conceitos.

Regra de negócio:

"O cliente não pode sacar mais que possui."

Guard Rail:

"Mesmo que alguém esqueça a regra, o sistema impedirá a operação."

Uma regra define comportamento.

Um Guard Rail protege comportamento.


A filosofia do mainframe

Durante décadas, os ambientes mainframe desenvolveram uma cultura diferente do mundo moderno.

Em startups existe uma frase famosa:

Move fast.

Nos bancos existe outra:

Don't break production.

A razão é simples.

Um erro em rede social gera reclamações.

Um erro bancário gera prejuízo.

Por isso o mundo COBOL sempre valorizou:

  • validação;

  • redundância;

  • auditoria;

  • segregação;

  • rastreabilidade.

Sem perceber, os ambientes mainframe implementavam Guard Rails muito antes do conceito ganhar popularidade.


O caso clássico do JCL

Todo profissional de mainframe já ouviu histórias de horror envolvendo JCL.

Imagine um dataset:

CLIENTES.PRODUCAO

Agora imagine um utilitário de exclusão.

DELETE CLIENTES.PRODUCAO

Um comando simples.

Um erro simples.

Um desastre gigantesco.

Por isso empresas maduras criam Guard Rails.

Por exemplo:

  • confirmação obrigatória;

  • aprovação dupla;

  • ambiente segregado;

  • backup automático.

A exclusão continua possível.

Mas torna-se muito mais difícil.


O princípio do “Are You Sure?”

Existe uma categoria inteira de Guard Rails baseada em confirmação.

Exemplo.

Você tenta apagar um arquivo.

O sistema pergunta:

"Tem certeza?"

Parece algo trivial.

Mas essa simples pergunta já evitou milhões de erros ao longo da história da computação.

Em sistemas financeiros essa ideia evolui.

Em vez de uma confirmação:

  • duas confirmações;

  • dois operadores;

  • dois gestores;

  • duas aprovações.

Chamamos isso de Four Eyes Principle.

Princípio dos quatro olhos.


Guard Rails em processamento batch

O universo COBOL vive cercado de batches.

Folha de pagamento.

Compensação bancária.

Fechamento contábil.

Liquidação financeira.

Imagine um programa que processa:

10.000 registros

Normal.

Agora imagine:

100 milhões de registros

Algo está errado.

Sem Guard Rails o programa continua.

Com Guard Rails ele interrompe:

IF QTDE-REGISTROS > LIMITE-MAXIMO
   DISPLAY "PROCESSAMENTO ANORMAL"
   ABEND
END-IF.

Esse simples teste pode evitar horas de caos operacional.


O conceito de Fail Fast

Existe um princípio muito importante:

Fail Fast.

Falhe rapidamente.

Muitos sistemas tentam continuar funcionando mesmo após identificar inconsistências.

Isso parece inteligente.

Na prática costuma piorar tudo.

Se um dado crítico estiver errado, o melhor comportamento é parar imediatamente.

Exemplo:

IF CODIGO-CLIENTE = SPACES
   ABEND
END-IF.

Parar cedo é melhor do que produzir milhões de registros incorretos.


Guard Rails contra desenvolvedores

Esse é um tema que incomoda iniciantes.

Ninguém gosta de ouvir:

"O sistema precisa proteger a empresa de você."

Mas essa é a realidade.

Um Guard Rail existe justamente porque até profissionais excelentes erram.

Imagine um comando SQL.

Sem proteção:

DELETE FROM CLIENTES;

Com proteção:

DELETE FROM CLIENTES
WHERE ID = :CLIENTE;

Ou ainda melhor.

Permissão somente leitura em produção.

O desenvolvedor continua competente.

O ambiente apenas se torna mais seguro.


O incidente do Nubank e os Guard Rails

O caso do falso aviso de liquidação tornou-se um exemplo interessante.

Independentemente dos detalhes internos, uma pergunta surgiu:

Como uma comunicação tão crítica chegou aos clientes?

A resposta provavelmente envolve ausência ou falha de Guard Rails.

Por exemplo:

  • validação insuficiente;

  • aprovação inadequada;

  • rollout inexistente;

  • testes incompletos.

Nenhum sistema deveria conseguir informar a liquidação de um banco sem múltiplas camadas de proteção.


Rollout gradual

Imagine um envio para:

50 milhões de clientes

Sem Guard Rail:

envio imediato.

Com Guard Rail:

1% da base.

Validação.

5%.

Validação.

10%.

Validação.

100%.

Empresas como Google, Amazon e Netflix utilizam esse modelo constantemente.

O objetivo é reduzir o raio da explosão.


Blast Radius

Todo arquiteto experiente faz uma pergunta.

Se isso falhar, quantas pessoas serão afetadas?

Chamamos isso de Blast Radius.

Raio de explosão.

Exemplo.

Erro em um batch:

Impacto:

500 clientes.

Blast Radius pequeno.

Erro em compensação nacional:

Impacto:

50 milhões de clientes.

Blast Radius enorme.

Guard Rails existem para reduzir esse raio.


Observabilidade também é Guard Rail

Muitos desenvolvedores acreditam que Guard Rails são apenas validações.

Não.

Monitoramento também é proteção.

Imagine:

Processamento esperado:

1000 transações por minuto

Sistema detecta:

500.000 transações por minuto

Algo claramente está errado.

Um bom sistema dispara alarmes.

Isso também é Guard Rail.


O conceito de Circuit Breaker

Em sistemas distribuídos modernos existe outro Guard Rail famoso.

Circuit Breaker.

Inspirado nos disjuntores elétricos.

Se uma dependência começa a falhar:

o sistema corta a conexão.

Em vez de derrubar tudo.

No mundo mainframe encontramos equivalentes há décadas:

  • limites operacionais;

  • interrupções controladas;

  • filas protegidas;

  • rejeições automáticas.

A ideia é a mesma.

Conter danos.


O erro mais caro é o silencioso

Existe uma frase conhecida entre engenheiros de confiabilidade:

Sistemas barulhentos são irritantes.

Sistemas silenciosamente errados são perigosos.

Um programa que falha imediatamente chama atenção.

Um programa que produz dados incorretos durante três dias pode gerar prejuízos gigantescos.

Por isso Guard Rails modernos privilegiam transparência.

Tudo deve ser:

  • registrado;

  • monitorado;

  • auditado;

  • rastreável.


A maturidade profissional

Existe um momento na carreira em que o desenvolvedor deixa de pensar:

"Meu código funciona."

E começa a pensar:

"O que acontece quando ele falhar?"

Essa mudança separa programadores iniciantes de engenheiros experientes.

O foco deixa de ser funcionalidade.

Passa a ser confiabilidade.


O que um desenvolvedor COBOL Jr deve fazer

Sempre pergunte:

O que pode dar errado?

Quem será impactado?

Existe limite operacional?

Existe validação?

Existe rollback?

Existe auditoria?

Existe monitoramento?

Existe aprovação?

Existe segregação?

Existe plano de contingência?

Se alguma resposta for "não sei", continue investigando.


A grande lição

Guard Rails não existem porque desenvolvedores são ruins.

Eles existem porque sistemas são complexos.

Quanto maior a empresa, mais perigoso se torna assumir que ninguém cometerá erros.

O verdadeiro papel da engenharia não é criar sistemas perfeitos.

É criar sistemas resilientes.

Sistemas que sobrevivam a erros humanos.

Sistemas que sobrevivam a falhas operacionais.

Sistemas que sobrevivam a decisões equivocadas.

No universo bancário, onde bilhões de reais transitam diariamente por programas COBOL escritos ao longo de décadas, essa diferença não é apenas uma questão técnica.

É uma questão de sobrevivência operacional.

E talvez a principal lição para qualquer desenvolvedor COBOL Jr seja esta:

Seu trabalho não é apenas fazer o programa funcionar.

Seu trabalho é impedir que ele cause danos quando inevitavelmente algo der errado.

Esse é o verdadeiro significado de Guard Rails.


domingo, 2 de fevereiro de 2025

🥋 Laboratório COBOL para Padawans Do Zero ao Primeiro Jedi do Batch

 

Bellacosa Mainframe apresenta laboratorio inicial para padawan cobol

🥋 Laboratório COBOL para Padawans

Do Zero ao Primeiro Jedi do Batch

Este laboratório foi criado para alguém que nunca programou em COBOL. Os exercícios são progressivos e apresentam conceitos, sintaxe, boas práticas, armadilhas comuns e soluções comentadas.

Objetivo:

  • Aprender sintaxe COBOL

  • Escrever programas simples

  • Compreender variáveis

  • Utilizar DISPLAY

  • Aprender IF, PERFORM, EVALUATE

  • Trabalhar com tabelas OCCURS

  • Evitar erros comuns

  • Pensar como um desenvolvedor Mainframe


Laboratório 1 – Seu primeiro programa

Objetivo

Entender estrutura COBOL.

IDENTIFICATION DIVISION.
PROGRAM-ID. LAB001.

PROCEDURE DIVISION.

    DISPLAY 'OLA PADAWAN'.

    STOP RUN.

O que aprendemos

  • DIVISION

  • PROGRAM-ID

  • DISPLAY

  • STOP RUN


Armadilhas

Esquecer:

STOP RUN.

faz o programa terminar de maneira inadequada.


Laboratório 2 – Variáveis

Objetivo

Criar variáveis.

WORKING-STORAGE SECTION.

01 WS-NOME PIC X(20).
01 WS-IDADE PIC 99.

Programa


MOVE 'VAGNER' TO WS-NOME.
MOVE 52 TO WS-IDADE.


DISPLAY WS-NOME.
DISPLAY WS-IDADE.

Boas práticas

Prefixo WS

WS-NOME
WS-SALARIO
WS-TOTAL

Evite

NOME
X1
ABC

Laboratório 3 – MOVE

Objetivo

Copiar dados.

MOVE 100 TO WS-VALOR.
MOVE WS-VALOR TO WS-TOTAL.

Erro comum

Mover texto para campo numérico

Errado

MOVE 'ABC' TO WS-IDADE.

Laboratório 4 – ACCEPT

Ler teclado.


DISPLAY 'DIGITE SEU NOME'.

ACCEPT WS-NOME.



DISPLAY WS-NOME.

Laboratório 5 – Soma

Objetivo

Calcular.


01 A PIC 999.
01 B PIC 999.
01 C PIC 9999.



ADD A B GIVING C.



DISPLAY C.

Alternativa

COMPUTE C=A+B.

Laboratório 6 – Subtração


SUBTRACT A FROM B.


DISPLAY B.

Laboratório 7 – Multiplicação


MULTIPLY A BY B.


DISPLAY B.

Laboratório 8 – Divisão


DIVIDE A INTO B.


DISPLAY B.

Melhor

DIVIDE A INTO B GIVING C.

Laboratório 9 – IF

Objetivo

Decisão.



IF WS-IDADE >=18

   DISPLAY 'MAIOR'

ELSE

   DISPLAY 'MENOR'

END-IF.

Boa prática

Sempre

END-IF

Laboratório 10 – IF aninhado



IF IDADE >60

   DISPLAY 'IDOSO'

ELSE

   IF IDADE >=18

      DISPLAY 'ADULTO'

   ELSE

      DISPLAY 'MENOR'

   END-IF

END-IF.

Laboratório 11 – EVALUATE

Mais elegante.


EVALUATE NOTA

WHEN 10
 DISPLAY 'EXCELENTE'

WHEN 8
 DISPLAY 'OTIMO'

WHEN OTHER
 DISPLAY 'ESTUDAR'

END-EVALUATE.

É o SWITCH do COBOL.


Laboratório 12 – PERFORM

Criando parágrafos.


PERFORM MOSTRAR.



MOSTRAR.

DISPLAY 'OLA'.

Boa prática

Dividir lógica.

Não fazer:

500 linhas seguidas.


Laboratório 13 – PERFORM TIMES



PERFORM 5 TIMES

 DISPLAY 'COBOL'

END-PERFORM.

Laboratório 14 – PERFORM UNTIL



MOVE 1 TO I.



PERFORM UNTIL I >5


DISPLAY I


ADD 1 TO I


END-PERFORM.

Resultado

1

2

3

4

5


Laboratório 15 – Tabelas OCCURS


01 WS-NUMEROS.

   05 WS-NUM OCCURS 5 TIMES PIC 999.

Preenchendo



MOVE 10 TO WS-NUM(1).

MOVE 20 TO WS-NUM(2).

MOVE 30 TO WS-NUM(3).

Laboratório 16 – Percorrer tabela


01 I PIC 9.


PERFORM VARYING I FROM 1 BY 1 UNTIL I >5


DISPLAY WS-NUM(I)


END-PERFORM.

Muito usado em produção.


Laboratório 17 – Strings


STRING

'NOME='

WS-NOME


DELIMITED BY SPACE


INTO WS-SAIDA.



DISPLAY WS-SAIDA.

Laboratório 18 – INSPECT

Contar letras.



INSPECT WS-TEXTO

TALLYING WS-QTD

FOR ALL 'A'.

Laboratório 19 – Inicialização


INITIALIZE REGISTRO.

Substitui:


MOVE SPACES TO REGISTRO.

MOVE ZEROS TO REGISTRO.

Laboratório 20 – Mini Projeto Final

Cadastro simples

Menu

1-Incluir

2-Consultar

3-Sair

Variáveis


01 OPCAO PIC 9.

01 NOME PIC X(30).

01 IDADE PIC 99.

Fluxo



PERFORM UNTIL OPCAO=3


DISPLAY MENU


ACCEPT OPCAO


EVALUATE OPCAO


WHEN 1

PERFORM INCLUIR


WHEN 2

PERFORM CONSULTAR


WHEN 3

DISPLAY 'ATE LOGO'


WHEN OTHER

DISPLAY 'INVALIDO'


END-EVALUATE


END-PERFORM.

📚 Erros Mais Comuns do Padawan COBOL

ErroProblema
Esquecer ponto finalCompilação falha
Não usar END-IFCódigo confuso
Índice fora do OCCURSABEND
Mover texto para PIC 9Dados inválidos
Divisão por zeroS0CB
Variável não inicializadaResultado imprevisível
Não usar GIVINGSobrescreve dados
PERFORM infinitoLoop sem fim
Nomes genéricosManutenção difícil
Misturar lógica em um único parágrafoCódigo espaguete

🎓 Checklist do Padawan COBOL

Ao concluir os 20 laboratórios, o aluno deverá saber:

✅ Criar programas COBOL
✅ Declarar variáveis
✅ Usar PIC X e PIC 9
✅ Fazer cálculos
✅ Receber dados com ACCEPT
✅ Exibir informações com DISPLAY
✅ Trabalhar com IF e EVALUATE
✅ Criar laços com PERFORM
✅ Utilizar OCCURS
✅ Manipular strings
✅ Inicializar estruturas
✅ Identificar erros comuns
✅ Desenvolver pequenos programas estruturados
✅ Aplicar boas práticas de nomenclatura e modularização

Este conjunto de laboratórios fornece uma base sólida para avançar posteriormente para arquivos sequenciais, VSAM, JCL, DB2, CICS e desenvolvimento COBOL empresarial em IBM z/OS.


Apresentação do Laboratório COBOL para Padawans

Este laboratório foi concebido para desenvolvedores iniciantes que desejam aprender COBOL de maneira prática, gradual e estruturada. O principal objetivo é fornecer uma base sólida sobre a linguagem, permitindo que o estudante compreenda sua sintaxe, suas instruções fundamentais e as boas práticas utilizadas em ambientes corporativos, especialmente no ecossistema IBM Z.

A didática adotada é baseada em pequenos desafios progressivos, nos quais cada exercício apresenta um conceito novo, seguido por uma solução comentada, observações sobre armadilhas comuns e recomendações de codificação. Essa abordagem reduz a curva de aprendizado, incentiva a experimentação e ajuda o aluno a desenvolver confiança ao escrever seus primeiros programas.

COBOL é uma linguagem predominantemente associada ao paradigma de programação estruturada e procedural. Seu modelo enfatiza a decomposição do problema em etapas sequenciais, a modularização por meio de parágrafos e seções, além do uso de estruturas de decisão e repetição claramente definidas. Essa característica torna a linguagem particularmente adequada para o processamento de regras de negócio, cálculos financeiros e sistemas transacionais de grande porte.

Realizar este laboratório permite ao estudante adquirir fundamentos essenciais antes de avançar para tópicos mais complexos, como manipulação de arquivos, JCL, VSAM, DB2, CICS e modernização de aplicações. Mais do que aprender comandos, o participante desenvolve uma mentalidade disciplinada de desenvolvimento, manutenção e qualidade de software, altamente valorizada no mercado de tecnologia corporativa.


quinta-feira, 26 de setembro de 2024

O Guia Definitivo de Boas Práticas para Declarar Variáveis em COBOL Mainframe como os Grandes Bancos Fazem

 

Bellacosa Mainframe e o data division sem misterios

☕ Um Café no Bellacosa Mainframe

Data Division sem Mistérios

O Guia Definitivo de Boas Práticas para Declarar Variáveis em COBOL Mainframe como os Grandes Bancos Fazem

"Um programa COBOL raramente falha porque alguém escreveu um IF errado. Ele costuma falhar porque alguém declarou uma variável errada há vinte anos."


Introdução

Existe um velho ditado entre programadores de mainframe:

"O Procedure Division executa. A Data Division pensa."

Pode parecer exagero, mas basta passar alguns meses trabalhando em um grande banco para perceber que isso é verdade.

Quando um programa COBOL possui milhares de linhas, dezenas de interfaces, centenas de arquivos VSAM, tabelas DB2, chamadas CICS e APIs REST, o verdadeiro segredo não está apenas na lógica.

Está na organização dos dados.

É justamente por isso que os maiores bancos brasileiros possuem padrões extremamente rígidos para a Data Division.

Em muitos lugares, uma variável mal declarada simplesmente não passa pela revisão de código.

Neste artigo vamos aprender como profissionais experientes organizam suas variáveis, entender o motivo dessas regras existirem e descobrir como escrever programas que continuam fáceis de manter mesmo depois de décadas.

Pegue seu café.

Vamos organizar nossa memória principal.


Antes de falar de variáveis...

Imagine construir um prédio.

Você pode contratar o melhor pedreiro do mundo.

Se o engenheiro desenhar uma planta ruim, o prédio será um caos.

No COBOL acontece exatamente isso.

A Data Division é a planta do edifício.

A Procedure Division apenas utiliza aquilo que foi planejado.

Quanto melhor for sua estrutura de dados, mais simples será escrever toda a lógica do programa.


A filosofia dos grandes bancos

Em bancos, normalmente existem padrões semelhantes a estes:

  • nomes padronizados

  • agrupamentos claros

  • nenhuma variável "solta"

  • documentação implícita

  • facilidade para debug

  • facilidade para manutenção

  • reaproveitamento

O objetivo nunca é escrever menos.

É escrever melhor.


A estrutura clássica

Normalmente encontramos algo parecido.

WORKING-STORAGE SECTION.

01 WS-CONTROLE.

01 WS-ENTRADA.

01 WS-SAIDA.

01 WS-CALCULOS.

01 WS-INDICADORES.

01 WS-CONSTANTES.

01 WS-TABELAS.

01 WS-AREAS-DE-TRABALHO.

Só olhando os nomes já sabemos onde procurar qualquer informação.

Essa organização economiza horas de manutenção.


Prefixos fazem diferença

Um dos maiores erros de iniciantes é escrever:

01 NOME.
01 CPF.
01 IDADE.
01 TOTAL.

Imagine um programa com 8.000 variáveis.

Boa sorte.

Os grandes bancos normalmente utilizam prefixos.

WS-NOME
WS-CPF
WS-IDADE
WS-TOTAL

WS significa:

Working Storage.

Quando existem outras áreas:

LK-
DFHCOMMAREA
LS-
CS-
SQL-

Exemplo:

WS-CLIENTE

LK-CLIENTE

LS-CLIENTE

SQL-CLIENTE

Cada uma pertence a uma área diferente.

O nome já explica sua origem.


Nunca use nomes genéricos

Evite:

WS-AUX

WS-TEMP

WS-X

WS-DADOS

WS-AREA

WS-TESTE

Isso não explica absolutamente nada.

Prefira:

WS-SALDO-ATUAL

WS-VALOR-LIMITE

WS-TOTAL-PARCELAS

WS-QTD-CLIENTES

WS-DATA-PROCESSAMENTO

Quem ler o programa daqui a vinte anos agradecerá.


O padrão VERBO + OBJETO

Muitos bancos gostam de indicar o significado da variável.

Exemplo:

WS-QTD-PRODUTOS

WS-VLR-TOTAL

WS-DT-NASCIMENTO

WS-HR-PROCESSAMENTO

WS-FL-ATIVO

WS-CD-AGENCIA

WS-NR-CONTA

Observe as abreviações.

PrefixoSignificado
DTData
HRHora
FLFlag
CDCódigo
NRNúmero
QTDQuantidade
VLRValor
INDIndicador
TPTipo
DESCDescrição

Essas abreviações praticamente viraram um idioma próprio do mercado financeiro.


Os níveis da Data Division

Agora chegamos ao coração do COBOL.

Os famosos Levels.


Level 01

Representa um registro completo.

01 WS-CLIENTE.

Pense nele como uma pasta.

Dentro dela existirão documentos.


Level 05

Representa divisões principais.

01 WS-CLIENTE.

   05 WS-NOME.

   05 WS-CPF.

   05 WS-ENDERECO.

É o nível mais utilizado.


Level 10

Subdivisão.

05 WS-ENDERECO.

   10 WS-RUA.

   10 WS-NUMERO.

   10 WS-BAIRRO.

Level 15, 20, 25...

São apenas níveis hierárquicos.

01 CLIENTE

   05 ENDERECO

      10 CIDADE

         15 CEP

O COBOL não exige números específicos.

Apenas respeita a hierarquia.

Na prática, porém, muitos bancos adotam:

01

05

10

15

20

para manter um padrão visual.


Quando usar Level 77?

No passado era comum.

77 WS-CONTADOR PIC 9(4).

Hoje praticamente todos utilizam:

01 WS-CONTADOR PIC 9(4).

Ou agrupam dentro de áreas.

O uso do 77 tornou-se raro em novos projetos.


O poderoso Level 88

Um dos recursos mais elegantes do COBOL.

Imagine isso.

05 WS-STATUS PIC X.

88 WS-ATIVO VALUE "A".

88 WS-INATIVO VALUE "I".

Depois:

IF WS-ATIVO

Muito melhor que:

IF WS-STATUS = "A"

O código praticamente se transforma em português.

Outro exemplo.

88 WS-SIM VALUE "S".

88 WS-NAO VALUE "N".

Ou ainda:

88 WS-CONTA-CORRENTE VALUE "01".

88 WS-CONTA-POUPANCA VALUE "02".

Esse recurso é amplamente utilizado em bancos.


Agrupe informações relacionadas

Errado:

WS-NOME

WS-CPF

WS-RUA

WS-SALDO

WS-IDADE

WS-CIDADE

Correto.

01 WS-CLIENTE.

   05 WS-NOME.

   05 WS-CPF.

   05 WS-ENDERECO.

      10 WS-RUA.

      10 WS-CIDADE.

   05 WS-SALDO.

A estrutura fica muito mais intuitiva.


REDEFINES

Poucos recursos são tão poderosos.

Imagine um arquivo.

1234567890

Pode representar:

CPF

ou

Código interno

Não faz sentido duplicar memória.

Usamos:

01 WS-AREA.

   05 WS-DADOS PIC X(10).

01 WS-CPF REDEFINES WS-DADOS.

   05 WS-NUMERO PIC 9(10).

A memória é exatamente a mesma.

Apenas muda a interpretação.


Onde bancos usam REDEFINES?

Muito frequentemente em:

  • layouts CNAB

  • buffers CICS

  • mensagens MQ

  • áreas de comunicação

  • protocolos

  • APIs

  • conversões numéricas

  • interpretação de bytes


Cuidados com REDEFINES

Nunca faça isso sem entender o layout.

Porque alterar uma redefinição altera todas.

É literalmente a mesma memória.


RENAMES

Pouca gente conhece.

Exemplo.

01 WS-REGISTRO.

   05 WS-NOME.

   05 WS-ENDERECO.

   05 WS-CIDADE.

66 WS-DADOS-CADASTRAIS
RENAMES WS-NOME THRU WS-CIDADE.

Agora podemos manipular todo esse trecho como um único grupo lógico.

Hoje aparece menos que REDEFINES, mas ainda existe em sistemas legados e alguns frameworks internos.


CONSTANTES

Nunca escreva:

IF WS-TIPO = "A"

Prefira:

78 ATIVO VALUE "A".

IF WS-TIPO = ATIVO

Ou

01 WS-CONSTANTES.

   05 WS-TP-ATIVO VALUE "A".

   05 WS-TP-INATIVO VALUE "I".

O significado fica explícito.


PIC correto faz diferença

Texto.

PIC X(30)

Numérico.

PIC 9(5)

Decimal.

PIC S9(9)V99 COMP-3

Valor monetário.

PIC S9(11)V99 COMP-3

Nunca utilize texto para armazenar números quando eles serão calculados.


COMP, COMP-3 e DISPLAY

Nos bancos é comum encontrar a seguinte estratégia:

DISPLAY

para entrada e saída.

COMP

para cálculos inteiros.

COMP-3

para valores financeiros.

Exemplo.

05 WS-SALDO
PIC S9(11)V99 COMP-3.

Além de economizar espaço, melhora desempenho e precisão decimal.


Inicialização

Sempre inicialize.

VALUE ZERO.

VALUE SPACES.

VALUE LOW-VALUES.

VALUE HIGH-VALUES.

Ou utilize

INITIALIZE

Evite depender do conteúdo anterior da memória.


Um erro clássico

05 WS-NOME PIC X(30).

Depois.

MOVE "JOAO" TO WS-NOME

Comparação.

IF WS-NOME = "JOAO"

Pode funcionar.

Pode não funcionar.

Por quê?

Porque existem espaços restantes.

Muitos bancos utilizam:

FUNCTION TRIM

ou

INSPECT

para evitar problemas.


Tabelas OCCURS

Sempre nomeie corretamente.

05 WS-CLIENTES OCCURS 100 TIMES.

   10 WS-NOME.

   10 WS-SALDO.

Índices separados.

77 WS-IDX PIC S9(4) COMP.

Ou

INDEXED BY IDX-CLIENTE

Muito mais eficiente.


Evite mágicas

Nunca faça:

MOVE 1 TO WS-X.

Depois.

IF WS-X = 1

Prefira.

88 WS-PROCESSADO VALUE 1.

Muito mais legível.


Organização visual

Bancos normalmente alinham tudo.

05 WS-NOME            PIC X(40).

05 WS-CPF             PIC 9(11).

05 WS-SALDO           PIC S9(09)V99 COMP-3.

05 WS-DATA-NASC       PIC 9(08).

Pode parecer detalhe.

Mas melhora muito a leitura.


Comentários úteis

Evite.

* Nome.

Prefira.

* Dados recebidos do cadastro central.

* Área utilizada para integração com PIX.

* Buffer utilizado pelo CICS.

Explique o motivo.

Não o óbvio.


╔══════════════════════════════════════════════════════════════════════╗
║                     COBOL DATA DIVISION                             ║
║               "Tudo começa pelos dados."                            ║
╚══════════════════════════════════════════════════════════════════════╝

                       PROGRAMA COBOL
                             │
                             ▼
                  WORKING-STORAGE SECTION
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
        ▼                    ▼                    ▼
   WS-CONTROLE          WS-ENTRADA          WS-SAÍDA
        │                    │                    │
        ▼                    ▼                    ▼
     Variáveis           Arquivos           Resultados
     de Trabalho         Entrada            Processados



              Hierarquia dos Levels (Níveis)

01 WS-CLIENTE
│
├──05 WS-DADOS-PESSOAIS
│    ├──10 WS-NOME
│    ├──10 WS-CPF
│    └──10 WS-DATA-NASCIMENTO
│
├──05 WS-ENDERECO
│    ├──10 WS-RUA
│    ├──10 WS-NUMERO
│    ├──10 WS-CIDADE
│    └──10 WS-CEP
│
└──05 WS-DADOS-BANCARIOS
     ├──10 WS-AGENCIA
     ├──10 WS-CONTA
     └──10 WS-SALDO


             Quanto maior o nível...
                   menor o detalhe.

        01  → Registro completo
        05  → Grupo principal
        10  → Campo
        15  → Subcampo
        20+ → Especializações



                Organização Recomendada

                 +-------------------+
                 |   01 WS-CLIENTE   |
                 +-------------------+
                          │
          ┌───────────────┼───────────────┐
          ▼               ▼               ▼
     IDENTIFICAÇÃO    ENDEREÇO       FINANCEIRO
          │               │               │
          ▼               ▼               ▼
     CPF / Nome      Rua / CEP     Conta / Saldo



                Prefixos Mais Utilizados

WS-  → Working Storage
LK-  → Linkage Section
LS-  → Local Storage
DFH- → CICS
SQL- → DB2
IX-  → Índice
CT-  → Constante
FL-  → Flag
TP-  → Tipo
DT-  → Data
HR-  → Hora
NR-  → Número
CD-  → Código
VLR- → Valor
QTD- → Quantidade



            REDEFINES (Mesma memória)

          +-------------------------+
          |      WS-DADOS           |
          |        X(20)            |
          +-------------------------+
                    ▲
                    │
         REDEFINES  │
                    │
          +-------------------------+
          |       WS-CPF            |
          |        9(20)            |
          +-------------------------+

      Uma única área de memória.
      Duas interpretações diferentes.



             RENAMES (Grupo Lógico)

01 WS-REGISTRO
│
├──05 WS-NOME
├──05 WS-ENDERECO
├──05 WS-CIDADE
└──05 WS-CEP

          │
          ▼

66 WS-DADOS-CADASTRAIS
   RENAMES WS-NOME THRU WS-CEP



             Nível 88 (Legibilidade)

        +-------------------+
        | WS-STATUS    PIC X|
        +-------------------+
               │
        ┌──────┴──────┐
        ▼             ▼
88 WS-ATIVO      88 WS-INATIVO
 VALUE "A"         VALUE "I"

Ao invés de:

IF STATUS = "A"

Escrevemos:

IF WS-ATIVO



              O Fluxo de uma Variável

 Declaração
      │
      ▼
 Inicialização
      │
      ▼
 Validação
      │
      ▼
 Processamento
      │
      ▼
 Saída
      │
      ▼
 Encerramento



      O que um iniciante costuma fazer...

WS-X
WS-AUX
WS-TEMP
WS-AREA
WS-DADOS

                 😢



      O que um profissional faz...

WS-VLR-SALDO-ATUAL
WS-DT-PROCESSAMENTO
WS-QTD-CLIENTES
WS-FL-CONTA-ATIVA
WS-CD-AGENCIA

                 😎



╔════════════════════════════════════════════════════════════╗
║ "Programas envelhecem. Dados permanecem."                 ║
║                                                           ║
║ Quanto melhor a Data Division...                          ║
║ ...mais simples será todo o restante do programa.         ║
╚════════════════════════════════════════════════════════════╝ .


Os erros mais comuns dos iniciantes

  • Variáveis com nomes sem significado.

  • Misturar entrada, saída e trabalho na mesma área.

  • Não utilizar grupos.

  • Declarar tudo como PIC X.

  • Ignorar COMP-3 para valores monetários.

  • Não utilizar nível 88.

  • Criar dezenas de variáveis AUX.

  • Usar REDEFINES sem conhecer o layout.

  • Não inicializar variáveis.

  • Declarar estruturas sem padronização.

  • Copiar layouts diferentes para a mesma área.

  • Esquecer alinhamento e organização.


O estado da arte em 2024

Embora o COBOL tenha mais de seis décadas, a Data Division continua evoluindo.

Nos ambientes modernos do IBM Enterprise COBOL 6.x e z/OS 3.1, as melhores práticas incluem:

  • nomes semânticos e consistentes;

  • estruturas alinhadas a modelos de negócio;

  • uso intensivo de COPYBOOKs compartilhados para evitar duplicação;

  • integração com JSON, XML e APIs REST preservando tipos corretos;

  • preferência por COMP-3 para valores financeiros e COMP/BINARY para cálculos;

  • uso de USAGE INDEX, 88-level, INITIALIZE e funções intrínsecas;

  • validação por ferramentas de análise estática como IBM Application Delivery Foundation, SonarQube (quando integrado) e padrões internos de qualidade.

Em muitos bancos, nenhuma variável nasce por acaso. Ela segue convenções documentadas, passa por revisão técnica e, frequentemente, é reutilizada por dezenas ou centenas de programas por meio de copybooks corporativos. Isso reduz erros, facilita integrações e garante consistência entre sistemas.


Curiosidades

  • O COBOL foi criado em 1959, e sua estrutura hierárquica de dados influenciou diversas linguagens posteriores.

  • Muitos layouts bancários brasileiros (CNAB 240 e 400 posições) dependem diretamente de grupos de níveis (01, 05, 10...) para mapear registros.

  • REDEFINES foi um dos primeiros mecanismos eficientes de reutilização de memória da história das linguagens comerciais.

  • Grandes bancos possuem programas com mais de 40 anos em produção cujas declarações de variáveis permanecem praticamente inalteradas, justamente porque foram bem projetadas desde o início.


A Filosofia Bellacosa Mainframe

Imagine uma biblioteca.

Cada livro possui uma prateleira.

Cada prateleira possui uma categoria.

Cada categoria possui uma etiqueta.

Agora imagine uma biblioteca onde todos os livros estão jogados no chão.

Ambas funcionam.

Mas apenas uma continua funcionando depois de cinquenta anos.

A Data Division é essa biblioteca.

Cada variável é um livro.

Cada nível é uma prateleira.

Cada nome é uma etiqueta.

Quando você declara uma variável pensando apenas no programa de hoje, escreve código.

Quando a declara pensando no colega que fará manutenção daqui a vinte anos, constrói engenharia de software.

E é exatamente essa mentalidade que diferencia um programador COBOL de um verdadeiro profissional de mainframe.

No fim das contas, programas mudam, regras de negócio evoluem e tecnologias se renovam. Uma Data Division bem organizada, porém, continua sendo uma das maiores demonstrações de maturidade técnica que um desenvolvedor pode deixar como legado.


quarta-feira, 20 de março de 2024

🎮 COBOL's Laboratory — Quando o Programador COBOL Vira o Herói de um Videogame 8 Bits

 

Bellacosa Mainframe e o game COBOL em retro 8 bits

☕ Um Café no Bellacosa Mainframe

🎮 COBOL's Laboratory — Quando o Programador COBOL Vira o Herói de um Videogame 8 Bits

Da USS Enterprise ao Nintendo Entertainment System: por que um jogo sobre COBOL é muito mais profundo do que parece

"A lógica é o início da sabedoria, não o seu fim."
— Sr. Spock

Imagine acordar em 1989.

Você liga sua televisão de tubo.

Coloca um cartucho no Nintendo Entertainment System.

Aparece a clássica tela preta.

Uma música chiptune começa a tocar.

No centro da tela surge uma enorme palavra:

COBOL

Logo abaixo...

PRESS START

Nesse instante você percebe uma coisa curiosa.

Você não vai controlar um guerreiro.

Não será um ninja.

Nem um encanador italiano.

Muito menos um cavaleiro medieval.

Você será...

Dr. COBOL.

O cientista mais brilhante de toda Bit City.

Pode parecer apenas uma brincadeira criada por fãs.

Mas existe uma homenagem muito maior escondida nessa ideia.

Ela celebra uma linguagem que, discretamente, continua movimentando bancos, bolsas de valores, seguradoras, governos, companhias aéreas e sistemas críticos em praticamente todos os continentes.

E curiosamente...

Essa homenagem foi feita utilizando um videogame dos anos 80.

Parece improvável.

Mas faz todo sentido.

Hoje vamos descobrir por quê.

Pegue sua caneca de café.

O computador de bordo da USS Enterprise já calculou nossa rota.

Vamos iniciar a missão.


Capítulo 1 — O jogo realmente existe

Sim.

Não é uma montagem.

Não é IA.

Não é um conceito.

É um jogo homebrew para o Nintendo Entertainment System (NES), desenvolvido pela Oniric Factor.

Página oficial:

🎮 https://oniric-factor.itch.io/cobol

Trilha sonora oficial:

🎵 https://soundcloud.com/kevin_81

O jogo foi desenvolvido para funcionar em:

  • Emuladores NES

  • ROM (.NES)

  • Hardware original através de flash cartridges compatíveis

Ou seja...

Em pleno século XXI alguém resolveu criar um jogo inteiro onde o protagonista é...

COBOL.

Só isso já merece respeito.


Capítulo 2 — O verdadeiro significado da história

A sinopse oficial parece simples.

O cientista Dr. Cobol precisa impedir que seu antigo discípulo...

Dr. Pascal...

Roube todas as suas invenções.

Mas existe um significado escondido.

Na computação, linguagens possuem "personalidade".

COBOL nunca foi criada para fazer gráficos.

Nem jogos.

Nem inteligência artificial.

Ela nasceu para resolver problemas extremamente importantes.

  • folha de pagamento

  • contas bancárias

  • seguros

  • aposentadorias

  • impostos

  • logística

Enquanto isso...

Pascal nasceu anos depois.

Seu objetivo era completamente diferente.

Ensinar programação.

Ensinar algoritmos.

Ensinar lógica.

Percebe a genialidade?

O jogo transforma duas filosofias da computação em personagens.


Capítulo 3 — A rivalidade que nunca existiu

O jogo apresenta:

COBOL versus Pascal.

Mas isso nunca aconteceu na vida real.

Cada linguagem dominou um universo diferente.

COBOLPascal
NegóciosEducação
EmpresasUniversidades
BancosLaboratórios
Sistemas críticosAlgoritmos
Processamento em loteEstruturas de dados

Na verdade...

Elas sempre coexistiram.

O jogo apenas transforma essa diferença em uma divertida batalha entre cientistas.


Capítulo 4 — Dr. Cobol

O protagonista não é um guerreiro.

Ele é um inventor.

Isso representa perfeitamente a linguagem.

Todo sistema COBOL é uma invenção.

Cada programa resolve um problema do mundo real.

Um programa pode calcular:

  • aposentadorias

  • imposto de renda

  • folha salarial

  • juros

  • investimentos

  • previdência

Em outras palavras...

Dr. Cobol é o engenheiro responsável por manter Bit City funcionando.


Capítulo 5 — Dr. Pascal

Pascal aparece como um cientista enlouquecido.

Essa escolha lembra imediatamente personagens famosos.

  • Dr. Wily

  • Dr. Robotnik

  • Dr. Neo Cortex

Todos eles usam ciência para destruir.

Enquanto Cobol usa ciência para construir.


Capítulo 6 — Bit City

O próprio nome da cidade possui easter eggs.

Bit.

O menor elemento da computação.

Um único bit vale:

0

ou

1

Tudo nasce daí.

Bytes.

Arquivos.

Programas.

Mainframes.

Internet.

Tudo começou com bits.


Curiosidade Bellacosa

Algumas versões da descrição oficial citam M.O.S. City, uma referência muito provável à lendária MOS Technology, fabricante do processador 6502, um dos chips mais influentes da história. O NES utiliza uma CPU derivada desse projeto (Ricoh 2A03), conectando o universo do jogo diretamente às raízes da computação doméstica.


Capítulo 7 — O verdadeiro inimigo

As criaturas mutantes.

Elas representam o quê?

Vamos pensar como um desenvolvedor.

No mundo real nossos monstros são:

👾 Bugs

👾 Dados inválidos

👾 SQLCODE negativos

👾 ABENDs

👾 Arquivos corrompidos

👾 Chaves duplicadas

👾 Deadlocks

👾 Falhas de comunicação

Os monstros do jogo são uma metáfora perfeita.


Capítulo 8 — Se fosse um jogo de Mainframe

Imagine algumas fases.

Fase 1

HELLO WORLD

Objetivo

Aprender

IDENTIFICATION DIVISION

Fase 2

WORKING-STORAGE

Monstros:

PIC inválidos

VALUE incorreto

COMP-3 defeituoso


Fase 3

VSAM Forest

Chefão

INVALID KEY


Fase 4

JCL Mountain

Chefão

S806


Fase 5

DB2 Caverns

Chefão

SQLCODE -904


Fase 6

CICS Fortress

Chefão

AEI9


Última fase

Production

O maior inimigo de todos.

ABEND.


Capítulo 9 — Os Power-ups do Programador COBOL

Todo bom jogo possui itens especiais.

No universo Bellacosa Mainframe eles seriam:

Café

Recupera energia.

Item obrigatório.


📘

Manual IBM

+30 Inteligência.


🖥

ISPF

Permite editar código.


📄

JCL

Desbloqueia novas fases.


🗂

COPYBOOK

Novos poderes.


🔐

RACF

Escudo de segurança.


💾

Load Module

Transformação definitiva.


📊

EXPLAIN PLAN

Permite prever ataques do chefão SQL.


Capítulo 10 — O paralelo com Star Trek

Aqui começa nossa viagem espacial.

Imagine a Enterprise.

Quem seria quem?

Capitão Kirk

Gerente do projeto.

Decide prioridades.


Sr. Spock

Analista de sistemas.

Pensa logicamente.

Nunca programa por impulso.


Scotty

Compilador COBOL.

Transforma código em algo executável.

Quando tudo funciona...

Ele diz:

"I'm giving her all she's got!"


Uhura

MQ Series.

Toda comunicação passa por ela.


Worf

RACF.

Nada entra sem autorização.


Data

Db2.

Memória perfeita.


Enterprise

IBM Z.

A nave mais confiável da Frota.


O Cadete

Você.

O Programador COBOL Padawan.


Capítulo 11 — Como um Padawan venceria o jogo

Missão 1

Aprender COBOL.

Missão 2

Aprender JCL.

Missão 3

Conhecer VSAM.

Missão 4

Estudar Db2.

Missão 5

Entender CICS.

Missão 6

Aprender z/OS.

Missão Final

Resolver um ABEND em produção.

Parabéns.

Você terminou o tutorial.


Curiosidades que poucos conhecem

🎮 O NES continua vivo

Mesmo décadas após seu lançamento, desenvolvedores independentes continuam criando jogos inéditos para o console. Essa cena é conhecida como homebrew e reúne programadores, artistas e músicos apaixonados por hardware clássico.


💾 O hardware impõe criatividade

O NES possui recursos extremamente limitados em comparação aos computadores atuais. Isso obriga os desenvolvedores a escrever código altamente otimizado, uma filosofia que lembra muito a programação em mainframes, onde eficiência e confiabilidade sempre foram essenciais.


🎵 Música chiptune

A trilha sonora de Cobol's Laboratory, composta por Kevin van der Burg, utiliza a estética sonora típica dos consoles 8 bits. Cada melodia precisa respeitar as limitações dos canais de áudio do NES, transformando restrições técnicas em criatividade.


🧠 O verdadeiro easter egg

COBOL foi criado em 1959.

O NES nasceu em 1983.

Mesmo separados por mais de duas décadas, ambos compartilham uma característica fundamental:

Foram projetados para serem confiáveis, simples de usar dentro de seus objetivos e capazes de atravessar gerações.


Easter Eggs Bellacosa Mainframe

🐣 Easter Egg #1

Dr. Pascal é um cientista.

Na vida real, Niklaus Wirth, criador da linguagem Pascal, também era um pesquisador e professor universitário.


🐣 Easter Egg #2

O personagem principal não luta com espadas.

Ele luta usando inteligência.

Como qualquer bom analista.


🐣 Easter Egg #3

PRESS START.

Essa talvez seja a melhor mensagem do jogo.

Todo desenvolvedor começa exatamente assim.

Sem experiência.

Sem atalhos.

Sem Continue.

Apenas...

START.


🐣 Easter Egg #4

Bit City representa o universo digital.

O IBM Z representa o coração dessa cidade.

Enquanto tudo parece silencioso...

Bilhões de transações acontecem.

Todos os dias.


🐣 Easter Egg #5 – A Diretriz Principal de Spock

Se o Sr. Spock fosse mentor de um programador COBOL, provavelmente diria:

"Um bom programa não impressiona por sua complexidade, mas por sua clareza. A lógica elegante reduz erros, facilita a manutenção e permite que outros compreendam seu raciocínio décadas depois."

Essa frase resume a essência do COBOL: escrever código para pessoas lerem, e não apenas para máquinas executarem.


Passo a passo para o Programador COBOL Padawan

  1. Domine a sintaxe básica. Entenda as divisões do COBOL e escreva pequenos programas.

  2. Aprenda JCL. Um programa precisa ser compilado e executado corretamente.

  3. Conheça arquivos VSAM e sequenciais. Eles são a base de muitos sistemas legados.

  4. Estude SQL e Db2. Grande parte das aplicações corporativas utiliza banco de dados.

  5. Entenda CICS e IMS. Eles representam o processamento online de alta disponibilidade.

  6. Aprenda a investigar ABENDs. Ler mensagens, dumps e logs faz parte da rotina.

  7. Nunca pare de aprender. Assim como um jogo libera novas fases, o universo IBM Z sempre oferece novos desafios, como APIs, DevOps, Zowe, OpenShift e Inteligência Artificial.


Conclusão — O verdadeiro significado de "PRESS START"

À primeira vista, Cobol's Laboratory parece apenas uma divertida homenagem em pixel art a uma linguagem de programação clássica. Porém, quando observamos com atenção, percebemos algo muito maior.

Ele celebra a história da computação.

Celebra a criatividade da comunidade homebrew.

Celebra os pioneiros que construíram sistemas capazes de sobreviver por décadas.

E, acima de tudo, lembra que COBOL continua sendo um dos pilares invisíveis do mundo moderno.

Assim como a USS Enterprise não impressiona apenas por sua velocidade, mas pela confiança que inspira em cada missão, o IBM Z e o COBOL permanecem cumprindo sua missão silenciosamente: manter funcionando os sistemas que sustentam a economia global.

Da próxima vez que encontrar uma tela verde, um programa COBOL ou um JCL aparentemente antigo, lembre-se da tela inicial daquele cartucho imaginário:

COBOL

PRESS START

Porque toda grande jornada na Frota Estelar — e todo grande programador COBOL — começou exatamente da mesma forma: com a coragem de apertar Start e explorar um universo onde lógica, disciplina e conhecimento são as maiores armas da missão.


Bellacosa Mainframe apresenta COBOL The Game

🎮 Links Oficiais

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