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

domingo, 28 de junho de 2026

Backlog: O Dataset Invisível que Pode Salvar ou Destruir um Projeto Mainframe

 

Bellacosa Mainframe e o conceito do backlog na stack mainframe

☕ Um Café no Bellacosa Mainframe

Backlog: O Dataset Invisível que Pode Salvar ou Destruir um Projeto Mainframe

"No mundo IBM Z, um programa COBOL raramente quebra por causa de uma linha de código. Quase sempre ele quebra porque existe um backlog que ninguém quis enxergar."

Existe uma palavra que todo profissional de TI escuta diariamente: Backlog.

Ela aparece em reuniões ágeis, em SCRUM, em Kanban, nos relatórios do gerente, nos dashboards do Jira e até em apresentações do CIO.

Mas curiosamente, poucos programadores COBOL entendem o verdadeiro significado do backlog.

Para um Padawan Mainframe, backlog costuma parecer apenas uma lista enorme de tarefas.

Na realidade, backlog é muito mais parecido com um dataset VSAM KSDS.

Ele armazena tudo que ainda precisa ser processado.

Se ele estiver organizado, o sistema flui.

Se estiver corrompido...

Você acabou de criar o próximo ABEND da equipe.


Imagine um Batch Noturno

Pense em um JOB executando durante a madrugada.

Ele possui:

  • milhares de registros

  • prioridades

  • dependências

  • checkpoints

  • reprocessamentos

Agora substitua os registros por atividades.

Pronto.

Você acabou de entender o backlog.

O backlog é simplesmente o conjunto de trabalho que ainda será executado.

Mas existe uma diferença enorme entre:

muito trabalho

e

backlog saudável.


O Backlog Não É o Problema

O backlog é inevitável.

Todo sistema vivo possui backlog.

Até o z/OS trabalha com filas.

JES2 possui filas.

CICS possui filas.

MQ possui filas.

IMS possui filas.

DB2 possui locks esperando.

Tudo funciona através de filas.

O problema nunca foi possuir backlog.

O problema é possuir um backlog que ninguém entende.


Como Nasce um Backlog

Imagine um sistema bancário.

Hoje o gerente pede:

Criar PIX.

Depois:

alterar TED.

Depois:

corrigir boleto.

Depois:

adequação ao Banco Central.

Depois:

LGPD.

Depois:

Open Finance.

Depois:

PIX Automático.

Depois:

IA.

Depois:

APIs REST.

Cada solicitação entra.

Nem todas saem.

O resultado?

Um backlog crescente.


O Backlog Invisível

O pior backlog é o invisível.

Ele mora em frases como:

"Depois a gente vê."

"Na próxima Sprint."

"Isso fica para outro momento."

"É uma melhoria."

"Não é urgente."

Meses depois...

Existem centenas delas.


Backlog Técnico

Nem todo backlog é funcional.

Existe também:

  • melhoria de performance

  • reorganização de programas

  • limpeza de código

  • documentação

  • atualização de COPYBOOKS

  • reorganização DB2

  • índices

  • compressão VSAM

  • testes

Tudo isso entra no backlog.


Como Identificar um Backlog Doente

Um backlog começa a adoecer quando aparecem sintomas.

Sintoma 1

Todo mundo pergunta:

"O que devemos fazer agora?"

Isso significa ausência de prioridade.


Sintoma 2

Existem tarefas de três anos atrás.

Se ninguém fez em três anos...

Talvez nunca devesse existir.


Sintoma 3

Existem tarefas duplicadas.

Muito comum.

Um analista abre:

"Corrigir cálculo."

Outro abre:

"Ajustar juros."

Outro:

"Problema financeiro."

São o mesmo erro.


Sintoma 4

Ninguém sabe explicar a tarefa.

Descrição:

"Verificar erro."

Qual erro?

Onde?

Quando?

Por quê?


Sintoma 5

Todo item é prioridade máxima.

Quando tudo é urgente...

Nada é urgente.


Como um Programador COBOL Deve Ler um Backlog

Nunca leia apenas o título.

Leia:

  • requisito

  • regra de negócio

  • programas envolvidos

  • COPYBOOKS

  • arquivos

  • tabelas DB2

  • transações CICS

  • JCL

  • impacto

A tarefa começa muito antes do código.


O Erro do Padawan

O Padawan pensa:

"Recebi uma tarefa."

O profissional experiente pensa:

"Recebi um problema de negócio."

Isso muda tudo.


Como Evoluir um Backlog

Existe uma prática chamada:

Backlog Refinement

Ou refinamento.

No Mainframe isso seria parecido com preparar um JOB antes da produção.

Você elimina ambiguidades.


Durante o refinamento fazemos perguntas.

O usuário realmente quer isso?

Existe impacto financeiro?

Existe impacto jurídico?

Existe cálculo?

Existe histórico?

Existe rollback?

Existe auditoria?

Existe logging?

Existe batch?

Existe online?

Existe integração?


Quanto mais perguntas...

Menor o risco.


Um Backlog Não Deve Crescer Para Sempre

Imagine um dataset.

Se ninguém fizer housekeeping...

Ele cresce.

Depois cresce.

Depois cresce.

Depois o volume explode.

Depois aparece:

SPACE ABEND

O backlog também.


Como Priorizar

Uma técnica simples.

Divida em quatro grupos.

Incêndio

Sistema parado.


Financeiro

Pode gerar prejuízo.


Cliente

Afeta usuários.


Melhoria

Pode esperar.


A maioria dos times mistura tudo.


Backlog e COBOL

Um programa COBOL raramente possui apenas uma alteração.

Quando você abre um fonte...

Encontra:

Alteração 2003

Alteração 2006

Alteração 2009

Alteração 2014

Alteração 2018

Alteração 2021

Alteração 2025

Cada comentário representa um backlog encerrado.

O código conta a história da empresa.


O Backlog Bom

Possui:

✔ descrição

✔ prioridade

✔ responsável

✔ impacto

✔ dependência

✔ prazo

✔ critério de aceite

✔ documentação


O Backlog Ruim

Descrição:

"Ajustar."

Boa sorte.


A Grande Diferença Entre Backlog e Dívida Técnica

Muita gente mistura.

Mas são conceitos completamente diferentes.

Backlog

É trabalho conhecido.

Sabemos que precisa ser feito.

Está registrado.

Está visível.

Pode ser priorizado.


Dívida Técnica

É trabalho escondido.

Você decidiu fazer algo mais rápido.

Agora pagará juros.


Imagine um empréstimo.

Você compra uma casa.

Ainda deve dinheiro.

A casa existe.

Mas existe dívida.

No software é igual.


Exemplo.

Você precisava entregar uma alteração.

O correto seria:

  • modularizar

  • criar testes

  • atualizar documentação

Mas o prazo era curto.

Você fez um IF gigantesco.

Funcionou.

Pronto.

Nasceu uma dívida técnica.


Backlog Pode Não Ser Dívida

Exemplo.

Nova funcionalidade PIX.

Ela nunca existiu.

Está no backlog.

Não existe dívida.

É apenas trabalho futuro.


Dívida Técnica Pode Não Estar no Backlog

Muito comum.

Todo mundo sabe que existe.

Ninguém registra.

Ninguém fala.

Até o dia em que explode.


Como Identificar Dívida Técnica

Pergunte:

"Se eu tivesse mais tempo...

faria diferente?"

Se a resposta for SIM...

Existe dívida técnica.


Os Juros da Dívida Técnica

Assim como um banco cobra juros...

O software também.

Cada alteração demora mais.

Cada teste demora mais.

Cada deploy gera medo.

Cada manutenção aumenta.


Dívida Técnica no Mainframe

Exemplos.

Programa COBOL com:

12000 linhas.

Sem PERFORM.

GO TO para todos os lados.

COPYBOOK repetido.

Campos duplicados.

Comentários de 1998.

Variáveis mortas.

Parágrafos nunca chamados.

SQL repetido.

MOVE desnecessário.

PERFORM THROUGH gigantesco.

Tudo isso gera dívida.


Como Corrigir

Nunca tente pagar toda a dívida de uma vez.

Faça igual um financiamento.

Pague parcelas.

Sempre que alterar um programa:

melhore um pouco.

Renomeie variáveis.

Remova código morto.

Atualize comentários.

Crie testes.

Melhore SQL.

Refatore pequenos blocos.


A Regra do Escoteiro

Robert C. Martin criou uma regra famosa.

Deixe o código melhor do que encontrou.

No Mainframe ela é perfeita.


Backlog Funcional

Pedido do negócio.


Backlog Técnico

Pedido da TI.


Backlog Arquitetural

Mudanças estruturais.

Exemplos.

Migrar VSAM.

Migrar CICS.

Atualizar COBOL.

Atualizar compilador.

Migrar DB2.

Atualizar RACF.


O Backlog Nunca Acaba

Isso assusta iniciantes.

Mas é normal.

Software vivo nunca termina.

Ele evolui.


Curiosidade Mainframe nº 1

Nos anos 70 ninguém dizia "Backlog".

Chamavam de:

Pending Requests

Programming Queue

Change Queue

Maintenance Queue

A palavra backlog ficou popular muito depois com métodos ágeis.


Curiosidade nº 2

Em muitos bancos brasileiros ainda existem planilhas Excel paralelas ao Jira.

Sim.

O backlog oficial nem sempre é o verdadeiro.


Curiosidade nº 3

Algumas empresas possuem backlog maior que o código.

Há milhares de demandas abertas.

Mas apenas algumas centenas realmente serão desenvolvidas.


Curiosidade nº 4

O maior inimigo do backlog não é a falta de programadores.

É a falta de decisão.


Curiosidade nº 5

Muitos ABENDs históricos aconteceram porque uma melhoria pequena ficou anos esquecida.

Quando finalmente foi feita...

Ninguém mais entendia o motivo original.


Easter Egg IBM Z

Você já percebeu?

O JES2 organiza trabalhos.

O MQ organiza mensagens.

O CICS organiza transações.

O DB2 organiza dados.

O RACF organiza permissões.

O backlog organiza pessoas.

No fundo...

Todo o ecossistema IBM Z é baseado em gerenciamento de filas.


Easter Egg COBOL

O comando:

NEXT SENTENCE

parece simples.

Mas ele simboliza exatamente muitos backlogs.

Você pula para frente sem realmente resolver o problema.

Funciona.

Até deixar de funcionar.


Easter Egg DB2

Um índice mal planejado gera consultas lentas.

Um backlog mal priorizado gera equipes lentas.

Os dois possuem exatamente o mesmo problema:

falta de organização.


Easter Egg CICS

Em CICS existe o conceito de resposta rápida.

O usuário não pode esperar.

No backlog também.

Quanto mais tempo uma tarefa fica parada...

Maior a chance de perder contexto.


Easter Egg JCL

Imagine um JOB.

STEP010

STEP020

STEP030

STEP040

Existe ordem.

Existe dependência.

Existe fluxo.

Um backlog deveria funcionar exatamente assim.


Easter Egg VSAM

Um KSDS desorganizado sofre mais splits.

Uma equipe desorganizada sofre mais interrupções.


Easter Egg RACF

No RACF, tudo segue o princípio do menor privilégio.

No backlog, vale um princípio parecido:

o menor item possível.

Histórias pequenas fluem melhor do que demandas gigantescas.


O Conselho Final para Todo Padawan COBOL

