☕ 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 programação estruturada. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta programação estruturada. Mostrar todas as mensagens

quarta-feira, 29 de outubro de 2025

☕💣 Lab: SEU PRIMEIRO PLANTÃO NO MAINFRAME — LABORATÓRIO COMPLETO DE LÓGICA DE PROGRAMAÇÃO IBM Z PARA INICIANTES 💣☕

 

Bellacosa Mainframe Laboratorio de Logica de Programação Mainframe

☕💣 “SEU PRIMEIRO PLANTÃO NO MAINFRAME” — LABORATÓRIO COMPLETO DE LÓGICA DE PROGRAMAÇÃO IBM Z PARA INICIANTES 💣☕

Aprenda a pensar como um programador de alta plataforma antes mesmo de dominar COBOL


🔥 OBJETIVO DO LABORATÓRIO

Neste laboratório você irá aprender:

✅ Como pensar em lógica Mainframe
✅ Como funciona o raciocínio batch
✅ Variáveis
✅ Validações
✅ Estruturas de repetição
✅ Sections e Paragraphs
✅ Procedures
✅ Subrotinas
✅ Modularização
✅ Boas práticas de alta plataforma
✅ Erros clássicos de iniciantes
✅ Como programadores IBM Z organizam sistemas reais


☕ CENÁRIO DO LABORATÓRIO

Você foi contratado para trabalhar em um banco.

Sua missão:

💣 PROCESSAR UM ARQUIVO DE CLIENTES

Cada registro possui:

NOME
IDADE
SALDO
STATUS

O programa deve:

  1. Ler registros

  2. Validar dados

  3. Calcular bônus

  4. Gerar relatório

  5. Exibir totais


🔥 PRIMEIRA LIÇÃO — PENSAR COMO MAINFRAME

Antes do código:

☕ O PROGRAMADOR MAINFRAME PENSA EM FLUXO


Entrada

Arquivo de clientes

Processamento

Validar
Calcular
Atualizar
Contabilizar

Saída

Relatório
Arquivo atualizado
Totais

💣 ISSO É O DNA DO BATCH

No Mainframe:

  • entrada

  • processamento

  • saída

são sagrados.


☕ ETAPA 1 — DECLARANDO VARIÁVEIS

No Mainframe tudo precisa ser previsível.


🔥 TIPOS MAIS COMUNS

Texto

01 WS-NOME            PIC X(30).

Número inteiro

01 WS-IDADE           PIC 9(03).

Valores monetários

01 WS-SALDO           PIC 9(07)V99.

Indicadores lógicos

01 WS-FIM-ARQUIVO     PIC X VALUE 'N'.

☕ DICA BELLACOSA MAINFRAME

🔥 Nome de variável precisa explicar a intenção

RUIM:

01 A PIC 9(5).

BOM:

01 WS-TOTAL-CLIENTES PIC 9(5).

💣 O MAINFRAME SOBREVIVE POR LEGIBILIDADE

Quem mantém sistemas bancários precisa entender rápido o código.


☕ ETAPA 2 — ESTRUTURA DO PROGRAMA

O COBOL corporativo normalmente segue:

IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
DATA DIVISION
PROCEDURE DIVISION

🔥 O CORAÇÃO DA LÓGICA

PROCEDURE DIVISION

Aqui vive:

  • fluxo

  • validação

  • cálculos

  • repetições


☕ ETAPA 3 — SECTIONS E PARAGRAPHS

SECTION

Agrupa grandes áreas do programa.


PARAGRAPH

Divide tarefas menores.


💣 EXEMPLO CORPORATIVO

PROCESSAMENTO-SECTION.

    PERFORM LE-ARQUIVO
    PERFORM VALIDA-DADOS
    PERFORM CALCULA-BONUS
    PERFORM GRAVA-RELATORIO.

☕ VANTAGEM DISSO

✅ Organização
✅ Manutenção
✅ Reuso
✅ Facilidade de debugging
✅ Clareza


🔥 ETAPA 4 — LEITURA DE REGISTROS

Todo batch gira em torno disso.


💣 MODELO CLÁSSICO MAINFRAME

PERFORM UNTIL WS-FIM-ARQUIVO = 'S'

    PERFORM LE-REGISTRO

    IF WS-FIM-ARQUIVO NOT = 'S'
       PERFORM PROCESSA-REGISTRO
    END-IF

END-PERFORM.

☕ O QUE O INICIANTE PRECISA ENTENDER

O batch:

  • processa

  • repete

até acabar o arquivo.


🔥 ETAPA 5 — LAÇOS DE REPETIÇÃO

☕ 1. PERFORM UNTIL

Mais usado em batch.


Exemplo

PERFORM UNTIL WS-FIM = 'S'

Repete até condição ser verdadeira.


☕ 2. PERFORM VARYING

Semelhante ao FOR.


Exemplo

PERFORM VARYING WS-INDICE FROM 1 BY 1
UNTIL WS-INDICE > 10

☕ 3. PERFORM TIMES

Executa quantidade fixa.


Exemplo

PERFORM 5 TIMES
   DISPLAY 'MAINFRAME'
END-PERFORM.

💣 ERRO CLÁSSICO DE INICIANTE

Criar loop infinito.

Exemplo perigoso:

PERFORM UNTIL WS-FIM = 'S'

Sem alterar WS-FIM.

Resultado:

  • CPU presa

  • JOB travado

  • consumo absurdo


☕ ETAPA 6 — VALIDAÇÕES

🔥 MAINFRAME AMA VALIDAÇÃO

Sistemas bancários precisam ser paranoicos.


☕ TIPOS DE VALIDAÇÃO


Campo vazio

IF WS-NOME = SPACES

Número inválido

IF WS-IDADE IS NUMERIC

Faixa permitida

IF WS-IDADE >= 18

Status permitido

IF WS-STATUS = 'A'

💣 DICA CORPORATIVA

Sempre valide:

  • entrada

  • arquivo

  • cálculo

  • retorno

  • integração


☕ ETAPA 7 — CÁLCULO DE BÔNUS

Regra:

Se saldo > 1000:

  • bônus = 10%


🔥 EXEMPLO

