Como aprendemos a programar? Programando. 

Iniciar o processo de desenvolvimento de software pode ser desafiador, uma vez que um código nunca é construído de forma linear, desde a primeira até a última linha do arquivo, mas sim de maneira iterativa, como um laço de repetição. Sob a perspectiva do código, quando abordamos um problema, sua proposta de resolução expande sua complexidade de dentro para fora e vice-versa, com injeções de dependências, inversões de controle, novos métodos, funções, novas classes para responsabilidades não mapeadas etc. 

Aqui proponho explorar algumas estratégias de desenvolvimento de software para que você possa criar seu próprio método de aprender a programar programando.

Devemos, no entanto, reconhecer que as peculiaridades de cada sistema são reflexo das escolhas de design, implementações particulares, restrições ou mesmo falhas específicas. Essa é a principal razão pela qual devemos permanecer receptivos a alterações e oportunidades que proporcionem vantagens a médio e longo prazo.

Lambda Régua de Comunicação

O projeto explorado neste texto é um Lambda AWS que realiza a integração da comunicação entre as Plataformas Baixa e Alta1, sendo acionado por meio de um conector Lambda Sink conectado a um tópico KaaS. As cargas úteis dessas mensagens consistem em strings com conteúdo posicional.

Depois de implementar o parser de posicional para o formato estruturado (JSON) das mensagens e encaminhá-las para um SQS, durante os testes preliminares de operação e integração com a API que processa a fila de saída, identificou-se a necessidade de desenvolver um script capaz de gerar cargas úteis válidas para todos os templates que integram a Régua de Comunicação. O termo "Régua de Comunicação" refere-se, neste contexto, ao conjunto de mensagens de e-mail parametrizadas que são enviadas ao cliente conforme evolui seu processo de contratação de serviços, desde o recebimento de uma proposta até a conclusão da contratação. A cada etapa concluída pelo cliente ou pelo processamento interno do fluxo de contratação, um e-mail é disparado para comunicar tal progresso.

Gerador de Templates

É imprescindível discutir a estrutura de dados que administra esses templates de e-mail. A abordagem inicial, que se provou eficaz, envolveu a criação de uma estrutura em JSON que pudesse representar os variados conjuntos de templates e seus respectivos parâmetros. É importante mencionar que diferentes templates podem compartilhar o mesmo conjunto de parâmetros.

Originalmente, este arquivo foi gerado com a ajuda de planilhas e editores de texto para formatar sua saída. No entanto, essa solução revelou-se ineficiente devido às modificações necessárias que surgiram já nos primeiros testes. Inicialmente, presumiu-se que o mapeamento posicional para a análise (parsing) da string de entrada estava correto. No entanto, durante o processamento, ficou evidente que estávamos enganados. Devido à natureza posicional dos dados, a correta sequência de análise da string é essencial para assegurar o sucesso do processamento. A falha em reconhecer e corrigir a ordem inadequada foi a principal causa dos erros encontrados nas mensagens iniciais que recebemos.

Isso ressaltou outra necessidade urgente, que pela experiência adquirida, deve ser implementada imediatamente: a integração de um sistema de logs com testes unitários.

Sistema de Logs & Testes Unitários

O Desenvolvimento Guiado por Testes (TDD) vai além de um conjunto de princípios ou uma filosofia abstrata; é uma mentalidade acessível a todos. Este é um tópico já bastante consolidado no campo do desenvolvimento de software, contudo, é vital ressaltar sua relevância e funcionalidade nos processos de debug e correção de falhas. Ao ver o sistema de logs e testes unitários como um valioso aliado, é esperado que você o incorpore desde as primeiras linhas do seu código. 

Testes unitários e sistema de logs integrado à aplicação atuam como importantes aliados dos desenvolvedores. São como um conjunto de semáforos, controladores de tráfego e indicadores variados. Estes sistemas oferecem benefícios significativos tanto para desenvolvedores quanto para usuários.

Image
Ilustração representando o trânsito de logs em um sistema, com elementos como semáforos, placas de sinalização, carros estilizados e fluxos de dados conectados a monitores, simbolizando a gestão, processamento e integração de informações de logs.
Sinergia entre testes unitários e sistema de logs integrado: essenciais para a engenharia de software, atuam como semáforos e controladores no fluxo de desenvolvimento, garantindo eficiência e segurança tanto para desenvolvedores quanto para usuários.

