Translate

Mostrar mensagens com a etiqueta Cache. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Cache. Mostrar todas as mensagens

sexta-feira, 28 de fevereiro de 2025

O Guia do Programador COBOL Padawan para Entender por que Inteligência Artificial em Produção é uma Frota Inteira — e não Apenas uma Nave

 

Bellacosa Mainframe e plataformas de ia escalaveis sem misterios

☕ Um Café no Bellacosa Mainframe

Plataformas de IA Escaláveis sem Mistérios

O Guia do Programador COBOL Padawan para Entender por que Inteligência Artificial em Produção é uma Frota Inteira — e não Apenas uma Nave

Imagine a seguinte cena.

Você está sentado diante de um terminal 3270, com uma caneca de café ao lado do teclado, observando um programa COBOL que processa milhões de registros todas as noites. De repente, um jovem programador chega correndo pela sala e anuncia:

— Bellacosa, encontrei o melhor modelo de inteligência artificial do mercado! Agora nossa plataforma está pronta!

Você olha calmamente para o monitor, toma mais um gole de café e responde:

— Padawan, encontrar um bom modelo de IA é como encontrar um excelente motor de dobra. Isso não significa que você já construiu a USS Enterprise.

O motor de dobra pode ser impressionante. Pode gerar textos, resumir documentos, escrever código, responder perguntas e analisar informações. Contudo, para atravessar a galáxia em segurança, uma nave precisa de muito mais:

  • computadores de bordo;

  • sensores;

  • escudos;

  • sistemas de comunicação;

  • controle de energia;

  • navegação;

  • diagnóstico;

  • redundância;

  • manutenção;

  • oficiais preparados;

  • protocolos de emergência.

Uma plataforma de inteligência artificial funciona exatamente assim.

O modelo é importante, mas ele representa apenas uma parte do sistema.

Em uma demonstração de laboratório, talvez seja suficiente enviar uma pergunta diretamente para um modelo e exibir a resposta. Em produção, entretanto, surgem usuários simultâneos, documentos internos, custos, privacidade, auditoria, segurança, latência, picos de utilização, falhas, limites de contexto, respostas incorretas e necessidade de monitoramento.

É nesse momento que muitos projetos descobrem uma verdade pouco glamorosa:

Uma aplicação de IA pode funcionar perfeitamente durante uma apresentação e desmoronar completamente quando encontra o primeiro dia real de produção.

Neste café, vamos explorar os principais componentes que transformam um modelo isolado em uma verdadeira plataforma de IA escalável. E, como toda boa missão da Frota Estelar, vamos fazer isso com mapas, analogias, exemplos, alertas, curiosidades e alguns easter eggs escondidos pelo caminho.

Prepare seu café, ajuste o comunicador e confirme se os escudos estão operacionais.

A missão começou.


1. O grande engano: acreditar que o modelo é o sistema

Nos primeiros contatos com inteligência artificial generativa, é comum imaginar uma arquitetura muito simples:

USUÁRIO
   |
   v
MODELO DE IA
   |
   v
RESPOSTA

Esse desenho funciona em testes pequenos.

Um usuário faz uma pergunta, o modelo responde e todos ficam impressionados.

Porém, uma plataforma corporativa de verdade precisa responder perguntas muito mais difíceis:

  • Quem é o usuário?

  • Ele possui autorização para acessar determinado documento?

  • Qual modelo deve atender essa solicitação?

  • O contexto enviado é realmente relevante?

  • A resposta deve ser armazenada em cache?

  • O conteúdo precisa ser filtrado?

  • Quanto custou a interação?

  • A informação utilizada estava atualizada?

  • O sistema consegue explicar de onde veio a resposta?

  • O que acontece quando chegam dez mil requisições ao mesmo tempo?

  • Como detectar uma regressão depois da troca de modelo?

  • Como impedir vazamento de dados confidenciais?

  • Como observar uma falha que acontece apenas em um caso entre cem mil?

O modelo não resolve sozinho nenhuma dessas questões.

Ele se parece mais com um programa COBOL dentro de uma arquitetura empresarial. O programa pode conter a lógica principal, mas depende de JCL, datasets, Db2, CICS, IMS, RACF, JES2, WLM, bibliotecas, logs, monitoramento e processos operacionais.

Nenhum profissional experiente de mainframe diria:

“O sistema bancário é apenas aquele módulo COBOL.”

Da mesma maneira, ninguém deveria dizer:

“Nossa plataforma de IA é apenas aquele LLM.”

Uma plataforma escalável é um conjunto coordenado de camadas.


2. Model Inference: quando o motor realmente entra em funcionamento

A inferência é o momento em que o modelo recebe uma entrada e produz uma saída.

Em termos simples:

PROMPT + CONTEXTO
        |
        v
      MODELO
        |
        v
     RESPOSTA

Essa é a camada de execução.

Para um programador COBOL, podemos comparar a inferência à execução de um programa depois da compilação e da linkedição. O load module está pronto, os parâmetros foram fornecidos e agora a lógica será processada.

Entretanto, a inferência possui um grande desafio: equilibrar latência, vazão e custo.

Latência

Latência é o tempo necessário para começar ou concluir uma resposta.

Em um chatbot, o usuário espera uma reação quase imediata.

Em uma rotina batch que analisa dois milhões de contratos durante a madrugada, alguns minutos extras podem ser aceitáveis.

Throughput

Throughput, ou vazão, representa quantas requisições o sistema consegue processar em determinado período.

Um modelo pode responder muito rápido para um único usuário e ainda assim apresentar péssimo desempenho quando recebe milhares de chamadas simultâneas.

É como um programa COBOL que executa bem com cem registros, mas enfrenta gargalos quando recebe um arquivo com quinhentos milhões.

O triângulo da engenharia de IA

Quase toda decisão de inferência envolve três fatores:

QUALIDADE
   /\
  /  \
 /    \
CUSTO----VELOCIDADE

Um modelo maior pode produzir respostas melhores, porém costuma exigir mais recursos.

Um modelo menor pode ser rápido e econômico, mas talvez não resolva tarefas complexas.

A missão da arquitetura não é escolher o “melhor modelo do mundo”. É escolher o modelo adequado para cada tipo de operação.

O Sr. Spock provavelmente diria:

“Utilizar um modelo gigantesco para responder perguntas triviais seria ilógico.”

E ele estaria absolutamente correto.


3. Tokenização: a linguagem secreta dos modelos

Um modelo de linguagem não lê exatamente palavras da mesma maneira que um ser humano.

Antes de processar o texto, ele o divide em unidades chamadas tokens.

Uma palavra pode corresponder a:

  • um token;

  • vários tokens;

  • parte de um token;

  • uma combinação diferente conforme o idioma e o modelo.

Por exemplo, a expressão:

MAINFRAME

pode ser interpretada como uma unidade ou dividida em partes semelhantes a:

MAIN
FRAME

Já termos muito específicos, nomes técnicos, códigos COBOL, caracteres especiais e palavras em português podem consumir uma quantidade maior de tokens.

Por que o programador precisa se importar?

Porque tokens influenciam diretamente:

  • custo;

  • limite de entrada;

  • tamanho da resposta;

  • desempenho;

  • capacidade de contexto;

  • quantidade de documentos processados.

Considere este prompt:

Explique COBOL.

Ele é pequeno.

Agora considere:

Leia estes 800 manuais, compare todas as versões do compilador,
analise os exemplos, identifique divergências, gere uma tabela,
inclua recomendações e produza um relatório detalhado.

A segunda solicitação pode consumir uma quantidade enorme de tokens antes mesmo de o modelo começar a responder.

Em muitas plataformas comerciais, o custo é calculado com base nos tokens de entrada e saída.

Portanto, desperdiçar contexto é semelhante a executar repetidamente um job caro sem necessidade.

Dica do Bellacosa

Não envie para o modelo tudo o que existe.

Envie o que ele realmente precisa.

Um prompt gigantesco não é necessariamente um prompt melhor. Muitas vezes, é apenas um SYSIN desorganizado com documentos demais.


4. Gerenciamento da janela de contexto: a memória operacional da missão

A janela de contexto determina quanto conteúdo o modelo consegue considerar durante uma interação.

Ela pode incluir:

  • perguntas anteriores;

  • instruções do sistema;

  • documentos recuperados;

  • mensagens do usuário;

  • resultados de ferramentas;

  • exemplos;

  • regras de formatação.

Podemos comparar a janela de contexto a uma área de trabalho temporária.

No mundo COBOL, pense em estruturas como:

  • WORKING-STORAGE;

  • COMMAREA;

  • containers do CICS;

  • áreas compartilhadas;

  • parâmetros recebidos;

  • registros mantidos durante uma etapa de processamento.

Se você tentar colocar informação demais em uma área limitada, alguma coisa precisará ser removida, resumida ou ignorada.

Estratégias comuns

Janela deslizante

Mantém as mensagens mais recentes e elimina as antigas.

