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

Translate

Mostrar mensagens com a etiqueta história da TI. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta história da TI. Mostrar todas as mensagens

domingo, 18 de junho de 2023

☕ Um Café no Bellacosa Mainframe Edgar “Ted” Codd Toma Chá no Condado — O Dia em que os Dados Abandonaram o Labirinto, Aprenderam SQL e Descobriram que até uma Elegante Tabela Precisa de COMMIT

 

Bellacosa Mainframe apresenta Codd Db2 SQL e banco de dados relacional

☕ Um Café no Bellacosa Mainframe

Edgar “Ted” Codd Toma Chá no Condado — O Dia em que os Dados Abandonaram o Labirinto, Aprenderam SQL e Descobriram que até uma Elegante Tabela Precisa de COMMIT

Ou: como o modelo relacional libertou o programador dos ponteiros, por que o Db2 não inventou tudo sozinho, o que ACID realmente significa e por que um SELECT * continua sendo falta de educação até numa confortável poltrona inglesa



Prólogo — Chá, biscoitos e um arquivo sequencial com 40 milhões de registros

Chovia delicadamente sobre um condado inglês cujo nome ninguém no CPD conseguia pronunciar corretamente.

Dentro de uma antiga casa de campo, Edgar Frank “Ted” Codd estava acomodado numa confortável poltrona de couro, diante de uma lareira acesa. Sobre a pequena mesa repousavam um bule de chá, biscoitos amanteigados, algumas folhas cobertas por símbolos matemáticos e, por algum acidente temporal que jamais seria explicado, um terminal 3270 conectado a um mainframe IBM.

Do outro lado da sala, um jovem programador COBOL examinava uma solicitação enviada pela Diretoria:

“Precisamos saber quantos clientes de cada cidade realizaram compras superiores a dez mil moedas nos últimos seis meses.”

O iniciante respirou fundo.

Abriu o arquivo mestre de clientes.

Abriu o arquivo de transações.

Procurou o copybook.

Descobriu que existiam quatro versões do copybook.

Uma estava num PDS chamado OLD.

Outra estava num PDS chamado OLD.BKP.

A terceira terminava com .NEW.

A quarta se chamava DEFINITIVA, o que, em ambientes corporativos, normalmente significa que não é definitiva.

— Vou precisar escrever um programa, classificar os registros, fazer um MATCH, gerar um arquivo intermediário e depois produzir o relatório — explicou o programador. — Talvez fique pronto na próxima semana.

Codd mexeu calmamente o chá.

— E se você pudesse apenas declarar qual resultado deseja?

O jovem olhou para o terminal.

— Sem dizer ao computador como percorrer cada arquivo?

— Exatamente.

— Isso parece magia.

Codd colocou o pires sobre a mesa.

— Não é magia. É matemática com um bom otimizador.

Naquele instante, em algum lugar do tempo, um gerente enviou uma mensagem dizendo que a alteração era pequena.

A chuva ficou mais forte.



1. Antes do banco relacional, os dados não viviam em cavernas

Contar essa história dizendo que, antes do modelo relacional, as empresas administravam seus dados como se usassem fichas de papel é uma boa imagem literária, mas uma explicação histórica incompleta.

As décadas de 1960 e 1970 já possuíam sistemas sofisticados de gerenciamento de dados. Empresas processavam folhas de pagamento, reservas de passagens, contas bancárias, estoques e milhões de transações sem usar SQL.

Um dos exemplos mais importantes é o IMS, o Information Management System da IBM. Ele nasceu no contexto do programa Apollo e tornou-se um dos grandes bancos de dados corporativos do mainframe.

O IMS trabalha com uma estrutura hierárquica. Para um iniciante, podemos imaginá-la como uma árvore:

CLIENTE
├── CONTA
│   ├── SALDO
│   └── LANÇAMENTO
└── CARTÃO
    ├── FATURA
    └── COMPRA

Para encontrar uma compra, a aplicação normalmente navega por um caminho previamente conhecido:

CLIENTE → CARTÃO → FATURA → COMPRA

Esse modelo pode ser extremamente rápido. Se o caminho estiver bem definido e a aplicação souber exatamente aonde deseja chegar, a navegação é eficiente.

O problema aparece quando o negócio formula uma pergunta que não combina com os caminhos existentes.

Imagine que a empresa tenha organizado os dados para consultar todas as compras de determinado cliente. Depois, a Diretoria pergunta:

“Quais produtos foram comprados por clientes de três cidades diferentes durante uma promoção específica?”

Talvez essa navegação não tenha sido prevista.

Nesse caso, poderia ser necessário:

  • escrever um novo programa;

  • navegar por diferentes segmentos;

  • extrair informações para um arquivo;

  • ordenar os registros;

  • combinar arquivos;

  • criar índices adicionais;

  • executar um batch;

  • produzir um relatório;

  • esperar a janela de processamento.

O problema não era falta de inteligência dos programadores antigos. Muito pelo contrário: eles realizavam trabalhos extraordinários com memória, CPU e armazenamento limitados.

O problema era o acoplamento entre a pergunta, a estrutura lógica dos dados e o caminho físico utilizado para encontrá-los.

O programa precisava saber não apenas o que procurar, mas como chegar até lá.



2. Codd não queria apenas inventar uma tabela bonita

Edgar Frank Codd, conhecido como Ted Codd, era matemático e pesquisador da IBM. Em 1970, publicou o artigo:

A Relational Model of Data for Large Shared Data Banks.

Esse trabalho se tornou uma das bases mais importantes da computação moderna.

É comum resumir sua contribuição assim:

“Codd organizou os dados em tabelas com linhas e colunas.”

Não está errado, mas é semelhante a dizer que Alan Turing “trabalhava com fitas”. A descrição mostra a superfície e esconde a revolução.

Codd desejava criar uma fronteira clara entre:

  • a representação lógica dos dados;

  • a forma de consultá-los;

  • sua organização física dentro da máquina.

Em outras palavras, ele queria proteger o usuário e o programador da obrigação de conhecer todos os detalhes internos de armazenamento.

Antes, a aplicação podia precisar dizer:

“Comece pelo registro mestre, siga este ponteiro, abra aquele conjunto, leia o próximo segmento e continue até encontrar o código desejado.”

No modelo relacional, a aplicação poderia declarar:

SELECT NOME, SALDO
FROM CONTA
WHERE SALDO < 0;

A pergunta descreve o resultado. Ela não determina detalhadamente o caminho físico.

Essa é a grande virada:

Modelo navegacional:
“Explique por onde devo caminhar.”

Modelo relacional:
“Explique qual resultado deseja.”

O banco de dados recebe a responsabilidade de descobrir uma estratégia adequada.

Codd não estava apenas organizando registros. Ele estava propondo independência de dados.


3. Relação, tupla e atributo: a matemática entrou no CPD

Uma relação pode ser apresentada ao iniciante como uma tabela:

CONTACLIENTEAGÊNCIASALDO
1001Ana1205.500,00
1002Bruno120-320,00
1003Carla450810,00

Na linguagem formal:

  • a tabela corresponde aproximadamente a uma relação;

  • cada linha é uma tupla;

  • cada coluna é um atributo;

  • o conjunto de valores permitidos para um atributo é seu domínio;

  • uma chave identifica uma tupla;

  • as restrições protegem a integridade dos dados.

Por que usamos “aproximadamente”?

Porque uma relação matemática não é simplesmente uma planilha. Ela possui propriedades formais. Não depende visualmente da ordem das linhas, não deveria conter tuplas duplicadas e representa um conjunto de fatos.

Considere:

SELECT CLIENTE, SALDO
FROM CONTA
WHERE SALDO < 0;

Em linguagem humana, estamos pedindo:

“Forme uma relação contendo cliente e saldo para as tuplas nas quais o saldo seja negativo.”

Podemos combinar relações:

SELECT C.NOME,
       P.NUMERO_PEDIDO,
       P.VALOR
FROM CLIENTE C
JOIN PEDIDO P
  ON P.ID_CLIENTE = C.ID_CLIENTE
WHERE P.VALOR > 10000;

O JOIN não manda o computador seguir obrigatoriamente um ponteiro físico entre dois registros. Ele declara a condição lógica que relaciona as informações:

P.ID_CLIENTE = C.ID_CLIENTE

O sistema pode escolher diferentes estratégias para produzir o resultado.

O programador passou a pensar mais sobre conjuntos, predicados e resultados — e menos sobre o endereço físico do próximo registro.

Isso não eliminou a necessidade de compreender arquivos, páginas, índices ou buffers. Apenas mudou quem deve decidir cada detalhe e em qual momento.


4. System R: quando a teoria precisou funcionar fora da poltrona

Uma teoria pode ser elegante enquanto toma chá ao lado da lareira. O problema começa quando alguém pede que ela processe a folha de pagamento.

Após o trabalho de Codd, a IBM iniciou o projeto System R em seu laboratório de San Jose. O objetivo era descobrir se um sistema relacional poderia ser construído de forma prática e com desempenho aceitável.

A pergunta era séria.

Muitos especialistas acreditavam que a flexibilidade do modelo relacional teria um custo alto demais. Um sistema navegacional já conhecia seus caminhos. Um banco relacional teria de receber uma pergunta abstrata e descobrir como executá-la.

O System R demonstrou que isso era possível.

O projeto trabalhou com conceitos que se tornariam fundamentais:

  • linguagem declarativa;

  • catálogo de metadados;

  • índices;

  • transações;

  • controle de concorrência;

  • recuperação;

  • autorização;

  • views;

  • compilação de consultas;

  • otimização baseada em custo;

  • escolha automática de caminhos de acesso.

O System R não foi simplesmente “o primeiro Db2”. Era um projeto experimental, uma oficina na qual muitas ideias foram construídas, testadas, descartadas ou aperfeiçoadas.

Seu valor histórico está em provar que o modelo relacional não era apenas uma bela teoria matemática. Poderia sustentar trabalho comercial de verdade.

Codd desenhou o mapa.

O System R colocou botas, capa de chuva e saiu para verificar se a estrada existia.


5. SEQUEL: o dia em que a consulta tentou falar inglês

Donald Chamberlin e Raymond Boyce desenvolveram uma linguagem para trabalhar com o System R. Inicialmente, ela foi chamada SEQUEL, de Structured English Query Language.

Mais tarde, o nome foi reduzido para SQL, Structured Query Language.

Isso explica por que algumas pessoas pronunciam “és-quiú-él” e outras dizem “sequel”. As duas pronúncias carregam pedaços da história.

Veja esta consulta:

SELECT NOME
FROM FUNCIONARIO
WHERE DEPARTAMENTO = 'CONTABILIDADE';

Ela se aproxima de uma frase em inglês:

Selecione o nome do funcionário onde o departamento seja Contabilidade.

Não é linguagem natural. Não podemos conversar livremente com o banco como se ele fosse Jeeves, o mordomo da casa de campo. Porém, comparado às interfaces de baixo nível, era uma enorme aproximação da linguagem utilizada pelas pessoas.

O SQL é declarativo.

Você informa o que deseja, não necessariamente como executar.

Compare dois pensamentos.

Pensamento navegacional

  1. Abra o arquivo de funcionários.

  2. Leia o primeiro registro.

  3. Verifique o departamento.

  4. Se for Contabilidade, grave o nome.

  5. Leia o próximo registro.

  6. Repita até o fim.

Pensamento relacional

