Translate

Mostrar mensagens com a etiqueta Boas Práticas. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Boas Práticas. Mostrar todas as mensagens

sábado, 13 de junho de 2026

Guard Rails, COBOL, Mainframe, Engenharia de Software, Desenvolvimento COBOL, Sistemas Críticos, Confiabilidade, Governança de TI, DevOps, Arquitetura de Software, Batch Processing, Segurança da Informação, SRE, Boas Práticas, Tecnologia Bancária

 

Bellacosa Mainframe e o guard rails em desenvolvimento de software

Guard Rails: A Arte de Impedir que um Desenvolvedor Derrube o Banco

Uma conversa que todo desenvolvedor COBOL deveria ter

Imagine a seguinte situação.

Você acabou de entrar em uma instituição financeira.

É seu terceiro mês como desenvolvedor COBOL.

Depois de semanas corrigindo pequenos bugs, finalmente recebe uma tarefa importante.

Uma rotina responsável pelo envio de notificações para clientes.

O gerente explica:

— Precisamos incluir um novo tipo de comunicação.

Você faz a alteração.

Compila.

Executa os testes.

Tudo parece funcionar.

A mudança é promovida para produção.

Horas depois, milhares de clientes recebem uma mensagem errada.

O call center entra em colapso.

O aplicativo registra picos de acesso.

O time de negócios inicia uma reunião de emergência.

A diretoria quer explicações.

E então surge a pergunta:

Como isso foi possível?

A resposta geralmente não é:

"Porque o desenvolvedor errou."

A resposta correta costuma ser:

"Porque o sistema permitiu que um erro chegasse à produção."

É exatamente nesse ponto que surge um dos conceitos mais importantes da engenharia moderna:

Guard Rails.


O que são Guard Rails?

A tradução literal seria:

"trilhos de proteção".

A inspiração vem das rodovias.

Quando um carro sai da pista, existe uma barreira metálica para impedir que ele caia de um penhasco.

O guard rail não evita o erro do motorista.

Ele reduz as consequências.

Na engenharia de software acontece exatamente a mesma coisa.

Os desenvolvedores inevitavelmente cometerão erros.

Os analistas inevitavelmente esquecerão requisitos.

Os operadores inevitavelmente clicarão em algo errado.

Os administradores inevitavelmente executarão comandos incorretos.

O objetivo não é eliminar o erro humano.

O objetivo é impedir que o erro se transforme em desastre.


O erro é inevitável

Desenvolvedores juniores costumam acreditar que sistemas caem porque alguém não sabia programar.

Essa visão desaparece rapidamente em ambientes corporativos.

Os maiores incidentes da história da tecnologia não foram causados por programadores incompetentes.

Foram causados por profissionais experientes trabalhando sob pressão.

Pessoas excelentes.

Pessoas inteligentes.

Pessoas treinadas.

Pessoas humanas.

A questão nunca foi:

"Quem errou?"

A questão sempre foi:

"Por que o sistema permitiu?"

Essa diferença muda completamente a forma de construir software.


Um exemplo COBOL simples

Considere um programa que realiza transferência bancária.

Versão sem Guard Rails:

IF SALDO-CONTA > 0
   SUBTRACT VALOR FROM SALDO-CONTA
END-IF.

Parece correto.

Mas existe um problema.

Suponha:

Saldo = 100

Transferência = 1000

O programa permitirá saldo negativo.

Agora uma versão mais segura.

IF VALOR > SALDO-CONTA
   DISPLAY "TRANSFERENCIA NEGADA"
   GO TO FIM-PROGRAMA
END-IF.

O sistema agora protege o negócio.

Isso é um Guard Rail.


Guard Rail não é regra de negócio

Esse é um erro comum.

Muitos desenvolvedores confundem os dois conceitos.

Regra de negócio:

"O cliente não pode sacar mais que possui."

Guard Rail:

"Mesmo que alguém esqueça a regra, o sistema impedirá a operação."

Uma regra define comportamento.

Um Guard Rail protege comportamento.


A filosofia do mainframe

Durante décadas, os ambientes mainframe desenvolveram uma cultura diferente do mundo moderno.

Em startups existe uma frase famosa:

Move fast.

Nos bancos existe outra:

Don't break production.