Funciona bem em conversas curtas, mas pode apagar decisões importantes feitas no início.

Resumo de histórico

As interações antigas são condensadas em uma versão menor.

O risco é perder detalhes.

É semelhante a transformar um log completo em um relatório resumido. Você economiza espaço, mas talvez elimine justamente a informação necessária para investigar um erro.

Priorização por relevância

A plataforma seleciona os trechos mais relacionados à pergunta atual.

Essa abordagem costuma ser melhor do que simplesmente usar os textos mais recentes.

Compressão semântica

O sistema tenta preservar significado ocupando menos tokens.

Essa área ainda exige muitos cuidados. Um resumo incorreto pode contaminar todo o raciocínio seguinte.

Curiosidade

Uma janela de contexto muito grande não elimina automaticamente o problema.

Mesmo quando o modelo aceita uma enorme quantidade de texto, inserir conteúdo excessivo pode reduzir a precisão. Informações importantes ficam escondidas no meio de trechos irrelevantes.

É o equivalente a procurar um SQLCODE dentro de dez milhões de linhas de spool sem utilizar filtros.

Ter acesso ao conteúdo não significa encontrá-lo com eficiência.


5. Embeddings: transformando significado em coordenadas

Embeddings são representações matemáticas de palavras, frases, parágrafos, imagens ou documentos.

Em vez de armazenar apenas o texto, a plataforma cria uma sequência de números que representa características semânticas daquele conteúdo.

Por exemplo, as expressões:

  • carro;

  • automóvel;

  • veículo de passeio;

podem gerar vetores próximos porque possuem significados semelhantes.

Já termos como:

  • JCL;

  • JES2;

  • execução batch;

  • submissão de job;

também podem aparecer próximos em um espaço vetorial bem construído.

Isso permite uma pesquisa diferente da busca tradicional por palavras-chave.

Busca tradicional

Pergunta:

Como investigar uma falha de job?

Documento:

Procedimento para diagnóstico de ABEND no JES2.

Talvez uma busca literal não encontre o documento, porque as palavras são diferentes.

Busca semântica

A pesquisa vetorial percebe que “falha de job”, “diagnóstico de ABEND” e “JES2” estão semanticamente relacionados.

Essa é uma das grandes forças dos embeddings.

Eles ajudam o sistema a localizar conteúdos por significado, não apenas por coincidência textual.

Atenção, tripulação

Embedding não é entendimento humano.

É uma representação numérica útil para calcular proximidade.

Dois textos podem parecer próximos matematicamente e ainda serem inadequados para uma pergunta específica.

Por isso, a recuperação precisa de filtros adicionais, metadados, validações e, muitas vezes, reranking.


6. Bancos vetoriais: o arquivo estelar do conhecimento

Depois de criar embeddings, precisamos armazená-los e pesquisá-los rapidamente.

Entram em cena os bancos vetoriais.

Eles são preparados para operações como:

  • busca por similaridade;

  • recuperação dos vetores mais próximos;

  • filtragem por metadados;

  • pesquisa em grande escala;

  • combinação de busca lexical e semântica.

Entre as tecnologias usadas nesse espaço estão soluções especializadas e extensões vetoriais de bancos já conhecidos.

O objetivo principal é responder:

“Quais documentos se parecem mais com a pergunta recebida?”

Exemplo corporativo

Imagine uma empresa com:

  • vinte mil procedimentos;

  • cem mil tickets;

  • cinquenta mil manuais;

  • milhares de normas;

  • históricos de incidentes;

  • documentação de aplicações;

  • diagramas e runbooks.

Quando um analista pergunta:

Como investigar lentidão em uma transação CICS após aumento de carga?

o sistema precisa localizar os materiais mais úteis sem enviar todo o repositório para o modelo.

O banco vetorial ajuda a selecionar apenas alguns trechos.

O paralelo com o mainframe

Podemos pensar em um banco vetorial como um índice especializado.

Ele não substitui necessariamente o Db2, o VSAM, o IMS ou um repositório documental. Frequentemente funciona ao lado deles.

O banco tradicional continua sendo a fonte oficial.

O índice vetorial ajuda a encontrar o conteúdo relevante.

Essa distinção é muito importante.

A camada vetorial pode apontar para um documento, mas a fonte de verdade ainda precisa ser preservada, governada e auditável.


7. RAG: quando o modelo consulta a biblioteca antes de responder

RAG significa Retrieval-Augmented Generation, ou geração aumentada por recuperação.

A ideia é simples e poderosa:

  1. O usuário faz uma pergunta.

  2. O sistema procura informações relevantes.

  3. Os melhores trechos são selecionados.

  4. Esses trechos são enviados ao modelo.

  5. O modelo produz uma resposta baseada no material recuperado.

O fluxo básico é:

PERGUNTA
   |
   v
CRIAÇÃO DO EMBEDDING
   |
   v
BUSCA VETORIAL
   |
   v
RECUPERAÇÃO DE DOCUMENTOS
   |
   v
MONTAGEM DO CONTEXTO
   |
   v
MODELO
   |
   v
RESPOSTA

Por que o RAG é tão importante?

Porque os modelos não conhecem automaticamente:

  • documentos privados;

  • procedimentos internos;

  • dados recém-publicados;

  • alterações realizadas depois do treinamento;

  • regras específicas da organização;

  • detalhes de sistemas proprietários.

Com RAG, a empresa pode fornecer conhecimento atualizado sem retreinar o modelo inteiro.

Exemplo mainframe

Pergunta:

Qual é o procedimento interno para tratar um S0C7 na aplicação XPTO?

A plataforma recupera:

  • o runbook da aplicação;

  • o histórico de incidentes;

  • o manual interno;

  • exemplos de dumps anteriores;

  • a lista de responsáveis.

Depois, o modelo organiza esse conhecimento em uma resposta.

Sem RAG, ele talvez forneça apenas uma explicação genérica do S0C7.

Com RAG, pode responder conforme o ambiente real da organização.

Mas RAG não é magia

Um RAG ruim pode produzir uma resposta ruim com aparência de precisão.

Os principais pontos de falha são:

  • documentos desatualizados;

  • divisão inadequada dos textos;

  • embeddings fracos;

  • filtros errados;

  • recuperação de trechos irrelevantes;

  • contexto excessivo;

  • ausência de citações;

  • permissões mal aplicadas;

  • modelo ignorando a fonte recuperada.

RAG não elimina alucinações. Ele reduz riscos quando é bem projetado.

Easter egg da missão: um RAG sem governança é como acessar o computador da Enterprise usando documentos dos Klingons, Ferengi, Romulanos e Federação sem identificar a origem. A resposta pode soar convincente, mas talvez comece uma guerra interplanetária.


8. Prompt Engineering: escrevendo o JCL da conversa

Prompt engineering é a disciplina de estruturar instruções para orientar o comportamento do modelo.

Um prompt pode definir:

  • papel;

  • objetivo;

  • formato;

  • público;

  • tom;

  • restrições;

  • critérios de qualidade;

  • ferramentas permitidas;

  • fontes obrigatórias;

  • regras de segurança.

Para o programador COBOL, o prompt pode ser comparado a uma combinação de SYSIN, parâmetros, regras de negócio e instruções operacionais.

Um bom programa recebendo dados ruins continua sujeito a resultados ruins.

O mesmo vale para a IA.

Exemplo simples

Prompt fraco:

Fale sobre COBOL.

Prompt melhor:

Explique o conceito de PERFORM em COBOL para um programador iniciante.
Apresente exemplos com PERFORM simples, PERFORM UNTIL e PERFORM VARYING.
Mostre erros comuns, inclua comentários no código e evite recursos obsoletos.

O segundo prompt:

  • define o público;

  • delimita o tema;

  • especifica exemplos;

  • determina cuidados;

  • reduz ambiguidades.

Prompt não é garantia

Mesmo um excelente prompt não transforma um modelo inadequado em especialista absoluto.

Prompt engineering ajuda a controlar comportamento, mas não substitui:

  • dados;

  • testes;

  • arquitetura;

  • segurança;

  • validação;

  • observabilidade.

Um prompt é uma instrução, não um escudo defletor.


9. Fine-tuning: treinamento especializado da tripulação

Fine-tuning é o processo de ajustar um modelo com exemplos específicos para modificar seu comportamento.

Pode ser útil quando a empresa precisa de:

  • estilo consistente;

  • formato muito específico;

  • vocabulário de domínio;

  • classificação especializada;

  • respostas padronizadas;

  • comportamento difícil de obter apenas com prompt.

Exemplo

Uma organização pode ajustar um modelo para transformar descrições de incidentes em categorias operacionais padronizadas.

Entrada:

Job ficou preso após falha de alocação.

Saída esperada:

Categoria: Storage / Dataset Allocation
Prioridade: Média
Equipe: Operações z/OS

Com milhares de exemplos bem preparados, o modelo pode aprender esse padrão.