SELECT NOME
FROM FUNCIONARIO
WHERE DEPARTAMENTO = 'CONTABILIDADE';

Parece simples porque alguém colocou uma enorme quantidade de engenharia atrás dessa simplicidade.


6. O otimizador: o mordomo invisível da mansão

O SQL diz o que queremos. Mas alguém ainda precisa decidir como encontrar o resultado.

Esse alguém é o otimizador.

Imagine duas tabelas:

CLIENTE     20 milhões de linhas
TRANSACAO    4 bilhões de linhas

Agora execute:

SELECT C.NOME,
       SUM(T.VALOR)
FROM CLIENTE C
JOIN TRANSACAO T
  ON T.ID_CLIENTE = C.ID_CLIENTE
WHERE C.CIDADE = 'ITATIBA'
GROUP BY C.NOME;

Existem várias estratégias possíveis:

  • ler todos os clientes;

  • usar um índice sobre cidade;

  • começar pelas transações;

  • começar pelos clientes selecionados;

  • usar um nested-loop join;

  • classificar valores;

  • utilizar paralelismo;

  • ler antecipadamente páginas;

  • empregar um índice composto;

  • criar resultados intermediários.

O otimizador examina informações como:

  • número estimado de linhas;

  • quantidade de páginas;

  • distribuição dos valores;

  • seletividade;

  • índices disponíveis;

  • organização dos objetos;

  • custos estimados de CPU e entrada/saída;

  • possibilidade de paralelismo;

  • ordem das tabelas no JOIN.

Patricia Selinger e a equipe do System R tiveram papel decisivo na criação da otimização baseada em custo.

O otimizador é como um mordomo inglês eficiente. O visitante diz:

“Gostaria de chá.”

Ele não precisa explicar:

  1. em qual armário está o bule;

  2. qual torneira fornece água;

  3. quanto tempo a água deve ser aquecida;

  4. onde ficam as xícaras;

  5. qual bandeja deve ser usada.

O mordomo escolhe o caminho.

Mas, se as informações estiverem erradas, talvez ele procure o chá na biblioteca e encontre apenas uma instalação antiga do IMS.

No Db2, estatísticas desatualizadas podem levar o otimizador a tomar decisões inadequadas. É por isso que existem utilitários e atividades como:

  • RUNSTATS;

  • REORG;

  • EXPLAIN;

  • manutenção de índices;

  • análise do access path.

O SQL esconde detalhes. Ele não apaga as consequências físicas.


7. Db2: quando o modelo relacional entrou no MVS

Em 1983, a IBM lançou o Database 2, depois grafado Db2, para o ambiente MVS nos mainframes.

Às vezes se afirma que o Db2 foi o primeiro banco de dados relacional comercial. Isso não é correto.

Antes dele:

  • a IBM já havia lançado o SQL/DS;

  • a Oracle já comercializava um banco relacional;

  • o Ingres também participava dessa história.

O Db2 não precisa receber um troféu que pertence a uma história mais coletiva. Sua realização real já é gigantesca.

Ele levou a tecnologia relacional ao centro de ambientes MVS com exigências corporativas severas:

  • grande volume de dados;

  • muitas aplicações concorrentes;

  • processamento batch;

  • transações online;

  • recuperação;

  • segurança;

  • disponibilidade;

  • integridade;

  • auditoria;

  • compatibilidade;

  • administração centralizada.

O Db2 ajudou a demonstrar que uma base relacional podia cuidar de contas bancárias, reservas, pedidos, faturas e estoques sem desmaiar quando o laboratório se transformasse em produção.

Existe uma diferença enorme entre executar uma consulta numa demonstração e manter milhares de transações trabalhando enquanto o fechamento contábil, o CICS e o batch disputam recursos.

O mainframe foi a forja porque as ideias precisaram sobreviver ao mundo real.


8. ACID: não foi inventado pelo Db2, mas encontrou nele uma casa respeitável

Uma imprecisão comum é afirmar que o Db2 criou as propriedades ACID.

Os conceitos transacionais foram desenvolvidos durante vários anos e apareceram em sistemas anteriores. A formulação clássica do acrônimo ACID foi consolidada por Theo Härder e Andreas Reuter num importante artigo publicado também em 1983.

O Db2 não inventou sozinho o ACID. Entretanto, colocou essas propriedades em prática em um dos ambientes empresariais mais exigentes do mundo.

ACID significa:

  • Atomicidade;

  • Consistência;

  • Isolamento;

  • Durabilidade.

Vamos visitar cada cômodo da mansão.


8.1 Atomicidade — não existe meia transferência

Considere:

UPDATE CONTA
   SET SALDO = SALDO - 500
 WHERE NUMERO = 1001;

UPDATE CONTA
   SET SALDO = SALDO + 500
 WHERE NUMERO = 2002;

COMMIT;

A transação possui duas atualizações:

  1. retirar 500 da primeira conta;

  2. acrescentar 500 à segunda.

Se o sistema executar somente o débito, teremos uma transferência pela metade.

Atomicidade significa que a unidade lógica é indivisível:

  • tudo acontece;

  • ou nada permanece.

Se uma etapa falhar antes da confirmação, o sistema deve desfazer o trabalho incompleto com ROLLBACK.

Atomicidade não significa que a transação seja pequena ou instantânea. Significa que seus efeitos são considerados como uma unidade.


8.2 Consistência — o banco não pode sair pela janela usando pantufas

Uma transação deve conduzir o banco de um estado válido para outro estado válido.

Algumas regras podem ser expressas pelo próprio banco:

SALDO DECIMAL(15,2) NOT NULL

Uma chave estrangeira pode impedir a existência de uma conta associada a um cliente inexistente. Uma constraint pode impedir determinado valor proibido. Uma chave primária pode evitar duplicidade.

Mas o SGBD não conhece telepaticamente todas as regras do negócio.

A empresa precisa definir:

  • constraints;

  • validações;

  • regras na aplicação;

  • triggers, quando apropriadas;

  • políticas de integridade;

  • tratamento de erros.

Se o negócio determina que um cliente menor de idade não pode contratar certo produto, alguém precisa transformar essa regra numa proteção técnica.

O Db2 protege aquilo que foi corretamente especificado. Ele não possui bola de cristal, embora alguns planos de execução pareçam ter sido escritos por Nostradamus.


8.3 Isolamento — dois caixas e o último saldo disponível

Imagine uma conta com saldo de 500.

Dois terminais consultam o valor quase simultaneamente:

Terminal A lê: 500
Terminal B lê: 500

O Terminal A tenta sacar 500.

O Terminal B também tenta sacar 500.

Sem controle adequado, ambos poderiam acreditar que o dinheiro está disponível.

Isolamento controla a interferência entre transações concorrentes.

No Db2, o programador precisa conhecer conceitos como:

  • locks;

  • timeout;

  • deadlock;

  • cursor stability;

  • read stability;

  • repeatable read;

  • uncommitted read;

  • WITH UR;

  • unidade de trabalho.

Isolamento demais pode produzir contenção. Isolamento de menos pode permitir comportamentos indesejáveis.

A escolha correta depende do negócio.

Uma consulta estatística talvez tolere uma leitura ainda não confirmada. Uma movimentação financeira normalmente exige proteções muito mais rigorosas.

Colocar WITH UR em tudo porque “fica mais rápido” é como remover as fechaduras da casa para economizar tempo ao entrar.


8.4 Durabilidade — depois do COMMIT, acabou a poesia

Quando o sistema informa que uma transação foi confirmada, seu resultado precisa sobreviver a falhas.

Se o cliente concluiu um pagamento e recebeu a confirmação, o banco não pode reiniciar e responder:

“Pedimos desculpas. O seu pagamento era apenas uma experiência temporária em memória.”

Logs, checkpoints e mecanismos de recuperação ajudam a fornecer durabilidade.

O COMMIT representa uma fronteira importante. Antes dele, o trabalho pode ser desfeito. Depois dele, o resultado confirmado precisa permanecer.

Por isso a frase merece ser gravada no pires de todo programador iniciante:

COMMIT não é pontuação estética. É uma decisão de negócio.

Um COMMIT cedo demais pode quebrar a atomicidade de uma operação maior. Um COMMIT tarde demais pode manter recursos e locks durante muito tempo.


9. Quando o SQL encontra o COBOL

O SQL não substituiu automaticamente o COBOL. No mainframe, eles frequentemente trabalham juntos.

Um programa pode conter SQL embutido:

       EXEC SQL
           SELECT NOME,
                  SALDO
             INTO :WS-NOME,
                  :WS-SALDO
             FROM CONTA
            WHERE NUMERO_CONTA = :WS-NUMERO-CONTA
       END-EXEC.

Observe as variáveis precedidas por dois-pontos:

:WS-NOME
:WS-SALDO
:WS-NUMERO-CONTA

São host variables: campos do programa COBOL utilizados para trocar valores com o Db2.

O compilador COBOL, sozinho, não entende toda a instrução SQL. Existe um processo que pode envolver:

  1. preparação do fonte;

  2. precompilação das instruções SQL;

  3. criação do DBRM;

  4. compilação COBOL;

  5. link-edit;

  6. BIND do DBRM em um package;

  7. eventual ligação do package a uma collection ou plan;

  8. execução.

O programa também precisa tratar resultados:

       EVALUATE SQLCODE
           WHEN 0
               CONTINUE
           WHEN +100
               DISPLAY 'CONTA NAO ENCONTRADA'
           WHEN OTHER
               DISPLAY 'ERRO SQL: ' SQLCODE
       END-EVALUATE

Para o iniciante:

  • SQLCODE = 0 normalmente indica sucesso;

  • SQLCODE = +100 normalmente indica que nenhuma linha foi encontrada ou que o cursor chegou ao fim;

  • SQLCODE negativo indica erro;

  • SQLSTATE fornece uma representação padronizada da condição.

Ignorar o SQLCODE porque o programa compilou é como ignorar o alarme de incêndio porque a campainha possui uma melodia agradável.


10. Consulta única e cursor: chá para um ou banquete para muitos

Se uma consulta deve retornar apenas uma linha, podemos usar SELECT ... INTO.

Mas, quando várias linhas podem ser retornadas, normalmente utilizamos um cursor.

Exemplo conceitual:

       EXEC SQL
           DECLARE C1 CURSOR FOR
               SELECT NOME,
                      SALDO
                 FROM CONTA
                WHERE AGENCIA = :WS-AGENCIA
                ORDER BY NOME
       END-EXEC.

Depois:

       EXEC SQL
           OPEN C1
       END-EXEC.

A aplicação busca cada linha:

       EXEC SQL
           FETCH C1
            INTO :WS-NOME,
                 :WS-SALDO
       END-EXEC.

Ao final:

       EXEC SQL
           CLOSE C1
       END-EXEC.

O fluxo é:

DECLARE → OPEN → FETCH → FETCH → FETCH → CLOSE

O cursor é semelhante a uma lista preparada pelo mordomo. O programa não recebe necessariamente todos os convidados de uma vez; solicita o próximo nome conforme avança.

É preciso tratar corretamente o SQLCODE +100, pois ele indica o fim do conjunto de resultados.


11. SELECT *: a bandeja grande demais

O comando abaixo é conveniente:

SELECT *
FROM CLIENTE
WHERE CPF = :WS-CPF;

Entretanto, em aplicações, ele pode ser uma má escolha.