A razão é simples.

Um erro em rede social gera reclamações.

Um erro bancário gera prejuízo.

Por isso o mundo COBOL sempre valorizou:

  • validação;

  • redundância;

  • auditoria;

  • segregação;

  • rastreabilidade.

Sem perceber, os ambientes mainframe implementavam Guard Rails muito antes do conceito ganhar popularidade.


O caso clássico do JCL

Todo profissional de mainframe já ouviu histórias de horror envolvendo JCL.

Imagine um dataset:

CLIENTES.PRODUCAO

Agora imagine um utilitário de exclusão.

DELETE CLIENTES.PRODUCAO

Um comando simples.

Um erro simples.

Um desastre gigantesco.

Por isso empresas maduras criam Guard Rails.

Por exemplo:

  • confirmação obrigatória;

  • aprovação dupla;

  • ambiente segregado;

  • backup automático.

A exclusão continua possível.

Mas torna-se muito mais difícil.


O princípio do “Are You Sure?”

Existe uma categoria inteira de Guard Rails baseada em confirmação.

Exemplo.

Você tenta apagar um arquivo.

O sistema pergunta:

"Tem certeza?"

Parece algo trivial.

Mas essa simples pergunta já evitou milhões de erros ao longo da história da computação.

Em sistemas financeiros essa ideia evolui.

Em vez de uma confirmação:

  • duas confirmações;

  • dois operadores;

  • dois gestores;

  • duas aprovações.

Chamamos isso de Four Eyes Principle.

Princípio dos quatro olhos.


Guard Rails em processamento batch

O universo COBOL vive cercado de batches.

Folha de pagamento.

Compensação bancária.

Fechamento contábil.

Liquidação financeira.

Imagine um programa que processa:

10.000 registros

Normal.

Agora imagine:

100 milhões de registros

Algo está errado.

Sem Guard Rails o programa continua.

Com Guard Rails ele interrompe:

IF QTDE-REGISTROS > LIMITE-MAXIMO
   DISPLAY "PROCESSAMENTO ANORMAL"
   ABEND
END-IF.

Esse simples teste pode evitar horas de caos operacional.


O conceito de Fail Fast

Existe um princípio muito importante:

Fail Fast.

Falhe rapidamente.

Muitos sistemas tentam continuar funcionando mesmo após identificar inconsistências.

Isso parece inteligente.

Na prática costuma piorar tudo.

Se um dado crítico estiver errado, o melhor comportamento é parar imediatamente.

Exemplo:

IF CODIGO-CLIENTE = SPACES
   ABEND
END-IF.

Parar cedo é melhor do que produzir milhões de registros incorretos.


Guard Rails contra desenvolvedores

Esse é um tema que incomoda iniciantes.

Ninguém gosta de ouvir:

"O sistema precisa proteger a empresa de você."

Mas essa é a realidade.

Um Guard Rail existe justamente porque até profissionais excelentes erram.

Imagine um comando SQL.

Sem proteção:

DELETE FROM CLIENTES;

Com proteção:

DELETE FROM CLIENTES
WHERE ID = :CLIENTE;

Ou ainda melhor.

Permissão somente leitura em produção.

O desenvolvedor continua competente.

O ambiente apenas se torna mais seguro.


O incidente do Nubank e os Guard Rails

O caso do falso aviso de liquidação tornou-se um exemplo interessante.

Independentemente dos detalhes internos, uma pergunta surgiu:

Como uma comunicação tão crítica chegou aos clientes?

A resposta provavelmente envolve ausência ou falha de Guard Rails.

Por exemplo:

  • validação insuficiente;

  • aprovação inadequada;

  • rollout inexistente;

  • testes incompletos.

Nenhum sistema deveria conseguir informar a liquidação de um banco sem múltiplas camadas de proteção.


Rollout gradual

Imagine um envio para:

50 milhões de clientes

Sem Guard Rail:

envio imediato.

Com Guard Rail:

1% da base.

Validação.

5%.

Validação.

10%.

Validação.

100%.

Empresas como Google, Amazon e Netflix utilizam esse modelo constantemente.

O objetivo é reduzir o raio da explosão.


Blast Radius

Todo arquiteto experiente faz uma pergunta.

Se isso falhar, quantas pessoas serão afetadas?