Quando você entrar em um projeto Mainframe, não olhe apenas para o código-fonte. Observe a saúde do backlog. Um programa de 30 anos pode ser surpreendentemente fácil de manter se houver um backlog bem organizado, prioridades claras e comunicação constante entre negócio e tecnologia. Por outro lado, um sistema moderno pode se tornar um pesadelo quando acumula tarefas mal descritas, prioridades conflitantes e dívida técnica ignorada.

Aprenda a fazer perguntas antes de programar. Entenda a regra de negócio antes de abrir o editor COBOL. Documente suas descobertas, refine as histórias, questione requisitos ambíguos e aproveite cada manutenção para deixar o código um pouco melhor do que estava. Essa disciplina, repetida diariamente, transforma um Padawan em um verdadeiro Mestre Mainframe.

No universo IBM Z, backlog é o mapa da jornada, enquanto a dívida técnica é o peso que você carrega na mochila. O mapa pode crescer à medida que novos caminhos surgem, mas o peso só aumenta quando atalhos mal planejados são tomados. Os melhores profissionais aprendem a equilibrar os dois: mantêm um backlog claro, vivo e priorizado, enquanto pagam pequenas parcelas da dívida técnica a cada entrega.

No fim das contas, a maior lição é simples: software não é apenas código; é uma fila contínua de decisões. Assim como o JES2 coordena jobs, o CICS gerencia transações e o DB2 organiza dados, um bom desenvolvedor organiza seu trabalho, seu conhecimento e sua evolução. É essa capacidade de transformar caos em ordem que diferencia um programador que apenas entrega tarefas de um engenheiro que constrói sistemas capazes de sobreviver por décadas — exatamente como os grandes ambientes IBM Z que continuam sustentando bancos, seguradoras, governos e empresas em todo o mundo.


quarta-feira, 3 de junho de 2026

☕💣📋 HOW TO PAY BACK TECHNICAL DEBT — O DIA EM QUE O PROGRAMADOR COBOL DESCOBRIU QUE ESTAVA PAGANDO JUROS POR UMA DECISÃO TOMADA EM 1998

 

Bellacosa Mainframe como pagar dividas tecnicas em mainframe



☕💣📋 HOW TO PAY BACK TECHNICAL DEBT — O DIA EM QUE O PROGRAMADOR COBOL DESCOBRIU QUE ESTAVA PAGANDO JUROS POR UMA DECISÃO TOMADA EM 1998

Existe uma frase muito conhecida no mercado de tecnologia:

"Toda empresa tem dívida técnica. Algumas apenas ainda não receberam a cobrança."

Para um programador COBOL Mainframe júnior, a expressão "dívida técnica" parece algo moderno, criado por arquitetos ágeis, consultores de transformação digital ou gurus do DevOps.

Mas a verdade é muito mais divertida.

Muito antes de alguém inventar Scrum, Kanban, DevOps, GitHub ou Microservices, os programadores COBOL já acumulavam dívida técnica sem saber.

Toda vez que alguém dizia:

"Depois a gente arruma."

Nascia uma nova parcela.

E em muitos ambientes z/OS, ainda estamos pagando prestações de decisões tomadas há 20 ou 30 anos.

Pegue seu café porque hoje vamos entender como identificar, medir, controlar e pagar dívida técnica sem derrubar a produção.


O QUE É DÍVIDA TÉCNICA?

A definição mais simples é:

Dívida técnica é o custo futuro criado por uma decisão técnica tomada para resolver um problema rapidamente hoje.

Imagine um programa COBOL.

Você precisa entregar uma alteração urgente.

O correto seria:

  • Revisar arquitetura

  • Atualizar documentação

  • Criar testes

  • Refatorar módulos

Mas o prazo é amanhã.

Então alguém faz:

IF CLIENTE = '999999'
    GO TO TRATAMENTO-ESPECIAL.

Entrega.

Produção funciona.

Cliente feliz.

Projeto encerrado.

Mas daqui a dois anos ninguém lembra por que aquele IF existe.

A dívida nasceu.


O MAIOR MITO DO MAINFRAME

Muita gente acredita que:

"Código antigo é dívida técnica."

Errado.

Código antigo pode ser excelente.

Existem programas COBOL escritos nos anos 80 que ainda hoje são exemplos de engenharia.

Por outro lado, existem programas escritos há seis meses que já nasceram endividados.

A idade do código não importa.

O que importa é:

  • Complexidade

  • Manutenibilidade

  • Clareza

  • Testabilidade

  • Documentação


COMO IDENTIFICAR DÍVIDA TÉCNICA

O primeiro passo é aprender a enxergá-la.

Alguns sintomas clássicos:

Programa que ninguém quer alterar

Quando uma demanda chega e todos falam:

"Tomara que não seja naquele programa..."

Existe dívida.


Alteração simples demora dias

Mudança:

Trocar 20 para 25.

Tempo gasto:

3 dias

Existe dívida.


Muitos abends

Se o mesmo módulo gera incidentes frequentemente:

  • S0C7

  • S0C4

  • SQLCODE negativos

  • Arquivos inconsistentes

Existe dívida.


Dependência de especialistas

Quando apenas uma pessoa entende o sistema.

Isso é uma dívida técnica humana.

Extremamente perigosa.


A METÁFORA DO CARTÃO DE CRÉDITO

A IBM utiliza uma analogia excelente.

Imagine um cartão.

Você compra algo hoje.

O benefício é imediato.

O pagamento fica para depois.

Dívida técnica funciona igual.

Benefício imediato:

Entreguei no prazo

Pagamento futuro:

Mais manutenção
Mais defeitos
Mais testes
Mais retrabalho

O problema não é usar o cartão.

O problema é esquecer da fatura.


COMO MAPEAR A DÍVIDA TÉCNICA

A primeira atividade prática é criar um inventário.

Monte uma planilha contendo:

SistemaProblemaImpactoPrioridade
CadastroGO TO excessivoMédioMédia
CobrançaSem documentaçãoAltoAlta
FaturamentoAlta complexidadeAltoAlta

Você não consegue corrigir aquilo que não consegue enxergar.


MÉTRICA 1 – COMPLEXIDADE CICLOMÁTICA

Uma das métricas mais famosas.

Ela mede quantos caminhos lógicos existem em um programa.

Exemplo:

IF A
   ...
ELSE
   ...
END-IF

Pouca complexidade.

Agora imagine:

IF A
 IF B
  IF C
   IF D

A complexidade explode.

Quanto maior a complexidade:

  • Mais difícil testar

  • Mais difícil manter

  • Maior risco de erro

Regra prática:

ValorSituação
1 a 10Boa
11 a 20Atenção
Acima de 20Risco

MÉTRICA 2 – TEMPO DE MANUTENÇÃO

Métrica simples.

Quanto tempo leva para implementar uma mudança?

Exemplo:

Alteração simples:

4 horas

Virou:

3 dias

A dívida está cobrando juros.


MÉTRICA 3 – QUANTIDADE DE INCIDENTES

Monitore:

  • Chamados

  • Tickets

  • Problemas recorrentes

Se determinado programa gera:

20% dos incidentes

Ele deve entrar imediatamente no backlog técnico.


MÉTRICA 4 – COBERTURA DE TESTES

Quanto do sistema possui testes?

Exemplo:

10%

Muito arriscado.

80%

Muito saudável.

No mundo COBOL isso pode envolver:

  • Unit Test

  • Testes automatizados

  • Batch Validation


MÉTRICA 5 – TEMPO MÉDIO DE RECUPERAÇÃO

MTTR

Mean Time To Recovery.

Quanto tempo leva para resolver um problema?

Exemplo:

10 minutos

Excelente.

8 horas

Existe forte dívida técnica.


A REGRA DOS 20%

Uma prática muito utilizada é reservar:

80% desenvolvimento
20% redução de dívida técnica

Isso impede que a dívida cresça infinitamente.


TÉCNICA 1 – REFATORAÇÃO CONTÍNUA

Refatorar significa melhorar sem alterar comportamento.

Exemplo:

Antes:

GO TO ERRO.
GO TO ERRO.
GO TO ERRO.

Depois:

PERFORM TRATA-ERRO.

Mesmo resultado.

Código mais limpo.


TÉCNICA 2 – MODULARIZAÇÃO

Programas gigantes são fábricas de dívida.

Já encontrei programas com:

80.000 linhas

Divida responsabilidades.

Crie módulos menores.

Mais simples de entender.

Mais simples de testar.


TÉCNICA 3 – DOCUMENTAÇÃO VIVA

Documentação morta é inútil.

Documentação viva é atualizada junto com o sistema.

Documente:

  • Fluxos

  • Arquivos

  • Tabelas

  • Regras de negócio


TÉCNICA 4 – ELIMINAÇÃO DE CÓDIGO MORTO

Existe um cemitério escondido em todo sistema.

Trechos como:

IF FLAG = 'X'

Que nunca mais executam.

Remover código morto reduz:

  • Complexidade

  • Risco

  • Tempo de manutenção


TÉCNICA 5 – BACKLOG TÉCNICO

Crie um backlog específico.

Exemplo:

Remover GO TO
Documentar módulo
Automatizar teste
Eliminar código morto

A dívida precisa aparecer oficialmente.

Caso contrário ela nunca será priorizada.


FERRAMENTAS ÚTEIS NO MUNDO MAINFRAME

IBM Application Discovery

Mapeia dependências.

Mostra:

  • Programas

  • Arquivos

  • CICS

  • DB2

Excelente para arqueologia de sistemas.


IBM ADDI

Application Discovery and Delivery Intelligence.

Permite visualizar relacionamentos invisíveis.

Muito útil para sistemas legados.


SonarQube

Mesmo para COBOL.

Detecta:

  • Complexidade

  • Duplicação

  • Código suspeito


IBM Developer for z/OS

Auxilia:

  • Navegação

  • Análise

  • Refatoração


Jira

Controle de backlog técnico.

Muitas empresas utilizam para registrar dívida técnica.


EASTER EGG MAINFRAME

Quer descobrir rapidamente onde existe dívida?

Procure:

GO TO
ALTER
NEXT SENTENCE

Ou:

STEP099
STEP100
STEP101

Sem documentação.

Você provavelmente encontrou um sítio arqueológico corporativo.


O ERRO MAIS COMUM DOS JUNIORES

Pensar:

"Vou reescrever tudo."

Não.

Esse é o caminho para o desastre.

A melhor estratégia quase sempre é:

Pequenas melhorias contínuas.

Todo dia.

Toda sprint.

Todo projeto.

Toda manutenção.


COMO EVOLUIR COMO PROFISSIONAL

Programadores experientes não são aqueles que escrevem mais código.

São aqueles que reduzem complexidade.

Quando você consegue olhar para um sistema e dizer:

"Esse trecho vai gerar problema daqui a dois anos."

Você começou a pensar como arquiteto.


O SEGREDO DOS MELHORES ANALISTAS DE SISTEMAS

Eles não combatem apenas bugs.

Eles combatem as causas dos bugs.

Essa é a diferença entre apagar incêndios e construir sistemas duradouros.


CONCLUSÃO

Dívida técnica não é um defeito.

Ela é uma ferramenta.

Em alguns momentos vale a pena assumir a dívida para entregar rapidamente.

O problema surge quando ninguém controla o saldo.

O programador COBOL júnior que aprender a:

  • Identificar dívida

  • Medir dívida

  • Priorizar dívida

  • Reduzir dívida

  • Monitorar dívida

