Django Migrations vs Unit Tests

A partir da versão 1.7, o Django conta com um sistema de migrations próprio. Com elas é possível controlar as versões do seu banco de dados, podendo voltar para qualquer versão do Schema que for necessário.

Um sistema como estes significa, também, mais trabalho para o Django fazer. Em um ambiente de produção, não há diferenças perceptíveis — As migrations foram feitas para serem executadas em momentos pontuais — Porém, dependendo da sua configuração, é necessário criar o banco de dados no início da execução e destruir ao final dos testes unitários. Se este é o seu caso, é bem possível que você esteja vendo seus testes ficarem mais lentos à medida que novas migrations são criadas.

Desativando as migrations

Ao que parece, este problema é bem comum. Tanto que há algumas soluções.  Sendo que a mais simples consiste em adicionar o seguinte ao seu arquivo settings.py:

class DisableMigrations(object):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return "notmigrations"

MIGRATION_MODULES = DisableMigrations()

Pode até ficar mais simples que isso, pois esta solução já foi integrada como plugin tanto para o manage.py test quanto para o py.test.

Se você migrou recentemente para o Django 1.7, é bem provável que isto acelere seu desenvolvimento. Os meus testes unitários que demoravam em média 120 segundos, parassaram a demorar apenas 10!

Estudo sob demanda

No momento estou lendo o livro The Art of Agile Development. Não estava na lista, mas está sendo muito esclarecedor para mim. O problema é que, ler um livro deste tipo, quebra um pouco minha rotina de estudo (reservo algumas horas na semana para praticar aquilo que estou lendo). Para resolver isto, estou começando a estudar de uma forma um pouco diferente.

Quando estudo tomando por base um livro, geralmente, leio bastante antes de colocar a mão na massa. A formula que estou usando é exatamente o contrário disto, ou seja, leio menos possível sobre o que estou tentando aprender. Algumas vezes, não leio nada.

Comecei a tentar este método com o Django. A parte interessante já começa aí: Nem sei Python direito! Logo de cara, eu tinha que descobrir como instalar. Isto não foi difícil, resolvi com o gerenciador de pacotes.

Com o Django instalado, fui ler um pouco como ele funciona. Como o objetivo é ler menos, comecei pelo tutorial do site do projeto. Assim que fui lendo o tutorial, já fui criando um aplicativo com uma função bem simples. Não fiz o mesmo aplicativo que estava no tutorial, porque queria encontrar problemas diferentes dos resolvidos ali. Aproveitei também para usar o banco de dados sqlite, ao invés do mysql que eu já estou acostumado. Mais uma vez, instalei o sqlite e comecei a usar sem ler a documentação ou ir ao site do projeto (a princípio).

Enquanto fui criando algumas coisas com o Django e o sqlite, foram surgindo algumas perguntas. À medida que isto foi acontecendo, fui lendo a documentação ou fazendo pesquisas. Fui aprendendo sem seguir algum caminho predefinido, somente a minha curiosidade.

Aprender coisas novas desta forma, é muito divertido (nunca tem a parte chata). Porém, isto também pode ser um tanto quanto frustrante. Em alguns momentos, eu não fazia idéia do que estava faltando para o meu aplicativo funcionar. Algumas vezes isto foi resolvido lendo um pouco mais sobre o que estava fazendo, outras vezes simplesmente comecei tudo de novo.

Tenho consciência que ainda vou precisar ler um livro (ou a documentação) das coisas que estou praticando, para aprender de verdade. Mas estudar desta forma, já está me ajudando a conhecer conceitos novos e aplicá-los em coisas que eu uso no dia-a-dia. Além do mais, é uma uma boa forma de começar a ter contato com o “eco-sistema” dos projetos.

Pare! Você está reinventando a roda

Um dos conselhos que eu mais ouço, talvez por ser um o mais difíceis de seguir, é: “Não reinvente a roda”. Ou seja, não tente refazer aquilo que já existe e funciona bem. Eu imaginava que já havia superado completamente minhas tendências de reinventar a roda, mas não é tão fácil assim.

Nesta última semana estive desenvolvendo um site simples. Como me passaram o layout pronto, só precisava fazer o CSS, separar as imagens, montar o HTML, etc. Não era um layout com uma estrutura convencional (cabeçalho, rodapé e uma ou duas colunas no corpo). Pra minha surpresa, comecei a apanhar um pouco do CSS, o que me deixou um tanto frustrado.