IF WS-SALDO > 1000
   COMPUTE WS-BONUS = WS-SALDO * 0.10
ELSE
   MOVE 0 TO WS-BONUS
END-IF.

☕ ETAPA 8 — MODULARIZAÇÃO

💣 O SEGREDO DOS SISTEMAS GIGANTES

Separar responsabilidades.


🔥 EXEMPLO

LEITURA
VALIDAÇÃO
PROCESSAMENTO
RELATÓRIO
FINALIZAÇÃO

☕ ISSO REDUZ

✅ Bugs
✅ Retrabalho
✅ Confusão
✅ Dependência de pessoas


☕ ETAPA 9 — SUBROTINAS

Grandes empresas usam MUITO isso.


🔥 O QUE É SUBROTINA?

Programa auxiliar reutilizável.


Exemplo

CALCULA-JUROS
VALIDA-CPF
FORMATA-DATA

💣 VANTAGEM

Um único módulo pode ser usado por:

  • banco

  • cartão

  • seguros

  • investimentos


☕ CHAMADA DE SUBROTINA

CALL 'CALCJURO'

☕ ETAPA 10 — FUNÇÕES

Funções retornam valores.


🔥 EXEMPLO

FUNCTION CURRENT-DATE

☕ MUITAS FUNÇÕES MODERNAS COBOL

  • data

  • matemática

  • string

  • conversão


💣 O QUE O INICIANTE PRECISA EVITAR


🔥 1. GOTO EM EXCESSO

Código vira espaguete.


🔥 2. NOMES RUINS

Dificultam manutenção.


🔥 3. DUPLICAÇÃO

Mesmo código repetido.


🔥 4. FALTA DE VALIDAÇÃO

Causa bugs perigosos.


🔥 5. TENTAR FAZER TUDO NUM BLOCO

Divida em procedures.


☕ LABORATÓRIO PRÁTICO — FLUXO COMPLETO

💣 OBJETIVO

Processar 3 clientes.


🔥 PASSO 1 — INICIALIZAÇÃO

MOVE 0 TO WS-TOTAL
MOVE 'N' TO WS-FIM

🔥 PASSO 2 — LOOP PRINCIPAL

PERFORM UNTIL WS-FIM = 'S'

🔥 PASSO 3 — LEITURA

READ CLIENTE-ARQ

🔥 PASSO 4 — VALIDAÇÃO

IF WS-SALDO IS NUMERIC

🔥 PASSO 5 — PROCESSAMENTO

COMPUTE WS-BONUS = WS-SALDO * 0.10

🔥 PASSO 6 — ACUMULADOR

ADD WS-BONUS TO WS-TOTAL

🔥 PASSO 7 — RELATÓRIO

DISPLAY WS-TOTAL

☕ RESULTADO FINAL ESPERADO

O programa:

  • processa clientes

  • valida dados

  • calcula bônus

  • gera total


💣 ISSO É O INÍCIO DA ENGENHARIA MAINFRAME

Você acabou de praticar:

✅ lógica imperativa
✅ lógica procedural
✅ lógica estruturada


☕ COMO PROGRAMADORES MAINFRAME PENSAM?

Eles perguntam:

O dado entrou correto?
O arquivo está íntegro?
A rotina está modularizada?
O batch aguenta milhões de registros?
O operador conseguirá diagnosticar erro?

🔥 ISSO É ALTA PLATAFORMA

Não é apenas programar.

É:

  • previsibilidade

  • confiabilidade

  • rastreabilidade

  • engenharia


☕ CURIOSIDADES DO MUNDO REAL


💣 Muitos bancos ainda usam lógica escrita nos anos 80

E continuam funcionando.


💣 Um erro de loop pode consumir milhões em CPU

Por isso revisão é levada extremamente a sério.


💣 COBOL foi desenhado para manutenção humana

Legibilidade sempre foi prioridade.


💣 Grandes batches processam bilhões de registros

Tudo baseado nessa lógica.


☕ DESAFIO FINAL PARA O ALUNO

Tente adicionar:

✅ validação de idade
✅ tratamento de saldo negativo
✅ contador de clientes inválidos
✅ relatório final formatado
✅ cálculo de média


🔥 MISSÃO CONCLUÍDA

Você deu os primeiros passos no raciocínio que move:

  • bancos

  • governos

  • cartões

  • seguradoras

  • bolsas financeiras


💣 A GRANDE VERDADE DO MAINFRAME

Antes de aprender comandos…

☕ O PROGRAMADOR IBM Z PRECISA APRENDER A PENSAR COMO ENGENHEIRO.


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

quinta-feira, 27 de agosto de 2020

Dijkstra versus COBOL : Quando um Cientista da Computação Declarou o Ensino de COBOL uma Ofensa Criminal… e o COBOL Continuou Pagando Salários, Aposentadorias e a Conta do Chá

 

Bellacosa Mainframe apresenta a guerra historica entre Dijkstra versus Cobol

☕ Um Café no Bellacosa Mainframe

Dijkstra versus COBOL sem Mistérios

Quando um Cientista da Computação Declarou o Ensino de COBOL uma Ofensa Criminal… e o COBOL Continuou Pagando Salários, Aposentadorias e a Conta do Chá

Existe uma fotografia bastante conhecida nos corredores virtuais da Computação. Nela aparece Edsger W. Dijkstra, um dos maiores cientistas da área, acompanhado da seguinte declaração:

“O uso de COBOL aleija a mente; seu ensino deveria, portanto, ser considerado uma ofensa criminosa.”

É uma frase delicada, equilibrada e diplomática, comparável a entrar em uma reunião de programadores COBOL, subir na mesa, derrubar o café do gerente de produção e anunciar:

— Senhores, vocês não apenas escolheram a linguagem errada. Vocês são vítimas de um crime intelectual.

Depois disso, espera-se que alguém toque um sino, um cavaleiro atravesse a sala montado em um cavalo imaginário e o programa da folha de pagamento continue executando normalmente, porque ele está em produção desde 1978 e não tem tempo para discussões filosóficas.

