☕ 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

sábado, 28 de dezembro de 2024

Workload Manager (WLM) sem Mistérios

 

☕ Um Café no Bellacosa Mainframe

Bellacosa Mainframe e o wlm workload manager

Workload Manager (WLM) sem Mistérios

Como o IBM Z Decide Quem Executa Primeiro — O Guia Definitivo do Programador COBOL Padawan Inspirado em Star Trek

"A necessidade de muitos supera a necessidade de poucos... ou de apenas um processo batch."

— Adaptado de Spock, Star Trek II


Introdução

Existe uma pergunta que todo programador COBOL faz mais cedo ou mais tarde.

"Por que meu programa demorou 2 minutos ontem e hoje levou 18 minutos, se eu não alterei uma linha sequer?"

A maioria imagina que seja:

  • o disco;

  • o Db2;

  • o CICS;

  • a rede;

  • o operador;

  • o compilador;

  • ou simplesmente "o mainframe está lento".

Na enorme maioria das vezes...

não é nada disso.

Existe um "cérebro invisível" tomando decisões milhares de vezes por segundo.

Ele observa:

  • CPU

  • Memória

  • I/O

  • Prioridades

  • Objetivos de negócio

  • Tempo de resposta

  • Importância das aplicações

E decide quem executa primeiro.

Esse cérebro chama-se WLM (Workload Manager).

Para um programador COBOL iniciante, entender o WLM muda completamente a forma de enxergar o IBM Z.

Hoje vamos descobrir por que.

Pegue seu café.

O Dr. Spock já está olhando desconfiado para uma fila de jobs no JES2.


Antes de tudo...

O que é um Workload?

A palavra Workload significa literalmente:

Carga de trabalho.

No IBM Z isso representa:

  • um programa COBOL

  • um CICS

  • uma transação IMS

  • um job batch

  • uma consulta Db2

  • uma API

  • um Java

  • um processo USS

Tudo isso compete pelos mesmos recursos.

Imagine um restaurante.

Entram ao mesmo tempo:

  • um cliente querendo um café

  • outro querendo um almoço

  • outro querendo um banquete

  • outro apenas pagar a conta

O restaurante precisa decidir:

Quem atender primeiro?

O IBM Z faz exatamente isso.


A origem do problema

Nos anos 60 e 70 era simples.

Existiam poucos jobs.

Poucos usuários.

Pouca memória.

Pouca CPU.

O sistema executava praticamente por ordem de chegada.

Funcionava.

Até deixar de funcionar.


Década de 80

As empresas cresceram.

Agora existiam:

  • folha de pagamento

  • cartões de crédito

  • reservas aéreas

  • bancos

  • bolsa de valores

Todos queriam CPU.

Ao mesmo tempo.


Imagine um banco.

08:00

Milhões de clientes entrando.

Ao mesmo tempo.

Quem recebe CPU?

A impressão do relatório?

Ou o PIX?

A resposta parece óbvia.

Mas alguém precisa decidir isso automaticamente.


Nasce o WLM

A IBM criou o Workload Manager.

A ideia era revolucionária.

Ao invés de dizer:

"Este job possui prioridade 7."

Passou-se a dizer:

"Quero que esta aplicação responda em menos de 0,5 segundo."

Perceba a diferença.

O administrador não fala mais COMO.

Ele fala O OBJETIVO.

Quem decide como alcançar esse objetivo é o WLM.

Isso foi um enorme avanço em relação aos antigos esquemas de prioridade fixa.


O Dr. Spock explica

Imagine a USS Enterprise.

Temos:

  • Motor Warp

  • Escudos

  • Sensores

  • Transporte

  • Holodeck

  • Refeitório

Todos querem energia.

Agora imagine:

Os Klingons atacam.

O computador pergunta:

"Capitão, onde envio energia?"

Spock responde imediatamente:

"Escudos primeiro."

Não porque gosta dos escudos.

Mas porque são mais importantes naquele momento.

O WLM faz exatamente isso.


Como o WLM enxerga o sistema?

Ele observa constantemente:

CPU

Memória

Disco

Canal

Rede

Db2

CICS

IMS

USS

Java

Batch

Tudo.

Em tempo real.

Centenas de vezes por segundo.


O conceito mais importante

Objetivos

O WLM trabalha baseado em objetivos.

Exemplo.

Aplicação bancária.

Objetivo:

95% das transações

devem responder

em até

0,3 segundo.

Outro sistema.

Relatórios batch.

Objetivo:

Finalizar antes das 06:00.

Outro.

Carga estatística.

Objetivo:

Executar apenas quando houver CPU livre.

Percebe?

Nem tudo possui a mesma importância.


Classes de Serviço

O WLM agrupa workloads em:

Service Classes

Exemplo.

Classe 1

PIX

Classe 2

ATM

Classe 3

Internet Banking

Classe 4

Relatórios

Classe 5

Testes

Cada uma possui metas diferentes.


Importance

Além da meta existe outro conceito.

Importance.

Vai de:

1

até

Onde

1

é a mais importante.

Imagine:

Pagamento instantâneo.

Importance 1.

Relatório mensal.

Importance 5.

Quem recebe CPU primeiro?

Obviamente.

Importance 1.


Velocity

Nem todo sistema mede tempo.

Alguns medem:

Velocity.

É quanto tempo uma aplicação consegue trabalhar sem ficar esperando recursos.

Quanto maior.

Melhor.


Response Time

Muito usado no:

CICS

IMS

APIs

Db2

Objetivo:

Responder rapidamente.


Execution Velocity

Mais comum em:

Batch

Long Running Jobs


Como o WLM decide?

Ele calcula algo chamado:

Performance Index

PI.

PI=1

Meta atingida.

PI menor que 1

Melhor que esperado.

PI maior que 1

Está atrasado.

Quanto maior o PI.

Mais recursos ele tende a receber.


O que acontece quando falta CPU?

Imagine.

100 programas.

Apenas 10 CPUs disponíveis.

Quem roda?

O WLM faz cálculos.

Avalia:

Objetivos

Importância

Fila

Tempo

Uso

Espera

E redistribui recursos.

Automaticamente.


O programador COBOL percebe isso?

Sim.

Muito.


Imagine este JCL.

//STEP01 EXEC PGM=FINANCE

Ontem.

3 minutos.

Hoje.

11 minutos.

O programa está igual.

O JCL está igual.

O Load Module está igual.

O Db2 está igual.

Mudou apenas:

O ambiente.

Mais workloads competindo.

O WLM redistribuiu CPU.


Um exemplo prático

Durante a madrugada.

Executam:

Backup

RUNSTATS

REORG

COPY

SORT

Folha

Faturamento

Fechamento financeiro

Seu programa COBOL entra.

O WLM percebe que existem workloads mais importantes.

Seu job espera.

Não porque esteja errado.

Mas porque alguém é mais prioritário.


Batch também usa WLM?

Sim.

Muita gente pensa que WLM serve apenas para CICS.

Erro clássico.

Batch também é controlado.

Inclusive:

JES2

Db2 Utilities

SORT

COBOL

PLI

Assembler

Todos.


O impacto no COBOL

Seu programa pode sofrer:

Menos CPU

Mais CPU

Mais espera

Mais concorrência

Mais I/O

Maior paralelismo

Tudo sem alterar uma linha.


O impacto no JCL

O JCL não conversa diretamente com o WLM.

Mas define:

Job Class

MSGCLASS

Initiator

Região

Scheduler

Todos esses elementos acabam influenciando como o workload será classificado.


Exemplo.

//JOB CLASS=A

Dependendo da instalação.

Classe A

Pode ser crítica.

Ou baixa prioridade.

Cada empresa configura diferente.


CICS

Quando um cliente faz:

EXEC CICS READ

O WLM acompanha.

Se a resposta está demorando.

Pode aumentar recursos para aquela região.


IMS

O mesmo ocorre.

Principalmente em transações OLTP.


Db2

Consultas críticas.

Podem ganhar mais CPU.

Consultas analíticas.

Podem esperar.


Sysplex

Agora imagine.

Quatro IBM Z.

Executando juntos.

Quem distribui a carga?

O WLM.

Ele conversa com:

Sysplex.

XCF.

LM.

PR/SM.

Hipersockets.

Tudo integrado.


Relação com o PR/SM

Outro detalhe interessante.

Existe um "WLM dentro do hardware."

Na verdade.

O WLM conversa com o PR/SM.

O hardware então redistribui capacidade entre LPARs.

É um verdadeiro diálogo entre software e firmware.


Um passo a passo mental para entender

Imagine:

  1. Seu JCL entra no JES2.

  1. Aguarda Initiator.

  1. Começa a executar.

  1. O WLM identifica sua classe.

  1. Descobre seu objetivo.

  1. Mede seu desempenho.

  1. Calcula PI.

  1. Decide dar mais ou menos CPU.

  1. Continua monitorando.

  1. Repete tudo continuamente.


Dicas para o programador COBOL

Não culpe imediatamente o programa

Se ficou lento.

Veja:

Foi apenas hoje?

Só nesse horário?

Outros jobs também ficaram lentos?


Observe concorrência

Talvez o problema seja:

Backup

RUNSTATS

COPY

REORG

Compressão

Carga massiva


Consulte o operador

Pergunte:

"Houve alguma alteração de workload?"

Essa simples pergunta demonstra maturidade técnica.


Não aumente REGION sem motivo

Mais memória.

Nem sempre.

Mais desempenho.


SQL ruim continua ruim

O WLM não faz milagres.

Ele apenas distribui recursos.


CPU não resolve algoritmo ruim

Código:

PERFORM 10000000 TIMES

Continuará ruim.

Mesmo com prioridade máxima.


Problemas comuns

Job demora apenas em determinados horários

Normalmente.

Concorrência.


CICS lento somente às 10h

Pico de usuários.


Batch muito variável

Disputa por recursos.


PI elevado

Objetivos não sendo atendidos.


Espera de I/O

O gargalo não é CPU.


Como investigar?

Ferramentas comuns:

  • RMF

  • SMF

  • SDSF

  • IBM OMEGAMON

  • IBM Z Performance and Capacity Analytics

  • Resource Measurement Facility Reports

São elas que mostram onde o tempo realmente foi gasto.


Curiosidades

O WLM é considerado um dos maiores diferenciais do IBM Z.

Enquanto muitos sistemas operacionais ainda trabalham com prioridades relativamente estáticas, o z/OS ajusta dinamicamente a alocação de recursos para cumprir objetivos de negócio.

Em grandes bancos, seguradoras e companhias aéreas, essa inteligência permite que milhões de transações críticas coexistam com cargas batch sem intervenção manual constante.


Easter Eggs

Easter Egg 1

O WLM raramente recebe reconhecimento.

Quando tudo funciona, ninguém lembra dele.

Quando algo atrasa...

Todo mundo lembra.

É como Scotty na Enterprise: se o motor Warp está perfeito, ninguém comenta; basta um problema para todos chamarem o engenheiro.


Easter Egg 2

O WLM nunca "gosta" de um programa.

Ele apenas executa cálculos.

Isso combina perfeitamente com a filosofia vulcana de Spock:

"A lógica deve prevalecer sobre a emoção."


Easter Egg 3

Muitos programadores passam anos acreditando que aumentar a prioridade do job resolve qualquer lentidão.

Spock provavelmente responderia:

"Uma prioridade maior não cria mais CPU. Apenas muda quem espera."


Vantagens do WLM

  • Distribuição inteligente de CPU, memória e I/O.

  • Priorização por objetivos de negócio, não apenas por prioridade fixa.

  • Melhor aproveitamento do hardware IBM Z.

  • Redução da intervenção manual dos operadores.

  • Maior previsibilidade para aplicações críticas.

  • Integração com Parallel Sysplex e PR/SM.

  • Balanceamento dinâmico entre workloads.

  • Escalabilidade para milhares de workloads simultâneos.

  • Melhor experiência para usuários finais.

  • Uso eficiente de recursos mesmo em horários de pico.


Conclusão

Para o programador COBOL padawan, o WLM pode parecer invisível, mas ele influencia diretamente o comportamento de praticamente todo programa executado no z/OS. Um mesmo executável pode apresentar tempos completamente diferentes dependendo da carga do sistema, das metas definidas para sua classe de serviço e das prioridades de negócio vigentes naquele instante.

Compreender conceitos como workload, Service Class, Importance, Response Time, Velocity e Performance Index (PI) ajuda a separar problemas de infraestrutura de problemas de programação. Muitas vezes, o código COBOL está correto; o que mudou foi o ambiente ao seu redor.

Na visão do Dr. Spock, o WLM é o oficial de operações da Enterprise: ele não favorece aplicações por preferência, mas por lógica. Se uma transação financeira precisa responder em frações de segundo enquanto um relatório pode esperar alguns minutos, essa é exatamente a decisão que o WLM tomará, milhares de vezes por segundo, mantendo o IBM Z equilibrado, eficiente e alinhado aos objetivos do negócio.

No fim das contas, aprender WLM é deixar de enxergar apenas o programa COBOL e começar a compreender o ecossistema completo do mainframe. É perceber que um bom desenvolvedor não escreve apenas código eficiente; ele entende como esse código convive com milhares de outros programas, compartilhando recursos em um dos sistemas operacionais mais sofisticados já criados. Esse é um dos passos que transforma um padawan em um verdadeiro mestre do IBM Z.


sexta-feira, 27 de dezembro de 2024

YAML na Prática : O guia do Programador COBOL Padawan para dominar configurações, automação e infraestrutura sem provocar um ABEND na indentação

 

Bellacosa Mainframe e o yaml na pratica e sem misterios

☕ Um Café no Bellacosa Mainframe

YAML na Prática sem Mistérios

O guia do Programador COBOL Padawan para dominar configurações, automação e infraestrutura sem provocar um ABEND na indentação

Imagine a seguinte cena.

Você passou anos navegando pelos corredores seguros do IBM Z. Conhece JCL, COBOL, CICS, Db2, VSAM, SDSF, RACF e talvez até tenha algumas cicatrizes de batalhas contra um S0C7 ocorrido às três da manhã.

Então, certo dia, alguém da equipe DevOps aparece e diz:

— Precisamos alterar o arquivo YAML do pipeline.

Você olha para a tela e encontra algo parecido com isto:

aplicacao:
  nome: CONTAS
  linguagem: COBOL
  ambiente: homologacao

Não há IDENTIFICATION DIVISION.

Não há ponto final obrigatório.

Não há colunas 7, 8 ou 72.

Não há //SYSIN DD *.

Mesmo assim, aqueles espaços aparentemente inocentes controlam aplicações, pipelines, containers, provisionamento de infraestrutura e processos automatizados.

Bem-vindo ao universo do YAML.

Para o programador mainframe, aprender YAML não significa abandonar COBOL, JCL ou o IBM Z. Significa construir uma ponte entre o processamento corporativo tradicional e o mundo de automação, APIs, Git, CI/CD, Ansible, Kubernetes, z/OSMF, Zowe e infraestrutura como código.

O YAML pode parecer simples, mas possui uma regra implacável:

A máquina não enxerga beleza estética. Ela enxerga estrutura.

Um espaço colocado no lugar errado pode alterar completamente o significado do documento.

Pegue sua caneca de café, ajuste os sensores da Enterprise e prepare-se. Vamos explorar YAML do básico ao laboratório prático.


1. Afinal, o que é YAML?

YAML é uma linguagem de serialização de dados legível por humanos, muito utilizada para representar configurações e estruturas de informação.

A versão oficial da especificação é a YAML 1.2.2, publicada para corrigir erros e esclarecer pontos da versão 1.2, sem introduzir mudanças normativas fundamentais.

Serializar dados significa representar informações estruturadas em um formato que possa ser:

  • gravado em arquivo;

  • transmitido entre sistemas;

  • interpretado por programas;

  • armazenado em repositórios;

  • usado para configurar ferramentas;

  • convertido para objetos em diferentes linguagens.

A sigla YAML significa:

YAML Ain’t Markup Language

Ou, em português:

YAML não é uma linguagem de marcação.

Trata-se de um acrônimo recursivo, uma brincadeira clássica da cultura da computação.

Isso procura deixar claro que YAML não foi criado para formatar páginas como HTML. Seu objetivo principal é representar dados.

Um arquivo YAML pode descrever:

  • servidores;

  • aplicações;

  • ambientes;

  • parâmetros de execução;

  • pipelines;

  • inventários;

  • jobs;

  • containers;

  • permissões;

  • tarefas de automação;

  • configurações de testes;

  • serviços e dependências.

No universo mainframe, ele pode representar:

  • nomes de datasets;

  • subsistemas CICS;

  • regiões IMS;

  • bibliotecas de carga;

  • parâmetros de compilação;

  • aplicações COBOL;

  • ambientes de desenvolvimento;

  • comandos TSO;

  • tarefas do Ansible;

  • definições de pipelines;

  • informações de deploy;

  • configurações do Zowe;

  • chamadas ao z/OSMF;

  • propriedades usadas pelo IBM Dependency Based Build.


2. YAML não é uma linguagem de programação

Esse ponto é essencial.

YAML não possui, por si só:

  • comandos executáveis;

  • estruturas de repetição;

  • processamento de arquivos;

  • cálculos;

  • acesso a banco de dados;

  • chamadas de subprogramas;

  • controle transacional;

  • gerenciamento de memória.

Ele apenas descreve dados.

Considere:

programa:
  nome: PGMPAG01
  linguagem: COBOL
  compilacao: obrigatoria

Esse documento não compila o programa.

Ele apenas declara informações.

Outra ferramenta poderá ler esse arquivo e decidir:

  1. localizar o fonte PGMPAG01;

  2. executar uma compilação;

  3. realizar o bind do programa;

  4. publicar o módulo de carga;

  5. iniciar os testes.

Portanto, pense no YAML como um SYSIN moderno e estruturado.

No mainframe, é comum entregar parâmetros para um utilitário:

//SYSIN DD *
  DELETE CLIENTES
  DEFINE CLUSTER(...)
  LISTCAT