Para garantir a eficiência e a qualidade do desenvolvimento, é vital começar testando pelo menos o 'caminho feliz' ao implementar uma nova regra de negócio. Essa abordagem é uma etapa fundamental, mas apenas o começo. Conforme o código se desenvolve, você inevitavelmente encontrará exceções e falhas. É essencial identificar e incorporar esses casos nos testes o quanto antes. Isso permitirá que você ajuste sua abordagem para tratar e resolver esses problemas de maneira eficaz. Assim, a segurança e a robustez do seu código evoluem em conjunto com o progresso da sua solução.

Refinando o Gerador de Templates

A evolução do sistema indicou que a gestão manual deste componente vital do sistema poderia levar a uma variedade de problemas, mais notavelmente em relação à sua confiabilidade, principalmente devido à introdução de novos templates e às subsequentes alterações no número e na ordem dos parâmetros a serem processados em cada tipo de mensagem. Por essa razão, em conjunto com o código do sistema, foi elaborado um script capaz de ler um arquivo CSV e convertê-lo em um JSON, segundo a estrutura de dados utilizada no dicionário de templates.

Um aspecto marcante neste projeto foi a maneira como essa ferramenta, o gerador de dicionário de templates, conseguiu contribuir para o avanço e a resiliência desse sistema de software.

Revisitando o Início (deste texto) 

Isso nos conduz aos pormenores do gerador de payloads, a segunda ferramenta concebida para suportar a evolução do sistema.

O Lambda em foco foi desenvolvido para administrar as mensagens de dois sistemas legados. O primeiro gerencia 23 tipos de mensagens estruturadas em 6 subconjuntos de templates. O segundo sistema legado, 81 tipos de mensagens, agrupadas em mais de 30 subconjuntos.

Esta ferramenta é capaz de gerar payloads válidos para testes de cada template constante no dicionário, possibilitando a criação de conteúdos para todos os templates de cada um dos sistemas que interagem com o Lambda, ou limitando sua geração a uma lista predeterminada, o que oferece considerável flexibilidade em sua aplicação.

Isso nos permite independência do sistema legado na geração de massa de testes, já que a conexão entre as plataformas Baixa e Alta (ou legado e Cloud) e o contrato da API foram validados nas versões iniciais da aplicação. O gerador de payloads não apenas favorece o desenvolvimento dessa peça de software, responsável pela transição de modelo entre os sistemas legado e a Cloud AWS, mas também influencia significativamente a API subsequente. Essa API, após enriquecer os payloads recebidos do AWS Lambda, os disponibiliza para o sistema responsável por enviar e-mail aos clientes.

Palavras Finais (até parece…)

A abordagem circular no desenvolvimento de software é tanto iterativa quanto adaptativa. Ela permite que o profissional de TI enfrente com eficácia os desafios dinâmicos da programação, ou seja, adaptar-se rapidamente à novas tecnologias, resolver problemas complexos de maneira criativa e eficiente, e desenvolver soluções inovadoras, garantindo que o sistema evolua de forma contínua e sustentável. Essa metodologia não só facilita a adaptação às mudanças e a incorporação de melhorias, mas também capacita o desenvolvedor a criar soluções mais robustas e flexíveis. Ao abraçar esta abordagem, o profissional se torna mais apto a responder prontamente às demandas em constante evolução do mercado de tecnologia, mantendo a qualidade e a relevância de seu trabalho em um cenário de inovações tecnológicas rápidas e imprevisíveis.

O desenvolvimento de ferramentas específica, como o gerenciador de templates e o gerador de payloads, tiveram um papel preponderante na qualidade desse projeto. Por exemplo, o gerenciador de templates evoluiu de um processo manual para uma solução automatizada, melhorando a eficiência e a precisão no gerenciamento de dados. O gerador de payloads é notável pela sua capacidade de criar dados de teste robustos para serem aplicados nos diversos ambientes de desenvolvimento.

A importância dessas ferramentas vai além da mera funcionalidade; elas representam a essência do desenvolvimento de software moderno, onde a adaptabilidade e a eficiência são fundamentais. O investimento em tais ferramentas não apenas otimiza o processo de desenvolvimento, mas também garante uma base sólida para o crescimento futuro do sistema. Assim, ao integrar e valorizar essas soluções no ciclo de vida do desenvolvimento de software, asseguramos não apenas a solidez do presente, mas também a viabilidade e a expansão contínua do sistema no futuro.

1 "Plataforma Baixa" e "Plataforma Alta" refletem o nível de abstração fornecido pelos sistemas e linguagens de programação. Mainframes (plataforma baixa) oferecem um controle mais direto sobre o hardware, mas geralmente com maior complexidade de programação, daí o termo "escovar bits". Por outro lado, ambientes de Cloud Computing (plataforma alta) proporcionam maior abstração, simplificando o desenvolvimento de software, mas oferecem menos controle direto sobre o hardware.

Tags