☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

segunda-feira, 11 de novembro de 2024

🕵️ CHARLIE CHAN E O MISTÉRIO DOS MICROSSERVIÇOS QUE NÃO ERAM MICROSSERVIÇOS

 

Bellacosa Mainframe e os mistérios dos microsserviços

☕ Um Café no Bellacosa Mainframe

🕵️ CHARLIE CHAN E O MISTÉRIO DOS MICROSSERVIÇOS QUE NÃO ERAM MICROSSERVIÇOS

Distributed Monolith, APIs, bancos compartilhados, chamadas síncronas, observabilidade, consistência, Sagas e o estranho caso do COBOL acusado por um crime cometido pela arquitetura distribuída.

Sob a tutela de Charlie Chan

 


Há crimes em que o culpado deixa impressões digitais.

Há outros em que desaparece sem deixar vestígios.

E existem aqueles especialmente interessantes nos quais todas as evidências apontam para o suspeito errado.

Era exatamente esse o caso.

Naquela manhã, Charlie Chan foi chamado para investigar um incidente gravíssimo na fictícia Companhia Internacional de Pagamentos Oriental & Ocidental.

A empresa havia realizado uma enorme modernização.

Durante décadas, seu sistema central funcionara em IBM Z. COBOL, CICS e Db2 processavam clientes, contas, pagamentos e transações. A arquitetura certamente possuía limitações e décadas de evolução acumulada, mas havia uma característica difícil de ignorar:

funcionava.

Então chegou a transformação digital.

Consultorias apareceram.

PowerPoints apareceram.

Post-its apareceram.

Kubernetes apareceu.

Containers apareceram.

APIs apareceram.

Kafka apareceu.

E, naturalmente, apareceram microserviços.

Muitos microserviços.

Centenas deles.

O antigo sistema, considerado monolítico demais para o século XXI, foi cercado por uma maravilhosa arquitetura distribuída.

Até que determinada transação passou a levar quase dois segundos.

Imediatamente alguém encontrou o culpado:

COBOL.

Charlie Chan entrou silenciosamente na sala de guerra.

Na parede havia dashboards, diagramas, traces e gráficos coloridos.

Um arquiteto apontou para o mainframe.

— O legado está atrasando nossa transformação.

Charlie Chan observou o enorme desenho da arquitetura.

Mobile.

API Gateway.

Authentication Service.

Customer Service.

Order Service.

Inventory Service.

Pricing Service.

Payment Service.

Kafka.

Integration Service.

z/OS Connect.

CICS.

COBOL.

Db2.

Depois perguntou:

— Quanto tempo COBOL levou?

Silêncio.

Alguém consultou o monitor.

— Aproximadamente 38 milissegundos.

Chan sorriu discretamente.

Havia encontrado sua primeira pista.



🕵️ CAPÍTULO 1 — O morto tinha muitos suspeitos

Para entender o crime, precisamos entender o que microserviços deveriam proporcionar.

A ideia não é simplesmente transformar:

PROGRAMA A
PROGRAMA B
PROGRAMA C

em:

SERVICE A
SERVICE B
SERVICE C

e colocar HTTP entre eles.

Uma arquitetura de microserviços procura estabelecer fronteiras significativas, normalmente relacionadas às capacidades ou domínios do negócio.

Imagine uma loja.

Podemos ter:

CUSTOMER
ORDER
PAYMENT
INVENTORY
SHIPPING

Cada domínio possui responsabilidades relativamente claras.

PAYMENT, por exemplo, deveria poder evoluir sem exigir que cinco outras equipes reconstruíssem simultaneamente seus sistemas.

Esse é um dos objetivos fundamentais:

reduzir acoplamento.

Charlie Chan escreveu três palavras no quadro:

DESIGN
RUNTIME
DATA

O jovem programador COBOL perguntou:

— O que significa isso?

Chan apontou para a primeira.

Acoplamento de design

Se modificar A exige modificar B, existe dependência de design.

A mudou
   ↓
B precisa mudar
   ↓
C também precisa mudar

Depois apontou para a segunda.

Acoplamento de runtime

Se A somente funciona enquanto B estiver disponível naquele exato instante:

A → B

há dependência operacional.

Finalmente:

Acoplamento de dados

Se A precisa conhecer as estruturas internas de dados pertencentes a B:

SERVICE A
    |
    └────> TABLE_B

temos acoplamento de dados.

Charlie Chan circulou as três palavras.

Quando uma arquitetura apresenta simultaneamente forte dependência de design, runtime e dados, podemos ter algo muito interessante:

um monólito distribuído.



🕸️ CAPÍTULO 2 — O Distributed Monolith entra na sala

O primeiro suspeito da investigação era elegante.

Vestia containers.

Carregava YAML.

Falava Kubernetes fluentemente.

Apresentava-se como microservices.

Mas seus documentos contavam outra história.

Havia:

Customer Service
Order Service
Payment Service
Inventory Service
Shipping Service

Parecia perfeito.

Charlie Chan perguntou:

— Podemos alterar Payment Service e colocá-lo em produção sozinho?

O arquiteto respondeu:

— Tecnicamente sim...

Charlie Chan conhecia aquela palavra.

Tecnicamente.

Quase sempre alguma coisa interessante aparece depois dela.

— Mas?

— Precisamos coordenar com Order, Customer e Billing.

— Podemos implantar Customer independentemente?

— Normalmente fazemos release conjunto.

— E Inventory?

— Também.

Chan virou-se para o programador.

— Cinco casas com cinco portas não significam cinco famílias independentes se todos precisam sair juntos quando um morador troca a geladeira.

Era exatamente isso.

Fisicamente:

A   B   C   D   E

Arquiteturalmente:

A → B → C → D → E

Você não eliminou o monólito.

Você colocou uma rede dentro dele.

E essa distinção é extraordinariamente importante.

Um monólito tradicional pode possuir chamadas locais extremamente rápidas.

Um distributed monolith mantém parte do acoplamento do monólito e acrescenta:

DNS, TCP, TLS, serialização, desserialização, proxies, gateways, service discovery, containers, balanceadores, retries, timeouts e falhas parciais.

O velho:

CALL 'PAGAMENTO'

vira conceitualmente:

COBOL CALL
      ↓
“Você está aqui.”

Enquanto:

REST CALL

pode significar:

Aplicação
   ↓
DNS
   ↓
Network
   ↓
TLS
   ↓
Gateway
   ↓
Load Balancer
   ↓
Container
   ↓
Framework
   ↓
JSON parser
   ↓
Business Logic

O CALL deixou de ser uma porta.

Virou uma viagem.



🧩 CAPÍTULO 3 — O caso dos microserviços pequenos demais

O segundo suspeito parecia inocente.

Chamava-se Excessive Microservices.

A investigação encontrou:

CustomerNameService
CustomerAddressService
CustomerPhoneService
CustomerEmailService
CustomerPreferenceService
CustomerStatusService

Charlie Chan perguntou:

— Por que existem seis serviços?

Responderam:

— Porque microserviços precisam ser pequenos.

Chan permaneceu alguns segundos em silêncio.

Esse é um dos maiores equívocos causados pelo próprio nome microservice.

O “micro” não significa:

menor quantidade possível de linhas de código.

Nem:

transforme cada função em servidor.

O limite deveria fazer sentido arquitetural e comercial.

Se cada pequena operação vira serviço, surge uma explosão de infraestrutura.

Cada serviço pode exigir:

repositório
pipeline
build
container
configuração
secrets
logs
monitoramento
alertas
testes
versionamento
documentação
ownership

Multiplique isso por 300.

A empresa pretendia diminuir complexidade.

Acabou industrializando-a.

Charlie Chan escreveu:

“Dividir problema não necessariamente divide complexidade.”



📞 CAPÍTULO 4 — As testemunhas conversavam demais

A terceira pista apareceu no distributed tracing.

Uma simples compra fazia:

Gateway
   ↓
Customer
   ↓
Address
   ↓
Inventory
   ↓
Pricing
   ↓
Discount
   ↓
Fraud
   ↓
Payment
   ↓
Shipping

Nove serviços para responder uma única solicitação.

Isso é Service Chatter.

Serviços excessivamente conversadores transformam pequenas operações em longas sequências de chamadas remotas.

Imagine que cada chamada leve apenas 30 ms.

Parece pouco.

Mas adicionamos:

latência de rede
processamento
autenticação
serialização
consultas
filas
TLS
proxies

E há algo ainda pior:

tail latency.

Um serviço pode normalmente responder em 20 ms, mas ocasionalmente levar 500 ms.

Se uma transação depende sequencialmente de muitos serviços, basta um deles espirrar para a transação inteira pegar gripe.


⛓️ CAPÍTULO 5 — A corrente síncrona

Charlie Chan encontrou então:

A → B → C → D → E → F

Cada serviço esperava pelo seguinte.

Se F falhasse:

A → B → C → D → E → F
                      X

E esperariam:

E
D
C
B
A

até os respectivos timeouts.

Mas alguém havia pensado na solução:

RETRY!

Agora:

F falhou
 ↓
retry
 ↓
retry
 ↓
retry

Enquanto centenas de transações faziam exatamente a mesma coisa.

O sistema tentava resolver uma sobrecarga...

produzindo mais carga.

Essa é uma das armadilhas mais deliciosamente perversas dos sistemas distribuídos.

Retries são úteis.

Retries indiscriminados são multiplicadores de desastre.

Entram então padrões como:

Timeout
Circuit Breaker
Bulkhead
Backoff
Rate Limiting
Load Shedding
Async Messaging

O Circuit Breaker é particularmente interessante.

Se determinado serviço está claramente falhando, por que continuar chamando-o milhares de vezes?

É semelhante ao disjuntor elétrico.

Detectamos:

FAIL
FAIL
FAIL
FAIL

e abrimos temporariamente o circuito:

A ─────X────→ B

evitando desperdiçar recursos e potencialmente agravando o incidente.


🗄️ CAPÍTULO 6 — Todos juravam ter seu banco. Mas havia apenas um

Charlie Chan então entrou no Db2.

Encontrou algo curioso:

Customer Service ─┐
Order Service ────┤
Payment Service ──┼── DATABASE
Shipping Service ─┤
Inventory Service ┘