Chamamos isso de Blast Radius.

Raio de explosão.

Exemplo.

Erro em um batch:

Impacto:

500 clientes.

Blast Radius pequeno.

Erro em compensação nacional:

Impacto:

50 milhões de clientes.

Blast Radius enorme.

Guard Rails existem para reduzir esse raio.


Observabilidade também é Guard Rail

Muitos desenvolvedores acreditam que Guard Rails são apenas validações.

Não.

Monitoramento também é proteção.

Imagine:

Processamento esperado:

1000 transações por minuto

Sistema detecta:

500.000 transações por minuto

Algo claramente está errado.

Um bom sistema dispara alarmes.

Isso também é Guard Rail.


O conceito de Circuit Breaker

Em sistemas distribuídos modernos existe outro Guard Rail famoso.

Circuit Breaker.

Inspirado nos disjuntores elétricos.

Se uma dependência começa a falhar:

o sistema corta a conexão.

Em vez de derrubar tudo.

No mundo mainframe encontramos equivalentes há décadas:

  • limites operacionais;

  • interrupções controladas;

  • filas protegidas;

  • rejeições automáticas.

A ideia é a mesma.

Conter danos.


O erro mais caro é o silencioso

Existe uma frase conhecida entre engenheiros de confiabilidade:

Sistemas barulhentos são irritantes.

Sistemas silenciosamente errados são perigosos.

Um programa que falha imediatamente chama atenção.

Um programa que produz dados incorretos durante três dias pode gerar prejuízos gigantescos.

Por isso Guard Rails modernos privilegiam transparência.

Tudo deve ser:

  • registrado;

  • monitorado;

  • auditado;

  • rastreável.


A maturidade profissional

Existe um momento na carreira em que o desenvolvedor deixa de pensar:

"Meu código funciona."

E começa a pensar:

"O que acontece quando ele falhar?"

Essa mudança separa programadores iniciantes de engenheiros experientes.

O foco deixa de ser funcionalidade.

Passa a ser confiabilidade.


O que um desenvolvedor COBOL Jr deve fazer

Sempre pergunte:

O que pode dar errado?

Quem será impactado?

Existe limite operacional?

Existe validação?

Existe rollback?

Existe auditoria?

Existe monitoramento?

Existe aprovação?

Existe segregação?

Existe plano de contingência?

Se alguma resposta for "não sei", continue investigando.


A grande lição

Guard Rails não existem porque desenvolvedores são ruins.

Eles existem porque sistemas são complexos.

Quanto maior a empresa, mais perigoso se torna assumir que ninguém cometerá erros.

O verdadeiro papel da engenharia não é criar sistemas perfeitos.

É criar sistemas resilientes.

Sistemas que sobrevivam a erros humanos.

Sistemas que sobrevivam a falhas operacionais.

Sistemas que sobrevivam a decisões equivocadas.

No universo bancário, onde bilhões de reais transitam diariamente por programas COBOL escritos ao longo de décadas, essa diferença não é apenas uma questão técnica.

É uma questão de sobrevivência operacional.

E talvez a principal lição para qualquer desenvolvedor COBOL Jr seja esta:

Seu trabalho não é apenas fazer o programa funcionar.

Seu trabalho é impedir que ele cause danos quando inevitavelmente algo der errado.

Esse é o verdadeiro significado de Guard Rails.


domingo, 16 de fevereiro de 2014

💣🔥 GUIA PRÁTICO — DO TERMINAL À PRODUÇÃO: O OPERADOR QUE DOMINA ISPF, TSO, JCL E JES2 NÃO PEDE AJUDA… ELE RESOLVE 🔥💣

Bellacosa Mainframe em um laboratorio pratico TSO ISPF JCL e JES2 

💣🔥 GUIA PRÁTICO — DO TERMINAL À PRODUÇÃO: O OPERADOR QUE DOMINA ISPF, TSO, JCL E JES2 NÃO PEDE AJUDA… ELE RESOLVE 🔥💣

Se você quer sair do “sei mexer” e entrar no nível “sei operar sob pressão”, este é o seu campo de treinamento.

Aqui não tem teoria solta.

👉 Aqui é lab, erro real, diagnóstico e correção — estilo produção.


