☕ 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

sexta-feira, 13 de maio de 2022

Kubernetes, COBOL e o Guia do Mochileiro das Galáxias para quem saiu do JES2 e encontrou um Pod

 

Bellacosa Mainframe e a introducao ao kubernetes no mundo cobol

☕ Um Café no Bellacosa Mainframe

Kubernetes, COBOL e o Guia do Mochileiro das Galáxias para quem saiu do JES2 e encontrou um Pod

🚀 Pods, Deployments, Services, YAML, containers, Scheduler, Control Plane, storage, autorrecuperação e a perturbadora descoberta de que o universo cloud-native passou décadas reinventando problemas que o velho operador do mainframe já conhecia — só que agora tudo tem nomes novos, logos simpáticos e desaparece antes do café esfriar

Existe uma frase que deveria estar escrita em letras grandes na entrada de qualquer curso de Kubernetes:

NÃO ENTRE EM PÂNICO.

Ela deveria aparecer imediatamente acima de outra:

E NÃO TENTE DECORAR O YAML.

O jovem programador COBOL, entretanto, normalmente ignora ambas.

Ele acabou de sobreviver ao primeiro encontro com IDENTIFICATION DIVISION, descobriu que PIC 9(7)V99 COMP-3 não é uma coordenada intergaláctica, conseguiu executar seu primeiro JCL sem receber um JCL ERROR e começa a acreditar que finalmente compreendeu o universo.

Então alguém aparece no corredor e pergunta:

— Você conhece Kubernetes?

O programador responde:

— Um pouco.

Essa resposta, como inúmeras decisões tomadas na história da humanidade, será lamentada posteriormente.

Quinze minutos depois ele estará olhando para alguma coisa assim:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: payment

E começa a suspeitar que foi sequestrado por extraterrestres.

Deployment.

ReplicaSet.

Pod.

Service.

Ingress.

Node.

Cluster.

Namespace.

ConfigMap.

Secret.

PersistentVolumeClaim.

DaemonSet.

StatefulSet.

Scheduler.

kubelet.

etcd.

O sujeito olha para aquilo e pensa:

“Eu só queria executar um programa.”

Bem-vindo ao Kubernetes.

Pegue sua toalha.

Prepare o café.

E não entre em pânico.


🌌 Capítulo 1 — Afinal, que diabo é Kubernetes?

O material que iniciou nossa viagem apresenta Kubernetes como uma plataforma open source destinada a automatizar implantação, dimensionamento, gerenciamento e operação de aplicações em contêineres.

A definição está correta.

Mas é daquelas definições tecnicamente corretas que escondem justamente a parte mais interessante.

É como definir um mainframe dizendo:

“É um computador utilizado para executar programas.”

Também está correto.

Só não ajuda muito.

Kubernetes pode ser entendido de forma mais poderosa:

Kubernetes é um sistema distribuído que observa continuamente o mundo real e tenta fazê-lo coincidir com o mundo que você declarou desejar.

Essa frase merece café.

Porque aqui está praticamente toda a filosofia Kubernetes.

Suponha que você diga:

Quero três instâncias da minha aplicação.

No Kubernetes você pode declarar:

replicas: 3

Agora imagine que estejam rodando:

Pod A
Pod B
Pod C

Perfeito.

Estado desejado:

3

Estado real:

3

O universo está em equilíbrio.

Até que o Pod B morre.

Agora temos:

Estado desejado = 3
Estado real     = 2

O Kubernetes observa a diferença.

E basicamente diz:

“Segundo meus registros, deveriam existir três. Só estou vendo dois. Isso é inaceitável.”

Então cria outro.

Pod A
Pod C
Pod D

Voltamos a:

Desejado = 3
Real     = 3

Pronto.

Você acabou de entender um dos conceitos mais importantes de Kubernetes:

reconciliation loop

ou:

loop de reconciliação

Kubernetes está continuamente perguntando:

O que deveria existir?
       |
       v
O que existe agora?
       |
       v
Existe diferença?
       |
       +---- não ---> continue observando
       |
       +---- sim ---> tente corrigir

Pense nisso como um operador extremamente obsessivo que possui uma planilha dizendo:

PRECISO DE 3 INSTÂNCIAS

e passa o dia inteiro contando.

— Uma.

— Duas.

— Três.

Tudo certo.

Cinco minutos depois:

— Uma.

— Duas.

CADÊ A TERCEIRA?!

E imediatamente chama alguém para providenciar outra.


🧠 Capítulo 2 — Kubernetes é declarativo, e isso muda tudo

No mundo tradicional de administração de sistemas, costumamos pensar proceduralmente.

Faça isto.

Depois aquilo.

Depois outra coisa.

Por exemplo:

1. crie servidor
2. instale sistema operacional
3. copie aplicação
4. configure arquivos
5. inicie processo
6. verifique processo
7. reinicie se necessário

Kubernetes tenta trabalhar de maneira diferente.

Você declara:

Quero três instâncias.
Quero esta imagem.
Quero esta configuração.
Quero esta quantidade de memória.
Quero este serviço.

E deixa a plataforma tentar produzir esse estado.

O próprio material destaca essa abordagem: você descreve os recursos através de manifestos e o sistema trabalha para manter o ambiente alinhado com o estado declarado.

Para um COBOLzeiro isso pode parecer estranho.

Mas não é completamente alienígena.

Pense em JCL.

Você escreve:

//ARQOUT DD DSN=EMPRESA.RELATORIO,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(5,2))

Você não está manualmente movimentando braços mecânicos dentro do storage.

Você está declarando requisitos.

O sistema interpreta.

Aloca.

Gerencia.

Kubernetes leva essa filosofia para workloads distribuídos.


🐳 Capítulo 3 — Antes de Kubernetes havia containers

Agora surge uma pergunta absolutamente fundamental:

Por que Kubernetes existe?

Porque containers ficaram tremendamente úteis.

Imagine uma aplicação tradicional que depende de:

Java versão X
biblioteca Y
arquivo Z
variáveis ambientais
configurações específicas

Na máquina do desenvolvedor funciona.

Em homologação explode.

Em produção surge o clássico diálogo:

— Mas na minha máquina funciona.

Ao que o operador responde:

— Excelente. Então vamos colocar sua máquina no data center.

Containers surgiram como uma maneira extremamente prática de empacotar aplicação e suas dependências.

Simplificando:

Aplicação
+
Dependências
+
Configuração de runtime
=
Imagem de container

A partir dela podemos iniciar containers.

Mas aí aparece o problema.

Um container é fácil.

Dez containers são administráveis.

Cem começam a ficar interessantes.

Mil começam a pedir café.

Dez mil fazem você procurar emprego.

Então surgem perguntas:

Em qual servidor cada container roda?

E se o servidor morrer?

Como substituir automaticamente?

Como distribuir tráfego?

Como atualizar versões?

Como saber quais instâncias estão saudáveis?

Como aumentar capacidade?

Como armazenar dados?

Como controlar configuração?

Como proteger credenciais?

Eis o território do Kubernetes.


📦 Capítulo 4 — Container não é Pod

Essa é uma das primeiras armadilhas do viajante.

O material corretamente apresenta o Pod como menor unidade de implantação do Kubernetes, capaz de conter um ou mais containers.

Então:

CONTAINER != POD

Um Pod é uma abstração.

Imagine:

+---------------------------+
|            POD            |
|                           |
|   +-------------------+   |
|   | Container App     |   |
|   +-------------------+   |
|                           |
|   +-------------------+   |
|   | Container Sidecar |   |
|   +-------------------+   |
|                           |
+---------------------------+

Na maioria dos casos simples:

1 Pod
  |
  +-- 1 container principal

Mas podem existir múltiplos containers fortemente relacionados.

Por exemplo:

Aplicação
+
proxy auxiliar

ou:

Aplicação
+
componente auxiliar de observabilidade

Esses containers compartilham elementos do ambiente do Pod.

A ideia importante é:

Kubernetes administra Pods.

Você pode até imaginar o container como o programa e o Pod como sua pequena unidade operacional.

Não é uma equivalência perfeita com nada do mainframe, mas ajuda a construir o mapa mental.


💀 Capítulo 5 — Kubernetes não ama seus servidores

Aqui ocorre um choque cultural particularmente divertido.

Administradores tradicionais costumavam dar nomes carinhosos às máquinas.

WEBPROD01
WEBPROD02
DBSERVER03

E depois surgia aquele servidor lendário.

Você pergunta:

— Podemos reiniciar WEBPROD01?

A sala fica silenciosa.

O sysadmin mais velho começa a suar.

— Não sabemos.

— Como assim?

— Ele está rodando desde 2014.

— Então reinicie.

— Existem coisas que o homem não deveria tentar compreender.

No Kubernetes, a filosofia tende a ser diferente.

Pods são efêmeros.

Se um Pod desaparece, você não deveria necessariamente organizar uma cerimônia fúnebre.

Você substitui.

Pod XPTO morreu.

Kubernetes:

Quantos deveriam existir?

Você:

5.

Kubernetes:

Quantos existem?

Você:

4.

Kubernetes:

Então criarei outro.

Fim.

Nenhuma lágrima.

Nenhum minuto de silêncio.

Nenhum administrador abraçando o rack.


🏗️ Capítulo 6 — Deployment: pare de criar Pods com as próprias mãos

Você pode criar diretamente um Pod.

Mas normalmente aplicações são administradas por objetos de nível superior.

Um dos principais é o:

Deployment

Imagine:

Deployment
     |
     v
ReplicaSet
     |
     +---- Pod
     +---- Pod
     +---- Pod

O material apresenta ReplicaSets como responsáveis por garantir determinado número de réplicas e Deployments como responsáveis por administrar implantações e atualizações.

Declare:

replicas: 3

Você está dizendo:

“Universo, quero três.”

Um Pod morre.

ReplicaSet percebe:

Desejado: 3
Atual:    2

Cria outro.

Mas Deployment também ajuda em algo importantíssimo:

atualizações.

Imagine que você possui:

versão 1

e deseja implantar:

versão 2

Em vez de executar:

PARA TUDO
ATUALIZA TUDO
REZA
LIGA TUDO

podemos fazer atualização gradual.

Essa lógica está por trás dos famosos:

rolling updates

Nova versão vai entrando enquanto a antiga vai saindo.

O objetivo é reduzir interrupção.

Naturalmente, como qualquer sysprog experiente sabe:

“Atualização sem parada” não significa “atualização sem risco”.

Kubernetes automatiza mecanismos.

Não revoga a Lei de Murphy.


🛰️ Capítulo 7 — O Scheduler é o agente de viagens dos Pods

Imagine que um novo Pod precisa executar.

Existem cinco Nodes.

Node A
Node B
Node C
Node D
Node E

Quem decide onde o bichinho vai morar?

O:

Scheduler

O artigo apresenta o Scheduler entre os principais componentes do antigo chamado “Master Node”.

Hoje é preferível falar:

CONTROL PLANE

em vez de simplesmente:

MASTER NODE

O Scheduler analisa possibilidades.

Por exemplo:

CPU disponível?
Memória suficiente?
Restrições?
Afinidade?
Taints?
Tolerations?
Topologia?

E decide:

Este Pod -> Node C

Para quem viveu mainframe:

— Bellacosa, isso lembra WLM!

Calma, jovem Padawan.

Não são equivalentes.

Mas enfrentam uma família semelhante de problemas.

No mainframe:

workload
    |
    v
classes / prioridades / recursos
    |
    v
execução

No Kubernetes:

Pod pendente
    |
    v
Scheduler
    |
    v
Node

A tecnologia muda.

A pergunta permanece:

Como distribuir trabalho sobre recursos limitados?

Os computadores passam décadas reinventando essa pergunta.

Só os acrônimos mudam.


🧙 Capítulo 8 — O Control Plane é a burocracia imperial

Para entender Kubernetes, imagine uma administração imperial intergaláctica extremamente eficiente.

Temos:

API Server
Scheduler
Controller Manager
etcd