Quando não usar fine-tuning

Muitas equipes tentam utilizar fine-tuning para “ensinar documentos” ao modelo.

Frequentemente, RAG é mais adequado para conhecimento que muda.

Uma regra prática:

  • Conhecimento mutável: considere RAG.

  • Comportamento ou formato: considere fine-tuning.

  • Instrução simples: comece com prompt engineering.

O fine-tuning exige:

  • dados de treinamento;

  • limpeza;

  • avaliação;

  • controle de versões;

  • custos;

  • monitoramento de regressões.

Treinar com exemplos ruins é semelhante a formar cadetes usando manuais incorretos.

Eles aprenderão muito bem a fazer a coisa errada.


10. Model Routing: enviando cada missão para a nave correta

Model routing é a camada que escolhe qual modelo deve processar cada solicitação.

Nem toda pergunta precisa do modelo mais caro.

Considere estas tarefas:

Classificar um e-mail como urgente ou não.
Resumir um parágrafo.
Analisar um contrato de 200 páginas.
Diagnosticar uma falha complexa em COBOL, CICS e Db2.

Usar o mesmo modelo para tudo pode ser ineficiente.

Uma plataforma pode adotar:

  • modelo pequeno para classificação;

  • modelo médio para resumo;

  • modelo avançado para análise;

  • modelo especializado para código;

  • modelo local para dados sensíveis;

  • modelo externo para tarefas não confidenciais.

Critérios de roteamento

O roteador pode avaliar:

  • complexidade;

  • idioma;

  • domínio;

  • custo;

  • urgência;

  • privacidade;

  • tamanho do contexto;

  • disponibilidade;

  • qualidade necessária.

Isso se parece muito com direcionar diferentes workloads por classes de serviço.

O WLM do z/OS não trata todas as cargas exatamente da mesma maneira. Ele prioriza conforme objetivos definidos.

O model routing aplica uma lógica semelhante ao universo da IA.


11. Caching: não execute novamente o que já foi resolvido

Cache armazena resultados para evitar processamento repetido.

Imagine cem usuários perguntando:

Qual é a política de troca de senha?

Sem cache, a plataforma pode:

  1. criar embedding;

  2. pesquisar documentos;

  3. recuperar os mesmos trechos;

  4. chamar o modelo;

  5. gerar praticamente a mesma resposta;

cem vezes.

Com cache, parte desse fluxo pode ser reutilizada.

Tipos de cache

Cache exato

Reutiliza a resposta quando a pergunta é idêntica.

Cache semântico

Pode reutilizar uma resposta quando a nova pergunta possui significado muito semelhante.

Exemplo:

Como altero minha senha?

e

Qual é o procedimento para trocar a senha?

Cache de embeddings

Evita recalcular vetores já processados.

Cache de recuperação

Armazena resultados frequentes de busca.

Cuidados

Cache pode servir informação antiga.

Ele precisa considerar:

  • validade;

  • versão do documento;

  • identidade do usuário;

  • permissões;

  • sensibilidade;

  • atualização das fontes.

Nunca compartilhe uma resposta em cache entre usuários quando o conteúdo depende das autorizações individuais.

O cache é um replicador útil, mas não pode materializar documentos secretos na cabine errada.


12. Streaming inference: reduzindo a espera percebida

No streaming, a resposta é enviada aos poucos.

Em vez de o usuário esperar o texto completo, ele começa a visualizar os primeiros fragmentos enquanto o restante é gerado.

Isso não significa necessariamente que a inferência ficou mais rápida.

Significa que a experiência parece mais responsiva.

É uma diferença entre:

AGUARDE...
AGUARDE...
AGUARDE...
RESPOSTA COMPLETA

e:

A resposta começa...
continua sendo formada...
e chega gradualmente...

Em aplicações interativas, essa percepção é muito importante.

Contudo, streaming exige cuidados:

  • filtros de segurança precisam acompanhar a saída;

  • erros podem aparecer no meio do texto;

  • o cliente precisa lidar com interrupções;

  • a interface deve indicar conclusão;

  • logs precisam reconstruir o conteúdo integral.

Transmitir tokens sem controle seria como abrir um canal subespacial antes de verificar se a mensagem está autorizada.


13. Batch processing: a inteligência artificial também trabalha de madrugada

Nem toda tarefa precisa acontecer em tempo real.

Muitas operações de IA são perfeitas para processamento em lote:

  • criação de embeddings;

  • classificação de milhões de documentos;

  • resumo de históricos;

  • extração de metadados;

  • avaliação de respostas;

  • reindexação;

  • análise de logs;

  • preparação de dados.

O programador mainframe conhece bem essa filosofia.

O batch continua sendo uma solução poderosa porque permite:

  • agrupar trabalho;

  • controlar janelas;

  • otimizar recursos;

  • repetir etapas;

  • reiniciar processos;

  • acompanhar resultados.

Exemplo

Uma empresa possui cinco milhões de PDFs.

Não faz sentido esperar um usuário perguntar sobre cada documento para então gerar o embedding.

A plataforma pode processar os documentos em lote durante períodos de menor custo e menor demanda.

O fluxo pode incluir:

LEITURA
  |
  v
EXTRAÇÃO DE TEXTO
  |
  v
LIMPEZA
  |
  v
DIVISÃO EM TRECHOS
  |
  v
EMBEDDINGS
  |
  v
INDEXAÇÃO

Parece familiar?

Sim. É praticamente uma nova espécie de cadeia batch.

Mudaram os componentes, mas os princípios continuam reconhecíveis.


14. Guardrails e camadas de segurança: os escudos da plataforma

Guardrails são mecanismos que controlam entradas, saídas e ações da IA.

Eles podem ajudar a impedir:

  • conteúdo perigoso;

  • vazamento de informações;

  • exposição de dados pessoais;

  • execução de comandos proibidos;

  • respostas fora da política;

  • manipulação por prompt injection;

  • acesso indevido a ferramentas;

  • uso de fontes não autorizadas.

Guardrails de entrada

Analisam o que o usuário envia.

Podem detectar:

  • tentativas de burlar regras;

  • dados sensíveis;

  • conteúdo malicioso;

  • solicitações proibidas.

Guardrails de saída

Verificam a resposta antes da entrega.

Podem procurar:

  • informações confidenciais;

  • linguagem inadequada;

  • instruções perigosas;

  • violações de conformidade;

  • ausência de citações.

Guardrails de ferramentas

Controlam o que o agente pode fazer.

Por exemplo:

  • consultar um banco;

  • enviar um e-mail;

  • criar um ticket;

  • executar uma transação;

  • alterar um cadastro.

Essa camada merece atenção máxima.

Uma IA que apenas responde texto possui riscos.

Uma IA que pode executar ações possui riscos muito maiores.

O paralelo com RACF

Guardrails não são exatamente o RACF da IA, mas a comparação ajuda.

Assim como o RACF trabalha com identidades, perfis, recursos e permissões, uma plataforma de IA precisa decidir:

  • quem pode perguntar;

  • quais fontes pode consultar;

  • quais ações pode executar;

  • quais dados pode revelar;

  • quais operações devem ser auditadas.

Nunca permita que o modelo seja a autoridade final sobre permissões.

A autorização precisa estar fora do modelo, em controles determinísticos.

Um LLM não deve “imaginar” se o usuário possui acesso.

Ele deve receber essa decisão de uma camada confiável.


15. Evaluation pipelines: testar a IA antes que o Klingon teste por você

Sistemas tradicionais possuem testes unitários, integrados, funcionais, de regressão, desempenho e segurança.

Plataformas de IA também precisam de avaliação contínua.

O problema é que respostas geradas não são sempre idênticas.

Um programa COBOL pode produzir um valor esperado exato.

Um modelo pode gerar duas respostas diferentes, ambas aceitáveis.

Por isso, a avaliação precisa usar múltiplos critérios.

O que avaliar?

  • correção;

  • relevância;

  • fundamentação;

  • completude;

  • segurança;

  • formato;

  • latência;

  • custo;

  • uso de fontes;

  • taxa de recusa;

  • consistência;

  • satisfação do usuário.

Conjunto dourado

Uma prática importante é criar um conjunto de perguntas com respostas esperadas.

Exemplo:

Pergunta:
O que significa DISP=(NEW,CATLG,DELETE)?

Critérios:
- explicar NEW;
- explicar CATLG;
- explicar DELETE;
- mostrar o comportamento em sucesso e falha;
- não inventar sintaxe;

A plataforma executa essas perguntas periodicamente e compara a qualidade.

Isso ajuda a detectar regressões após:

  • troca de modelo;

  • mudança de prompt;

  • alteração no RAG;

  • nova versão do índice;

  • mudança no tokenizer;

  • atualização dos documentos.

Curiosidade importante

Uma plataforma pode melhorar a média geral e piorar exatamente os casos mais críticos.

Por isso, não basta olhar uma única nota.