A frase de Dijkstra tornou-se uma das provocações mais famosas da história da programação. É citada por professores, estudantes, desenvolvedores, arquitetos, influenciadores tecnológicos e pessoas que aprenderam Python na terça-feira e, na quinta, já estavam publicando no LinkedIn que o mainframe morreria até o final do mês.

Mas o que Dijkstra realmente queria dizer?

Ele estava completamente errado?

O COBOL realmente prejudica a mente?

Por que uma linguagem tão criticada continua sendo utilizada?

E, principalmente, o que um programador COBOL iniciante pode aprender com essa antiga batalha entre a elegância acadêmica e o sistema que precisa fechar a contabilidade antes das seis da manhã?

Prepare o café, verifique o JOB CLASS, coloque o capacete e não alimente os acadêmicos depois da meia-noite. Vamos entrar no tribunal mais estranho da história da Computação.


1. O acusado entra no tribunal

De um lado do salão está Edsger Wybe Dijkstra, matemático, cientista da computação, defensor da programação estruturada e vencedor do Prêmio Turing.

Do outro lado está o COBOL, vestindo um terno cinza, carregando uma pasta cheia de registros de tamanho fixo e murmurando:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. REU-ABSOLVICAO.

O juiz pergunta:

— Nome?

— Common Business-Oriented Language.

— Profissão?

— Processamento comercial, financeiro, governamental, securitário e bancário.

— Idade?

— Prefiro não comentar.

— Acusação?

— Ter sobrevivido a todos os seus substitutos.

Na galeria, FORTRAN limpa os óculos. ALGOL observa com expressão superior. BASIC tenta entrar sem número de linha e é retirado por dois guardas. Java aparece quinze minutos atrasado porque ainda está inicializando a máquina virtual.

Para compreender o julgamento, precisamos conhecer o acusador.


Bellacosa Mainframe apresenta o professor Dijkstra

2. Quem foi Dijkstra?

Dijkstra não era simplesmente um programador mal-humorado que encontrou um código COBOL sem comentários e decidiu declarar guerra à humanidade.

Ele foi um dos nomes fundamentais da Ciência da Computação.

Entre suas contribuições estão:

  • o algoritmo de caminho mínimo que leva seu nome;

  • estudos sobre concorrência;

  • semáforos para sincronização de processos;

  • exclusão mútua;

  • programação estruturada;

  • raciocínio formal sobre programas;

  • defesa da eliminação do uso indiscriminado de GOTO;

  • métodos para demonstrar a correção de algoritmos.

Para Dijkstra, programação não deveria ser uma arte mística praticada por pessoas que digitavam comandos até o computador parar de reclamar.

Programar deveria ser uma atividade intelectual rigorosa, próxima da Matemática.

O programa não deveria apenas “parecer funcionar”.

Deveria ser possível compreender por que ele funcionava, provar suas propriedades e demonstrar que determinadas condições sempre seriam respeitadas.

Essa ideia parece óbvia hoje, especialmente quando falamos de sistemas bancários, aeronáuticos, médicos ou industriais. Contudo, nos primeiros tempos da programação, muitos programas eram construídos de maneira altamente improvisada.

Era o glorioso período histórico conhecido como:

“Digite alguma coisa, execute, receba um erro, altere três instruções, execute novamente e diga ao gerente que estamos quase terminando.”

Essa metodologia continua viva em muitos departamentos, mas atualmente recebe nomes mais modernos e apresentações em PowerPoint.


3. Por que Dijkstra atacava o COBOL?

A crítica não surgiu apenas porque o COBOL era antigo, comercial ou muito utilizado por empresas.

Dijkstra acreditava que uma linguagem de programação influenciava a forma de pensar de quem a utilizava.

Esse é um ponto importante.

Uma linguagem não é apenas uma ferramenta para traduzir ordens humanas em instruções de máquina. Ela oferece conceitos, limitações, estruturas e caminhos mentais.

Quem programa em Assembly pensa muito sobre registradores, endereços e instruções.

Quem programa em Lisp tende a pensar em listas, funções e recursão.

Quem programa em SQL aprende a descrever o resultado desejado, deixando para o banco decidir como encontrá-lo.

Quem programa em Java frequentemente pensa em objetos, classes, interfaces e em como transformar uma soma de dois números em uma arquitetura com dezessete arquivos.

O COBOL, especialmente nas primeiras décadas, incentivava uma programação fortemente procedural, baseada em registros, arquivos, seções e parágrafos.

Um programa típico podia ter:

  • uma enorme DATA DIVISION;

  • centenas de campos;

  • dezenas ou centenas de parágrafos;

  • muitos saltos;

  • inúmeros indicadores;

  • estruturas pouco modulares;

  • regras de negócio espalhadas por diferentes pontos.

Dijkstra temia que o contato prolongado com esse modelo criasse maus hábitos intelectuais.

Em outras palavras, ele não estava afirmando apenas que determinados programas COBOL eram ruins. Ele sugeria que a própria linguagem treinava o programador a pensar de maneira inadequada.

Naturalmente, afirmou isso com a suavidade de um elefante tentando entrar em uma loja de porcelana utilizando patins.


4. A sintaxe semelhante ao inglês

Um dos objetivos originais do COBOL era permitir que programas comerciais fossem compreendidos com mais facilidade por pessoas próximas ao negócio.

Veja este exemplo:

       IF SALDO-CLIENTE GREATER THAN LIMITE-CREDITO
           MOVE 'S' TO CLIENTE-BLOQUEADO
       ELSE
           MOVE 'N' TO CLIENTE-BLOQUEADO
       END-IF

Mesmo alguém sem grande experiência consegue perceber a intenção.

O saldo do cliente está sendo comparado com o limite de crédito. Dependendo do resultado, um indicador é alterado.

Essa legibilidade foi uma grande vantagem comercial.

Entretanto, para Dijkstra, a aparência de linguagem natural poderia criar uma falsa sensação de simplicidade.

O fato de uma instrução parecer inglês não significa que o programa inteiro seja simples.

Observe:

       IF CLIENTE-ATIVO
           IF SALDO-DEVEDOR
               IF NOT ACORDO-VIGENTE
                   IF DIAS-ATRASO GREATER THAN 30
                       PERFORM BLOQUEAR-CONTA
                   END-IF
               END-IF
           END-IF
       END-IF