O API Server é a porta de entrada.

Você executa:

kubectl apply -f deployment.yaml

Muitos iniciantes pensam:

kubectl = Kubernetes

Não.

kubectl é um cliente.

Conceitualmente:

kubectl
   |
   v
API Server
   |
   v
Universo Kubernetes

A API é extraordinariamente importante.

Porque quase tudo pode conversar com ela:

CI/CD
GitOps
Operators
automação
ferramentas administrativas
políticas
observabilidade

Isso explica por que Kubernetes não é simplesmente um “Docker grandão”.

É uma plataforma orientada por API.


📚 Capítulo 9 — etcd: o cartório onde o universo guarda sua memória

O etcd mantém dados importantes sobre o estado do cluster.

Imagine que Kubernetes possui um cartório.

Lá está registrado:

Deployment pagamento
replicas: 5

Service pagamento
porta: 8080

Configuração X
Configuração Y

O etcd participa da preservação daquilo que o cluster acredita que existe e deveria existir.

Portanto:

etcd morreu

não é exatamente uma frase que você gostaria de ouvir às 3h17 da manhã.

Especialmente se a próxima frase for:

— E o backup?

seguida por:

— Que backup?

Nesse momento até o Guia do Mochileiro recomendaria abandonar o planeta.


👷 Capítulo 10 — kubelet: o capataz de cada Node

Cada worker possui um agente chamado:

kubelet

O material o apresenta como responsável por administrar os containers e manter sua execução em conformidade com as especificações.

Imagine:

CONTROL PLANE
      |
      v
    NODE
+-------------------+
| kubelet           |
| runtime           |
| Pod               |
| Pod               |
+-------------------+

O control plane decide.

O kubelet executa localmente parte desse desejo.

Ele verifica:

“Existem Pods que deveriam estar rodando aqui?”

E trabalha para garantir isso.


🌐 Capítulo 11 — Service: porque decorar IP de Pod é receita para enlouquecer

Hoje:

Pod A = 10.0.1.37

Amanhã ele morre.

Novo Pod:

Pod B = 10.0.8.91

Se todo cliente dependesse diretamente desses endereços, estaríamos construindo um castelo sobre areia movediça.

Então surge:

Service

O material descreve Services como abstrações responsáveis por permitir comunicação confiável entre Pods e proporcionar exposição e balanceamento de tráfego.

Em vez de:

Cliente -> IP do Pod

temos:

            +--> Pod A
Cliente -> Service
            +--> Pod B
            +--> Pod C

Os Pods podem mudar.

O Service fornece identidade estável.

Isso é uma ideia fundamental.

Pods são descartáveis.

Services são pontos lógicos relativamente estáveis.


🚪 Capítulo 12 — E então aparecem Ingress e Gateway

Agora imagine que temos:

Internet

e precisamos encaminhar tráfego até aplicações dentro do cluster.

Uma arquitetura pode envolver:

Internet
   |
Load Balancer
   |
Ingress / Gateway
   |
Service
   |
Pods

Isso nos ensina algo importante:

Kubernetes não é uma caixa mágica que substitui DNS, firewall, load balancer, proxy e todas as camadas de networking da humanidade.

Quando alguém disser:

“Kubernetes faz load balancing.”

Pergunte imediatamente:

“Em qual camada?”

Você ficará instantaneamente 14% mais perigoso em reuniões técnicas.


💾 Capítulo 13 — Storage: o momento em que os Pods descobrem que existem consequências

Aplicações stateless combinam maravilhosamente com a filosofia:

morreu?
cria outra.

Mas imagine um banco.

Pod morre.

Você diz:

— Tudo bem, cria outro.

Banco responde:

— Excelente ideia. E meus dados?

Silêncio.

Agora chegamos a:

PersistentVolume
PersistentVolumeClaim
StorageClass
StatefulSet

O artigo explica que Kubernetes oferece volumes e mecanismos de persistência que permitem manter dados mesmo quando Pods são reiniciados ou reimplantados.

Podemos pensar:

Pod
 |
 v
PVC
 |
 v
PV
 |
 v
Storage

Por trás pode existir:

cloud disk
SAN
NFS
Ceph
storage corporativo

A aplicação solicita armazenamento.

A infraestrutura providencia.


🏛️ Capítulo 14 — StatefulSet: alguns cidadãos precisam de identidade

Para uma API web:

Pod A
Pod B
Pod C

podem ser quase equivalentes.

Mas existem aplicações onde identidade importa.

Bancos.

Clusters distribuídos.

Mensageria.

Sistemas que precisam de:

ordem
identidade
storage persistente
relações específicas

Então aparece:

StatefulSet

O nome já entrega:

Stateful

Estado importa.

Aqui Kubernetes começa a deixar de ser parque de diversões e vira arquitetura séria.


🔑 Capítulo 15 — ConfigMap e Secret

Um erro clássico:

password = "senha123"

dentro do código.

Outro:

URL_PRODUCAO

compilada na aplicação.

Kubernetes permite separar configuração da aplicação.

Temos:

ConfigMap

para configurações.

E:

Secret

para informações sensíveis.

O material destaca ambos como mecanismos de separação entre código, configuração e dados sensíveis.

Mas cuidado.

Secret não significa:

SEGREDO PROTEGIDO POR MAGIA ÉLFICA

Segurança real ainda exige:

RBAC
controle de privilégios
criptografia
proteção do etcd
auditoria
segregação
gestão de credenciais

Quem vem de RACF deveria sentir aqui um arrepio familiar.

A tecnologia muda.

O princípio permanece:

usuário ou workload deve possuir apenas os privilégios necessários.

Least privilege nunca saiu de moda.

Só ganhou novos logos.


🏥 Capítulo 16 — Está vivo? Está pronto? Ou apenas finge muito bem?

Imagine um processo executando.

Sistema operacional diz:

PID existente.

Ótimo.

Mas ele responde?

Talvez não.

Consegue acessar dependências?

Talvez não.

Está preparado para receber tráfego?

Talvez não.

Então Kubernetes trabalha com probes.

livenessProbe
readinessProbe
startupProbe

Três perguntas diferentes:

STARTUP:
Você conseguiu iniciar?

READINESS:
Você está pronto para trabalhar?

LIVENESS:
Você ainda está funcionando?

Essa diferença é lindíssima.

Porque:

processo existente não significa aplicação saudável.

Quem já passou horas olhando um CICS aparentemente “UP” enquanto alguma parte crítica estava mortalmente doente sabe exatamente do que estamos falando.


🩺 Capítulo 17 — Self-healing não é House M.D.

Kubernetes frequentemente é descrito como possuindo:

self-healing

Ou:

autorrecuperação

O texto também destaca recuperação automática diante de falhas de Pods ou máquinas.

Mas não imagine:

Kubernetes encontrou bug COBOL.
Kubernetes corrigiu regra de juros.
Kubernetes percebeu SQL errado.

Não.

Ele pode perceber:

processo morreu
Pod desapareceu
Node deixou de responder
probe falhou
réplicas estão abaixo do esperado

E reagir operacionalmente.

Porém se sua aplicação calcula:

R$ 10,00

quando deveria calcular:

R$ 1.000.000,00

Kubernetes pode executar o erro com extraordinária disponibilidade.

E escalá-lo horizontalmente.

Parabéns.

Você agora possui um bug altamente disponível.


🔥 Capítulo 18 — Kubernetes automatiza inclusive suas más decisões

Essa merece entrar no manual oficial.

Você declara:

replicas: 50

Kubernetes tenta fornecer 50.

Muito eficiente.

Agora imagine que a aplicação possua um erro fatal.

Kubernetes pode providenciar:

50 cópias

do erro fatal.

Cloud-native!

Esse é o paradoxo da automação:

Automação amplifica capacidade, não inteligência.

Ela acelera boas decisões.

E acelera estupidamente decisões ruins.

Por isso precisamos de:

testes
observabilidade
logs
métricas
traces
health checks
CI/CD
rollback
canary
políticas
controle de mudança

O velho mainframeiro sorri.

Porque novamente descobre que o futuro acabou reencontrando problemas que produção conhece há décadas.


🐳 Capítulo 19 — Docker não é Kubernetes

O artigo compara corretamente os papéis gerais:

Docker -> empacotamento/execução de containers

Kubernetes -> orquestração

Mas precisamos modernizar a interpretação.

Kubernetes não significa:

Kubernetes
    |
 Docker obrigatório

O ecossistema utiliza runtimes compatíveis com a Container Runtime Interface.

Um arranjo comum é:

Kubernetes
    |
 kubelet
    |
   CRI
    |
containerd
    |
containers

Então Docker e Kubernetes podem coexistir no seu aprendizado, mas Kubernetes não deve ser entendido simplesmente como:

“Docker distribuído.”

É outra camada de abstração.


📝 Capítulo 20 — YAML não é Kubernetes

Essa deveria estar estampada em canecas.

YAML != Kubernetes

YAML é sintaxe usada para representar objetos.

Veja:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pagamento

A parte importante não é saber que depois de metadata: vêm dois espaços.

O importante é compreender:

O que é Deployment?

Por que existe?

Qual estado ele representa?

Quem observa esse estado?

Que outros objetos ele cria?

Memorizar YAML sem entender Kubernetes é como decorar JCL sem compreender dataset, step, DD, condição e execução.

Você aprende os símbolos.

Mas ainda não aprendeu o sistema.


🪐 Capítulo 21 — O fantástico universo dos objetos

Depois que você entende o modelo declarativo, os nomes começam a deixar de parecer uma convenção criada por alienígenas bêbados.

Pod

declara unidade executável.

Deployment

declara uma aplicação replicada e atualizável.

Service

declara uma identidade de rede.

ConfigMap

declara configuração.

Secret

declara informação sensível.

PVC

declara necessidade de armazenamento.

Job

declara trabalho que deve terminar.

CronJob

declara trabalho agendado.

StatefulSet

declara workload com identidade/estado.

DaemonSet

declara algo que deve existir em determinados Nodes, frequentemente um por Node.

Percebeu o padrão?

Tudo é:

declaração de intenção.


🔧 Capítulo 22 — Operator: quando você ensina Kubernetes a administrar seu sistema

Agora chegamos a uma das regiões mais interessantes da galáxia.

Kubernetes possui controllers.

Controllers observam estado e corrigem divergências.

Então alguém teve a ideia inevitável:

“E se eu criar meu próprio controller?”

Nasce o conceito de:

Operator

Imagine um banco fictício.

Você cria um recurso:

kind: BancoGalactico
spec:
  replicas: 3
  backup: diario

Naturalmente Kubernetes não nasce sabendo o que significa:

BancoGalactico

Mas você pode criar lógica que compreenda essa definição.

Então o Operator observa:

BancoGalactico

e executa procedimentos especializados.

A partir daí Kubernetes deixa de ser simplesmente um orquestrador.

Ele se transforma numa:

plataforma para construir plataformas.


👽 Capítulo 23 — O cluster não é simplesmente um grupo de servidores

O material define cluster como conjunto de máquinas físicas ou virtuais usadas para executar workloads Kubernetes.

Correto.

Mas existe uma interpretação melhor.

Cluster também é um domínio lógico de:

computação
rede
storage
políticas
identidade
scheduling
controle

Imagine:

                CLUSTER
+---------------------------------------+
|                                       |
| Control Plane                         |
|                                       |
| Node A      Node B       Node C       |
| Pods        Pods         Pods         |
|                                       |
| Services                              |
| Storage                               |
| Policies                              |
| Configurations                        |
|                                       |
+---------------------------------------+

Você deixa de pensar:

Tenho 37 servidores.

e começa a pensar:

Tenho capacidade computacional administrada pelo cluster.

Essa mudança mental é poderosa.


🧮 Capítulo 24 — Requests, Limits e o dia em que todo mundo quis 64 GB

Em ambientes compartilhados aparece outra pergunta ancestral:

Quanto cada aplicação pode consumir?

Imagine vinte equipes declarando:

Minha aplicação precisa de tudo.

Kubernetes fornece mecanismos como:

requests
limits

Simplificando:

request = quantidade considerada necessária para scheduling
limit   = teto permitido

Exemplo conceitual:

resources:
  requests:
    memory: "512Mi"
    cpu: "250m"
  limits:
    memory: "1Gi"
    cpu: "500m"

Isso começa a lembrar gestão de capacidade.

E novamente o COBOLzeiro veterano diz:

— Isso parece assunto de WLM.

Sim.

Continue seguindo o coelho branco.


📈 Capítulo 25 — Autoscaling: três não precisam continuar três

Inicialmente:

replicas: 3

Mas carga aumenta.

Talvez precisemos de:

6

Depois diminui:

2

Kubernetes possui mecanismos de autoscaling.

Então a infraestrutura começa a adaptar capacidade ao comportamento observado.

A ideia é sedutora:

Pouca carga -> menos recursos
Muita carga -> mais recursos

Mas novamente:

métricas ruins produzem decisões ruins.

Se seu indicador não representa corretamente pressão real sobre a aplicação, você pode automatizar oscilações, desperdício ou indisponibilidade.

Nenhum produto consegue escapar da regra universal:

GARBAGE IN
   |
   v
AUTOMATION
   |
   v
GARBAGE AT SCALE

🧭 Capítulo 26 — Como eu ensinaria Kubernetes para um programador COBOL iniciante

Não começaria com Helm.

Não começaria com service mesh.

Não começaria com Istio.

Não começaria com GitOps.

E certamente não jogaria 800 páginas de YAML na cabeça da vítima.

Eu seguiria esta trilha:

Passo 1 — Entenda processo

Saiba o que significa um programa executando.

Passo 2 — Entenda container

Aplicação isolada com dependências empacotadas.

Passo 3 — Entenda imagem

Modelo imutável usado para criar containers.

Passo 4 — Execute container localmente

Antes de Kubernetes.

Passo 5 — Aprenda Pod

A menor unidade Kubernetes.

Passo 6 — Aprenda Deployment

Pare de tratar Pods como animais de estimação.

Passo 7 — Aprenda Service

Descubra como encontrar aplicações efêmeras.

Passo 8 — ConfigMap e Secret

Separe configuração de aplicação.

Passo 9 — Volumes

Descubra que dados não podem desaparecer simplesmente porque um Pod morreu.

Passo 10 — Requests e Limits

Aprenda capacidade.

Passo 11 — Probes

Aprenda saúde operacional.

Passo 12 — Scheduler

Descubra como workload encontra Node.

Passo 13 — Control Plane

Entenda quem governa a galáxia.

Passo 14 — Networking

Agora você possui contexto suficiente para sofrer adequadamente.

Passo 15 — Segurança

RBAC, ServiceAccounts, Secrets, políticas.

Passo 16 — Observabilidade

Logs, métricas, tracing.

Passo 17 — StatefulSet e Jobs

Comece a trabalhar com workloads especializados.

Passo 18 — GitOps, Operators e ecossistema

Somente depois disso entre nos níveis avançados.


🧪 Capítulo 27 — Laboratório do Mochileiro: sua primeira viagem

Imagine uma aplicação:

hello-cobol

Você cria Deployment com:

replicas: 3

Depois:

kubectl get pods

E encontra:

hello-abc
hello-def
hello-ghi

Agora delete um:

kubectl delete pod hello-def

Espere alguns segundos.

Execute novamente:

kubectl get pods

Você verá outro surgindo.

Esse exercício vale mais do que vinte slides.

Porque seu cérebro finalmente percebe:

“Ah! Eu não mandei Kubernetes executar três Pods uma vez. Eu disse que três deveriam existir.”

BINGO.

Esse é o momento Jedi.


🎒 Easter Egg nº 1 — O nome Kubernetes

Kubernetes vem de uma palavra grega associada ao conceito de:

timoneiro
piloto
governante

Daí o famoso símbolo do leme.

É uma escolha perfeita.

Containers são workloads.

Nodes são recursos.

Kubernetes segura o leme.

Ou pelo menos tenta.

Porque ocasionalmente alguém executa:

kubectl delete namespace production

e então nem Poseidon poderá ajudá-lo.


🧙 Easter Egg nº 2 — Kubernetes também é conhecido como K8s

Você verá frequentemente:

K8s

Por quê?

Kubernetes possui:

K + 8 letras + s

As oito letras entre K e s foram comprimidas.

Da mesma família:

internationalization -> i18n
localization         -> l10n

Economia de caracteres.

Talvez porque depois de escrever manifestos YAML durante três horas qualquer economia começa a parecer importante.


🐛 Easter Egg nº 3 — O artigo trouxe PHP para Kubernetes

No final do material original surge uma frase curiosa:

“Embora seja possível aprender PHP por conta própria...”

PHP aparentemente atravessou um wormhole editorial.

Logo depois o texto ainda fala em compreensão profunda da “linguagem”.

Só que Kubernetes não é linguagem.

Provavelmente o texto nasceu de algum template reaproveitado.

Excelente lembrete de produção:

copy/paste é o ancestral comum de metade dos bugs do planeta.

COBOLzeiros conhecem muito bem essa criatura.


🏦 Capítulo 28 — Kubernetes encontra COBOL

Agora chegamos à pergunta realmente divertida.

COBOL vai rodar em Kubernetes?

Pode.

Mas essa não é necessariamente a pergunta mais importante.

O ponto mais interessante é:

Como sistemas legados podem participar de uma arquitetura onde Kubernetes administra componentes modernos?

Imagine:

Mobile
   |
API Gateway
   |
Kubernetes
   |
Microserviço
   |
API
   |
z/OS Connect
   |
COBOL
   |
Db2

Nesse desenho:

COBOL continua fazendo aquilo que faz extraordinariamente bem:

transação
regra de negócio
processamento financeiro
integração com dados críticos

Enquanto Kubernetes administra:

APIs
camadas web
serviços modernos
integrações
workloads distribuídos

Não precisamos transformar cada programa COBOL em um Pod para que Kubernetes seja relevante ao mundo mainframe.

Essa é uma distinção importante.

Modernização não significa:

DELETE FROM MAINFRAME;

Modernização pode significar:

INTEGRATE MAINFRAME WITH MODERN ECOSYSTEM;

🏰 Capítulo 29 — Kubernetes não matou o mainframe

Eis uma história corporativa clássica.

1995:

“Mainframe morreu.”

2005:

“Mainframe morreu.”

2015:

“Agora morreu.”

2026:

“Tem alguém que saiba COBOL?”

Enquanto isso, no universo distribuído:

Docker
Kubernetes
Kafka
Redis
Service Mesh
Observability
GitOps
API Gateway
Zero Trust

O futuro não substituiu complexidade.

Ele a redistribuiu.

Às vezes elegantemente.

Às vezes em 97 arquivos YAML.


☕ Capítulo 30 — A grande revelação do velho sysprog

Depois de algumas semanas estudando Kubernetes, nosso jovem COBOLzeiro procura o sysprog.

— Mestre, descobri algo.

O sysprog larga o café.

— Fale.

— Kubernetes possui Scheduler.

— Sim.

— Controle de recursos.

— Sim.

— Autorização.

— Sim.

— Alta disponibilidade.

— Sim.

— Logs.

— Sim.

— Automação.

— Sim.

— Storage.

— Sim.

— Workload management.

— De certa forma.

— Atualizações controladas.

— Sim.

— Recuperação automática.

— Sim.

— Então...

O jovem hesita.

— O pessoal de cloud passou décadas recriando problemas que o mainframe já tinha?

O sysprog sorri.

— Agora você está aprendendo arquitetura.

Essa é a grande lição.

Não significa que:

Kubernetes = mainframe

Nem remotamente.

Significa que sistemas grandes encontram problemas universais:

capacidade
concorrência
isolamento
scheduling
identidade
segurança
storage
recuperação
configuração
observabilidade
automação

A tecnologia muda.

Os problemas fundamentais continuam sentados no mesmo bar.


🌌 Epílogo — A resposta para Kubernetes, a vida, o universo e tudo mais

No Guia do Mochileiro das Galáxias, a resposta para a grande questão da vida, do universo e tudo mais é:

42

No Kubernetes, talvez a resposta seja:

estado desejado

Porque quase tudo começa daí.

Você declara:

Quero três Pods.

Quero determinada imagem.

Quero determinada configuração.

Quero determinado storage.

Quero determinado endpoint.

Quero determinadas políticas.

O cluster observa:

O que existe?

Compara:

O que deveria existir?

E trabalha continuamente para reduzir a diferença.

Por isso o fluxo mental definitivo pode ser desenhado assim:

            DECLARAÇÃO
                |
                v
        ESTADO DESEJADO
                |
                v
           API SERVER
                |
                v
              etcd
                |
        +-------+-------+
        |               |
   Controllers       Scheduler
        |               |
        +-------+-------+
                |
                v
              Nodes
                |
             kubelet
                |
                v
              Pods
                |
                v
        ESTADO REAL
                |
                v
          OBSERVAÇÃO
                |
                +-------------------+
                                    |
                                    v
                         ESTÁ DIFERENTE?
                              /       \
                            não       sim
                            |          |
                         continue   reconciliar

Se você entendeu esse desenho, Kubernetes deixou de ser coleção de palavras estranhas.

Pod não é mais um nome engraçado.

Deployment não é mais um YAML gigante.

Service não é simplesmente um IP.

Scheduler não é magia.

Controller não é mistério.

Kubernetes começa a revelar aquilo que realmente é:

um enorme sistema distribuído de controle, baseado em APIs e declarações de intenção, construído para manter workloads funcionando num mundo onde servidores falham, aplicações mudam, demanda oscila, containers desaparecem e alguém inevitavelmente faz deploy numa sexta-feira às 17h47.

E essa última pessoa deverá ser proibida de tocar em produção.

Não por Kubernetes.

Por um sysprog veterano armado com uma caneca de café.


☕ Registro final do Bellacosa Mainframe

Se você vem de COBOL, não cometa o erro de olhar Kubernetes pensando:

“Isso é coisa totalmente diferente daquilo que conheço.”

Olhe novamente.

Por baixo dos logos coloridos existem velhos problemas conhecidos:

Quem executa?

Onde executa?

Quanto pode consumir?

Quem pode acessar?

O que acontece quando falha?

Como encontrar o serviço?

Como manter estado?

Como atualizar?

Como observar?

Como recuperar?

Essas perguntas sobreviveram ao batch, ao CICS, ao cliente-servidor, à web, aos containers e sobreviverão ao próximo paradigma.

Aprender Kubernetes, portanto, não é decorar uma tecnologia.

É aprender uma nova maneira de responder antigas perguntas da computação.

E talvez seja justamente por isso que um programador COBOL possui uma vantagem inesperada.

Ele já conhece o planeta.

Só precisa aprender os nomes das novas criaturas.

Pegue sua toalha.

Abra o terminal.

Prepare o café.

Digite:

kubectl get pods

E lembre-se da primeira regra do administrador intergaláctico de infraestrutura:

NÃO ENTRE EM PÂNICO.

A segunda?

NUNCA FAÇA kubectl delete ANTES DE LER DUAS VEZES O NOME DO NAMESPACE.

☕🚀🖥️

quinta-feira, 12 de maio de 2022

O Arquivo Secreto do JSON : Os Recursos Avançados do Enterprise COBOL que Quase Ninguém Aprende...

 

Bellacosa Mainframe e o arquivo secreto do json

☕ Um Café no Bellacosa Mainframe

O Arquivo Secreto do JSON

Os Recursos Avançados do Enterprise COBOL que Quase Ninguém Aprende... Mas que Movem Bilhões de Transações Todos os Dias

"Existem programadores que sabem escrever COBOL. Existem programadores que sabem integrar COBOL ao mundo moderno. A diferença entre eles pode ser apenas uma instrução chamada JSON PARSE."


Prólogo — A Porta Número 3270