Problemas possíveis:

  • recupera colunas desnecessárias;

  • aumenta o tráfego interno;

  • cria dependência da estrutura da tabela;

  • reduz a clareza;

  • pode prejudicar estratégias envolvendo índices;

  • dificulta manutenção;

  • pode surpreender quando a tabela recebe novas colunas.

Prefira declarar o necessário:

SELECT NOME,
       DATA_NASCIMENTO,
       SITUACAO
FROM CLIENTE
WHERE CPF = :WS-CPF;

No chá inglês, ninguém pede:

“Traga tudo o que houver na cozinha.”

Pede-se chá, leite, açúcar e dois biscoitos.

O mesmo princípio vale para o Db2.


12. O catálogo: quando o banco aprendeu a falar sobre si próprio

Um banco relacional não armazena somente dados de clientes, contas e produtos. Ele também guarda metadados, ou seja, dados sobre os próprios dados.

O catálogo contém informações sobre:

  • tabelas;

  • colunas;

  • tipos;

  • índices;

  • views;

  • packages;

  • privilégios;

  • tablespaces;

  • dependências;

  • estatísticas.

Isso permite responder a perguntas administrativas:

  • Quais colunas existem?

  • Qual índice atende esta tabela?

  • Quem possui determinada autorização?

  • Quais packages dependem deste objeto?

  • Quando as estatísticas foram atualizadas?

  • Qual é a cardinalidade estimada?

  • Que objetos podem ser afetados por uma alteração?

O catálogo transformou o banco num sistema capaz de descrever a própria estrutura.

Ferramentas modernas de governança, geração de código, descoberta de dados e administração continuam explorando esse princípio.

O banco de dados ganhou um espelho — e, como todo sistema antigo, às vezes não gostou do que viu depois de quinze anos sem RUNSTATS.


13. Passo a passo para o iniciante pensar como Codd sem esquecer que trabalha no CPD

Passo 1 — Entenda a pergunta de negócio

Antes de escrever SQL, descubra:

  • o que precisa ser retornado;

  • qual é o período;

  • quais filtros se aplicam;

  • quantas linhas são esperadas;

  • se duplicidades são permitidas;

  • qual precisão é necessária;

  • se a consulta apenas lê ou também altera dados.

Uma consulta tecnicamente perfeita pode responder à pergunta errada.

Passo 2 — Identifique as relações necessárias

Pergunte:

  • Em qual tabela está o cliente?

  • Onde estão as contas?

  • Como as tabelas se relacionam?

  • Qual coluna representa a chave?

  • Existe histórico?

  • Uma conta pode ter mais de um titular?

Não invente relacionamentos observando nomes parecidos.

COD-CLI e ID-CLIENTE podem representar a mesma coisa — ou podem ser duas entidades distintas criadas depois de uma aquisição em 1997.

Passo 3 — Escreva o resultado mínimo

Evite buscar dados que não serão utilizados.

SELECT C.NOME,
       SUM(T.VALOR)
FROM CLIENTE C
JOIN TRANSACAO T
  ON T.ID_CLIENTE = C.ID_CLIENTE
WHERE T.DATA_TRANSACAO BETWEEN :WS-DATA-INICIAL
                           AND :WS-DATA-FINAL
GROUP BY C.NOME;

Passo 4 — Teste casos normais e extremos

Teste:

  • nenhuma linha;

  • uma linha;

  • várias linhas;

  • valores nulos;

  • duplicidades;

  • datas-limite;

  • valores máximos;

  • caracteres especiais;

  • condições de erro.

Passo 5 — Examine o caminho de acesso

Use EXPLAIN e ferramentas disponíveis no ambiente.

Descubra:

  • se o índice foi utilizado;

  • se houve tablespace scan;

  • qual foi a ordem do join;

  • qual cardinalidade foi estimada;

  • se as estatísticas estão atualizadas.

Passo 6 — Planeje a unidade de trabalho

Determine:

  • onde começa a transação;

  • onde ocorre o COMMIT;

  • quando executar ROLLBACK;

  • quais recursos permanecem bloqueados;

  • o que fazer em caso de deadlock ou timeout.

Passo 7 — Trate todos os retornos

Não trate apenas o caminho feliz.

Um programa de produção precisa saber responder a:

  • linha inexistente;

  • duplicidade inesperada;

  • violação de integridade;

  • indisponibilidade;

  • deadlock;

  • timeout;

  • erro de autorização;

  • falha no package;

  • dado incompatível com a host variable.

Passo 8 — Meça

Não declare que a consulta está rápida porque funcionou com dez linhas no ambiente de desenvolvimento.

Produção pode possuir:

  • bilhões de linhas;

  • concorrência;

  • cache diferente;

  • estatísticas diferentes;

  • índices diferentes;

  • distribuição desigual;

  • cargas batch simultâneas.

O laboratório é uma xícara. A produção é o oceano onde o bule caiu.


14. O que PostgreSQL, Oracle, SQL Server, MySQL e Snowflake herdaram

Quando usamos SQL nesses produtos, estamos trabalhando com ideias cuja genealogia passa por Codd, System R e SEQUEL.

A herança inclui:

  • relações;

  • tabelas;

  • linhas e colunas;

  • chaves;

  • joins;

  • constraints;

  • views;

  • consultas declarativas;

  • catálogos;

  • transações;

  • otimizadores.

Isso não significa que todos sejam cópias do Db2.

Cada produto possui sua história, arquitetura e implementação:

  • PostgreSQL descende do projeto POSTGRES;

  • Oracle criou sua própria linha comercial;

  • Microsoft SQL Server desenvolveu seu próprio ecossistema;

  • MySQL adotou motores e escolhas particulares;

  • Snowflake utiliza SQL sobre uma arquitetura distribuída orientada à nuvem.

A herança é conceitual e linguística. Não é necessariamente uma linhagem direta de código-fonte.

É semelhante ao latim: português, espanhol, italiano e francês compartilham raízes, mas não são o mesmo idioma nem funcionam de maneira idêntica.

Codd ajudou a criar a gramática intelectual. Diferentes empresas construíram suas próprias cidades sobre esse território.


15. O mainframe é realmente a fonte de todas as tecnologias?

A frase “The Fountain From Which All Other Technologies Flow” é uma excelente provocação, mas deve ser tratada como metáfora.

Nem tudo nasceu no mainframe.

A computação moderna também recebeu contribuições decisivas de:

  • universidades;

  • laboratórios governamentais;

  • empresas concorrentes;

  • sistemas Unix;

  • redes acadêmicas;

  • computadores pessoais;

  • projetos de código aberto;

  • telecomunicações;

  • centros de pesquisa internacionais.

Entretanto, o mainframe foi uma das grandes forjas da computação empresarial.

Foi nele que muitas ideias precisaram aprender a conviver com:

  • dinheiro real;

  • milhares de usuários;

  • auditoria;

  • falhas;

  • concorrência;

  • segurança;

  • processamento contínuo;

  • compatibilidade por décadas;

  • consequências jurídicas e financeiras.

No laboratório, uma falha produz um relatório.

Num banco, ela pode produzir um saldo incorreto.

Numa companhia aérea, pode vender o mesmo assento duas vezes.

No varejo, pode reduzir o estoque sem confirmar a venda.

O mainframe ensinou uma lição que retorna em todas as gerações tecnológicas:

Uma tecnologia não está madura apenas quando funciona. Ela está madura quando falha de maneira controlada, recupera-se corretamente e preserva aquilo que já havia confirmado.


Epílogo — O último COMMIT antes da chuva parar

O jovem programador COBOL terminou sua consulta:

SELECT C.CIDADE,
       COUNT(DISTINCT C.ID_CLIENTE) AS CLIENTES,
       SUM(P.VALOR) AS VALOR_TOTAL
FROM CLIENTE C
JOIN PEDIDO P
  ON P.ID_CLIENTE = C.ID_CLIENTE
WHERE P.DATA_PEDIDO >= :WS-DATA-LIMITE
  AND P.VALOR > 10000
GROUP BY C.CIDADE
ORDER BY VALOR_TOTAL DESC;

Codd observou a tela.

— Muito melhor — disse ele.

— Então não preciso mais conhecer arquivos, índices, buffers, locks ou caminhos de acesso?

Codd interrompeu a xícara antes que ela tocasse os lábios.

O silêncio tomou a sala.

Até o terminal 3270 pareceu escurecer.

— Meu jovem, eu lhe dei independência de dados. Não lhe dei licença para ignorar o computador.

O programador abriu o EXPLAIN.

Descobriu um tablespace scan sobre bilhões de linhas.

As estatísticas estavam desatualizadas.

O índice que todos juravam existir havia sido removido durante uma mudança emergencial três anos antes.

No catálogo, o responsável pela alteração aparecia como USER01.

Ninguém conhecia USER01.

Na lareira, uma chama assumiu por um instante a forma de uma mensagem:

DSNT408I SQLCODE = -911

Era o easter egg deixado pelo fantasma de uma transação vítima de deadlock.

Depois de corrigir a consulta, atualizar as estatísticas e testar a unidade de trabalho, o jovem executou novamente o programa.

O relatório apareceu.

Os saldos permaneceram corretos.

O COMMIT foi realizado no momento adequado.

Codd finalmente bebeu o chá.


Conclusão — Os dados não aprenderam apenas uma linguagem

Edgar F. Codd não inventou simplesmente uma maneira conveniente de desenhar tabelas. Ele ajudou a mudar a relação entre pessoas, programas e dados.

O modelo relacional ofereceu:

  • independência entre lógica e armazenamento;

  • uma base matemática;

  • operações sobre conjuntos;

  • consultas declarativas;

  • maior flexibilidade para formular novas perguntas;

  • um terreno comum para linguagens como SQL.

O System R demonstrou que a teoria poderia funcionar.

SEQUEL, depois SQL, deu aos dados uma linguagem declarativa.

O SQL/DS iniciou a transformação em produto dentro da IBM.

O Db2 levou essa herança ao coração do MVS e das cargas empresariais críticas.

O mainframe submeteu tudo à pressão de bancos, companhias aéreas, governos, seguradoras e varejistas que não poderiam aceitar um resultado “aproximadamente correto”.

O Db2 não inventou sozinho o banco relacional, não foi o primeiro produto comercial dessa categoria e não criou isoladamente o ACID. Reconhecer essas nuances não reduz sua importância. Ao contrário: permite enxergar sua verdadeira grandeza.

Codd forneceu o modelo.

Chamberlin e Boyce ajudaram a criar a linguagem.

Selinger e sua equipe ensinaram o sistema a escolher caminhos.

Härder e Reuter consolidaram o vocabulário do ACID.

Muitos engenheiros transformaram pesquisa em produto.

E o mainframe colocou tudo diante do teste definitivo:

Funciona em produção, sob concorrência, depois de uma falha, sem perder o dinheiro de ninguém?

Quando hoje escrevemos:

SELECT *
FROM HISTORIA
WHERE TECNOLOGIA = 'MODERNA';

encontramos cloud, PostgreSQL, Oracle, SQL Server, MySQL, data warehouses e plataformas distribuídas.

Mas, se acrescentarmos:

AND ORIGEM_CONCEITUAL = 'MODELO RELACIONAL';

Ted Codd ainda estará lá, tomando chá numa confortável poltrona inglesa, olhando discretamente para o otimizador e lembrando ao programador COBOL:

Diga ao banco o que você deseja. Depois verifique com muito cuidado o que ele decidiu fazer.

segunda-feira, 10 de agosto de 2020