/*

No mundo da automação, uma ferramenta pode receber parâmetros em YAML:

operacao: criar
dataset: USER01.TESTE.COBOL
tipo: biblioteca
formato:
  recfm: FB
  lrecl: 80

O princípio é parecido:

O arquivo descreve o que desejamos. Outra ferramenta interpreta e executa.


3. Onde um mainframer encontrará YAML?

YAML aparece com frequência crescente na modernização do IBM Z.

Ansible

Playbooks do Ansible são normalmente escritos em YAML.

- name: Verificar datasets
  hosts: zos
  tasks:
    - name: Consultar biblioteca COBOL
      ibm.ibm_zos_core.zos_data_set:
        name: USER01.COBOL
        state: present

Pipelines de CI/CD

GitHub Actions, GitLab CI, Azure DevOps e outras plataformas usam YAML para descrever pipelines.

jobs:
  compilar:
    steps:
      - name: Compilar COBOL
        run: python compilar.py

Kubernetes

Objetos como pods, deployments, services e configurações são frequentemente declarados em YAML.

Zowe

Arquivos de perfil e configurações de ferramentas do ecossistema Zowe podem envolver estruturas YAML.

IBM Dependency Based Build

Configurações de build e processos de automação podem utilizar YAML direta ou indiretamente, dependendo da arquitetura adotada.

Testes automatizados

Ferramentas podem usar YAML para definir:

  • massa de testes;

  • valores de entrada;

  • resultados esperados;

  • ambientes;

  • parâmetros de conexão.

Infraestrutura como código

YAML também aparece em ferramentas que provisionam, configuram ou descrevem ambientes de infraestrutura.

Por isso, conhecer YAML é como aprender a interpretar painéis de uma nave moderna. Você talvez não tenha construído o motor de dobra, mas precisa entender os controles.


4. O primeiro segredo: YAML é uma árvore

Um arquivo YAML deve ser imaginado como uma árvore hierárquica.

Veja:

aplicacao:
  nome: PAGAMENTOS
  plataforma: IBM Z
  componentes:
    - COBOL
    - CICS
    - Db2

A raiz possui uma chave chamada aplicacao.

Dentro dela existem:

  • nome;

  • plataforma;

  • componentes.

E componentes contém uma lista.

Podemos imaginar:

aplicacao
├── nome
├── plataforma
└── componentes
    ├── COBOL
    ├── CICS
    └── Db2

Essa visão ajuda muito o programador COBOL.

Pense em uma estrutura semelhante a uma área de dados:

01 WS-APLICACAO.
   05 WS-NOME          PIC X(20).
   05 WS-PLATAFORMA    PIC X(10).
   05 WS-COMPONENTES.
      10 WS-COMPONENTE OCCURS 3 TIMES PIC X(10).

Não é uma correspondência perfeita, mas a analogia é excelente para começar.


5. Os componentes fundamentais

5.1 Chave e valor

A estrutura mais comum é:

chave: valor

Exemplo:

programa: PGMCAD01
linguagem: COBOL

O espaço depois dos dois-pontos é importante.

Prefira:

programa: PGMCAD01

Evite:

programa:PGMCAD01

5.2 Mapas

Um mapa agrupa pares de chave e valor.

programa:
  nome: PGMCAD01
  tipo: batch
  linguagem: COBOL

programa contém um mapa com três propriedades.

Em COBOL, isso lembra um grupo de nível 01 com campos subordinados.

5.3 Listas

As listas são indicadas por hífens:

bibliotecas:
  - USER01.COBOL
  - USER01.COPYBOOK
  - USER01.JCL

Isso se aproxima conceitualmente de uma tabela OCCURS.

05 WS-BIBLIOTECA OCCURS 3 TIMES PIC X(44).

5.4 Lista de objetos

Podemos ter vários elementos complexos:

programas:
  - nome: PGMCAD01
    tipo: batch
    linguagem: COBOL

  - nome: PGMCIC01
    tipo: online
    linguagem: COBOL

Cada item da lista possui suas próprias propriedades.

5.5 Booleanos

ativo: true
compilar: false

Para arquivos modernos, prefira true e false.

Evite depender de palavras como yes, no, on e off, pois bibliotecas baseadas em versões ou esquemas diferentes do YAML podem tratá-las de formas distintas.

Quando houver dúvida sobre o tipo, use aspas:

resposta: "yes"
estado: "on"

5.6 Números

timeout: 30
quantidade_retentida: 10
percentual: 99.5

5.7 Valores nulos

responsavel: null

Isso representa ausência de valor.

5.8 Comentários

# Aplicação responsável pelo cadastro de clientes
aplicacao: CLIENTES

Comentários começam com #.

Eles são úteis, mas não devem substituir uma documentação adequada.


6. A Lei Suprema da Indentação

Em COBOL tradicional, a coluna sempre teve grande importância.

YAML também é profundamente sensível ao posicionamento, porém usa indentação para representar hierarquia.

Observe:

aplicacao:
  nome: FATURAMENTO
  ambiente: producao

Os campos nome e ambiente pertencem a aplicacao.

Agora veja:

aplicacao:
  nome: FATURAMENTO
ambiente: producao

Aqui, ambiente não pertence mais a aplicacao. Ele está no nível principal do documento.

O arquivo pode continuar sintaticamente válido, mas seu significado mudou.

Esse é um dos erros mais perigosos em YAML: o documento pode ser aceito pelo parser, mas representar outra estrutura.

Nunca use TAB para indentar

Use espaços.

A especificação do YAML trabalha com espaços na indentação, não com caracteres de tabulação.

Uma convenção segura é usar dois espaços por nível:

aplicacao:
  banco:
    nome: DB2P
    tabelas:
      - CLIENTES
      - CONTAS

Não existe obrigação universal de usar exatamente dois espaços, mas a consistência é obrigatória.

É como trabalhar com níveis COBOL:

01 REGISTRO.
   05 CLIENTE.
      10 NOME.
      10 CONTA.

O nível informa a estrutura. No YAML, a indentação cumpre esse papel.


7. Aspas: quando usar?

Muitos valores não precisam de aspas:

nome: FATURAMENTO
ambiente: producao

Entretanto, há situações nas quais as aspas evitam ambiguidades.

Strings que parecem números

codigo: "00123"

Sem aspas, um parser poderá tratar o valor como número e perder os zeros à esquerda.

Para um mainframer, isso é crítico. 00123 pode ser um código, não o número cento e vinte e três.

Datas

data_processamento: "2026-07-18"

Colocar datas entre aspas impede que determinadas bibliotecas façam conversões automáticas inesperadas.

Valores com caracteres especiais

descricao: "Processamento: fechamento mensal"

Valores semelhantes a booleanos

estado: "on"
resposta: "no"

Senhas ou tokens

Mesmo usando aspas, não grave segredos diretamente no YAML:

senha: "MinhaSenhaSecreta"

Isso continua sendo texto visível.

Aspas não criptografam.

O correto é usar:

  • gerenciadores de segredos;

  • variáveis de ambiente;

  • cofres de credenciais;

  • mecanismos protegidos pelo pipeline;

  • soluções corporativas integradas ao RACF ou à plataforma utilizada.


8. Textos com várias linhas

YAML possui recursos muito úteis para textos longos.

Preservando as quebras de linha com |

descricao: |
  Este processo executa o fechamento diário.
  Em caso de falha, consulte o runbook.
  Não reinicie sem verificar o checkpoint.

O | preserva as quebras de linha.

Dobrando as linhas com >

descricao: >
  Este processo executa o fechamento diário
  e deve ser acompanhado pela equipe
  responsável pela aplicação.

O > normalmente transforma as quebras em espaços, formando um parágrafo.

Isso pode ser útil para:

  • descrições;

  • comandos;

  • mensagens;

  • procedimentos operacionais;

  • instruções de deploy.


9. Laboratório no Windows

Vamos montar um ambiente prático.

Precisaremos de:

  • Windows 10 ou Windows 11;

  • Visual Studio Code;

  • extensão YAML;

  • Python;

  • biblioteca PyYAML;

  • Prompt de Comando ou PowerShell.

A documentação oficial do Python informa que o gerenciador de instalação para Windows pode ser obtido pela Microsoft Store ou pelos canais oficiais do Python.

A extensão YAML da Red Hat para Visual Studio Code oferece recursos como validação, detecção de erros, conclusão automática, visão estrutural do documento e suporte a esquemas.

Passo 1 — Criar a pasta do projeto

Abra o Prompt de Comando:

mkdir C:\yaml-mainframe
cd C:\yaml-mainframe

Essa será nossa USS local — uma pequena base de operações no Windows.

Passo 2 — Verificar o Python

Execute:

python --version

Em instalações mais novas do Windows, também poderá funcionar:

py --version

Depois, confirme o gerenciador de pacotes:

py -m pip --version

Passo 3 — Criar um ambiente virtual

No diretório do projeto:

py -m venv .venv

Ative o ambiente no Prompt de Comando:

.venv\Scripts\activate

No PowerShell:

.\.venv\Scripts\Activate.ps1

Quando o ambiente estiver ativo, o terminal normalmente exibirá algo semelhante a:

(.venv) C:\yaml-mainframe>

O ambiente virtual isola as dependências do projeto. Isso evita instalar bibliotecas globalmente sem necessidade.

Passo 4 — Instalar o PyYAML

python -m pip install pyyaml

PyYAML é uma biblioteca para ler e gerar YAML usando Python, e sua instalação pode ser realizada por meio do pip.

Passo 5 — Abrir o projeto no Visual Studio Code

code .

Caso o comando code não esteja disponível, abra o VS Code manualmente e selecione:

Arquivo → Abrir Pasta → C:\yaml-mainframe

Passo 6 — Instalar a extensão YAML

No VS Code:

  1. abra a área de extensões;

  2. pesquise por YAML;

  3. selecione a extensão publicada pela Red Hat;

  4. clique em instalar.

Agora teremos realce de sintaxe e auxílio na identificação de erros.


10. Nosso projeto: inventário de aplicações mainframe

Crie o arquivo:

inventario-mainframe.yaml

Digite:

---
empresa: Bellacosa Galactic Bank
ambiente: homologacao
responsavel: equipe-mainframe

zos:
  sistema: ZOS1
  versao: "3.1"
  sysplex: BELLAPLEX
  lpar: ZHML01

subsistemas:
  cics:
    ativo: true
    regioes:
      - nome: CICSHML1
        tipo: AOR
        porta: 30101

      - nome: CICSHML2
        tipo: TOR
        porta: 30102

  db2:
    ativo: true
    subsistema: DB2H
    versao: "13"
    databases:
      - CLIENTES
      - CONTAS
      - PAGAMENTOS

aplicacoes:
  - nome: CADASTRO-CLIENTES
    codigo: "APL001"
    tipo: online
    linguagem: COBOL
    transacao_cics: CCLI
    programa_principal: PGMCIC01
    bibliotecas:
      fonte: USER01.COBOL
      copybook: USER01.COPYLIB
      carga: USER01.LOAD
    dependencias:
      - Db2
      - CICS
      - VSAM
    compilacao:
      obrigatoria: true
      compilador: Enterprise COBOL
      opcoes:
        - RENT
        - SSRANGE
        - TEST

  - nome: FECHAMENTO-DIARIO
    codigo: "APL002"
    tipo: batch
    linguagem: COBOL
    programa_principal: PGMFEC01
    jcl: JOBFEC01
    bibliotecas:
      fonte: USER01.BATCH.COBOL
      copybook: USER01.COPYLIB
      carga: USER01.BATCH.LOAD
    dependencias:
      - Db2
      - DFSORT
    janela:
      inicio: "22:00"
      termino: "23:30"
    compilacao:
      obrigatoria: false
      compilador: Enterprise COBOL
      opcoes:
        - RENT
        - OPTFILE

politicas:
  permitir_deploy_manual: false
  exigir_aprovacao: true
  reter_backups: 10

mensagem_operacional: |
  Antes de executar qualquer deploy:
  1. verificar o resultado da compilação;
  2. conferir os testes automatizados;
  3. validar o plano de retorno;
  4. consultar o responsável pela mudança.

easter_egg:
  nave: USS Enterprise
  computador: LCARS-Z
  mensagem: "A lógica é apenas o começo da sabedoria."
...

Agora vamos entender o documento.


11. Explicando cada parte

Marcador inicial

---

Os três hífens indicam o início de um documento YAML.

Não são sempre obrigatórios, mas tornam o arquivo mais explícito, especialmente quando existe mais de um documento no mesmo fluxo.

Informações gerais

empresa: Bellacosa Galactic Bank
ambiente: homologacao
responsavel: equipe-mainframe

São propriedades simples no nível raiz.

Estrutura do z/OS

zos:
  sistema: ZOS1
  versao: "3.1"

zos é um mapa.

A versão foi colocada entre aspas para preservar seu significado como identificador textual, não como número para cálculos.

Subsistemas

subsistemas:
  cics:
  db2:

Temos um mapa chamado subsistemas, contendo outros mapas.

Regiões CICS

regioes:
  - nome: CICSHML1
    tipo: AOR

regioes é uma lista.

Cada item possui:

  • nome;

  • tipo;

  • porta.

Aplicações

aplicacoes:
  - nome: CADASTRO-CLIENTES

aplicacoes é uma lista de objetos complexos.

Cada aplicação contém propriedades próprias.

Bibliotecas

bibliotecas:
  fonte: USER01.COBOL
  copybook: USER01.COPYLIB
  carga: USER01.LOAD

Aqui usamos um mapa porque cada biblioteca possui uma função diferente.

Dependências

dependencias:
  - Db2
  - CICS
  - VSAM

É uma lista simples.

Opções de compilação

opcoes:
  - RENT
  - SSRANGE
  - TEST

Outro exemplo de lista.

Não estamos executando o compilador. Estamos documentando ou parametrizando quais opções uma automação deverá usar.

Mensagem operacional

mensagem_operacional: |

O símbolo | preserva as linhas, criando um pequeno runbook dentro do arquivo.

Final do documento

...

Os três pontos podem indicar o encerramento explícito do documento.

Assim como ---, são opcionais em muitos casos.


12. Criando o programa Python que lerá o YAML

Crie o arquivo:

ler_inventario.py

Digite:

from pathlib import Path
import sys

import yaml


ARQUIVO_YAML = Path("inventario-mainframe.yaml")


def carregar_yaml(caminho: Path) -> dict:
    """Carrega um arquivo YAML com tratamento básico de erros."""

    if not caminho.exists():
        raise FileNotFoundError(
            f"O arquivo {caminho} não foi encontrado."
        )

    with caminho.open("r", encoding="utf-8") as arquivo:
        dados = yaml.safe_load(arquivo)

    if not isinstance(dados, dict):
        raise ValueError(
            "O documento YAML deve possuir um mapa no nível principal."
        )

    return dados


def validar_inventario(dados: dict) -> list[str]:
    """Verifica a presença de campos obrigatórios."""

    erros = []

    campos_obrigatorios = [
        "empresa",
        "ambiente",
        "zos",
        "aplicacoes",
    ]

    for campo in campos_obrigatorios:
        if campo not in dados:
            erros.append(f"Campo obrigatório ausente: {campo}")

    aplicacoes = dados.get("aplicacoes", [])

    if not isinstance(aplicacoes, list):
        erros.append("O campo 'aplicacoes' deve ser uma lista.")
        return erros

    for indice, aplicacao in enumerate(aplicacoes, start=1):
        if not isinstance(aplicacao, dict):
            erros.append(
                f"A aplicação {indice} deve ser representada por um mapa."
            )
            continue

        for campo in ["nome", "codigo", "tipo", "linguagem"]:
            if campo not in aplicacao:
                erros.append(
                    f"Aplicação {indice}: campo '{campo}' ausente."
                )

    return erros


def exibir_relatorio(dados: dict) -> None:
    """Apresenta um resumo legível do inventário."""

    print("=" * 70)
    print("INVENTÁRIO GALÁCTICO DE APLICAÇÕES MAINFRAME")
    print("=" * 70)

    print(f"Empresa........: {dados['empresa']}")
    print(f"Ambiente.......: {dados['ambiente']}")
    print(f"Sistema z/OS...: {dados['zos']['sistema']}")
    print(f"Sysplex........: {dados['zos']['sysplex']}")
    print(f"LPAR...........: {dados['zos']['lpar']}")
    print()

    aplicacoes = dados["aplicacoes"]

    print(f"Aplicações encontradas: {len(aplicacoes)}")
    print("-" * 70)

    for aplicacao in aplicacoes:
        print(f"Nome...........: {aplicacao['nome']}")
        print(f"Código.........: {aplicacao['codigo']}")
        print(f"Tipo...........: {aplicacao['tipo']}")
        print(f"Linguagem......: {aplicacao['linguagem']}")
        print(f"Programa.......: {aplicacao['programa_principal']}")

        dependencias = aplicacao.get("dependencias", [])
        print(f"Dependências...: {', '.join(dependencias)}")

        opcoes = aplicacao.get("compilacao", {}).get("opcoes", [])
        print(f"Opções COBOL...: {', '.join(opcoes)}")
        print("-" * 70)


def main() -> int:
    try:
        dados = carregar_yaml(ARQUIVO_YAML)

        erros = validar_inventario(dados)

        if erros:
            print("O inventário possui inconsistências:")

            for erro in erros:
                print(f"- {erro}")

            return 8

        exibir_relatorio(dados)
        return 0

    except yaml.YAMLError as erro:
        print(f"Erro de sintaxe YAML: {erro}")
        return 12

    except (FileNotFoundError, ValueError, KeyError) as erro:
        print(f"Erro ao processar inventário: {erro}")
        return 16


if __name__ == "__main__":
    sys.exit(main())

13. Por que usamos safe_load?

No código temos:

dados = yaml.safe_load(arquivo)

Essa escolha é muito importante.

Evite usar indiscriminadamente:

yaml.load(arquivo)

Alguns carregadores YAML podem interpretar tags capazes de criar objetos específicos da linguagem ou executar comportamentos indesejados.

Quando o arquivo vem de origem externa ou não confiável, o risco aumenta.

safe_load limita o carregamento a tipos básicos e seguros, como:

  • mapas;

  • listas;

  • strings;

  • números;

  • booleanos;

  • valores nulos.

É o equivalente a aplicar o princípio de menor privilégio:

Não entregue autoridade de sistema a um arquivo de configuração apenas porque sua extensão termina em .yaml.


14. Executando o laboratório

No terminal, com o ambiente virtual ativo:

python ler_inventario.py

O resultado deverá ser semelhante a:

======================================================================
INVENTÁRIO GALÁCTICO DE APLICAÇÕES MAINFRAME
======================================================================
Empresa........: Bellacosa Galactic Bank
Ambiente.......: homologacao
Sistema z/OS...: ZOS1
Sysplex........: BELLAPLEX
LPAR...........: ZHML01

Aplicações encontradas: 2
----------------------------------------------------------------------
Nome...........: CADASTRO-CLIENTES
Código.........: APL001
Tipo...........: online
Linguagem......: COBOL
Programa.......: PGMCIC01
Dependências...: Db2, CICS, VSAM
Opções COBOL...: RENT, SSRANGE, TEST
----------------------------------------------------------------------
Nome...........: FECHAMENTO-DIARIO
Código.........: APL002
Tipo...........: batch
Linguagem......: COBOL
Programa.......: PGMFEC01
Dependências...: Db2, DFSORT
Opções COBOL...: RENT, OPTFILE
----------------------------------------------------------------------

Parabéns.

Você acabou de:

  1. criar um documento YAML;

  2. representar um ambiente mainframe;

  3. modelar aplicações batch e online;

  4. descrever bibliotecas e dependências;

  5. ler o documento com Python;

  6. validar campos obrigatórios;

  7. transformar dados declarativos em um relatório.

Isso já é a base de muitas automações reais.


15. Provocando um erro de propósito

Todo bom laboratório precisa de um Kobayashi Maru.

Altere:

aplicacoes:
  - nome: CADASTRO-CLIENTES

Para:

aplicacoes:
 - nome: CADASTRO-CLIENTES
     codigo: "APL001"

Execute novamente:

python ler_inventario.py

O parser deverá informar um erro de sintaxe ou estrutura.

Agora teste um erro mais perigoso.

Remova o campo codigo de uma aplicação, mas mantenha a sintaxe válida:

- nome: CADASTRO-CLIENTES
  tipo: online
  linguagem: COBOL

Nesse caso, o parser consegue ler o YAML, porém nossa validação retorna algo semelhante a:

Aplicação 1: campo 'codigo' ausente.

Isso ensina uma diferença essencial:

Validação sintática

Pergunta:

O documento está escrito de maneira compreensível para o parser?

Validação semântica

Pergunta:

O documento contém os dados corretos para nossa aplicação?

Um YAML pode ser sintaticamente perfeito e operacionalmente inútil.

Da mesma forma, um JCL pode passar por determinadas validações e ainda apontar para o dataset errado.


16. YAML Schema: o copybook do YAML

À medida que os documentos crescem, validar tudo manualmente torna-se difícil.

É aí que entram os esquemas.

Um schema pode definir:

  • quais campos são obrigatórios;

  • quais tipos são permitidos;

  • quais valores são aceitos;

  • qual estrutura deve ser seguida;

  • quais propriedades são proibidas;

  • quais listas podem ficar vazias.

Para o mainframer, um schema funciona conceitualmente como uma combinação de:

  • copybook;

  • layout de arquivo;

  • contrato de interface;

  • regras de validação.

Sem schema:

porta: banana

O YAML é válido, pois banana é uma string.

Mas, se o sistema espera uma porta TCP numérica, o conteúdo está errado.

Com um schema, o editor poderá avisar:

A propriedade porta deve ser um número inteiro.

Esse recurso é especialmente importante em:

  • pipelines;

  • Kubernetes;

  • APIs;

  • Ansible;

  • grandes inventários;

  • configurações corporativas.


17. Anchors e aliases: o COPY do YAML

YAML possui anchors e aliases, que permitem reutilizar blocos.

Exemplo:

configuracao_padrao: &padrao_cobol
  compilador: Enterprise COBOL
  opcoes:
    - RENT
    - SSRANGE
    - TEST

aplicacoes:
  - nome: CLIENTES
    compilacao: *padrao_cobol

  - nome: CONTAS
    compilacao: *padrao_cobol

O símbolo:

&padrao_cobol

cria uma âncora.

O símbolo:

*padrao_cobol

faz referência a ela.

É tentador pensar nisso como um COPY do COBOL.

Entretanto, tenha cuidado.

Anchors podem reduzir repetição, mas também tornar o documento mais difícil de entender. Algumas ferramentas possuem suporte parcial ou adotam comportamentos específicos.

Use anchors quando:

  • houver repetição significativa;

  • a equipe conhecer o recurso;

  • a ferramenta suportá-lo corretamente;

  • o ganho de manutenção superar a perda de clareza.

Não transforme seu YAML em um labirinto Klingon.


18. Boas práticas para mainframers

Use dois espaços por nível

aplicacao:
  nome: CLIENTES

A consistência vale mais que a preferência individual.

Nunca use TAB

Configure o editor para substituir TAB por espaços.

Prefira nomes claros

Evite:

apl:
  nm: CLI
  tp: O

Prefira:

aplicacao:
  nome: CLIENTES
  tipo: online

Use uma convenção de nomes

Escolha um padrão:

programa_principal

ou:

programa-principal

Evite misturar:

programa_principal:
programa-principal:
ProgramaPrincipal:

Coloque códigos entre aspas

codigo: "000123"

Coloque horários entre aspas

inicio: "08:00"

Coloque datas entre aspas quando desejar tratá-las como texto

data: "2026-07-18"

Não grave segredos

Nunca faça:

usuario: ADMIN
senha: SENHA123

Valide antes do commit

O fluxo ideal é:

editar → validar → revisar → testar → commit → pipeline

Mantenha arquivos pequenos

Um YAML com milhares de linhas torna-se difícil de revisar.

Considere separar por:

  • ambiente;

  • aplicação;

  • domínio;

  • equipe;

  • finalidade.

Documente a intenção

# Ativada somente em homologação para testes de integração
simular_falha_db2: true

O comentário explica o motivo, não apenas repete o nome do campo.

Use controle de versão

Arquivos YAML devem ser armazenados no Git sempre que fizer sentido.

Assim você consegue saber:

  • quem mudou;

  • o que mudou;

  • quando mudou;

  • por que mudou;

  • qual versão estava funcionando.


19. Cuidados que evitam desastres

Um espaço pode mudar a hierarquia

Revise sempre o diff antes do commit.

Valores podem ser interpretados automaticamente

Quando o tipo for importante, use aspas ou schemas.

YAML válido não significa configuração válida

Teste com a ferramenta que realmente consumirá o arquivo.

Ambientes não devem compartilhar segredos

Produção, homologação e desenvolvimento precisam de separação adequada.

Copiar da internet exige revisão

Um exemplo encontrado em um fórum pode:

  • usar outra versão;

  • depender de outra ferramenta;

  • conter parâmetros obsoletos;

  • assumir permissões inexistentes;

  • expor credenciais;

  • executar ações destrutivas.

IA também pode errar a indentação

Um YAML gerado por inteligência artificial deve passar por:

  • revisão humana;

  • lint;

  • schema;

  • teste em ambiente controlado;

  • análise de segurança.

Nunca envie um arquivo gerado automaticamente direto para produção.

Cuidado com comandos multilinha

Um comando embutido em YAML pode parecer correto, mas ser interpretado de forma diferente pelo shell.

Cuidado com duplicidade de chaves

Observe:

ambiente: teste
ambiente: producao

Dependendo da biblioteca, o segundo valor pode sobrescrever o primeiro sem o aviso esperado.

Para uma mudança de produção, isso pode ser desastroso.

Use validadores capazes de detectar chaves duplicadas.


20. Como evoluir depois deste laboratório

Depois de dominar este exemplo, o Programador COBOL Padawan pode avançar por uma trilha segura.

Nível 1 — Leitura

Aprenda a identificar:

  • mapas;

  • listas;

  • strings;

  • números;

  • booleanos;

  • valores nulos;

  • comentários;

  • hierarquia.

Nível 2 — Validação

Use:

  • extensão YAML no editor;

  • schemas;

  • linters;

  • scripts Python;

  • testes automatizados.

Nível 3 — Automação local

Crie scripts que leiam YAML para:

  • gerar JCL;

  • produzir relatórios;

  • montar parâmetros;

  • validar inventários;

  • criar documentação;

  • comparar ambientes.

Nível 4 — Git

Armazene arquivos em repositórios e pratique:

  • branch;

  • commit;

  • pull request;

  • diff;

  • revisão de código.

Nível 5 — CI/CD

Use YAML para criar pipelines de:

  • compilação;

  • testes;

  • análise estática;

  • empacotamento;

  • deploy;

  • rollback.

Nível 6 — Ansible para z/OS

Aprenda playbooks que possam:

  • criar datasets;

  • copiar arquivos;

  • submeter jobs;

  • consultar resultados;

  • executar comandos;

  • automatizar tarefas administrativas.

Nível 7 — Infraestrutura declarativa

Explore ferramentas que transformam YAML em estado operacional.

Aqui ocorre uma mudança importante de mentalidade.

Em vez de dizer apenas:

Execute este comando.

Você passa a declarar:

Quero que o ambiente permaneça neste estado.


21. Comparando YAML, JCL, JSON e XML

YAML

Excelente para arquivos legíveis e configurações hierárquicas.

programa:
  nome: PGMCAD01
  tipo: batch

JSON

Muito usado em APIs e comunicação entre aplicações.

{
  "programa": {
    "nome": "PGMCAD01",
    "tipo": "batch"
  }
}

A estrutura de dados é semelhante, mas JSON exige mais sinais de pontuação.

XML

Possui tags de abertura e fechamento.

<programa>
  <nome>PGMCAD01</nome>
  <tipo>batch</tipo>
</programa>

É mais verboso, porém muito utilizado em integrações corporativas e sistemas legados.

JCL

Descreve a execução de trabalhos no z/OS:

//STEP01 EXEC PGM=PGMCAD01
//STEPLIB DD DSN=USER01.LOAD,DISP=SHR

YAML não substitui automaticamente o JCL.

Uma automação poderá ler YAML e gerar ou submeter JCL, mas o JES continuará precisando compreender o trabalho no formato adequado.

A ponte pode ser:

YAML
  ↓
Pipeline ou script
  ↓
JCL
  ↓
JES2
  ↓
Programa COBOL

22. Curiosidades para a tripulação

YAML nasceu para ser legível

Seu desenho privilegia estruturas que humanos possam editar com relativa facilidade.

JSON pode ser visto como um subconjunto estrutural do YAML 1.2

A compatibilidade com o modelo de dados do JSON foi um dos objetivos importantes da linha YAML 1.2.

A extensão preferida é .yaml

Também é comum encontrar:

.yml

Porém, .yaml é mais explícita.

YAML não é automaticamente simples

Documentos pequenos são agradáveis.

Documentos gigantes, com anchors, merges, múltiplos documentos e regras implícitas, podem tornar-se difíceis de manter.

Indentação é estrutura, não decoração

No COBOL, uma indentação visual ruim pode dificultar a leitura.

No YAML, uma indentação errada pode mudar o significado.

A melhor configuração é aquela que pode ser validada

Quanto mais crítica for a automação, menos você deve depender apenas da leitura humana.


23. Easter egg: o arquivo de missão da Enterprise

Crie:

missao-enterprise.yaml
---
nave:
  nome: USS Enterprise
  registro: NCC-1701
  capitao: James T. Kirk

tripulacao:
  - nome: Spock
    funcao: ciencia
    linguagem_preferida: YAML

  - nome: Montgomery Scott
    funcao: engenharia
    linguagem_preferida: JCL

  - nome: Nyota Uhura
    funcao: comunicacoes
    linguagem_preferida: JSON

missao:
  destino: Sistema IBM Z
  objetivo: modernizar_sem_destruir
  diretriz_principal: |
    Integrar o novo ao legado.
    Preservar aquilo que funciona.
    Automatizar aquilo que se repete.
    Documentar aquilo que ninguém mais compreende.

alertas:
  tab_encontrado: vermelho
  segredo_no_repositorio: vermelho
  deploy_sem_teste: vermelho
  yaml_validado: verde

mensagem_final: >
  Vida longa ao COBOL,
  prosperidade ao mainframe
  e atenção absoluta à indentação.
...

Observe o detalhe:

objetivo: modernizar_sem_destruir

Essa talvez seja a missão mais importante de toda modernização mainframe.

Modernizar não significa jogar fora décadas de regras de negócio.

Significa:

  • entender;

  • proteger;

  • documentar;

  • integrar;

  • automatizar;

  • evoluir.


24. Conclusão: o YAML como nova ponte do mainframe

YAML não substituirá o COBOL.

Não substituirá o JCL.

Não substituirá o CICS, o Db2, o IMS ou o z/OS.

Sua função é diferente.

YAML permite descrever configurações e intenções de uma forma que ferramentas modernas conseguem interpretar.

Para o mainframer, ele representa uma nova camada de comunicação entre:

  • o código COBOL;

  • os pipelines;

  • os repositórios Git;

  • os processos de build;

  • as ferramentas de automação;

  • os ambientes distribuídos;

  • a infraestrutura;

  • as equipes modernas de desenvolvimento.

O veterano que conhece COBOL possui uma vantagem enorme.

Ele já entende:

  • estruturas hierárquicas;

  • contratos de dados;

  • processamento previsível;

  • validação;

  • disciplina operacional;

  • ambientes controlados;

  • importância da compatibilidade;

  • consequências de um erro em produção.

Aprender YAML não é começar do zero.

É traduzir conhecimentos antigos para uma nova interface.

O programador que entende um copybook consegue compreender um schema.

Quem entende um SYSIN consegue compreender um arquivo declarativo.

Quem entende JCL consegue compreender pipelines.

Quem conhece PROC e parâmetros consegue compreender templates.

Quem respeita produção aprende rapidamente a respeitar indentação.

A verdadeira transformação não ocorre quando o mainframer abandona sua experiência.

Ela ocorre quando usa essa experiência para dominar novas ferramentas.

Portanto, abra o editor, crie seus primeiros arquivos, provoque erros em ambiente controlado, valide cada estrutura e coloque o YAML para trabalhar ao lado do COBOL.

Porque, no fim das contas, seja dentro de uma LPAR, de um container ou da USS Enterprise, uma regra continua universal:

Configuração sem validação é apenas um futuro incidente esperando sua janela de produção.

Vida longa ao COBOL.

Prosperidade ao IBM Z.

E que nenhum TAB clandestino atravesse os escudos da sua indentação.


quinta-feira, 26 de dezembro de 2024

📮 O CARTEIRO E O POETA — QUANDO UMA POSTMAN COLLECTION APRENDEU A ENTREGAR CARTAS AO MAINFRAME

 

Bellacosa Mainframe apresenta o postman

☕ Um Café no Bellacosa Mainframe

📮 O CARTEIRO E O POETA — QUANDO UMA POSTMAN COLLECTION APRENDEU A ENTREGAR CARTAS AO MAINFRAME

Postman, Collections, HTTP, REST, JSON, variáveis, autenticação, scripts, testes positivos e negativos, contratos, Runner, CI/CD, z/OS Connect, CICS, COBOL, Db2 — e o dia em que um jovem programador descobriu que receber 200 OK não significava que a carta havia chegado à pessoa certa.



Sob a tutela de O Carteiro e o Poeta, porque uma API também vive de mensagens. Algumas precisam chegar rápido. Outras precisam chegar com segurança. Todas precisam chegar ao destinatário correto.



🎬 PRÓLOGO — TODA API TEM UM CARTEIRO

Imagine uma pequena ilha.

Todas as manhãs, o carteiro percorre as mesmas ruas carregando cartas. Ele conhece os caminhos, as casas, os moradores e os horários.

Até que encontra um poeta.

O poeta não quer simplesmente que uma carta seja transportada.

Ele quer que ela seja compreendida.

Essa pequena diferença explica uma parte enorme do que significa testar APIs.

Quando começamos a usar o Postman, normalmente fazemos algo parecido com um carteiro iniciante:

GET /clientes/123

Clicamos em Send.

Recebemos:

200 OK

E comemoramos:

Funcionou!

Calma, jovem padawan do COBOL.

O servidor respondeu. Isso é tudo que sabemos até agora.

Talvez tenhamos pedido o cliente 123 e recebido o cliente 999.

Talvez o JSON esteja incompleto.

Talvez o saldo esteja errado.

Talvez uma pessoa sem autorização tenha conseguido consultar informações que não deveria.

Talvez o backend tenha consultado o Db2 errado.

Talvez o COBOL tenha devolvido um código de negócio indicando falha e alguma camada intermediária tenha convertido tudo em HTTP 200.

O carteiro entregou alguma coisa.

Ainda precisamos descobrir se entregou a carta correta para a pessoa correta.

E é aqui que nossa história realmente começa.



📬 CAPÍTULO 1 — POSTMAN NÃO É APENAS UM BOTÃO SEND

Para quem começa a trabalhar com APIs, Postman parece uma ferramenta para escrever uma URL, selecionar GET ou POST e apertar Send.

Isso seria como dizer que ISPF serve para editar texto.

Tecnicamente não está completamente errado.

Mas estamos ignorando quase todo o universo existente atrás da ferramenta.

Uma requisição HTTP pode possuir:

Método
URL
Headers
Parâmetros
Autenticação
Body
Scripts
Testes
Variáveis

Por exemplo:

POST /orders
Content-Type: application/json
Authorization: Bearer {{token}}

Body:

{
  "customerId": "12345",
  "productId": "A100",
  "quantity": 2
}

O Postman permite construir essa requisição, enviá-la e analisar a resposta.

Mas o salto de maturidade acontece quando paramos de pensar em requests isolados e começamos a pensar em Collections.

Uma Collection não deveria ser apenas uma pasta cheia de requisições.

Ela pode representar um verdadeiro sistema automatizado de testes da API.

E isso muda completamente o jogo.



🗃️ CAPÍTULO 2 — COLLECTION: A BOLSA DO CARTEIRO

Imagine a bolsa do nosso carteiro.

Não faria sentido jogar dentro dela milhares de cartas aleatoriamente.

Ele organiza:

Distrito
 ├── Rua
 │    ├── Número
 │    └── Destinatário

Uma Collection bem construída também precisa possuir estrutura.

Por exemplo:

Orders API
│
├── 01 - Authentication
│
├── 02 - Customers
│   ├── Create Customer
│   ├── Get Customer
│   └── Update Customer
│
├── 03 - Orders
│   ├── Create Order
│   ├── Get Order
│   ├── Update Order
│   └── Cancel Order
│
└── 04 - Negative Tests
    ├── Invalid Token
    ├── Customer Not Found
    ├── Invalid Quantity
    └── Forbidden User

Perceba uma coisa importante.

Estamos começando a transformar a Collection em algo parecido com uma especificação executável.

Ela documenta o sistema.

Ela executa o sistema.

Ela testa o sistema.

Ela pode ser compartilhada.

E posteriormente poderá entrar em um pipeline.

Isso é muito diferente de guardar meia dúzia de URLs.



✉️ CAPÍTULO 3 — PRIMEIRO ENTENDA A CARTA

Antes de criar uma request, precisamos entender o contrato.

Suponha:

POST /orders

Pergunte:

O que devo enviar?

{
  "customerId": "C123",
  "productId": "P987",
  "quantity": 2
}

O que espero receber?

{
  "orderId": "O456",
  "status": "CONFIRMED"
}

Qual status HTTP deveria aparecer?

Talvez:

201 Created

Agora temos uma expectativa.

Entrada:

customerId
productId
quantity

Saída:

orderId
status

Esse conceito deveria soar extremamente familiar para quem programa COBOL.

Pense em:

01 WS-REQUEST.
   05 WS-CUSTOMER-ID PIC X(10).
   05 WS-PRODUCT-ID  PIC X(10).
   05 WS-QUANTITY    PIC 9(03).

01 WS-RESPONSE.
   05 WS-ORDER-ID    PIC X(10).
   05 WS-STATUS      PIC X(10).

Mudou a tecnologia.

O princípio continua parecido:

existe uma estrutura de entrada e existe uma estrutura esperada de saída.

O programador COBOL chama isso de layout.

O desenvolvedor moderno talvez chame de contrato.

O carteiro chama de endereço.

Se qualquer um deles estiver errado, alguém receberá a correspondência errada.



🌐 CAPÍTULO 4 — 200 OK NÃO SIGNIFICA “TUDO CERTO”

Este talvez seja o conceito mais importante de toda a conversa.

Considere:

GET /customers/123

Resposta:

200 OK

Body:

{
  "customerId": "999",
  "name": "Mario"
}

A camada HTTP funcionou perfeitamente.

Mas a aplicação falhou.

Você pediu:

123

e recebeu:

999

Portanto precisamos testar diferentes níveis.

No Postman podemos escrever:

pm.test("HTTP status is 200", function () {
    pm.response.to.have.status(200);
});

Mas podemos continuar:

const customer = pm.response.json();

pm.test("Customer ID is correct", function () {
    pm.expect(customer.customerId).to.eql("123");
});

Agora não estamos apenas perguntando:

O servidor respondeu?

Estamos perguntando:

O servidor respondeu corretamente?

Essa diferença separa um teste superficial de um teste realmente útil.


🧠 CAPÍTULO 5 — O CARTEIRO DESCOBRE AS REGRAS DE NEGÓCIO

Imagine que criamos um pedido.

A resposta é:

{
  "orderId": "4711",
  "status": "REJECTED"
}

E recebemos:

200 OK

O transporte funcionou.

Mas talvez nossa expectativa fosse:

status = CONFIRMED

Portanto:

const order = pm.response.json();

pm.test("Order must be confirmed", function () {
    pm.expect(order.status).to.eql("CONFIRMED");
});

Isso é extremamente importante em sistemas mainframe.

Porque muitas aplicações antigas possuem códigos internos de retorno.

Um programa pode devolver algo conceitualmente semelhante a:

RETURN-CODE = 04
MESSAGE     = CUSTOMER BLOCKED

Enquanto uma camada REST pode responder:

200 OK

Se testarmos somente HTTP, podemos declarar sucesso para uma transação que o negócio considera fracasso.

O teste precisa conhecer o significado da resposta.

O poeta não quer saber apenas se a carta chegou.

Ele quer saber se Beatrice leu o poema certo.


📐 CAPÍTULO 6 — TESTANDO O CONTRATO

Agora podemos subir outro degrau.

Não queremos verificar somente valores.

Também queremos verificar estrutura.

Imagine que nossa API deveria responder:

{
  "orderId": "4711",
  "status": "CONFIRMED",
  "amount": 150.00
}

Mas depois de uma alteração recebemos:

{
  "id": 4711,
  "state": "OK"
}

O serviço respondeu.

Mas o contrato mudou completamente.

Isso pode quebrar consumidores.

Imagine um aplicativo esperando:

response.orderId

e alguém muda para:

response.id

Boom.

Não houve necessariamente ABEND no backend.

Mas houve um ABEND conceitual no consumidor.

Schema validation ajuda a detectar mudanças estruturais desse tipo.

Ela pode verificar coisas como:

campo obrigatório
tipo
formato
estrutura

Mas há uma sutileza.

Schema não prova que o conteúdo está correto.

Isto:

{
  "orderId": "9999",
  "status": "CONFIRMED"
}

pode estar estruturalmente perfeito e ainda pertencer ao cliente errado.

Portanto:

Schema Validation
        +
Business Assertions

são complementares.


🔤 CAPÍTULO 7 — VARIÁVEIS: O WORKING-STORAGE DO POSTMAN

Agora começa uma das partes mais interessantes para quem vem do COBOL.

Em vez de escrever:

https://qa.company.com/api/orders/123

podemos utilizar:

{{baseUrl}}/orders/{{orderId}}

E definir:

baseUrl = https://qa.company.com/api
orderId = 123

Podemos possuir ambientes diferentes:

DEV
QA
STAGING

Mudamos o ambiente.

A Collection continua igual.

Isso é poderosíssimo.

Para um programador COBOL, pense nas variáveis como uma espécie de combinação entre parâmetros, configuração e WORKING-STORAGE.

Mas existe uma armadilha.

Variáveis podem existir em diferentes escopos.

Se houver valores duplicados em locais diferentes, podemos executar um teste utilizando um valor que não imaginávamos.

É o equivalente moderno de perguntar:

Quem alterou essa variável?

E descobrir que existem quatro lugares diferentes onde ela poderia ter sido definida.

Dica de sobrevivência:

sempre investigue o valor resolvido, não apenas o nome escrito na request.


🔐 CAPÍTULO 8 — O CARTEIRO PRECISA MOSTRAR O CRACHÁ

APIs modernas frequentemente utilizam tokens.

Por exemplo:

Authorization: Bearer {{accessToken}}

Em vez de configurar autenticação individualmente em cinquenta requests, podemos defini-la na Collection e permitir herança.

Isso reduz repetição.

Mas surge uma distinção fundamental:

Authentication ≠ Authorization

Authentication pergunta:

Quem é você?

Authorization pergunta:

Você pode fazer isso?

Um usuário pode estar perfeitamente autenticado e ainda não possuir autorização para cancelar um pedido.

Por isso os testes precisam explorar situações como:

token ausente
token inválido
token expirado
usuário autenticado sem permissão

E aqui aparece uma pegadinha maravilhosa.

Você cria um teste chamado:

NO TOKEN

remove o token da request...

...e o teste continua funcionando.

Por quê?

Porque a request herdou a autenticação da Collection.

Seu teste negativo acabou sendo positivo sem você perceber.

É o tipo de bug que faz um QA olhar para a tela durante alguns segundos e começar a reconsiderar suas escolhas profissionais.


⚙️ CAPÍTULO 9 — PRE-REQUEST SCRIPT: PREPARANDO A CARTA

Antes de uma request ser enviada, podemos executar scripts.

Por exemplo, gerar um identificador:

const requestId = pm.variables.replaceIn("{{$guid}}");
pm.collectionVariables.set("requestId", requestId);

Depois enviamos:

X-Request-ID: {{requestId}}

Agora cada transação possui uma identidade.

E aqui nossa história chega ao mainframe.

Imagine:

Postman
   ↓
API Gateway
   ↓
z/OS Connect
   ↓
CICS
   ↓
COBOL
   ↓
Db2

Se o mesmo identificador puder ser correlacionado ao longo desse caminho, investigar um problema se torna muito mais poderoso.

Em vez de procurar:

aquela transação que aconteceu mais ou menos às 14:32...

podemos procurar:

Request-ID = 8f7a...

Isso aproxima teste de observabilidade.

E observabilidade é quando o carteiro não sabe apenas que saiu da agência: ele consegue descobrir por quais ruas a carta passou.


🔗 CAPÍTULO 10 — UMA CARTA LEVA À OUTRA

Agora criamos um pedido:

POST /orders

Resposta:

{
  "orderId": "4711"
}

Podemos capturar esse ID:

const body = pm.response.json();

pm.collectionVariables.set(
    "orderId",
    body.orderId
);

A próxima request utiliza:

GET /orders/{{orderId}}

Depois:

PUT /orders/{{orderId}}

Finalmente:

DELETE /orders/{{orderId}}

Criamos um workflow:

CREATE
   ↓
READ
   ↓
UPDATE
   ↓
DELETE

Isso é muito mais poderoso do que requests isoladas.

Estamos testando uma jornada.


💣 CAPÍTULO 11 — TESTE O QUE DEVERIA DAR ERRADO

Desenvolvedores naturalmente gostam de testar:

entrada correta → resultado correto

Mas sistemas reais vivem no território de:

entrada errada
campo ausente
valor máximo
valor mínimo
token expirado
registro inexistente
duplicidade
timeout
permissão insuficiente

Um excelente princípio é:

altere uma condição de cada vez.

Se você alterar cinco coisas simultaneamente e receber erro, não saberá qual delas provocou o comportamento.

Comece com um baseline válido.

Depois altere somente:

quantity = -1

Depois:

quantity = 0

Depois:

quantity = 1

E chegamos aos testes de fronteira.


📏 CAPÍTULO 12 — COBOL ADORA FRONTEIRAS

Suponha:

05 WS-AGE PIC 9(02).

O campo possui limitações claras.

Em APIs também precisamos pensar em limites.

Se uma regra aceita valores entre 1 e 100:

MIN - 1 = 0
MIN     = 1
MIN + 1 = 2

MAX - 1 = 99
MAX     = 100
MAX + 1 = 101

Não teste apenas:

50

O valor 50 provavelmente funciona.

Os monstros costumam morar nas bordas.

Esse princípio aparece em praticamente todas as gerações de computação.

Cartão perfurado, COBOL, Db2, Java, REST ou JSON: limites continuam sendo lugares maravilhosos para encontrar bugs.


📚 CAPÍTULO 13 — UMA REQUEST, CEM CARTAS

Imagine testar:

quantity

com dezenas de valores.

Não queremos duplicar a mesma request cinquenta vezes.

Podemos usar dados externos.

Por exemplo:

quantity,expectedStatus
1,201
2,201
0,400
-1,400
101,400

No teste:

const expected =
    Number(pm.iterationData.get("expectedStatus"));

pm.test("Expected HTTP status", function () {
    pm.expect(pm.response.code).to.eql(expected);
});

Agora temos data-driven testing.

A lógica do teste permanece.

Os dados mudam.

Programadores COBOL deveriam reconhecer imediatamente a beleza disso.

É quase como um processamento batch:

READ INPUT
PERFORM PROCESS-RECORD
PERFORM VALIDATE
READ NEXT

O Postman Runner passa a executar diferentes iterações sobre a mesma lógica.

O velho batch está sorrindo discretamente no fundo da sala.


🏃 CAPÍTULO 14 — COLLECTION RUNNER: O BATCH DAS APIs

Chega uma hora em que clicar em Send deixa de fazer sentido.

Temos:

20 requests
50 datasets
30 assertions
4 workflows

Queremos executar tudo.

É aí que entra o Runner.

Conceitualmente:

Inicializa
   ↓
Carrega ambiente
   ↓
Executa request
   ↓
Executa testes
   ↓
Armazena variáveis
   ↓
Executa próxima request
   ↓
Gera resultados

Parece familiar?

Claro.

Isso é praticamente a filosofia batch reaparecendo em roupas modernas.

A tecnologia mudou.

A ideia de processamento repetível e automatizado continua conosco.


🧹 CAPÍTULO 15 — O FANTASMA DO ESTADO ANTERIOR

Um dos bugs mais traiçoeiros em testes automatizados é o estado residual.

Imagine que ontem:

orderId = 4711

Hoje o POST falha.

Mas a variável ainda contém:

4711

A próxima request executa:

GET /orders/4711

e funciona.

Resultado?

Parece que o workflow passou.

Mas estamos consultando o pedido de ontem.

Esse é um falso positivo perigosíssimo.

Por isso suítes maduras precisam pensar em:

setup
execução
validação
cleanup

Teste repetível significa:

posso executá-lo novamente sem depender dos fantasmas deixados pela execução anterior.


🔦 CAPÍTULO 16 — DEBUGUE NA ORDEM CERTA

Quando algo falhar, não comece alterando JavaScript aleatoriamente.

Siga uma investigação disciplinada:

Endpoint
   ↓
Environment
   ↓
Variáveis resolvidas
   ↓
Authentication
   ↓
Headers
   ↓
Request body
   ↓
Response
   ↓
Scripts
   ↓
Dados
   ↓
Ordem do workflow

Se funciona individualmente mas falha no Runner, desconfie especialmente de:

ordem
estado
variáveis
dados
dependências

Essa disciplina lembra investigação de incidente no mainframe.

Você não começa culpando o COBOL.

Primeiro reconstrói o caminho.


📖 CAPÍTULO 17 — UMA COLLECTION DEVE SOBREVIVER AO SEU CRIADOR

Chegamos a uma pergunta excelente:

Se eu entregar minha Collection para outro desenvolvedor, ele consegue executá-la?

Se a resposta for:

“Sim, mas primeiro preciso explicar umas quinze coisas...”

a documentação ainda não está boa.

Explique:

objetivo
pré-requisitos
ambiente
autenticação
variáveis
ordem de execução
dados necessários
resultado esperado

Inclua exemplos.

Remova segredos.

Nunca transforme uma Collection compartilhada em cofre de:

password
API key
client secret
token permanente

Uma suíte de testes também é código.

Trate-a como tal.


🚂 CAPÍTULO 18 — A COLLECTION ENTRA NO CI/CD

Aqui acontece a grande transformação.

Antes:

Programador
   ↓
Postman
   ↓
Send

Depois:

Commit
   ↓
Build
   ↓
Deploy QA
   ↓
API Tests
   ↓
Resultado
   ↓
Pipeline continua ou falha

Agora o teste deixa de depender de alguém lembrar de apertar um botão.

Podemos executar smoke tests depois do deploy.

Podemos executar regressão.

Podemos impedir que uma mudança incompatível avance silenciosamente.

Em um ambiente mainframe moderno, podemos imaginar:

Git
 ↓
COBOL + COPYBOOK
 ↓
DBB / Build
 ↓
Deploy
 ↓
z/OS Connect
 ↓
Postman API Tests
 ↓
CICS
 ↓
COBOL
 ↓
Db2

O COBOL não deixou de ser COBOL.

O mainframe não deixou de ser mainframe.

Nós simplesmente construímos uma estrada moderna até ele.


🧬 CAPÍTULO 19 — O MAPA MENTAL DO PROGRAMADOR COBOL

Se você está começando em APIs, guarde esta tradução mental:

POSTMAN                    COBOL / MAINFRAME

Iteration Data       →     Arquivo de entrada
Variables            →     WORKING-STORAGE/configuração
Pre-request Script   →     Inicialização
HTTP Request         →     Chamada/transação
JSON Body            →     Estrutura de dados
Response             →     Estrutura retornada
pm.test              →     Validação
Collection           →     Conjunto organizado de processos
Runner               →     Batch automatizado
Environment          →     DEV / QA / PROD
Workflow             →     Sequência transacional
CI/CD                →     Esteira automatizada
Correlation ID       →     Identidade rastreável da transação

Não são equivalências tecnológicas perfeitas.

São pontes mentais.

E pontes são extremamente úteis quando estamos aprendendo um mundo novo.


🕵️ CAPÍTULO 20 — O NÍVEL QUE QUASE NINGUÉM ENSINA

Existe ainda um passo além.

Imagine que um teste falhou:

POST /payment

Resposta:

500 Internal Server Error

Uma suíte básica informa:

FAILED

Uma engenharia madura pergunta:

Por quê?

Imagine conseguir seguir:

Postman
   │
   │ correlation-id = POETA-0317
   ↓
API Gateway
   ↓
z/OS Connect
   ↓
CICS
   ↓
TRANSACTION ABCD
   ↓
COBOL PAYMENT01
   ↓
Db2
   ↓
SQLCODE -911

Agora não temos apenas automação.

Temos rastreabilidade.

O teste encontrou o sintoma.

A observabilidade mostrou o caminho.

Os logs forneceram evidência.

O mainframe revelou a causa.

🥚 EASTER EGG

Se algum dia encontrar nos exemplos do Bellacosa Mainframe uma transação executada exatamente às:

03:17

não tente corrigir o relógio.

O mainframe sabe perfeitamente que horas são.

Algumas transações simplesmente preferem trabalhar no turno da madrugada.


🎓 EPÍLOGO — O POETA FINALMENTE ENTENDEU O CARTEIRO

No começo de nossa história, tínhamos:

URL
 ↓
Send
 ↓
200 OK

Parecia suficiente.

Depois descobrimos um universo inteiro:

API CONTRACT
      ↓
COLLECTION
      ↓
ENVIRONMENT
      ↓
VARIABLES
      ↓
AUTHENTICATION
      ↓
PRE-REQUEST
      ↓
REQUEST
      ↓
RESPONSE
      ↓
ASSERTIONS
      ↓
SCHEMA
      ↓
BUSINESS RULES
      ↓
NEGATIVE TESTS
      ↓
BOUNDARIES
      ↓
WORKFLOWS
      ↓
DATA-DRIVEN TESTS
      ↓
RUNNER
      ↓
DEBUG
      ↓
DOCUMENTATION
      ↓
CI/CD
      ↓
OBSERVABILITY

Essa é a verdadeira evolução.

Você começa testando uma API.

Depois constrói uma suíte.

Depois transforma essa suíte em regressão.

Depois conecta a regressão ao pipeline.

Finalmente conecta os testes à observabilidade e consegue seguir uma transação desde o mundo distribuído até o programa COBOL que executou a regra de negócio.

E então acontece algo curioso.

A tecnologia mais moderna da arquitetura encontra uma das mais antigas.

JSON encontra COPYBOOK.

REST encontra CICS.

OAuth encontra RACF.

CI/CD encontra COBOL.

Postman encontra z/OS.

E nenhum deles precisa destruir o outro.

Porque modernizar mainframe não significa necessariamente arrancar o coração da aplicação e reescrevê-lo.

Às vezes significa simplesmente construir melhores caminhos para chegar até ele.

É justamente aí que O Carteiro e o Poeta se torna uma metáfora perfeita.

O carteiro domina o transporte.

O poeta domina o significado.

Uma boa API precisa dos dois.

Não basta entregar bytes.

Precisamos entregar os bytes certos, ao serviço certo, com a identidade certa, na sequência certa, respeitando o contrato certo e produzindo o resultado de negócio esperado.

Da próxima vez que o Postman mostrar:

200 OK

não feche o teste.

Olhe para aquele verde bonito e pergunte:

“Muito bem, carteiro. Você entregou a carta. Agora me prove que entregou a carta certa.”

Porque no Bellacosa Mainframe, até uma API precisa apresentar evidências antes de sair da War Room.

terça-feira, 24 de dezembro de 2024

Shadow AI: O Novo "Shadow IT" que Pode Colocar Bancos, Mainframes e sua Carreira em Risco

 

Bellacosa Mainframe e o perigo do shadow ai

☕ Um Café no Bellacosa Mainframe

Shadow AI: O Novo "Shadow IT" que Pode Colocar Bancos, Mainframes e sua Carreira em Risco

"A IA não é o problema. O problema é quando ela conhece mais sobre sua empresa do que deveria."

Durante muitos anos, quem trabalhava com IBM Mainframe aprendeu uma regra quase sagrada:

Dados são patrimônio da empresa.

Um programa COBOL pode ser recompilado.

Um JCL pode ser recriado.

Uma procedure pode ser reescrita.

Mas um cadastro de clientes, um histórico financeiro ou uma regra de negócio construída durante quarenta anos... isso não tem preço.

Agora imagine entregar tudo isso gratuitamente para uma inteligência artificial pública apenas porque ela respondeu sua dúvida em dez segundos.

Parece exagero?

Infelizmente, não é.

Estamos entrando em uma nova era chamada Shadow AI, e ela talvez seja o maior desafio de governança desde o surgimento da Internet corporativa.

Pegue seu café.

Hoje vamos conversar sobre um assunto que todo programador COBOL, analista de sistemas, DBA, administrador z/OS, gerente de TI e arquiteto de soluções deveria entender.


Antes de existir Shadow AI existia Shadow IT

Quem trabalha há décadas em TI provavelmente já viveu isso.

A área de Segurança dizia:

— Não pode usar Dropbox.

No dia seguinte alguém aparecia usando Google Drive.

Bloquearam o Google Drive.

Os usuários passaram a usar OneDrive pessoal.

Bloquearam tudo.

Começaram a enviar arquivos pelo WhatsApp.

Nada disso era maldade.

Era produtividade.

Quando o processo oficial demora muito, as pessoas encontram atalhos.

Esse comportamento recebeu um nome:

Shadow IT.

São recursos tecnológicos utilizados sem aprovação da organização.

Hoje aconteceu exatamente a mesma coisa.

Só que muito maior.

Agora não estamos escondendo arquivos.

Estamos escondendo inteligência.


O nascimento da Shadow AI

Imagine um desenvolvedor COBOL.

Ele recebe um programa com 18 mil linhas.

Foi escrito em 1987.

Possui centenas de PERFORM.

GO TO espalhados.

COPYBOOKs enormes.

Variáveis chamadas:

WK001
WK002
WK003
TEMP1
TEMP2
FLAG-A
FLAG-B

Depois de duas horas tentando entender o código ele pensa:

"Vou perguntar para uma IA."

Abre uma ferramenta pública.

Copia o programa.

Pergunta:

Explique este código COBOL.

Em menos de quinze segundos aparece uma explicação excelente.

Ele ficou feliz.

A empresa talvez não.

Porque naquele momento aconteceu algo muito mais importante do que receber uma resposta.

Ela perdeu o controle sobre onde aquele código foi parar.


O problema nunca foi a IA

Esse é o primeiro grande mito.

Muita gente acredita que o perigo da IA seja ela responder errado.

Na verdade, esse costuma ser o menor dos problemas.

O verdadeiro risco é outro.

É a informação enviada.

Imagine que alguém copie para uma IA pública:

  • código COBOL;

  • JCL;

  • SYSIN;

  • PROC;

  • CLIST;

  • REXX;

  • SQL do DB2;

  • definição VSAM;

  • arquitetura CICS;

  • parâmetros RACF.

Nenhum desses arquivos parece importante isoladamente.

Mas juntos contam exatamente como funciona uma empresa.

É como entregar o mapa completo de um castelo medieval.


Mainframe guarda o coração das empresas

Existe um mito curioso.

Algumas pessoas acreditam que o Mainframe é apenas um computador antigo.

Quem trabalha na área sabe que isso está longe da realidade.

O IBM Z normalmente executa aplicações responsáveis por:

  • folha de pagamento;

  • PIX;

  • TED;

  • cartões;

  • investimentos;

  • previdência;

  • seguros;

  • sistemas governamentais;

  • arrecadação;

  • declaração de imposto;

  • sistemas hospitalares;

  • controle aéreo.

Ou seja...

O Mainframe não guarda apenas dados.

Ele guarda o funcionamento da sociedade.


Um exemplo assustador

Imagine um banco.

Existe um programa chamado:

PGMFIN01

Ele calcula juros compostos.

Aplicações financeiras.

Renegociação.

Amortização.

Taxas.

Esse programa possui quarenta anos de evolução.

Recebeu centenas de alterações.

Seu algoritmo é praticamente impossível de reconstruir.

Um desenvolvedor resolve perguntar para uma IA:

Otimize este código.

Ele copia três mil linhas.

Acabou de compartilhar uma das maiores vantagens competitivas daquele banco.

Mesmo que nenhuma informação seja utilizada de forma inadequada, a organização perdeu o controle sobre um ativo extremamente valioso.


E quando existem dados de clientes?

A situação fica ainda mais séria.

Imagine um dump do CICS.

Nele aparecem:

CLIENTE

CPF

CONTA

AGÊNCIA

SALDO

ENDEREÇO

TELEFONE

O desenvolvedor quer apenas entender um ABEND.

Então envia tudo.

Perceba.

Ele não queria vazar informações.

Ele queria resolver um problema.

Essa diferença é fundamental.

A maioria dos incidentes não nasce da má intenção.

Nasce da pressa.


A cultura da velocidade

Vivemos uma época curiosa.

Todo mundo quer entregar mais.

Mais rápido.

Mais barato.

Mais inteligente.

A IA oferece exatamente isso.

Ela reduz tarefas que levavam horas para poucos minutos.

Naturalmente as pessoas começam a utilizá-la.

Até aqui não existe problema.

O problema aparece quando velocidade passa a valer mais que governança.

Imagine dois gestores.

O primeiro diz:

"Antes de usar qualquer IA precisamos validar com Segurança."

O segundo diz:

"Depois a gente vê isso."

Qual deles provavelmente entregará primeiro?

O segundo.

Qual deles provavelmente aumentará o risco?

Também o segundo.


Quando o exemplo vem de cima

Esse talvez seja o ponto mais importante de toda a discussão.

Pesquisas recentes mostram que muitos executivos também utilizam ferramentas não aprovadas.

Isso muda completamente o cenário.

Porque cultura organizacional funciona por imitação.

Não por documentos.

Você pode escrever um manual de trezentas páginas dizendo:

"Não utilize IA pública."

Se o diretor faz isso durante uma reunião...

A regra acabou.

As pessoas aprendem muito mais observando comportamentos do que lendo políticas.

No Mainframe isso sempre foi verdade.

Quem nunca ouviu frases como:

"Faz igual o pessoal da produção."

"Segue o padrão do analista mais antigo."

"Aqui sempre foi assim."

A IA segue exatamente a mesma lógica.


O perigo invisível

Uma das características mais perigosas da Shadow AI é sua invisibilidade.

Imagine um colaborador usando:

ChatGPT.

Claude.

Gemini.

Perplexity.

DeepSeek.

NotebookLM.

Copilot pessoal.

Ele pode fazer tudo isso usando:

  • navegador;

  • celular;

  • computador pessoal;

  • tablet.

A empresa talvez nunca descubra.

Esse é o verdadeiro desafio.

Não existe um servidor escondido.

Existe apenas um navegador aberto.


Mainframe e compliance

Quem trabalha com IBM Z normalmente convive diariamente com palavras como:

  • auditoria;

  • LGPD;

  • PCI-DSS;

  • SOX;

  • ISO 27001;

  • BACEN;

  • CVM;

  • trilhas de auditoria;

  • segregação de funções.

Esses conceitos existem porque sistemas financeiros movimentam bilhões de reais diariamente.

Agora imagine uma IA recebendo informações relacionadas a:

PIX.

TED.

Crédito.

Cartões.

Investimentos.

Mesmo que nenhum dado seja reutilizado, o simples fato de informações reguladas terem saído do ambiente controlado pode representar um problema de conformidade.


O programador júnior é culpado?

Na maioria das vezes...

Não.

Na verdade, ele costuma ser a pessoa mais interessada em aprender.

Imagine um desenvolvedor recém-contratado.

Recebe um programa COBOL escrito em 1984.

Não existe documentação.

O analista sênior está ocupado.

A entrega é amanhã.

O que ele faz?

Pergunta para a IA.

O erro não foi dele.

O erro foi da organização por não oferecer:

  • documentação;

  • treinamento;

  • mentoria;

  • ferramentas corporativas de IA.


Então devemos proibir IA?

Essa costuma ser a primeira reação.

Bloquear tudo.

Parece lógico.

Mas não funciona.

Porque produtividade é viciante.

Se o colaborador economiza duas horas por dia utilizando IA...

Ele continuará procurando uma maneira de utilizá-la.

Mesmo que seja no celular.

O resultado?

A empresa perde completamente a visibilidade.


O caminho inteligente

As empresas mais maduras estão adotando outra estratégia.

Em vez de combater a IA...

Elas governam a IA.

Isso significa:

Ferramentas homologadas

Utilizar soluções empresariais que ofereçam controles de segurança, auditoria, retenção de dados e políticas claras de privacidade.

Classificação das informações

Criar regras simples e fáceis de aplicar, por exemplo:

Pode compartilhar

  • documentação pública;

  • exemplos didáticos;

  • códigos de laboratório;

  • programas de treinamento.

Nunca compartilhar

  • dados pessoais;

  • informações financeiras;

  • credenciais;

  • dumps de produção;

  • chaves criptográficas;

  • configurações sensíveis;

  • código proprietário.

Treinamento

Não apenas para estagiários.

Também para:

  • coordenadores;

  • gerentes;

  • arquitetos;

  • diretores;

  • executivos.

Todos precisam entender riscos e responsabilidades.


Como isso afeta o mundo COBOL?

Mais do que muitos imaginam.

Hoje existem IAs capazes de:

  • explicar programas COBOL;

  • sugerir melhorias;

  • converter código;

  • documentar aplicações;

  • gerar testes;

  • explicar SQL;

  • interpretar JCL.

Tudo isso é fantástico.

Desde que seja feito no ambiente correto.

Ferramentas corporativas permitem usufruir desses benefícios sem expor informações estratégicas.


Cinco perguntas antes de perguntar à IA

Antes de colar qualquer informação em uma IA, faça um pequeno checklist mental:

  1. Este conteúdo contém dados de clientes?

  2. Existe alguma informação confidencial?

  3. Estou usando uma ferramenta aprovada pela empresa?

  4. Eu ficaria confortável se esse conteúdo aparecesse na primeira página de um jornal?

  5. Meu gestor de segurança aprovaria esse envio?

Se alguma resposta gerar dúvida, pare e reavalie.


Curiosidades

Curiosidade 1

O conceito de Shadow IT existe há mais de vinte anos.

Shadow AI surgiu praticamente da noite para o dia.

A velocidade de adoção foi muito maior.


Curiosidade 2

Muitas empresas descobriram o uso de IA apenas analisando logs de proxy.

Os acessos eram milhares por dia.

Muito acima do esperado.


Curiosidade 3

Em várias organizações, o setor que mais utiliza IA não é TI.

É Marketing.

Logo depois aparecem áreas Jurídica, RH, Atendimento e Desenvolvimento.


Curiosidade 4

O Mainframe sempre foi pioneiro em governança.

Controle de acesso.

Auditoria.

Rastreamento.

Segregação.

Paradoxalmente, muitos desses mesmos ambientes agora precisam aplicar os mesmos princípios ao uso de IA.


Easter Eggs para quem vive no IBM Z 🥚

Se você sorriu ao ler qualquer um destes itens, provavelmente já passou muitas horas diante de um terminal 3270:

🥚 Copiar um SYSOUT inteiro para a IA porque "só queria entender o ABEND S0C7".

🥚 Descobrir que o problema era um campo COMP-3 inválido... depois de meia hora conversando com a IA.

🥚 Perguntar "explique esse JCL" e perceber que esqueceu de remover o nome real do dataset de produção.

🥚 Enviar um trecho de RACF para obter ajuda e lembrar, tarde demais, que ele continha IDs internos da empresa.

🥚 Pedir para a IA documentar um programa chamado PGM001A e descobrir que até ela comentou: "Seria útil usar nomes mais descritivos." Quem herdou sistemas legados sabe exatamente do que estamos falando!

🥚 O verdadeiro programador COBOL sabe que o maior bug nunca foi o GO TO. O maior bug sempre foi a pressa.


A grande lição

Durante décadas, aprendemos a proteger CPUs, discos, redes e bancos de dados.

Agora precisamos proteger algo ainda mais valioso:

o contexto.

Uma IA aprende com o contexto que fornecemos.

Quanto mais informações enviamos, mais ela consegue ajudar.

E justamente aí mora o risco.

No universo IBM Mainframe, onde vivem algumas das aplicações mais críticas do planeta, cada linha de código pode representar décadas de conhecimento acumulado, bilhões de transações processadas e a confiança de milhões de clientes.

A Inteligência Artificial não é uma inimiga do programador COBOL. Pelo contrário: ela pode acelerar análises, explicar programas legados, documentar sistemas, gerar casos de teste e reduzir o tempo gasto em tarefas repetitivas. O verdadeiro desafio é utilizá-la com responsabilidade.

O futuro não pertence às empresas que proíbem a IA, nem às que a utilizam sem regras. Pertence às organizações que conseguem equilibrar inovação, segurança e governança.

No fim das contas, a pergunta mais importante deixou de ser "Posso usar IA?".

A pergunta correta é:

"Estou compartilhando apenas aquilo que posso compartilhar?"

Se cada profissional fizer essa reflexão antes de pressionar Ctrl+C e Ctrl+V, já teremos dado um enorme passo para transformar a IA em uma aliada — e não em um risco silencioso para o mundo Mainframe e para os sistemas financeiros que sustentam a economia.


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