🧭 VISÃO DO TREINAMENTO

Você vai simular o ciclo completo:

  1. Navegação e produtividade no ISPF
  2. Manipulação de datasets via TSO
  3. Construção e execução de JCL
  4. Debugging real no JES2

Tudo rodando no ecossistema do z/OS com spool via JES2.


🔬 LAB 1 — ISPF NA VELOCIDADE DE PRODUÇÃO

🎯 Objetivo

Eliminar lentidão operacional.

🧪 Exercício

  1. Acesse:
=3.4
  1. Liste datasets com filtro:
SEU.USERID.*
  1. Use comandos de linha:
  • V → visualizar
  • E → editar
  • B → browse

⚡ Desafio Bellacosa

Sem usar mouse mental:

  • encontre um dataset específico em < 10 segundos
  • navegue entre 3 membros sem perder contexto

💡 Insight

Você não está navegando.

👉 Você está executando operações cognitivas.


🔬 LAB 2 — TSO: CONTROLE DE DADOS

🎯 Objetivo

Dominar datasets sem depender de tela.

🧪 Exercício

🔹 Criar dataset

ALLOC DSN('SEU.USERID.TESTE') NEW SPACE(1,1) TRACKS DIR(5) RECFM(F,B) LRECL(80)

🔹 Listar propriedades

LISTDS 'SEU.USERID.TESTE' ALL

🔹 Deletar

DELETE 'SEU.USERID.TESTE'

⚠️ Erro proposital

Tente alocar sem parâmetros corretos.

👉 Veja o erro
👉 Use HELP ALLOC
👉 Corrija


💡 Insight

TSO não é comando.

👉 É infraestrutura sob demanda


🔬 LAB 3 — JCL: O JOB QUE ORQUESTRA TUDO

🎯 Objetivo

Executar um job funcional.

🧪 Exercício

Crie um membro:

//BELLALAB JOB (ACCT),'TESTE',CLASS=A,MSGCLASS=X
//STEP1 EXEC PGM=IEFBR14
//DD1 DD DSN=SEU.USERID.ARQ.TESTE,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),
// DCB=(RECFM=FB,LRECL=80)

▶️ Submeter

SUBMIT

🔍 Verificar saída no JES2

  • SDSF → ST
  • veja status
  • abra output

💡 Insight

IEFBR14 não faz nada…

👉 mas prova que seu JCL faz tudo certo


🔬 LAB 4 — DEBUGGING REAL (O LAB MAIS IMPORTANTE)

🎯 Objetivo

Aprender a errar… e corrigir rápido.


🧪 Cenário com erro

//STEP1 EXEC PGM=IEFBR14
//DD1 DD DSN=SEU.USERID.ARQ.TESTE,
// DISP=(NEW,CATLG),
// SPACE=(TRK,(1,1))

👉 Falta parâmetro no DISP.


🔥 Tarefa

  1. Submeta o job
  2. Vá no JES2
  3. Abra:
    • JESMSGLG
    • JESJCL
    • JESYSMSG

🧠 Diagnóstico esperado

  • mensagem de erro de alocação
  • falha no catálogo
  • possível RC ≠ 0

🛠️ Correção

Corrigir para:

DISP=(NEW,CATLG,DELETE)

💡 Insight crítico

Quem lê log… domina o sistema
Quem ignora log… vira incidente


🔬 LAB 5 — ANÁLISE PROFISSIONAL DE JOB

🎯 Objetivo

Interpretar execução como operador sênior.


🧪 Checklist

Após execução:

  • RC = 0?
  • dataset foi criado?
  • houve warning?
  • alocação correta?

🧠 Leitura obrigatória

No spool:

  • JESMSGLG → sistema
  • JESJCL → o que foi interpretado
  • JESYSMSG → execução real

💣 Desafio Bellacosa

Pegue um job com erro e responda:

  • Onde falhou?
  • Por quê?
  • Qual impacto?
  • Como evitar?

🧬 LAB EXTRA — SIMULANDO VIDA REAL

🎯 Cenário

Você recebe:

“Job falhou em produção. Corrigir urgente.”


🔥 Procedimento

  1. Identificar job no JES2
  2. Analisar RC
  3. Ler logs
  4. Identificar dataset envolvido
  5. Corrigir JCL ou dado
  6. Reprocessar