A leitura ainda é possível, mas a complexidade cresce.

Agora imagine esse tipo de lógica repetido em milhares de linhas, com campos de nomes parecidos, regras alteradas durante quarenta anos e comentários escritos por alguém chamado Osvaldo que se aposentou antes da invenção do telefone celular.

A linguagem parece natural.

A regra de negócio, porém, pode ter a clareza de uma reunião parlamentar transmitida por rádio durante uma tempestade.


5. O problema não era apenas o COBOL

Aqui está uma curiosidade importante: Dijkstra criticava muitas coisas.

Ele criticou o uso indiscriminado de GOTO.

Criticou BASIC.

Criticou linguagens excessivamente permissivas.

Criticou práticas de desenvolvimento pouco rigorosas.

Provavelmente criticaria sua variável chamada X2-FLAG-AUX-FINAL-NOVO.

Talvez também criticasse o nome PROGRAMA-FINAL-V2-AGORA-VAI.

Dijkstra defendia que a dificuldade da programação deveria ser controlada por estruturas formais e raciocínio disciplinado.

Ele não estava interessado em saber se o programa “rodou duas vezes sem erro”.

Queria saber se havia razões sólidas para confiar nele.

Essa posição influenciou profundamente o desenvolvimento de linguagens modernas.

Hoje consideramos naturais conceitos como:

  • blocos bem definidos;

  • escopo de variáveis;

  • estruturas condicionais claras;

  • laços controlados;

  • modularização;

  • contratos;

  • tipos;

  • testes;

  • validação;

  • análise estática;

  • separação de responsabilidades.

Muitas dessas ideias dialogam com o tipo de rigor defendido por Dijkstra.


6. Onde ele estava certo?

Seria confortável para a comunidade COBOL simplesmente dizer:

— Ele estava errado. Próximo assunto. Tragam os biscoitos.

Mas isso não seria intelectualmente honesto.

Dijkstra acertou em vários pontos.

6.1 Programas sem estrutura tornam-se perigosos

Considere este código:

       IF ERRO-ARQUIVO
           GO TO TRATA-ERRO.

       PERFORM PROCESSA-REGISTRO.

       IF FIM-ARQUIVO
           GO TO FINALIZA.

       GO TO LE-PROXIMO.

       TRATA-ERRO.
           DISPLAY 'ERRO'.
           GO TO FINALIZA.

       LE-PROXIMO.
           READ ARQUIVO-ENTRADA
               AT END
                   SET FIM-ARQUIVO TO TRUE
           END-READ
           GO TO PROCESSA.

       PROCESSA.
           PERFORM PROCESSA-REGISTRO
           GO TO LE-PROXIMO.

       FINALIZA.
           CLOSE ARQUIVO-ENTRADA.

Esse exemplo é pequeno. Ainda assim, o fluxo exige que o leitor percorra visualmente vários pontos.

Agora imagine 50 mil linhas nesse estilo.

O resultado pode ser um labirinto.

O programa parece ter sido planejado por um arquiteto medieval especializado em construir corredores que terminam em paredes.

A programação estruturada propõe algo mais claro:

       PERFORM UNTIL FIM-ARQUIVO
           READ ARQUIVO-ENTRADA
               AT END
                   SET FIM-ARQUIVO TO TRUE
               NOT AT END
                   PERFORM PROCESSA-REGISTRO
           END-READ
       END-PERFORM

Agora o fluxo está concentrado.

Existe um início, uma condição e um fim.

Essa melhoria está alinhada com as preocupações de Dijkstra.

6.2 A linguagem pode reforçar maus hábitos

Uma linguagem que permite determinada prática não obriga o programador a utilizá-la.

Porém, quanto mais fácil é fazer algo ruim, maior é a chance de isso acontecer.

COBOL tradicional permitia programas gigantescos, campos globais e estruturas muito acopladas.

Se a equipe não aplicasse disciplina, o código poderia crescer como uma criatura de filme de ficção científica alimentada por alterações emergenciais.

Primeiro havia um programa de 500 linhas.

Depois veio uma nova regra tributária.

Depois um campo de controle.

Depois uma exceção para uma filial.

Depois uma exceção para a exceção.

Quando alguém percebeu, o programa tinha 80 mil linhas e exigia a leitura de três manuais, duas atas de reunião e um pergaminho descoberto atrás da impressora.

6.3 Legibilidade não é apenas usar palavras inglesas

Este código parece legível:

       ADD VALOR-A TO VALOR-B GIVING VALOR-C

Mas nomes claros não bastam.

Precisamos conhecer:

  • o significado dos valores;

  • a unidade monetária;

  • a escala decimal;

  • a origem dos dados;

  • os limites;

  • as regras de arredondamento;

  • o comportamento em caso de excesso;

  • a responsabilidade daquela operação.

O código pode ser gramaticalmente bonito e conceitualmente obscuro.

Dijkstra tinha razão ao exigir precisão.


7. Onde ele exagerou?

A frase sobre “ofensa criminosa” era uma provocação retórica, não uma proposta para que professores de COBOL fossem algemados durante a aula.

Ainda assim, ela exagera porque avalia a linguagem principalmente sob uma perspectiva acadêmica.

Empresas não escolhem tecnologias apenas por elegância matemática.

Elas precisam resolver problemas concretos.

Um banco quer:

  • processar milhões de transações;

  • manter precisão decimal;

  • garantir recuperação;

  • registrar auditoria;

  • preservar compatibilidade;

  • operar durante décadas;

  • reduzir riscos;

  • cumprir regras legais.

Uma seguradora não pode dizer ao cliente:

— Perdemos o cálculo da sua apólice, mas o novo sistema utiliza uma arquitetura muito elegante.

O cliente provavelmente responderá:

— Magnífico. Posso pagar o prêmio com elegância abstrata?

O COBOL foi criado para processamento comercial.

Possui características muito adequadas a esse domínio:

  • representação decimal;

  • descrição detalhada de registros;

  • tratamento de arquivos;

  • forte orientação a dados comerciais;

  • legibilidade relativa;

  • integração com ambientes transacionais;

  • excelente desempenho em processamento em lote;

  • estabilidade.