Era quase meia-noite.

As luzes do CPD permaneciam acesas como sempre.

O z16 processava milhões de transações silenciosamente. Em algum lugar daquele prédio, centenas de aplicações CICS conversavam entre si, acessando DB2, VSAM, MQ e dezenas de microsserviços espalhados pela nuvem.

Na tela verde do terminal 3270, um jovem Programador Padawan acabara de receber sua primeira missão.

Integrar um programa COBOL com uma API REST.

A documentação dizia apenas:

"Receber um JSON."

Somente isso.

Nenhuma explicação.

Nenhum diagrama.

Nenhuma pista.

Foi naquele momento que ele descobriu que o maior mistério do Mainframe moderno não era o COBOL.

Era o JSON.

Pegue seu café.

Hoje vamos abrir um dos arquivos mais secretos do Enterprise COBOL.


Quando o IBM Z Aprendeu um Novo Idioma

Durante décadas o Mainframe falava uma linguagem extremamente organizada.

Cada campo possuía tamanho fixo.

Cada byte tinha uma posição.

Cada registro obedecia um layout rígido.

Exemplo:

Cliente........30 bytes
Conta..........10 bytes
Saldo..........09 bytes

Nada podia sair do lugar.

Era como uma biblioteca onde todos os livros ocupavam exatamente a mesma prateleira.

Então surgiu a Internet.

Depois vieram smartphones.

Cloud.

Microsserviços.

Open Banking.

PIX.

Aplicativos.

Inteligência Artificial.

Todos falavam uma língua completamente diferente.

JSON.

Ao invés de posições fixas...

Possuíam nomes.

Ao invés de layouts...

Possuíam objetos.

Ao invés de registros...

Possuíam documentos.

Durante algum tempo muitos acreditaram que COBOL jamais conversaria naturalmente com esse novo mundo.

Estavam completamente enganados.


O Nascimento do JSON PARSE

A IBM resolveu o problema adicionando dois comandos revolucionários ao Enterprise COBOL:

JSON PARSE

e

JSON GENERATE

Essas duas instruções mudaram completamente a forma como aplicações COBOL se integram ao restante do mercado.

Hoje um programa escrito há quarenta anos pode conversar com uma aplicação Android, um sistema em Java, um microsserviço em Go, uma aplicação Python ou um modelo de Inteligência Artificial.

Sem precisar reinventar a roda.


O Grande Tradutor Invisível

Imagine um tradutor simultâneo.

Uma pessoa fala japonês.

Outra fala português.

O tradutor escuta.

Converte.

Entrega a mensagem.

É exatamente isso que o parser faz.

Ele recebe:

{
   "nome":"Maria",
   "idade":30
}

e transforma automaticamente em:

05 WS-NOME.
05 WS-IDADE.

Nenhuma linha extra de código.

Nenhum parser artesanal.

Nenhuma rotina gigantesca.


O Que Acontece Dentro do Enterprise COBOL?

Pouca gente sabe.

Mas internamente o compilador cria uma estrutura extremamente sofisticada.

Quando encontra:

JSON PARSE

ele gera código capaz de:

✔ analisar caractere por caractere;

✔ identificar objetos;

✔ validar aspas;

✔ converter números;

✔ interpretar arrays;

✔ localizar campos;

✔ detectar erros;

✔ copiar os valores para a Working-Storage.

Tudo isso acontece em microssegundos.


JSON PARSE WITH DETAIL

Aqui começamos a entrar na parte que muitos programadores nunca utilizam.

Imagine receber um JSON com erro.

Sem WITH DETAIL.

Você sabe apenas que falhou.

Com:

JSON PARSE WS-JSON

INTO WS-DADOS

WITH DETAIL

ON EXCEPTION

DISPLAY "ERRO"

END-JSON

o compilador produz informações muito mais ricas sobre o ponto exato da falha.

Isso facilita enormemente o diagnóstico em produção.

Em grandes bancos, localizar rapidamente o campo inválido pode significar minutos em vez de horas de investigação.

☕ Curiosidade Bellacosa: muitos incidentes de integração não são causados pelo COBOL, mas por mudanças discretas em contratos JSON feitos por equipes externas sem comunicação adequada.


NAME OF — Quando Dois Mundos Usam Nomes Diferentes

Imagine o seguinte cenário.

API:

customerName

COBOL:

CLIENTE-NOME

Os nomes não coincidem.

Em vez de alterar um copybook utilizado por dezenas de programas, o Enterprise COBOL permite realizar o mapeamento de nomes com recursos como NAME OF, preservando a estrutura interna da aplicação.

Isso é extremamente útil quando uma API segue convenções como camelCase e o ambiente Mainframe utiliza nomes tradicionais em maiúsculas.


SUPPRESS — O Segredo dos JSONs Elegantes

Imagine um cadastro.

Telefone

Email

Fax

Todos vazios.

Sem SUPPRESS.

{
   "telefone":"",
   "email":"",
   "fax":""
}

Com SUPPRESS.

{
}

Ou apenas:

{
   "nome":"Luke"
}

Arquivos menores.

Menos tráfego.

Mais desempenho.

Menor consumo de banda.

Em ambientes de alta escala, alguns poucos bytes economizados por mensagem representam milhões de bytes ao longo do dia.


COUNT IN — Descobrindo Quantos Objetos Foram Processados

Imagine receber uma lista de clientes.

[
...
]

Como saber quantos registros realmente foram convertidos?

Entra em cena:

COUNT IN

Ele informa quantos elementos foram efetivamente processados.

Extremamente útil para:

  • auditoria;

  • logs;

  • validação;

  • conferência de cargas;

  • integração batch.


CONVERTING — O Pequeno Mágico

Nem sempre dois sistemas utilizam os mesmos valores.

API:

true

COBOL:

"S"

Outro sistema:

1

Outro:

"ATIVO"

O recurso CONVERTING permite realizar essas transformações de forma controlada, reduzindo código repetitivo e centralizando regras de conversão.


Arrays Complexos — O Labirinto do Minotauro

É aqui que muitos iniciantes se perdem.

Observe:

Clientes

↓

Telefones

↓

Endereços

↓

Documentos

Objetos dentro de objetos.

Arrays dentro de arrays.

No COBOL isso é representado através de grupos e OCCURS.

CLIENTE

↓

ENDERECOS OCCURS

↓

TELEFONES OCCURS

O parser percorre cada nível da estrutura, preenchendo automaticamente as tabelas.

É como explorar um enorme arquivo de fichas organizado em gavetas, pastas e divisórias.


OCCURS DEPENDING ON

Nem sempre sabemos quantos registros existirão.

Hoje chegam cinco clientes.

Amanhã cinquenta.

Depois mil.

O OCCURS DEPENDING ON permite estruturas variáveis, mas exige atenção redobrada: o contador deve refletir corretamente a quantidade de elementos, caso contrário leituras incompletas ou acessos inválidos podem ocorrer.


O Fantasma do UTF-8

Existe um fantasma que assombra integrações.

Seu nome:

UTF-8.

O Mainframe tradicional trabalha naturalmente em EBCDIC.

Grande parte da Internet utiliza UTF-8.

Quando a conversão é esquecida...

acentos desaparecem.

Caracteres ficam ilegíveis.

Nomes tornam-se símbolos estranhos.

Antes de culpar o JSON, verifique sempre a codificação.

Esse detalhe já consumiu incontáveis horas de troubleshooting em ambientes corporativos.


O Castelo do z/OS Connect

Agora imagine o seguinte cenário.

Aplicativo.

Internet.

API REST.

z/OS Connect.

CICS.

COBOL.

DB2.

Esse é um dos caminhos mais comuns atualmente.

O z/OS Connect funciona como um diplomata.

Ele recebe JSON.

Traduz.

Entrega ao programa COBOL.

Depois faz exatamente o caminho inverso.

O desenvolvedor trabalha na lógica de negócio enquanto a infraestrutura cuida do protocolo.


CICS e JSON

Durante muito tempo o CICS falava principalmente COMMAREA.

Hoje ele também conversa utilizando:

CHANNEL.

CONTAINER.

JSON.

Isso permitiu criar aplicações muito maiores do que os antigos limites impostos por COMMAREA.

Além disso, o modelo de canais facilita integrações complexas e transporte de documentos maiores.


APIs REST — O Novo Correio do Mainframe

As APIs REST funcionam como um serviço postal moderno.

GET.

Buscar.

POST.

Criar.

PUT.

Atualizar.

DELETE.

Excluir.

O JSON é a carta.

O HTTP é o carteiro.

O COBOL continua sendo o especialista que decide o que fazer quando a carta chega.


O Caminho de Uma Transação

Imagine um PIX.

Aplicativo.

API.

Gateway.

z/OS Connect.

CICS.

JSON PARSE.

COBOL.

DB2.

JSON GENERATE.

Resposta.

Tudo isso pode acontecer em poucos milissegundos.

Enquanto você termina de piscar os olhos, milhares de mensagens semelhantes atravessaram esse caminho.


Segurança Nunca É Opcional

Nem todo JSON recebido deve ser considerado confiável.

Boas práticas incluem:

  • validar tamanho do payload;

  • tratar exceções com ON EXCEPTION;

  • inicializar estruturas antes do parse;

  • rejeitar campos inesperados quando necessário;

  • proteger informações sensíveis;

  • evitar registrar senhas, tokens ou números completos de cartões em logs.

Segurança começa antes mesmo da primeira linha de lógica de negócio.


Performance — O Mito do JSON Lento

Existe quem diga que JSON é lento.

Depende.

O parser nativo do Enterprise COBOL foi otimizado para esse trabalho.

Na maioria dos casos, o gargalo não está no processamento do JSON, mas na comunicação de rede, no acesso ao banco de dados ou em integrações externas.

Um bom desenho de aplicação, buffers bem dimensionados e estruturas adequadas fazem enorme diferença.


Armadilhas Que Todo Padawan Enfrenta

  • Buffer pequeno para armazenar o JSON.

  • Campos numéricos recebendo texto.

  • Datas em formatos diferentes.

  • Arrays maiores do que o OCCURS previsto.

  • Objetos opcionais não tratados.

  • Mudanças silenciosas em contratos de API.

  • Esquecimento da conversão EBCDIC ↔ UTF-8.

  • Logs excessivos em produção.

Reconhecer essas armadilhas cedo economiza muitas madrugadas de plantão.


O Checklist do Mestre Jedi do JSON

Antes de colocar uma aplicação em produção, pergunte:

  • O JSON foi validado?

  • Há tratamento ON EXCEPTION?

  • Os buffers suportam o maior payload esperado?

  • Os campos opcionais foram considerados?

  • A codificação está correta?

  • O contrato da API está documentado?

  • Os logs preservam a privacidade dos dados?

  • O desempenho foi testado com volumes reais?

Se todas as respostas forem "sim", você está muito mais próximo de uma implantação tranquila.


☕ Easter Egg Bellacosa

Nas antigas revistas de mistério noir dos anos 1950, sempre existia um personagem discreto que parecia apenas observar a história. No final, descobria-se que ele era a peça-chave de toda a investigação.

No universo do Mainframe moderno, o JSON desempenha um papel semelhante.

Ele raramente aparece nas manchetes. Quase ninguém comenta sobre ele em reuniões executivas. Porém, é esse "mensageiro silencioso" que leva ordens, saldos, cadastros, pagamentos, consultas e confirmações entre sistemas espalhados pelo planeta.

Da próxima vez que você abrir um aplicativo bancário e visualizar um saldo em segundos, lembre-se: em algum lugar do caminho, um programa COBOL pode ter recebido um JSON, transformado aquela mensagem em estruturas internas, consultado um banco de dados e respondido antes mesmo que você terminasse de tocar a tela do celular.


Conclusão — O Verdadeiro Mistério Nunca Foi o JSON

Quando os primeiros programadores COBOL surgiram, ninguém imaginava que décadas depois seus programas conversariam com smartphones, APIs REST, aplicações em nuvem e modelos de Inteligência Artificial.