É necessário separar avaliações por:

  • domínio;

  • risco;

  • tipo de usuário;

  • complexidade;

  • sensibilidade.

Uma resposta errada sobre uma curiosidade custa pouco.

Uma resposta errada sobre uma operação financeira pode custar milhões.


16. Observabilidade: SMF, RMF e OMEGAMON encontraram a inteligência artificial

Observabilidade permite compreender o comportamento interno de um sistema por meio de sinais como:

  • logs;

  • métricas;

  • traces;

  • eventos;

  • correlações.

Em IA, precisamos observar muito mais do que “funcionou ou falhou”.

Métricas importantes

  • tokens de entrada;

  • tokens de saída;

  • custo por requisição;

  • latência;

  • tempo até o primeiro token;

  • erros;

  • timeout;

  • modelo selecionado;

  • documentos recuperados;

  • score de similaridade;

  • taxa de cache;

  • bloqueios de guardrail;

  • satisfação do usuário;

  • uso de ferramentas;

  • falhas de autorização.

Tracing

Um trace pode mostrar toda a jornada:

REQUISIÇÃO DO USUÁRIO
        |
        v
AUTENTICAÇÃO
        |
        v
CLASSIFICAÇÃO
        |
        v
MODEL ROUTING
        |
        v
BUSCA VETORIAL
        |
        v
RERANKING
        |
        v
MONTAGEM DO PROMPT
        |
        v
INFERÊNCIA
        |
        v
VALIDAÇÃO
        |
        v
RESPOSTA

Sem tracing, a equipe vê apenas:

A resposta ficou ruim.

Com tracing, pode descobrir:

O documento correto não foi recuperado porque o filtro de versão estava errado.

Essa diferença é gigantesca.

O profissional de mainframe entende muito bem o valor de SMF, RMF, dumps, traces e históricos.

A IA não elimina a necessidade de diagnóstico.

Ela aumenta essa necessidade.


17. Autoscaling: preparando a frota para a hora do pico

A demanda por IA pode variar muito.

Durante a madrugada, talvez existam poucas chamadas.

Depois de uma campanha, lançamento ou incidente, podem surgir milhares de usuários.

Autoscaling ajusta automaticamente os recursos.

Ele pode:

  • adicionar instâncias;

  • aumentar réplicas;

  • distribuir requisições;

  • ativar aceleradores;

  • reduzir capacidade quando a demanda cai.

Mas escalar IA não é tão simples quanto escalar uma página web.

Modelos grandes podem exigir:

  • muita memória;

  • GPU;

  • tempo de inicialização;

  • distribuição especializada;

  • carregamento de pesos;

  • cache aquecido.

Cold start

Quando uma nova instância precisa carregar o modelo, pode haver atraso.

É como iniciar uma região inteira do sistema apenas depois de a fila já estar cheia.

Por isso, a plataforma precisa prever:

  • capacidade mínima;

  • réplicas aquecidas;

  • comportamento em picos;

  • limites de fila;

  • degradação controlada.

Degradação elegante

Quando o modelo principal está indisponível, o sistema pode:

  • usar um modelo menor;

  • reduzir o tamanho da resposta;

  • desativar funções não críticas;

  • colocar tarefas em fila;

  • oferecer resposta parcial;

  • encaminhar para atendimento humano.

Uma plataforma madura não pergunta apenas:

“Como manter tudo perfeito?”

Ela também pergunta:

“Como continuar operando quando alguma camada falhar?”

Essa é a verdadeira mentalidade de resiliência.


18. Otimização de custos: não desperdice dilítio

A IA generativa pode consumir recursos rapidamente.

Os custos aparecem em diferentes pontos:

  • inferência;

  • tokens;

  • armazenamento;

  • banco vetorial;

  • GPU;

  • rede;

  • observabilidade;

  • reprocessamento;

  • avaliação;

  • embeddings;

  • manutenção.

Estratégias de economia

Usar modelos menores quando possível

Classificações simples não precisam do modelo mais poderoso.

Limitar contexto

Enviar apenas documentos relevantes reduz tokens.

Aplicar cache

Evita inferência repetida.

Utilizar processamento em lote

Operações não urgentes podem ser agrupadas.

Comprimir prompts

Instruções redundantes custam dinheiro.

Controlar tamanho de resposta

Nem toda pergunta precisa de três mil palavras.

Medir custo por caso de uso

O custo médio global pode esconder operações extremamente caras.

Métrica realmente útil

Não observe apenas:

Custo por milhão de tokens

Observe também:

Custo por atendimento resolvido

ou:

Custo por incidente evitado

ou:

Custo por documento processado

Uma solução aparentemente cara pode gerar alto valor.

Uma solução barata pode ser inútil.

O objetivo não é gastar o mínimo.

É produzir resultado sustentável.


19. Como todas as camadas trabalham juntas

Agora podemos montar uma arquitetura simplificada:

USUÁRIO
   |
   v
AUTENTICAÇÃO E AUTORIZAÇÃO
   |
   v
GUARDRAIL DE ENTRADA
   |
   v
CLASSIFICAÇÃO DA SOLICITAÇÃO
   |
   v
MODEL ROUTING
   |
   +----------------------+
   |                      |
   v                      v
CACHE                 RAG / BUSCA
   |                      |
   +----------+-----------+
              |
              v
      MONTAGEM DO PROMPT
              |
              v
         INFERÊNCIA
              |
              v
      GUARDRAIL DE SAÍDA
              |
              v
        STREAMING / API
              |
              v
           USUÁRIO

Paralelamente, outras camadas acompanham tudo:

OBSERVABILIDADE
AVALIAÇÃO
CUSTOS
AUTOSCALING
AUDITORIA
SEGURANÇA

Nenhuma camada trabalha completamente isolada.

Uma decisão pode afetar várias outras.

Exemplo:

Ao aumentar o contexto:

  • a qualidade pode melhorar;

  • a latência pode aumentar;

  • o custo pode crescer;

  • o limite do modelo pode ser atingido;

  • o cache pode perder eficiência.

Ao trocar para um modelo menor:

  • o custo pode cair;

  • a velocidade pode melhorar;

  • a qualidade pode diminuir;

  • o roteamento precisa mudar;

  • as avaliações devem ser repetidas.

Arquitetura de IA é um jogo permanente de trade-offs.

Não existe uma configuração perfeita para todos os casos.

Existe uma configuração adequada ao objetivo.


20. Um exemplo completo: copiloto para operações mainframe

Vamos imaginar uma empresa criando um assistente para ajudar operadores e programadores iniciantes.

O usuário pergunta:

Meu job terminou com S0C7. O que devo verificar?

Passo 1 — Autenticação

O sistema identifica o usuário.

Passo 2 — Autorização

Verifica quais aplicações, logs e runbooks ele pode consultar.

Passo 3 — Guardrail

Remove ou mascara dados sensíveis enviados no prompt.

Passo 4 — Classificação

Identifica a pergunta como diagnóstico técnico de mainframe.

Passo 5 — Model routing

Seleciona um modelo especializado em código e operações.

Passo 6 — RAG

Busca:

  • documentação de S0C7;

  • runbook da aplicação;

  • incidentes semelhantes;

  • padrões internos de diagnóstico;

  • guias de dump.

Passo 7 — Montagem de contexto

Seleciona apenas os trechos mais relevantes.

Passo 8 — Prompt

Instrui o modelo a:

  • explicar o erro;

  • sugerir sequência de análise;

  • não executar ações;

  • citar as fontes;

  • separar hipóteses de fatos.

Passo 9 — Inferência

O modelo gera a resposta.

Passo 10 — Validação

A plataforma verifica:

  • ausência de dados sigilosos;

  • presença de fontes;

  • aderência ao formato;

  • inexistência de instruções perigosas.

Passo 11 — Streaming

A resposta aparece gradualmente.

Passo 12 — Observabilidade

O sistema registra:

  • modelo;

  • tokens;

  • latência;

  • documentos consultados;

  • custo;

  • feedback.

Passo 13 — Avaliação

A interação pode entrar em um conjunto de análise para melhorar a plataforma.

Perceba que o modelo participou apenas de uma etapa.

A qualidade final dependeu da missão inteira.


21. Erros comuns de equipes iniciantes

Escolher o modelo antes de entender o problema

A equipe se apaixona por uma tecnologia e tenta encaixá-la em qualquer caso.

Comece pelo resultado desejado.

Jogar documentos em um banco vetorial sem governança

Documentos duplicados, antigos e conflitantes produzirão respostas ruins.

Não medir custos

A surpresa chega na primeira fatura.

Confiar em testes manuais

Cinco perguntas bem respondidas não provam que a plataforma está pronta.

Ignorar autorização no RAG

O sistema pode recuperar um documento que o usuário não deveria ler.

Usar um modelo grande para tudo

Funciona tecnicamente, mas pode ser economicamente inviável.

Não registrar versões