Ele não precisava vencer uma competição de pureza matemática.

Precisava fechar a folha de pagamento.

E fechou.

Por décadas.


8. O grande paradoxo

Dijkstra venceu muitas batalhas conceituais.

A programação estruturada tornou-se dominante.

O uso indiscriminado de GOTO diminuiu.

As linguagens incorporaram melhores mecanismos de abstração.

A Engenharia de Software passou a valorizar modularização, testes, contratos e validação.

Porém, o COBOL não desapareceu.

Ao contrário, incorporou várias dessas melhorias.

O COBOL moderno oferece recursos como:

       EVALUATE TRUE
           WHEN CLIENTE-VIP
               PERFORM PROCESSA-VIP
           WHEN CLIENTE-PREMIUM
               PERFORM PROCESSA-PREMIUM
           WHEN OTHER
               PERFORM PROCESSA-PADRAO
       END-EVALUATE

Também permite:

  • END-IF;

  • END-PERFORM;

  • EVALUATE;

  • funções intrínsecas;

  • chamadas de serviços;

  • integração com bancos relacionais;

  • manipulação de XML;

  • manipulação de JSON;

  • interoperabilidade;

  • compilação otimizada;

  • integração com ferramentas modernas;

  • testes automatizados;

  • análise estática;

  • pipelines de entrega.

Assim, ocorreu algo quase britanicamente absurdo:

Dijkstra criticou o COBOL por suas limitações estruturais.

O COBOL absorveu muitas ideias da programação estruturada.

Depois continuou funcionando.

É como condenar um castelo medieval por não possuir eletricidade e, anos depois, descobrir que instalaram fibra óptica, elevadores e uma cafeteria no salão principal, mas mantiveram as muralhas porque ainda são bastante úteis contra invasores.


9. COBOL moderno não é COBOL de 1965

Muitos críticos imaginam que todos os programas COBOL atuais são escritos assim:

       GO TO 1000-INICIO.

Em seguida, haveria:

       GO TO 2000-MEIO.

E, por fim:

       GO TO 3000-ALGUEM-SABE-O-QUE-ESTA-ACONTECENDO.

Esse tipo de código existiu e ainda pode existir em sistemas antigos. Porém, não representa obrigatoriamente a maneira moderna de programar em COBOL.

Um programa contemporâneo pode ser organizado de forma bastante clara:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. CALCJURO.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01  WS-VALORES.
           05 WS-CAPITAL        PIC S9(9)V99 COMP-3.
           05 WS-TAXA           PIC S9(3)V9(6) COMP-3.
           05 WS-JURO           PIC S9(9)V99 COMP-3.

       PROCEDURE DIVISION.

       0000-PRINCIPAL.
           PERFORM 1000-RECEBER-DADOS
           PERFORM 2000-CALCULAR-JURO
           PERFORM 3000-EXIBIR-RESULTADO
           GOBACK
           .

       1000-RECEBER-DADOS.
           MOVE 1000.00 TO WS-CAPITAL
           MOVE 0.015   TO WS-TAXA
           .

       2000-CALCULAR-JURO.
           COMPUTE WS-JURO ROUNDED =
               WS-CAPITAL * WS-TAXA
           .

       3000-EXIBIR-RESULTADO.
           DISPLAY 'JURO: ' WS-JURO
           .

O fluxo é previsível.

Os dados estão organizados.

Cada parágrafo possui uma finalidade.

Não é necessário esconder um gnomo dentro da LINKAGE SECTION para compreender o programa.


10. Passo a passo para não “aleijar a mente”

Talvez a melhor resposta à provocação de Dijkstra não seja rejeitá-la, mas utilizá-la como alerta.

Você pode programar em COBOL aplicando rigor, estrutura e clareza.

Passo 1 — Entenda a regra antes de escrever código

Não comece pela PROCEDURE DIVISION.

Primeiro responda:

  • Qual problema será resolvido?

  • Quais dados entram?

  • Quais dados saem?

  • Quais regras devem ser respeitadas?

  • Quais erros podem ocorrer?

  • Quais limites existem?

Exemplo:

Calcular desconto para clientes, considerando categoria, valor da compra e campanhas vigentes.

Antes de codificar, escreva uma tabela:

CategoriaCompra mínimaDesconto
Comum500,005%
Premium300,0010%
VIPqualquer valor15%

Isso reduz ambiguidades.

Passo 2 — Modele os dados com precisão

Em COBOL, dados são fundamentais.

       01  WS-COMPRA.
           05 WS-VALOR-COMPRA     PIC S9(7)V99 COMP-3.
           05 WS-PERCENTUAL       PIC S9(3)V99 COMP-3.
           05 WS-VALOR-DESCONTO   PIC S9(7)V99 COMP-3.
           05 WS-VALOR-LIQUIDO    PIC S9(7)V99 COMP-3.

Escolha corretamente:

  • tamanho;

  • sinal;

  • casas decimais;

  • formato;

  • uso computacional.

Não declare todos os valores como PIC X(100) e espere que o universo coopere.

O universo raramente coopera. O compilador, menos ainda.

Passo 3 — Use nomes que expliquem intenção

Evite:

       01  WS-A PIC 9(5).
       01  WS-B PIC 9(5).
       01  WS-C PIC 9(5).

Prefira:

       01  WS-QUANTIDADE-PARCELAS PIC 9(3).
       01  WS-VALOR-PARCELA       PIC 9(7)V99.
       01  WS-VALOR-TOTAL         PIC 9(9)V99.

Um bom nome evita comentários desnecessários.

WS-B exige explicação.

WS-VALOR-TOTAL-FATURA apresenta-se sozinho e provavelmente trouxe documentos.

Passo 4 — Divida o processamento

Organize o programa em etapas:

       0000-PRINCIPAL.
           PERFORM 1000-INICIALIZAR
           PERFORM 2000-PROCESSAR
           PERFORM 3000-FINALIZAR
           GOBACK
           .

Dentro de 2000-PROCESSAR, divida novamente conforme a necessidade.

Cada rotina deve representar uma ação reconhecível.

