domingo, 12 de julho de 2015

Bits, Bytes e Padrões



Resultado de imagem para bits e bytes que mundo é esseJá falei outras vezes sobre padrões e processos. É um assunto até meio cansativo, mas esses dias tive uma conversa na nossa Fábrica de Software que representa bem a importância do tema no mundo de TI.  Acho até que num curso sobre melhores práticas que ministrei há algum tempo tratamos desse assunto específico.

O assunto era a chamada de sub-rotinas dentro de um programa Cobol. Hipoteticamente, temos um programa XXXP0001 que chama a sub-rotina XXXS999.

Quando chegava um programador novo, geralmente passava-se a seguinte orientação:
- Olha, para chamar o subprograma você deve codificar:
Na Working Storage:
XXXS9999 PIC X(8) VALUE “XXXS9999”.
E na Procedure Division:  
CALL XXXS9999 USING “Variáveis”.
- Uai (geralmente os programadores novos eram mineiros)! Disseram-me que era pra chamar direto, entre aspas (CALL ”XXXS9999” USING “Variáveis”)! E funcionou!
Ou ainda:
- Bah (alguns eram gaúchos)! Eu tenho que chamar vários programas! Porque preciso declarar a variável XXXS9999? É melhor criar uma variável genérica, tipo GDA- SUBROTINA! Funciona, fica mais claro e eu posso reusar a guarda!
Nesse caso, o código na Procedure Division ficaria assim:
MOVE “XXXS9999” TO GDA-SUBROTINA.
CALL GDA-SUBROTINA USING “Variáveis”.
MOVE “XXXS8888” TO GDA-SUBROTINA.
CALL GDA-SUBROTINA USING “Variáveis”.
A resposta, nos dois casos, geralmente dada por quem não tinha ido atrás dos porquês, era sempre a mesma:
- Olha, esse é o padrão do pessoal da Governança de TI. Esses caras de processo vivem inventando moda! É melhor fazer como eles querem e ficar quieto.
Assim, as coisas funcionavam, os caras da MDS (metodologia de desenvolvimento de sistemas) eram os chatos e a vida seguia.
Mas não era bem assim. O padrão estava certo. Aliás, perfeito. A única falha dos “chatos da MDS” era não ter comunicado adequadamente qual o motivo do bendito padrão.
Vamos tentar clarear um pouco:
No caso do mineirim, ao dar o CALL na sub-rotina entre aspas, estamos passando ao processo de compilação (na realidade, de linkedição) a informação de que a chamada é estática, e não dinâmica.
Portanto, o executável resultante do processo de compilação e linkedição do programa XXXP0001 teria incorporado também o XXXS999. Funciona? Sim, funciona, inclusive até mais rápido.
No entanto, no momento em que versionássemos a sub-rotina XXXS9999, apareceria um dos seguintes problemas:

  • Se a XXXS9999 tivesse instruções SQL, o programa XXXP0001 abendaria com o famoso SQLCODE -805 (acho que já falei sobre isso no post “Desmistificando o Bind”), no momento de acessar o banco de dados DB2, por divergência no timestamp do Cobol X999 com o do package de mesmo nome;

  • Se fosse uma sub-rotina em Cobol puro (sem SQL), o problema seria ainda maior. O P0001 continuaria rodando, mas chamando a versão anterior da S9999, embutida no seu executável.

Portanto, ao declarar a variável, o CALL passa a ser dinâmico, com o P0001 chamando a X9999 em tempo de execução, sempre em sua versão mais recente.
Bem, já o caso do gaúcho é um pouco mais sutil, e mesmo “programalistas” experientes não sabem bem o porquê do padrão ser o nome da variável com o mesmo da sub-rotina.
A palavra-chave aqui é rastreabilidade.  Existem ferramentas (na minha empresa temos o X-REF, dentre outras) que buscam a cadeia de chamadas dos módulos. Isso é bastante útil para sabermos qual o impacto de uma alteração em um programa chamado por vários outros.
Essas ferramentas são bem interessantes, mas algumas delas (na realidade quase todas) trabalham por varredura no código-fonte, e não seriam capazes de detectar que o programa P0001 chama o S9999 no “CALL GDA-SUBROTINA”, como ocorre no “CALL XXXS9999”. Na realidade, usamos de um artifício para “enganar” o X-REF, pois ele acha que estamos chamando diretamente o XXXS9999, quando estamos mesmo é chamando uma variável de mesmo nome. Como o seu conteúdo é exatamente o mesmo (ver o VALUE no início do texto), o resultado é a chamada rastreada corretamente.
Bom, o objetivo dessa sopa de bits e bytes era apenas reforçar a importância dos padrões e da comunicação no nosso trabalho.
Um abraço e até a próxima!