— Quem é proprietário desta tabela?

Silêncio.

— Todos.

Chan sorriu.

— Quando todos são proprietários, talvez ninguém seja.

Esse é o problema do Common Shared Database.

O problema não é simplesmente utilizar o mesmo servidor Db2.

É perfeitamente possível organizar:

Db2
│
├── CUSTOMER schema
├── ORDER schema
├── PAYMENT schema
└── SHIPPING schema

O ponto fundamental é ownership.

Payment não deveria simplesmente vasculhar tabelas internas de Customer porque encontrou um SELECT conveniente.

Caso contrário:

ALTER TABLE CUSTOMER...

pode quebrar:

Customer
Payment
Order
Shipping
Fraud

Agora todos precisam coordenar mudanças.

Voltamos ao primeiro suspeito.

Distributed Monolith.

Charlie Chan percebeu que os suspeitos não eram independentes.

Eram cúmplices.


🔢 CAPÍTULO 7 — O JSON que mudou de aparência

Outra equipe resolveu melhorar uma API.

Antes:

{
  "customerId": 317,
  "name": "Charlie Chan"
}

Depois:

{
  "customer": {
    "id": 317,
    "fullName": "Charlie Chan"
  }
}

Muito mais elegante.

Deploy realizado.

Dezessete consumidores quebraram.

Bem-vindo ao Missing API Version Control.

Para um programador COBOL isso deveria soar assustadoramente familiar.

Imagine:

01 CUSTOMER-RECORD.
   05 CUSTOMER-ID    PIC 9(09).
   05 CUSTOMER-NAME  PIC X(40).

Alguém modifica irresponsavelmente o COPYBOOK.

Dezenas de programas dependem daquela estrutura.

Temos o mesmo princípio.

COPYBOOK é contrato.

OpenAPI é contrato.

JSON é contrato.

Protobuf é contrato.

Mensagem MQ é contrato.

Evento Kafka é contrato.

Modernização não aboliu contratos.

Apenas lhes deu novos nomes.


🔭 CAPÍTULO 8 — O crime aconteceu, mas ninguém sabia onde

Então veio a pergunta mais simples de toda investigação:

— Onde a transação ficou lenta?

Todos olharam os dashboards.

Havia:

gateway.log
customer.log
payment.log
order.log
inventory.log
shipping.log
kafka.log
integration.log

Cada equipe possuía seu próprio pedaço da história.

Ninguém possuía o filme inteiro.

Esse é o Limited Observability.

Em sistemas distribuídos precisamos correlacionar eventos.

Imagine:

TRACE-ID = CHAN-0317

Então conseguimos reconstruir:

03:17:00.001 Gateway
03:17:00.020 Authentication
03:17:00.051 Customer
03:17:00.094 Order
03:17:00.141 Inventory
03:17:00.209 Payment
03:17:01.710 Payment TIMEOUT

Ah...

03:17.

Quem acompanha o Bellacosa Mainframe sabe que alguma coisa sempre acontece às 03:17. 😉

Agora temos evidência.

Observabilidade moderna costuma trabalhar com três elementos extremamente importantes:

LOGS
METRICS
TRACES

Eu acrescentaria contexto operacional:

EVENTS
DEPLOYMENTS
CONFIG CHANGES
SECURITY EVENTS

Porque descobrir que a latência começou às 03:17 é interessante.

Descobrir que:

03:16:48 deployment PAYMENT V7.4
03:17:00 latency spike

é muito mais interessante.


💾 CAPÍTULO 9 — O COMMIT desaparecido

Charlie Chan voltou-se então para o programador COBOL.

— Mostre uma transação tradicional.

Ele escreveu:

BEGIN

UPDATE ACCOUNT
INSERT PAYMENT
UPDATE ORDER

COMMIT

Falhou?

ROLLBACK

Elegante.

Mas agora cada domínio possui seus próprios dados:

Order DB
Inventory DB
Payment DB
Shipping DB

A transação torna-se:

Create Order
      ↓
Reserve Inventory
      ↓
Charge Payment
      ↓
Schedule Shipping

Suponha:

Create Order        OK
Reserve Inventory   OK
Charge Payment      FAIL

O que acontece com o estoque?

Precisamos desfazer semanticamente a operação anterior:

Release Inventory
Cancel Order

Entramos no universo das Sagas e transações compensatórias.

E aqui existe uma diferença filosófica enorme.

No modelo transacional tradicional pensamos frequentemente:

ANTES
  ↓
TRANSAÇÃO
  ↓
DEPOIS

No distribuído podemos precisar reconhecer estados intermediários:

CREATED
   ↓
INVENTORY_RESERVED
   ↓
PAYMENT_PENDING
   ↓
PAYMENT_FAILED
   ↓
COMPENSATING
   ↓
CANCELLED

Esses estados não são acidentes.

Fazem parte do desenho do negócio.


⚙️ CAPÍTULO 10 — A configuração escondida no código

Chan encontrou outra evidência:

PAYMENT_HOST=production.company.local

Dentro da aplicação.

Para mudar o endereço:

alterar código
 ↓
build
 ↓
teste
 ↓
deploy

Temos Embedded Configuration.

Configuração operacional deveria normalmente estar separada do código.

Mas Charlie Chan encontrou outra armadilha.

Externalizar tudo também não resolve magicamente o problema.

Se alguém consegue alterar:

PAYMENT_TIMEOUT=3000

para:

PAYMENT_TIMEOUT=30000

sem auditoria, acabamos criando outro mistério.

Configuração precisa de:

versionamento
controle de acesso
auditoria
validação
rollback

Imagine durante uma investigação descobrir:

“Ninguém alterou o programa.”

Verdade.

Alteraram apenas a configuração.

O comportamento mudou completamente.

Essa diferença seria especialmente interessante em uma investigação de Red Team.


🧱 CAPÍTULO 11 — Um morreu e levou todos consigo

Restava Weak Fault Isolation.

Payment caiu.

Order começou a esperar.

Checkout esperou Order.

Gateway esperou Checkout.

Threads foram ocupadas.

Connections acabaram.

Retries começaram.

CPU subiu.

Memória subiu.

Filas cresceram.

E finalmente:

PAYMENT
   X
   ↓
ORDER
   X
   ↓
CHECKOUT
   X
   ↓
SYSTEM
   X

Charlie Chan perguntou:

— Por que chamam isso de serviços independentes?

Ninguém respondeu.

Fault isolation deveria permitir algo mais próximo de:

Payment      X

Catalog      OK
Search       OK
Customer     OK
Order        DEGRADED

Talvez o cliente não consiga pagar naquele momento.

Isso não significa necessariamente que ele também precise perder acesso ao catálogo.

Essa é a essência de graceful degradation.


🏛️ CAPÍTULO 12 — O suspeito que ninguém interrogou: o monólito modular

Havia outra pessoa na sala.

Ninguém havia interrogado.

Chamava-se:

Modular Monolith.

Durante anos, “monolith” tornou-se quase uma palavra ofensiva em determinados círculos tecnológicos.

Mas Charlie Chan não investigava palavras.

Investigava evidências.

Considere:

┌───────────────────────────────┐
│       APPLICATION             │
│                               │
│ CUSTOMER │ ORDER │ PAYMENT    │
│──────────┼───────┼────────────│
│ INVENTORY│ SHIPPING           │
│                               │
└───────────────────────────────┘

Um único deployable não significa necessariamente uma massa desorganizada.

Podemos possuir:

módulos
interfaces
encapsulamento
bounded contexts
ownership
testes
regras arquiteturais

sem obrigatoriamente adicionar:

latência de rede
service discovery
distributed tracing
eventual consistency
orquestração
centenas de pipelines
falhas parciais

E aqui está uma excelente estratégia de engenharia:

comece estabelecendo boas fronteiras.

Depois, se uma fronteira realmente precisar virar serviço independente, extraia-a.

Não precisamos distribuir primeiro para descobrir o domínio depois.


🖥️ CAPÍTULO 13 — Finalmente interrogam o COBOL

Depois de horas de investigação, Charlie Chan voltou ao suspeito original.

COBOL.

O relatório dizia:

Tempo total da transação: 1.843 ms

Parecia terrível.

Então Chan pediu a decomposição.

API Gateway             74 ms
Authentication          91 ms
Customer Service        63 ms
Order Service          112 ms
Inventory              127 ms
Pricing                 86 ms
Payment                742 ms
Integration            164 ms
z/OS Connect            49 ms
CICS                    31 ms
COBOL                    38 ms
Db2                      41 ms
demais esperas          225 ms
--------------------------------
TOTAL                 1.843 ms

Todos olharam para o quadro.

COBOL havia sido acusado de produzir uma transação de quase dois segundos.

Sua participação direta era minúscula.

Charlie Chan finalmente declarou:

O homem mais velho da sala não necessariamente cometeu o crime apenas porque estava presente quando aconteceu.

O mainframe não estava necessariamente lento.

Haviam construído uma rodovia cheia de pedágios para chegar até ele.


☕ CAPÍTULO 14 — O que um programador COBOL iniciante deveria aprender disso?

Muito.

Especialmente que os conceitos modernos não são tão alienígenas quanto parecem.

Veja:

Mundo tradicionalMundo distribuído
COPYBOOKAPI Schema
CALLService Call
COMMAREAPayload
MQ MessageEvent/Message
COMMITLocal Transaction
ROLLBACKCompensação/Saga
Return CodeHTTP Status/Error
SMF/monitoramentoTelemetry
Correlation IDTrace ID
TimeoutTimeout
RACFIdentity/Authorization
JCL/PROC/ParmsDeployment/configuration

As implementações mudam profundamente.

Os problemas fundamentais, nem tanto.

Ainda perguntamos:

Quem chama quem?

Quem possui os dados?

Quem pode alterar?

Quem depende dessa interface?

O que acontece se falhar?

Como recuperamos?

Como sabemos o que aconteceu?

Essas perguntas atravessam gerações tecnológicas.


🕵️ CAPÍTULO 15 — Charlie Chan monta o quadro do crime