Sem saber qual modelo, prompt e índice foram usados, investigar regressões se torna difícil.

Confundir fluência com correção

Uma resposta bem escrita pode estar errada.

O modelo fala com confiança porque foi treinado para produzir linguagem plausível, não porque possui certeza.


22. Roteiro prático para construir uma plataforma

Etapa 1 — Escolha um caso de uso pequeno

Evite começar com:

Vamos criar uma IA para toda a empresa.

Comece com:

Vamos responder dúvidas sobre os procedimentos da equipe de operações.

Etapa 2 — Defina métricas

Exemplos:

  • taxa de resolução;

  • precisão;

  • tempo de resposta;

  • custo;

  • satisfação;

  • redução de chamados.

Etapa 3 — Organize as fontes

Remova:

  • duplicações;

  • documentos vencidos;

  • versões conflitantes;

  • conteúdos sem proprietário.

Etapa 4 — Crie um RAG simples

Teste recuperação antes de culpar o modelo.

Etapa 5 — Monte um conjunto de avaliação

Inclua perguntas fáceis, difíceis, ambíguas e perigosas.

Etapa 6 — Implemente segurança

Autenticação, autorização, mascaramento e auditoria não devem ser deixados para o final.

Etapa 7 — Adicione observabilidade

Registre toda a cadeia.

Etapa 8 — Otimize custo

Somente depois de medir.

Etapa 9 — Teste carga

Descubra o limite antes de os usuários descobrirem.

Etapa 10 — Planeje falhas

Defina o comportamento quando:

  • o modelo falhar;

  • o banco vetorial ficar indisponível;

  • a latência aumentar;

  • a cota acabar;

  • o documento não for encontrado.


23. Pontos para fixar no diário de bordo

Guarde estas ideias:

  1. O modelo é um componente, não a plataforma inteira.

  2. Escalabilidade envolve desempenho, custo, segurança, qualidade e operação.

  3. Tokens afetam limites, latência e orçamento.

  4. Contexto precisa ser selecionado, não apenas acumulado.

  5. Embeddings permitem busca por significado.

  6. Bancos vetoriais aceleram a recuperação semântica.

  7. RAG conecta o modelo ao conhecimento atualizado.

  8. Prompt engineering orienta comportamento, mas não corrige toda limitação.

  9. Fine-tuning serve principalmente para especialização comportamental.

  10. Model routing evita usar uma nave capitânia para entregar uma encomenda simples.

  11. Cache reduz repetição e custo.

  12. Streaming melhora a experiência percebida.

  13. Batch continua essencial.

  14. Guardrails protegem entradas, saídas e ações.

  15. Avaliação contínua detecta regressões.

  16. Observabilidade transforma “a IA errou” em um diagnóstico real.

  17. Autoscaling prepara o sistema para picos.

  18. Otimização de custos precisa considerar valor, não apenas preço por token.


Conclusão: a plataforma é a frota

O mercado adora discutir modelos.

Qual possui mais parâmetros?

Qual responde melhor?

Qual escreve código?

Qual aceita mais contexto?

Qual é mais barato?

Essas perguntas são úteis, mas insuficientes.

Uma plataforma escalável precisa funcionar em condições reais:

  • muitos usuários;

  • dados imperfeitos;

  • documentos conflitantes;

  • picos de acesso;

  • ameaças;

  • falhas;

  • mudanças de versão;

  • pressão de custo;

  • exigências regulatórias;

  • auditoria.

É nesse ambiente que a arquitetura mostra seu verdadeiro valor.

O modelo pode ser o cérebro da operação, mas ainda precisa de memória, sensores, controles, comunicação, proteção, supervisão e energia.

Um grande sistema de IA não nasce apenas da escolha de um modelo poderoso.

Ele nasce da integração disciplinada entre componentes.

Para o programador COBOL Padawan, existe uma vantagem inesperada: muitos desses princípios já fazem parte do universo mainframe há décadas.

Separação de responsabilidades.

Controle de acesso.

Processamento em lote.

Priorização de carga.

Observabilidade.

Auditoria.

Resiliência.

Otimização de recursos.

Recuperação após falhas.

A tecnologia mudou, mas a engenharia continua reconhecível.

No final da missão, a pergunta correta não é:

“Qual modelo está sendo utilizado?”

A pergunta madura é:

“Como tokenização, contexto, RAG, roteamento, segurança, avaliação, observabilidade, infraestrutura e custos trabalham juntos quando a plataforma está sob pressão?”

Se a equipe não consegue responder, talvez ainda não possua uma plataforma.

Talvez possua apenas uma demonstração bonita estacionada no hangar.

E como diria o Sr. Spock, olhando para um dashboard cheio de alertas:

“Uma inteligência sem arquitetura é apenas uma probabilidade esperando por um incidente.”

Portanto, jovem programador, quando alguém apresentar um novo modelo milagroso, admire sua capacidade, estude suas possibilidades e faça a pergunta que separa cadetes de oficiais experientes:

— Muito interessante. Mas onde estão os logs, os testes, os escudos, o roteamento, o controle de custo e o plano para quando ele falhar?

Nesse momento, você não estará mais pensando apenas como usuário de inteligência artificial.

Estará pensando como arquiteto de sistemas.

E a Frota Estelar precisa exatamente desse tipo de profissional.

sexta-feira, 16 de junho de 2023

Os Assassinos Silenciosos do System Design

 

Bellacosa Mainframe e os assassinos sileciosos do system design

☕ Um Café no Bellacosa Mainframe

Os Assassinos Silenciosos do System Design

O guia do Programador COBOL Padawan para construir sistemas que não explodem quando chegam à produção

Existe um momento muito perigoso na vida de todo projeto de software.

Não é quando o programa apresenta erro de compilação.

Não é quando o JCL retorna JCL ERROR.

Não é quando o COBOL encerra com um S0C7, um S0C4 ou um S806.

O momento mais perigoso acontece muito antes disso.

Acontece naquela reunião aparentemente inocente em que alguém diz:

“É um sistema simples. Vamos começar a programar e depois ajustamos os detalhes.”

Nesse instante, caro Programador COBOL Padawan, uma perturbação surge na Força.

Ou, para os oficiais da Frota Estelar, os sensores da ponte detectam uma anomalia arquitetural se formando perto do núcleo de dobra.

Muitos sistemas não fracassam porque seus programadores desconhecem sintaxe. Eles fracassam porque começaram sem requisitos claros, cresceram sem planejamento, acumularam complexidade desnecessária, ignoraram segurança, não prepararam mecanismos de recuperação e foram colocados em produção sem monitoramento adequado.

No início, tudo parece funcionar.

O sistema cadastra clientes.

A API responde.

O batch termina.

A tela CICS abre.

O SELECT retorna dados.

Todos comemoram.

Entretanto, meses depois, a quantidade de usuários aumenta, o banco de dados cresce, as integrações se multiplicam e aquela pequena aplicação começa a mostrar rachaduras.

As respostas ficam lentas.

O banco atinge níveis perigosos de utilização.

Ninguém consegue localizar os erros.

A equipe tem medo de alterar o código.

Uma mudança de configuração exige nova compilação.

Um servidor cai e leva todo o sistema junto.

O que parecia ser um pequeno cargueiro espacial agora está tentando operar como a USS Enterprise, mas foi construído sem escudos, sem sensores e sem plano de evacuação.

Este artigo é uma viagem completa pelos principais erros de System Design, explicando como eles surgem, por que são perigosos e como evitá-los. A missão é traduzir os conceitos de arquitetura para quem está começando em COBOL, mainframe e sistemas corporativos.

Prepare seu café, ajuste o comunicador e assuma seu posto na ponte.

Temos uma arquitetura para salvar.


1. O que é System Design?

System Design, ou projeto de sistemas, é o processo de decidir como uma solução será estruturada para atender a determinados objetivos.

Não se resume a desenhar caixas e setas em um diagrama.

Também não significa apenas escolher:

  • linguagem de programação;

  • banco de dados;

  • framework;

  • servidor;

  • provedor de nuvem.

O projeto de sistemas procura responder perguntas muito mais profundas:

  • Quem utilizará o sistema?

  • Quantos usuários serão atendidos?

  • Qual volume de dados será processado?

  • O sistema precisa funcionar 24 horas por dia?

  • O que acontece quando um componente falha?

  • Como os dados serão protegidos?

  • Como o ambiente será monitorado?

  • Como a solução crescerá?

  • Como uma versão será implantada?

  • Como recuperar o sistema após um desastre?

  • Quanto custará manter tudo funcionando?

Em um ambiente mainframe, essas perguntas aparecem há décadas.

Um sistema COBOL corporativo normalmente não é apenas um programa. Ele pode envolver:

  • transações CICS;

  • programas batch;

  • JCL;

  • arquivos VSAM;

  • tabelas Db2;

  • filas IBM MQ;

  • segurança RACF;

  • logs SMF;

  • gerenciamento de carga pelo WLM;

  • rotinas de recuperação;

  • interfaces com sistemas externos.

