Sobre Chefes, Algoritmos e Pérolas

Num blog antigo comentei sobre estilos de arquitetura e, em particular, sobre o estilo barroco, onde o excesso é uma virtude. Isto também é real para algoritmos.

Uma vez fui chamado pelo presidente da empresa em que trabalhava para otimizar o tempo de processamento de uma análise financeira. O produto dava ao usuário uma espécie de planilha, como o Excel, em que várias fórmulas do usuário eram interpretadas, chamando queries do banco de dados, potencialmente, a cada fórmula. Com isto em mãos, os usuários podiam construir o planejamento do custo financeiro de seus projetos com dados reais de um ERP e valores futuros de moedas, juros, etc. Nesta ocasião alguns clientes reclamavam que o cálculo estava levando mais de uma hora e o pedido era simples: diminuir este tempo.

Como arquiteto, já estava com idéias de uso de cachê, queries feitas em batch e outras otimizações comuns neste cenário, quando dei início à engenharia reversa no código.

O código não estava ruim de todo. Engenharia reversa feita, comecei a planejar as mudanças quando o bom senso me fez rodar um profile antes de começar as modificações.

Com o relatório na mão, algo me assustou: a maior parte do tempo de execução estava numa única função: a concatenação de strings, uma função feita em casa.

Curioso, abri o código da função e o que eu vi foi algo interessante. Era uma função que chamava a si mesmo, recursivamente, em pelo menos em 3 ocasiões. Levei algum tempo analisando se havia algum truque. Por que não, simplesmente, criar um array com o tamanho da soma dos dois strings para depois copiá-los?

Desistindo de entender o porquê, criei a função correta e testei com uma planilha real. Resultado: cerca de 4 minutos para algo que antes levava 1 hora.

Com o resultado na mão fui ao presidente da empresa e anunciei o bom resultado. Quando me perguntou o que havia de errado, mostrei a ele a listagem da função e anunciei: o culpado era esta “pérola do barroco”!

Lembro que ele riu, mas um pouco sem graça. Desconfiado, fui investigar e descobri que ele tinha sido o autor desta pérola!

Moral 1) Pratique o profile antes de iniciar uma re-arquitetura;

Moral 2) Investigue quem fez a besteira antes de anunciá-la.

Abraços