Chan finalmente ligou todos os fios.

              DISTRIBUTED MONOLITH
                       │
         ┌─────────────┼─────────────┐
         ↓             ↓             ↓
    DESIGN          RUNTIME         DATA
    COUPLING        COUPLING       COUPLING
         │             │             │
         ↓             ↓             ↓
 API versions       chatter       shared DB
 deployments        sync chains   consistency
 contracts          retries       transactions
         │             │             │
         └─────────────┼─────────────┘
                       ↓
                COMPLEXIDADE
                       ↓
               OBSERVABILIDADE
                       ↓
                FAULT ISOLATION

Finalmente tudo fazia sentido.

Os dez anti-patterns da figura original não eram dez crimes isolados.

Eram manifestações de algumas forças fundamentais.

Acoplamento.

Distribuição.

Complexidade.

Quando dividimos uma aplicação fisicamente sem reduzir suficientemente o acoplamento lógico, obtemos o pior dos dois mundos.

Carregamos problemas do monólito...

e adicionamos problemas de sistemas distribuídos.


🔎 CAPÍTULO 16 — O checklist Charlie Chan

Antes de criar CustomerService, PaymentService ou WhateverService, Charlie Chan faria perguntas.

Não começaria perguntando:

Qual framework vamos utilizar?

Perguntaria:

Existe uma fronteira real de domínio?

Depois:

Esse componente precisa evoluir independentemente?

Precisa ser implantado independentemente?

Possui necessidades próprias de escala?

Precisa de isolamento operacional?

Existe ownership claramente definido?

Se ficar indisponível, o restante do sistema consegue continuar funcionando?

Quem possui seus dados?

Quantas chamadas serão necessárias para completar uma operação?

Como rastrearemos uma transação entre os componentes?

Como trataremos consistência?

Como evoluiremos contratos?

E existe uma pergunta especialmente incômoda:

Que problema concreto seria impossível — ou significativamente pior — resolver mantendo este componente dentro de um monólito modular?

Se ninguém souber responder...

Charlie Chan já encontrou uma pista.


🧠 EPÍLOGO — O mistério nunca foi COBOL versus microservices

Ao final da investigação, o jovem programador perguntou:

— Mestre Chan, então microserviços são ruins?

Charlie Chan sorriu.

Essa seria uma conclusão fácil demais.

Microservices podem ser extraordinários quando suas características resolvem problemas reais.

Grandes organizações podem precisar de autonomia entre equipes.

Partes específicas podem possuir escalabilidade completamente diferente.

Certos domínios podem precisar de ciclos de release independentes.

Alguns componentes podem exigir isolamento de falhas.

Tecnologias diferentes podem ser apropriadas para problemas diferentes.

Há excelentes motivos para distribuir sistemas.

O erro está em confundir:

DISTRIBUIÇÃO

com:

MODERNIZAÇÃO

ou:

QUANTIDADE DE SERVIÇOS

com:

QUALIDADE ARQUITETURAL

Uma aplicação não se torna moderna porque ganhou 200 containers.

Assim como um sistema COBOL não se torna ruim simplesmente porque nasceu há quarenta anos.

Arquitetura precisa ser julgada pelas propriedades que entrega.

Charlie Chan fechou seu caderno.

Na última página havia apenas uma frase:

“Quando vinte microserviços precisam concordar para mudar uma linha, procure novamente. Monólito pode estar usando vinte disfarces.”

Ele caminhou em direção à porta.

Então parou.

Voltou ao terminal.

Abriu o trace do incidente mais uma vez.

Havia uma informação que ninguém percebera.

TRACE-ID: CHAN-0317
TIMESTAMP: 03:17:00

Chan sorriu.

O programador COBOL arregalou os olhos.

— 03:17 outra vez?

Charlie Chan colocou o chapéu.

— Alguns mistérios pertencem à arquitetura.

E saiu.

No Bellacosa Mainframe, entretanto, todos já sabiam:

se aconteceu às 03:17, o incidente ainda não terminou. ☕🕵️


☕ MORAL DO CASO

A grande lição para quem está começando em COBOL — ou estudando arquitetura moderna — é surpreendentemente simples:

não modernizamos um sistema trocando nomes antigos por nomes modernos.

Trocar:

PROGRAM

por:

SERVICE

não elimina acoplamento.

Trocar:

COPYBOOK

por:

JSON

não elimina contratos.

Trocar:

CALL

por:

REST

não elimina dependências.

Trocar:

COMMIT

por:

EVENTS

não elimina consistência.

E trocar:

MONOLITH

por:

MICROSERVICES

não produz automaticamente uma boa arquitetura.

Às vezes produz algo muito mais curioso:

        MONÓLITO
           +
          REDE
           +
     200 CONTAINERS
           +
        KAFKA
           +
     KUBERNETES
           =
           
DISTRIBUTED MONOLITH

E talvez essa seja a pista mais importante deixada por Charlie Chan:

tecnologia muda. Os nomes mudam. As ferramentas mudam. Mas dependência, acoplamento, responsabilidade, falha, dados e complexidade continuam sentados na mesma sala de interrogatório.

O bom arquiteto não pergunta primeiro:

“Como transformamos isto em microserviços?”

Pergunta:

“Qual problema estamos tentando resolver?”

Somente depois escolhe a arquitetura.

Porque, como descobriríamos naquela madrugada no Bellacosa Mainframe, às vezes o velho COBOL acusado de todos os crimes estava tranquilamente processando sua transação em 38 milissegundos.

Os outros 1.805 milissegundos estavam ocupados sendo modernos. ☕🕵️‍♂️💻

domingo, 10 de novembro de 2024

Dr. House Entra no CPD — O Caso do Arquivo que Queria Ser Banco, do Cartão que Virou COBOL e do VSAM que Acordou Falando JSON

 

Bellacosa Mainframe e a evolucao do cobol e armazenamento de dados

☕ Um Café no Bellacosa Mainframe

Dr. House Entra no CPD — O Caso do Arquivo que Queria Ser Banco, do Cartão que Virou COBOL e do VSAM que Acordou Falando JSON

Ou: como cartões perfurados, fitas, QSAM, VSAM, IMS, Db2 e VSAMDB formam a árvore genealógica dos dados corporativos — e por que “colocar JSON” não cura automaticamente a arquitetura

“Todo mundo mente”, diz o Dr. Gregory House.

No CPD, isso significa: todo mundo diz que “é só um arquivo”.

E lá estamos nós, numa sala branca demais, com o monitor exibindo um SOC7, dois analistas discutindo se o problema é “no VSAM” e um gerente garantindo que basta transformar tudo em JSON para modernizar o legado antes do fim do trimestre.

House olha para a tela, manca até o quadro, escreve KSDS ≠ DB2, sublinha três vezes e sentencia:

“Não é lúpus. É falta de modelo de dados.”

Para um programador COBOL iniciante, a confusão é compreensível. Afinal, o que exatamente são cartão perfurado, fita, QSAM, VSAM, IMS, Db2 e essa nova criatura chamada VSAMDB? São todos arquivos? Todos bancos? Todos formas de guardar informação?

A resposta curta é: não.

A resposta útil é que essas tecnologias são capítulos de uma mesma história. Cada uma resolveu um problema real de sua época. E, em um IBM Z moderno, várias podem coexistir no mesmo sistema, trabalhando discretamente enquanto alguém no LinkedIn anuncia que acabou de descobrir “dados”.

Vamos abrir o prontuário.



Prólogo — Antes do banco havia o buraco

Antes de alguém escrever:

SELECT NOME
  FROM CLIENTE
 WHERE CPF = :WS-CPF

alguém precisava representar informação de forma que uma máquina pudesse ler.

A ideia mais antiga e persistente da computação corporativa é simples:

Dados possuem formato.
Formato possui posição.
E posição errada gera desastre com excelente documentação posterior.

O cartão perfurado foi um dos primeiros grandes símbolos disso. Em sua versão clássica, ele possuía 80 colunas. Cada coluna podia codificar uma letra, número ou instrução mediante furos.

Um cartão poderia conter o cadastro de um funcionário:

Colunas  1-06  Matrícula
Colunas  7-36  Nome
Colunas 37-46  Salário
Colunas 47-48  Departamento
Colunas 49-80  Reserva

Um cartão, um registro. Mil cartões, mil registros. Um programador derruba o baralho no chão, mil problemas novos.

Curiosidade: boa parte do famoso formato fixo do COBOL herdou a disciplina dos cartões.

ColunasUso tradicional no COBOL
1–6Número de sequência
7Indicador de comentário ou continuação
8–11Area A
12–72Area B
73–80Identificação/sequência

É por isso que o COBOL antigo parece ter sido desenhado por alguém que não confiava em espaços em branco. Porque foi.

As colunas 73 a 80 podiam ajudar a reordenar o programa caso o baralho caísse. Hoje chamamos isso de controle de versão; naquela época, era o estagiário ajoelhado no chão, tentando decidir se o cartão 003417 vinha antes ou depois do 003418.

House observa o cartão e diz:

“O paciente não morreu por ser antigo. Morreu porque alguém ignorou o layout.”

Essa frase vale para um cartão de 1968, um copybook de 1988 e um payload JSON de 2026.



1. Fita perfurada — o registro saiu caminhando em fila indiana

A fita perfurada é parecida com o cartão, mas usa papel contínuo. Em vez de registros separados em fichas, a informação segue numa longa sequência de caracteres.

[início] → caractere 1 → caractere 2 → caractere 3 → ... → [fim]

Ela foi comum em teletipos, telecomunicações, automação e equipamentos que precisavam transmitir ou registrar informação de forma linear.

A fita tinha uma característica fundamental: acesso sequencial.

Se você queria chegar ao registro 1.000, precisava atravessar os 999 anteriores. Não existia uma chave, um índice ou uma lupa digital dizendo “vá direto ao CPF 123”.

Parece medieval, mas não é uma ideia morta. A lógica sequencial continua presente em:

  • arquivos texto;

  • logs;

  • streams;

  • eventos;

  • mensagens;

  • fitas de backup;

  • arquivos batch gigantescos;

  • processamento de entrada e saída em lote.

A diferença é que hoje o rolo de papel virou storage de alta capacidade, nuvem, fita virtual ou biblioteca robótica. Mas a lógica ainda é a mesma: o próximo registro é o próximo registro.

