MarinhoBrandão.com
"O risco que se corre ao se introduzir novas tecnologias é menor do que aquele que se corre ao não introduzi-las." ;)

Como criar um site bacana em poucos dias

Publicado por marinho, há 1 ano, 3 meses | django web

A minha satisfação com o "Será que eu compro?" não é só por ter tido uma boa ideia. A rapidez com que a coisa fluiu foi muito satisfatória.

Há uma semana atrás, numa tarde de sábado, eu coloquei a minha filha para dormir e estava com algum tempo sobrando. Algo em torno de 2 ou 3 horas. Tinha muito trabalho pra fazer, mas na verdade eu não estava afim, era sábado e eu queria só brincar um pouco.

Veio a ideia à cabeça e eu à coloquei em prática.

Algumas horas de trabalho depois e o site foi ao ar, na segunda-feira cedinho. Na terça com domínio registrado, tive condições de lançar os registros básicos de SEO para que os sites de busca pudessem começar a indexar o site.

Afora as horas de sono da Tarsila no fim de semana, e algum tempo no domingo enquanto assistia algo na TV, o tempo gasto foi muito pouco: os minutos de sobra durante a semana.

Como pode ver, foi muito pouco tempo pra ter o site publicado. E agora, vou listar abaixo aquilo que eu acho que foi decisivo pra isso, e que há algum tempo eu venho aprendendo e gostaria de passar a outros como boas práticas a serem lembradas.

1. Ter uma ideia fácil de ser colocada em prática

Não vou entrar na questão de se a ideia é boa ou não. Claro que se você tem uma ideia e quer fazer dela realidade, é porque você acredita nela e acha que é boa. E eu estou particularmente convencido de que boas ideias não são maiores do que um trabalho dedicado.

A questão é: você tem uma ideia possível de "entrar no ar" em etapas curtas?

Eu pessoalmente estou cansado de projetos longos. Especialmente aqueles ficam ainda mais longos à medida que o tempo passa. Um projeto pode ser imenso mas é importante que possa ser usado na prática o quanto antes, ainda que com poucas funcionalidades, mas sem deixar de ser interessante e útil.

O "Será que eu compro?" é uma ideia grande. O lista de "ideias" e "pendências" é maior que a lista de "funcionalidades ok" e vai tomar alguns meses para ficar "no jeito". Ainda assim, a lista de requisitos obrigatórios era pequena o suficiente para ir a público em menos de 10 ou 15 horas de dedicação.

Tente organizar o seu projeto de forma que a primeira versão seja viável o mais rápido o possível.

2. Usar um framework maduro e uma linguagem pragmática

Preciso dizer mais? Está óbvio que usar um framework maduro faz quase toda a diferença. O Django e o Python foram fundamentais nesse projeto. Diversas "coisinhas" que são feitas em 10, 15 ou 20 minutos só são possíveis usando um bom framework.

O Django é um framework com mais de 5 anos de vida, milhares de desenvolvedores que usam e sites construídos com ele, e uma comunidade muito ativa, especialmente no Brasil. O sistema de renderização de templates é fundamentalmente produtivo e a forma como o fluxo é distribuído entre Views, Models, Middlewares, etc. forma um conjunto produtivo e poderoso.

O Python é uma linguagem pragmática, simples e acessível, mas não é só isso. A vasta documentação na web e a quantidade de boas bibliotecas disponíveis fazem muita diferença na hora de fazer algo funcionar. Durante esta semana passei uns maus bocados ao usar o Lazarus para construiur uma aplicação desktop, isso porque precisava de um simples hash e boa comunicação com arquivos .MDB (Access) e Sqlite. A comunidade do Lazarus tem feito o melhor que pode por dele, mas a falta de documentação e de bibliotecas estão dificultando muito o trabalho. No Python este problema raramente existe.

Evidentemente há outros excelentes frameworks como Ruby On Rails, Merb e Pylons que são igualmente produtivos e maduros, há linguagens como Ruby, PHP e outras. Enfim, o desenvolvimento "ágil" não se resume só a essas ferramentas, mas há uma separação muito clara do que é ágil e maduro para o que não é.

3. Ter algumas utilidades prontas e reusáveis

Eu tenho um conjunto extenso de utilidades que inclui o django-plus, algumas utilidades relacionadas à realidade brasileira e outras coisas soltas por aí, mas para este caso específico eu usei um pequeno conjunto de aplicações plugáveis que eu usei no AprendendoDjango.com e no meu site pessoal, que inclui as seguintes utilidades:

  • Wiki/Flatpages
  • Blog
  • Galeria de imagens

Com essas três aplicações, é possível construir qualquer site básico visualmente, a partir do próprio site já no ar. Adicione a isso um conjutno bem bolado de códigos para cache de páginas e imagens (usando memcached), sitemaps, contato, etc. e você tem uma base reusável e prática para construir o seu site.

4. Usar e abusar de APIs maduras da Web2.0

Está aí uma grande sacada. Hoje a web possui diversos serviços de APIs para todo tipo de utilidade: imagens, vídeos, buscas, notícias, blogs, autenticação, etc. Tanto para publicar quanto para pesquisar. A lista inclui em destaque:

Usando uma API madura e conceituada disponível na Web, o seu trabalho caminha incrivelmente rápido e ganha outro nível de qualidade, basicamente é o novo conceito de "não re-inventar a roda" da Web 2.0.

5. Usar o deploy mais prático e "pronto" o possível

O local e modelo de hospedagem utilizados pode fazer muita diferença também.

