Coisas legais do dia-a dia
Autor: @williamgouvea | Publicado: 2010-05-23T02:06:00-07:00

Na ultima semana, em  um projeto interno da empresa onde trabalho, mais uma vez me dei conta de como conceitos basicos e bem consolidados podem fazer realmente a diferença entre algo simples ou complexo e sobre uma solução ser boa ou ruim.Conversando com a galera da empresa sobre frameworks web modernos, tecnologias atuais e o ciclo das tecnologias, tal como acontece nas artes, pude ver o quão a minha idéia realmente fazia sentido.Principio da LocalidadeBasicamente a localidade define o melhor aproveitamento da hierarquia de memória em um sistema definindo assim o conceito de cache.O princípio da localidade de referência diz que o dado usado mais recentemente tem grande probabilidade de ser acessado novamente num futuro próximo (localidade temporal). Favorecendo-se o acesso a tais dados, aumenta-se o desempenho do sistema.Já o principio da localidade espacial diz que um endereço em memoria , tende a ter endereços proximos acessados em um futuro proximo, devido a natureza dos loops(repetição) e das estruturas de dados de armazenamento sequencial(vetores).Uma definição mais simples de cache poderia ser: uma área de armazenamento temporária onde os dados frequentemente acedidos são armazenados para acesso rápido.O uso do Memcached se justifica devido a tudo isso, tornando aplicações que possuam muitos acessos  ao banco de dados incrivelmente performaticas.Quando o assunto for alta disponibilidade do banco de dados, o Memcached tambem pode ser uma ótima pedida.Estrutura de DadosSaber implementar e entender as estruturas de dados faz grande diferença na hora de solucionar problemas.Saber onde e porque usar uma Stack, uma Queue, um Map, um Set ou uma Tree, suas politicas de uso e seus variados tipos de interface pode fazer você pensar Out-of-The-Box =).Na hora de parsear texto, inverter strings,  trabalhar com interpretação de linguagens, ou automatizar etapas , usar Stack/Pilha com politica LIFO é preciso!Em um contexto de concorrencia, eventos do tipo Publish/Subscribe,caixa de email e computação distribuida em geral, vale a pena dar uma boa olha em Queue/Fila com politica FIFO.Cache , Sessões, DNS entre outras aplicações ficam a cargo dos HashMaps.Para Foruns , Conceitos de Memória, e  Lógica em Geral vale a pena estudar sobre Arvores e Heaps.Existem milhares de aplicações individuais e conjuntas destas estruturas de dados e um  bom conhecimento sobre suas interfaces e aplicações pode fazer a diferença em muitos casos.Teoria da ComputaçãoCoisas como O(1), O(n),O(logn) podem ser horriveis se você não gosta de matematica ou não entende seus algoritmos e sua complexidade.Porem , se você olhar , mesmo que intuitivamente para seus algoritmos, poderá entender o que pode estar acontecendo e quem saber fazer isso acontecer mais rapido.Em uma dada tarefa, eu e meu gerente percebemos que em um script de deploy automatizado com o Fabric, possuíamos um repositorio de estáticos, que devia ter  sua consistencia preservada após varios redeploys.O primeiro ataque ao problema foi copiar todo o repositorio para um repositorio auxiliar e posteriormente copia-los de volta. Basicamente um swap, que pra quem ja viu alguns  algoritmos de ordenação, pode ser custoso, já que em principio,neste caso, quanto maior o numero de arquivos estaticos, o tempo da tarefa passa a ser quadrado O(n²).O segundo ataque, em um passo de refatoração, foi de criar switch's com links simbolicos, de forma a manter a aplicação disponivel por maior tempo e tornar o tempo de consumo praticamente constante O(1) como num lookup feito em um hashmap .Tal raciocinio, nao leva em conta calculos avançados, benchmarks ou falacias da rede como banda infinita e rede sempre disponivel, sendo apenas um leve esboço de logica.LAMP/Web FrameworksPodemos ver que Django, Rails dentre outros  frameworks novos para desenvolvimento web, possuem comunidades fortes, principios notaveis como DRY E COC, arquitetura MVC, alem de manter suas raízes na pilha LAMP OpenSource, revolucionando  ou reensinando a forma como se escreve para web nos dias de hoje.Contudo,no  mundo Java, que muitas vezes possui pensamentos megalomaniacos de contrução de foguetes(rsrsrs), podemos ver uma mudança de comportamento , dada a grande adoção de frameworks como VRaptor, Play  e Scooter que aprenderam principalmente com o Rails como o desenvolvimento web pode ser produtivo, divertido e em Java.Coisas como JSF, Wicket, GWT, Struts podem até fazer sentido em alguns contextos, mas se você parar e pensar, pra que você precisa de milhares de build's complexos, milhões de dependencias, e lógica de processamento rebuscada que "esconde" as coisas do programador?Não é  preciso reinventar rodas, nem criar engenhocas complexas para web, apenas usar o bom senso e conceitos já batidos como:Client-side com JQuery, ExtJS, MooToolsWebFrameworks como Rails, DjangoLinguagens Script como  Python,RubyLinux como OS, geralmente UbuntuMySQL/PostgreSQL como banco de dadosApacheHTTPD, Ngix ou Lighttpd como servidor webConhecimentos sólidos em computação distribuida,arquitetura de sistemas, shell script, sql, http, smtp, javascript, e linguagens dinamicas pode ser uma boa opção de "munição" para seus combates diários na web.Obrigado pelo seu tempo.