Terá uma visão muito mais próxima de um arquiteto de sistemas do que de um simples codificador.

Porque no fim das contas, o maior segredo do Mainframe não é fazer programas funcionarem.

É garantir que eles continuem funcionando daqui a 30 anos sem que alguém precise vender a alma para entender por quê.



terça-feira, 2 de junho de 2026

☕💣📋 DÍVIDA TÉCNICA NO MAINFRAME — O EMPRÉSTIMO QUE VOCÊ FEZ EM 1998 E AINDA ESTÁ PAGANDO COM JUROS EM 2026

 

Bellacosa Mainframe divida tecnica decisões erradas que pagamos até hoje


☕💣📋 DÍVIDA TÉCNICA NO MAINFRAME — O EMPRÉSTIMO QUE VOCÊ FEZ EM 1998 E AINDA ESTÁ PAGANDO COM JUROS EM 2026

Existe uma lenda antiga nos CPDs.

Ela diz que, em algum lugar do ambiente de produção, existe um programa COBOL que ninguém entende.

Ninguém sabe quem escreveu.

Ninguém sabe por que funciona.

Ninguém sabe o que acontece se ele parar.

Mas todos sabem de uma coisa:

ninguém tem coragem de mexer nele.

Se você trabalha em Mainframe há algum tempo, provavelmente já encontrou um desses.

Talvez ele tenha 30 mil linhas.

Talvez possua 700 GO TO.

Talvez utilize arquivos VSAM que nem aparecem mais na documentação.

Talvez tenha comentários escritos por alguém que já se aposentou há vinte anos.

E talvez ele continue processando milhões de reais por dia.

Parabéns.

Você acabou de encontrar um dos sintomas mais clássicos da dívida técnica.


O QUE É DÍVIDA TÉCNICA?

O termo foi criado por Ward Cunningham.

A ideia é simples.

Você faz uma escolha rápida hoje para ganhar velocidade.

Em troca, aceita que precisará corrigir aquilo futuramente.

É exatamente igual a um empréstimo bancário.

Você recebe um benefício imediato.

Mas depois paga juros.

No software, os juros aparecem na forma de:

  • retrabalho;

  • manutenção mais lenta;

  • defeitos;

  • incidentes;

  • dificuldade de evolução;

  • dependência de especialistas.

O problema é que muitas empresas pegam esse empréstimo todos os dias.

E quase nunca pagam.


O DIA EM QUE O SISTEMA COMEÇA A COBRAR JUROS

Imagine um programador COBOL júnior.

Recebe uma demanda urgente.

Precisa incluir um novo código de operação.

O correto seria:

  • revisar regras;

  • criar módulo reutilizável;

  • atualizar documentação;

  • executar testes.

Mas o prazo está apertado.

Então ele faz:

IF COD-OPER = '99'
   MOVE 'S' TO FLAG-ESPECIAL
END-IF.

Entrega.

Funciona.

Todos ficam felizes.

Seis meses depois surge:

Operação 98.

Depois 97.

Depois 96.

Quando alguém percebe, existe:

IF COD-OPER = '99'
OR COD-OPER = '98'
OR COD-OPER = '97'
OR COD-OPER = '96'

O programa continua funcionando.

Mas ficou pior.

Essa diferença entre funcionar e ser saudável é onde mora a dívida técnica.


COMO IDENTIFICAR DÍVIDA TÉCNICA

Os sinais são sempre parecidos.

1. Programas gigantes

Quando um COBOL possui:

  • 10 mil linhas;

  • 20 mil linhas;

  • 50 mil linhas;

ninguém consegue compreender tudo.

Complexidade gera risco.


2. Dependência de uma única pessoa

Quando você ouve:

"Somente o João conhece esse sistema."

Acenda o alerta vermelho.

O João pode tirar férias.

O João pode mudar de empresa.

O João pode se aposentar.

O sistema precisa sobreviver sem heróis.


3. Medo de alterar

Se toda mudança gera receio:

"Vamos torcer para não derrubar produção."

Existe dívida técnica.


4. Muitas correções

Quando a equipe passa mais tempo corrigindo do que evoluindo.

O sistema está pagando juros elevados.


AS PRINCIPAIS MÉTRICAS

Métricas transformam sensação em informação.

Sem métricas ninguém sabe se está melhorando.


1. LEAD TIME

Tempo entre solicitação e entrega.

Exemplo:

Pedido feito em:

01/06

Produção:

10/06

Lead Time = 9 dias

Quanto menor melhor.


2. CYCLE TIME

Tempo efetivamente gasto desenvolvendo.

Exemplo:

Demanda recebida.

Ficou parada cinco dias.

Desenvolvimento levou dois dias.

Cycle Time = 2 dias.


3. CHANGE FAILURE RATE

Percentual de mudanças que causam problemas.

Exemplo:

100 implantações.

10 causaram incidentes.

Taxa:

10%

Quanto menor melhor.


4. MTTR

Mean Time To Recovery.

Tempo médio para recuperar produção.

Exemplo:

ABEND às 10h.

Sistema normal às 11h.

MTTR = 1 hora.


5. REWORK

Retrabalho.

Mede quanto esforço foi gasto corrigindo erros.

Imagine:

100 horas trabalhadas.

25 horas corrigindo problemas.

Rework:

25%

Muito alto.


6. REFATORAÇÃO

Esforço dedicado a melhorar código existente.

Uma equipe saudável normalmente reserva tempo para:

  • limpeza;

  • reorganização;

  • modularização.


ENTENDENDO O GRÁFICO DA LINEARB

Imagine:

59% Novo Trabalho

17% Refatoração

24% Retrabalho

Significa:

A cada 100 horas:

59 horas criam valor.

17 horas melhoram qualidade.

24 horas apagam incêndios.

Quase um quarto da energia da equipe foi desperdiçada.


COMO REDUZIR DÍVIDA TÉCNICA

Agora chegamos ao ponto mais importante.


PASSO 1 — MAPEAR O PROBLEMA

Não tente resolver tudo.

Primeiro descubra:

  • quais programas mudam mais;

  • quais causam mais incidentes;

  • quais possuem maior complexidade.

Faça uma planilha simples.

ProgramaAlteraçõesIncidentes
FIN00112015
FIN002100
FIN0039512

Comece pelos maiores problemas.


PASSO 2 — CRIAR BACKLOG TÉCNICO

Muitas empresas possuem backlog funcional.

Poucas possuem backlog técnico.

Crie itens como:

  • remover código morto;

  • modularizar rotina;

  • eliminar duplicação;

  • documentar interfaces.

Essas atividades precisam ser visíveis.


PASSO 3 — REFATORAR PEQUENO

Erro clássico:

"Vamos reescrever tudo."

Não faça isso.

Melhore gradualmente.

Hoje:

  • extrair um parágrafo.

Amanhã:

  • eliminar duplicação.

Depois:

  • criar módulo reutilizável.

Pequenas vitórias acumulam grandes resultados.


PASSO 4 — DOCUMENTAR

Documentação não precisa ser um livro.

Basta responder:

  • o que faz;

  • entradas;

  • saídas;

  • dependências.

Já ajuda enormemente.


PASSO 5 — REVISÃO DE CÓDIGO

Mesmo no Mainframe.

Principalmente no Mainframe.

Checklist simples:

✓ Nome adequado

✓ Lógica clara

✓ Tratamento de erro

✓ Performance

✓ Documentação

✓ Testes


PASSO 6 — TESTES

O segredo dos sistemas modernos.

Sem testes:

refatorar é perigoso.

Com testes:

refatorar é seguro.

Mesmo em COBOL.

Ferramentas como:

  • IBM Debug Tool

  • IBM Application Discovery

  • IBM ZUnit

  • Micro Focus Unit Testing

ajudam muito.


PASSO 7 — REDUZIR COMPLEXIDADE

Pergunta mágica:

"Existe uma forma mais simples?"

Sempre existe.

Quanto mais simples:

  • menor risco;

  • menor manutenção;

  • menor custo.


FERRAMENTAS ÚTEIS

IBM Application Discovery

Mapeia dependências.

Mostra:

  • programas;

  • copybooks;

  • arquivos;

  • fluxos.

Excelente para arqueologia de sistemas.


SonarQube

Analisa qualidade.

Detecta:

  • duplicação;

  • complexidade;

  • vulnerabilidades.


Git

Mesmo para Mainframe.

Ajuda a controlar mudanças.


Jira

Controle de backlog técnico.


ServiceNow

Correlação entre incidentes e sistemas.


O SEGREDO QUE NINGUÉM CONTA

A maioria das dívidas técnicas não nasce do código.

Nasce da organização.

Promessas irreais.

Prazos impossíveis.

Mudanças constantes.

Prioridades conflitantes.

O código apenas reflete o ambiente em que foi criado.


EASTER EGG MAINFRAME

Existe um teste simples.

Abra um programa COBOL.

Role até o final.

Se encontrar:

GO TO FIM-PROGRAMA

não se assuste.

Se encontrar:

GO TO INICIO

fique atento.

Se encontrar:

GO TO PARAGRAFO-XYZ

que chama outro GO TO que chama outro GO TO...

Parabéns.

Você encontrou uma relíquia arqueológica do período Jurássico dos sistemas corporativos.


O CAMINHO DE EVOLUÇÃO DO PROGRAMADOR JÚNIOR

Nível 1:

Faz funcionar.

Nível 2:

Faz funcionar corretamente.

Nível 3:

Faz funcionar de forma simples.

Nível 4:

Faz funcionar de forma sustentável.

Nível 5:

Melhora o sistema toda vez que toca nele.

É nesse último estágio que nasce o verdadeiro arquiteto de sistemas.


A GRANDE LIÇÃO

O programador iniciante acredita que seu trabalho é escrever código.

O programador experiente descobre que seu trabalho é reduzir complexidade.

Código novo gera valor.

Mas código limpo preserva valor.

A dívida técnica não explode como um ABEND.

Ela cresce silenciosamente.

Linha após linha.

Workaround após workaround.

Correção após correção.

Até o dia em que uma mudança de cinco minutos passa a exigir três semanas.

Nesse momento os juros finalmente chegaram.

E como qualquer empréstimo antigo, quanto mais tempo você esperar para pagar, mais caro ficará.


quinta-feira, 5 de dezembro de 2024

CSI Mainframe: Os 10 Desafios de Modernizar Sistemas Legados sem Destruir a Cena do Crime Quando um Programador COBOL Descobre que o Sistema Antigo Não é o Suspeito

 

Bellacosa Mainframe e os 10 desafios para modernizar sistemas legados

☕ Um Café no Bellacosa Mainframe

CSI Mainframe: Os 10 Desafios de Modernizar Sistemas Legados sem Destruir a Cena do Crime

Quando um Programador COBOL Descobre que o Sistema Antigo Não é o Suspeito — É a Principal Testemunha do Caso

Era pouco depois das três da manhã quando o telefone tocou.

No Data Center, as luzes permaneciam frias, constantes, quase indiferentes ao drama humano. No console, uma sequência de mensagens indicava que alguma coisa havia parado. Não era ainda um desastre completo, mas havia sinais suficientes para mobilizar a equipe.

Uma aplicação recém-modernizada havia entrado em produção poucas horas antes. O projeto prometia velocidade, flexibilidade, economia e uma experiência de usuário moderna. A apresentação para a diretoria havia usado palavras como transformação digital, inovação, nuvem, agilidade e arquitetura de próxima geração.