MeioOrganizaçãoMelhor uso
Cartão perfuradoRegistro individualEntrada de dados e programas
Fita perfuradaFluxo contínuoComunicação e automação
Fita magnéticaMuitos registros em sequênciaBackup, arquivo e batch
Disco indexadoRegistro por chaveConsulta direta
Banco de dadosDados com regras e relaçõesSistemas corporativos complexos

A fita magnética sucedeu a fita perfurada com mais capacidade, velocidade e confiabilidade. Continua excelente quando você processa muito dado em ordem. Mas tente localizar um contrato específico numa fita: ela sorrirá educadamente e pedirá que você espere a leitura chegar até ele.

Não é defeito. É especialização.



2. QSAM — o garçom que traz registros sem mostrar a cozinha

Quando falamos em QSAM, a primeira correção de House seria:

“QSAM não é armazenamento. É método de acesso. Pare de chamar tudo de banco.”

QSAM significa Queued Sequential Access Method, ou Método de Acesso Sequencial com Fila.

Ele permite que o programa COBOL leia ou grave registros sequencialmente sem precisar administrar blocos físicos, buffers, canais de I/O e detalhes de dispositivo.

O programa pede:

“Leia o próximo registro.”

E o z/OS resolve o restante.

A palavra Queued existe porque o sistema usa filas e buffers para antecipar trabalho. Enquanto o programa processa o registro atual, o sistema pode já estar buscando o próximo bloco. É como uma cozinha eficiente: o garçom entrega seu café enquanto a máquina já está preparando o seguinte.

Sem QSAM, o programador precisaria trabalhar mais próximo do I/O físico, usando por exemplo o BSAM (Basic Sequential Access Method).

MétodoO que o programador pede
QSAM“Dê-me o próximo registro.”
BSAM“Leia este bloco físico neste buffer e me avise quando terminar.”

QSAM é o caminho mais natural para arquivos batch tradicionais.

Em COBOL:

SELECT ARQ-CLIENTE ASSIGN TO ENTRADA
    ORGANIZATION IS SEQUENTIAL
    ACCESS MODE IS SEQUENTIAL
    FILE STATUS IS WS-FS-CLIENTE.

Depois:

OPEN INPUT ARQ-CLIENTE

PERFORM UNTIL WS-FIM-ARQ = 'S'
    READ ARQ-CLIENTE
        AT END
            MOVE 'S' TO WS-FIM-ARQ
        NOT AT END
            PERFORM PROCESSA-CLIENTE
    END-READ
END-PERFORM

CLOSE ARQ-CLIENTE

Parece banal. E é justamente por isso que funciona há tanto tempo.

Um job de folha de pagamento pode ler milhões de funcionários, um por um, calcular descontos, gerar demonstrativos e criar um arquivo de saída. Se os dados estão ordenados, QSAM é uma ferramenta extremamente eficiente.

Registro, bloco e dataset: a trindade que confunde o padawan

ConceitoSignificado
RegistroUnidade lógica: cliente, venda, funcionário
BlocoGrupo de registros movimentado numa operação de I/O
DatasetArquivo do z/OS que contém os registros

O COBOL pensa em registros. O disco prefere blocos. O z/OS faz a mediação para que ninguém precise negociar diretamente com o prato magnético como se fosse uma sessão de terapia.

É daí que surgem atributos clássicos:

  • RECFM=FB: registros de tamanho fixo, bloqueados;

  • RECFM=VB: registros de tamanho variável, bloqueados;

  • LRECL: tamanho lógico do registro;

  • BLKSIZE: tamanho do bloco de I/O.

Se um arquivo possui LRECL=120, cada registro lógico possui 120 bytes. Mas o sistema pode transferir diversos desses registros por vez num bloco maior. Isso reduz I/O e melhora desempenho.

House pega o relatório de performance, vê um arquivo mal bloqueado e murmura:

“Não é CPU. Nunca é CPU. É I/O ruim fingindo que é CPU.”

Guarde essa frase. Ela salvará horas de diagnóstico.


3. VSAM — o arquivo ganhou chave, memória e atitude

O VSAM significa Virtual Storage Access Method. Ele também é um método de acesso do z/OS, mas é muito mais sofisticado que um arquivo sequencial comum.

VSAM não é, em sentido estrito, um gerenciador relacional de banco de dados. Ele não oferece SQL, JOIN, chave estrangeira, catálogo de negócio ou integridade referencial automática.

Ele oferece outra coisa: acesso rápido e eficiente a registros, especialmente por chave.

Os tipos mais conhecidos são:

TipoO que fazExemplo
KSDSLocaliza registro por chaveCliente pelo CPF
ESDSArmazena registros na ordem de inclusãoLog de eventos
RRDSLocaliza por número relativoTabela por posição
LDSEspaço linear para uso especializadoEstruturas físicas internas

O favorito dos sistemas COBOL/CICS é o KSDS (Key-Sequenced Data Set).

Imagine um cadastro cujo campo-chave é o número da conta:

SELECT ARQ-CONTA ASSIGN TO CONTAKS
    ORGANIZATION IS INDEXED
    ACCESS MODE IS DYNAMIC
    RECORD KEY IS CONTA-NUMERO
    FILE STATUS IS WS-FS-CONTA.

E depois:

MOVE WS-CONTA-PROCURADA TO CONTA-NUMERO

READ ARQ-CONTA KEY IS CONTA-NUMERO
    INVALID KEY
        DISPLAY 'CONTA NAO ENCONTRADA'
END-READ

O programa não precisa ler todas as contas anteriores. Ele vai direto à chave.

Mas há uma diferença importante entre VSAM e Db2:

Em VSAM, a aplicação normalmente precisa proteger as regras de negócio.
Em Db2, muitas regras podem ser declaradas e impostas pelo banco.

Se você apagar um cliente em VSAM e esquecer de apagar seus contratos, o VSAM não dará um discurso moral. Ele obedecerá. Com grande velocidade, eficiência e absoluta ausência de julgamento.

Por isso, programas VSAM exigem disciplina:

  • validar status;

  • controlar atualização concorrente;

  • tratar FILE STATUS;

  • desenhar cuidadosamente as chaves;

  • definir recuperação;

  • garantir consistência entre arquivos relacionados.

O VSAM é um canivete suíço. Nas mãos certas, resolve muito. Nas mãos erradas, também corta.


4. IMS — a árvore que não pede permissão para ser rápida

O IMS é um gerenciador de banco de dados hierárquico e também possui um poderoso gerenciador de transações, o IMS TM.

Sua estrutura é uma árvore:

CLIENTE
 ├── CONTA
 │    ├── MOVIMENTO
 │    └── LIMITE
 └── SEGURO
      └── COBERTURA

Em vez de tabelas relacionadas por colunas, existem segmentos pai e filho.

Para chegar a um movimento, o programa costuma percorrer o caminho esperado: cliente → conta → movimento. Isso parece rígido perto de SQL — porque é. Mas essa rigidez traz previsibilidade e altíssimo desempenho para transações repetitivas.

As operações DL/I clássicas têm nomes que parecem siglas de um pronto-socorro:

Chamada DL/ISignificado
GUBusca um segmento específico
GNBusca o próximo segmento
GNPBusca o próximo filho do pai atual
ISRTInsere
REPLAtualiza
DLETRemove

O IMS é excelente quando se conhece o caminho da transação e se precisa executar esse caminho milhões de vezes com resposta previsível.

É por isso que ele segue forte em bancos, seguros, reservas, telecomunicações e sistemas onde “talvez responda em alguns segundos” não é uma frase aceitável.

House olha o modelo hierárquico e comenta:

“Vocês chamam de legado. Eu chamo de sistema que já sobreviveu a três aquisições, duas crises e cinco arquitetos.”


5. Db2 — quando os dados precisam conversar entre si

O Db2 for z/OS é o modelo relacional em sua forma corporativa: tabelas, SQL, índices, integridade, bloqueios, logs, recuperação, COMMIT, ROLLBACK e processamento massivo.

Ele é ideal quando os dados possuem muitos relacionamentos:

CLIENTE → CONTA → MOVIMENTO
    │
    ├── CARTAO
    ├── EMPRESTIMO
    └── ENDERECO

No Db2, você pode escrever uma pergunta que ninguém imaginou quando o sistema foi criado:

SELECT C.NOME, COUNT(*)
  FROM CLIENTE C
  JOIN CONTA A
    ON A.ID_CLIENTE = C.ID_CLIENTE
  JOIN MOVIMENTO M
    ON M.ID_CONTA = A.ID_CONTA
 WHERE M.DATA_MOVIMENTO >= CURRENT DATE - 90 DAYS
 GROUP BY C.NOME

Essa é a força do banco relacional: ele permite explorar relações sem exigir que o caminho inteiro esteja congelado no código.

Db2 também trabalha com propriedades ACID:

LetraSignificado
AAtomicidade: tudo acontece ou nada acontece
CConsistência: regras permanecem válidas
IIsolamento: transações concorrentes não se atropelam
DDurabilidade: após o COMMIT, o dado sobrevive

Em termos físicos, o Db2 usa estruturas do z/OS e, tradicionalmente, datasets VSAM LDS para seus objetos de armazenamento. Mas isso não significa que o programador deva abrir um table space Db2 com READ NEXT.

Você conversa com Db2 por SQL. Ele cuida do porão.

Abrir a estrutura interna do Db2 como se fosse arquivo comum seria equivalente a um médico abrir o tórax do paciente para conferir se o marca-passo está funcionando porque “parecia mais rápido”.

Não faça isso. House não aprovaria.


6. VSAMDB e EzNoSQL — o VSAM aprendeu JSON, mas não virou MongoDB

Agora chegamos ao paciente mais novo da ala: VSAMDB.

VSAMDB é uma capacidade do DFSMS/VSAM que permite armazenar documentos JSON ou BSON em um dataset especial. O EzNoSQL for z/OS fornece APIs de mais alto nível para acessar esses documentos.

A ideia é tentadora:

{
  "_id": "CLI-00018472",
  "nome": "Ana Silva",
  "telefones": [
    {
      "tipo": "celular",
      "numero": "+55-11-99999-0000"
    }
  ],
  "preferencias": {
    "idioma": "pt-BR",
    "canal": "email"
  }
}

Em vez de criar várias tabelas ou um copybook com dezenas de ocorrências, você armazena o documento como um todo.

Isso é útil quando:

  • os atributos variam muito;

  • há estruturas aninhadas;

  • os dados serão usados por COBOL, Java, Python ou C;

  • a aplicação precisa de acesso rápido por chave;

  • há baixo interesse em JOINs complexos;

  • o dado é mais parecido com configuração, metadado ou estado operacional do que com contabilidade.

O VSAMDB oferece chave primária e índices alternativos. A IBM o posiciona como banco JSON chave-valor, com compartilhamento no Sysplex, consistência transacional e APIs para várias linguagens. O suporte direto do Enterprise COBOL 6.5 para ler, gravar, atualizar e excluir documentos JSON em VSAMDB tornou-se disponível em 2025.

Mas atenção: JSON não é magia de modernização.

Transformar isto:

01  REG-CLIENTE.
    05 CLI-CPF             PIC 9(11).
    05 CLI-NOME            PIC X(40).
    05 CLI-LIMITE          PIC S9(9)V99 COMP-3.
    05 CLI-STATUS          PIC X.

nisto:

{
  "cpf": "12345678901",
  "nome": "ANA SILVA",
  "limite": 5000.00,
  "status": "A"
}

não resolve automaticamente:

  • quem é o dono do dado;

  • quais campos são obrigatórios;

  • quais regras impedem uma atualização inválida;

  • como manter compatibilidade com os programas antigos;

  • como relacionar cliente, conta, contrato e movimento;

  • como produzir relatórios corporativos;

  • como recuperar o ambiente após uma falha;

  • como evitar que cinco equipes inventem cinco significados para status.

NoSQL significa “não somente SQL”, não “sem regras, sem responsabilidade e sem consequências”.

House escreve no quadro:

JSON ≠ Arquitetura
API REST ≠ Modernização
Cloud ≠ Diagnóstico

E, pela primeira vez no dia, ninguém discorda.


7. Por que quase ninguém vê VSAMDB em projetos reais?

A observação de que “nunca vi projeto usando” é bastante razoável.

Primeiro, porque o recurso é relativamente novo para o ciclo de vida de sistemas z/OS. Muitas aplicações corporativas já escolheram sua estratégia de dados há anos: VSAM, IMS, Db2, MQ, CICS, replicação, Data Virtualization, APIs ou combinação de tudo isso.

Segundo, porque VSAMDB exige preparo operacional. Ele se apoia em VSAM RLS, que envolve ambiente Sysplex, Coupling Facility, SMSVSAM, classes SMS e planejamento de consistência e recuperação. Não é uma simples biblioteca que o desenvolvedor instala numa sexta-feira após o almoço.

Terceiro, porque grande parte das APIs modernas não precisa armazenar JSON internamente.

Uma API pode receber JSON, convertê-lo para um copybook, chamar um programa COBOL/CICS, consultar Db2 ou VSAM e devolver JSON ao consumidor.

Aplicação web
    ↓ JSON
API
    ↓ Copybook / SQL / chamada CICS
Sistema de registro em Db2, IMS ou VSAM
    ↓
Resposta JSON

O JSON, nesse caso, é o envelope de integração. O sistema de registro continua no formato que melhor protege o negócio.

O diagnóstico diferencial de House

SintomaMelhor suspeito
Preciso de tabelas, relacionamentos e SQLDb2
Preciso de transações previsíveis em volume extremoIMS
Preciso de registro rápido por chaveVSAM KSDS
Preciso processar tudo em ordemQSAM
Preciso de documentos flexíveis por chave, compartilhados entre linguagensVSAMDB / EzNoSQL
Preciso expor legado por RESTz/OS Connect, CICS ou camada de API
Preciso “modernizar porque o diretor viu uma palestra”Solicitar exames adicionais

8. Passo a passo: como escolher sem cometer um ABEND arquitetural

Passo 1 — Faça a pergunta certa

Não comece perguntando “qual tecnologia é moderna?”.

Pergunte:

  • O acesso é sequencial ou por chave?

  • Existem muitas relações entre entidades?

  • O formato muda com frequência?

  • A transação precisa responder em milissegundos?

  • O dado exige integridade rígida?

  • O processamento é batch, online ou ambos?

  • Quem consumirá o dado: COBOL, Java, Python, analistas, API externa?

Passo 2 — Descubra o formato natural do dado

Um registro de folha mensal costuma ser previsível. QSAM pode ser perfeito.

Uma conta por número é naturalmente um KSDS.

Uma cadeia cliente → conta → movimento pode funcionar muito bem em IMS.

Um universo de relacionamento entre clientes, produtos, contratos, indicadores e consultas pode pedir Db2.

Uma estrutura de preferências, metadados ou configuração que muda bastante pode ser candidata a JSON/VSAMDB.

Passo 3 — Não trate storage como decisão isolada

Dados nunca vivem sozinhos. Eles possuem:

  • dono;

  • regras;

  • retenção;

  • auditoria;

  • segurança RACF;

  • backup;

  • recuperação;

  • performance;

  • integração;

  • custo operacional.

A pergunta não é apenas “onde gravar?”. É “como este dado continuará correto às três da manhã, durante uma falha, com duas transações concorrentes e um auditor pedindo evidência?”.

Passo 4 — Teste a recuperação antes de declarar vitória

Todo projeto parece moderno até a primeira falha.

Teste:

  • queda durante atualização;

  • processamento duplicado;

  • concorrência;

  • COMMIT e ROLLBACK;

  • backup;

  • restore;

  • reprocessamento batch;

  • índice corrompido;

  • mensagem repetida;

  • dado JSON com atributo inesperado.

Se o projeto só funciona em apresentação, ele não é arquitetura. É trailer.

Passo 5 — Escolha a ferramenta pelo problema, não pelo marketing

Um sistema pode usar QSAM, VSAM, Db2, IMS, MQ e JSON ao mesmo tempo. Isso não é bagunça por definição. Pode ser uma arquitetura madura, em que cada componente faz aquilo que sabe fazer.

O erro é colocar tudo numa única tecnologia por dogma.


Epílogo — O velho não é o doente

Cartões perfurados ensinaram que dados precisam de layout. Fitas ensinaram que sequência importa. QSAM ensinou a esconder a complexidade do I/O. VSAM ensinou acesso direto por chave. IMS ensinou que hierarquia pode ser rápida. Db2 ensinou que relações e regras podem ser declaradas. VSAMDB ensina que documentos JSON também podem morar no z/OS.

Nenhuma dessas tecnologias é “a resposta universal”.

O programador COBOL iniciante não precisa decorar todas de uma vez. Precisa aprender a olhar para o problema e perguntar:

“Que tipo de dado é este?
Como ele será acessado?
Que regra não pode ser violada?
E quem vai me ligar quando der errado?”

House fecha o prontuário, olha para o FILE STATUS, para o SQLCODE, para o PCB STATUS e para o JSON recém-chegado.

“O paciente não está velho.
Ele só tem dependências, dados críticos, regras de negócio e vinte milhões de usuários.
Diferente de vocês, ele merece um diagnóstico.”

E no fundo do CPD, um programa COBOL compilado há décadas continua processando a realidade — registro por registro, COMMIT por COMMIT, sem jamais ter pedido permissão para ser relevante.

Fontes para continuar a investigação



sábado, 9 de novembro de 2024

Gattaca na Alfândega: Teoria dos Jogos e o Dia em que Aprendemos a Mentir para o Algoritmo Antes de Mostrar o Passaporte

 


☕ Um Café no Bellacosa Mainframe

Gattaca na Alfândega: Teoria dos Jogos e o Dia em que Aprendemos a Mentir para o Algoritmo Antes de Mostrar o Passaporte

🛂 Quando o viajante deixa de preparar apenas documentos e começa a preparar também a própria pegada digital

Existe uma cena que provavelmente ainda não aconteceu exatamente como vou descrevê-la.

Mas o desconfortável é que ela já parece perfeitamente plausível.

Você chega ao controle de imigração.

Entrega o passaporte.

A agente olha para você, olha para a tela, olha novamente para você.

— Senhor Bellacosa, qual o motivo da viagem?

— Turismo.

— Quanto tempo pretende permanecer nos Estados Unidos?

— Duas semanas.

Alguns segundos de silêncio.

Depois vem a pergunta que transforma uma viagem internacional em episódio de Black Mirror escrito por Franz Kafka:

— Poderia desbloquear seu telefone?

Pronto.

Nesse instante, tudo aquilo que parecia inocente dentro da intimidade caótica de um smartphone começa a adquirir uma nova interpretação.

Instagram.

YouTube.

Histórico de buscas.

Redes sociais.

Perfis seguidos.

Vídeos assistidos.

Talvez você seja apaixonado por teoria dos jogos.

Talvez tenha assistido a vários vídeos sobre imigração.

Talvez tenha pesquisado histórias de pessoas barradas na fronteira.

Talvez tenha lido artigos sobre engenharia social.

Talvez trabalhe com segurança cibernética.

Talvez tenha estudado Red Team.

Talvez seu algoritmo tenha decidido que você gosta de japonesas dançando.

A agente levanta uma sobrancelha.

Você pensa imediatamente na frase mais perigosa que poderia pronunciar naquele momento:

— É o algoritmo.

Ela responde:

— Aham.

E nasce o verdadeiro problema.

Porque talvez, no futuro, não seja mais suficiente preparar documentos para atravessar uma fronteira.

Talvez algumas pessoas tentem preparar também a interpretação algorítmica de quem elas são.

E nesse momento chegamos a Gattaca.

Só que sem exame de sangue.



🧬 Em Gattaca você preparava o DNA

No filme Gattaca, a sociedade organiza oportunidades a partir daquilo que acredita poder inferir biologicamente sobre cada indivíduo.

Genes viram destino.

O cidadão não precisa necessariamente cometer alguma coisa.

Basta possuir características associadas estatisticamente a determinado futuro.