Mas a essência permaneceu exatamente a mesma.

Receber dados.

Validar.

Processar.

Garantir integridade.

Responder com segurança.

O JSON não substituiu o COBOL.

Ele apenas abriu uma nova porta.

E, como todo bom investigador das antigas histórias noir descobriria, o segredo nunca esteve na porta.

O segredo sempre esteve em compreender o que existe do outro lado.

O Programador Padawan que domina JSON PARSE, JSON GENERATE, WITH DETAIL, NAME OF, SUPPRESS, COUNT IN, CONVERTING, arrays complexos e integrações com CICS e z/OS Connect deixa de ser apenas um mantenedor de sistemas legados. Ele se torna um tradutor entre dois mundos: a robustez do IBM Z e a velocidade do ecossistema digital moderno.

Enquanto bilhões de transações continuarem atravessando o planeta todos os dias, haverá espaço para profissionais capazes de unir tradição e inovação. E talvez esse seja o maior mistério do Mainframe: a tecnologia mais antiga em produção continua encontrando novas maneiras de conversar com o futuro.

quarta-feira, 11 de maio de 2022

Muito Além da Tartaruga Espiritual: Como a Segunda Temporada Mostra que Grandes Crises Exigem Cooperação, Arquitetura e Engenharia de Sistemas

 

Bellacosa Mainframe apresenta a segunda temporada de Tate no yusha no nariagari 

☕ Um Café no Bellacosa Mainframe

Tate no Yūsha no Nariagari Season 2 (盾の勇者の成り上がり Season 2)

Muito Além da Tartaruga Espiritual: Como a Segunda Temporada Mostra que Grandes Crises Exigem Cooperação, Arquitetura e Engenharia de Sistemas

"No Mainframe, os maiores incidentes nunca são resolvidos por um único programa. Eles exigem integração, coordenação e profissionais que saibam enxergar o sistema como um todo."


Ficha Técnica

Título original: 盾の勇者の成り上がり Season 2

Título internacional: The Rising of the Shield Hero Season 2

Baseado na obra de: Aneko Yusagi

Ilustrações (Light Novel): Seira Minami

Estúdio: Kinema Citrus (coprodução de animação com Dr. Movie)

Diretor: Masato Jinbo

Composição da série: Keigo Koyanagi

Trilha sonora: Kevin Penkin

Estreia: 6 de abril de 2022

Exibição: abril a junho de 2022

Episódios: 13


Gênero

  • Isekai

  • Fantasia

  • Dark Fantasy

  • Aventura

  • Drama

  • Ação

  • Política

  • Estratégia

  • RPG


Classificação

16 anos

Contém:

  • violência

  • guerra

  • conflitos políticos

  • perdas

  • manipulação

  • sofrimento psicológico


O Studio

A segunda temporada continuou sob responsabilidade da Kinema Citrus, mas contou com forte participação da Dr. Movie, estúdio sul-coreano conhecido por colaborar em grandes produções japonesas.

Visualmente a animação continua competente.

O maior problema esteve na adaptação.


Sinopse

Após derrotar a Igreja dos Três Heróis, surge uma ameaça completamente diferente.

Uma criatura colossal chamada Tartaruga Espiritual desperta.

Ela não é simplesmente um monstro.

É praticamente uma arma viva criada para proteger o equilíbrio do mundo.

Mas alguém está manipulando seu poder.

Naofumi precisa impedir uma catástrofe que ameaça milhões de vidas.


Resumo

A temporada adapta principalmente os arcos:

  • Spirit Tortoise

  • Outro Mundo

Ao contrário da primeira temporada, aqui a narrativa deixa de focar apenas na injustiça sofrida por Naofumi.

Agora ele já é reconhecido como herói.

O desafio muda.

Ele precisa agir como comandante.


História

A enorme Tartaruga Espiritual começa a destruir cidades inteiras.

Seu objetivo aparente é absorver almas.

Posteriormente descobre-se que tudo fazia parte do plano de Kyo Ethnina, um cientista de outro mundo que utiliza energia espiritual para aumentar seu próprio poder.

Naofumi derrota a criatura.

Depois atravessa um portal dimensional.

E passa a lutar em outro mundo completamente diferente.


Os Personagens

Naofumi

Mais maduro.

Mais calmo.

Agora assume papel semelhante ao de um arquiteto de sistemas.

Coordena equipes.

Distribui tarefas.

Analisa riscos.


Raphtalia

Recebe enorme desenvolvimento.

Sua independência cresce bastante.

Mostra que não depende apenas de Naofumi para ser forte.


Filo

Continua sendo o equilíbrio emocional da equipe.

Mesmo em momentos dramáticos, representa esperança.


Rishia Ivyred

Talvez a personagem que mais evolui.

Antes insegura.

Depois extremamente determinada.

Mostra que talento sem confiança dificilmente floresce.


Kizuna Kazeyama

Heroína da Caça.

Pertence ao outro mundo.

Rapidamente cria excelente parceria com Naofumi.

Seu estilo lembra administradores experientes que entendem que colaboração gera melhores resultados.


Kyo Ethnina

O principal antagonista.

Não luta apenas por força.

Ele acredita que conhecimento sem ética justifica qualquer experimento.

É um excelente exemplo do cientista brilhante que ignora as consequências.


O que esta temporada tem de diferente?

A primeira temporada era profundamente emocional.

A segunda é muito mais técnica.

Ela apresenta:

  • novos sistemas de magia;

  • outro universo;

  • novos heróis;

  • regras completamente diferentes;

  • mecânicas inéditas.

É quase como migrar de um Data Center IBM Z para uma arquitetura distribuída em nuvem.

As regras continuam existindo.

Mas funcionam de outra forma.


As Aventuras

Durante a temporada acompanhamos:

  • combate contra a Tartaruga Espiritual;

  • investigação sobre almas absorvidas;

  • batalha contra familiares gigantes;

  • viagem dimensional;

  • prisão de Raphtalia;

  • encontro com Kizuna;

  • exploração de outro mundo;

  • evolução de novas armas;

  • confronto final contra Kyo.

Cada arco introduz novas mecânicas e amplia o universo da série.


Temáticas

A segunda temporada fala muito menos sobre preconceito.

Seu foco passa a ser:

  • responsabilidade;

  • liderança;

  • trabalho em equipe;

  • estratégia;

  • ciência sem ética;

  • consequências do poder;

  • cooperação internacional.


As Mensagens Ocultas

1. Nenhum sistema é isolado

A Tartaruga Espiritual afeta todo o mundo.

Assim como um incidente em um Data Center pode afetar milhares de empresas.


2. Conhecimento sem ética destrói

Kyo representa a inteligência usada apenas para benefício próprio.

É o equivalente ao engenheiro que ignora segurança para atingir metas.


3. Grandes problemas exigem integração

Nenhum herói derrota a crise sozinho.

Assim como em TI:

  • Desenvolvimento

  • Infraestrutura

  • Segurança

  • Banco de Dados

  • Redes

  • Operações

precisam trabalhar juntos.


4. Liderança é distribuir responsabilidades

Naofumi deixa de resolver tudo sozinho.

Ele aprende a confiar na equipe.


Analogia Bellacosa Mainframe

Imagine um banco.

O ambiente principal continua funcionando.

Mas existe outro Data Center.

Outra arquitetura.

Outro conjunto de aplicações.

Outro banco de dados.

Outro protocolo.

Quando ocorre um desastre em um ambiente, é preciso integrar sistemas completamente diferentes.

É exatamente isso que Naofumi enfrenta ao chegar ao outro mundo.

Cada ambiente possui regras próprias, mas ambos precisam permanecer sincronizados para garantir a continuidade do serviço.


O que dividiu opiniões?

Grande parte dos fãs considerou que:

  • a adaptação condensou muitos capítulos;

  • personagens receberam menos desenvolvimento;

  • o arco da Tartaruga Espiritual foi acelerado;

  • algumas motivações ficaram superficiais.

Apesar disso, a trilha sonora de Kevin Penkin, a direção de arte e os episódios finais foram amplamente elogiados.


Impacto Cultural

A segunda temporada manteve a franquia em destaque, mas recebeu avaliações mais mistas do que a primeira devido ao ritmo acelerado da adaptação. Ainda assim, expandiu o universo da obra ao introduzir um segundo mundo, novos heróis e diferentes sistemas de poder, preparando o terreno para os acontecimentos da terceira temporada e mantendo o interesse da comunidade de fãs.


Nota Bellacosa Mainframe

CritérioNota
História⭐⭐⭐⭐☆ (8,0/10)
Desenvolvimento de personagens⭐⭐⭐⭐☆ (7,8/10)
Construção do mundo⭐⭐⭐⭐⭐ (9,5/10)
Ação⭐⭐⭐⭐☆ (8,5/10)
Trilha sonora⭐⭐⭐⭐⭐ (10/10)
Ritmo⭐⭐⭐☆☆ (6,8/10)
Originalidade⭐⭐⭐⭐⭐ (9,0/10)

Veredito Bellacosa Mainframe

A segunda temporada não alcança o impacto emocional da primeira, mas amplia significativamente a escala da narrativa. Ela troca a jornada de sobrevivência por uma história sobre integração de sistemas, cooperação entre equipes e liderança em tempos de crise. Para quem trabalha com IBM Z, DevOps ou arquitetura corporativa, a maior lição é clara: resolver incidentes complexos exige visão sistêmica, colaboração e responsabilidade — qualidades muito mais valiosas do que apenas poder bruto.


terça-feira, 10 de maio de 2022

O Que Todo Programador COBOL Padawan Precisa Saber Sobre Erros de Programação, Git, Extensões de Arquivos e Inteligência Artificial para Construir Sistemas que Sobrevivem ao Tempo

 

Bellacosa Mainframe emtemdemdo erros

☕ Um Café no Bellacosa Mainframe

Muito Além da Sintaxe

O Que Todo Programador COBOL Padawan Precisa Saber Sobre Erros de Programação, Git, Extensões de Arquivos e Inteligência Artificial para Construir Sistemas que Sobrevivem ao Tempo

"Aprender uma linguagem é importante. Aprender como os computadores pensam é o que realmente transforma um programador em um engenheiro de software."

Existe uma frase muito conhecida entre desenvolvedores experientes:

"Programar não é escrever código. Programar é resolver problemas."

E, curiosamente, quanto mais experiência um profissional adquire, menos tempo ele passa escrevendo código e mais tempo ele dedica a entender erros, interpretar logs, analisar requisitos, versionar alterações, revisar código, automatizar processos e estudar novas tecnologias.

Esse é um choque para muitos iniciantes.

O Programador COBOL Padawan costuma imaginar que a carreira será composta principalmente por escrever comandos MOVE, IF, PERFORM, READ, WRITE e EXEC SQL.

Mas basta entrar em um grande banco, uma seguradora ou uma empresa aérea para descobrir uma realidade completamente diferente.

Ali existem milhares de programas.

Milhões de linhas de código.

Centenas de desenvolvedores.

Diversas linguagens convivendo lado a lado.

COBOL.

PL/I.

Assembler.

Java.

Python.

JavaScript.

Go.

Rust.

SQL.

JCL.

REXX.

E, cada vez mais, Inteligência Artificial auxiliando todas essas equipes.

Nesse ambiente, conhecer apenas a sintaxe de uma linguagem é como saber dirigir um carro sem entender placas de trânsito, mecânica ou regras de circulação.

É por isso que as cinco listas apresentadas anteriormente representam muito mais do que simples curiosidades.

Na prática, elas resumem alguns dos pilares da Engenharia de Software moderna.

Vamos conversar sobre cada um deles.

Pegue seu café.


O computador nunca faz "o que você quis"

Uma das maiores descobertas de todo programador é perceber que computadores não possuem bom senso.

Eles fazem exatamente aquilo que foi programado.

Nem mais.

Nem menos.

Se existir uma pequena falha lógica, o computador executará essa falha com perfeição matemática.