Agora, porém, ninguém queria falar sobre os slides.

Um processo de conciliação financeira não havia sido executado.

O sistema novo afirmava que tudo estava correto.

O sistema antigo, que deveria ter sido aposentado, havia deixado um arquivo vazio em uma biblioteca temporária.

Um programador iniciante olhou para a tela e fez a pergunta mais perigosa de toda a investigação:

— Mas esse programa não tinha sido desativado?

O analista mais experiente tomou um gole de café, observou o job no SDSF e respondeu:

— Oficialmente, sim.

Naquele instante, o jovem programador descobriu uma verdade fundamental do ambiente corporativo:

um sistema legado nunca desaparece apenas porque alguém escreveu “desativado” em uma planilha.

Ele desaparece quando todas as dependências foram identificadas, todos os usuários foram preparados, todas as regras foram compreendidas, todos os dados foram preservados, todos os testes foram executados e todos os caminhos de retorno foram planejados.

Até lá, o sistema continua presente.

Às vezes como aplicação.

Às vezes como arquivo.

Às vezes como interface.

Às vezes como hábito.

E, em muitos casos, como fantasma.

Bem-vindo ao laboratório forense do Bellacosa Mainframe.

Hoje, o caso investigado é complexo:

Quais são os verdadeiros desafios envolvidos na atualização de sistemas legados?

Coloque as luvas.

Ligue a luz ultravioleta.

Abra o código COBOL.

A cena do crime está esperando.


1. Antes da investigação: o que é realmente um sistema legado?

Um erro comum entre profissionais iniciantes é imaginar que sistema legado significa necessariamente um sistema velho, ultrapassado ou inútil.

Essa associação é sedutora, porém perigosa.

Um programa escrito há quarenta anos pode ser tecnicamente antigo, mas ainda cumprir sua função com precisão, desempenho e disponibilidade extraordinários.

Ao mesmo tempo, uma aplicação criada há oito meses pode já ser considerada legado se:

  • ninguém compreende sua arquitetura;

  • não existe documentação;

  • o fornecedor encerrou o suporte;

  • o código depende de uma biblioteca abandonada;

  • a aplicação não pode ser modificada sem provocar falhas;

  • ela se tornou indispensável ao negócio.

No ambiente mainframe, o termo “legado” frequentemente descreve sistemas que concentram décadas de conhecimento de negócio.

Eles processam:

  • contas bancárias;

  • seguros;

  • folhas de pagamento;

  • arrecadação de impostos;

  • cartões de crédito;

  • reservas aéreas;

  • benefícios previdenciários;

  • faturamento;

  • logística;

  • operações governamentais.

Portanto, o sistema legado não é apenas um conjunto de programas.

Ele representa uma combinação de:

  • código;

  • dados;

  • regras;

  • contratos;

  • procedimentos;

  • conhecimento humano;

  • integrações;

  • exceções;

  • decisões históricas.

Um sistema assim se parece menos com um software isolado e mais com uma cidade construída ao longo de décadas.

Existem ruas principais, túneis, atalhos, passagens subterrâneas e construções que ninguém lembra por que foram erguidas.

Modernizar essa cidade não significa simplesmente demolir tudo e construir novamente.

Significa descobrir quem vive nela, por onde passam os recursos, quais pontes ainda são usadas e quais estruturas não podem cair.


2. Primeira evidência: a aceitação do usuário

Na investigação de uma modernização, o primeiro suspeito costuma ser a resistência dos usuários.

A equipe técnica apresenta a nova solução e fica surpresa quando os operadores demonstram desconfiança.

O novo sistema tem:

  • gráficos;

  • menus;

  • ícones;

  • dashboards;

  • botões coloridos;

  • pesquisa inteligente;

  • interface responsiva.

Mesmo assim, o usuário prefere a antiga tela 3270.

O programador iniciante pensa:

— Como alguém pode preferir uma tela preta com letras verdes?

A resposta é simples:

porque aquela tela não é apenas uma interface. Ela é uma extensão da memória operacional do usuário.

Um operador experiente pode saber exatamente quantas vezes pressionar TAB para chegar a um campo. Ele conhece as teclas de função. Sabe interpretar mensagens abreviadas. Reconhece situações anormais antes mesmo que apareça uma mensagem de erro.

Ele não lê a tela como um iniciante.

Ele opera por memória muscular.

É semelhante a um pianista experiente. O músico não precisa procurar cada tecla. Seus dedos reconhecem o caminho.

Quando uma interface é substituída, todo esse conhecimento pode ser perdido.

Exemplo prático

Imagine uma tela CICS utilizada por uma equipe de atendimento:

TRAN: C001

CLIENTE: ___________
CONTA:   ___________
OPÇÃO:   _

O operador sabe que:

  • F5 consulta;

  • F8 avança;

  • F3 retorna;

  • determinada mensagem exige nova autenticação;

  • um código específico indica bloqueio judicial;

  • outro código representa apenas atraso de atualização.

A nova interface web traduz todas essas mensagens, altera a navegação e exige cliques.

Tecnicamente, ela pode parecer superior.

Operacionalmente, pode ser mais lenta.

Lição forense

A resistência do usuário nem sempre é medo irracional.

Às vezes é evidência de que a equipe de modernização não compreendeu o processo real.

Por isso, os usuários devem participar desde o início:

  1. Observe como trabalham.

  2. Registre atalhos e hábitos.

  3. Pergunte onde perdem tempo.

  4. Identifique controles paralelos.

  5. Crie protótipos.

  6. Valide com usuários experientes.

  7. Meça produtividade antes e depois.

Easter egg CSI

Em CSI, uma pequena marca em um objeto pode revelar toda a história de um crime.

Em sistemas corporativos, um simples atalho de teclado pode revelar vinte anos de adaptação operacional.

Não ignore as pequenas marcas.


3. Segunda evidência: os fluxos de trabalho ocultos

Um sistema raramente trabalha sozinho.

Quando uma aplicação é analisada superficialmente, ela parece executar uma função direta.

Por exemplo:

“Este programa calcula a parcela.”

Mas a função real pode ser muito maior.

O programa pode:

  • ler dados de um VSAM;

  • consultar informações em Db2;

  • receber parâmetros de uma transação CICS;

  • gravar uma TSQ;

  • enviar mensagem para MQ;

  • gerar arquivo para processamento batch;

  • alimentar relatórios;

  • atualizar um sistema regulatório;

  • acionar uma rotina de auditoria.

A aplicação não é um ponto.

Ela é um nó em uma rede.

A cadeia invisível

Considere o fluxo:

Aplicativo Mobile
      ↓
API
      ↓
z/OS Connect
      ↓
Programa COBOL
      ↓
Db2
      ↓
Fila MQ
      ↓
Batch noturno
      ↓
Arquivo regulatório
      ↓
Auditoria

Trocar o programa COBOL pode alterar a API.

Alterar a API pode afetar o aplicativo.

Modificar a estrutura do banco pode quebrar relatórios.

Mudar o formato do arquivo pode interromper o processo regulatório.

Esse é o motivo pelo qual modernizações aparentemente simples se tornam projetos enormes.

Dica para o programador iniciante

Antes de alterar uma aplicação, desenhe o fluxo completo.

Pergunte:

  • Quem chama este programa?

  • O que ele chama?

  • Quais arquivos lê?

  • Quais arquivos grava?

  • Quais tabelas acessa?

  • Quais filas utiliza?

  • Em quais jobs aparece?

  • Quais relatórios dependem dele?

  • Que sistemas externos recebem seus dados?

Essa investigação é conhecida como análise de impacto.

No mundo CSI, ninguém move uma evidência antes de fotografar a cena.

No mainframe, ninguém deveria alterar um programa antes de mapear suas dependências.


4. Terceira evidência: dependências desconhecidas

Aqui encontramos um dos maiores perigos de toda modernização.

As dependências conhecidas são trabalhosas.

As desconhecidas são perigosas.

Um programa pode parecer sem uso porque:

  • não aparece em uma documentação recente;

  • não foi alterado em anos;

  • não possui um responsável definido;

  • não é executado diariamente;

  • nenhum usuário admite conhecê-lo.

Isso não significa que esteja inutilizado.

Talvez ele execute:

  • apenas no último dia do mês;

  • somente no fechamento anual;

  • em anos bissextos;

  • quando ocorre uma falha específica;

  • durante recuperação de desastre;

  • para um produto antigo ainda ativo;

  • em um processo judicial raro.

O programa que acordava uma vez por ano

Imagine um módulo chamado PGMIRP99.

Seu nome não ajuda.

A documentação não existe.

O histórico mostra que ninguém o alterou desde 2003.

A equipe decide removê-lo.

Onze meses depois, no fechamento do exercício fiscal, um job tenta executá-lo.

Resultado:

CSV003I REQUESTED MODULE PGMIRP99 NOT FOUND

O sistema falha.

A investigação começa.

Descobre-se que o programa calculava uma regra específica usada apenas no último fechamento anual.

O código parecia morto.

Na verdade, estava hibernando.

Como investigar dependências

Uma análise séria pode envolver:

  • busca em bibliotecas JCL;

  • análise de PROCs;

  • pesquisa em schedulers;

  • consulta a históricos SMF;

  • análise de chamadas estáticas e dinâmicas;

  • rastreamento de transações CICS;

  • inspeção de filas MQ;

  • análise de logs;

  • entrevistas com usuários;

  • análise de catálogos;

  • pesquisa em repositórios de código;

  • consulta a sistemas de gerenciamento de mudanças.

Atenção ao CALL dinâmico

Em COBOL, uma chamada pode ser direta:

CALL 'PGMCALC' USING WS-DADOS

Mas também pode ser dinâmica:

MOVE WS-NOME-PROGRAMA TO WS-PGM
CALL WS-PGM USING WS-DADOS

No segundo caso, procurar apenas pelo nome do programa pode não revelar a dependência.

O módulo é definido em tempo de execução.

É como procurar um suspeito cujo nome nunca aparece nos documentos.


5. Quarta evidência: não planejar a substituição

Muitas organizações constroem sistemas como se eles fossem eternos.

O código nasce fortemente acoplado:

  • ao banco;

  • ao fornecedor;

  • ao sistema operacional;

  • ao formato dos arquivos;

  • às interfaces;

  • aos processos;

  • aos nomes de bibliotecas.

Quando chega o momento de substituir uma parte, tudo está conectado.

Esse problema não pertence apenas aos sistemas antigos.

Aplicações modernas também podem ser criadas dessa forma.

Um sistema em nuvem pode se tornar prisioneiro de serviços proprietários e ser mais difícil de migrar do que uma aplicação COBOL bem estruturada.

Planejar a saída desde a entrada

Uma boa arquitetura deve considerar:

  • substituição futura;

  • portabilidade;

  • versionamento;

  • interfaces bem definidas;

  • abstração;

  • desacoplamento;

  • observabilidade;

  • documentação;

  • testes.

No mainframe, uma estratégia eficiente é proteger o núcleo do negócio por meio de camadas.

Exemplo:

Canal Mobile
     ↓
API REST
     ↓
Camada de Integração
     ↓
COBOL/CICS
     ↓
Db2

O programa COBOL continua executando a regra crítica.

A camada de integração permite novos canais.

Dessa maneira, modernizar não significa necessariamente reescrever.

Pode significar expor, organizar, automatizar e integrar.


6. Quinta evidência: reescrever quando necessário

Existem situações em que uma reescrita é justificável.

