Translate

Mostrar mensagens com a etiqueta perform. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta perform. 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.


domingo, 30 de novembro de 2025

💥 IDCAMS: O “Canivete Suíço” do z/OS que Todo Dev COBOL Senior Usa… Mas Poucos REALMENTE Dominam

 

Bellacosa Mainframe apresenta o IDCAMS nos dataset VSAM

💥 IDCAMS: O “Canivete Suíço” do z/OS que Todo Dev COBOL Senior Usa… Mas Poucos REALMENTE Dominam

Se você trabalha com COBOL em ambiente IBM z/OS, existe uma ferramenta silenciosa que executa tarefas críticas todos os dias — e, muitas vezes, sem o devido respeito: o IDCAMS.

Você pode até usar DELETE ou DEFINE no automático… mas dominar o IDCAMS é outro nível. É aqui que você deixa de ser apenas um desenvolvedor COBOL experiente… e passa a ser um engenheiro de dados raiz do mainframe.


🧬 Origem e História: De VSAM à Alma do z/OS

O IDCAMS nasceu junto com o VSAM na década de 70, substituindo métodos mais antigos como ISAM e BDAM.

Ele faz parte do componente Access Method Services (AMS) e foi projetado para:

  • Criar e gerenciar datasets VSAM
  • Manipular catálogos (ICF Catalog)
  • Executar operações administrativas com alta precisão

💡 Curiosidade:
O IDCAMS foi uma das primeiras ferramentas no mundo a permitir gerenciamento declarativo de dados estruturados — algo que hoje vemos em bancos NoSQL modernos.


🧠 O Papel do IDCAMS na Vida do Dev COBOL

Você pode escrever o COBOL mais elegante do mundo… mas se o VSAM estiver mal definido, esquece.

O IDCAMS é responsável por:

  • Estrutura física do arquivo
  • Parâmetros de performance (CI/CA)
  • Chaves e índices
  • Reorganização (REPRO)
  • Diagnóstico de problemas

👉 Em outras palavras:
COBOL lê e escreve… IDCAMS decide COMO isso acontece.


🛠️ Comandos Essenciais (e o que ninguém te conta)

🔹 DEFINE CLUSTER (o nascimento do VSAM)