O protagonista então aprende a manipular os sinais observados pelo sistema.

Sangue.

Urina.

Cabelos.

Pele.

Impressões biológicas.

Ele não altera seu DNA.

Ele altera aquilo que o sistema consegue observar sobre seu DNA.

Essa distinção é extraordinariamente importante.

Porque sistemas modernos de classificação digital funcionam de maneira conceitualmente semelhante.

Eles raramente conhecem você.

Eles conhecem sinais sobre você.

Likes.

Buscas.

Tempo de permanência.

Localização.

Compras.

Contatos.

Dispositivos.

Histórico.

Relacionamentos.

Padrões.

A máquina não observa diretamente sua intenção.

Ela tenta inferi-la.

E toda vez que existe inferência, existe possibilidade de jogo.


🎲 Então entra a teoria dos jogos

Imagine três participantes.

O primeiro é o Estado.

Ele quer identificar viajantes legítimos, reduzir riscos, detectar fraude, encontrar inconsistências e impedir determinadas entradas.

O segundo é o viajante.

Ele quer atravessar a fronteira.

O terceiro é o sistema de informação, cada vez mais composto por bancos de dados, mecanismos de busca, redes sociais, ferramentas analíticas e eventualmente modelos de inteligência artificial.

Enquanto o viajante desconhece completamente os critérios utilizados pelo Estado, existe forte assimetria de informação.

Mas basta parte dos critérios tornar-se conhecida para o comportamento mudar.

Suponha, apenas como experimento mental, que alguém acredite que determinados interesses digitais produzam uma impressão favorável.

Turismo.

Hotéis.

Parques nacionais.

Las Vegas.

Nova York.

Harley-Davidson.

Ford.

Grand Canyon.

Quatro de Julho.

Beisebol.

A partir daí surge uma ideia inevitável:

“E se eu modificar deliberadamente minha atividade digital antes da viagem?”

Não importa aqui se isso realmente produziria qualquer vantagem.

O ponto interessante é outro.

A simples crença de que produziria vantagem já seria suficiente para alterar o comportamento.

E quando as pessoas passam a modificar seu comportamento porque sabem que estão sendo observadas, o jogo muda completamente.


🇺🇸 God Bless the Recommendation Engine

Imagine o cidadão preparando sua viagem.

Sete dias antes:

segunda-feira:

“10 melhores lugares para conhecer na Flórida.”

terça-feira:

“História da Harley-Davidson.”

quarta-feira:

“Por que o Grand Canyon é incrível.”

quinta-feira:

“Melhores churrascarias do Texas.”

sexta-feira:

vídeos do Quatro de Julho.

sábado:

Ford Mustang clássico.

domingo:

National Parks of America.

Segunda-feira chega a entrevista.

O sistema hipotético abre o perfil.

Resultado:

PATRIOTISMO ESTATISTICAMENTE ANÔMALO: 97,4%.

🦅🇺🇸

O candidato sorri.

O agente também.

Então alguém percebe um pequeno detalhe:

esse intenso amor pela cultura norte-americana começou exatamente sete dias antes da entrevista.

Ops.


📉 Goodhart estava escondido na imigração

Existe uma frase atribuída à chamada Lei de Goodhart:

quando uma medida se transforma em alvo, ela deixa de ser uma boa medida.

Se determinado comportamento passa a ser interpretado como indicador de legitimidade, algumas pessoas começam a produzir deliberadamente aquele comportamento.

Então o indicador perde valor.

Esse fenômeno aparece em praticamente qualquer sistema baseado em métricas.

Escolas.

Empresas.

Hospitais.

Bancos.

Seguros.

Plataformas digitais.

Fraude.

Segurança.

E inevitavelmente poderia aparecer em sistemas de avaliação migratória.

O ciclo seria quase previsível.

Primeiro:

o sistema descobre padrões.

Depois:

as pessoas descobrem que o sistema descobriu padrões.

Depois:

as pessoas começam a imitar os padrões desejados.

Depois:

o sistema começa a procurar imitação dos padrões.

Depois:

as pessoas aprendem a imitar sem parecer que estão imitando.

Parabéns.

Acabamos de inventar uma corrida armamentista epistemológica.


🕵️ Primeiro ensinamos como parecer normal

No começo surgiriam vídeos.

“Cinco coisas que você deve fazer antes da entrevista.”

Depois canais especializados.

Depois cursos.

Depois consultorias.

Depois extensões de navegador.

Depois aplicativos.

Finalmente alguém fundaria uma startup.

BorderReady AI

Slogan:

“Otimize sua presença digital antes de viajar.”

Plano gratuito:

Digital Reputation Score: 64/100

Plano Premium:

Improve your Border Confidence™

O aplicativo analisaria:

  • redes sociais;

  • histórico público;

  • resultados de busca;

  • consistência de perfis;

  • conteúdo controverso;

  • sinais comportamentais;

  • exposição pública.

E então sugeriria:

“Seu perfil demonstra pouco interesse turístico.”

“Seu conteúdo técnico possui frequência anormal.”

“Recomendamos diversificação temática.”

Neste ponto alguém inevitavelmente criaria:

Border Optimization Masterclass

Módulo 1: Conheça seu adversário.

Módulo 2: Controle seus sinais.

Módulo 3: Calibre suas redes.

Módulo 4: Evite mudanças abruptas.

Módulo 5: Pareça espontâneo.

E no momento em que surge o módulo chamado “Pareça espontâneo”, sabemos que alguma coisa deu profundamente errado.


🤖 Então o algoritmo aprende que estamos tentando enganá-lo

Segunda geração do sistema.

Agora não basta observar aquilo que você consome.

Ele observa como seu consumo mudou.

O cidadão passou seis meses assistindo:

anime;

programação;

gatos;

culinária antiga;

games.

Subitamente:

🇺🇸 🇺🇸 🇺🇸 🇺🇸 🇺🇸

Harley-Davidson.

Grand Canyon.

Baseball.

Mount Rushmore.

Florida.

Las Vegas.

Quatro de Julho.

O sistema não precisa concluir:

“Este homem ama os Estados Unidos.”

Pode concluir:

“Este homem talvez queira que alguém conclua que ele ama os Estados Unidos.”

Essa pequena mudança é devastadora.

Porque agora o classificador não tenta apenas interpretar comportamento.

Ele tenta interpretar a intenção por trás da fabricação do comportamento.


🪞 E então começamos a representar uma pessoa para quem está olhando

Aqui entra um conceito muito antigo.

Nós sempre adaptamos comportamento ao observador.

Numa entrevista de emprego vestimos determinada roupa.

Num tribunal utilizamos determinada linguagem.

Num banco apresentamos documentos específicos.

Num encontro mostramos determinados aspectos da personalidade.

Isso não é necessariamente fraude.

É representação social.

O problema começa quando sistemas digitais tentam transformar essa representação em verdade objetiva.

Porque redes sociais nunca foram registros neutros da personalidade.

Meu Instagram pode passar uma semana cheio de gatos simplesmente porque parei alguns segundos diante de três gatos.

Depois games.

Depois anime.

Depois programação.

Depois culinária.

Depois, por alguma aberração estatística:

um obituário infinito.

Quem observar apenas meu feed pode acreditar estar fazendo arqueologia psicológica.

Na verdade está vendo:

eu + algoritmo + curiosidade + acaso + retenção + testes A/B + contexto ausente.

É uma fotografia extremamente ruim da alma humana.


👩‍💻 Conheça Beatriz Algoritma

Vamos dar um nome à nossa guia.

Beatriz Algoritma.

Beatriz é prestativa.

Educada.

Incansável.

E sabe que você gosta de gatos.

— Senhor Bellacosa, observei que permaneceu 12 segundos neste vídeo.

— Era um gato engraçado.

— Entendido.

Cinco minutos depois:

GATOS.

Mais gatos.

Gatos japoneses.

Gatos cozinhando.

Gatos dormindo.

Gatos programadores.

Você finalmente procura COBOL.

Beatriz reage:

— Excelente.

Agora aparecem mainframes.

Depois anime.

Depois receitas romanas.

Depois vídeos japoneses.

Um dia seu filho abre seu Instagram exatamente durante uma dessas temporadas.

Olha para você.

Olha para o celular.

Olha novamente para você.

— Pai... o que é isso?

Você pensa na resposta racional:

“Filho, sistemas de recomendação inferem preferências a partir de sinais comportamentais implícitos.”

Mas percebe que isso só pioraria tudo.

Então ri.

Beatriz registra:

ENGAGEMENT POSITIVO.

E entrega mais quinze vídeos iguais.


🛂 Agora coloque Beatriz diante de um agente

Voltamos à fronteira.

A agente observa seu telefone.

Ela não está necessariamente vendo você.

Está vendo o retrato que Beatriz produziu de você.

Talvez aquilo provoque nenhuma consequência.

Talvez provoque perguntas.

Talvez apenas uma sobrancelha levantada.

O problema conceitual permanece.

Quanto mais decisões forem tomadas a partir de perfis digitais, maior será o incentivo para que pessoas aprendam a manipular os sinais desses perfis.

E quanto maior a percepção de que os sinais são manipulados, maior será o incentivo institucional para buscar sinais mais profundos.

Então começamos a cavar.

Não basta saber o que alguém segue.

Queremos saber quando começou a seguir.

Não basta saber o que pesquisou.

Queremos saber quanto tempo permaneceu.

Não basta saber o comportamento.

Queremos saber se o comportamento mudou antes de um evento importante.

Não basta saber a mudança.

Queremos saber se a mudança parece estratégica.

Nesse momento, a atividade inocente também começa a adquirir aparência de estratégia.


🏍️ O paradoxo da Harley-Davidson

Imagine agora alguém que genuinamente começa a gostar de motocicletas americanas uma semana antes de viajar.

Talvez tenha assistido a um documentário.

Talvez um amigo tenha mostrado uma Harley.

Talvez simplesmente tenha descoberto algo novo.

Ele passa vários dias pesquisando motocicletas.

Sistema:

“Alteração temática significativa imediatamente antes da viagem.”

Homem:

— Mas eu realmente gosto de Harley-Davidson!

Sistema:

“Declaração consistente com tentativa de parecer alguém que realmente gosta de Harley-Davidson.”