Por exemplo:

  • tecnologia sem suporte;

  • hardware impossível de manter;

  • código irrecuperável;

  • risco de segurança;

  • incapacidade de escalar;

  • custo operacional insustentável;

  • ausência total de profissionais;

  • necessidade de mudança radical do negócio.

Mas a decisão não pode ser ideológica.

A frase “vamos reescrever tudo” costuma parecer corajosa em uma reunião.

Na prática, pode iniciar uma operação de altíssimo risco.

O código como documento histórico

Considere este trecho:

IF WS-TIPO-CONTRATO = 'A'
   AND WS-DATA-ADESAO < 20030101
   AND WS-REGIAO = '03'
      COMPUTE WS-TAXA = WS-TAXA * 0.875
END-IF

O programador iniciante pode considerar essa lógica estranha.

Talvez ela represente:

  • uma legislação antiga;

  • uma decisão judicial;

  • uma condição contratual;

  • um acordo comercial;

  • uma exceção regulatória.

Sem investigação, alguém pode “simplificar” o código.

A simplificação pode criar prejuízos, multas ou ações judiciais.

Reescrever não é traduzir

Converter COBOL para Java linha por linha não moderniza necessariamente o sistema.

É possível criar um programa Java com arquitetura de 1975.

Da mesma forma, é possível manter COBOL dentro de uma arquitetura moderna com:

  • APIs;

  • CI/CD;

  • testes automatizados;

  • Git;

  • observabilidade;

  • integração com cloud;

  • containers em componentes complementares.

Linguagem não define sozinha a modernidade.

Arquitetura, governança, automação e capacidade de evolução importam muito mais.


7. Sexta evidência: o investimento acumulado

Quando uma empresa analisa um sistema legado, costuma enxergar custos:

  • licenças;

  • hardware;

  • suporte;

  • profissionais;

  • manutenção.

Mas existe um investimento invisível.

O sistema contém milhares de decisões tomadas ao longo de décadas.

Cada correção representa uma lição.

Cada exceção representa um caso real.

Cada validação representa uma falha que alguém decidiu impedir.

Portanto, o código acumulou conhecimento.

Uma conta que não aparece no balanço

Imagine um sistema com dez milhões de linhas, construído durante trinta anos.

Não seria correto calcular seu valor apenas pelo custo atual de manutenção.

Seria necessário considerar:

  • horas de desenvolvimento;

  • análise de negócio;

  • testes;

  • auditorias;

  • adaptações legais;

  • integração com parceiros;

  • correções de incidentes;

  • conhecimento dos especialistas.

Esse patrimônio pode valer muito mais do que o próprio hardware.

É como um laboratório forense com décadas de evidências organizadas.

Você pode substituir os computadores.

Não pode reconstruir facilmente o conhecimento perdido.


8. Sétima evidência: evitar tempo de inatividade

Em sistemas críticos, parar não é uma opção simples.

Uma indisponibilidade pode impedir:

  • pagamentos;

  • transferências;

  • compras;

  • embarques;

  • atendimentos;

  • autorizações;

  • emissão de documentos;

  • processamento de salários.

Por isso, a migração deve prever continuidade.

Estratégias de transição

Execução paralela

O sistema antigo e o novo processam os mesmos dados.

Depois, os resultados são comparados.

Entrada
  ├── Sistema Antigo → Resultado A
  └── Sistema Novo   → Resultado B

Comparação: A = B?

Shadow processing

O novo sistema recebe cópias das transações, mas ainda não responde oficialmente.

Ele trabalha nas sombras, como um laboratório analisando evidências sem interferir na operação.

Blue-Green Deployment

Dois ambientes são mantidos:

  • Blue: versão atual;

  • Green: nova versão.

Quando o novo ambiente está validado, o tráfego é redirecionado.

Canary Release

A nova versão atende uma pequena parcela dos usuários.

Se os indicadores forem bons, a liberação aumenta gradualmente.

Rollback

Toda implantação deve possuir um plano de retorno.

Perguntas fundamentais:

  • Como voltar?

  • Em quanto tempo?

  • Os dados continuam compatíveis?

  • Existe backup?

  • As transações podem ser reprocessadas?

  • O retorno já foi testado?

Um rollback não testado é apenas esperança documentada.


9. Oitava evidência: retorno sobre investimento

Muitas modernizações são aprovadas com base em uma promessa:

“A nova tecnologia reduzirá custos.”

Mas o cálculo do ROI costuma ser incompleto.

É necessário comparar:

  • custo de manutenção;

  • custo de migração;

  • custo de treinamento;

  • custo de indisponibilidade;

  • custo de erros;

  • custo de coexistência;

  • custo de licenças;

  • custo de segurança;

  • custo de auditoria;

  • custo de oportunidade.

ROI invisível

Nem todo retorno aparece como aumento direto de receita.

Modernizar pode trazer:

  • menor risco;

  • maior velocidade de entrega;

  • melhor rastreabilidade;

  • facilidade de integração;

  • redução de incidentes;

  • automação de testes;

  • recuperação mais rápida;

  • maior segurança.

Imagine um projeto que custa R$ 5 milhões e evita uma falha potencial de R$ 50 milhões.

O retorno não está apenas no que a empresa ganhou.

Está também no que deixou de perder.

Armadilha da economia imaginária

Um projeto pode prometer economia ao retirar o mainframe.

Porém, depois surgem custos com:

  • dezenas de servidores;

  • bancos distribuídos;

  • redes;

  • especialistas;

  • observabilidade;

  • redundância;

  • segurança;

  • licenças;

  • tráfego de dados;

  • indisponibilidades.

O custo precisa ser comparado de ponta a ponta.

Não basta comparar o preço de uma plataforma com o preço de outra.

É necessário comparar a capacidade entregue, a disponibilidade, o desempenho, a segurança e o risco operacional.


10. Nona evidência: comunicação aberta

A modernização não ocorre apenas dentro dos computadores.

Ela acontece na cabeça das pessoas.

Quando uma empresa anuncia uma grande transformação, surgem medos:

  • “Meu conhecimento ficará inútil?”

  • “Perderei meu emprego?”

  • “O sistema novo vai substituir minha função?”

  • “Serei responsabilizado se falhar?”

  • “Vou conseguir aprender?”

Ignorar esses medos cria resistência.

E resistência silenciosa pode ser mais perigosa do que oposição explícita.

O especialista tratado como obstáculo

Um erro frequente é tratar profissionais antigos como inimigos da inovação.

Eles podem parecer conservadores porque conhecem falhas que os recém-chegados nunca viram.

O especialista lembra:

  • do processamento que falhou em 1999;

  • da regra criada após uma auditoria;

  • do arquivo que não pode ser ordenado;

  • da transação que exige commit em determinado momento;

  • da rotina usada durante contingência.

Esse profissional não deve ser descartado.

Ele deve ser incorporado à investigação.

Comunicação eficiente

Uma estratégia saudável explica:

  1. Por que a mudança é necessária.

  2. O que será preservado.

  3. O que será substituído.

  4. Como os profissionais participarão.

  5. Quais competências serão valorizadas.

  6. Como ocorrerá o treinamento.

  7. Quais riscos estão sendo controlados.

  8. Como o sucesso será medido.

Modernização sem comunicação cria boatos.

Boatos criam medo.

Medo cria sabotagem involuntária, omissão de conhecimento e baixa adesão.


11. Décima evidência: escolher entre opções demais

O mercado oferece inúmeras alternativas:

  • nuvem pública;

  • nuvem privada;

  • nuvem híbrida;

  • containers;

  • SaaS;

  • PaaS;

  • bancos distribuídos;

  • eventos;

  • APIs;

  • plataformas low-code;

  • inteligência artificial;

  • microsserviços.

O problema não é a falta de opções.

É o excesso.

A organização pode escolher uma tecnologia porque:

  • está na moda;

  • aparece em eventos;

  • foi recomendada por consultorias;

  • o concorrente utiliza;

  • o fornecedor oferece desconto;

  • a diretoria assistiu a uma apresentação convincente.

Nenhuma dessas razões é suficiente.

A tecnologia deve seguir o caso

A escolha precisa considerar:

  • volume de transações;

  • latência;

  • disponibilidade;

  • consistência;

  • segurança;

  • regulação;

  • custo;

  • competências internas;

  • integração;

  • prazo;

  • recuperação de desastre;

  • soberania de dados;

  • dependência de fornecedor.

Em alguns casos, cloud é excelente.

Em outros, manter o processamento central no mainframe e integrar com cloud é melhor.

O futuro corporativo tende a ser híbrido.

Não existe obrigação de mover tudo para um único lugar.

O objetivo é posicionar cada carga onde ela funciona melhor.


12. Evidência adicional: documentação inexistente

O artigo original apresenta dez desafios importantes, mas deixa uma cadeira vazia na sala de interrogatório.

A documentação.

Em muitos ambientes, o único documento confiável é o código-fonte.

Você encontra:

IF WS-FLAG-X = 'S'
   PERFORM 9000-AJUSTE-ESPECIAL
END-IF

Pergunta:

— O que significa WS-FLAG-X?

Resposta:

— Não sabemos.

Pergunta:

— Por que chama 9000-AJUSTE-ESPECIAL?

Resposta:

— Foi criado antes de eu entrar.

Pergunta:

— Podemos remover?

Silêncio.

Esse é o momento em que o programador COBOL se transforma em investigador.

Ele precisa:

  • rastrear origem do campo;

  • localizar onde recebe valor;

  • analisar arquivos;

  • examinar copybooks;

  • encontrar chamadas;

  • comparar versões;

  • buscar documentação antiga;

  • consultar especialistas;

  • testar cenários.

Regra de ouro

Nunca presuma que código estranho é código inútil.

Código estranho pode ser uma pista.


13. Evidência adicional: conhecimento humano

Parte do sistema não está gravada em disco.

Está na memória das pessoas.

O operador sabe que determinado arquivo chega atrasado em feriados.

O DBA sabe que uma tabela não pode receber determinado índice.

O analista conhece uma exceção contratual.

O programador lembra que um job precisa executar após outro, embora o scheduler não indique dependência formal.

Quando essas pessoas saem, o sistema perde contexto.

Como preservar conhecimento

  • entrevistas estruturadas;

  • sessões gravadas;

  • documentação de incidentes;

  • mapas de fluxo;

  • catálogos de regras;

  • revisão de código;

  • programação em dupla;

  • comunidades internas;

  • mentoria;

  • laboratórios práticos;

  • registro de decisões arquiteturais.

O conhecimento precisa sair da cabeça e entrar no processo.


14. Evidência adicional: testes insuficientes

O novo sistema pode funcionar em demonstração.

Isso não significa que esteja pronto para produção.

O ambiente real contém:

  • dados incompletos;

  • contratos antigos;

  • clientes especiais;

  • caracteres inesperados;

  • datas inválidas;

  • arquivos atrasados;

  • duplicidades;

  • volumes extremos;

  • falhas de rede;

  • concorrência;

  • reprocessamentos.

Testar o caminho feliz não basta

Considere um cálculo de juros.

O teste comum verifica:

  • valor normal;

  • prazo normal;

  • taxa normal.

Mas o sistema real pode precisar tratar:

  • contrato suspenso;

  • pagamento parcial;

  • cliente falecido;

  • decisão judicial;

  • feriado regional;

  • moeda histórica;

  • migração de produto;

  • arredondamento especial;

  • renegociação.