Portanto, System Design é a arte de transformar requisitos de negócio em uma estrutura técnica capaz de funcionar com segurança, desempenho, disponibilidade e possibilidade de evolução.

Um bom projeto não tenta prever o futuro inteiro.

Ele cria uma base suficientemente sólida para que o sistema possa se adaptar sem precisar ser destruído e reconstruído a cada nova necessidade.


2. O primeiro assassino silencioso: começar sem requisitos claros

Um dos erros mais graves é iniciar a programação antes de compreender o problema.

A frase normalmente soa assim:

“Vamos codificar logo para ganhar tempo.”

Na prática, esse atalho costuma produzir o efeito contrário.

Quando os requisitos são vagos, cada pessoa imagina um sistema diferente.

O gestor imagina um portal.

O cliente imagina um aplicativo.

O desenvolvedor imagina uma API.

A infraestrutura imagina uma solução em nuvem.

O analista mainframe imagina uma integração com CICS e Db2.

Todos estão trabalhando, mas cada um está construindo uma nave diferente.

Um exemplo simples

O cliente solicita:

“Precisamos modernizar o sistema de pagamentos.”

A palavra “modernizar” pode significar muitas coisas:

  • substituir telas 3270 por uma interface web;

  • expor transações COBOL como APIs;

  • migrar programas para outra plataforma;

  • reorganizar o código;

  • melhorar desempenho;

  • automatizar implantação;

  • atualizar a segurança;

  • criar acesso por dispositivos móveis;

  • simplesmente documentar o legado.

Sem esclarecimento, a equipe pode passar meses resolvendo o problema errado.

Requisitos funcionais e não funcionais

Os requisitos funcionais descrevem o que o sistema deve fazer.

Exemplos:

  • cadastrar clientes;

  • consultar saldo;

  • emitir boleto;

  • processar pagamento;

  • gerar relatório;

  • cancelar uma transação.

Os requisitos não funcionais descrevem como o sistema deve se comportar.

Exemplos:

  • responder em menos de dois segundos;

  • atender dez mil usuários simultâneos;

  • manter disponibilidade de 99,99%;

  • criptografar dados sensíveis;

  • registrar todas as operações;

  • recuperar o serviço em até quinze minutos.

Muitos projetos documentam apenas as funcionalidades e ignoram os requisitos não funcionais.

Depois descobrem, tarde demais, que o sistema funciona — porém é lento, inseguro ou impossível de operar.

Passo a passo antes de programar

Antes de escrever o primeiro IDENTIFICATION DIVISION, procure responder:

  1. Qual problema de negócio será resolvido?

  2. Quem são os usuários?

  3. Qual volume inicial de dados?

  4. Qual crescimento esperado?

  5. Quais integrações existem?

  6. Qual horário de funcionamento?

  7. Qual nível de indisponibilidade é aceitável?

  8. Quais dados são sensíveis?

  9. Como os erros serão tratados?

  10. Quem dará suporte em produção?

Clareza no início não elimina mudanças.

Ela apenas impede que a equipe viaje em dobra máxima para o quadrante errado.


3. Ignorar escalabilidade desde cedo

Escalabilidade é a capacidade de um sistema continuar funcionando quando sua carga aumenta.

Um projeto pode começar com cem usuários e atingir cem mil.

Uma tabela pode começar com dez mil registros e chegar a bilhões.

Um processo batch que inicialmente trabalha com vinte arquivos pode, anos depois, receber milhares.

O erro está em pensar:

“Quando crescer, nós resolvemos.”

Às vezes isso é possível.

Em outras situações, a solução inicial cria limitações tão profundas que o crescimento exige uma reescrita completa.

Escala vertical e escala horizontal

Escala vertical significa tornar uma máquina mais poderosa:

  • mais CPU;

  • mais memória;

  • mais armazenamento;

  • processadores mais rápidos.

Escala horizontal significa adicionar mais máquinas ou instâncias para dividir o trabalho.

Em ambientes distribuídos, a escala horizontal é comum.

No mainframe, há décadas existem mecanismos sofisticados de expansão e gerenciamento de carga, como:

  • múltiplas LPARs;

  • Parallel Sysplex;

  • WLM;

  • compartilhamento de dados;

  • filas;

  • particionamento de workloads;

  • recursos especializados.

O importante não é defender uma única estratégia.

É reconhecer que o crescimento precisa ser considerado.

Exemplo de programa COBOL

Imagine um batch que processa um arquivo sequencial inteiro usando apenas uma etapa e um programa.

No começo:

  • 50 mil registros;

  • execução em três minutos.

Cinco anos depois:

  • 500 milhões de registros;

  • execução em nove horas;

  • janela batch insuficiente.

Talvez o projeto devesse ter considerado:

  • particionamento;

  • processamento paralelo;

  • checkpoints;

  • retomada após falha;

  • divisão por faixas;

  • utilização de banco com índices adequados;

  • filas de trabalho.

Escalabilidade não significa construir uma arquitetura gigante no primeiro dia.

Significa evitar escolhas que impossibilitem o crescimento.


4. Overengineering: quando a solução é maior que o problema

Overengineering acontece quando criamos uma solução excessivamente complexa para uma necessidade simples.

É o famoso caso de utilizar um torpedo de fótons para abrir uma lata de conservas.

Imagine uma aplicação interna usada por vinte pessoas.

A equipe decide criar:

  • quinze microsserviços;

  • três bancos de dados;

  • um cluster Kubernetes;

  • Kafka;

  • Redis;

  • Elasticsearch;

  • Service Mesh;

  • Event Sourcing;

  • CQRS;

  • múltiplos pipelines;

  • dezenas de dashboards.

Tudo isso para cadastrar fornecedores.

A arquitetura parece impressionante em uma apresentação.

Mas agora exige:

  • mais servidores;

  • mais especialistas;

  • mais monitoramento;

  • mais segurança;

  • mais custos;

  • mais pontos de falha.

Complexidade não é sinônimo de maturidade.

O princípio KISS

KISS significa:

Keep It Simple.

Ou, em português:

Mantenha a solução simples.

Uma solução simples tende a ser:

  • mais fácil de entender;

  • mais barata;

  • mais testável;

  • mais confiável;

  • mais rápida de corrigir.

Isso não significa escrever código descuidado.

Significa usar apenas a complexidade necessária.

Monólito não é palavrão

Muitas equipes tratam qualquer monólito como tecnologia ultrapassada.

Entretanto, um monólito modular pode ser excelente para diversos cenários.

O problema não é o monólito.

O problema é um monólito sem organização, com dependências caóticas e responsabilidades misturadas.

Da mesma forma, microsserviços não são automaticamente modernos.

Um ambiente de microsserviços mal projetado pode se tornar um monólito distribuído, mais difícil de depurar e mais caro de operar.

A melhor arquitetura não é a mais elegante no diagrama.

É a que atende aos requisitos com o menor nível razoável de complexidade.


5. Negligenciar tolerância a falhas

Todo componente falha.

Discos falham.

Redes falham.

Servidores param.

Programas recebem dados inválidos.

APIs externas ficam indisponíveis.

Filas enchem.

Bancos bloqueiam recursos.

Pessoas cometem erros.

O arquiteto maduro não pergunta:

“Será que vai falhar?”

Ele pergunta:

“Quando falhar, o que acontecerá?”

Falha não pode virar desastre

Uma falha local deveria permanecer local.

Se uma API de consulta de endereço estiver indisponível, isso não deveria necessariamente derrubar todo o sistema de cadastro.

Se um servidor parar, outra instância deveria assumir.

Se um programa batch interromper após processar 80% do arquivo, deveria ser possível retomar do ponto correto.

Padrões importantes

Timeout

Nenhuma chamada deveria esperar eternamente.

Um timeout define quanto tempo o sistema aguardará antes de considerar a operação malsucedida.

Retry

Algumas falhas são temporárias.

Uma nova tentativa pode resolver.

Entretanto, repetir sem controle é perigoso. Mil clientes realizando cinco tentativas podem transformar uma pequena lentidão em colapso completo.

Circuit Breaker

Funciona como um disjuntor.

Quando um serviço começa a falhar repetidamente, o sistema interrompe temporariamente as chamadas para evitar sobrecarga.

Failover

Quando um componente principal falha, outro assume.

Checkpoint

Um processo longo salva pontos de progresso para poder continuar após interrupção.

Dead Letter Queue

Mensagens que não podem ser processadas são desviadas para uma fila de análise, evitando que bloqueiem todo o fluxo.

A tradição do mainframe

A tolerância a falhas está no coração dos ambientes IBM Z.

Conceitos como:

  • Parallel Sysplex;

  • Coupling Facility;

  • GDPS;

  • replicação;

  • recuperação de logs;

  • commit e rollback;

  • reinício de jobs;

  • journaling;

  • gerenciamento de workload;