É por isso que um erro aparentemente insignificante pode movimentar milhões de reais incorretamente.

No IBM Z isso acontece diariamente.

Não porque o mainframe seja ruim.

Muito pelo contrário.

Ele é extremamente confiável.

O problema sempre foi — e sempre será — o ser humano.


Existem erros... e existem erros

Quando alguém começa a aprender programação, normalmente acredita que erro significa apenas aquela mensagem vermelha que aparece na tela.

Na realidade existem diversas categorias.

Cada uma possui causas completamente diferentes.

Cada uma exige uma forma diferente de investigação.

É exatamente isso que diferencia um programador júnior de um engenheiro de software.


Syntax Error

O primeiro erro da carreira.

O compilador simplesmente não consegue entender o que você escreveu.

Imagine escrever em português:

Eu mercado fui ontem.

As palavras existem.

Mas a estrutura está incorreta.

O compilador pensa exatamente assim.

Em COBOL:

IF SALDO > 100
DISPLAY "OK"

Faltou o END-IF.

O compilador interrompe tudo.

Nada será executado.

Esse tipo de erro normalmente é simples.

O compilador informa linha, coluna e descrição.


Runtime Error

Agora a situação muda.

O programa compilou perfeitamente.

Foi para produção.

Começou a executar.

Depois...

ABEND.

No universo Mainframe, poucos termos assustam tanto quanto esse.

Um ABEND (Abnormal End) significa que alguma condição inesperada ocorreu durante a execução.

Alguns exemplos clássicos:

S0C1

S0C4

S0C7

S0CB

S322

SB37

SE37

SD37

Cada um deles conta uma história diferente.

Por exemplo...

Dividir por zero em Python gera:

ZeroDivisionError

No COBOL, dependendo do contexto, isso normalmente resulta em um S0CB.

Já acessar memória inválida pode gerar um S0C4, um dos ABENDs mais conhecidos entre programadores COBOL.

Por isso, aprender apenas a programar não basta.

É necessário aprender a investigar.

Ler dumps.

Interpretar mensagens.

Consultar SYSOUT.

Analisar o JES.

Entender SDSF.

Essa habilidade vale ouro.


O erro mais perigoso não gera mensagem

Esse é o famoso Logical Error.

O programa funciona.

Não apresenta erro.

Não gera dump.

Não gera ABEND.

Mas calcula errado.

Imagine um banco calculando juros de 1,59% quando deveria calcular 1,95%.

O programa executa normalmente.

Nenhum operador percebe.

Nenhum monitor dispara alerta.

Somente semanas depois alguém descobre um prejuízo milionário.

Esse tipo de erro explica por que testes automatizados, revisão de código e homologação são tão importantes.


Tipos de dados existem por um motivo

Quando o COBOL foi criado, muitos acreditavam que sua enorme quantidade de definições era exagerada.

Hoje entendemos que não era.

Cada tipo de dado existe para evitar erros.

Em Python podemos escrever:

idade = "30"

Visualmente parece correto.

Mas...

idade + 5

gera erro.

Em COBOL:

PIC 9(03)

é completamente diferente de

PIC X(03)

Essa rigidez é justamente o que torna sistemas bancários tão confiáveis.


Overflow e Underflow

Imagine um campo:

PIC 999

Ele aceita apenas três dígitos.

Se alguém tentar gravar:

1000

algo precisa acontecer.

Dependendo da situação ocorrerá truncamento, exceção ou erro de execução.

Já o Underflow acontece principalmente em cálculos científicos quando números extremamente pequenos perdem precisão.

Embora seja raro em aplicações comerciais, ele é muito comum em computação de alto desempenho e modelos de Inteligência Artificial.


Arquivos são muito mais importantes do que parecem

Outro assunto frequentemente ignorado pelos iniciantes são as extensões de arquivos.

".py"

".java"

".json"

".xml"

".sql"

Muitos acreditam que isso serve apenas para organizar arquivos.

Na realidade, cada extensão representa um ecossistema inteiro.

Quando você vê um arquivo ".java", imediatamente sabe que existe uma JVM envolvida.

Ao encontrar um ".sql", entende que haverá interação com um banco de dados.

Um ".json" normalmente representa troca de informações entre sistemas.

No IBM Mainframe a situação é um pouco diferente.

Grande parte do código está armazenada em membros de PDS ou PDSE.

Não existe necessariamente uma extensão visível.

Mesmo assim, cada biblioteca possui um propósito muito bem definido.

Um membro pode conter COBOL.

Outro JCL.

Outro PROC.

Outro REXX.

Outro COPYBOOK.

Outro DCLGEN.

A organização continua existindo.

Apenas mudou de formato.


O mundo moderno conversa em JSON

Durante décadas o XML dominou integrações corporativas.

SOAP.

Web Services.

Mensagens estruturadas.

Hoje a maior parte das APIs REST utiliza JSON.

Exemplo:

{
   "cliente":"Maria",
   "saldo":3500.90
}

É simples.

Leve.

Legível.

O COBOL moderno já possui suporte para JSON PARSE e JSON GENERATE, permitindo que programas tradicionais conversem diretamente com aplicações web e microsserviços.

Isso demonstra como o ecossistema IBM Z continua evoluindo.


Git mudou a Engenharia de Software

Antigamente, equipes compartilhavam código copiando arquivos.

Imagine dez programadores alterando o mesmo programa COBOL.

Caos.

Hoje isso seria impensável.

O Git resolveu esse problema.

Na prática, o Git funciona como uma máquina do tempo.

Cada Commit registra exatamente o que mudou.

Quem mudou.

Quando mudou.

E por quê.

Se um erro aparecer meses depois, basta consultar o histórico.

Essa rastreabilidade é indispensável em ambientes regulados, como bancos e seguradoras.


Commit não é backup

Esse é um erro comum entre iniciantes.

Commit significa registrar uma alteração lógica.

Um bom commit deve representar uma unidade de trabalho.

Exemplo ruim:

Correções

Exemplo excelente:

Corrige cálculo de IOF para operações acima de R$ 50.000

Percebe a diferença?

O histórico passa a contar uma história.


Branches são universos paralelos

Imagine que a produção está funcionando.

Você precisa desenvolver uma nova funcionalidade.

Não faz sentido quebrar o código principal.

Então cria-se uma Branch.

Ali você trabalha livremente.

Quando tudo estiver pronto, ocorre o Merge.

Essa ideia revolucionou o desenvolvimento colaborativo.


Conflitos fazem parte da profissão

Todo desenvolvedor, cedo ou tarde, encontrará um Merge Conflict.

Isso acontece quando duas pessoas alteram a mesma região do mesmo arquivo.

O Git não consegue decidir automaticamente.

Então pergunta ao ser humano.

Resolver conflitos é uma habilidade importante.

Não é um sinal de incompetência.

É consequência natural do trabalho em equipe.


O Git também chegou ao Mainframe

Durante décadas o versionamento em ambientes IBM Z foi realizado por ferramentas como Endevor, Changeman, Librarian, Panvalet e SCLM.

Hoje o cenário mudou.

Zowe.

Git.

GitHub.

GitLab.

Azure DevOps.

Pipeline CI/CD.

Tudo isso já faz parte da realidade do IBM Z.

O desenvolvedor COBOL moderno trabalha tanto no ISPF quanto no VS Code.


Inteligência Artificial começa pelos dados

Quando ouvimos falar em IA, pensamos imediatamente em ChatGPT.

Mas antes de existir qualquer modelo existe algo muito mais importante.

Dados.

Sem dados não existe aprendizado.

É por isso que Machine Learning começa pelo Dataset.

Imagine ensinar uma criança a reconhecer gatos.

Você mostra milhares de fotografias.

Ela aprende padrões.

Modelos de IA fazem exatamente isso.


Features são as pistas

Suponha um sistema bancário que detecta fraude.

Cada operação possui informações como:

Valor.

Cidade.

Horário.

Dispositivo.

Cliente.

Canal.

Cada uma dessas características recebe o nome de Feature.

Quanto melhores forem as Features, melhor tende a ser o modelo.


Labels representam a resposta correta

Em aprendizado supervisionado existe um professor.

Cada exemplo já possui a resposta.

Operação fraudulenta?

Sim.

Não.

Essas respostas são chamadas de Labels.

O algoritmo tenta aprender a relação entre Features e Labels.


Treinar não é decorar

Aqui surge um dos conceitos mais importantes da IA.

Overfitting.

Imagine um aluno que decorou todas as respostas da apostila.

Na prova, qualquer pergunta diferente o confunde.

Foi exatamente isso que aconteceu com o modelo.

Ele decorou.

Não aprendeu.

No extremo oposto está o Underfitting.

O aluno nem conseguiu compreender o conteúdo.

O modelo é simples demais.

Também falha.

O objetivo sempre é encontrar o equilíbrio.


Accuracy nem sempre significa qualidade

Imagine um banco com um milhão de operações.

Apenas mil são fraudulentas.

Um algoritmo responde sempre:

Não é fraude.

Resultado:

999 mil acertos.

Accuracy de 99,9%.

Parece excelente.

Mas encontrou exatamente zero fraudes.

Por isso profissionais utilizam outras métricas.

Precision.

Recall.

F1-Score.

ROC-AUC.

Cada métrica responde uma pergunta diferente.


Redes neurais não pensam

Esse é um dos maiores equívocos atuais.

Uma Rede Neural não possui consciência.

Ela ajusta milhões ou bilhões de pesos matemáticos.

O comportamento impressionante dos grandes modelos de linguagem surge da enorme quantidade de dados, parâmetros e capacidade computacional.

Ainda assim, continuam sendo modelos estatísticos.


O futuro do COBOL não é competir com a IA

É trabalhar junto dela.

Hoje um desenvolvedor pode utilizar IA para:

  • explicar programas COBOL antigos;

  • gerar documentação técnica;

  • criar testes automatizados;

  • sugerir refatorações;

  • converter layouts de arquivos;

  • produzir exemplos em Java ou Python;

  • revisar SQL;

  • explicar ABENDs;

  • auxiliar na escrita de JCL e REXX;

  • acelerar a compreensão de sistemas legados.

A IA não substitui o conhecimento do negócio.

Ela amplia a produtividade de quem já conhece o ambiente.


O verdadeiro diferencial continua sendo o raciocínio

Ferramentas mudam.

Linguagens surgem.

Frameworks desaparecem.

Mas alguns fundamentos permanecem praticamente inalterados desde os primórdios da computação.

Entender algoritmos.

Conhecer estruturas de dados.

Interpretar erros.

Versionar corretamente.

Escrever código legível.

Documentar alterações.

Testar antes de entregar.

Compreender o domínio do negócio.

Esses princípios continuam válidos para COBOL, Java, Python, Go, Rust, JavaScript ou qualquer outra tecnologia.


O Programador COBOL Padawan e a Jornada para se Tornar um Mestre

Todo grande profissional já foi iniciante.

Ninguém nasce sabendo interpretar um S0C4, resolver um conflito de Git, entender uma métrica de Machine Learning ou projetar uma arquitetura distribuída.

Essas habilidades são construídas com estudo, prática e curiosidade.

O Programador COBOL Padawan deve enxergar cada erro como uma oportunidade de aprendizado, cada commit como um registro da sua evolução, cada extensão de arquivo como a porta de entrada para um novo ecossistema e cada conceito de Inteligência Artificial como uma ferramenta que amplia sua capacidade de resolver problemas.

No Bellacosa Mainframe, costumamos dizer que o objetivo não é formar apenas programadores que saibam escrever código. Queremos formar profissionais capazes de compreender sistemas inteiros, conversar com equipes multidisciplinares, integrar tecnologias clássicas e modernas e tomar decisões técnicas conscientes.

A jornada começa com um simples DISPLAY "HELLO WORLD".

Depois evolui para programas COBOL, JCLs, consultas SQL, integrações REST, pipelines DevOps, versionamento com Git, observabilidade, automação e, mais recentemente, Inteligência Artificial aplicada ao desenvolvimento.