Esses casos vivem nos cantos escuros do sistema.

É exatamente onde a luz ultravioleta deve ser aplicada.

Tipos de teste necessários

  • teste unitário;

  • teste de integração;

  • teste de regressão;

  • teste de volume;

  • teste de desempenho;

  • teste de recuperação;

  • teste de segurança;

  • teste de coexistência;

  • teste de reconciliação;

  • teste de rollback;

  • teste de desastre.

Modernizar sem regressão automatizada é caminhar pela cena do crime com os olhos fechados.


15. Evidência adicional: auditoria e conformidade

Em ambientes regulados, funcionar não basta.

O sistema precisa provar que funcionou corretamente.

Isso exige:

  • trilhas de auditoria;

  • logs confiáveis;

  • segregação de funções;

  • rastreabilidade;

  • controle de acesso;

  • retenção de dados;

  • versionamento;

  • evidências de aprovação;

  • conformidade legal.

Uma nova aplicação pode ser tecnicamente excelente e ainda assim ser rejeitada porque não consegue responder:

  • Quem alterou?

  • Quando alterou?

  • Qual era o valor anterior?

  • Quem aprovou?

  • Qual versão estava em produção?

  • Qual regra foi aplicada?

No mainframe, tecnologias como RACF, SMF, logs de CICS e mecanismos de auditoria fornecem um histórico extremamente rico.

Ao modernizar, essa capacidade não pode desaparecer.


16. O roteiro CSI para modernizar com segurança

Agora chegamos ao procedimento de investigação.

Passo 1 — Isolar a cena

Defina claramente:

  • sistema;

  • escopo;

  • módulos;

  • interfaces;

  • dados;

  • usuários;

  • objetivos.

Sem limite, o projeto se transforma em uma investigação infinita.

Passo 2 — Fotografar o ambiente atual

Documente:

  • arquitetura;

  • fluxos;

  • bibliotecas;

  • jobs;

  • tabelas;

  • transações;

  • arquivos;

  • integrações;

  • horários;

  • volumes.

Antes de mudar, registre.

Passo 3 — Coletar depoimentos

Converse com:

  • usuários;

  • operadores;

  • programadores;

  • analistas;

  • DBAs;

  • segurança;

  • auditoria;

  • suporte;

  • fornecedores.

Cada grupo conhece uma parte da história.

Passo 4 — Mapear dependências

Use ferramentas e análise manual para localizar:

  • chamadas;

  • arquivos;

  • filas;

  • tabelas;

  • APIs;

  • schedulers;

  • relatórios;

  • sistemas consumidores.

Passo 5 — Identificar regras críticas

Separe:

  • regra de negócio;

  • regra técnica;

  • exceção;

  • contorno;

  • código morto;

  • comportamento desconhecido.

Não elimine nada antes de compreender.

Passo 6 — Criar uma linha de base

Registre:

  • tempos;

  • resultados;

  • volumes;

  • consumo;

  • erros;

  • disponibilidade.

A modernização deve ser comparada com algo concreto.

Passo 7 — Construir testes

Transforme o comportamento atual em evidência reproduzível.

Crie massas de teste e resultados esperados.

Passo 8 — Modernizar em pequenas partes

Evite o chamado Big Bang.

Prefira:

  • APIs;

  • desacoplamento;

  • extração gradual;

  • componentes substituíveis;

  • coexistência.

Passo 9 — Executar em paralelo

Compare antigo e novo.

Não confie apenas em demonstrações.

Use dados reais controlados.

Passo 10 — Preparar retorno

Todo avanço precisa de uma rota de fuga.

Teste rollback antes da produção.

Passo 11 — Medir resultados

Avalie:

  • desempenho;

  • estabilidade;

  • custo;

  • produtividade;

  • adesão;

  • erros;

  • segurança.

Passo 12 — Desativar com evidência

Somente aposente o sistema antigo quando puder provar que:

  • não existem consumidores;

  • dados foram preservados;

  • requisitos legais foram atendidos;

  • rollback não é mais necessário;

  • usuários estão preparados;

  • suporte está estruturado.

Desativar não é apagar uma biblioteca.

É encerrar um ciclo com segurança.


Curiosidades do laboratório Bellacosa

Curiosidade 1 — COBOL pode ser antigo e moderno ao mesmo tempo

O COBOL surgiu em 1959, mas continua sendo atualizado.

Compiladores modernos oferecem:

  • otimizações;

  • integração com JSON;

  • XML;

  • APIs;

  • Java;

  • Db2;

  • CICS;

  • ferramentas DevOps.

A idade da linguagem não determina a idade da arquitetura.

Curiosidade 2 — Tela verde pode ser mais eficiente que mouse

Interfaces 3270 foram projetadas para alta produtividade transacional.

Em determinadas operações, teclado e teclas de função são mais rápidos do que interfaces gráficas.

Curiosidade 3 — Sistemas modernos também viram legado

Código Java, Python, JavaScript ou Kubernetes pode se tornar legado rapidamente.

Basta que ninguém consiga mantê-lo.

Curiosidade 4 — O maior risco pode estar na exceção

A rotina principal costuma ser compreendida.

As falhas aparecem em:

  • fim de mês;

  • feriados;

  • datas especiais;

  • produtos antigos;

  • contingências;

  • reprocessamentos.

Curiosidade 5 — O programa “inútil” pode ser o mais importante

Alguns módulos são executados raramente porque foram criados para situações críticas.

Eles parecem mortos até o dia em que salvam a operação.


Easter eggs para os investigadores de plantão

O laboratório CSI possuía luzes, microscópios e análises químicas.

O laboratório mainframe possui:

  • dumps;

  • Abend-AID;

  • Fault Analyzer;

  • SDSF;

  • SMF;

  • logs;

  • traces;

  • listings;

  • sysouts;

  • históricos de scheduler.

Um cabelo encontrado em uma cena pode identificar um suspeito.

Um byte encontrado em um dump pode identificar a instrução que causou um S0C7.

Uma impressão digital pode revelar quem tocou em uma arma.

Um registro SMF pode revelar quem acessou um recurso.

Uma mancha de sangue pode indicar a sequência do crime.

Um log pode revelar a sequência da transação.

No universo CSI, toda evidência conta.

No mainframe, também.


As três perguntas que todo Padawan COBOL deve fazer

Antes de alterar qualquer sistema crítico, pergunte:

1. Quem depende disso?

Não apenas usuários diretos.

Inclua programas, arquivos, relatórios, APIs, filas, jobs e auditorias.

2. O que acontece se estiver errado?

Calcule impacto financeiro, operacional, legal e reputacional.

3. Como provar que continua correto?

A resposta deve envolver testes, comparação, logs e métricas.

Se ninguém consegue responder essas três perguntas, a investigação ainda não terminou.


Conclusão: o legado não é o cadáver

Ao final desta investigação, o programador COBOL iniciante retorna à tela do SDSF.

Agora ele enxerga o sistema de outra forma.

Antes, via programas antigos.

Agora, vê relações.

Antes, via código estranho.

Agora, vê decisões históricas.

Antes, via resistência dos usuários.

Agora, vê conhecimento operacional.

Antes, via custo.

Agora, vê patrimônio.

Antes, via um sistema que deveria ser substituído.

Agora, vê uma testemunha que precisa ser ouvida.

Esse é o segredo da modernização responsável:

o objetivo não é apagar o passado. É entender o passado o suficiente para construir o futuro sem repetir seus erros e sem destruir seus acertos.

Sistemas legados precisam evoluir.

Mas evolução não significa desprezo.

Ela exige investigação.

Exige respeito pelas evidências.

Exige compreensão das dependências.

Exige testes.

Exige comunicação.

Exige planejamento.

Exige humildade.

Um sistema crítico não pode ser tratado como um velho computador esquecido em um depósito.

Ele é o resultado de milhares de incidentes resolvidos, regras incorporadas, exceções descobertas e decisões acumuladas.

Talvez sua interface seja antiga.

Talvez seu código tenha sido escrito antes do nascimento de muitos profissionais da equipe.

Mas, enquanto processa corretamente milhões de transações, ele não é apenas passado.

Ele é infraestrutura viva.

Por isso, quando alguém entrar em uma reunião e disser:

— Precisamos acabar com o legado.

Respire.

Tome um gole de café.

Ligue a luz ultravioleta.

E pergunte:

— Quais evidências provam que compreendemos tudo o que ele faz?

Se a sala ficar em silêncio, o caso ainda está aberto.

E, em algum lugar do Data Center, um programa COBOL que ninguém lembra continua executando às 03h17, protegendo uma regra que todos esqueceram, mas que o negócio ainda precisa.

Caso encerrado?

Ainda não.

Em sistemas legados, nenhum caso termina até que o último job retorne RC=0000.

domingo, 17 de outubro de 2021

Technical Debt Rules : Quando um Programador COBOL Descobriu que Cada Atalho Criava um Agente Smith Dentro do Sistema

 

Bellacosa Mainframe e as technical debt rules

☕ Um Café no Bellacosa Mainframe

Technical Debt Rules sem Mistérios

Quando um Programador COBOL Descobriu que Cada Atalho Criava um Agente Smith Dentro do Sistema

"Infelizmente, ninguém pode explicar o que é a Dívida Técnica. Você precisa vê-la por si mesmo." — inspirado no universo de Matrix


Bem-vindo à Matrix do Desenvolvimento

Imagine que você acorda em uma sala escura.

Na sua frente existe um monitor verde.

Linhas de caracteres descem como chuva.

Um homem de óculos escuros aproxima-se.

Não é Morpheus.

É o Analista de Sistemas mais antigo da empresa.

Ele coloca duas fitas magnéticas sobre a mesa.

Uma vermelha.

Outra azul.

— A azul compila hoje.

— A vermelha exige refatoração, testes, documentação e arquitetura.

Você pergunta:

— Qual delas devo escolher?

Ele sorri.

— A azul entrega o projeto este mês.

— A vermelha salva os próximos dez anos.

Naquele instante você entende que toda equipe de desenvolvimento vive diariamente essa escolha.

Esse é o universo da Technical Debt, ou Dívida Técnica, um dos conceitos mais importantes — e mais mal compreendidos — da Engenharia de Software.

Para quem trabalha com COBOL, CICS, Db2, JCL e sistemas legados, entender a Dívida Técnica é quase tão importante quanto saber interpretar um ABEND. Ela explica por que alguns sistemas envelhecem com dignidade enquanto outros se tornam um labirinto impossível de manter.


O que é Technical Debt?

Technical Debt é o custo futuro provocado por decisões técnicas tomadas para ganhar velocidade no presente.

Em outras palavras:

É quando você economiza tempo hoje emprestando tempo do seu próprio futuro.

Assim como um empréstimo bancário, a dívida técnica pode ser útil quando administrada conscientemente.

O problema não é contrair uma dívida.

O problema é esquecer que ela existe.


A origem do termo

O termo Technical Debt foi criado em 1992 por Ward Cunningham, um dos autores do Manifesto Ágil e criador do primeiro Wiki da história.

Ward percebeu que muitos gestores entendiam dinheiro, juros e empréstimos, mas tinham dificuldade para compreender problemas de arquitetura de software.

Então fez uma analogia brilhante.

Ele disse:

"Entregar um software antes de terminar sua arquitetura é como fazer um empréstimo. Pode ser uma boa decisão, desde que você pague rapidamente."

O problema aparece quando os juros começam.

E em software...