Pronto.

Entramos numa estrutura quase kafkiana.

Se você não produz os sinais esperados, pode parecer estranho.

Se produz sinais demais, pode parecer estratégico.

Se explica a mudança, a explicação pode ser interpretada como preparação.

Essa é uma das grandes fragilidades de sistemas que tentam inferir intenção humana a partir de comportamento observado.


📸 A burocracia antiga trabalhava com fotografias

Durante grande parte do século XX, a burocracia funcionava como uma coleção de fotografias administrativas.

Você entregava:

uma declaração;

um comprovante;

um formulário;

uma certidão;

um extrato.

Cada instituição observava um retrato específico.

A Receita tinha um.

O banco tinha outro.

O consulado tinha outro.

O empregador tinha outro.

O cartório tinha outro.

Esses sistemas frequentemente conversavam pouco.

Por isso existiam situações quase cômicas nas quais uma pessoa possuía versões diferentes de sua realidade econômica dependendo do observador.

Diante de determinada instituição:

“Tenho pouco patrimônio.”

Diante de outra:

“Observe como sou financeiramente estável.”

O gato patrimonial aparecia e desaparecia dependendo da caixa burocrática aberta.

Schrödinger ficaria orgulhoso.


🎞️ O sistema moderno prefere filmes

A digitalização muda isso.

Em vez de observar apenas uma fotografia, podemos observar uma série temporal.

De repente surge uma pergunta poderosa:

“A história que você está contando hoje é consistente com a história que seus dados contam ao longo do tempo?”

Isso muda profundamente o jogo.

Não estamos mais verificando somente documentos.

Estamos verificando consistência.

E consistência é muito mais difícil de fabricar retroativamente.

É exatamente aqui que Gattaca reaparece.

O protagonista não precisava apenas produzir uma amostra perfeita.

Precisava manter uma identidade coerente continuamente.

Cada cabelo.

Cada gota.

Cada exame.

Cada interação.

Um erro poderia revelar a diferença entre pessoa e representação.

Na versão digital:

cada postagem;

cada busca;

cada registro;

cada transação;

cada login;

cada alteração.


🔐 O problema para o Red Team

Quem trabalha com segurança inevitavelmente olha para um sistema desses e pergunta:

“Como alguém tentaria enganá-lo?”

Essa pergunta não significa necessariamente desejar enganá-lo.

É exatamente aquilo que um Red Team deveria perguntar.

Se um sistema utiliza comportamento digital para inferir risco:

quais sinais são fáceis de falsificar?

quais são caros?

quais são independentes?

quais são correlacionados?

quais podem ser produzidos artificialmente?

quais podem gerar falsos positivos?

quais grupos são injustamente associados a determinados padrões?

quanto contexto é perdido?

como alguém inocente contestaria uma conclusão incorreta?

E talvez a pergunta mais importante:

o sistema consegue distinguir uma pessoa perigosa tentando parecer inocente de uma pessoa inocente que simplesmente possui comportamento incomum?

Essa é uma diferença gigantesca.


⚠️ O algoritmo não precisa estar certo para mudar nosso comportamento

Aqui está talvez a parte mais inquietante.

O sistema nem precisa realmente existir.

Basta acreditarmos que existe.

Se pessoas acreditam que autoridades observam determinados sinais, elas podem começar a ajustar comportamento preventivamente.

Isso produz autocensura.

Produz limpeza de perfis.

Produz performance.

Produz ansiedade.

Produz pessoas tentando imaginar aquilo que uma máquina imaginaria sobre elas.

É uma versão moderna do panóptico.

Jeremy Bentham imaginou uma prisão na qual o preso nunca sabe exatamente quando está sendo observado.

O poder surge da possibilidade constante de observação.

No panóptico algorítmico existe uma sofisticação adicional:

não sabemos apenas se estamos sendo observados.

Não sabemos como estamos sendo interpretados.


🧠 Tentando pensar como a máquina que pensa sobre você

E nasce uma atividade profundamente contemporânea:

metainferência.

Você tenta inferir aquilo que o sistema inferirá sobre aquilo que você fez.

Eu pesquisei isto.

O algoritmo viu aquilo.

Ele provavelmente classificou assim.

Se eu fizer isso agora, talvez altere aquela interpretação.

Esse é quase um jogo de pôquer contra um adversário invisível.

Você não conhece as cartas.

Não conhece completamente as regras.

Não conhece os pesos.

Talvez nem saiba se existe realmente um jogo.

Ainda assim começa a jogar.


🎭 A identidade vira superfície de ataque

Em segurança falamos continuamente de superfície de ataque.

Portas.

Serviços.

Credenciais.

APIs.

Dispositivos.

Usuários.

Mas uma sociedade baseada em classificação algorítmica cria uma nova superfície:

a identidade percebida.

Se a decisão depende da percepção, alguém tentará atacar a percepção.

Isso acontece em crédito.

Fraude.

Recrutamento.

Redes sociais.

Segurança.

Reputação.

Mercados.

E eventualmente pode aparecer em qualquer ambiente no qual comportamento humano seja transformado em score.

A pergunta deixa de ser:

“Quem é você?”

E passa a ser:

“Como alguém que é você deveria parecer nos dados?”

Depois:

“Como alguém tentando fingir que é você pareceria?”

Depois:

“Como alguém tentando fingir que não está fingindo pareceria?”

Neste ponto talvez devêssemos desligar o computador e tomar café.


☕ O programador COBOL observa a fronteira

O velho programador olha para tudo isso e sente uma estranha nostalgia.

No mainframe havia uma vantagem filosófica.

O registro dizia:

USERID X executou transação Y às 14:32:11.

Era auditável.

Concreto.

Tinha log.

Podíamos discutir autorização.

Podíamos discutir autenticação.

Podíamos discutir privilégios.

Agora estamos construindo sistemas capazes de dizer:

“USERID X apresenta padrões comportamentais similares a pessoas classificadas como categoria Y.”

Isso é outra espécie de conhecimento.

Probabilístico.

Inferencial.

Contextual.

E perigosamente sedutor.

Porque um número com duas casas decimais parece extraordinariamente objetivo.

Risk Score: 87,42%.

Quase ninguém pergunta:

87,42% de quê?

Com base em quais dados?

Comparado com quem?

Qual é a taxa de falso positivo?

Como contestamos isso?


🧬 Gattaca nunca foi apenas sobre genética

Talvez essa seja a razão pela qual Gattaca continua tão atual.

O DNA era apenas a tecnologia escolhida pela história.

O verdadeiro tema era outro:

o perigo de transformar sinais probabilísticos sobre uma pessoa em destino administrativo.

Troque DNA por:

histórico digital;

biometria;

rede social;

score comportamental;

modelo preditivo;

inteligência artificial.

A história continua funcionando perfeitamente.

E acrescentamos agora uma camada que o filme apenas insinuava:

quando indivíduos descobrem como são avaliados, começam a adaptar comportamento para sobreviver à avaliação.


🛂 Senhor Bellacosa, uma última pergunta

Voltamos finalmente à agente da fronteira.

Ela olha novamente para a tela.

— Senhor Bellacosa, vejo aqui que na semana anterior à viagem o senhor pesquisou parques nacionais, Harley-Davidson, história americana e turismo em Nova York.

Você sorri.

— Gosto muito dos Estados Unidos.

Ela faz outra pergunta:

— E nas três semanas anteriores?

Silêncio.

Beatriz Algoritma aparece metaforicamente atrás dela.

🐈 gatos.

🎌 anime.

💻 COBOL.

🍲 culinária medieval.

🎮 games.

A agente olha.

Você olha.

Beatriz olha.

Finalmente você responde:

— É complicado.

Ela carimba o passaporte.

Ou talvez não.

Porque no mundo de Gattaca, a verdadeira fronteira nunca esteve no aeroporto.

Estava na diferença entre quem somos e aquilo que os sistemas acreditam que somos.

E talvez a próxima grande disciplina de segurança não seja apenas proteger nossos dados.

Será compreender o que acontece quando nossos dados começam a contar histórias sobre nós para máquinas capazes de tomar decisões.

Porque, quando isso acontecer em escala, certamente haverá quem tente melhorar a história.

Depois haverá quem tente detectar quem melhorou a história.

Depois haverá quem tente parecer alguém que nunca tentou melhorar história alguma.

E em algum datacenter distante, Beatriz Algoritma observará tudo silenciosamente.

Calculando.

Classificando.

Recomendando.

Até que finalmente apareça aquela mensagem:

“Pessoas com um perfil semelhante ao seu também gostaram de: COMO PASSAR PELA ALFÂNDEGA SEM PARECER QUE VOCÊ PESQUISOU COMO PASSAR PELA ALFÂNDEGA.”

Nesse momento, definitivamente teremos chegado a Gattaca.

Só que com anúncios.

JSON em COBOL no IBM Z: O Holocron das APIs Modernas – JSON Jedi Master - Parte IV

 

Bellacosa Mainframe e o json no cobol parte iv

JSON em COBOL no IBM Z: O Holocron das APIs Modernas

Parte 4 – JSON Jedi Master

z/OS Connect, MQ, Kafka, OpenShift, APIs de Alto Desempenho, Segurança OWASP e as Técnicas Jedi do IBM Z

Por Bellacosa Mainframe


"O Padawan aprende JSON PARSE. O Cavaleiro domina JSON GENERATE. O Mestre compreende que JSON é apenas a linguagem utilizada para conectar mundos inteiros."

Mestre Bellacosa Sysprog Jedi


Introdução

Chegamos ao último holocron.

Na Parte 1 aprendemos:

  • JSON

  • JSON GENERATE

  • UTF8

  • APIs

Na Parte 2:

  • JSON PARSE

  • Arrays

  • OCCURS

  • Segurança

Na Parte 3:

  • JSON GENERATE avançado

  • SUPPRESS

  • NAME OF

  • APIs REST

Agora chegamos ao nível do Mestre.

O momento em que COBOL deixa de apenas processar JSON.

E passa a ser um participante ativo de arquiteturas modernas.


O grande segredo

Muitos ainda imaginam.

COBOL

↓

Batch

↓