No caso do "Será que eu compro?" o serviço de hospedagem utilizado é o Google App Engine (GAE). Ele tem a qualidade matadora de resolver alguns problemas sérios numa paulada só: performance, escalabilidade, praticidade e algumas questões mais importantes que envolvem hospedagem de sites, e faz uso da arquitetura de cloud computing do Google.

Com o uso de versões diferentes, você pode manter mais de uma versão do site, uma para testes de novidades e outra para a versão em produção. Com o uso de boas práticas no uso de Ajax e cache, aliados à escalabilidade natural do GAE, o site fica muito escalável.

Quer um exemplo? Neste site evitei algumas práticas comuns que utilizei ao longo dos anos: nas páginas renderizadas não há em nenhum lugar referências diretas ao usuário logado ou a outras funcionalidades mais "dinâmicas". Desta forma, essas páginas são renderizadas para o cache com expiração em 30 dias.

E o que eu fiz pra evitar problemas com isso? Simples. Criei um decorator que substitui o cache_page (do Django) com um algorítimo próprio para armazenar as páginas renderizadas em cache, usando uma chave baseada na URL e na QUERY_STRING. Desta forma, uma outra função faz o trabalho de cache invalidate quando os objetos relacionados são modificados. O código que faz isso está disponível no django snippet 1493. Assim, o cache só expira quando é descartado (isso é gerenciado pelo próprio memcache), quando um objeto relacionado é modificado ou quando se passam 30 dias.

A outra solução adotada foi fazer uso de Ajax para carregar elementos relacionados diretamente ao usuário, como é o caso do painel do usuário na página inicial e a votação.

Também evitei coisas como timesince e em breve quero criá-lo em JavaScript para que as datas sejam "calculadas" no lado cliente, a partir de uma data em formato UTC.

Esse tipo de técnicas adotadas permitiriam até mesmo a geração de arquivos HTML estáticos para as páginas, e como o cache é armazenado em memória, a performance e escalabilidade são as melhores que já consegui construir.

Por fim, outras ferramentas importantes que utilizei foram:

  • FreeDNS - para administrar os registros de DNS
  • Google Apps - para hospedar o domínio, e-mails e documentos.

Igualmente práticos e seguros, facilitam muito o nosso trabalho.

6. Usar boas ferramentas de SEO

Após colocar o site no ar e dar a ele o acesso publico, obviamente o que queremos é ver o maior número de gente usá-lo e apontar sugestões, críticas, bugs, elogios, etc.

Para isso, é importante conseguir o melhor posicionamento possível nos sistemas de busca.

Neste caso, além de adotar algumas das boas práticas de webstandard conhecidas, é importante tomar o cuidado para construir um bom Sitemap e um consistente (e de preferência também simples) robots.txt.

Uma das ferramentas obrigatórias de SEO é o Google Webmaster Tools. É ali que se registra o site, envia e valida os Sitemaps e o robots.txt. É ali também que podemos apontar algumas otimizações no direcionamento do site para determinados países e idiomas, tempo de varredura e palavras-chave preferidas. Ferramenta obrigatória pra quem quer ter uma chance a mais de acertar.

7. Buscar as boas ideias dos amigos

De nada vale um profissional sem seus amigos e parceiros. Como disse uma vez Isaac Newton: "se enxerguei mais longe, é porque me apoiei sobre ombros de gigantes". Não que a minha humildade tenha ido passear em algum lugar nesse fim de semana, não há qualquer comparação com Newton aqui, apenas inspiração.

O melhor que pude fazer assim que o site foi ao ar foi buscar as pessoas que considero mais importantes de ouvir nesse assunto. Claro que não me lembrei de todas, mas quando me lembro, envio uma mensagem perguntando, pedindo advice.

E a essência da pergunta é sempre a mesma: o que acha da ideia e o que fazer para que ela se torne realidade?.

As respostas que chegaram até agora inspiraram este artigo e algumas melhorias no site. Outras vão inspirar mudanças futuras e há ainda aquelas que me fizeram rever (ou pelo menos planejar isso) alguns elementos do site.

8. Persistência e dedicação

Por fim, o maior dos desafios.

Não há solução perfeita nem mesmo eterna e a web é campo vasto para experimentações. Mas o objetivo é sempre melhorar.

Eu acredito que o maior desafio não é ter uma grande ideia. O maior desafio também não é técnico. Por incrível que pareça, também não acredito que seja financeiro. Não acredito que rios de dinheiro mudariam muito a chance de sucesso da ideia.

Criar não é exatamente uma grande façanha. Grandes façanhas são resultados de anos de trabalho duro. Os grandes inventores e teóricos científicos sabem muito bem disso. Grandes visionários que são referências para nós também. Se Bill Gates, Sergey Brin e Steve Jobs ficaram ricos, é porque foram muitos anos de trabalho duro, 15 ou 18 horas por dia.

Eu acredito que o grande desafio é sempre a persistência. Eu já venci e já fracassei nesse ponto, e espero vencer de novo desta vez.

É a persistência que faz um produto desconhecido perambular por anos no desconhecido até crescer rapidamente na popularidade, e em se tratando de um site de social, isso é ainda mais importante, pois sem conteúdo, não há motivo para alguém se interessar pelo site.

Portanto, esse é o gigante a ser vencido agora.

No mais, espero que as dicas lançadas aqui sejam úteis a você, e quem sabe você também coloque uma boa ideia em prática e sejamos parceiros? Porquê não?

próximo evento:

PythonBrasil[6] , em 21 a 23/10 de 2010