...os juros aparecem em forma de:

  • bugs

  • retrabalho

  • lentidão

  • dificuldades para alterar regras

  • aumento do tempo de testes

  • aumento de incidentes


Matrix explica melhor que muitos livros

Imagine que cada linha de código seja parte da Matrix.

Quando tudo é desenvolvido corretamente...

a simulação permanece estável.

Mas sempre existe alguém dizendo:

"Depois a gente arruma."

Esse "depois" nunca chega.

Cada pequeno atalho cria pequenas distorções.

No começo parecem insignificantes.

Depois surgem pequenos defeitos.

Mais tarde aparecem exceções.

Finalmente...

a Matrix inteira começa a produzir Agentes Smith.


Quem são os Agentes Smith?

No mundo do software, os Agentes Smith representam problemas que surgem continuamente.

Cada vez que um desenvolvedor resolve um bug rapidamente sem corrigir sua causa...

nasce um novo Smith.

Cada IF duplicado...

mais um Smith.

Cada variável mal nomeada...

outro Smith.

Cada programa COBOL de cinquenta mil linhas...

centenas deles.

Eles continuam se multiplicando até dominar todo o sistema.


Um exemplo COBOL

Imagine este código:

IF TIPO = "A"
    MOVE 15 TO DESCONTO
END-IF

Alguns meses depois.

Nova regra.

IF TIPO = "A"
    MOVE 20 TO DESCONTO
END-IF

Mais tarde.

Outro programador.

IF CLIENTE-PREMIUM
    MOVE 25 TO DESCONTO
END-IF

Depois.

Outro módulo.

Mesmo código.

Depois outro.

E outro.

Agora existem quinze versões diferentes da mesma regra.

Toda alteração exige procurar manualmente.

Esse é um clássico exemplo de dívida técnica.


O que gera Technical Debt?

Pressão por prazo

"Entrega sexta."

Mesmo sabendo que deveria levar três semanas.


Falta de testes

"Depois escrevemos."

Nunca escrevem.


Documentação inexistente

"Todo mundo entende."

Dois anos depois ninguém entende.


Copiar código

CTRL+C

CTRL+V

CTRL+C

CTRL+V

Assim nasce o caos.


Arquitetura improvisada

Funciona.

Mas ninguém sabe explicar.


Falta de revisão

Sem Code Review...

os problemas entram em produção.


Falta de treinamento

Programadores repetem erros porque nunca aprenderam alternativas melhores.


A dívida nem sempre é ruim

Essa é uma curiosidade interessante.

Nem toda dívida técnica é um erro.

Imagine um banco.

Existe uma exigência legal.

Prazo:

48 horas.

A equipe decide criar uma solução provisória.

Entrega.

Banco evita multas.

Depois reserva tempo para refatorar.

Excelente decisão.

Foi uma dívida consciente.


Dívida consciente x dívida inconsciente

Dívida consciente

"Sabemos que esse código está temporário."

Existe plano.

Existe prazo.

Existe orçamento.


Dívida inconsciente

"Nunca percebemos que fizemos errado."

Muito mais perigosa.


Os juros da dívida

Todo empréstimo possui juros.

Software também.

Os juros aparecem como:

Mais tempo para manutenção

Uma alteração simples leva dias.


Bugs recorrentes

Conserta um.

Quebra outro.


Medo

"Não mexe."

Frase clássica do legado.


Performance

Cada remendo adiciona processamento.

No mainframe isso significa:

  • CPU

  • MIPS

  • consumo

  • custo


Novos profissionais demoram meses

Porque entender ficou difícil.


Como a dívida cresce?

Imagine um cartão de crédito.

Primeiro mês:

100 reais.

Segundo mês:

Terceiro:

Depois:

Depois:

Software faz exatamente isso.

Cada nova funcionalidade construída sobre código ruim aumenta exponencialmente a complexidade.


O Mainframe sofre muito?

Curiosamente...

sim.

E não.

Mainframes normalmente possuem código extremamente robusto.

Mas muitos sistemas existem há quarenta anos.

Durante quatro décadas...

centenas de programadores passaram por eles.

Cada geração deixou pequenas modificações.

O resultado pode ser:

  • GOTO esquecidos

  • IFs duplicados

  • COPYBOOKS redundantes

  • programas gigantescos

  • tabelas obsoletas

  • JCLs nunca revisados


Um exemplo realista

Imagine um programa COBOL chamado:

PGMFIN01

1988

2.300 linhas.

1992

3.800 linhas.

1998

6.500 linhas.

2007

11.000 linhas.

2016

19.000 linhas.

2026

41.000 linhas.

Ninguém teve coragem de dividir.

Cada manutenção ficou mais cara.

A dívida cresceu silenciosamente.


O Oráculo explica

No universo Matrix, o Oráculo nunca entrega respostas prontas.

Ela oferece entendimento.

Na Engenharia de Software acontece igual.

A dívida técnica raramente aparece em relatórios.

Ela aparece nos sintomas.

Equipe cansada.

Prazo aumentando.

Mudanças simples demorando semanas.

Clientes reclamando.

ABENDs aparecendo após pequenas alterações.

Esses são os sinais.


Como reduzir a dívida?

Refatoração

Melhorar código sem alterar comportamento.

É a principal arma.


Testes automatizados

Permitem mudar com segurança.


Revisão de código

Dois olhos veem mais que um.


Arquitetura

Planejamento evita improvisos.


Documentação viva

Nunca deixe conhecimento apenas na memória.


Pair Programming

Conhecimento compartilhado.


Mentoria

Programadores experientes aceleram iniciantes.


Limpeza contínua

Nunca espere uma grande reescrita.

Melhore um pouco todos os dias.


A Regra do Escoteiro

Robert C. Martin popularizou uma ideia simples:

Deixe o código um pouco melhor do que encontrou.

Imagine milhares de desenvolvedores fazendo isso durante anos.

A dívida diminui naturalmente.


Atenção!

Existe um erro muito comum.

Confundir:

Refatoração

com

Reescrita.

São coisas completamente diferentes.

Refatorar melhora.

Reescrever substitui.

Nem sempre reescrever é inteligente.

Muitos projetos falharam tentando "começar do zero".


O perigo da Grande Reescrita

Na Matrix Reloaded, Neo descobre que destruir tudo não resolve.

Em software acontece igual.

Jogar fora um sistema COBOL de quarenta anos pode significar perder décadas de conhecimento de negócio.

O ideal é evoluir gradualmente.


Ferramentas que ajudam

Hoje existem excelentes ferramentas.

  • IBM ADDI

  • IBM Application Discovery

  • SonarQube

  • IBM COBOL Check

  • IBM Z Open Editor

  • IBM Developer for z/OS

  • GitHub Copilot

  • ChatGPT

  • Claude

  • ZUnit

Elas ajudam a identificar:

  • duplicações

  • complexidade

  • dependências

  • código morto

  • riscos


Sinais de alerta

Você deve investigar dívida técnica quando ouvir frases como:

"Não sabemos por que funciona."

"Não mexe nesse módulo."

"Compila assim mesmo."

"Só o João entende."

"Depois documentamos."

"Tem um GOTO aí... mas deixa."

"É gambiarra temporária."

Seis meses depois...

continua igual.


O papel do Programador COBOL Padawan

Um Padawan costuma pensar:

"Meu trabalho é escrever código."

Na verdade, não.

Seu trabalho é entregar soluções sustentáveis.

Sempre pergunte:

  • Isso poderá ser entendido daqui cinco anos?

  • Outro programador conseguirá manter?

  • Existe teste?

  • Existe documentação?

  • Existe duplicação?

  • Essa regra deveria estar em um COPYBOOK?

  • Esse programa precisa mesmo crescer mais mil linhas?

Essas perguntas evitam que você alimente a Matrix com novos Agentes Smith.


Curiosidades sobre a Dívida Técnica

  • Existem empresas que dedicam 20% do tempo de desenvolvimento apenas para pagar dívida técnica.

  • Grandes bancos mantêm backlogs exclusivos de refatoração, separados das novas funcionalidades.

  • Algumas organizações medem a dívida técnica com ferramentas que estimam quantos dias de trabalho seriam necessários para corrigir todos os problemas encontrados.

  • Em projetos críticos, reduzir dívida técnica pode gerar economia significativa em horas de manutenção, consumo de CPU, incidentes e retrabalho.


Outros "parentes" da Dívida Técnica

Ela costuma caminhar ao lado de diversos conceitos conhecidos:

  • Code Smell – sinais de que algo pode estar mal projetado.

  • Big Ball of Mud – sistema sem arquitetura definida.

  • Spaghetti Code – código confuso e altamente acoplado.

  • God Object – um único módulo faz tudo.

  • Bus Factor – conhecimento concentrado em poucas pessoas.

  • Shotgun Surgery – uma pequena alteração exige modificar dezenas de arquivos.

  • Lava Flow – código antigo que ninguém remove por medo.

Todos esses conceitos frequentemente aparecem juntos.


A Grande Escolha: Pílula Azul ou Pílula Vermelha?

No final de Matrix, Neo percebe que conhecer a verdade traz responsabilidade.

Na Engenharia de Software acontece exatamente o mesmo.

Você pode escolher a pílula azul:

  • copiar código;

  • ignorar testes;

  • adiar documentação;

  • aceitar "gambiarras permanentes";

  • acreditar que "funcionando está bom".

Ou pode escolher a pílula vermelha:

  • compreender a arquitetura;

  • investir em refatoração;

  • escrever código legível;

  • compartilhar conhecimento;

  • documentar regras de negócio;

  • pensar no próximo programador que abrirá aquele programa COBOL daqui a dez anos.

A primeira opção parece mais rápida, mas cobra juros crescentes. A segunda exige disciplina, porém constrói sistemas resilientes que atravessam décadas — exatamente como os grandes sistemas IBM Z que sustentam bancos, seguradoras, governos e companhias aéreas ao redor do mundo.

No universo Bellacosa Mainframe, a maior lição é clara: o inimigo não é o legado; é o legado abandonado. Sistemas COBOL envelhecem muito bem quando recebem manutenção consciente, arquitetura sólida e equipes comprometidas em reduzir continuamente a dívida técnica. Assim como Neo precisou aprender a enxergar além do código verde da Matrix, o Programador COBOL Padawan precisa aprender a enxergar além da próxima entrega e pensar no impacto que cada linha escrita hoje terá no futuro da organização.

Porque, no fim, toda dívida será paga. A única dúvida é quem pagará a conta: você hoje ou toda a equipe amanhã?

domingo, 2 de maio de 2021

Spaghetti Code Rules: Quando um Programador COBOL Descobriu que a Matrix Era Feita de Espaguete e Cada GO TO Criava um Novo Labirinto

 

Bellacosa Mainframe e o spaghetti code rules

☕ Um Café no Bellacosa Mainframe

Spaghetti Code Rules sem Mistérios

Quando um Programador COBOL Descobriu que a Matrix Era Feita de Espaguete e Cada GO TO Criava um Novo Labirinto

"A Matrix não aprisionava apenas pessoas. Ela também aprisionava programas dentro de um emaranhado de caminhos onde ninguém mais sabia como chegar à saída."


Prólogo — O Labirinto Invisível da Matrix

Neo acabara de receber uma missão aparentemente simples.

Corrigir um erro no cálculo dos juros de um financiamento.

Morpheus entregou um único arquivo.

FINANCEIRO01.CBL

Neo sorriu.

— Apenas um programa?

