| Bellacosa Mainframe e 10 padroes secretos de arrays |
☕💥 Os 10 Padrões Secretos de Arrays em COBOL Mainframe
Ou como descobrir que você já usava algoritmos de entrevistas do LeetCode muito antes deles virarem moda
Introdução
Existe uma curiosidade engraçada no mundo da programação.
Um desenvolvedor Java estuda LeetCode.
Um desenvolvedor Python assiste vídeos sobre algoritmos.
Um engenheiro C++ compra livros de Competitive Programming.
Enquanto isso...
Um programador COBOL de banco com vinte anos de experiência está processando 300 milhões de registros no Batch Noturno utilizando exatamente os mesmos algoritmos...
Mas chama tudo de:
"andar na tabela"
"fazer acumulado"
"pesquisa binária"
"comparar dois índices"
"janela de análise"
E provavelmente faz isso tomando café às 3 da manhã olhando um SDSF.
A verdade é que muitos dos algoritmos mais famosos ensinados atualmente em universidades e plataformas de entrevistas já existem no universo COBOL há décadas.
OCCURS.
INDEXED BY.
SEARCH.
SEARCH ALL.
SET UP.
SET DOWN.
ASCENDING KEY.
Tabelas auxiliares.
Acumuladores.
Áreas de trabalho.
Tudo isso forma um verdadeiro arsenal de algoritmos.
E hoje vamos conhecer os 10 padrões clássicos de Arrays, explicados para um Padawan COBOL.
Padrão 1 — Two Pointers
Os Dois Jedi da Tabela
É provavelmente o algoritmo mais antigo do mundo corporativo.
A ideia é simples.
Utilizamos dois ponteiros.
Um na esquerda.
Outro na direita.
Ou ambos andando em velocidades diferentes.
Exemplo
Verificar se uma tabela é simétrica.
01 TAB.
05 ITEM OCCURS 100 TIMES
INDEXED BY IDX1 IDX2.
77 MAX PIC 999 VALUE 100.
SET IDX1 TO 1
SET IDX2 TO MAX
PERFORM UNTIL IDX1 >= IDX2
IF ITEM(IDX1) NOT = ITEM(IDX2)
DISPLAY 'NAO SIMETRICO'
END-IF
SET IDX1 UP BY 1
SET IDX2 DOWN BY 1
END-PERFORM
Onde aparece?
Remover duplicidade
Palíndromo
Conciliação bancária
Arquivos ordenados
Merge VSAM
Join Batch
Complexidade
O(n)
Padrão 2 — Sliding Window
A Janela Deslizante
Esse algoritmo parece sofisticado.
Mas todo programador financeiro já utilizou.
Exemplo
Últimos 30 dias.
Tabela
10
20
15
40
50
Janela
3
Primeira
10 20 15
Soma
45
Move.
20 15 40
75
Move.
15 40 50
105
COBOL
ADD ENTRADA(I)
TO SOMA
SUBTRACT ENTRADA(I-3)
FROM SOMA
Muito usado em:
Detecção fraude
PIX
Cartão crédito
Médias móveis
SMF
Complexidade
O(n)
Padrão 3 — Prefix Sum
O Acumulador Supremo
Padawan.
Você provavelmente já usou.
Só não sabia o nome.
Exemplo.
Tabela.
5 3 2 4 1
Prefix.
5
8
10
14
15
Consultar.
Posição.
2 até 5.
15 - 5
10
COBOL
ADD VALOR(I)
TO ACUM(I-1)
GIVING ACUM(I)
Utilização.
Analytics
DW
RMF
SMF
Cobrança
Padrão 4 — Kadane
O Santo Graal das Séries
Maior sequência positiva.
Exemplo.
-2
1
-3
4
-1
2
1
Resultado.
6
COBOL
IF SOMA < ZERO
MOVE ZERO TO SOMA
END-IF
Aplicações.
Lucro máximo
Oscilações
Bolsa
PIX
Cartões
Complexidade.
O(n)
Padrão 5 — Merge Intervals
Fundindo Períodos
Muito usado.
Principalmente bancos.
Exemplo.
Cliente bloqueado.
01-05
03-10
12-20
Resultado.
01-10
12-20
COBOL
Comparar.
Datas.
Mesclar.
Usado.
Seguros
RH
Férias
Janelas batch
Padrão 6 — Cyclic Sort
A Ordem Cósmica
Pouco conhecido.
Mas genial.
Exemplo.
3 1 2
Cada número.
Vai para posição.
Correta.
Resultado.
1 2 3
Muito útil.
Detectar.
Ausentes.
Duplicados.
Padrão 7 — Hashing
O Cache Jedi
Python
Dict
Java
HashMap
COBOL
Tabela OCCURS
Exemplo.
Estados.
SP
RJ
MG
Pesquisar.
Instantaneamente.
Alternativa.
SEARCH ALL
Exemplo.
Tabela IR.
Códigos.
CEP.
Produtos.
Padrão 8 — Binary Search
SEARCH ALL
A arma secreta do COBOL.
Tabela ordenada.
SEARCH ALL CLIENTE
Complexidade.
O(log n)
1000000 registros.
Comparações.
20
Magia matemática.
Muito superior.
SEARCH.
SEARCH.
500 mil leituras.
SEARCH ALL.
Padrão 9 — Monotonic Stack
O Mestre Esquecido
Pouco usado.
Mas poderoso.
Encontrar.
Próximo maior.
Próximo menor.
Exemplo.
Temperaturas.
30
31
28
35
Pergunta.
Quando esquenta?
Em COBOL.
Pode ser implementado.
Com tabela OCCURS.
Muito usado.
Forecast.
Analytics.
IA.
Padrão 10 — Two Heaps
O Conselho Jedi
Min Heap.
Max Heap.
Encontrar.
Top 10.
Maior.
Menor.
Mediana.
Em COBOL.
Mais raro.
Mas possível.
Exemplo.
Ranking clientes.
SEARCH versus SEARCH ALL
Padawan.
Essa é importante.
SEARCH
Linear.
O(n)
SEARCH ALL
O(log n)
1000000 registros.
SEARCH.
500000 leituras.
SEARCH ALL.
INDEX versus Subscript
Subscript.
CLIENTE(I)
Índice.
INDEXED BY IDX
Mais rápido.
Menos cálculos.
Melhor cache.
SSRANGE
O Guardião das Tabelas
Sempre.
DEV.
TESTE.
QA.
Nunca acessar.
CLIENTE(1001)
Se existem.
SSRANGE salva vidas.
Quando usar DB2
Tabela enorme.
Não use OCCURS.
Quando usar OCCURS
Lookup.
UF.
IR.
CEP.
Parâmetros.
Cache.
Arquitetura Moderna
Hoje.
Programadores resolvem LeetCode.
Veteranos Mainframe.
Já faziam isso.
Em 1982.
Usando.
COBOL
VSAM
JCL
DFSORT
ICETOOL
DB2
Curiosidade Histórica
Década de 70.
IBM chamava isso.
Table Processing
Década de 80.
Performance Tuning.
Década de 90.
Binary Search.
Virou padrão.
Grandes bancos.
Década de 2000.
Java descobriu.
Collections.
Década de 2020.
LeetCode descobriu.
Década de 2030.
IA vai descobrir.
Que um programador COBOL aposentado em Campinas ou Itatiba já utilizava Prefix Sum desde 1989.
Easter Egg Bellacosa
Existe uma antiga profecia dos Sysprogs.
Ela diz:
"Chegará um dia em que um desenvolvedor júnior perguntará ao arquiteto qual algoritmo usar."
O arquiteto responderá:
Use Sliding Window.
O desenvolvedor pesquisará durante três horas.
Assistirá quatro vídeos.
Lerá cinco artigos.
Abrirá o ChatGPT.
Fará benchmarking.
Criará um POC.
E finalmente implementará.
Enquanto isso, um programador COBOL veterano sentado ao lado apenas dirá:
Ah...
Você queria uma média móvel.
Faço isso desde 1993.
Está no PROGFINC.
Linha 287.
Não mexe.
Funciona.
E agora pega um café.
Porque no Reino do Mainframe, muitas vezes os algoritmos mais modernos apenas receberam nomes mais bonitos para técnicas que os Cavaleiros COBOL já dominavam há décadas.