Quem já montou algum layout em CSS sabe que ter algumas estruturas básicas já montadas ajuda muito, e era exatamente o que eu precisava. Me lembrei do YUI e de um projeto no meu computador que fazia uso dele. Após estudar um pouco o código e a Y!DN consegui escrever a folha de estilo utilizando 25% do tempo que havia dedicado até então.

Depois desta história, concluo 3 coisas:

1 – Temos sempre que ficar de olho na nossa “caixa de ferramentas”
Quando eu trabalhava mais frequentemente com CSS, era mais fácil criar estas folhas de estilo. Ainda assim, dificilmente começava uma delas do zero, sempre tinha à disposição referências e ajuda dos colegas de trabalho. Já sabia da existência de YUI antes de começar este projeto, mas ignorei porque pensava que poderia fazer o projeto com as minhas próprias ferramentas.

2 – Não tenha medo de testar novas ferramentas (mesmo que seja pra falar que ela não funciona)
Já contei a história de como demorei pra aprender Python no post anterior, aquela história demonstra como deixar de conhecer uma ferramenta nova pode ser ruim. A pouco tempo atrás aconteceu a mesma coisa. Comecei a aprender CakePHP porque não queria aprender Ruby on Rails, hoje percebo que isto não faz sentido. Ruby on Rails é um framework que está ficando cada vez mais famoso pela sua produtividade, não faz sentido deixar de experimentar. Se você realmente pensa que Ruby on Rails é somente um hype que vai passar, aprenda e depois fale o que quiser! Não estou falando mal do CakePHP, é um excelente Framework, foi ótimo ter aprendido. A questão é que me interessei por ele pelos motivos errados.

3 – Aprenda como as coisas funcionam. Na hora certa.
Outro motivo para que as pessoas não utilizarem certas ferramentas e fazerem as suas próprias do zero, é querer aprender como funciona. O mais interessante disso, é que quando você fica tentando fazer a sua própria ferramenta do zero, na maioria das vezes, aprende como as coisas NÃO funcionam. Se você quiser aprender como as coisas funcionam, comece a utilizar as ferramentas prontas, depois leia documentações, livros, códigos-fonte, blogs e o máximo de material do pessoal que fez. Imagine que eu quero aprender sobre sistemas operacionais modernos e apenas sei programar em C, se eu começar um sistema operacional do zero sem ajuda e sem ler o material que existe sobre o assunto vou fazer um SO melhor do que os que existem no mercado?

Vou tentar, daqui pra frente, fazer uma rápida pesquisa a respeito das tecnologias que pretendo utilizar, talvez isto faça com que eu reinvente menos. Ainda assim, a maioria das tecnologias que realmente valeram a pena para mim, fiquei sabendo através de referências de outros profissionais. Confie nos seus amigos, desconfie de você mesmo.

Livros para ler em 2009

Ao ler o post no blog empirical empire com as dicas para ler mais livros por ano, comecei a aplicar alguns dos conselhos listados. Graças a aquele post, e ao meu gosto pela leitura, passei a me organizar melhor e tirar mais proveito dos estudos. Sendo assim, já listei alguns livros que pretendo ler em 2009. São eles os seguintes:

Programming Collective Inteligence: Building Smart Web 2.0 Applications

Li alguns capítulos deste livro, em 2008, porque fazia parte da bibliografia do curso de Inteligência Artificial na faculdade. Fiquei impressionado de ver que aplicações que parecem simples (folksonomia, por exemplo) são completamente baseadas em inteligência artificial.

Programming Python
Em 2006 alguns colegas de serviço começaram a falar para mim sobre Python, não dei muita importância. Hoje estou correndo atrás do tempo perdido. Programming Python é um livro com bastante conteúdo escrito por quem realmente entende do assunto. O livro tem mais de 1200 páginas, ou seja, dá pra se divertir bastante!

Building Scalable Web Sites: Building, scaling, and optimizing the next generation of web applications
Trabalhei em um portal que recebe milhões de visitantes únicos por mês. Neste período, aprendi que o ideal é que o software seja planejado para ser escalável desde o início. Embora eu nunca tenha folheado o livro, tomando por base as avaliações da amazon, parece ser uma leitura excelente.

O Restaurante no Fim do Universo
Nem só de TI vive um homem. Em 2008 li o fantástico O guia do mochileiro das galáxias e agora preciso dar continuidade na série. Aliás, o guia do mochileiro das galáxias e Os mercadores da noite foram os melhores livros que li em 2008.

Com certeza não vou me limitar a ler apenas os livros descritos acima, mas com certeza estarei com eles em mãos em 2009. De qualquer forma, indicações de boas leituras são sempre bem vindas, até porque, nunca se sabe o qual a novidade que pode surgir no decorrer do ano.