💡 Isso é ouro:

👉 velocidade + precisão = operador de elite


🚀 EVOLUÇÃO (PRÓXIMO NÍVEL)

Depois disso, você deve avançar para:

  • Integração com CICS
  • Acesso a DB2
  • Automação com REXX
  • Monitoramento com SDSF avançado

⚠️ ERROS QUE VOCÊ NÃO PODE MAIS COMETER

  • rodar job sem ler output
  • ignorar RC
  • editar dataset em produção sem critério
  • confiar que “deu certo”

💣 FRASE FINAL

“No mainframe, erro não é exceção…
erro é ferramenta de aprendizado — desde que você saiba ler o sistema.”

quarta-feira, 28 de fevereiro de 2007

O que é a Cláusula END nos Comandos COBOL?

 

Bellacosa Mainframe e a clausula END no COBOL

O que é a Cláusula END nos Comandos COBOL?

A cláusula END foi introduzida nas versões modernas do COBOL para indicar explicitamente o fim de um comando ou estrutura lógica.

Ela torna os programas:

✅ Mais legíveis

✅ Mais seguros

✅ Mais fáceis de manter

✅ Menos sujeitos a erros de aninhamento


Antes do END

Nas versões antigas do COBOL era comum encontrar:

IF SALDO > 0

   DISPLAY 'SALDO POSITIVO'

ELSE

   DISPLAY 'SALDO NEGATIVO'.

Em estruturas complexas, ficava difícil saber onde terminava cada comando.


Com END

IF SALDO > 0

   DISPLAY 'SALDO POSITIVO'

ELSE

   DISPLAY 'SALDO NEGATIVO'

END-IF.

Agora o término fica explícito.


Por que a IBM criou os ENDs?

Imagine:

IF A = 1

   IF B = 2

      IF C = 3

         DISPLAY 'OK'

      ELSE

         DISPLAY 'ERRO'

Pergunta:

O ELSE pertence a qual IF?

Nem sempre é fácil responder.


Com ENDs:

IF A = 1

   IF B = 2

      IF C = 3

         DISPLAY 'OK'

      ELSE

         DISPLAY 'ERRO'

      END-IF

   END-IF

END-IF.

Não existe dúvida.


Principais Comandos com END


END-IF

Finaliza IF.

IF WS-SALDO > 0

   DISPLAY 'OK'

END-IF.

END-PERFORM

Finaliza PERFORM inline.

PERFORM

   DISPLAY 'PROCESSANDO'

END-PERFORM.

END-READ

Finaliza READ.

READ ARQCLI

   AT END

      MOVE 'S' TO FIM-ARQ

END-READ.

END-WRITE

Finaliza WRITE.

WRITE REG-SAIDA

END-WRITE.

END-REWRITE

Finaliza REWRITE.

REWRITE REG-CLIENTE

END-REWRITE.

END-DELETE

Finaliza DELETE.

DELETE ARQCLI

END-DELETE.

END-SEARCH

Finaliza SEARCH.

SEARCH TAB-CLIENTES

   WHEN CODIGO = 100

      DISPLAY 'ACHOU'

END-SEARCH.

END-EVALUATE

Finaliza EVALUATE.

EVALUATE TRUE

   WHEN SALDO > 0

      DISPLAY 'POSITIVO'

   WHEN OTHER

      DISPLAY 'ZERO'

END-EVALUATE.

END-STRING

Finaliza STRING.

STRING

   NOME
   SOBRENOME

   INTO WS-NOME

END-STRING.

END-UNSTRING

Finaliza UNSTRING.

UNSTRING WS-DADOS

   DELIMITED BY ';'

   INTO CAMPO1
        CAMPO2

END-UNSTRING.

END-COMPUTE

Finaliza COMPUTE.

COMPUTE WS-TOTAL = A + B

END-COMPUTE.

END-CALL

Finaliza CALL.

CALL 'CALCULA'

   USING WS-VALOR

END-CALL.

END-START

Finaliza START.

START ARQVSAM

   KEY >= WS-CHAVE

END-START.

END-ACCEPT

Finaliza ACCEPT.

ACCEPT WS-DATA

END-ACCEPT.

END-DISPLAY

