domingo, 23 de maio de 2010

Coisas legais do dia-a dia

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 Localidade

Basicamente 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 Dados

Saber 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ção

Coisas 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 Frameworks

Podemos 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, MooTools
  • WebFrameworks como Rails, Django
  • Linguagens Script como Python,Ruby
  • Linux como OS, geralmente Ubuntu
  • MySQL/PostgreSQL como banco de dados
  • ApacheHTTPD, Ngix ou Lighttpd como servidor web
Conhecimentos 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.

Marcadores: , , , , , , , , , , ,

0 Comentários:

Postar um comentário

Assinar Postar comentários [Atom]

Links para esta postagem:

Criar um link

<< Página inicial