RSS
 

Archive for the ‘Legado’ Category

Reinventar a roda

04 dez

Acredito que o termo “Reinventar a roda” é um dos termos mais utilizados no mundo para tomar decisões relacionadas ao desenvolvimento de produtos de software. É justamente aquele tipo de argumento que sabemos que vamos ouvir e que quase sempre faz uma discussão de planejamento parecer inútil pelo seu tom irônico.

Evitando reinventar-a-roda vou apenas citar a definição encontrada em WIKIPEDIA (2009):

“A inspiração para esta metáfora idiomática reside no facto de a roda ser o arquétipo da ingenuidade humana, tanto em virtude do poder e flexibilidade que permite aos indivíduos que a usam, como pela influência que teve ao longo de toda a História e que continua a ter em quase toda (se não mesmo toda) a tecnologia moderna. Não se considerando ter falhas operacionais, uma tentativa de a reinventar não faria qualquer sentido e não traria qualquer valor acrescentado ao objecto, antes acarretando uma perda de tempo ao desviar recursos de investigação de outros tópicos possivelmente mais merecedores.”

Uma curiosidade é que a “roda” no sentido de “circunferência” é totalmente perfeita, tão perfeita que nem a matemática consegue representá-la com a perfeição que deveria ter. Para termos uma circunferência perfeita, precisaríamos saber qual o valor exato de π o que é impossível com o conhecimento que temos hoje.

stone-age wheel

Em minha humilde opinião, este termo é falho pois implica que algo funciona perfeitamente. No entanto, nenhum produto de software é perfeito e sempre há espaço para melhoria contínua. Este termo apenas faz sentido quando a “roda” é de fato perfeita. E perfeita implica que ela não precisa nem sequer ser trabalhada pois serve exatamente a seu propósito.

No mundo do software, é comum encontrar soluções (produtos, ferramentas, linguagens, etc.) que se tornam tão poderosas e difundidas que se tornam “rodas”. A falha é acreditar que pelo simples fato de uma solução funcionar, ser utilizada, ou ser vista empiricamente como a “melhor” solução, não faz dela a solução perfeita.

Um outro grande erro é aquele em que pessoas falham quando reinventam a roda e desconsideram o aprendizado que tiveram. Ao voltar atrás e adotarem algo pronto já estão mais preparados do que estariam se tivessem adotado algo pronto logo na primeira vez. Estas mesmas pessoas também não teriam como saber se falhariam ou não caso adotassem algo pronto na primeira tentativa.

square_bike_wheel

Infelizmente é impossível acabar com este termo histórico pois ele traduz subjetivamente pensamentos e opiniões que de uma forma ou de outra tem a utilidade de fazer uma discussão ser acalorada e aprofundada quando há pessoas com boas intenções presentes. O erro que nunca pode ser cometido é o de aceitar este termo como se fosse um dogma e ignorar todos os demais argumentos. Se assim o fazemos, estaremos desprezando a possibilidade de inovação. Se fosse um dogma, até hoje nós teríamos apenas um único sistema operacional (MCP?), um único modelo de computador (ENIAC?), um único tipo de monitor (CRT?), uma única linguagem de programação (APL?), um único editor de texto (ed?), um único [coloque aqui o tipo de software que mais utiliza].

tweelflex

Portanto, reinvente a roda. Reinventar a roda é inovar e inovar é fazer diferente! Se falhar não desista, quando disserem que você reinventou uma roda quadrada! Continue inovando! Se falhar quando optou por não reinventar a roda, provavelmente o farão inovar e isto vai levar mais tempo do que se tivesse inovado logo na primeira tentativa.

 

Escalando ASP clássico

16 out

Antes de tudo eu gostaria de deixar bem claro que não sou nem um pouco à favor do uso de tecnologias velhas e ruins (pois há soluções infinitamente melhores) como o ASP clássico. Estou apenas apresentando uma possível solução para lidar com débito técnico de empresas como a Microsoft e com legado.