O Crachá que Eu Nunca Tive Em 1990 eu sonhava trabalhar na Xerox.

 
Bellacosa Mainframe e o dia que sonhei trabalhar na Xerox do Brasil

☕ Um Café no Bellacosa Mainframe

O Crachá que Eu Nunca Tive

Em 1990 eu sonhava trabalhar na Xerox. Trinta e seis anos depois descobri que não queria realmente a Xerox — queria descobrir o mundo que existia depois daquela porta.

O professor barbudo acendeu o cachimbo.

Não porque precisasse dele.

Algumas lembranças simplesmente exigem cenário.

A fumaça subiu devagar pelo escritório enquanto eu olhava para uma tela onde conviviam COBOL, APIs, inteligência artificial e documentos que provavelmente jamais conheceriam uma folha de papel.

Curioso.

Passei boa parte da vida trabalhando com sistemas que processam milhões de informações e, naquela manhã, aquilo que voltou à memória não foi um programa, um banco de dados ou um mainframe.

Foi um cheiro.

Um cheiro químico.

Forte.

Desagradável.

Algo que minha memória insiste em comparar com amoníaco.

E imediatamente voltei para uma época em que copiar uma folha de papel era tecnologia.

Voltei para 1990.

Ou talvez um pouco antes.

Voltei para o garoto que eu era.

E, principalmente, para o crachá que eu nunca tive.



1. Quando o futuro tinha cheiro

Quem nasceu na era do smartphone talvez tenha dificuldade para compreender isso.

Houve uma época em que fazer uma cópia de um documento não significava apontar a câmera do telefone e tocar na tela.

Também não significava colocar uma folha num multifuncional doméstico de alguns quilos.

Copiar documentos podia envolver máquinas grandes, caras, mecânicas, eletrostáticas e, dependendo da tecnologia e da época, processos químicos.

Eu comecei a trabalhar quando ainda era possível encontrar equipamentos de reprodução que não pertenciam completamente ao universo do toner seco que depois se tornaria tão familiar.

Alguns processos de reprodução utilizavam reveladores líquidos; outros, como determinados sistemas diazo usados especialmente para plantas e desenhos técnicos, ficaram famosos pelo cheiro forte associado à amônia.

Talvez os detalhes químicos tenham se perdido em mais de três décadas.

O cheiro, não.

Memória é um banco de dados muito estranho.

Você pode esquecer um nome, uma data e até o modelo exato de uma máquina.

Mas alguém abre uma garrafa, passa um produto de limpeza ou aquece alguma coisa e, de repente:

SELECT *
  FROM MEMORIA
 WHERE CHEIRO = '1990';

SQLCODE = 0.

Registro encontrado.

O professor barbudo dá uma tragada no cachimbo.

E o garoto aparece novamente.



2. Xerox não era uma copiadora

Hoje olhamos para Xerox e imediatamente pensamos:

— Fotocópia.

Para mim, naquela época, significava muito mais.

Xerox era tecnologia.

Era multinacional.

Era treinamento.

Era uma empresa que parecia estar na fronteira entre aquilo que o mundo era e aquilo que o mundo seria.

E havia algo ainda mais importante para um garoto que não vinha daquele universo:

era uma boa empresa para trabalhar.

Eu ouvia falar dos benefícios.

Do salário.

De treinamento.

De possibilidades profissionais.

Até carro da empresa fazia parte daquele imaginário.

O salário podia chegar a várias vezes aquilo que eu recebia.

Cinco vezes mais parecia fortuna.

Mas dinheiro era apenas uma parte.

Eu queria pertencer àquele ambiente.

Em determinada ocasião fui fazer treinamento de operação de copiadoras Xerox — máquinas como as 1035, 1045 e 1060 fazem parte das minhas lembranças daquela época.

Eu não devia ter muito mais que 16 anos.

E fiquei maravilhado.

Não apenas pelas máquinas.

Pelo lugar.

Pelo ambiente.

Pelo treinamento.

Pelo refeitório.

Pelas pessoas.

Pela organização.

Pela sensação de que existia ali uma espécie de civilização profissional diferente daquela que eu conhecia.

Hoje isso pode parecer banal.

Não era.



3. O refeitório era parte do sonho

Esta talvez seja uma das coisas que somente alguém que começou a trabalhar muito cedo consegue compreender completamente.

Quando você cresce cercado por determinadas condições, certos benefícios empresariais parecem normais.

Refeitório.

Treinamento.

Plano de carreira.

Benefícios.

Instalações agradáveis.

Equipamentos modernos.

Para quem está olhando aquilo de fora, porém, a mensagem é completamente diferente:

Então é possível trabalhar assim?

O refeitório não era apenas um lugar para comer.

Era uma evidência.

Aquele prédio inteiro dizia silenciosamente para mim:

existe outro mundo profissional.

E eu queria entrar nele.

Não havia terminado sequer o colegial.

Morava no subúrbio.

Ir e voltar para casa fazia parte da batalha cotidiana.

Trabalhar e estudar ao mesmo tempo não era frase bonita para colocar no LinkedIn.

Era terça-feira.

Era quarta-feira.

Era quinta-feira.

E os boletos não eram uma metáfora sobre responsabilidade.

Eram dolorosamente reais.

Mesmo assim, eu sonhava.


4. Eu queria aquele crachá

Às vezes me imaginava trabalhando na Xerox.

É engraçado admitir isso depois de tantos anos.

Eu conseguia praticamente enxergar o crachá no peito.

VAGNER.

Funcionário da Xerox do Brasil.

Pronto.

Eu tinha vencido.

Era mais ou menos esse o tamanho do horizonte que eu conseguia enxergar.

E existe uma lição importante aqui para quem está começando uma carreira.

Não despreze sonhos pequenos vistos do futuro.

Eles podem ter sido gigantes quando foram sonhados.

O jovem de 1990 não possuía todas as informações que o homem de 2026 possui.

Ele não poderia planejar aquilo que sequer sabia que existia.

Eu não imaginava o que aconteceria depois.

Não imaginava trabalhar com mainframes.

Não imaginava passar por instalações da IBM na região de Milão.

Não imaginava trabalhar em aeroportos.

Não imaginava mergulhar no sistema financeiro brasileiro.

Não imaginava morar na Europa.

Não imaginava voltar ao Brasil carregando experiências de mundos completamente diferentes.

Muito menos imaginava que, décadas depois, estaria ensinando tecnologia.

Se alguém tivesse contado tudo isso para aquele garoto, talvez ele respondesse:

— Legal. Agora preciso ir embora porque amanhã acordo cedo.

A sobrevivência vinha antes da autobiografia.


5. Enquanto isso, havia um velho chamado COBOL

Aqui nossa história começa a ficar especialmente divertida.

Porque, enquanto eu olhava para aquelas máquinas modernas e imaginava o futuro, havia uma tecnologia que já era considerada velha.

COBOL.

O COBOL surgiu em 1959.

Quando chegamos a 1990, portanto, ele já carregava aproximadamente três décadas de história.

Trinta anos!

Para um adolescente, trinta anos é praticamente arqueologia.

A Xerox parecia moderna.

As copiadoras pareciam modernas.

Os computadores pessoais pareciam o futuro.

COBOL?

O velho já estava lá.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. VELHO-SENHOR.

       PROCEDURE DIVISION.
           DISPLAY 'AINDA NAO TERMINEI'.
           STOP RUN.

O professor barbudo ri.

Porque sabe o final dessa história.

O garoto não sabia.


6. A civilização da fotocópia

Para entender a transformação tecnológica que viria depois, precisamos lembrar que fotocópias não eram simplesmente conveniência.

Elas faziam parte da infraestrutura social.

Havia lojas especializadas em cópias.

Algumas enormes.

Conheci várias.

Algumas possuíam uma quantidade impressionante de máquinas.

Dez.

Quinze.

Vinte copiadoras.

E havia fila.

Fila de gente querendo transformar papel em mais papel.

Hoje isso parece quase absurdo.

Na época era perfeitamente racional.

Universidades precisavam de cópias.

Escritórios precisavam de cópias.

Empresas precisavam de cópias.

Advogados precisavam de cópias.

Estudantes precisavam de cópias.

Órgãos públicos precisavam de cópias.

Bancos precisavam de cópias.

E a burocracia brasileira possuía uma fome particularmente insaciável por papel.


7. ORIGINAL + 3 VIAS

Quem viveu aquela época conhece a expressão.

Em três vias.

Uma para você.

Uma para o departamento.

Uma para outro departamento.

E talvez uma quarta porque ninguém sabia exatamente onde as outras três terminariam.

Mas não bastava possuir papel.

Era necessário possuir o artefato mágico:

O protocolo.

Carimbo.

Data.

Rubrica.

Pronto.

Sua folha havia adquirido existência administrativa.

O programador COBOL iniciante pode imaginar algo assim:

       IF DOCUMENTO-ENTREGUE = 'S'
           MOVE FUNCTION CURRENT-DATE
             TO DATA-PROTOCOLO
           MOVE 'CARIMBADO'
             TO STATUS-DOCUMENTO
       ELSE
           MOVE 'VOCE NAO ENTREGOU'
             TO STATUS-DOCUMENTO
       END-IF.

Sem protocolo?

Boa sorte.


8. O checksum humano do cartório

E havia outra instituição maravilhosa:

a cópia autenticada.

Você possuía o documento original.

Fazia uma cópia.

Levava original e cópia ao cartório.

Alguém comparava os dois.

E certificava que aquela reprodução correspondia ao original.

Pensando como programador:

DOCUMENTO ORIGINAL
       |
       V
    FOTOCÓPIA
       |
       V
  CÓPIA GERADA
       |
       V
    CARTÓRIO
       |
       V
COMPARE ORIGINAL WITH COPY
       |
       +---- DIFERENTE ---> REJECT
       |
       +---- IGUAL -------> AUTENTICADA

Era um CHECKSUM humano.

Com carimbo.

E fé pública.

O mundo funcionava assim porque a informação ainda estava profundamente associada ao objeto físico que a carregava.

Isso é fundamental para entender o que aconteceu depois.


9. A primeira grande transformação: o documento separou-se do papel

Durante séculos, informação administrativa e papel praticamente caminharam juntos.

Então o computador começou a romper essa relação.

Primeiro criávamos documentos digitalmente e os imprimíamos.

Depois imprimíamos cada vez menos.

Vieram impressoras matriciais.

Impressoras laser.

Jato de tinta.

Scanners.

E-mail.

PDF.

Internet.

Sistemas de gestão documental.

Certificados digitais.

Assinaturas eletrônicas.

Cloud.

Smartphones.

Finalmente aconteceu algo conceitualmente revolucionário:

A cópia deixou de precisar existir fisicamente.

Em 1990:

INFORMAÇÃO
    |
    V
  PAPEL
    |
    V
COPIADORA
    |
    V
OUTRO PAPEL

Décadas depois:

INFORMAÇÃO
    |
    V
ARQUIVO DIGITAL
    |
    +----> EMAIL
    +----> CLOUD
    +----> APP
    +----> API
    +----> SMARTPHONE

A transformação não matou simplesmente a copiadora.

Ela atacou a razão pela qual precisávamos dela.


10. E então o celular terminou o serviço

Imagine entregar um smartphone moderno para aquele garoto de 1990.

Explique:

— Isto é telefone.

Tudo bem.

— Também é câmera.

Interessante.

— Calculadora.

Legal.

— Agenda.

Ótimo.

— Terminal bancário.