Finaliza DISPLAY.

DISPLAY 'TESTE'

END-DISPLAY.

END-ADD

Finaliza ADD.

ADD 10 TO WS-TOTAL

END-ADD.

END-SUBTRACT

Finaliza SUBTRACT.

SUBTRACT 5 FROM WS-TOTAL

END-SUBTRACT.

END-MULTIPLY

Finaliza MULTIPLY.

MULTIPLY A BY B

END-MULTIPLY.

END-DIVIDE

Finaliza DIVIDE.

DIVIDE A INTO B

END-DIVIDE.

END-JSON

Usado em COBOL moderno.

JSON GENERATE WS-JSON

   FROM CLIENTE

END-JSON.

END-XML

Também muito comum.

XML GENERATE WS-XML

   FROM CLIENTE

END-XML.

END-EXEC

Muito utilizado em DB2 e CICS.


DB2

EXEC SQL

   SELECT NOME

   INTO :WS-NOME

   FROM CLIENTES

END-EXEC.

CICS

EXEC CICS

   SEND MAP('TELA1')

END-EXEC.

END-EXEC é Especial

Porque:

EXEC SQL

e

EXEC CICS

não são comandos COBOL puros.

São pré-processados antes da compilação.


Exemplo Completo

IF WS-SALDO > 0

   PERFORM

      DISPLAY 'SALDO POSITIVO'

   END-PERFORM

ELSE

   DISPLAY 'SEM SALDO'

END-IF.

Benefícios

✅ Legibilidade

✅ Menos erros

✅ Melhor manutenção

✅ Facilita debug

✅ Facilita revisões de código


Padrão Corporativo

Hoje a maioria das empresas exige:

END-IF
END-PERFORM
END-EVALUATE
END-READ
END-EXEC

mesmo quando opcionais.


Erros Comuns

Esquecer END-IF

IF A = 1

   DISPLAY 'OK'

Pode gerar erro de compilação.


Misturar ENDs

IF A = 1

   PERFORM

      DISPLAY 'OK'

END-IF

Compilador detecta inconsistência.


Curiosidade

Nas décadas de 1970 e 1980 muitos programas COBOL eram escritos sem ENDs, utilizando apenas pontos finais (.) para encerrar blocos. Em aplicações modernas, os ENDs são considerados uma das melhores práticas de programação COBOL.


Resumo Rápido

ComandoTerminador
IFEND-IF
PERFORMEND-PERFORM
READEND-READ
EVALUATEEND-EVALUATE
SEARCHEND-SEARCH
STRINGEND-STRING
UNSTRINGEND-UNSTRING
CALLEND-CALL
JSONEND-JSON
XMLEND-XML
EXEC SQLEND-EXEC
EXEC CICSEND-EXEC

Conclusão

A cláusula END em COBOL serve para indicar explicitamente o término de comandos e blocos lógicos. Ela melhora a legibilidade, reduz ambiguidades, facilita a manutenção e é considerada uma prática obrigatória em praticamente todos os projetos COBOL modernos, especialmente em ambientes IBM Z, CICS, IMS, DB2, XML e JSON.


segunda-feira, 26 de fevereiro de 2007

O que é o comando GOBACK em COBOL?

 

Bellacosa Mainframe e o comando Goback em Cobol

O que é o comando GOBACK em COBOL?

O comando GOBACK é utilizado para encerrar a execução de um programa ou retornar o controle para o programa chamador.

Ele é considerado uma das instruções mais importantes do COBOL moderno e, em muitos ambientes, substitui o uso de STOP RUN.


Definição Simples

O GOBACK significa:

Volte para quem me chamou

ou, se não existir programa chamador:

Termine a execução

Sintaxe

GOBACK.

Exemplo Simples

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.

PROCEDURE DIVISION.

DISPLAY 'OLA MUNDO'.

GOBACK.

Resultado:

OLA MUNDO

Programa finalizado.


Como Funciona?

O comportamento depende da forma como o programa foi executado.


Programa Principal

Executado por JCL:

//STEP1 EXEC PGM=PROG1

Fluxo:

JCL
 ↓
PROG1
 ↓
GOBACK
 ↓
Fim da execução

Subprograma

Programa principal:

CALL 'SUBROT1'.

Subprograma:

DISPLAY 'ENTREI'.

GOBACK.

Fluxo:

MAIN
 ↓
CALL SUBROT1
 ↓
GOBACK
 ↓
MAIN continua

Exemplo Completo

Programa Principal:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

PROCEDURE DIVISION.

DISPLAY 'ANTES'.

CALL 'SUB1'.

DISPLAY 'DEPOIS'.

GOBACK.

Subprograma:

IDENTIFICATION DIVISION.
PROGRAM-ID. SUB1.

PROCEDURE DIVISION.

DISPLAY 'SUBPROGRAMA'.

GOBACK.

Saída:

ANTES
SUBPROGRAMA
DEPOIS

GOBACK x STOP RUN

Essa é a comparação mais importante.

GOBACKSTOP RUN
Retorna ao chamadorFinaliza tudo
Seguro para subprogramasPerigoso em subprogramas
Recomendado atualmenteUso tradicional
Funciona em programas chamadosEncerra toda aplicação

Exemplo Visual

GOBACK

MAIN
 ↓
SUB1
 ↓
GOBACK
 ↓
MAIN continua

STOP RUN

MAIN
 ↓
SUB1
 ↓
STOP RUN
 ↓
Tudo termina

Uso em Batch

Muito comum.

OPEN INPUT ARQCLI

PERFORM PROCESSA

CLOSE ARQCLI

GOBACK.

Uso em Subprogramas

É a principal recomendação.

CALL 'CALCULO'

CALL 'VALIDA'

GOBACK.

Uso em Programas DB2

Também é amplamente utilizado.

IF SQLCODE NOT = 0

   DISPLAY SQLCODE

   GOBACK

END-IF.

GOBACK e Return Code

Pode ser combinado com:

MOVE 8 TO RETURN-CODE.

GOBACK.

Resultado:

CC=0008

GOBACK e Language Environment

No ambiente LE (Language Environment), o GOBACK é tratado de forma inteligente.

Se existir chamador:

Retorna ao chamador

Se não existir:

Finaliza execução

EXIT PROGRAM x GOBACK

Outro comando relacionado.


EXIT PROGRAM

EXIT PROGRAM.

Retorna apenas ao chamador.


GOBACK

GOBACK.

Retorna ao chamador ou termina a aplicação.


Comparação

ComandoFunção
EXIT PROGRAMRetorna ao chamador
GOBACKRetorna ou termina
STOP RUNFinaliza tudo

Exemplo com EXIT PROGRAM

IDENTIFICATION DIVISION.
PROGRAM-ID. SUB1.

PROCEDURE DIVISION.

DISPLAY 'SUB'.

EXIT PROGRAM.

Boas Práticas

✅ Utilize GOBACK em subprogramas

✅ Utilize GOBACK em programas novos

✅ Defina RETURN-CODE quando necessário

✅ Evite STOP RUN em módulos chamados

✅ Padronize o encerramento dos programas


Erros Comuns

STOP RUN em subprograma

CALL 'SUB1'

SUB1:

STOP RUN.

Resultado:

Aplicação inteira termina

Não retornar código

GOBACK.

Sem:

MOVE 8 TO RETURN-CODE

Pode dificultar automação.


Curiosidades

1. O GOBACK foi introduzido para simplificar o retorno de programas chamados

2. É amplamente recomendado pela IBM para novos desenvolvimentos

3. Funciona perfeitamente com Language Environment (LE)

4. É um dos comandos mais encontrados em aplicações COBOL modernas

5. Em muitos padrões corporativos, STOP RUN é proibido em subprogramas


Resumo Rápido

ConceitoFunção
GOBACKRetorna ao chamador ou termina
STOP RUNFinaliza toda aplicação
EXIT PROGRAMRetorna ao chamador
CALLChama subprograma
RETURN-CODECódigo retorno
LELanguage Environment
BatchUso comum
SubprogramaComando recomendado

Conclusão

O GOBACK é o comando de encerramento mais flexível do COBOL moderno. Ele permite que um subprograma retorne ao programa chamador sem interromper toda a aplicação e, quando executado em um programa principal, encerra normalmente a execução. Por isso, é considerado a melhor prática para o desenvolvimento COBOL em ambientes z/OS, CICS, IMS e DB2.