Agora vamos ao que interessa. Há algum tempo atrás estávamos com problemas constantes de performance em um dos sistemas da empresa onde trabalho. Nossos clientes utilizam este sistema e este problema estava gerando muita insatisfação em nossos clientes.

Por razões históricas o sistema é todo baseado em soluções Microsoft, sendo que boa parte dele foi desenvolvido em ASP clássico, e algumas pequenas partes mais recentes foram feitas em .NET.

Não só havíamos problemas de performance pelo crescimento agressivo no uso do sistema, como também estávamos no limite do escalonamento vertical. Não adiantava mais colocar mais CPUs, mais RAM, etc, simplesmente porque naturalmente o IIS não escala serviços ASP.

O sistema utilizava o mecanismo de sessão do IIS que é mantido em RAM. Isto obviamente tem uma grande vantagem sobre sistemas que gravam sessão em arquivos ou em banco de dados. No entanto, quando o uso do sistema atinge os limites impostos pela plataforma não havia muito a ser feito.

O modelo de serviço do IIS com o ASP clássico e as sessões em RAM força o administrador do sistema a utilizar apenas um único processo (worker) do IIS para servir todas as requisições de um determinado site.

Poderíamos ter tomado alguns outros rumos, mas, ou eles envolviam alterações drásticas no sistema ou não sabíamos o que esperar de determinadas alterações. Qualquer tipo de teste levaria meses para ser feito e tudo isto há um custo astronômico. Havia a possibilidade de migrar para plataforma 64 bits para permitir o IIS alocar mais do que 4GB de RAM para um único processo, mas mesmo com menos de 2GB de uso o processo já apresentava problemas. Outro problema de migrar para 64 bits seriam as dezenas de componentes nativos (OCX, etc) que eram utilizados. Não era simples testar todos eles e determinar se todos se comportariam como antes na plataforma nova ou até mesmo encontrar versões adequadas para a nova plataforma.

Também era possível quebrar todo o site em vários pequenos outros sites, mas isso envolveria a alteração em dezenas de milhares de linhas de código e pelas características do código legado fazer este tipo de alteração poderia sair mais caro do que refazer o site do zero utilizando outra tecnologia mais recente.

A solução mais simples seria parar de utilizar o mecanismo de sessão nativo do ASP e passar a gravar a sessão em algum outro local onde pudesse ser lido por todos os processos sem problemas de locking. Este local poderia ser um banco de dados relacional ou algo como um memcached. Antes de colocar a mão na massa eu dei uma boa vasculhada na Internet e acabei encontrando o componente ISP Session da holandesa ADC Cure. Sinceramente a aparência do site não me animou muito a confiar no componente, mas como não havia encontrado nada melhor, acabei dando uma oportunidade.

Num primeiro momento baixei a versão trial do componente e testei-o num ambiente de desenvolvimento. Em pouco tempo estava tudo funcionando e com a sessão no banco de dados! Aquilo me impressionou muito e deixou a equipe toda animada. Achamos uma solução rápida para nossa maior dor-de-cabeça dos últimos meses!

O componente não faz nenhuma magia negra. Seu funcionamento é relativamente simples. Seu segredo é desligar a opção “Save session state” do site ou do IIS inteiro (como quiser) e substituir o objeto Session com um novo, que faz 99% do que o objeto original faz, só que gravando todas as informações em um banco de dados SQL Server.

Apesar das perdas na performance do tratamento da sessão – afinal deixamos de gravar em RAM e passamos a gravar em BD – pudemos escalar o pool do site para ter vários processos (workers) e inclusive colocar mais de um servidor para termos redundância do sistema. Sem dúvida o custo/benefício desta solução é muito melhor do que qualquer outra solução que encontramos.

Aproveito para mencionar que o componente não é gratuito. Ele tem um custo, até que pequeno, considerando-se as perdas que a falta dele estavam causando e o custo das outras soluções.

Agora que seu site pode continuar no ar com o volume de acessos crescendo constantemente, coloque a mão na massa e comece a refazê-lo em alguma outra tecnologia como, por exemplo, Ruby on Rails.