Evite parágrafos como:

       8450-FAZ-COISAS.

Esse nome não explica nada e parece o título de um departamento governamental.

Passo 5 — Controle o fluxo

Prefira estruturas delimitadas:

       IF VALOR-COMPRA GREATER THAN ZERO
           PERFORM CALCULAR-DESCONTO
       ELSE
           MOVE 'VALOR INVALIDO' TO WS-MENSAGEM
       END-IF

Use EVALUATE quando houver múltiplas condições claras:

       EVALUATE CATEGORIA-CLIENTE
           WHEN 'VIP'
               MOVE 15 TO WS-PERCENTUAL
           WHEN 'PREMIUM'
               MOVE 10 TO WS-PERCENTUAL
           WHEN 'COMUM'
               MOVE 5 TO WS-PERCENTUAL
           WHEN OTHER
               MOVE ZERO TO WS-PERCENTUAL
       END-EVALUATE

O objetivo é permitir que outro programador siga o fluxo sem precisar desenhar um mapa do tesouro.

Passo 6 — Trate erros explicitamente

       READ ARQUIVO-CLIENTES
           AT END
               SET FIM-CLIENTES TO TRUE
           NOT AT END
               PERFORM VALIDAR-CLIENTE
       END-READ

Para operações de arquivo, banco de dados ou serviços, sempre considere:

  • sucesso;

  • fim de dados;

  • ausência de registro;

  • duplicidade;

  • indisponibilidade;

  • dados inválidos;

  • falha técnica.

O erro que não foi tratado não desaparece.

Ele apenas aguarda a sexta-feira, às 17h43.

Passo 7 — Teste as fronteiras

Não teste apenas o caso feliz.

Teste:

  • valor zero;

  • valor negativo;

  • maior valor possível;

  • campo vazio;

  • cliente inexistente;

  • data inválida;

  • arquivo vazio;

  • registro duplicado;

  • limite decimal;

  • arredondamento;

  • overflow.

O caso feliz é educado e raramente quebra o programa.

Os casos de fronteira entram pela janela, bebem seu café e alteram a RETURN-CODE.

Passo 8 — Revise o código como lógica, não como literatura

Pergunte:

  • O fluxo é previsível?

  • As responsabilidades estão separadas?

  • Os nomes são claros?

  • As condições são compreensíveis?

  • Existem efeitos colaterais ocultos?

  • Um iniciante conseguiria acompanhar?

  • O programa depende de conhecimento tribal?

Se a resposta para a última pergunta for “sim, mas o Arnaldo conhece”, existe um risco.

Especialmente se Arnaldo estiver aposentado, morando em uma chácara e se recusar a atender chamadas relacionadas ao sistema de faturamento.


11. A verdadeira arma do COBOL

A maior força do COBOL não é sua aparência de inglês.

Também não é sua idade.

É sua relação com o negócio.

Programas COBOL costumam conter regras que representam décadas de decisões empresariais.

Uma linha aparentemente simples pode refletir:

  • legislação;

  • acordo sindical;

  • regra contábil;

  • política comercial;

  • decisão judicial;

  • contrato;

  • comportamento histórico;

  • exceção regional.

Por exemplo:

       IF DATA-ADMISSAO LESS THAN DATA-LIMITE
           PERFORM CALCULO-ANTIGO
       ELSE
           PERFORM CALCULO-NOVO
       END-IF

Tecnicamente, é um IF.

Empresarialmente, pode representar uma mudança legal que afeta milhões de pessoas.

Essa é uma das razões pelas quais migrar sistemas legados é difícil.

Não basta traduzir sintaxe.

É necessário compreender o significado.

Você pode converter:

       ADD A TO B

para:

b += a;

em poucos segundos.

Mas se ninguém souber o que A e B representam, você apenas transportou o mistério para outra linguagem.

Agora o mistério possui chaves, ponto e vírgula e uma dependência no Maven.


12. Curiosidades do campo de batalha

COBOL foi criado para durar?

Não exatamente da forma como durou.

Ele surgiu para padronizar o processamento de dados comerciais entre diferentes fabricantes.

Sua longevidade foi consequência de:

  • grande adoção;

  • volumes imensos de código;

  • estabilidade;

  • compatibilidade;

  • importância dos sistemas;

  • custo e risco de substituição.

Ser antigo significa ser ruim?

Não.

A roda é antiga.

A contabilidade é antiga.

O chá é antigo.

O Parlamento britânico é tão antigo que algumas de suas regras parecem ter sido compiladas em pergaminho.

Tecnologias devem ser avaliadas pelo contexto, não apenas pela data de nascimento.

COBOL não possui precisão?

Ao contrário.

COBOL é especialmente forte no processamento decimal, algo importante para sistemas financeiros.

Tipos como COMP-3 são amplamente utilizados para armazenar valores decimais com eficiência e precisão.

Todo código COBOL é legado?

Não.

Código legado não significa apenas código antigo.

É possível ter código Java criado no ano passado que ninguém entende, não possui testes e depende de uma biblioteca abandonada.

Esse sistema já nasceu legado.

É um bebê de seis meses usando chapéu, carregando uma bengala e reclamando dos jovens.


13. Easter eggs do Bellacosa Mainframe

Easter egg 1 — O COBOL já morreu muitas vezes

Desde os anos 1980, surgem previsões sobre o fim do COBOL.

A linguagem seria substituída por:

  • linguagens de quarta geração;

  • arquiteturas cliente-servidor;

  • Java;

  • pacotes ERP;

  • serviços web;

  • cloud;

  • microsserviços;

  • inteligência artificial;

  • algum produto apresentado por um consultor apontando para três nuvens e sete hexágonos.

O COBOL ouve calmamente, termina o processamento noturno e volta ao trabalho.

Easter egg 2 — O programa mais perigoso

O programa mais perigoso não é necessariamente o maior.

É aquele que todos consideram simples.

A equipe diz:

— Esse programa só move alguns campos.

Seis horas depois, descobre-se que ele também valida contratos, atualiza três arquivos, envia mensagem ao CICS, altera uma tabela DB2 e decide se o cliente poderá comprar uma geladeira.

Easter egg 3 — O comentário histórico