Como?

— Biblioteca.

Como?

— Máquina fotográfica.

Você já falou.

— Filmadora.

Espera.

— Correio.

— Televisão.

— Rádio.

— Mapa.

— GPS.

— Scanner.

E então coloque um documento sobre a mesa.

Aponte o telefone.

Click.

Pronto.

O garoto provavelmente olharia para aquela Xerox enorme e depois para o pequeno retângulo em sua mão.

Algo deu terrivelmente errado com a escala das coisas.


11. As lojas desapareceram

Esse é um dos aspectos mais fascinantes da transformação tecnológica.

Não desaparecem somente máquinas.

Desaparecem ecossistemas.

Em torno das copiadoras existiam:

  • fabricantes;

  • vendedores;

  • técnicos;

  • operadores;

  • fornecedores;

  • lojas;

  • papelarias;

  • toner;

  • peças;

  • cilindros;

  • papel;

  • contratos;

  • treinamento;

  • logística;

  • aluguel de equipamentos.

Quando uma tecnologia é substituída, todos esses elementos precisam se transformar ou desaparecem junto com ela.

As grandes lojas com vinte máquinas e filas de clientes tornaram-se raridades.

Algumas sobreviveram transformadas em gráficas rápidas e centros de serviços.

Outras simplesmente fecharam.

O futuro chegou.

Só não chegou da maneira que imaginávamos.


12. E o COBOL?

Ah.

O velho.

Enquanto isso...

       PROCEDURE DIVISION.

           DISPLAY 'VOCES TERMINARAM?'.

           PERFORM PROCESSA-FOLHA.
           PERFORM CALCULA-JUROS.
           PERFORM ATUALIZA-CONTA.
           PERFORM LIQUIDA-PAGAMENTO.

           DISPLAY 'TENHO BATCH PARA RODAR.'.

           STOP RUN.

Aqui existe uma das grandes lições sobre legado.

Idade não determina obsolescência.

Utilidade determina muito mais.

A copiadora solucionava um problema:

reproduzir fisicamente informação.

Quando a necessidade de reprodução física diminuiu drasticamente, sua importância também diminuiu.

COBOL solucionava outro conjunto de problemas:

processar negócios.

Folha de pagamento continua existindo.

Conta bancária continua existindo.

Seguro continua existindo.

Cobrança continua existindo.

Tributação continua existindo.

Estoque continua existindo.

Liquidação financeira continua existindo.

O formulário mudou.

O negócio permaneceu.


13. O segredo da sobrevivência

Isso também não significa que o COBOL de 2026 seja simplesmente uma peça congelada de 1959.

Esse é outro erro frequente.

Compiladores evoluíram.

Plataformas evoluíram.

Integrações evoluíram.

O COBOL moderno pode participar de arquiteturas envolvendo APIs, JSON, XML, mensageria, bancos relacionais, CICS, IMS, Db2, VSAM e inúmeros componentes contemporâneos.

Imagine:

SMARTPHONE
    |
    V
 INTERNET
    |
    V
   API
    |
    V
z/OS Connect
    |
    V
  CICS
    |
    V
  COBOL
    |
    V
Db2 / VSAM

O usuário toca numa interface criada há seis meses.

Uma API recebe a chamada.

Alguma infraestrutura moderna encaminha a transação.

E lá embaixo pode existir uma regra de negócio cuja genealogia atravessa décadas.

O usuário pensa:

— Que aplicativo moderno!

Lá no porão, o COBOL olha para cima:

— Crianças...


14. Não confunda interface com essência

Esta talvez seja uma das maiores lições que aquela velha copiadora pode ensinar ao programador iniciante.

Tecnologias visíveis parecem dominar nossa percepção.

A copiadora era visível.

Grande.

Barulhenta.

Impressionante.

Um mainframe frequentemente não é percebido pelo consumidor.

Mas aquilo que vemos não é necessariamente aquilo que sustenta o processo.

Uma interface pode mudar dez vezes enquanto determinada regra de negócio permanece.

Imagine um cálculo bancário.

Em determinado momento ele foi solicitado por formulário.

Depois:

TERMINAL

Depois:

ATM

Depois:

HOME BANKING

Depois:

WEB

Depois:

SMARTPHONE

Amanhã talvez:

AGENTE DE IA

Mas a pergunta central continuará:

O CLIENTE TEM SALDO?
QUAL A TAXA?
QUAL O LIMITE?
A TRANSAÇÃO É PERMITIDA?
COMO CONTABILIZAR?

A interface muda.

O negócio permanece.


15. O erro de rir do legado

Programadores iniciantes frequentemente encontram algo antigo e imediatamente perguntam:

— Por que ainda usamos isso?

É uma excelente pergunta.

Mas existe uma pergunta melhor:

Por que isso conseguiu sobreviver até aqui?

Essa mudança de perspectiva é poderosa.

Se determinado programa atravessou 20, 30 ou 40 anos de produção, talvez exista uma razão.

Talvez carregue milhares de regras.

Talvez esteja profundamente integrado.

Talvez possua comportamento conhecido.

Talvez tenha sido corrigido centenas de vezes.

Talvez substituir aquilo custe muito mais que mantê-lo.

Talvez ninguém tenha conseguido demonstrar economicamente que a substituição produziria benefício proporcional ao risco.

Legado não significa automaticamente ruim.

Legado significa:

algo que recebemos de quem veio antes.

Pode ser maravilhoso.

Pode ser horroroso.

Normalmente é um pouco dos dois.


16. Curiosidade — o programa também possui arqueologia

Quando você abre um programa COBOL antigo, procure os comentários.

Talvez encontre:

* 1992 - JOSE - ALTERACAO DE JUROS
* 1997 - MARIA - NOVA REGRA
* 2004 - CARLOS - AJUSTE CONTABIL
* 2011 - ANA - PROJETO XYZ
* 2018 - ROBERTO - ADEQUACAO
* 2026 - VAGNER - API

Isso não é apenas documentação.

É estratigrafia.

Cada alteração representa uma camada histórica.

Como uma cidade construída sobre outra cidade.

Ou como aquela loja que primeiro teve uma copiadora, depois dez, depois vinte, depois scanners e finalmente virou outra coisa.

Programas também carregam fósseis.


17. Dica ao programador COBOL iniciante

Quando receber um programa antigo, não comece alterando.

Primeiro investigue.

Passo 1 — descubra quem chama o programa

Batch?

CICS?

Outro programa?

Scheduler?

API?

Passo 2 — descubra os dados

Ele lê VSAM?

Db2?

Arquivo sequencial?

MQ?

Passo 3 — procure as regras

Não fique olhando apenas IF, MOVE e PERFORM.

Pergunte:

que regra de negócio isso representa?

Passo 4 — procure história

Comentários.

Datas.

Alterações.

Chamadas.

Copybooks.

JCL.

Dependências.

Passo 5 — só então modifique

Porque talvez aquele IF aparentemente idiota exista desde 1994 justamente porque alguma sexta-feira terrível ensinou alguém que ele precisava estar ali.


18. Easter egg — o programador de 1990

Imagine que eu consiga entrar novamente naquele centro de treinamento.

O garoto está diante da Xerox.

Chego perto.

Barbudo.

Mais velho.

Cachimbo na mão.

Ele provavelmente ficaria desconfiado.

— Quem é você?

— Longa história.

— Você trabalha aqui?

Olho para meu peito.

Nenhum crachá da Xerox.

— Não.

Talvez ele fique decepcionado.

Então pergunto:

— Você realmente quer trabalhar aqui?

— Claro!

— Por quê?

Ele começa a falar.

Tecnologia.

Salário.

Benefícios.

Carro.

Treinamento.

Ambiente.

Futuro.

Eu sorrio.

Agora compreendo.

Ele não quer aquela empresa especificamente.

Ele quer atravessar aquela porta.

Então digo:

— Continue andando.

— Vou conseguir trabalhar aqui?

Dou outra tragada no cachimbo.

— Não.

Ele me olha indignado.

— Então por que continuar?

Porque agora eu sei algo que ele não sabe.

— Porque existe muito mais depois dessa porta do que você consegue enxergar daqui.


19. Trinta e seis anos depois

A fumaça desaparece lentamente no escritório.

Volto para 2026.

Na minha frente existe um computador infinitamente mais poderoso do que quase qualquer coisa que aquele garoto poderia imaginar.

Posso conversar com inteligência artificial.

Posso acessar sistemas do outro lado do planeta.

Posso ensinar pessoas sem estar na mesma sala.

Posso escrever uma história e publicá-la para milhares de pessoas sem gráfica, fotolito, papel ou copiadora.

A velha Xerox desapareceu da minha frente.

O crachá nunca chegou.

Curiosamente, isso deixou de importar há muito tempo.

Porque vieram outras portas.

Mainframe.

Aeroporto.

Sistema financeiro.

IBM.

Milão.

Europa.

Tecnologia.

Ensino.

Alunos.

Histórias.

E o COBOL?

Bem...

O COBOL estava aqui antes de boa parte dessa história começar.

E continua aqui.


20. A máquina morreu; o sonho não

Talvez seja esse o verdadeiro significado daquela lembrança.

Quando somos jovens, confundimos frequentemente o símbolo com o objetivo.

Eu achava que queria um crachá.

Queria oportunidade.

Achava que queria Xerox.

Queria tecnologia.

Achava que queria aquele prédio.

Queria descobrir até onde poderia chegar.

Achava que queria cinco vezes meu salário.

Também queria isso.

Não vamos romantizar demais.

Os boletos continuavam chegando.

O professor barbudo sabe perfeitamente disso.

Mas havia algo além.

Aquela empresa me mostrou que existia um mundo maior.

E isso foi suficiente.


Epílogo — IDENTIFICATION DIVISION

O cachimbo está quase apagado.

Antes de levantar, olho novamente para a tela.

Talvez toda carreira possua sua própria IDENTIFICATION DIVISION.

       IDENTIFICATION DIVISION.

       PROGRAM-ID. CRACHA-QUE-EU-NUNCA-TIVE.

       AUTHOR. VAGNER-BELLACOSA.

       DATE-WRITTEN. 1990.

      *------------------------------------------------*
      * NA VERDADE O PROGRAMA AINDA ESTAVA SENDO      *
      * ESCRITO. O PROGRAMADOR APENAS NAO SABIA.      *
      *------------------------------------------------*

       PROCEDURE DIVISION.

           PERFORM TRABALHAR.
           PERFORM ESTUDAR.
           PERFORM ERRAR.
           PERFORM APRENDER.
           PERFORM VIAJAR.
           PERFORM ENSINAR.
           PERFORM CONTAR-HISTORIAS.

           DISPLAY
             'O CRACHA NUNCA CHEGOU.'.

           DISPLAY
             'MAS EU ATRAVESSEI A PORTA.'.

           STOP RUN.

Talvez o detalhe mais bonito seja justamente este:

em 1990 eu olhava para a Xerox e acreditava estar olhando para o futuro.

Eu estava.

Só havia cometido um pequeno erro de interpretação.

O futuro não era a copiadora.

Não era o toner.

Não era o prédio.

Nem sequer era o crachá.

O futuro era o garoto olhando para tudo aquilo e descobrindo que queria ir mais longe.

A Xerox que ele admirava mudou.

As copiadoras gigantes envelheceram.

As lojas cheias de máquinas desapareceram.

O papel perdeu parte do império.

O mundo digital engoliu toneladas de documentos.