//STEP01 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE CLUSTER(NAME(MEU.VSAM.KSDS)
INDEXED
KEYS(10 0)
RECORDSIZE(80 80)
CYLINDERS(5 2)
FREESPACE(10 10)
)
/*

💣 Insight avançado:

  • FREESPACE mal configurado = split constante = performance degradada
  • RECORDSIZE impacta diretamente o número de registros por CI

🔹 REPRO (o “COPY inteligente”)

REPRO INFILE(ENTRADA) OUTDATASET(MEU.VSAM.KSDS)

🔥 Aqui mora um dos maiores poderes:

  • Pode migrar dados entre PS ↔ VSAM
  • Pode ser usado como backup lógico
  • Suporta filtros e conversões indiretas

💡 Easter Egg:
Pouca gente sabe, mas REPRO pode ser usado para “reorganizar” um VSAM sem usar utilitários pagos.


🔹 LISTCAT (o raio-X do dataset)

LISTCAT ENT(MEU.VSAM.KSDS) ALL

🧠 Aqui você descobre:

  • CI/CA size
  • Número de splits
  • Estatísticas reais de uso

👉 Dica de ouro:
Use LISTCAT antes de culpar o COBOL.


🔹 DELETE (simples… e perigoso)

DELETE MEU.VSAM.KSDS CLUSTER

💀 Sem confirmação. Sem rollback. Sem piedade.


🧪 Laboratório Prático (nível Bellacosa)

🎯 Objetivo:

Criar, carregar e validar um VSAM na prática


🥇 Passo 1 — Criar o cluster

DEFINE CLUSTER(NAME(LAB.VSAM.KSDS)
INDEXED
KEYS(5 0)
RECORDSIZE(50 50)
TRACKS(10 5)
)

🥈 Passo 2 — Popular com REPRO

REPRO INFILE(INPUT) OUTDATASET(LAB.VSAM.KSDS)

🥉 Passo 3 — Validar estrutura

LISTCAT ENT(LAB.VSAM.KSDS) ALL

🧨 Passo 4 — Simular erro clássico

  • Criar com chave errada
  • Rodar COBOL
  • Observar FILE STATUS 22 ou 23

👉 Agora sim você aprende de verdade.


🤯 Curiosidades que Só Veteranos Sabem

  • IDCAMS retorna códigos próprios, mas também influencia FILE STATUS do COBOL
  • Um VSAM mal definido pode gerar:
    • Loop de I/O
    • CPU spike
    • Deadlock em CICS
  • DEFINE mal feito pode custar mais caro que um SQL ruim no IBM Db2

🧩 Easter Eggs & Segredos

🥚 1. PRINT Dataset via IDCAMS

PRINT INDATASET(MEU.VSAM.KSDS) CHARACTER

👉 Sim, dá pra “ver” o conteúdo sem COBOL


🥚 2. ALTER sem recriar

ALTER MEU.VSAM.KSDS NEWNAME(NOVO.NOME)

🔥 Pouco usado, mas extremamente poderoso


🥚 3. VERIFY

Valida integridade do VSAM — essencial após falhas


⚖️ Pontos Fortes vs Limitações

✅ Fortes

  • Nativo do z/OS
  • Extremamente poderoso
  • Sem custo adicional
  • Alta performance

❌ Limitações

  • Sintaxe pouco amigável
  • Documentação densa
  • Erros pouco intuitivos

🧠 Comentário de quem vive isso

O IDCAMS é aquele tipo de ferramenta que:

  • Quem não domina → sofre
  • Quem domina → resolve incidente em minutos
  • Quem ignora → vira refém de storage/admin

👉 E aqui vai a verdade direta:

“Se você é dev COBOL senior e não entende IDCAMS profundamente… você ainda está jogando no modo easy.”


🚀 Conclusão: IDCAMS é Poder — e Responsabilidade

Dominar IDCAMS significa:

  • Criar VSAM performático
  • Evitar gargalos invisíveis
  • Diagnosticar problemas reais
  • Ganhar respeito no ambiente mainframe

Ele não é só um utilitário.

👉 Ele é o alicerce invisível de tudo que seu COBOL faz.

💥 TABELA COMPLETA — PARÂMETROS IDCAMS (NA PRÁTICA)


🧱 🔹 DEFINE CLUSTER (o mais importante de todos)

ParâmetroTipoDescriçãoInsight de campo
NAMEobrigatórioNome do datasetBase de tudo
INDEXEDtipoKSDSMais comum
NONINDEXEDtipoESDSSequencial
LINEARtipoLDSUsado por DB2
KEYS(length offset)obrigatório (KSDS)Define chaveErro aqui = desastre
RECORDSIZE(avg max)obrigatórioTamanho registroImpacta CI
FREESPACE(ci ca)opcionalEspaço livreEvita split
CYLINDERS(primary secondary)opcionalAlocaçãoProdução padrão
TRACKSopcionalAlternativa a cilindrosMais granular
SHAREOPTIONS(x y)opcionalConcorrênciaCICS crítico
REUSEopcionalReutilizaçãoBatch útil
SPEEDopcionalMais rápidoSem recovery
RECOVERYopcionalMais seguroDefault prod
UNIQUEKEYopcionalChave únicaDefault KSDS
NONUNIQUEKEYopcionalPermite duplicidadeMuito usado
BUFFERSPACEopcionalMemóriaRaro
CISZopcionalControl IntervalPerformance tuning
VOLUMESopcionalVolume físicoStorage define
ERASEopcionalSegurançaLGPD vibes 😄
CONTROLINTERVALSIZEopcionalMesmo que CISZNome longo
IMBEDopcionalÍndice embutidoRaro hoje
REPLICATEopcionalReplica índiceLegado
LOG / NOLOGopcionalLoggingBatch tuning

🧩 🔹 DEFINE DATA / INDEX

ParâmetroDescriçãoObservação
NAMENome componenteObrigatório
CYLINDERS / TRACKSEspaçoSeparação física
VOLUMESVolumeMulti-volume
CONTROLINTERVALSIZECI sizeAjuste fino
FREESPACEEspaço livreMesmo conceito
BUFFERSPACEMemóriaPouco usado

💡 Insight:
Separar DATA e INDEX melhora performance em ambientes grandes.


🔄 🔹 REPRO (o ETL raiz do mainframe)

ParâmetroDescriçãoUso real
INFILEEntrada DDBatch clássico
OUTFILESaída DD
INDATASETEntrada diretaAlternativa
OUTDATASETSaída direta
REPLACESobrescreveMuito usado
COUNT(n)Limite registrosTeste
SKIP(n)Pula registrosDebug
FROMKEYInício por chaveVSAM
TOKEYFim por chaveVSAM
KEYSIntervaloFiltro
LOG / NOLOGLoggingPerformance
FASTLOADCarga rápidaGrandes volumes

💣 Insight avançado:
REPRO pode substituir ferramentas ETL simples.


🔍 🔹 LISTCAT (diagnóstico avançado)

ParâmetroDescriçãoUso
ENTRY / ENTNome datasetDireto
ALLTudoSempre usar
LEVELPrefixoListagem
HISTORYHistóricoAuditoria
VOLUMEInfo volumeStorage
ALLOCATIONEspaçoCapacidade

💡 Dica:
LISTCAT é seu “debugger de storage”.


❌ 🔹 DELETE

ParâmetroDescriçãoRisco
CLUSTERRemove tudoNormal
DATASó dadosAvançado
INDEXSó índiceRaro
PURGEIgnora proteção💀 perigoso
ERASEApaga fisicamenteSegurança
NOSCRATCHRemove catálogo apenasDeixa dados

🔧 🔹 ALTER

ParâmetroDescriçãoUso
NEWNAMERenomeiaMuito usado
VOLUMESMuda volumeStorage
BUFFERSPACEAjuste memóriaRaro

🖨️ 🔹 PRINT

ParâmetroDescriçãoUso
INDATASETDatasetBase
CHARACTERTextoDebug
HEXHexadecimalDebug avançado
DUMPDump brutoForense
COUNTLimiteTeste

🧪 🔹 VERIFY

ParâmetroDescrição
DATASETDataset alvo
RECOVERTenta corrigir

👉 Essencial após crash


⚙️ 🔹 Parâmetros via DD (tuning real)

ParâmetroOndeDescrição
AMPDDParâmetros avançados
BUFNDAMPBuffers de dados
BUFNIAMPBuffers de índice
STRNOAMPConcorrência
OPTCDAMPModo acesso
MACRFAMPMétodo acesso

🧠 🔹 Parâmetros menos conhecidos (nível ninja)

ParâmetroDescriçãoQuando usar
IMBEDÍndice dentro do CIPequenos datasets
REPLICATEReplica índiceLegado
LOGLoggingAuditoria
NOLOGSem logPerformance
SPEEDPerformanceBatch
RECOVERYSegurançaProd

🤯 RELAÇÃO COM COBOL (o que ninguém explica)

Tudo isso impacta diretamente:

  • FILE STATUS
  • Tempo de I/O
  • Locks (CICS)
  • CPU usage

👉 Exemplo real:

  • FREESPACE errado → split → slowdown → batch estoura janela

⚖️ RESUMO ESTRATÉGICO

👉 Os parâmetros mais críticos na prática:

  1. KEYS
  2. RECORDSIZE
  3. FREESPACE
  4. CISZ
  5. SHAREOPTIONS
  6. BUFND / BUFNI

🧨 VERDADE FINAL (modo Bellacosa)

“IDCAMS não é sobre comando…
é sobre controle físico dos dados.”

Se você domina isso:

  • Você prevê problema antes de acontecer
  • Você resolve incidente sem depender de ninguém
  • Você vira referência no time 



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.


terça-feira, 21 de fevereiro de 2023

COBOL Recursivo — Muito Além do Fatorial (Parte II - Section A)

 

Bellacosa Mainframe apresenta cobol recursivo parte ii sec a

☕ Um Café no Bellacosa Mainframe

COBOL Recursivo — Muito Além do Fatorial (Parte 2A)

Construindo Nosso Primeiro Programa Recursivo: Entendendo o Call Stack Passo a Passo

"Todo programador COBOL aprende a escrever um PERFORM. Poucos já pararam para observar o que realmente acontece quando um programa chama a si próprio. Nesta segunda parte, vamos acompanhar cada chamada como se estivéssemos olhando diretamente para a memória do IBM Z."


Introdução

Na primeira parte desta série entendemos que recursividade não é simplesmente "um programa chamando ele mesmo".

Ela representa a criação de novos contextos de execução, cada um possuindo seu próprio estado, seus parâmetros e, quando corretamente projetado, suas próprias variáveis locais.

Agora chegou o momento de acompanhar isso acontecendo.

Não vamos começar falando de árvores binárias.

Nem XML.

Nem JSON.

Vamos começar pelo exemplo mais famoso da computação.

O cálculo do fatorial.

Não porque seja o algoritmo mais útil.

Mas porque ele é pequeno o suficiente para enxergarmos exatamente como a pilha cresce e diminui.

Nosso objetivo não é aprender matemática.

Nosso objetivo é aprender como o Enterprise COBOL pensa.


Antes de escrever uma linha de código...

Imagine que alguém pergunte:

Quanto vale 5!?

Matematicamente sabemos:

5! = 5 × 4 × 3 × 2 × 1

Mas existe outra forma de enxergar.

5!

↓

5 × 4!

↓

5 × (4 × 3!)

↓

5 × (4 × (3 × 2!))

↓

5 × (4 × (3 × (2 × 1!)))

Perceba algo interessante.

O problema original é reduzido a um problema menor.

Depois outro.

Depois outro.

Até chegar em um caso extremamente simples.

1! = 1

Esse ponto recebe um nome muito importante.

Caso Base (Base Case).

Toda recursão possui um.

Sem ele...

O algoritmo nunca termina.


O primeiro programa recursivo

Vamos analisar uma implementação didática.

IDENTIFICATION DIVISION.
PROGRAM-ID. FATORIAL IS RECURSIVE.

DATA DIVISION.

LOCAL-STORAGE SECTION.

01 LS-NUMERO       PIC 9(4).
01 LS-RESULTADO    PIC 9(18).

LINKAGE SECTION.

01 LK-NUMERO       PIC 9(4).
01 LK-RESULTADO    PIC 9(18).

PROCEDURE DIVISION USING LK-NUMERO LK-RESULTADO.

    IF LK-NUMERO <= 1
        MOVE 1 TO LK-RESULTADO
    ELSE
        SUBTRACT 1 FROM LK-NUMERO GIVING LS-NUMERO

        CALL "FATORIAL"
             USING LS-NUMERO
                   LS-RESULTADO

        COMPUTE LK-RESULTADO =
                LK-NUMERO * LS-RESULTADO
    END-IF

    GOBACK.

Não se preocupe se parecer estranho.

Vamos desmontá-lo completamente.


O primeiro detalhe importante

Observe a primeira linha.

PROGRAM-ID. FATORIAL IS RECURSIVE.

Essa pequena palavra muda completamente o comportamento esperado do programa.

Ela informa ao compilador que poderão existir várias ativações simultâneas da mesma rotina.

Sem isso, o compilador poderá assumir um modelo inadequado para esse tipo de chamada.


Por que usamos LOCAL-STORAGE?

Veja novamente.

LOCAL-STORAGE SECTION.

01 LS-NUMERO.
01 LS-RESULTADO.

Muitos iniciantes perguntam:

"Posso colocar isso na Working-Storage?"

Tecnicamente...

Pode.

Mas provavelmente produzirá resultados incorretos.

Vamos entender por quê.


O que aconteceria usando Working-Storage?

Imagine:

WORKING-STORAGE

LS-NUMERO = 5

Primeira chamada.

Tudo bem.

Agora o programa chama ele mesmo.

WORKING-STORAGE

LS-NUMERO = 4

Ops.

O valor 5 desapareceu.

Nova chamada.

WORKING-STORAGE

LS-NUMERO = 3

Mais uma vez.

WORKING-STORAGE

LS-NUMERO = 2

Depois.

WORKING-STORAGE

LS-NUMERO = 1

Quando retornar...

Quem lembra do cinco?

Ninguém.

Ele foi sobrescrito.

É exatamente esse tipo de problema que Local-Storage resolve.


Agora usando Local-Storage

Cada chamada recebe sua própria cópia.

Visualmente.

FATORIAL(5)

LS-NUMERO = 5

Chama.

FATORIAL(4)

LS-NUMERO = 4

Chama.

FATORIAL(3)

LS-NUMERO = 3

Depois.

FATORIAL(2)

LS-NUMERO = 2

Depois.

FATORIAL(1)

LS-NUMERO = 1

Nenhuma variável interfere na outra.

Cada ativação possui seu próprio ambiente.


Vamos acompanhar a execução

Chamamos.

CALL FATORIAL(5)

O programa verifica.

5 <= 1 ?

Não.

Então calcula.

5 × FATORIAL(4)

Mas ele ainda não sabe quanto vale FATORIAL(4).

Então precisa descobrir.


Segunda chamada

Agora executa.

FATORIAL(4)

Pergunta.

4 <= 1 ?

Não.

Calcula.

4 × FATORIAL(3)

Ainda não sabe.

Então chama novamente.


Terceira chamada

FATORIAL(3)

Ainda não terminou.

Chama.

FATORIAL(2)

Quarta chamada

Agora.

FATORIAL(2)

Ainda não chegou.

Chama.

FATORIAL(1)

Quinta chamada

Finalmente.

FATORIAL(1)

Agora acontece algo mágico.

1 <= 1

SIM

O algoritmo encontrou o caso base.

Retorna.

1

A partir daqui...

A pilha começa a voltar.


A pilha crescendo

Durante a descida.

+----------------------+
|FATORIAL(1)           |
+----------------------+
|FATORIAL(2)           |
+----------------------+
|FATORIAL(3)           |
+----------------------+
|FATORIAL(4)           |
+----------------------+
|FATORIAL(5)           |
+----------------------+

Observe.

Nenhum cálculo foi concluído.

Todos aguardam.


Agora começa a subida

FATORIAL(1)

retorna

1

Então.

FATORIAL(2)

faz.

2 × 1

=

2

Retorna.


Depois.

FATORIAL(3)

recebe.

2

Calcula.

3 × 2

=

6

Retorna.


Depois.

FATORIAL(4)

recebe.

6

Calcula.

4 × 6

=

24

Retorna.


Depois.

FATORIAL(5)

recebe.

24

Calcula.

5 × 24

=

120

Agora sim.

Fim.


O momento em que tudo faz sentido

Perceba.

A descida não resolve o problema.

Ela apenas divide.

A subida resolve.

Esse conceito aparece em praticamente todos os algoritmos recursivos.


O papel do CALL

Muitos imaginam que o CALL copie o programa inteiro.

Não.

Ele apenas cria um novo contexto.

É como se o Language Environment dissesse:

"Guarde tudo o que estava acontecendo."

"Execute esta nova instância."

"Quando terminar, volte exatamente daqui."

Esse "guardar tudo" inclui:

  • registradores;

  • endereço de retorno;

  • parâmetros;

  • estado da execução.


Comparando com PERFORM

Agora vamos resolver exatamente o mesmo problema usando um laço tradicional.

MOVE 1 TO WS-RESULTADO

PERFORM VARYING WS-I
        FROM 1 BY 1
        UNTIL WS-I > WS-NUMERO

    MULTIPLY WS-I
         BY WS-RESULTADO

END-PERFORM

Muito menor.

Muito mais simples.

Muito mais eficiente.

Então surge a pergunta.


Por que alguém usaria recursão?

Porque nem todos os problemas são lineares.

Imagine uma árvore.

             CEO

      /        |        \

Financeiro    RH        TI

              |

         Recrutamento

Como percorrer isso usando apenas PERFORM?

É possível.

Mas rapidamente surgem:

  • pilhas auxiliares;

  • vetores;

  • índices;

  • controles complexos.

Já a solução recursiva acompanha naturalmente a estrutura da árvore.

Ela entra em um nó.

Depois em seus filhos.

Depois nos filhos dos filhos.

E assim sucessivamente.


A recursão modela o problema

Esse talvez seja o conceito mais importante deste artigo.

A melhor solução nem sempre é a mais rápida.

Muitas vezes ela é a que representa o problema de forma mais natural.

Uma árvore chama outra árvore.

Uma pasta contém outras pastas.

Um elemento XML contém outros elementos.

Um objeto JSON contém outros objetos.

Todos esses cenários possuem uma natureza recursiva.


O custo da elegância

Infelizmente...

Elegância tem preço.

Cada chamada implica em:

  • criação de um novo frame;

  • salvamento de registradores;

  • passagem de parâmetros;

  • reserva de memória local;

  • desvio para uma nova execução;

  • retorno ao ponto original.

Enquanto um PERFORM reutiliza o mesmo contexto durante todas as iterações, a recursão cria um novo contexto a cada nível.

Por isso, em rotinas batch que processam milhões de registros sequenciais, o PERFORM quase sempre será mais eficiente.


O que um Programador COBOL Padawan deve observar neste exemplo

Antes de pensar em escrever algoritmos recursivos sofisticados, é importante consolidar alguns princípios:

  • Toda recursão precisa obrigatoriamente de um caso base. Sem ele, a pilha cresce indefinidamente até provocar falha de execução.

  • Cada chamada deve aproximar o problema da condição de parada. Se o valor de entrada não evolui em direção ao caso base, o algoritmo nunca termina.

  • Variáveis que representam o estado da execução devem, preferencialmente, estar em LOCAL-STORAGE, evitando interferência entre diferentes ativações.

  • A recursão não substitui o PERFORM. Ela é uma técnica para problemas cuja própria estrutura é hierárquica.

  • Antes de implementar uma solução recursiva, pergunte: este problema realmente possui uma estrutura recursiva ou estou apenas complicando um processamento linear?

Essa última pergunta evita um dos erros mais comuns entre desenvolvedores iniciantes: usar recursão apenas porque ela parece elegante.


Um pequeno exercício para o leitor

Pegue papel e lápis.

Escreva a sequência:

FATORIAL(6)

Agora desenhe seis caixas empilhadas.

Dentro de cada caixa, anote:

  • valor recebido;

  • valor retornado;

  • quem chamou aquela rotina.

Ao final do exercício, você perceberá algo importante: o algoritmo não "anda para frente". Ele mergulha até o caso base e depois retorna desfazendo a pilha, uma camada de cada vez.

Esse simples desenho vale mais do que dezenas de linhas de código para compreender a essência da recursividade.


Encerrando o Café

Se você chegou até aqui, provavelmente percebeu que o exemplo do fatorial nunca foi o verdadeiro objetivo deste artigo.

O fatorial é apenas uma desculpa elegante para observar o funcionamento interno do Enterprise COBOL.

O aprendizado mais valioso não está no resultado 120, mas em entender como o compilador, o Language Environment e a pilha de execução trabalham juntos para permitir que várias instâncias do mesmo programa coexistam de forma segura.

É essa engenharia invisível que torna possível escrever compiladores, interpretadores, analisadores de XML, processadores de JSON e diversas outras soluções sofisticadas em COBOL moderno.

No próximo café, deixaremos os exemplos acadêmicos para trás. Vamos explorar algoritmos realmente interessantes — Fibonacci, percorrimento de árvores, busca em profundidade (DFS), QuickSort, MergeSort, XML, JSON e outros cenários em que a recursividade deixa de ser apenas uma curiosidade e passa a ser a ferramenta mais elegante para resolver problemas complexos no universo IBM Mainframe.


quinta-feira, 14 de abril de 2022

Lógica de Programação no Mainframe : O Guia Definitivo para um Programador Padawan Entender Como Pensar em COBOL

 

Bellacosa Mainframe apresenta logica de programacao em mainframe


☕ Um Café no Bellacosa Mainframe

Lógica de Programação no Mainframe

O Guia Definitivo para um Programador Padawan Entender Como Pensar em COBOL Antes Mesmo de Escrever uma Linha de Código

"A diferença entre um programador júnior e um programador experiente raramente está na linguagem. Está na forma como ele pensa antes de começar a programar."


Introdução

Existe um mito que acompanha praticamente todo iniciante em Mainframe.

Muitos acreditam que aprender COBOL significa decorar comandos como MOVE, IF, PERFORM, READ, WRITE e COMPUTE.

Não.

Isso é parecido com decorar palavras de um idioma sem aprender a formar frases.

Programar não é escrever código.

Programar é resolver problemas.

O computador apenas executa a solução que você imaginou.

Quanto melhor for sua lógica, menor será seu código.

Quanto pior for sua lógica, maior será o desastre.

Curiosamente, essa afirmação vale ainda mais no mundo Mainframe.

Em um sistema bancário, um erro lógico pode movimentar milhões de reais para a conta errada.

Um erro de apenas um operador relacional pode impedir milhares de aposentadorias de serem pagas.

A máquina faz exatamente aquilo que você pediu.

Nunca aquilo que você queria.


Afinal, o que é lógica de programação?

Lógica é a capacidade de organizar pensamentos em uma sequência de passos capazes de resolver um problema.

Em outras palavras:

Entrada → Processamento → Saída

Todo programa do planeta funciona assim.

Sempre.

Sem exceções.

Imagine fazer café.

Entrada:

  • água

  • café

  • filtro

Processamento:

  • aquecer água

  • passar pelo pó

Saída:

  • café pronto

Um programa COBOL faz exatamente isso.

Entrada:

Arquivo de clientes

Processamento

Arquivo atualizado

Nada muda.

Apenas o problema é diferente.


O computador é extremamente inteligente...

...para fazer exatamente o que você mandar.

E extremamente burro para adivinhar.

Se você esquecer um caso específico...

Ele esquecerá também.


Exemplo

Você deseja aprovar clientes maiores de idade.

Errado:

SE IDADE > 18

O cliente com exatamente 18 anos será recusado.

O correto seria

IDADE >= 18

Esse pequeno detalhe pode causar milhares de erros.

A lógica mora justamente nesses detalhes.


O primeiro segredo dos grandes programadores

Eles passam muito mais tempo pensando do que digitando.

Um programador experiente pode gastar:

70%

pensando

20%

planejando

10%

escrevendo

Já o iniciante faz exatamente o contrário.


Antes do COBOL existe o algoritmo

Todo programa começa com uma receita.

Exemplo.

Problema:

Calcular média de um aluno.

Passos.

Receber nota 1

Receber nota 2

Somar

Dividir por 2

Mostrar resultado

Isso é um algoritmo.

COBOL vem depois.


Aprenda primeiro estas estruturas

Toda programação procedural é formada por apenas três estruturas.

Sim.

Somente três.

Todo software do mundo nasce delas.


1 — Sequência

Faça isto

Depois aquilo

Depois aquilo outro

Exemplo

Leia salário

Calcule imposto

Mostre salário líquido

Nada complicado.


2 — Seleção

Agora aparece a primeira decisão.

SE saldo > 0

então saque permitido

senão

saque negado

No COBOL isso aparece como

IF
ELSE
END-IF

A vida inteira você fará isso.


3 — Repetição

Enquanto existir trabalho...

Continue trabalhando.

PERFORM UNTIL

PERFORM VARYING

São os famosos loops.


Curiosidade

Os três pilares da programação estruturada foram formalizados por Edsger W. Dijkstra, Ole-Johan Dahl e C. A. R. Hoare na década de 1960. A ideia revolucionária era simples: qualquer programa poderia ser construído usando apenas sequência, seleção e repetição, reduzindo drasticamente o uso de GOTO e tornando o software mais confiável.


Como um programa COBOL pensa?

Imagine um funcionário de banco.

Ele chega.

Recebe documentos.

Confere informações.

Atualiza cadastro.

Emite comprovante.

Vai embora.

Um programa COBOL trabalha exatamente assim.


Entrada

READ
ACCEPT
LINKAGE

Processamento

MOVE

ADD

SUBTRACT

MULTIPLY

DIVIDE

COMPUTE

STRING

UNSTRING

Saída

DISPLAY

WRITE

REWRITE

RETURN

SEND

O cérebro do programa

A PROCEDURE DIVISION.

Ela é composta por:

Parágrafos

Sections

Sentenças

Comandos

Cada um possui sua responsabilidade.


Parágrafos

Pense em capítulos de um livro.

CALCULAR-JUROS.

VALIDAR-DADOS.

ATUALIZAR-SALDO.

Cada um resolve uma única tarefa.

Essa organização melhora leitura, manutenção e testes.


Sections

São grupos de parágrafos relacionados.

Muito usadas em programas legados e ainda presentes em diversos ambientes corporativos.

VALIDACAO SECTION

PROCESSAMENTO SECTION

FINALIZACAO SECTION

Hoje, muitos times preferem programas menores e menos dependentes de SECTION, mas você encontrará ambos os estilos no mercado.


PERFORM é seu melhor amigo

Nunca copie código.

Faça um parágrafo.

Execute quando necessário.

PERFORM VALIDAR-CLIENTE

Muito melhor que repetir cinquenta linhas.


Variáveis

Uma variável representa um espaço reservado para armazenar informações.

Exemplo

Nome

Saldo

CPF

Data

Valor

Cada variável deve representar apenas uma ideia.

Não misture responsabilidades.


Um bom nome vale ouro

Ruim

A

X

TEMP

VAR1

Bom

WS-CLIENTE-SALDO

WS-VALOR-TOTAL

WS-DATA-PAGAMENTO

Você agradecerá daqui a dez anos.

E quem der manutenção também.


Expressões

Expressões representam cálculos.

A + B

SALDO - SAQUE

JUROS * TAXA

VALOR / PARCELAS

No COBOL moderno, COMPUTE simplifica expressões complexas, tornando o código mais legível.


Expressões booleanas

São perguntas.

IDADE >= 18

SALDO > 0

CPF = CPF-INFORMADO

Resultado?

VERDADEIRO

ou

FALSO

Toda programação gira em torno dessas respostas.


Operadores importantes

Igual

Maior

Menor

Maior ou igual

Menor ou igual

Diferente

AND

OR

NOT

Eles parecem simples.

Mas definem todo o comportamento do programa.


Fluxo de execução

Imagine uma estrada.

O programa começa.

Segue em frente.

Em alguns momentos:

vira

repete

retorna

encerra

Esse caminho é chamado fluxo.

Um fluxo claro é um programa fácil de manter.


O perigo do GO TO

Nos anos 70 era comum.

Hoje deve ser evitado.

Por quê?

Porque destrói o fluxo natural.

Cria o famoso:

"espaguete"

Linhas indo para todos os lados.

Difícil testar.

Difícil entender.

Difícil manter.

Por isso:

PERFORM

END-IF

EVALUATE

substituem praticamente todos os antigos GO TO.


EVALUATE

É o "switch" do COBOL.

Muito mais elegante que dezenas de IF aninhados.

Exemplo conceitual:

Cliente Ouro

↓

desconto

Cliente Prata

↓

desconto menor

Cliente Bronze

↓

sem desconto

Código mais limpo.

Mais fácil de ler.


Loops

No Mainframe você processará arquivos enormes.

Milhares.

Milhões.

Bilhões de registros.

Você não faz:

READ

READ

READ

READ

Você faz

PERFORM UNTIL EOF

Até chegar ao fim do arquivo.


EOF

Uma das primeiras variáveis que todo programador COBOL aprende.

WS-FIM-ARQUIVO

88 EOF VALUE "S"

Quando ela muda...

O loop termina.

Quase todo processamento batch funciona assim.


Subprogramas

Grandes bancos dividem responsabilidades.

Programa principal

Chama

Subprograma

Retorna resultado

Assim nasce software reutilizável.

Em COBOL isso ocorre com CALL.


O conceito de responsabilidade única

Cada parágrafo.

Cada rotina.

Cada subprograma.

Deve fazer apenas uma coisa.

Muito bem feita.

Esse conceito, hoje conhecido como Single Responsibility Principle, já aparecia naturalmente em muitos sistemas COBOL décadas antes de se popularizar na orientação a objetos.


Como pensar antes de programar

Faça estas perguntas.

Qual é o problema?

Quais dados entram?

Quais dados saem?

Quais regras existem?

Existem exceções?

O que acontece se faltar informação?

O arquivo pode estar vazio?

Pode existir duplicidade?

O valor pode ser negativo?

Quanto mais perguntas...

Menos bugs.


A diferença entre programar e desenvolver

Programar é escrever código.

Desenvolver é resolver problemas.

Um excelente desenvolvedor pode escrever poucas linhas.

Mas resolver um problema enorme.


O Mainframe muda sua forma de pensar

Aqui você aprende que:

dados são patrimônio;

performance importa;

I/O custa caro;

cada acesso a disco deve ser pensado;

processar um milhão de registros é rotina;

estabilidade vale mais que criatividade.

Essa mentalidade acompanha você por toda a carreira, mesmo trabalhando depois com Java, Python, Go ou JavaScript.


A disciplina do COBOL

COBOL obriga você a ser organizado.

Divisões bem definidas.

Dados separados da lógica.

Nomes claros.

Fluxo explícito.

Isso forma excelentes engenheiros de software.

Não por acaso, muitos arquitetos de grandes bancos começaram suas carreiras escrevendo COBOL.


Os erros mais comuns dos iniciantes

  • Programar antes de entender o problema.

  • Criar variáveis com nomes sem significado.

  • Misturar validação, cálculo e gravação na mesma rotina.

  • Usar GO TO sem necessidade.

  • Ignorar casos de erro e exceções.

  • Esquecer o tratamento de fim de arquivo.

  • Repetir código em vez de criar parágrafos reutilizáveis.

  • Não documentar regras de negócio complexas.

  • Alterar programas sem compreender seu fluxo completo.

  • Testar apenas o "caminho feliz", esquecendo entradas inválidas e situações de borda.


Trilha de estudos para um Padawan Mainframe

Uma sequência eficiente de aprendizado é:

  1. Lógica de programação.

  2. Algoritmos e fluxogramas.

  3. Tipos de dados e variáveis.

  4. Operadores e expressões.

  5. Estruturas de decisão (IF e EVALUATE).

  6. Estruturas de repetição (PERFORM, UNTIL e VARYING).

  7. Modularização com parágrafos, SECTION e subprogramas.

  8. Arquivos sequenciais e VSAM.

  9. JCL e execução batch.

  10. CICS, Db2, APIs e integração com o mundo moderno.


Easter Egg ☕

Existe uma velha brincadeira entre programadores veteranos.

Perguntaram a um desenvolvedor COBOL:

— Quantas linguagens você conhece?

Ele respondeu:

— Muitas.

— Então por que continua usando COBOL?

O veterano sorriu:

— Porque o banco prefere que o dinheiro continue chegando na conta certa.

A piada resume uma grande verdade: linguagens vêm e vão, mas a lógica permanece. Quem domina lógica aprende qualquer linguagem com muito mais facilidade.


Curiosidade histórica

Grace Hopper, uma das pioneiras da computação e uma das maiores influências para o COBOL, costumava dizer:

"A frase mais perigosa da linguagem é: 'Sempre fizemos assim'."

Embora COBOL seja uma linguagem com mais de seis décadas, ela continua evoluindo. Hoje suporta recursos modernos como JSON, XML, UTF-8, integração com APIs REST, chamadas a serviços, tratamento avançado de dados e otimizações para arquiteturas IBM Z. O que permanece imutável não é a sintaxe, mas a lógica por trás da solução.


Conclusão

Todo programador COBOL experiente conhece centenas de comandos.

Mas isso nunca foi o diferencial.

O diferencial sempre foi saber pensar.

A lógica de programação é a verdadeira linguagem universal da computação. Ela atravessa décadas, plataformas e paradigmas. O profissional que domina sequência, seleção, repetição, modularização, fluxo de execução e organização do pensamento será capaz de trabalhar não apenas com COBOL, mas também com Java, Python, C#, JavaScript, Go ou qualquer tecnologia que surgir no futuro.

No Mainframe, essa disciplina ganha um valor ainda maior. Cada programa processa informações críticas para bancos, seguradoras, hospitais, governos e empresas que movimentam bilhões de transações diariamente. Não há espaço para improvisação: clareza, simplicidade e previsibilidade são virtudes.

Lembre-se sempre desta máxima do Bellacosa Mainframe:

"O computador não premia quem escreve mais código. Ele recompensa quem pensa melhor. Antes de aprender COBOL, aprenda a organizar suas ideias. Depois disso, a linguagem será apenas uma ferramenta nas mãos de um verdadeiro engenheiro de software."

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