quarta-feira, 3 de novembro de 2010

Projeto Opensource GAE + GWT


Incentivado pelo concurso promovido pela Globalcode desenvolvi uma pequena e simples aplicação utilizando GAE (Google App Engine) e GWT (Google Web Toolkit).



Trata-se de um gerenciador de finanças pessoas aonde o principal atrativo é poder efetuar os lançamentos pelo Google Talk.

O projeto foi escolhido entre um dos melhores do concurso e eu tive a oportunidade de apresentá-lo rapidamente aos usuários do GTUG (Grupo de usuários Google) na última sexta-feira no Google Developer Day 2010.

O projeto é opensource e a intenção que tenho é de continuar com o mesmo para disseminar e aprimorar o conhecimento nestas tecnologias do Google.

A qualidade do código fonte não é das melhores, já que tive que aprender em pouco tempo como funciona todo o ecossistema do GAE, BigTable, XMPP service e etc. Portanto, refactors irão surgir!

[Caso você queira ser um commiter basta entrar em contato comigo]

O link para o projeto é:

http://code.google.com/p/u3b/

Link para a aplicação:

http://www.useit3b.appspot.com

Abraços e bom estudo à todos nós!

quarta-feira, 3 de fevereiro de 2010

Eficiência x reaproveitamento em linguagens de Script

Primeiramente preciso esclarescer o porque deste tópico. Dedico o mesmo aos meus colegas de trabalho, pois diariamente temos que nos entender com alguns (vários) scripts em C (vulgo "Czão") estruturado. Acredito que os pensamentos expressos aqui também são válidos para outras linguagens mais novas, tais como PHP (ainda que estruturado) e alguns príncipios para Ruby e Python (embora eu não conheça muito bem ainda estas tecnologias). E deixo bem claro que ainda sou do time do pessoal de OO =D.

A discussão é a seguinte: Como avaliar/garantir performance, escalabilidade, reaproveitamento, manutenção, usabilidade em um ambiente tão hostil e precário que é a programação estruturada?

Com a experiência que vim adquirindo, comecei a me questionar se eu poderia usar algumas boas práticas que a metodologia de OO prega, já que ela nasceu de códigos estruturados e de uma necessidade de evolução. Acompanho de perto várias opiniões, sobre o uso ou não uso de funções separadas, includes, algoritmos com maior ou menor complexidade e etc.

Vamos considerar a pirâmide abaixo com 3 variáveis para facilitar o entendimento:



O desafio é: Como manter o equilíbrio da pirâmide? Analisando cada extremidade pode-se concluir:

Manutenção:
  • Para que eu torne mais fácil de ser alterado, eu posso evitar o uso de funções, includes e algoritmos de alta complexidade. Crio tudo em um único método [main()], não individualizo cada regra de negócio ou cada passo da rotina. LOGO:
  • Não é possível reaproveitar nenhuma regra de negócio;
  • Perco performance, pois ao invés de utilizar um algoritmo ou uma query cabeluda, faço vários "nós" de fácil entendimento para qualquer um e resolvo o problema;
Performance:
  • Para que eu torne meu código mais performático, eu me esforço ao máximo, passando horas para desenvolver aquela algoritmo que utiliza todo o conceito de ponteiros, estrutura de dados, busca binárias, algoritmos de ordenação ou então para fazer aquela belíssima Query de 300 linhas. LOGO:
  • Meu código comprovadamente roda muito mais rápido agora, porém o único "mágico" capaz de entender o mesmo é danado do filho da minha mãe (detalhe: ela só tem um);
  • Meu algoritmo/procedure/query é tão específica que só atende à aquele passo do fluxo, logo não aproveito nem com um CTRL+C e CTRL+V;

Reaproveitamento
  • Para que eu possa aproveitar as regras de negócio que talvez possam existir em mais de um domínio, eu crio vários arquivos de código fonte (#includes), destrincho algumas funcionalidades em funções que depois poderei ainda no pior caso aproveitar no CTRL+C e CTRL+V. LOGO:
  • Para cada "main()" precisarei de vários arquivos para garantir sua execução, ta, tudo bem... EU SEI quais são. Será que o filho da mãe do outro vai saber no dia que eu não mexer mais com isso?
  • Lembrem-se do DEBUG com #includes? Dispensa comentários =D
  • Minha função que calcula A+B também por acaso divide A/B, mas neste caso só preciso do primeiro cálculo... hum... performance....

Enfim, entre outros casos, logo temos a figura da pirâmide um pouco mais ilustrada:



O próximo passo é tentar provar o contrário da figura, ou seja, estressar um dos lados sem afetar o outro. Missão difícil na minha opinião, a melhor maneira, é saber dosar e tentar encontrar o equilíbrio.

Bom, acho que isso é um bom início de discussão. Comentários e opiniões são bem vindos :)

Abraços!

terça-feira, 19 de janeiro de 2010

Sistema Open Source em WPF

Iniciei o desenvolvimento à pedido de um amigo de um pequeno sistema comercial. Aprovetei a oportunidade para testar, conhecer e aprender um pouco mais sobre WPF.

A idéia é de um sistema Open Source onde os
interessados possam opinar, estudar e colaborar :).

Falando especificamente da tecnologia, tentei usar boas práticas de programação e padrões. Tentei utilizar o padrão MVC, não muito comum para o pessoal de .Net, mas muito comum em aplicações Java EE.

Estou implementando as funcionalidades aos poucos, portanto não esperam nada muito funcional, apenas teórico.
Estou fazendo uso do ADO.Net Entity para realizar a persistência com os dados. Estou gostando muito do Framework, mas como ainda não conheço bem (conheço melhor os frameworks de persistência para Java), essa parte da persistência não deve estar escrita da melhor maneira possível.

Abaixo um Screenshot da tela inicial do sistema:



Bem meiga não? rs

Hospedei o projeto no Google Code, ainda não subi o Script do Banco de dados
(Sql Server 2k8 Express), caso alguém queira de imediato ou tenha interesse em colaborar é só mandar um e-mail que eu libero permissão em alguma branch para Commit.

Link para o projeto:

http://code.google.com/p/wpfcrm/


Um bom plug-in de SubVersion para o Visual Studio pode ser baixado aqui:

http://ankhsvn.open.collab.net/servlets/ProjectProcess?pageID=3794


Abraços a todos!