Até o telefone virou scanner.

E aquele COBOL que já parecia velho em 1990?

Continua executando.

Talvez esteja tentando nos ensinar alguma coisa.

Máquinas passam.

Empresas mudam.

Tecnologias envelhecem.

Crachás expiram.

Mas conhecimento acumulado, curiosidade e vontade de atravessar a próxima porta possuem uma estranha capacidade de sobreviver.

O professor apaga o cachimbo.

O garoto pega suas coisas e vai embora.

Ainda há um trem para pegar.

Ainda há escola.

Ainda há trabalho amanhã.

Ainda há boletos.

Ele não sabe nada sobre Milão.

Não sabe nada sobre bancos.

Não sabe nada sobre mainframes.

Não sabe que um dia será professor.

Não sabe que, trinta e seis anos depois, ainda se lembrará daquele refeitório.

Melhor assim.

Se soubesse tudo, talvez deixasse de ser sonho e virasse cronograma.

Ele apenas segue andando.

Sem o crachá.

Mas na direção da porta.

☕ Um Café no Bellacosa Mainframe

Onde até uma velha copiadora pode ensinar alguma coisa sobre COBOL, legado, carreira — e sobre os programas que levamos uma vida inteira para compilar.



quinta-feira, 2 de agosto de 2007

🥫 SPAM, SPAM, SPAM! — Do ARPANET ao Príncipe Nigeriano

 

Bellacosa Mainframe explica o email e seu nêmese o SPAM

☕ Um Café no Bellacosa Mainframe

🥫 SPAM, SPAM, SPAM! — Do ARPANET ao Príncipe Nigeriano

Uma história do e-mail, da linha discada, dos vírus, dos golpes e da interminável guerra pela caixa de entrada — sob a batuta do Monty Python

Imagine um restaurante inglês.

Você entra, senta-se educadamente e pergunta:

— O que temos hoje?

A garçonete responde:

— Ovos com SPAM.

— Sem SPAM?

— Temos ovos, bacon e SPAM.

— Sem SPAM.

— SPAM, ovos, salsicha e SPAM.

— Eu não gosto de SPAM!

Nesse momento, um grupo de vikings sentado ao lado começa:

SPAM! SPAM! SPAM! SPAM!

A garçonete tenta continuar.

Os vikings aumentam o volume:

SPAM! SPAM! SPAM! WONDERFUL SPAM!

Corta.

Agora estamos diante de um computador conectado à Internet.

A caixa de entrada contém:

Você ganhou US$ 5.000.000!
VIAGRA COM 80% DE DESCONTO!
Conheça mulheres solteiras perto de você!
Seu cartão foi bloqueado!
Empréstimo pré-aprovado!
URGENTE: atualize sua senha!

O usuário grita:

— EU NÃO QUERO SPAM!

Ao fundo:

SPAM! SPAM! SPAM! SPAM!

Bem-vindo à história do correio eletrônico.

Uma das invenções mais úteis da computação acabou criando também uma das maiores indústrias de porcaria digital já inventadas.

E o mais maravilhoso é que a palavra que usamos para descrever tudo isso nasceu justamente de uma piada do Monty Python.

Pegue seu café.

Configure o modem.

Feche todos os telefones da casa.

E, pelo amor de Deus, não abra o anexo.



🎬 ATO I — Antes do e-mail havia computadores solitários

Antes de começarmos, precisamos destruir uma pequena lenda.

Ray Tomlinson não acordou certa manhã de 1971 e inventou sozinho o conceito de alguém deixar uma mensagem eletrônica para outra pessoa.

Computadores multiusuário dos anos 1960 já possuíam mecanismos pelos quais um usuário podia deixar uma mensagem para outro usuário da mesma máquina.

Era uma espécie de bilhete eletrônico.

Imagine um grande computador compartilhado por dezenas de pessoas:

PARA: ARTHUR
DE: JOHN

TERMINEI O PROCESSAMENTO.
PODE USAR A FITA 17.

Funcionava.

Mas havia um detalhe importante:

Arthur e John estavam usando o mesmo computador.

Era como deixar um bilhete na geladeira.

Útil, porém geograficamente limitado.

A verdadeira mágica começaria quando o bilhete pudesse sair de uma máquina e chegar a outra.



📡 ATO II — 1971: aparece Ray Tomlinson

Estamos no começo dos anos 1970.

A ARPANET estava crescendo.

Computadores distantes começavam a conversar através da rede.

Ray Tomlinson, trabalhando na BBN, adaptou programas para permitir o envio de mensagens entre computadores.

Então surgiu um problema aparentemente banal:

Como representar:

usuário + computador?

Precisávamos de algo como:

VAGNER está no computador BELLACOSA

Tomlinson escolheu:

vagner@bellacosa

E o símbolo @ entrou para a história.

A escolha era elegante porque o caractere era relativamente pouco utilizado em nomes e podia ser interpretado como:

vagner AT bellacosa

Ou:

Vagner em Bellacosa.

Nascia uma convenção que atravessaria décadas.

Hoje bilhões de pessoas reconhecem imediatamente:

usuario@dominio

E quase ninguém pensa no pequeno problema de engenharia que precisou ser resolvido para chegarmos ali.



🤓 Curiosidade Pythoniana nº 1 — ninguém sabe exatamente o que dizia o primeiro e-mail

Perguntaram posteriormente a Tomlinson qual havia sido a primeira mensagem.

Ele não lembrava.

Provavelmente alguma sequência de caracteres de teste.

Algo equivalente a:

QWERTYUIOP

Isso é maravilhoso.

Uma das tecnologias de comunicação mais importantes da história pode ter começado com o equivalente digital de:

TESTE TESTE TESTE 123.

Se fosse hoje, certamente seria:

asdfasdfasdf

E algum gerente de projeto imediatamente abriria uma reunião para discutir o roadmap.



💌 ATO III — Os humanos descobrem que computadores também servem para conversar

A ARPANET tinha objetivos muito mais sofisticados.

Compartilhamento de recursos.

Pesquisa.

Computação remota.

Protocolos.

Infraestrutura.

Os humanos olharam para aquilo e descobriram:

— Posso mandar mensagem para alguém?

Sim.

— Excelente!

Pouco tempo depois, o correio eletrônico já representava uma parcela enorme do tráfego da ARPANET.

Essa é uma constante maravilhosa da história tecnológica.

Criamos computadores capazes de bilhões de operações por segundo.

Usamos para mandar:

Bom dia, pessoal.

Criamos redes planetárias.

Usamos para mandar:

Segue anexo.

Criamos inteligência artificial.

Usamos para perguntar:

Melhore este e-mail dizendo que estou enviando o anexo.

A humanidade é absolutamente consistente.



📢 ATO IV — 1978: alguém descobre que podemos estragar tudo

Chegamos a Gary Thuerk.

Gary trabalhava para a Digital Equipment Corporation, a famosa DEC.

A empresa queria divulgar apresentações de seus computadores DECSYSTEM-20.

Então alguém teve uma ideia comercial extraordinariamente moderna:

— Temos uma rede cheia de pessoas interessadas em computadores.

— Sim.

— Temos os endereços delas.

— Sim.

— Podemos mandar propaganda para todas.

Silêncio.

Ao fundo, um viking levanta lentamente a cabeça.

🥫

Em maio de 1978, centenas de usuários da ARPANET receberam uma mensagem comercial promovendo apresentações da DEC.

Hoje isso parece banal.

Naquele contexto, foi extraordinário.

E irritante.

Muito irritante.

Usuários reclamaram.

Administradores reclamaram.

Mas uma importante descoberta econômica já havia sido feita.

Mandar mensagem eletrônica para centenas de pessoas era praticamente grátis.

E essa descoberta nunca mais seria esquecida.



💰 ATO V — A matemática maligna do spam

O correio tradicional possui custos.

Imagine enviar um milhão de propagandas físicas.

Precisamos de:

papel;

impressão;

envelopes;

endereçamento;

transporte;

distribuição;

mão de obra.

Agora imagine enviar um milhão de e-mails.

Precisamos de:

SEND

Naturalmente existem infraestrutura e custos computacionais.

Mas o custo marginal de adicionar mais um destinatário é minúsculo.

Isso cria uma economia bastante peculiar.

Suponhamos que enviemos:

1.000.000 mensagens

E somente:

0,01%

das pessoas respondam.

Ainda temos:

100 respostas

Se cada resposta produzir lucro suficiente, a campanha funciona.

O spammer não precisa convencer todo mundo.

Não precisa convencer 10%.

Nem 1%.

Precisa encontrar alguns poucos indivíduos em uma multidão gigantesca.

Essa é uma das razões pelas quais o spam nunca morreu.


🥫 ATO VI — Mas por que SPAM?

Agora entra oficialmente o Monty Python.

Em 1970, o grupo apresentou um famoso sketch ambientado num café onde praticamente todas as opções do cardápio continham SPAM, a carne enlatada da Hormel.

Uma personagem tenta pedir algo sem SPAM.

Isso se torna progressivamente impossível.

E um grupo de vikings começa a cantar repetidamente sobre SPAM, tornando qualquer outra conversa praticamente impossível.

A genialidade da associação está justamente nisso.

Uma mensagem indesejada é irritante.

Mil mensagens indesejadas afogam a comunicação desejada.

Exatamente como os vikings.

Em comunidades online posteriores — BBSs, MUDs, Usenet e ambientes semelhantes — "spam" passou progressivamente a ser associado a mensagens repetitivas e indesejadas.

Até tornar-se aquilo que conhecemos.

Portanto existe uma linha histórica deliciosamente absurda:

1937
🥫 carne SPAM
        ↓
1970
🎭 Monty Python
        ↓
SPAM SPAM SPAM SPAM!
        ↓
1980s/1990s
💻 cultura online
        ↓
📧 mensagem indesejada
        ↓
2026
🗑️ pasta Spam

Toda vez que você abre sua pasta de lixo eletrônico existe, de certa maneira, um pequeno viking do Monty Python escondido ali.


☎️ ATO VII — TRRRRR PIIIIII KRRRRRR

Agora chegamos à Internet doméstica.

Para quem nasceu depois da banda larga, precisamos explicar uma tecnologia arqueológica chamada:

MODEM.

Você possuía uma linha telefônica.

O computador utilizava essa linha para estabelecer comunicação com outro modem.

O resultado sonoro parecia dois robôs sendo torturados:

TUUUUUUUUUU...

PIIIIIIIIIII!

KRRRRRRRRRRRRR

TCHIIIIIIIIIIII

GRRRRRRRRRR

.............

CONECTADO A 33.600 bps

E você comemorava.

33.6!

Hoje uma página moderna provavelmente desistiria de carregar antes do almoço.

Mas naquele momento aquilo era uma estrada para o planeta.


☎️ Curiosidade nº 2 — Internet e telefone disputavam território

Em muitas residências havia uma única linha.

Portanto:

Internet ligada
=
telefone ocupado

E existia um predador natural da conexão dial-up:

alguém levantar o telefone.

Você estava baixando alguma coisa havia 37 minutos.

98%.

Então:

— Alô?

CONEXÃO PERDIDA.

Ali nascia uma modalidade doméstica de homicídio ainda não contemplada adequadamente pelo Código Penal.


📬 ATO VIII — POP3, SMTP e a pequena agência dos Correios digital

O e-mail precisava de protocolos.

De maneira simplificada, um modelo clássico doméstico funcionava assim:

EU
 │
 │ SMTP
 ▼
SERVIDOR DE EMAIL
 │
 │ Internet
 ▼
SERVIDOR DO DESTINATÁRIO

Para receber:

SERVIDOR
   │
   │ POP3
   ▼
MEU COMPUTADOR

SMTP cuidava principalmente do transporte/envio.

POP permitia recuperar mensagens.

Posteriormente, IMAP tornaria muito mais natural manter mensagens no servidor e sincronizar vários dispositivos.

Hoje fazemos isso sem pensar.

Naquela época você precisava configurar coisas como:

POP3:
pop.provedor.com.br

SMTP:
smtp.provedor.com.br

Usuário:
vagner

Senha:
********

Então apertava:

Enviar/Receber.

E rezava.


💻 ATO IX — Entram os gerenciadores de e-mail

Conforme o correio eletrônico cresceu, precisávamos de programas especializados.

Surgiram clientes e sistemas que marcaram gerações.

Entre eles:

Eudora;

Pegasus Mail;

Netscape Mail/Messenger;

Microsoft Mail;

Outlook;

Outlook Express;

e muitos outros.

Para milhões de usuários domésticos dos anos 1990 e começo dos anos 2000, o Outlook Express tornou-se praticamente sinônimo de correio eletrônico no PC.

A interface estabeleceu uma gramática visual que continua conosco:

📥 Caixa de entrada
📤 Caixa de saída
📨 Itens enviados
📝 Rascunhos
🗑️ Itens excluídos

O correio físico havia sido metaforicamente transportado para dentro do computador.


📥 ATO X — "Recebendo mensagem 3 de 17"

Havia algo quase ritualístico no correio eletrônico via linha discada.

Conectávamos.

Abríamos o programa.

Clicávamos em:

Enviar/Receber.

Então:

Recebendo mensagem 1 de 17...
Recebendo mensagem 2 de 17...
Recebendo mensagem 3 de 17...

Maravilha.

Mensagem quatro.

Cinco.

Seis.

Então chegávamos à:

Recebendo mensagem 7 de 17...

E ela não terminava.

Um minuto.

Dois.

Cinco.

Dez.

Alguém havia enviado uma fotografia gigantesca.

Talvez 3 MB.

Hoje 3 MB parece nada.

Em dial-up, 3 MB era praticamente uma encomenda marítima internacional.

O computador parecia dizer:

— Esta mensagem chegará quando chegar.


📦 ATO XI — MAILBOX QUOTA EXCEEDED

E havia outro inimigo.

Espaço.

Caixas postais podiam ter limites que hoje parecem hilários.

5 MB.

10 MB.

20 MB.

Uma apresentação PowerPoint e duas fotografias podiam transformar a infraestrutura numa emergência nacional.

Então chegava:

MAILBOX QUOTA EXCEEDED

O administrador dizia:

— Limpe sua caixa postal.

Você apagava vinte mensagens.

Nada.

— Limpei!

— Esvaziou Itens Excluídos?

Silêncio.

Descobríamos que apagar uma mensagem significava colocá-la numa segunda pasta para posteriormente apagá-la de verdade.

Monty Python aprovaria.


📢 ATO XII — O spam industrializa-se

Quando milhões de pessoas entraram na Internet, seus endereços passaram a possuir valor comercial.

Nasceu uma indústria.

Listas eram coletadas.

Compradas.

Vendidas.

Copiadas.

Roubadas.

Programas percorriam páginas da Web procurando padrões semelhantes a:

qualquercoisa@qualquercoisa.com

E surgiram os harvesters.

Robôs coletores de endereços.

Publicar seu e-mail publicamente numa página podia significar alimentar uma máquina que posteriormente o adicionaria a centenas de listas.

E as caixas começaram a receber:

BUY NOW!!!

FREE!!!

CASINO!!!

MORTGAGE!!!

VIAGRA!!!

HOT GIRLS!!!

YOU WON!!!

Os vikings haviam descoberto SMTP.


🔞 ATO XIII — A fase pornográfica da caixa de entrada

Houve uma época particularmente desagradável da Internet em que pornografia era uma presença constante no spam.

Não importava quem você fosse.

Professor.

Estudante.

Empresa.

Igreja.

Universidade.

Departamento governamental.

Seu servidor provavelmente receberia propaganda sexual.

Isso criou inclusive problemas corporativos.

Imagine abrir o Outlook durante uma apresentação.

Projetor ligado.

Trinta pessoas assistindo.

Surge:

🔥 HOT...

O administrador de sistemas passa a desejar viver numa cabana sem eletricidade.

Spam deixou de ser apenas inconveniência.

Virou:

problema de produtividade;

problema corporativo;

problema jurídico;

problema de segurança;

problema reputacional.

Precisávamos lutar.


🛡️ ATO XIV — Primeira solução: procurar palavras ruins

Os primeiros filtros podiam ser relativamente simples.

Algo como:

IF SUBJECT CONTAINS "VIAGRA"
   MOVE TO SPAM
END-IF

Programador COBOL iniciante, perceba a lógica.

Temos uma regra.

Encontramos um padrão.

Tomamos uma decisão.

Maravilhoso.

Até o spammer descobrir.

Então:

VIAGRA

virou:

V1AGRA

Filtro atualizado.

Spammer:

V I A G R A

Filtro atualizado.

Spammer:

V|AGRA

Filtro atualizado.

Spammer:

— Segure minha cerveja.

E colocou o texto dentro de uma imagem.

Agora o filtro procurava palavras.

Mas não havia palavra.

Havia pixels.

Começava oficialmente a corrida armamentista.


👑 ATO XV — Entra Sua Alteza Real da Nigéria

Poucos personagens conseguiram atingir tamanha importância cultural quanto:

o príncipe nigeriano.

A fraude pertence à família dos golpes de adiantamento de pagamento.

O roteiro normalmente envolve uma fortuna bloqueada.

Talvez:

US$ 12 milhões.

US$ 47 milhões.

US$ 93 milhões.

Um príncipe, banqueiro, viúva, ministro ou funcionário público precisa retirar o dinheiro do país.

Por alguma razão, entre bilhões de seres humanos, ele escolheu você.

DEAR SIR,

I AM PRINCE...

I HAVE US$ 48,000,000...

Fantástico.

Um sujeito possui quarenta e oito milhões de dólares.

Mas precisa de você para pagar US$ 600 de documentação.

Monty Python dificilmente escreveria algo melhor.

O mais curioso é que funciona.

Não com todo mundo.

Não precisa.

Lembra da matemática do spam?

Basta encontrar algumas vítimas.


🦠 ATO XVI — Então o spam ganha dentes

Até aqui poderíamos pensar:

— Basta apagar.

Então chegaram vírus, worms, cavalos de Troia e outros códigos maliciosos distribuídos por correio eletrônico.

O e-mail era perfeito.

Ele chegava diretamente ao usuário.

E possuía algo extremamente poderoso:

confiança.

Uma mensagem podia aparentemente vir de alguém conhecido.

E possuir um anexo.

FOTO.JPG
DOCUMENTO.DOC
FATURA.ZIP
LOVE-LETTER.TXT.vbs

O computador precisava de uma coisa.

Que você clicasse.


❤️ ATO XVII — ILOVEYOU

Em maio de 2000 surgiu uma das epidemias digitais mais famosas da história.

A mensagem possuía um assunto irresistivelmente humano:

ILOVEYOU

E um anexo.

Milhões de pessoas abriram.

Por quê?

Porque nenhuma tecnologia de segurança conseguiu corrigir uma vulnerabilidade existente havia milhares de anos:

curiosidade.

Quem me ama?

Clique.

💥

O malware propagava-se enviando cópias para contatos encontrados no sistema.

Agora a vítima também virava distribuidora.

Era genial e terrível.


🧠 ATO XVIII — Descobrimos que o problema não estava apenas no computador

Esse período ensinou uma lição fundamental.

Podemos instalar:

firewall;

antivírus;

IDS;

IPS;

proxy;

controle de acesso;

MFA;

criptografia.

Mas se conseguirmos convencer o usuário a executar nossa ação, atravessamos parte dessas defesas.

A segurança passou a estudar intensamente algo chamado:

Engenharia Social.

Em vez de atacar apenas a máquina:

atacamos a pessoa que opera a máquina.


🎣 ATO XIX — Nasce o phishing industrial

O spammer aprende design.

Sai:

YOU WIN MONEY!!!!!

Entra:

Prezado cliente,

Identificamos uma transação incomum
no valor de R$ 4.983,20.

Caso não reconheça a compra,
clique abaixo.

[CANCELAR TRANSAÇÃO]

Logotipo perfeito.

Cores corretas.

Rodapé profissional.

Aviso jurídico.

Tudo parece legítimo.

Exceto o link.

A vítima entra numa página falsa.

Digita:

usuário;

senha;

cartão;

token;

dados pessoais.

E entrega voluntariamente aquilo que o criminoso talvez nunca conseguisse roubar tecnicamente.


🎩 ATO XX — Spam faz MBA

Em algum momento ocorreu uma transformação maravilhosa.

A palavra spam adquiriu uma reputação tão ruim que ninguém queria ser spammer.

Então surgiu uma solução milenar.

Trocar o nome.

Spam?

Não!

Isso é:

Direct Marketing.

Depois:

E-mail Marketing.

Depois:

Marketing Automation.

Depois:

Lead Generation.

Depois:

Lead Nurturing.

Depois:

Customer Engagement.

Depois provavelmente será:

AI-Powered Hyper-Personalized Customer Relationship Experience Platform.

E custa US$ 399 por mês.

Naturalmente marketing legítimo e spam não são sinônimos. Consentimento, identificação do remetente, possibilidade de descadastramento, legislação e boas práticas fazem enorme diferença.

Mas houve historicamente uma zona cinzenta deliciosa.

Você nunca pediu aquela mensagem.

Mas alguém decidiu que você é um:

LEAD.

Parabéns.

Você deixou de ser Vagner.

Agora é:

LEAD_ID = 0000047281

E está na etapa:

FUNNEL_STATUS = WARM

Monty Python teria orgulho.


🧹 ATO XXI — Precisávamos de algo melhor

Filtrar palavras não era suficiente.

Então ferramentas começaram a utilizar diversas evidências simultaneamente.

Imagine:

FREE MONEY          +3
VIAGRA              +2
20 LINKS            +2
IP SUSPEITO         +5
HTML ESTRANHO       +1
DOMÍNIO NOVO        +2
REMETENTE FALSO     +4

Total:

SPAM-SCORE = 19

Resultado:

MOVE TO SPAM

Ferramentas como o SpamAssassin tornaram-se símbolos dessa abordagem.

Agora o e-mail estava sendo interrogado.

— De onde você veio?

— Quem enviou você?

— Quantos links possui?

— Conhecemos esse IP?

— Seu HTML está estranho.

— Por que você escreveu FREE 47 vezes?

A mensagem começa a suar.


🧠 ATO XXII — O filtro aprende estatística

Depois vieram técnicas estatísticas mais sofisticadas, incluindo os famosos filtros bayesianos.

Em vez de depender exclusivamente de regras rígidas:

VIAGRA = SPAM

podemos perguntar:

Considerando mensagens classificadas anteriormente, qual é a probabilidade de esta mensagem ser spam?

Palavras e padrões ganham pesos estatísticos.

O sistema aprende diferenças entre mensagens desejadas e indesejadas.

E aqui encontramos uma das melhores piadas involuntárias da computação.