existem porque sistemas bancários, governamentais e de companhias aéreas não podem simplesmente parar e aguardar alguém reiniciar o computador.

A lição é simples:

Falhar é inevitável. Falhar sem plano é opcional.


6. Ignorar estratégias de cache

Cache é uma camada de armazenamento rápido utilizada para evitar processamento ou acesso repetitivo a fontes mais lentas.

Imagine que dez mil usuários consultem a mesma tabela de códigos de países.

Sem cache, cada requisição pode acessar o banco.

Com cache, a informação pode ser lida uma vez e reutilizada.

Isso reduz:

  • latência;

  • carga no banco;

  • consumo de CPU;

  • tráfego de rede;

  • custos.

Tipos de cache

O cache pode existir:

  • no navegador;

  • na aplicação;

  • em memória;

  • em servidores como Redis;

  • em proxies;

  • em CDNs;

  • em estruturas internas do banco;

  • em subsistemas mainframe.

O lado difícil

Cache traz um problema delicado:

Como garantir que os dados não fiquem desatualizados?

Se o preço de um produto mudar no banco, quando o cache será atualizado?

Estratégias comuns incluem:

  • tempo de expiração;

  • invalidação explícita;

  • atualização após gravação;

  • leitura através do cache;

  • atualização antecipada.

Existe uma velha piada entre programadores:

Há duas coisas difíceis em computação: invalidar cache, nomear coisas e erros de contagem.

Sim, a frase diz duas coisas e lista três.

Esse é o easter egg clássico.

Cache não conserta consulta ruim

Adicionar cache sobre uma arquitetura defeituosa pode apenas esconder o problema.

Primeiro, ajuste:

  • índices;

  • consultas;

  • modelo de dados;

  • volume retornado.

Depois, utilize cache onde houver benefício real.


7. Projeto ruim de banco de dados

O banco de dados frequentemente se torna o coração e o gargalo do sistema.

Um modelo mal projetado pode causar:

  • consultas lentas;

  • duplicidade;

  • inconsistência;

  • bloqueios;

  • dificuldade de manutenção;

  • crescimento descontrolado.

Erros comuns

Falta de índices

Uma consulta por CPF em uma tabela com milhões de registros pode exigir varredura completa se não houver índice adequado.

Índices demais

Índices aceleram leitura, mas também ocupam espaço e aumentam o custo de inserções, atualizações e exclusões.

Uso indiscriminado de SELECT *

Buscar todas as colunas desperdiça:

  • I/O;

  • memória;

  • rede;

  • CPU.

Solicite apenas os dados necessários.

Tipos inadequados

Armazenar datas como texto ou valores numéricos como caracteres cria problemas de validação, ordenação e desempenho.

Ausência de integridade

Chaves primárias, estrangeiras, restrições e validações ajudam a impedir dados inválidos.

Transações longas

Uma transação aberta por muito tempo pode manter locks e afetar outros usuários.

No Db2

O programador COBOL precisa conhecer a importância de:

  • índices;

  • EXPLAIN;

  • RUNSTATS;

  • REORG;

  • planos de acesso;

  • cardinalidade;

  • commits;

  • níveis de isolamento;

  • cursores;

  • tabelas particionadas.

Um SQL correto do ponto de vista sintático pode ser desastroso do ponto de vista operacional.

A consulta retorna o resultado.

Mas talvez consuma milhões de leituras para localizar vinte linhas.

O banco não deve ser tratado como um depósito onde jogamos dados.

Ele é um motor que precisa ser modelado, observado e ajustado.


8. Ignorar segurança

Segurança não deve ser adicionada no final do projeto como um acessório.

Ela precisa acompanhar todo o ciclo de vida.

Cada atalho pode criar uma superfície de ataque.

Autenticação e autorização

Autenticação responde:

Quem é você?

Autorização responde:

O que você pode fazer?

Uma pessoa pode estar corretamente autenticada e ainda assim não possuir permissão para consultar salários, alterar limites ou excluir registros.

Princípio do menor privilégio

Cada usuário, programa ou serviço deve receber apenas as permissões necessárias.

Nada além disso.

Uma aplicação que precisa apenas consultar uma tabela não deveria ter permissão para apagá-la.

Criptografia

Dados precisam ser protegidos:

  • em trânsito;

  • em repouso;

  • durante backups;

  • em arquivos temporários;

  • em logs.

Segredos não pertencem ao código

Senhas, tokens e chaves não devem aparecer em programas ou repositórios.

Nada de:

01 WS-PASSWORD PIC X(20) VALUE 'ADMIN123'.

Além de inseguro, isso transforma qualquer troca de senha em alteração de código.

Mainframe e segurança

No IBM Z, a proteção pode envolver:

  • RACF;

  • SAF;

  • perfis de recursos;

  • MFA;

  • TLS;

  • ICSF;

  • Crypto Express;

  • auditoria SMF;

  • separação de funções.

Entretanto, possuir ferramentas poderosas não garante segurança.

Configuração incorreta, privilégios excessivos e ausência de revisão continuam sendo riscos.

Segurança é tecnologia, processo e disciplina.


9. Não ter monitoramento, logs e observabilidade

Um sistema sem monitoramento é como a Enterprise atravessando uma nebulosa com os sensores desligados.

Talvez a nave esteja bem.

Talvez esteja a segundos de uma colisão.

Sem telemetria, ninguém sabe.

Logs

Logs registram eventos importantes:

  • início e fim de processamento;

  • erros;

  • decisões;

  • identificadores;

  • mensagens recebidas;

  • duração de operações.

Um bom log precisa ser útil.

Mensagens como:

“Erro inesperado.”

ajudam muito pouco.

Melhor seria registrar:

  • operação;

  • horário;

  • módulo;

  • código do erro;

  • contexto;

  • identificador da transação.

Naturalmente, sem expor senhas ou dados sensíveis.

Métricas

Métricas mostram valores ao longo do tempo:

  • CPU;

  • memória;

  • transações por segundo;

  • tempo médio de resposta;

  • quantidade de erros;

  • tamanho de fila;

  • uso de conexões;

  • duração do batch.

Tracing

Em sistemas distribuídos, uma única operação pode atravessar diversos serviços.

Tracing permite acompanhar a jornada da requisição.

Observabilidade no mainframe

Podemos relacionar esse universo a:

  • SMF;

  • RMF;

  • OMEGAMON;

  • SDSF;

  • logs do CICS;

  • estatísticas do Db2;

  • mensagens JES;

  • registros de MQ;

  • relatórios de WLM.

O objetivo é responder:

  • O que aconteceu?

  • Quando aconteceu?

  • Onde aconteceu?

  • Qual componente foi afetado?

  • Quantos usuários sofreram impacto?

  • Qual foi a causa?

  • O problema está piorando?

Se a equipe só descobre uma falha quando o cliente telefona, o sistema não está verdadeiramente monitorado.


10. Configurações hardcoded

Hardcoding ocorre quando valores específicos de ambiente são gravados diretamente no código.

Exemplos:

  • endereço de servidor;

  • senha;

  • diretório;

  • fila;

  • porta;

  • nome de banco;

  • limite operacional;

  • e-mail;

  • URL.

Por que isso é ruim?

Porque o código fica preso ao ambiente.

Para mover de desenvolvimento para teste, talvez seja necessário alterar e recompilar.

Para trocar um servidor, nova mudança.

Para ajustar timeout, novo deploy.

Isso aumenta riscos e reduz flexibilidade.

Estratégia correta

Separar:

  • código;

  • configuração;

  • segredo.

Configurações podem ficar em:

  • arquivos externos;

  • variáveis de ambiente;

  • tabelas de parâmetros;

  • sistemas de gestão de configuração;

  • cofres de segredos;

  • propriedades de runtime.

No mundo COBOL e mainframe, essa separação também pode envolver:

  • PARM de JCL;

  • SYSIN;

  • DDs;

  • arquivos de controle;

  • tabelas Db2;

  • variáveis simbólicas;

  • parâmetros de transação.

O mesmo programa pode operar em vários ambientes sem alteração do fonte.

Essa é uma característica valiosa de sistemas bem projetados.


11. Não testar em escala realista

O notebook do desenvolvedor não é a produção.

No ambiente local:

  • há poucos dados;

  • apenas um usuário;

  • quase nenhuma concorrência;

  • rede rápida;

  • banco vazio;

  • recursos disponíveis.

Em produção:

  • milhares de usuários;

  • milhões de registros;

  • chamadas simultâneas;

  • períodos de pico;

  • integrações lentas;

  • falhas intermitentes.

Um sistema pode funcionar perfeitamente no teste funcional e colapsar sob carga.

Tipos de teste

Teste de carga

Verifica o comportamento sob volume esperado.

Teste de estresse

Aumenta a carga até localizar o limite.

Teste de pico

Simula aumento repentino de uso.

Teste de longa duração

Avalia vazamentos de memória, degradação e acúmulo de recursos.