O segredo nunca foi decorar comandos.

O segredo é compreender os fundamentos que atravessam gerações de tecnologias.

Quem domina esses fundamentos consegue aprender qualquer linguagem, adaptar-se a qualquer plataforma e continuar relevante mesmo quando novas ferramentas surgem.

E talvez essa seja a maior lição desta conversa: o COBOL Padawan que aprende a pensar como engenheiro de software não fica preso ao passado; ele usa a solidez do legado para construir o futuro.

Porque, no fim das contas, linguagens mudam, frameworks envelhecem, bibliotecas são substituídas e paradigmas evoluem. Mas a capacidade de analisar problemas, entender sistemas complexos e entregar soluções confiáveis continuará sendo o maior patrimônio de qualquer profissional de tecnologia.

Então, da próxima vez que encontrar uma mensagem de erro, criar uma nova branch, analisar um arquivo JSON ou ouvir falar de Machine Learning, lembre-se: você não está estudando assuntos isolados. Está construindo a base que sustentará toda a sua carreira como desenvolvedor.

E essa é uma jornada que vale cada linha de código.

segunda-feira, 9 de maio de 2022

GIT - O Que Todo Programador COBOL Padawan Precisa Saber Sobre Controle de Versão Profissional na Era da Inteligência Artificial, DevOps e IBM Mainframe

 

Bellacosa Mainframe muito alem do git commit

☕ Um Café no Bellacosa Mainframe

Git Muito Além do git commit

O Que Todo Programador COBOL Padawan Precisa Saber Sobre Controle de Versão Profissional na Era da Inteligência Artificial, DevOps e IBM Mainframe

"Existe uma enorme diferença entre saber usar comandos do Git e compreender como o Git realmente pensa. É exatamente essa diferença que separa um programador que apenas grava código de um engenheiro de software capaz de colaborar em projetos globais."


Introdução

Recentemente encontrei uma imagem bastante interessante intitulada "Top 20 Git Commands Every Developer Should Know". À primeira vista, ela parece apenas mais um resumo para consulta rápida.

Ela lista comandos como:

  • git init

  • git clone

  • git add

  • git commit

  • git push

  • git pull

e muitos outros.

Para um desenvolvedor iniciante, essa imagem parece representar praticamente todo o universo do Git.

Mas existe um detalhe importante.

Ela mostra o volante, o acelerador e o freio.

Ela não mostra o motor.

E quem trabalha com sistemas críticos — especialmente quem vem do universo IBM Mainframe — sabe que entender somente os comandos nunca foi suficiente.

No mundo do z/OS não basta decorar:

IEFBR14

É preciso entender:

  • JES2

  • Address Space

  • Dispatching

  • Storage

  • Dataset Catalog

  • VSAM

  • RACF

  • SMF

  • WLM

Da mesma forma, no Git não basta decorar comandos.

É preciso entender a arquitetura.

Hoje vamos tomar um café e mergulhar no funcionamento interno do Git.


Git não é apenas um programa

O Git é um Sistema Distribuído de Controle de Versão (Distributed Version Control System - DVCS).

Essa definição parece simples.

Mas ela muda completamente a forma como o desenvolvimento acontece.

Antes do Git existiam ferramentas como:

  • CVS

  • SourceSafe

  • SVN

Todas eram centralizadas.

Imagine um servidor.

Servidor

     Projeto

Todos os desenvolvedores dependiam dele.

Se o servidor parasse...

Ninguém trabalhava.

Se a rede caísse...

Ninguém fazia commit.


O Git mudou completamente essa arquitetura

Quando você executa:

git clone

Você não baixa apenas os arquivos.

Você baixa:

  • todos os commits

  • todas as branches

  • todas as tags

  • todo o histórico

Na prática, você cria um espelho completo do repositório.

É como se cada desenvolvedor carregasse um mini GitHub dentro do notebook.


Fazendo uma analogia com o Mainframe

Imagine um enorme PDS onde vivem todos os programas COBOL.

Agora imagine que cada desenvolvedor possui uma cópia completa daquele PDS, incluindo todas as versões desde a criação do sistema.

É exatamente isso que o Git faz.

Só que muito melhor.


A pasta mais importante do projeto

Quando executamos:

git init

Algo aparentemente simples acontece.

É criada uma pasta escondida.

.git

Muitos iniciantes ignoram essa pasta.

Grande erro.

É nela que mora todo o Git.

Se ela desaparecer...

O histórico desaparece.

Os commits desaparecem.

As branches desaparecem.

As tags desaparecem.

O projeto volta a ser apenas uma pasta comum.


O que existe dentro da pasta .git?

Normalmente encontramos algo parecido com isto:

.git

objects

refs

HEAD

config

hooks

logs

index

packed-refs

Cada item possui uma função específica.


objects

É o verdadeiro banco de dados do Git.

Tudo fica aqui.

Arquivos.

Commits.

Branches.

Trees.

Tags.

Tudo.


refs

São os ponteiros.

Eles dizem onde cada branch está.


HEAD

É o famoso ponteiro atual.

Sempre indica onde você está trabalhando.


config

Contém toda configuração local.

Usuário.

Email.

Remotos.

Aliases.


hooks

Automação.

Podemos executar scripts antes de:

  • commit

  • push

  • merge

Muito usado em DevOps.


O Git não salva diferenças

Essa talvez seja a maior surpresa para quem começa.

Muitos acreditam que o Git grava apenas as linhas modificadas.

Não.

Ele trabalha principalmente com snapshots.

Imagine um diretório.

Projeto

Programa1.cbl

Programa2.cbl

JCL1.jcl

README.md

Quando fazemos:

git commit

O Git registra um retrato completo daquele momento.

Como uma fotografia.

Não apenas um patch.

Isso torna a recuperação extremamente eficiente.


Os quatro tipos de objetos do Git

O banco interno do Git possui apenas quatro tipos fundamentais.

Blob

Representa o conteúdo de um arquivo.

Não conhece nomes.

Não conhece diretórios.

Conhece apenas bytes.


Tree

Organiza os blobs.

Funciona como um diretório.


Commit

Liga uma árvore ao histórico.

Contém:

  • autor

  • data

  • mensagem

  • commit anterior


Tag

Marca um commit especial.

Normalmente versões:

v1.0

v2.0

Release-2026

SHA: a identidade única de tudo

Cada objeto recebe um hash.

Exemplo:

c83f92b15c4...

Esse hash é calculado sobre o conteúdo.

Se um único byte mudar...

Todo o hash muda.

Essa característica garante integridade.


Os três estados dos arquivos

Esse é provavelmente o conceito mais importante do Git.

Todo arquivo percorre três etapas.

Working Directory

↓

Staging Area

↓

Repository

Working Directory

É onde editamos.

Abrimos o COBOL.

Mudamos um SELECT.

Alteramos um PERFORM.

Ainda não existe histórico.


Staging Area

É uma área intermediária.

O comando:

git add

Não grava nada.

Ele apenas prepara.

É como colocar documentos sobre a mesa antes de arquivá-los.


Repository

Somente quando executamos:

git commit

O histórico realmente nasce.


Git Status

Se existisse apenas um comando obrigatório seria:

git status

Ele responde perguntas como:

  • O que mudou?

  • O que será enviado?

  • O que ainda não entrou no commit?

Executar esse comando diversas vezes ao longo do dia é uma excelente prática.


Git Add

Existe uma diferença enorme entre:

git add arquivo.cbl

e

git add .

O primeiro adiciona apenas um arquivo.

O segundo adiciona praticamente tudo.

Isso inclui arquivos temporários.

Logs.

Arquivos de configuração.

Até senhas esquecidas.

Daí nasce a importância do:

.gitignore

Git Ignore

Imagine esquecer dentro do projeto:

senha.txt

backup.zip

log.txt

database.db

Sem o .gitignore, tudo isso pode ir para o repositório.

Alguns vazamentos famosos de credenciais ocorreram exatamente por causa disso.


Commits são sua documentação

Existe um velho hábito ruim.

Update

Outro.

Correções

Outro.

Mudanças

Meses depois...

Ninguém sabe o que foi alterado.

Uma boa mensagem explica a intenção.

Por exemplo:

Valida CPF antes da gravação no DB2

ou

Corrige cálculo do IOF para operações acima de R$ 50.000

Muito mais útil.


Branches: linhas paralelas de desenvolvimento

Imagine um banco.

Enquanto uma equipe trabalha no PIX...

Outra trabalha no Open Finance.

Outra corrige produção.

Tudo ao mesmo tempo.

Isso só é possível porque existem branches.

main

├── feature-pix

├── feature-openfinance

└── hotfix

Cada equipe trabalha isoladamente.


Merge

Quando uma funcionalidade termina:

feature-pix

ela precisa voltar para:

main

É aqui que entra o:

git merge

Ele une dois históricos.


Conflitos

Imagine dois desenvolvedores alterando a mesma linha.

Um escreve:

MOVE ZERO TO WS-TOTAL.

Outro escreve:

MOVE WS-VALOR TO WS-TOTAL.

Quem está certo?

O Git não decide.

Ele apresenta:

<<<<<<<
=======
>>>>>>>

E cabe ao desenvolvedor resolver.


Fetch versus Pull

Muitos iniciantes acreditam que são iguais.

Não são.

git fetch

Baixa novidades.

Mas não altera seu trabalho.

Já:

git pull

Baixa e integra imediatamente.

É praticamente:

fetch

+

merge

Em projetos críticos, muitos profissionais preferem primeiro:

git fetch

Analisar.

Depois integrar.


Push

Sem ele ninguém verá seu trabalho.

git push

Envia seus commits ao servidor.

É a promoção do desenvolvimento local para o repositório compartilhado.


Git Diff

Antes de qualquer commit execute:

git diff

Você verá exatamente:

-

+

Tudo que será enviado.

Isso evita inúmeros erros.


Git Stash

Imagine este cenário.

Você está desenvolvendo uma API.

Surge uma emergência em produção.

Você ainda não pode fazer commit.

O que fazer?

git stash

Ele guarda temporariamente tudo.

Depois:

git stash pop

Seu trabalho retorna exatamente como estava.


Git Reset

Esse comando merece respeito.

Especialmente:

git reset --hard

Ele pode apagar alterações locais sem possibilidade simples de recuperação.

Não é um comando para testar.

É um comando para compreender profundamente antes de usar.


O verdadeiro poder das branches

No Git, uma branch é extremamente leve.

Ela não copia o projeto.

Ela cria apenas um ponteiro.

Por isso podemos criar dezenas ou centenas delas.


O Git e o DevOps

Hoje praticamente toda pipeline utiliza Git.

Por exemplo:

Commit

↓

GitHub

↓

GitHub Actions

↓

Build

↓

Testes

↓

Deploy

↓

Produção

Sem Git praticamente não existe DevOps moderno.


GitHub não é Git

Outro erro muito comum.

Git é uma tecnologia.

GitHub é um serviço.

Também existem:

  • GitLab

  • Bitbucket

  • Azure DevOps

  • Gitea

  • Forgejo

Todos utilizam Git.


Git e Inteligência Artificial

Ferramentas como:

  • GitHub Copilot

  • ChatGPT

  • Claude

  • Gemini

podem escrever código.

Mas todas dependem de algo extremamente importante.

Histórico.

Contexto.

Versionamento.

Quando uma IA gera uma alteração, ela precisa ser rastreável.

Quem alterou?

Quando?

Por quê?

Qual problema resolveu?

Git responde todas essas perguntas.


Git no universo IBM Mainframe

Durante muitos anos o desenvolvimento Mainframe utilizou ferramentas como:

  • Endevor

  • Changeman

  • Librarian

  • Panvalet

Hoje muitas empresas estão integrando esses ambientes ao Git.

Isso permite:

  • CI/CD

  • Pull Requests

  • Code Review

  • Integração com Jenkins

  • GitHub Actions

  • Azure DevOps

  • IBM Dependency Based Build (DBB)

  • Zowe CLI

  • VS Code

  • OpenShift

  • Ansible