Morpheus respondeu.

— Sim.

Só um.

Neo abriu o código.

A barra de rolagem diminuiu.

Muito.

Muito mesmo.

O programa possuía:

  • 68.000 linhas

  • 2.400 parágrafos

  • centenas de GO TO

  • dezenas de ALTER

  • milhares de variáveis

  • comentários escritos por gerações diferentes

Neo tentou localizar a regra do financiamento.

Cinco minutos depois...

estava em outra rotina.

Dez minutos depois...

entrou em um PERFORM.

Depois um GO TO.

Depois outro.

Depois um PERFORM THRU.

Depois um ALTER.

Depois um EXIT.

Depois voltou.

Depois foi para outro programa.

Depois retornou.

Finalmente perguntou:

— Morpheus...

onde exatamente começa esse cálculo?

Morpheus sorriu.

— Essa pergunta já foi feita por pelo menos cinquenta programadores antes de você.

O Oráculo apareceu.

Olhou para Neo.

E disse:

"Você não entrou apenas em um programa. Entrou em um prato de espaguete."


O que é Spaghetti Code?

Spaghetti Code (Código Espaguete) é um antipadrão de software caracterizado por uma estrutura extremamente confusa, onde o fluxo de execução é difícil de compreender, seguir ou modificar.

O nome vem da aparência do fluxo lógico.

Imagine um prato cheio de espaguete.

Os fios cruzam-se em todas as direções.

Você tenta puxar um.

Leva metade do prato junto.

No software acontece exatamente igual.

Uma alteração aparentemente simples afeta dezenas de outras partes.


A origem do termo

O termo surgiu na década de 1970.

Naquela época muitos sistemas eram escritos utilizando:

  • GOTO

  • Jumps

  • Branches

  • Fluxos não estruturados

Os diagramas de execução pareciam literalmente um prato de macarrão.

Daí nasceu o nome.


Matrix explica melhor que qualquer livro

Imagine que Neo precisa chegar até o Arquiteto.

Mas cada corredor leva para outro corredor.

Cada porta abre outra porta.

Cada elevador muda de direção.

Cada escolha cria um novo caminho.

Após meia hora...

Neo percebe.

A Matrix inteira virou um labirinto.

É exatamente essa sensação que um desenvolvedor experimenta ao abrir um sistema com Spaghetti Code.


O nascimento do espaguete

Curiosamente...

ninguém acorda pensando:

"Hoje vou criar um código horrível."

O Spaghetti Code nasce lentamente.

Primeiro.

Um pequeno ajuste.

Depois.

Outro.

Depois.

Uma exceção.

Depois.

Uma regra temporária.

Depois.

Outra urgência.

Depois.

Uma correção rápida.

Cinco anos depois...

o prato está servido.


Um exemplo COBOL

Imagine este fluxo.

INICIO

↓

VALIDA

↓

CALCULA

↓

GRAVA

↓

FIM

Bonito.

Agora imagine vinte anos depois.

INICIO

↓

VALIDA

↓

GO TO ROTINA-X

↓

PERFORM Y

↓

ALTER Z

↓

GO TO A

↓

PERFORM THRU B

↓

ROTINA-C

↓

GO TO D

↓

VALIDA NOVAMENTE

↓

VOLTA

↓

FIM

Ninguém mais entende.


Como surge?

Existem várias causas.

Crescimento contínuo

Programa pequeno.

Depois médio.

Depois enorme.


Falta de arquitetura

Cada desenvolvedor cria sua própria organização.


Pressão por prazo

"Depois organizamos."

Nunca organizam.


Excesso de GO TO

O clássico dos clássicos.


Código duplicado

Trechos espalhados.


Ausência de revisão

Ninguém verifica consistência.


O COBOL é culpado?

Não.

Essa talvez seja a maior injustiça da história da computação.

COBOL moderno incentiva:

  • PERFORM

  • Modularização

  • COPYBOOK

  • CALL

  • Programas estruturados

  • Classes

  • Métodos (Enterprise COBOL moderno)

O problema nunca foi COBOL.

Foi a forma como algumas pessoas programaram.


Matrix Reloaded

O Arquiteto mostra milhares de versões anteriores da Matrix.

Cada versão acumulava pequenos remendos.

Nenhum parecia perigoso.

Todos juntos criaram enorme complexidade.

Software evolui exatamente assim.


O efeito psicológico

Existe uma armadilha.

Quando modificamos um programa conhecido.

Pensamos:

"Vou colocar só mais um IF."

Depois outro.

Depois outro.

Cada alteração parece pequena.

A soma delas não é.


O Programador COBOL Padawan

Todo Padawan abre um programa antigo e pensa.

"Vou entender rapidamente."

Uma hora depois.

Ainda tenta descobrir onde começou.


O Agente Smith adora Spaghetti Code

Porque sistemas confusos criam:

medo.

Ninguém gosta de alterar.

Cada mudança parece perigosa.

Smith nem precisa atacar.

O próprio código afasta os desenvolvedores.


Um exemplo inspirado na Matrix

Imagine que Neo precisa abrir uma porta.

Mas antes precisa:

abrir outra.

Depois outra.

Depois voltar.

Depois pegar uma chave.

Depois retornar.

Depois abrir outra porta.

É exatamente isso que acontece em muitos fluxos de programas antigos.


Como reconhecer?

Existem sinais claros.

Muitos GO TO

Principal indicador.


Programas enormes

30 mil.

50 mil.

100 mil linhas.


Variáveis sem significado

A1

B2

X99

WK01

WK02

WK03

Regras espalhadas

Mesmo cálculo aparece em cinco lugares.


Dependências circulares

Programa chama outro.

Que chama outro.

Que volta ao primeiro.


Um caso realista

Imagine.

Sistema bancário.

Criado em:

Mais de:

400 modificações.

Nenhuma refatoração.

Resultado.

Cada alteração exige:

  • dois analistas

  • três programadores

  • uma semana de testes

Não porque a regra seja difícil.

Mas porque ninguém sabe o impacto.


Os riscos

Bugs

Alteração pequena.

Impacto gigante.


Performance

Fluxo desnecessário.


CPU

Mais instruções.

Mais custo.


Manutenção

Tempo explode.


Onboarding

Novos profissionais sofrem.


Burnout

Especialistas tornam-se gargalos.


O custo invisível

Imagine.

Alteração.

15 minutos.

Mas entender o programa leva:

dois dias.

Isso é custo.


O impacto no Mainframe

Mainframe processa:

milhões de transações.

Spaghetti Code aumenta:

  • CPU

  • consumo

  • risco

  • testes

  • tempo de homologação

Tudo fica mais caro.


Existe ferramenta para medir?

Sim.

Hoje existem ferramentas excelentes.

  • IBM ADDI

  • IBM Application Discovery

  • SonarQube

  • IBM COBOL Check

  • IBM Developer for z/OS

  • Enterprise Analyzer

Elas calculam:

  • complexidade ciclomática

  • dependências

  • acoplamento

  • fluxo


Como evitar?

Modularização

Divida responsabilidades.


PERFORM

Prefira estruturas claras.


CALL

Separe funcionalidades.


COPYBOOK

Padronize estruturas.


Refatoração contínua

Não espere dez anos.


Comentários úteis

Explique:

por quê.

Não:

o quê.


Testes

Protegem refatorações.


Atenção!

Existe diferença entre:

Programa grande

e

Spaghetti Code.

Alguns sistemas possuem:

200 mil linhas.

Mas excelente organização.

Outros possuem:

2 mil linhas.

Completamente caóticos.

O tamanho não define qualidade.


O papel da arquitetura

Arquitetura cria limites.

Cada módulo possui função.

Sem arquitetura.

Tudo conversa com tudo.


Matrix e os Sentinelas

Os Sentinelas encontram Zion porque seguem caminhos claros.

Imagine se existissem milhões de túneis aleatórios.

Eles demorariam muito mais.

Código também.

Fluxos claros facilitam manutenção.


Curiosidade

A Structured Programming Movement dos anos 70 surgiu justamente para combater o Spaghetti Code.

Nomes como:

  • Edsger Dijkstra

  • Niklaus Wirth

  • Donald Knuth

mudaram completamente a forma de programar.

O famoso artigo:

"Go To Statement Considered Harmful"

transformou a indústria.


O COBOL moderno

Enterprise COBOL oferece recursos para escrever código extremamente limpo.

  • Inline PERFORM

  • EVALUATE

  • Functions

  • Nested Programs

  • OO COBOL

  • User Defined Functions

  • XML

  • JSON

Não existe desculpa para criar espaguete.


Erros clássicos

  • Misturar regras de negócio e acesso a dados.

  • Usar GO TO excessivamente.

  • Duplicar lógica.

  • Não remover código morto.

  • Acrescentar IFs infinitamente.

  • Não modularizar.


Boas práticas

  • Uma responsabilidade por módulo.

  • Nomes significativos.

  • Fluxo previsível.

  • Revisões frequentes.

  • Refatoração incremental.

  • Diagramas atualizados.

  • Documentação viva.


O Ensinamento do Oráculo

O Oráculo entrega um prato de espaguete para Neo.

Ele tenta puxar um fio.

Todo o prato vem junto.

Ela então entrega uma caixa organizada de peças LEGO.

Cada bloco possui uma função.

Ela sorri.

"Software deve parecer LEGO.
Nunca espaguete."


Aplicabilidade

Spaghetti Code aparece em:

  • COBOL

  • Java

  • Python

  • C

  • C++

  • JavaScript

  • PHP

  • Rust

  • Go

  • Assembly

Nenhuma linguagem está imune.


Lições para um Programador COBOL Padawan

Quando você começar sua carreira em um ambiente IBM Z, encontrará programas escritos há décadas. Alguns serão verdadeiras obras-primas da engenharia. Outros parecerão um labirinto digno da Matrix.

A tentação será adicionar "apenas mais um IF" ou "mais um GO TO" para resolver rapidamente um incidente. Resista.

Sempre que possível:

  • extraia responsabilidades para novos módulos;

  • elimine duplicações;

  • substitua fluxos confusos por estruturas claras;

  • escreva nomes compreensíveis;

  • documente regras de negócio;

  • mantenha testes atualizados.

Cada pequena melhoria reduz um pouco o emaranhado do espaguete e facilita o trabalho do próximo desenvolvedor.


Conclusão — Saindo do Prato de Espaguete da Matrix

No final da trilogia Matrix, Neo percebe que compreender a estrutura da Matrix é mais poderoso do que simplesmente reagir a ela.

Na Engenharia de Software, acontece exatamente o mesmo.

O maior problema do Spaghetti Code não é ser feio.

É transformar cada alteração em uma aventura imprevisível.

Em sistemas COBOL responsáveis por processar milhões de transações financeiras, isso significa mais tempo de manutenção, maior risco de incidentes, consumo adicional de CPU, testes mais demorados e equipes receosas de evoluir o software.

No universo Bellacosa Mainframe existe uma máxima que todo Programador COBOL Padawan deveria guardar:

"Cada GO TO desnecessário é mais um corredor dentro da Matrix. Cada módulo bem organizado é uma porta de saída."

O objetivo não é escrever o código mais inteligente.

É escrever o código que outro programador — talvez você mesmo daqui a dez anos — consiga entender sem precisar da ajuda do Oráculo.

Porque o verdadeiro Escolhido não é aquele que cria o maior labirinto.

É aquele que sabe construir o caminho mais simples até a solução.

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