Em sistemas antigos, você pode encontrar comentários como:

      * ALTERADO EM 1987 CONFORME SOLICITACAO DO SR. ROBERTO

Quem é Roberto?

Ninguém sabe.

O que ele solicitou?

Perdeu-se.

A alteração ainda é necessária?

Provavelmente.

Pode ser removida?

Somente se você deseja transformar a produção em um documentário sobre desastres.

Easter egg 4 — A variável imortal

Todo sistema possui uma variável que aparentemente não é utilizada.

       01 WS-CONTROLE-ANTIGO PIC X.

Alguém tenta removê-la.

O programa compila.

Os testes passam.

Em produção, uma agência bancária em uma ilha remota deixa de processar transferências realizadas em anos bissextos.

A variável volta.

Ninguém mais toca nela.


14. O que um iniciante deve aprender com Dijkstra?

A pior reação seria rejeitar Dijkstra apenas porque ele atacou o COBOL.

A melhor reação é aprender com a crítica.

Um bom programador COBOL deve buscar:

  • rigor;

  • previsibilidade;

  • estrutura;

  • simplicidade;

  • documentação;

  • modularidade;

  • testes;

  • compreensão da regra;

  • responsabilidade operacional.

Você não precisa abandonar COBOL para aplicar programação estruturada.

Ao contrário, pode utilizar conceitos modernos para melhorar sistemas COBOL.

A pergunta correta não é:

COBOL é uma linguagem boa ou ruim?

A pergunta correta é:

Este programa está organizado, compreensível, testável e seguro?

Uma linguagem não salva um projeto mal conduzido.

Também não condena automaticamente um projeto bem desenvolvido.

É possível escrever código excelente em COBOL.

É possível escrever código terrível em Rust, Java, Python, C# ou qualquer outra linguagem moderna.

Ferramentas influenciam nossas decisões, mas não substituem disciplina.

Um martelo pode construir uma casa.

Também pode quebrar uma janela.

Não culpamos o martelo, exceto quando precisamos preencher o relatório de incidente e o martelo não possui advogado.


15. Dijkstra venceu ou o COBOL venceu?

Ambos venceram.

Dijkstra venceu no campo das ideias.

Sua defesa da programação estruturada, do rigor e da clareza ajudou a transformar o desenvolvimento de software.

O COBOL venceu no campo operacional.

Demonstrou capacidade extraordinária de manter processos comerciais funcionando por décadas.

A vitória de um não exige a derrota do outro.

Na verdade, o COBOL moderno tornou-se melhor ao incorporar princípios defendidos por críticos como Dijkstra.

O programador COBOL atual pode trabalhar com:

  • código estruturado;

  • pipelines;

  • Git;

  • testes automatizados;

  • APIs;

  • bancos relacionais;

  • JSON;

  • análise estática;

  • integração contínua;

  • observabilidade;

  • DevOps;

  • ferramentas modernas de desenvolvimento.

O mainframe não está isolado em um castelo coberto por névoa.

Ele conversa com aplicações distribuídas, serviços, canais digitais, nuvens e sistemas móveis.

Às vezes conversa de maneira um pouco formal, porque foi educado nos anos 1960, mas conversa.


Conclusão — O crime que mantém o mundo funcionando

A frase de Dijkstra é brilhante como provocação e injusta como veredicto absoluto.

Ela nos obriga a refletir sobre como as linguagens moldam nossa forma de pensar.

Também alerta para os perigos de programas sem estrutura, saltos descontrolados, dados globais e falta de abstração.

Por outro lado, ignora ou subestima qualidades fundamentais do COBOL:

  • adequação ao processamento comercial;

  • precisão decimal;

  • estabilidade;

  • compatibilidade;

  • legibilidade de regras;

  • capacidade de sustentar operações críticas;

  • longevidade operacional.

O verdadeiro problema nunca foi simplesmente utilizar COBOL.

O problema é utilizar qualquer linguagem sem disciplina.

Um programador pode escrever um programa COBOL claro, modular e seguro.

Outro pode criar um microsserviço moderno, empacotá-lo em um contêiner, executá-lo na nuvem e ainda assim produzir uma criatura incompreensível que consome memória, perde mensagens e envia ao cliente uma fatura correspondente ao consumo elétrico da Escócia.

Tecnologia moderna não garante pensamento moderno.

Ferramenta antiga não implica pensamento ultrapassado.

O iniciante COBOL deve conhecer a história, respeitar as críticas e evitar repetir os erros do passado. Deve compreender profundamente os dados, estruturar o processamento, tratar falhas, testar fronteiras e documentar as regras.

Talvez Dijkstra tenha exagerado ao chamar o ensino de COBOL de ofensa criminosa.

Porém, existe um crime real na programação:

entregar código que ninguém entende, ninguém consegue testar e todos têm medo de alterar.

Esse crime pode ser cometido em qualquer linguagem.

Inclusive na linguagem que substituiria o COBOL.

E agora, enquanto o júri discute o veredicto, o programa COBOL solicita licença para se retirar.

Ele precisa processar a folha de pagamento dos advogados, dos juízes, dos acadêmicos e provavelmente do próprio funcionário que publicou nas redes sociais que COBOL está morto.

       IF COBOL-MORTO
           DISPLAY 'NOTICIA NAO CONFIRMADA'
       ELSE
           PERFORM PROCESSAR-MUNDO
       END-IF.

       GOBACK.

O sino toca.

O cavaleiro passa novamente pelo corredor.

Alguém pergunta onde está o cavalo.

E o operador responde:

— O cavalo foi migrado para a nuvem. A produção, entretanto, continua no mainframe.


sexta-feira, 2 de fevereiro de 2007

O que é Paradigma de Programação Procedural Estruturado?

 

Bellacosa Mainframe e o paradigma de programacao procedural estruturado

O que é Paradigma de Programação Procedural Estruturado?

Quando estudamos:

  • COBOL;

  • C;

  • PL/I;

  • programação batch;

  • desenvolvimento no mainframe;

um conceito muito importante aparece:

programação procedural estruturada.

Ela foi uma enorme evolução na história da computação corporativa.


Primeiro: o que significa “procedural”?