Relatório

↓

Fim.

Mas o IBM Z moderno é muito diferente.

Hoje podemos encontrar:

COBOL

↓

JSON

↓

API

↓

Mobile

↓

Cloud

↓

Kafka

↓

OpenShift

↓

IA

↓

Aplicações Web


O papel do JSON

JSON tornou-se.

O idioma universal.


Imagine.

Banco.

Aplicativo.

PIX.

Open Finance.

Cartão.

Seguro.

Marketplace.

IoT.


Praticamente todos utilizam.

JSON.


z/OS Connect

Talvez seja a tecnologia mais importante.

Para o COBOL moderno.


O que é?

Uma ponte.

Entre.

IBM Z.

E.

REST APIs.


Visualmente.

Smartphone

↓

REST

↓

z/OS Connect

↓

COBOL

↓

DB2

Exemplo

Usuário.

Consulta saldo.

Aplicativo.

↓

HTTPS

↓

z/OS Connect

↓

JSON

↓

COBOL

↓

DB2

↓

JSON

↓

Aplicativo


Tudo transparente.


COBOL não vê HTTP

Na maioria dos casos.

Não.


Ele apenas recebe.

Estrutura.

COBOL.

Já preenchida.


Exemplo.

01 WS-CONTA.


05 AGENCIA.


05 CONTA.



JSON PARSE.

Feito.

Automaticamente.


MQ

Outro caso.

Muito comum.


Mensagem.

Chega.

MQ.


Payload.

JSON.


COBOL.

Processa.


Exemplo.

{

"tipo":"pix",

"valor":100

}

COBOL.

Recebe.


Executa.

Negócio.


Responde.


JSON GENERATE.


MQPUT.


Fim.


Kafka

Sim.

Também.


Arquitetura.

COBOL

↓

MQ

↓

Kafka Bridge

↓

Kafka

↓

Analytics

Muito utilizado.


Open Finance.


Fraudes.


IA.


Big Data.


OpenShift

Outro mundo.

Interessante.


Microsserviços.

Containers.

Kubernetes.


COBOL.

Participa.


Arquitetura.

OpenShift

↓

REST

↓

zOS Connect

↓

COBOL

↓

IMS

DB2

Muito elegante.


APIs síncronas

Cliente.

Espera.

Resposta.


Exemplo.

Saldo.


API.

Responde.

200 ms.


APIs assíncronas

MQ.

Kafka.

Evento.


Mais modernas.


GraphQL

Também possível.


Embora.

Menos comum.


Segurança

Aqui começa.

O lado sombrio.


OWASP.

Existe.

Também.

Para APIs.


OWASP API Top 10

Excelente leitura.


Problemas.

Mais comuns.


Excesso.

Dados.


Exposição.

Sensível.


Autorização.

Fraca.


Payload.

Gigante.


DoS.


Exemplo ruim

COBOL.

01 CLIENTE.


05 CPF.


05 SENHA.


05 TOKEN.

JSON GENERATE.


API.


Exposta.


Desastre.


Melhor

Criar DTO.


Exemplo.

01 API-CLIENTE.


05 NOME.


05 LIMITE.

Muito melhor.


JWT

Muito utilizado.


JSON Web Token.


Aplicação.

Recebe.


Valida.


Autoriza.


COBOL.

Pode.

Consumir.


Ou.

Delegar.


TLS

Obrigatório.

Hoje.


HTTPS.

Sempre.


Nunca.

HTTP.


Rate Limit

Muito importante.


Evita.

DoS.


Exemplo.

Chamadas.

Por minuto.


Logs

Essenciais.


Exemplo.

2026-06-25


PIX


100 reais


OK

Muito útil.


Auditoria.


Performance

JSON.

Tem custo.


Parser.

CPU.


Serializer.

CPU.


Mas.

IBM Z.

É extremamente eficiente.


Benchmarks.

Mostram.

Milhares.

TPS.


Sem dificuldades.


JSON gigantesco

Cuidado.


Exemplo.

50 MB.


Parser.

Vai sofrer.


CPU.

Memória.


Melhor.

Paginar.


Streaming

Excelente opção.


Processar.

Em partes.


Mais eficiente.


Cache

Pode ajudar.


JSON.

Já montado.


Evita.

JSON GENERATE.

Toda vez.


Curiosidade

Muitos bancos.

Geram.

Milhões.

JSON.

Por hora.


E.

Grande parte.

Nasce.

Em COBOL.


Curiosidade 2

Usuário.

Abre.

App.


Consulta.

Saldo.


Recebe.

JSON.


Origem.

Programa COBOL.

Escrito.


Executando.

Num.

IBM z17.


Curiosidade 3

Muitos.

Open Banking.

Brasileiros.

Passam.

Por.

COBOL.

Sem.

Que.

Usuário.

Perceba.


Bellacosa Best Practices

Regra 1

Nunca.

Gerar.

JSON.

Com STRING.


Regra 2

JSON GENERATE.

Sempre.


Regra 3

JSON PARSE.

Sempre.


Regra 4

Versione.

APIs.


Exemplo.

v1

v2

v3


Regra 5

OpenAPI.

Swagger.

Documente.


Regra 6

Nunca.

Expor.

Campos internos.


Regra 7

Teste.

UTF8.


Regra 8

Monitore.

SMF.

RMF.

Logs.


Regra 9

Valide.

Payloads.


Regra 10

Use.

OWASP.

API Top 10.


Quando usar JSON?

Excelente.

REST.

Open Banking.

PIX.

Cloud.

Kafka.

MQ.

OpenShift.

Mobile.

Marketplace.

IoT.

Microsserviços.


Quando evitar?

Batch.

VSAM.

Arquivos internos.

Processamento.

Fechado.


O Conselho Final do Mestre Bellacosa

Durante muito tempo, disseram ao desenvolvedor COBOL que seu universo terminava em arquivos sequenciais, JCLs, relatórios impressos e terminais verdes.

JSON mostrou que isso nunca foi verdade.

JSON permitiu que programas escritos décadas atrás passassem a conversar com smartphones, aplicativos financeiros, plataformas Open Banking, clusters OpenShift, sistemas Kafka e serviços espalhados por diversas nuvens.

Talvez essa seja a maior beleza do IBM Z moderno.

Ele não obriga ninguém a abandonar o COBOL.

Ele apenas entrega novas ferramentas.

E diz:

Continue usando seus níveis 01, 05, 10 e OCCURS.

Continue confiando na robustez do Enterprise COBOL.

Continue processando milhões de transações por segundo.

Eu apenas ensinarei seu programa a falar o idioma utilizado pela galáxia digital.

E talvez essa seja a verdadeira lição do Holocron JSON.

JSON não substituiu COBOL.

JSON apenas permitiu que COBOL expandisse sua voz para além dos corredores do datacenter, alcançando praticamente qualquer sistema capaz de compreender uma simples mensagem cercada por chaves e aspas.


Fim do Holocron Bellacosa Mainframe

JSON em COBOL no IBM Z – Parte 1 a Parte 4 concluídas

"Que o JSON PARSE esteja com você. E que o JSON GENERATE nunca produza um campo SENHA por engano." 🚀💙🖥️


sexta-feira, 8 de novembro de 2024

📜 El Jefe Midnight Lunch – Diário de um Coelho Mainframeado 🐇💾

 

📜 El Jefe Midnight Lunch – Diário de um Coelho Mainframeado 🐇💾

Por Vagner Bellacosa – escrito com o cheiro de spool queimando e café passado na madrugada


Às vezes eu me sinto o coelho da Alice.

Sempre correndo, sempre atrasado, olhando para um relógio imaginário preso no pulso como um job com TIME=1440 e EXEC = contagem regressiva constante. A vida adulta é uma espécie de JCL infinito — steps em cadeia, dependencies em cascata, return codes imprevisíveis. Um STOP não existe, no máximo um WAIT.

E sabe o que mais me espanta?
Esse bug funcional da vida moderna onde rodamos múltiplos batchs simultâneos, mas sem aumento de CPU, memória ou I/O. Arruma a cama, sobe o job CAFÉ, unload na máquina de louça, LOAD ROUPAS, estende, recolhe, paga boletos... sempre com uma flag de débito acesa no console.



Não sou workaholic — longe disso, nem optimized compile eu faço por prazer. Mas o dia a dia virou um CICS transacional enlouquecido, um loop sem checkpoint, sem flush. O século XXI prometeu cloud, AI, carros voadores, hoverboard… e nos entregou só latência humana, notificações infinitas e a sensação de que o tempo é o dataset mais raro do planeta.

Antes, existia aquela cenoura dourada chamada aposentadoria.
Cinquenta anos, job finalizado com RC=0, vida mais tranquila, mesa de dominó na praça, um churrasco no sábado, tempo para existir.



Agora?
62 anos para submit, com uma redução de renda que parece dump hexadecimal ilegível. Vou ter que continuar processando em batch, quase na mesma carga, para manter o mínimo de qualidade de vida.

E me dizem:

"Guarde dinheiro para velhice."

Eu rio. Um REXX bem-resolvido dói menos.
Como guardar, se o custo de vida é um ABEND constante? Se tudo quebra, tudo vence, tudo sobe? E olha que eu não estou na base do salário mínimo — sou profissional gabaritado, especialista, com diploma e experiência.

Aí imagino quem vive com bem menos.
Se eu, com infraestrutura parruda, já sinto fragmentação no storage, imagino um usuário com 256K de RAM tentando rodar um SAP.

O século XXI vendeu uma utopia, um canto de sereia digital, e quando abrimos o dataset percebemos:
o contrato social veio corrompido.



E agora?
Com IA otimizando tudo, automatizando tudo, demitindo o que for scriptável...
pra onde vão os humanos?
Quem nos recompila?
Quem garante que não seremos apenas prints obsoletos de um sistema legado?

Talvez sejamos todos coelhos.
Correndo, correndo, correndo...



Só espero que no final do buraco exista algo mais do que só joblog.
Tomara que tenha Wonderland.

E café quente.

☕🐇💾
Bellacosa, desligando o terminal — mas só por um MERGE rápido, o próximo job já está em hold.


quinta-feira, 7 de novembro de 2024

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