O código COBOL continua executando no IBM Z, mas o ciclo de desenvolvimento passa a seguir práticas modernas de engenharia de software.


Git para um COBOL Padawan

Se você está iniciando na programação COBOL, encare o Git como uma habilidade tão importante quanto aprender:

  • IF

  • PERFORM

  • EVALUATE

  • READ

  • WRITE

  • EXEC SQL

  • CICS LINK

Hoje um profissional que domina apenas a linguagem perde competitividade.

As empresas procuram desenvolvedores que também entendam de colaboração, automação, revisão de código e integração contínua.


Boas práticas para o dia a dia

Algumas recomendações fazem enorme diferença:

  • Faça commits pequenos e frequentes.

  • Cada commit deve representar uma única alteração lógica.

  • Escreva mensagens claras e objetivas.

  • Nunca desenvolva diretamente na branch main.

  • Revise as mudanças com git diff antes de cada commit.

  • Consulte git status constantemente.

  • Configure um .gitignore adequado ao seu projeto.

  • Prefira git fetch quando quiser analisar alterações antes de integrá-las.

  • Evite git reset --hard sem compreender totalmente suas consequências.

  • Utilize Pull Requests para revisão de código e compartilhamento de conhecimento.


Conclusão

O Git é muito mais do que uma coleção de comandos. Ele representa uma mudança de paradigma na forma como construímos software, promovendo colaboração, rastreabilidade e segurança. Para o programador COBOL Padawan, dominar essa ferramenta significa conectar décadas de experiência em sistemas corporativos às práticas modernas de DevOps, integração contínua e desenvolvimento assistido por Inteligência Artificial.

Assim como aprender JCL vai muito além de decorar //JOB e //EXEC, aprender Git vai muito além de executar git add, git commit e git push. O verdadeiro diferencial está em compreender sua arquitetura interna, seus objetos, seus fluxos de trabalho e a filosofia que sustenta um dos projetos de software mais influentes da história.

No universo Bellacosa Mainframe, o Git não substitui a disciplina que sempre caracterizou o desenvolvimento em IBM Z — ele a amplia. Ele oferece mecanismos para preservar conhecimento, facilitar auditorias, permitir revisões estruturadas e integrar aplicações legadas a pipelines modernas de entrega contínua. Em uma era em que a Inteligência Artificial acelera a escrita de código, o Git continua sendo a memória confiável do projeto, registrando cada decisão técnica e garantindo que a evolução do software seja transparente, reproduzível e segura.

O conselho final para todo COBOL Padawan é simples: não estude apenas os comandos. Estude os conceitos. Entenda como o Git pensa. Quando isso acontecer, você deixará de ser apenas um usuário da ferramenta e passará a utilizá-la como um verdadeiro engenheiro de software, preparado para atuar tanto em aplicações modernas quanto nos ambientes críticos que movimentam bancos, seguradoras, governos e grandes corporações ao redor do mundo. Afinal, tecnologias mudam, linguagens evoluem, mas a capacidade de controlar, compreender e colaborar sobre o código continuará sendo uma das competências mais valiosas da engenharia de software.

domingo, 8 de maio de 2022

Os Erros Invisíveis que Destroem um Projeto Antes Mesmo da Primeira Linha de Código

Bellacosa Mainframe e os erros invisivei que destroem um projeto



☕ Um Café no Bellacosa Mainframe

Os Erros Invisíveis que Destroem um Projeto Antes Mesmo da Primeira Linha de Código

"Arquitetura não é desenhar caixas e setas. É antecipar problemas que ainda não aconteceram."

Uma arquitetura pode parecer perfeita em um PowerPoint.

Microservices...
Docker...
Kubernetes...
Event Streaming...
Kafka...
REST...
GraphQL...
Cloud Native...

Tudo muito bonito.

Até o primeiro milhão de usuários.

Até o primeiro pico de Black Friday.

Até o primeiro deadlock.

Até a primeira perda de dados.

É nesse momento que aparecem os erros invisíveis.


1. Ignorar Consistência dos Dados

O erro

Muitos iniciantes acreditam que:

"Eventual Consistency resolve tudo."

Não resolve.

Consistência é uma decisão de negócio.

Não tecnológica.


Exemplo bancário

Imagine uma transferência.

Conta A
Saldo = 1000

↓

Transferir 900

↓

Conta B

Se um serviço atualizar a Conta A...

...e outro atualizar a Conta B alguns segundos depois...

Durante esses segundos:

Conta A = 100

Conta B = 0

O dinheiro "sumiu".

Ou pior...

Uma nova consulta pode permitir outra transferência.

Resultado:

Saldo negativo.


Quando Eventual Consistency funciona

Excelente para:

  • Feed do Instagram

  • Likes

  • Comentários

  • Catálogo de produtos

  • Estatísticas

Alguns segundos de atraso não importam.


Quando NÃO funciona

Nunca utilize em:

  • PIX

  • Bancos

  • Bolsa de Valores

  • Controle de Estoque

  • Reserva de assentos

  • Sistemas médicos

Nestes casos:

Strong Consistency

é obrigatória.


Mainframe

DB2 usa:

  • Commit

  • Rollback

  • Locking

  • Isolation Levels

Há décadas.

Muito antes da moda dos bancos NoSQL.


2. Não Definir Limites do Sistema

Este talvez seja o maior erro.

Imagine uma empresa.

Quem faz RH?

Quem faz Financeiro?

Quem faz Compras?

Agora imagine todos fazendo tudo.

É exatamente isso que acontece em sistemas mal divididos.


Sintoma

Um módulo chamado:

CustomerService

faz:

  • login

  • pagamento

  • envio de email

  • cadastro

  • estoque

  • geração de nota

  • relatórios

Virou um monólito.


Consequência

Qualquer alteração:

quebra tudo.


Boa arquitetura

Cada domínio possui responsabilidade única.

Order Service

Inventory

Billing

Notification

Shipping

Cada um evolui sozinho.


Conceito

Domain Driven Design

Bounded Context

Single Responsibility

Todos nascem desse princípio.


3. Ignorar Latência

Usuários não medem CPU.

Eles medem tempo.


Exemplo

Pesquisa Google

300 ms

Parece instantânea.

Agora imagine:

4 segundos.

Você já fechou a página.


Latência acumulada

Cliente

API Gateway

Auth

Inventory

Recommendation

Payment

Shipping

DB

Cada chamada adiciona:

20 ms

40 ms

80 ms

100 ms

...

No final:

1 segundo

Sem perceber.


Lei importante

Uma arquitetura com 20 microsserviços pode ser MAIS LENTA que um monólito.


Mainframe

Por isso CICS sempre priorizou:

  • poucas chamadas

  • processamento local

  • transações curtas


4. Subestimar a Carga

Outro erro clássico.

O sistema funciona perfeitamente...

...com 50 usuários.

Mas na Black Friday:

200 mil usuários

Tudo trava.


Perguntas importantes

Quantos usuários?

Quantas requisições?

Picos?

Sazonalidade?

Crescimento anual?


Capacidade

Sempre calcule:

Requests/second

Transactions/minute

IOPS

CPU

RAM

Storage

Network

Exemplo

Sistema:

1000 req/s

Promoção:

15000 req/s

Resultado:

Timeout.

Fila.

Erro 500.


5. Fazer Tudo Sincronamente

Imagine um e-commerce.

Cliente compra.

Sistema:

processa pagamento

envia email

gera nota

atualiza estoque

gera cashback

envia SMS

atualiza BI

Tudo esperando.

O usuário fica olhando.


Melhor abordagem

Pagamento

Resposta imediata

Eventos

Email

Nota

BI

Analytics

Machine Learning

Tudo assíncrono.


Tecnologias

Kafka

RabbitMQ

IBM MQ

SQS

Azure Service Bus

Pulsar


Benefícios

Escalabilidade

Baixa latência

Maior throughput

Resiliência


6. Não Planejar Evolução

Todo sistema muda.

Sempre.


Hoje:

Pix

Amanhã:

Pix Parcelado

Depois:

Pix Internacional

Depois:

IA financeira

Se sua arquitetura não suporta mudança...

Ela morre.


Arquitetura deve ser extensível

Open/Closed Principle

Plug-ins

Feature Flags

Configuration Driven

Interfaces

Strategy Pattern


7. Criar Pontos Únicos de Falha (Single Point of Failure)

Imagine:

1 servidor

↓

Banco

↓

Toda empresa

Servidor cai.

Empresa para.


Alta disponibilidade

Sempre pense em:

Load Balancer

Cluster

Replica

Failover

Geo-redundância

Backup


Mainframe

Sysplex

Parallel Sysplex

GDPS

foram criados exatamente para isso.


8. APIs Mal Projetadas

API é um contrato.

Contrato ruim gera caos.


Exemplo ruim

GET /data

Retorna:

qualquer coisa...

Exemplo melhor

GET /customers/{id}

Resposta consistente.

Documentada.

Versionada.


API deve possuir

Versionamento

Idempotência

Paginação

Rate Limit

Autenticação

Observabilidade

Documentação


9. Ignorar Backup e Recuperação

A pergunta não é:

"Meu sistema vai falhar?"

A pergunta correta é:

"Quando ele vai falhar?"


Recovery é parte da arquitetura

Backup

Snapshot

Point-in-Time Recovery

Replication

Disaster Recovery

Multi Region

Chaos Engineering


Conceitos fundamentais

RPO (Recovery Point Objective)

Quanto de dados você pode perder?

0 minutos

5 minutos

1 hora

RTO (Recovery Time Objective)

Quanto tempo o sistema pode ficar indisponível?

30 segundos

5 minutos

2 horas

Essas metas orientam a escolha da estratégia de backup e recuperação.


Um Décimo Erro que Poucos Mencionam: Falta de Observabilidade

Mesmo uma boa arquitetura pode fracassar se você não consegue enxergar o que acontece em produção.

Os três pilares da observabilidade são:

  • Logs: registram eventos e erros.

  • Métricas: mostram CPU, memória, latência, throughput e disponibilidade.

  • Traces distribuídos: acompanham uma requisição passando por vários serviços.

Ferramentas como Prometheus, Grafana, OpenTelemetry, Jaeger e Elastic Stack ajudam a identificar gargalos antes que eles se transformem em incidentes graves.


Um Décimo Primeiro Erro: Esquecer a Segurança Desde o Início

Segurança não deve ser um complemento adicionado ao final do projeto.

Uma arquitetura moderna precisa considerar desde o início:

  • Princípio do menor privilégio (Least Privilege)

  • Autenticação e autorização robustas

  • Criptografia em trânsito (TLS) e em repouso

  • Gestão de segredos

  • Auditoria e rastreabilidade

  • Proteção contra ataques como SQL Injection, XSS e CSRF

  • Rate limiting e proteção contra abuso

No ecossistema IBM Z, RACF, TLS, criptografia por hardware e auditoria integrada são exemplos de recursos que incorporam esses princípios há décadas.


O Que Todo Programador COBOL Padawan Deve Aprender

Uma lição importante é que System Design não é exclusivo de microsserviços ou da nuvem. Os princípios fundamentais são universais:

  • Modelar corretamente o domínio do negócio.

  • Entender os requisitos funcionais e não funcionais.

  • Projetar para disponibilidade, escalabilidade e recuperação.

  • Definir responsabilidades claras entre componentes.

  • Reduzir acoplamento e aumentar coesão.

  • Tratar desempenho, segurança e observabilidade como requisitos de primeira classe.

Os grandes sistemas corporativos escritos em COBOL, CICS, IMS e DB2 continuam processando bilhões de transações diariamente porque foram construídos com esses princípios. A tecnologia evolui, mas os fundamentos da boa arquitetura permanecem os mesmos. Um arquiteto experiente não é aquele que conhece mais ferramentas, e sim aquele que consegue prever os problemas antes que eles aconteçam e projetar sistemas preparados para enfrentá-los.


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