Se mensagem ruim é:

SPAM

mensagem legítima frequentemente é chamada:

HAM

Temos então:

             EMAIL
               │
       ┌───────┴───────┐
       ▼               ▼
     🥫 SPAM          🥩 HAM

Décadas de ciência da computação.

Probabilidade.

Estatística.

Machine Learning.

E terminamos discutindo presunto.


🤖 ATO XXIII — Os computadores zumbis

O spammer ainda possuía um problema.

Se milhões de mensagens partissem do mesmo servidor, poderíamos bloquear aquele servidor.

Então surgiu uma solução criminosa muito eficiente:

não usar um único servidor.

Use milhares de computadores infectados.

Um PC doméstico no Brasil.

Outro na Alemanha.

Outro no Japão.

Outro nos Estados Unidos.

Outro na Índia.

Outro na França.

Todos controlados remotamente.

Temos uma:

BOTNET.

Agora o spam possui um exército.

             👿
              │
        Command & Control
              │
    ┌─────────┼─────────┐
    ▼         ▼         ▼
   PC        PC        PC
 Brasil    Japão     Itália
    │         │         │
    └──── SPAM SPAM ────┘

Os vikings agora estavam distribuídos mundialmente.


🪪 ATO XXIV — Precisávamos saber quem realmente enviou a mensagem

O e-mail original nasceu numa Internet relativamente pequena e baseada em confiança.

A Internet moderna não possui esse luxo.

Então foram criados mecanismos adicionais de autenticação.

Três nomes são fundamentais:

SPF

Ajuda a responder:

Quais servidores estão autorizados a enviar mensagens por este domínio?

DKIM

Adiciona assinatura criptográfica que permite verificar características de autenticidade e integridade da mensagem.

DMARC

Define políticas utilizando SPF e DKIM e permite ao domínio indicar como determinadas falhas devem ser tratadas, além de oferecer relatórios.

Para um programador mainframe podemos fazer uma analogia divertida:

SPF
"Esse sujeito pode entrar por esta porta?"

DKIM
"Essa assinatura realmente pertence a ele?"

DMARC
"Se alguma coisa estiver errada,
qual é a política?"

Não é RACF.

Mas podemos brincar:

RACF emocional do SMTP.


🌐 ATO XXV — A caixa postal deixa de morar no PC

Outra revolução mudou completamente nosso relacionamento com o e-mail.

Antes:

SERVIDOR
   │
   │ POP3
   ▼
COMPUTADOR

Baixávamos mensagens.

Arquivávamos localmente.

Fazíamos backup.

Perdíamos o HD.

Chorávamos.

Com webmail, IMAP e serviços em nuvem, o modelo mudou:

                 ☁️
             MAIL SERVER
                 │
       ┌─────────┼─────────┐
       ▼         ▼         ▼
      PC       CELULAR    WEB

A mesma caixa aparece em vários lugares.

Lemos no celular.

Respondemos no notebook.

Arquivamos no navegador.

O estado é sincronizado.

Parece óbvio.

Não era.


☁️ ATO XXVI — O antispam moderno vira uma investigação criminal

Hoje uma mensagem pode passar por dezenas de análises antes de aparecer diante de você.

Imagine:

                 📧
                  │
                  ▼
          reputação do IP
                  │
                  ▼
                 SPF
                  │
                  ▼
                 DKIM
                  │
                  ▼
                DMARC
                  │
                  ▼
          reputação domínio
                  │
                  ▼
           análise do texto
                  │
                  ▼
           análise dos links
                  │
                  ▼
          análise dos anexos
                  │
                  ▼
             antimalware
                  │
                  ▼
            antiphishing
                  │
                  ▼
        modelos estatísticos
                  │
                  ▼
       análise comportamental
                  │
          ┌───────┼───────┐
          ▼       ▼       ▼
        INBOX    SPAM   QUARENTENA

O usuário vê:

1 nova mensagem.

Por trás daquela banalidade existe uma infraestrutura gigantesca trabalhando.


🤖 ATO XXVII — E então demos inteligência artificial aos dois lados

Aqui chegamos aos dias atuais.

Durante décadas havia um pequeno consolo.

Muitos golpes eram linguisticamente ruins.

Erros gramaticais.

Traduções bizarras.

Saudações estranhas.

Textos obviamente artificiais.

Então chegou a IA generativa.

Agora um criminoso pode produzir rapidamente mensagens:

gramaticalmente corretas;

personalizadas;

contextuais;

em vários idiomas;

adaptadas ao cargo;

imitando linguagem corporativa;

com aparência extremamente profissional.

Aquele velho:

DEAR SIR
I HAVE MONEY

pode transformar-se em:

Olá Vagner,

Estou retomando nossa conversa sobre
o fechamento financeiro deste trimestre.

A planilha revisada está disponível no
link abaixo para sua validação.

Muito mais perigoso.

O conteúdo deixou de ser necessariamente o melhor indicador de fraude.

Identidade, contexto, reputação e comportamento tornam-se ainda mais importantes.


🎭 ATO XXVIII — O Ministério dos E-mails Inúteis

Se Monty Python estivesse documentando nossa infraestrutura atual, provavelmente existiria:

Ministry of Silly Emails

Departamento de Mensagens que Poderiam Ter Sido uma Linha.

Departamento de "Conforme Meu E-mail Anterior".

Departamento de Reply All Acidental.

Departamento de Anexos Esquecidos.

Departamento de "Segue anexo" sem anexo.

Departamento de reuniões convocadas para discutir e-mails sobre reuniões.

E naturalmente:

Department of Unsolicited Commercial Communications and Nigerian Royal Affairs.

Com 14 mil funcionários.

Nenhum deles autorizado a bloquear spam porque o formulário SPAM-42B precisa primeiro ser aprovado pelo Departamento de Formulários.


🥚 EASTER EGG — 03:17

Existe um pequeno detalhe escondido nesta história.

São 03:17.

O operador noturno observa o console.

Tudo tranquilo.

Então aparece:

03:17:00 SMTP01
WARNING: ABNORMAL MESSAGE RATE

03:17:02 SMTP01
12,482 messages received

03:17:04 SEC01
SPAM SCORE THRESHOLD EXCEEDED

03:17:05 OPERADOR
"Isso não parece bom."

Cinco minutos depois:

SPAM SPAM SPAM SPAM SPAM
SPAM SPAM SPAM SPAM SPAM
SPAM SPAM SPAM SPAM SPAM

No fundo do datacenter, ninguém consegue explicar por que existe um grupo de vikings cantando diante do IBM Z.

O operador chama segurança.

Segurança consulta RACF.

Os vikings possuem acesso válido.

Ticket encerrado.

Works as designed.


🕵️ A grande lição para o programador COBOL iniciante

Por trás dessa história divertida existe uma lição extremamente séria de arquitetura.

O e-mail mostra perfeitamente como sistemas evoluem.

Começamos com um problema simples:

A precisa mandar mensagem para B.

Criamos uma solução.

A solução torna-se popular.

A popularidade cria novos usos.

Novos usos criam abuso.

O abuso exige controles.

Os controles criam complexidade.

Os atacantes aprendem os controles.

Criamos novos controles.

E o sistema cresce camada sobre camada.

É exatamente o que acontece em muitos ambientes corporativos e mainframe.

Um programa COBOL escrito décadas atrás pode ter começado assim:

LER CLIENTE
CALCULAR SALDO
GRAVAR RESULTADO

Trinta anos depois:

VALIDAR CLIENTE
VALIDAR PRODUTO
VALIDAR CANAL
VALIDAR RACF
CONSULTAR DB2
CONSULTAR VSAM
CHAMAR CICS
ENVIAR MQ
GERAR LOG
GERAR AUDITORIA
VALIDAR COMPLIANCE
PUBLICAR EVENTO
CHAMAR API

Não necessariamente porque alguém projetou uma monstruosidade.

Mas porque a realidade foi acrescentando requisitos.

O e-mail é praticamente um estudo de caso dessa evolução.


📜 55 anos resumidos em uma tela

1960s
Mensagens locais
       │
       ▼
1971
Ray Tomlinson
usuario@host
       │
       ▼
1970s
ARPANET + e-mail
       │
       ▼
1978
primeiro grande spam comercial
       │
       ▼
1980s
BBS / MUD / clientes de correio
       │
       ▼
🥫 "SPAM"
       │
       ▼
1990s
Internet comercial
POP3 + SMTP
Eudora
Netscape
Outlook Express
       │
       ▼
SPAM INDUSTRIAL
       │
 ┌─────┼─────────┐
 ▼     ▼         ▼
sexo  cassino   golpes
       │
       ▼
malware
       │
       ▼
phishing
       │
       ▼
SpamAssassin
blacklists
Bayes
       │
       ▼
SPF
DKIM
DMARC
       │
       ▼
Cloud filtering
Machine Learning
       │
       ▼
IA generativa
       │
       ▼
2026

"URGENTE:
SUA CONTA SERÁ BLOQUEADA."

☕ Epílogo — A tecnologia mudou. O humano nem tanto.

Existe algo extraordinário nessa história.

O hardware mudou.

Os protocolos evoluíram.

Saímos de computadores gigantes conectados à ARPANET para bilhões de dispositivos espalhados pelo planeta.

Passamos da linha discada para fibra óptica.

De caixas postais de poucos megabytes para armazenamento em nuvem.

De regras:

IF SUBJECT = "VIAGRA"

para modelos sofisticados capazes de analisar reputação, comportamento e contexto.

Mas o objetivo do atacante continua frequentemente sendo o mesmo:

fazer alguém acreditar numa mensagem.

Essa talvez seja a maior ironia da história do spam.

Durante décadas tentamos construir computadores suficientemente inteligentes para identificar mensagens ruins.

Enquanto isso, o spammer passou décadas tentando descobrir maneiras melhores de explorar os seres humanos.

Ray Tomlinson resolveu:

Como faço uma pessoa enviar uma mensagem para outra pessoa?

A humanidade respondeu:

— Excelente.

Cinquenta e cinco anos depois estamos tentando resolver:

Como faço somente as pessoas certas conseguirem falar comigo?

E aparentemente ainda temos trabalho pela frente.

Fecho o terminal.

Olho a caixa de entrada.

1 mensagem nova.

Assunto:

URGENT BUSINESS PROPOSAL — US$ 47,000,000

Remetente:

His Royal Highness Prince Something.

Olho para o SpamAssassin.

Olho para SPF.

Olho para DKIM.

Olho para DMARC.

Olho para décadas de ciência da computação.

Aponto solenemente para o botão:

[ MARCAR COMO SPAM ]

Clique.

Silêncio.

Então, muito ao longe, vindo de algum lugar desconhecido da Internet:

SPAM! SPAM! SPAM! SPAM!

Um viking começa a cantar.

Outro acompanha.

A garçonete aparece trazendo ovos.

E um administrador de sistemas grita:

— EU NÃO QUERO SPAM!

Os vikings respondem:

🎵 SPAM, SPAM, SPAM, SPAM... WONDERFUL SPAM! 🎵

FIM.

Ou melhor...

250 OK
Message accepted for delivery.

Porque e-mail nenhum termina realmente.

Ele apenas espera o próximo SEND.


Bellacosa Mainframe

Onde até uma lata de carne de 1937 pode acabar explicando filtros bayesianos, botnets, phishing e 55 anos de história da computação.

☕ Um Café no Bellacosa Mainframe



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