Teste de concorrência

Identifica condições de corrida, locks e conflitos.

Teste de recuperação

Confirma se o sistema volta corretamente após falha.

Chaos Engineering

Introduz falhas controladas para verificar a resiliência.

Por exemplo:

  • derrubar uma instância;

  • atrasar uma chamada;

  • bloquear uma dependência;

  • simular perda de rede;

  • encher uma fila.

No mainframe, também é essencial testar:

  • grandes massas;

  • duração da janela batch;

  • contenção Db2;

  • transações CICS;

  • reinício de jobs;

  • checkpoints;

  • indisponibilidade de datasets;

  • falha de comunicação MQ.

Produção não deveria ser o primeiro teste de escala.

Quando isso acontece, o cliente se torna parte involuntária da equipe de QA.


12. O erro invisível: monitorar tecnologia, mas ignorar o negócio

Muitas equipes monitoram CPU, memória e disco.

Mas não sabem responder:

  • Quantos pagamentos foram processados?

  • Quantas vendas foram perdidas?

  • Quantos clientes abandonaram a operação?

  • Quantas transações falharam por regra de negócio?

  • Qual valor financeiro ficou represado?

O sistema pode estar tecnicamente saudável e ainda assim falhar na missão.

Imagine que todos os servidores estejam verdes no painel, mas uma regra errada esteja rejeitando metade dos pedidos.

A infraestrutura diz:

“Tudo normal.”

O negócio diz:

“Estamos perdendo dinheiro.”

Por isso, métricas técnicas e de negócio precisam caminhar juntas.

A ponte da Enterprise não monitora apenas o motor de dobra.

Ela também monitora destino, tripulação, missão e ameaças.


13. O custo também faz parte da arquitetura

Uma arquitetura pode funcionar e ainda assim ser inviável financeiramente.

Recursos ociosos, bancos superdimensionados, tráfego excessivo, logs sem retenção controlada e componentes desnecessários aumentam despesas.

Na nuvem, cada decisão pode gerar custo recorrente:

  • processamento;

  • armazenamento;

  • transferência;

  • chamadas;

  • serviços gerenciados;

  • licenciamento.

No mainframe, também existem questões de:

  • consumo de CPU;

  • MSU;

  • janelas;

  • classes de serviço;

  • licenças;

  • capacidade;

  • uso de processadores especializados.

Um bom arquiteto não pensa apenas:

“Funciona?”

Ele também pergunta:

“É sustentável?”

A melhor solução equilibra:

  • desempenho;

  • confiabilidade;

  • segurança;

  • simplicidade;

  • custo.


14. Um roteiro prático para projetar melhor

Aqui está um pequeno plano de missão para o Programador COBOL Padawan.

Etapa 1 — Compreenda o problema

Converse com usuários e responsáveis pelo negócio.

Evite começar pela tecnologia.

Etapa 2 — Levante requisitos funcionais

Liste as operações que o sistema deverá executar.

Etapa 3 — Levante requisitos não funcionais

Defina:

  • desempenho;

  • volume;

  • disponibilidade;

  • segurança;

  • recuperação;

  • auditoria.

Etapa 4 — Identifique dados e integrações

Pergunte:

  • De onde os dados vêm?

  • Onde serão armazenados?

  • Quem poderá acessá-los?

  • Quais sistemas dependem deles?

Etapa 5 — Desenhe uma solução simples

Comece com a menor arquitetura capaz de atender aos requisitos.

Etapa 6 — Mapeie pontos de falha

Para cada componente, pergunte:

“O que acontece se ele parar?”

Etapa 7 — Planeje observabilidade

Defina logs, métricas, alertas e painéis antes da produção.

Etapa 8 — Separe configuração do código

Prepare a solução para múltiplos ambientes.

Etapa 9 — Teste com volume realista

Não teste apenas o caminho feliz.

Etapa 10 — Revise segurança

Aplique menor privilégio, criptografia e auditoria.

Etapa 11 — Documente decisões

Registre por que determinada alternativa foi escolhida.

Isso evita que, anos depois, alguém veja uma solução estranha e a substitua sem compreender o contexto.

Etapa 12 — Evolua gradualmente

Arquitetura não é um monumento congelado.

Ela deve ser revisada conforme o negócio e a tecnologia evoluem.


15. Curiosidades da sala de máquinas

Curiosidade 1 — Mainframes já faziam “cloud” antes do nome existir

Compartilhamento de recursos, virtualização, isolamento e gerenciamento centralizado são práticas antigas no mainframe.

O termo mudou.

Muitos princípios permaneceram.

Curiosidade 2 — Filas não são novidade

Mensageria assíncrona parece moderna, mas sistemas corporativos utilizam filas e processamento desacoplado há décadas.

IBM MQ é um exemplo clássico dessa filosofia.

Curiosidade 3 — O batch continua vivo

Mesmo com APIs e eventos, processamento batch continua essencial para:

  • fechamento financeiro;

  • faturamento;

  • conciliação;

  • geração de relatórios;

  • tratamento de grandes volumes.

A diferença é que batch moderno pode ser integrado a pipelines, APIs e eventos.

Curiosidade 4 — Simplicidade exige experiência

Criar algo complicado é relativamente fácil.

Criar uma solução simples que atenda aos requisitos exige entendimento profundo.

É como a ponte da Enterprise: o painel parece organizado porque uma enorme complexidade foi cuidadosamente controlada abaixo do convés.


16. Easter egg da Frota Estelar

Em muitos episódios de Star Trek, a Enterprise encontra tecnologias extremamente poderosas construídas por civilizações avançadas.

Entretanto, o perigo raramente está apenas na tecnologia.

O problema aparece quando:

  • ninguém compreende os limites;

  • não existem controles;

  • a tripulação ignora sinais;

  • alguém tenta obter poder rapidamente;

  • uma falha pequena se propaga.

Isso é System Design.

Uma arquitetura sofisticada sem compreensão pode ser mais perigosa que uma solução simples.

O melhor oficial de engenharia não é aquele que instala mais componentes.

É aquele que mantém a nave funcionando, conhece seus limites e sabe exatamente o que fazer quando uma luz vermelha aparece no painel.

Como diria Montgomery Scott em espírito:

Você não pode mudar as leis da física, capitão.

Na engenharia de software, também não podemos ignorar:

  • latência;

  • concorrência;

  • falhas;

  • volume;

  • capacidade;

  • custo.

Podemos administrá-los.

Nunca eliminá-los por decreto.


Conclusão — O sistema não quebra de repente

Os grandes problemas arquiteturais raramente chegam anunciados.

Eles crescem silenciosamente.

Uma consulta sem índice parece inofensiva enquanto a tabela é pequena.

Uma configuração hardcoded parece conveniente enquanto existe apenas um ambiente.

A ausência de cache não incomoda enquanto há poucos usuários.

A falta de logs passa despercebida enquanto nada falha.

A inexistência de failover parece aceitável enquanto o servidor está funcionando.

Depois, um dia, tudo converge.

O tráfego aumenta.

O banco fica lento.

A aplicação gera timeout.

Os retries sobrecarregam ainda mais o sistema.

A fila cresce.

Os logs são insuficientes.

A equipe não consegue identificar a causa.

A direção pede uma previsão.

O cliente reclama.

E alguém diz:

“Precisamos reescrever tudo.”

Na realidade, o desastre começou meses ou anos antes, em pequenas decisões que pareciam não ter importância.

O verdadeiro objetivo de System Design não é criar diagramas bonitos nem utilizar todas as tecnologias da moda.

É construir sistemas capazes de:

  • cumprir sua missão;

  • resistir a falhas;

  • crescer com controle;

  • proteger dados;

  • ser observados;

  • ser mantidos;

  • evoluir sem caos.

Para o Programador COBOL Padawan, compreender arquitetura é o passo que transforma alguém que apenas escreve programas em um profissional que entende sistemas.

O COBOL pode processar a regra.

O JCL pode executar o job.

O Db2 pode armazenar os dados.

O CICS pode receber a transação.

O MQ pode transportar a mensagem.

Mas é o projeto de sistemas que faz todas essas partes trabalharem juntas.

Na Frota Estelar, uma nave não é apenas o motor de dobra.

É a combinação de propulsão, sensores, escudos, comunicação, suporte à vida, segurança, comando e uma tripulação treinada.

No mundo corporativo, a arquitetura também depende de integração, observabilidade, resiliência, dados, processos e pessoas.

Antes de liberar a próxima versão, pare diante do painel e faça a pergunta mais importante:

“Estamos construindo apenas algo que funciona hoje, ou um sistema capaz de sobreviver à missão de amanhã?”

Porque o melhor sistema não é aquele que nunca falha.

É aquele que foi projetado para continuar sua jornada quando o inesperado inevitavelmente aparecer no horizonte.

Vida longa e próspera aos seus programas, aos seus jobs e às suas arquiteturas.