Programação procedural é:

organizar programas em procedimentos e rotinas.

Exemplo:

VALIDAR
CALCULAR
GERAR-RELATORIO

Cada parte executa:

uma tarefa específica.


Então o que significa “estruturada”?

Estruturada significa:

organizar o código de forma clara, previsível e controlada.

Ela evita:

  • confusão;

  • desvios excessivos;

  • código caótico;

  • spaghetti code.


Definição simples

Programação procedural estruturada é:

um paradigma procedural que usa estruturas organizadas de fluxo e modularização.

Ela busca:

  • clareza;

  • manutenção;

  • organização;

  • legibilidade.


Analogia simples

Imagine uma cidade.


Código não estruturado

Ruas sem organização.
Tudo confuso.


Código estruturado

Cidade organizada:

  • avenidas;

  • sinais;

  • setores;

  • fluxo lógico.


Origem histórica

Nos primeiros sistemas:

  • Assembly;

  • COBOL antigo;

  • FORTRAN antigo;

era comum usar muitos:

GO TO

Isso criava programas extremamente difíceis de manter.


Então surgiu a programação estruturada

Com conceitos como:

  • blocos;

  • procedimentos;

  • loops;

  • IF;

  • modularização.


Objetivo principal

Eliminar:

spaghetti code.


O que é spaghetti code?

Código cheio de:

  • desvios;

  • GO TO;

  • saltos;

  • fluxo confuso.

Parecendo:

um prato de espaguete.


Exemplo não estruturado

GO TO A100
GO TO B200
GO TO C300

Fluxo difícil de entender.


Exemplo estruturado

IF SALDO > 0
   PERFORM PROCESSA
ELSE
   PERFORM ERRO
END-IF

Muito mais organizado.


Estruturas fundamentais da programação estruturada


Sequência

Execução linear.


Decisão

Escolha de caminhos.


Repetição

Loops controlados.


Fluxo estruturado clássico

INICIO
 ↓
LER DADOS
 ↓
VALIDAR
 ↓
PROCESSAR
 ↓
GERAR SAÍDA
 ↓
FIM

Como isso aparece no COBOL?

Muito fortemente.


Exemplo COBOL estruturado

PERFORM UNTIL EOF = 'S'

   READ CLIENTE
      AT END
         MOVE 'S' TO EOF
      NOT AT END
         PERFORM PROCESSA-CLIENTE
   END-READ

END-PERFORM

Isso é estruturado porque:

  • possui fluxo claro;

  • evita GO TO;

  • usa blocos organizados.


O que é modularização?

Dividir programa em partes menores.


Exemplo

VALIDAR-CLIENTE
CALCULAR-JUROS
GERAR-RELATORIO

Benefícios

  • manutenção;

  • reutilização;

  • clareza;

  • testes mais fáceis.


O que é bloco estruturado?

Código delimitado logicamente.


Exemplos COBOL

IF / END-IF
EVALUATE
PERFORM UNTIL

Antes da programação estruturada

Muito código tinha:

GO TO

em excesso.


Problema disso

Fluxo imprevisível.


Programação estruturada ajudou a:

  • reduzir bugs;

  • melhorar manutenção;

  • aumentar confiabilidade.


O COBOL moderno é estruturado?

Sim.

Principalmente usando:

  • END-IF;

  • EVALUATE;

  • PERFORM;

  • inline PERFORM.


Exemplo batch estruturado

LER ARQUIVO
 ↓
VALIDAR
 ↓
CALCULAR
 ↓
ATUALIZAR DB2
 ↓
GERAR RELATÓRIO

Como isso ajuda no mainframe?

Mainframes processam:

  • milhões;

  • bilhões de registros.

Precisam de:

  • estabilidade;

  • clareza;

  • manutenção segura.


Programação estruturada trouxe exatamente isso


Características da programação procedural estruturada


Fluxo previsível


Menos GO TO


Uso de procedimentos


Modularização


Blocos organizados


Facilidade manutenção


Legibilidade


Vantagens


Código mais limpo


Mais fácil de entender


Menos erros


Melhor debugging


Excelente para batch


Muito usada em COBOL


Desvantagens


Sistemas gigantes ainda podem ficar complexos


Exige disciplina de programação


Modularização ruim pode dificultar manutenção


Procedural estruturado vs procedural antigo


Antigo

Muito:

GO TO

Estruturado

Mais:

IF
PERFORM
EVALUATE

Procedural estruturado vs orientação a objetos


Estruturado

Organiza:

procedimentos.


OO

Organiza:

objetos/classes.


Curiosidades incríveis

1. A programação estruturada revolucionou o desenvolvimento corporativo


2. Grande parte do COBOL moderno segue princípios estruturados


3. Muitos sistemas bancários antigos passaram por “reestruturação” para remover GO TO


4. Estruturação ajudou muito na manutenção de sistemas gigantes


Erros comuns de iniciantes


1. Usar GO TO demais


2. Criar procedimentos enormes


3. Misturar lógica demais


4. Não modularizar


Dicas importantes

Use:

  • PERFORM;

  • IF;

  • EVALUATE.


Evite GO TO excessivo


Divida lógica em pequenas rotinas


Organize fluxo claramente


Como isso aparece no dia a dia?

Praticamente em:

  • COBOL;

  • batch;

  • DB2 procedural;

  • faturamento;

  • bancos;

  • folha salarial.


Exemplo simplificado completo

MAIN
 ↓
LER CLIENTES
 ↓
VALIDAR
 ↓
CALCULAR
 ↓
ATUALIZAR DB2
 ↓
GERAR RELATÓRIO
 ↓
FIM

Resumo rápido

ConceitoSignificado
ProceduralBaseado em procedimentos
EstruturadoFluxo organizado
ModularizaçãoDividir programa
PERFORMExecuta rotina
IFDecisão
GO TODesvio fluxo
Spaghetti CodeCódigo confuso

Conclusão

O paradigma de programação procedural estruturado organiza programas em procedimentos claros e fluxos previsíveis, reduzindo complexidade e facilitando manutenção.

Ele é a base do COBOL moderno e do processamento batch corporativo no ambiente mainframe IBM Z.


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