Uma problemática comum de quem desenvolve sistemas é como manter a documentação em dia, se que isso comprometa os prazos de desenvolvimento.
Digamos que isso é um problema de otimização:
- um código bem documentado facilita e muito a sua manutenção;
- documentar código leva tempo;
- tempo é um recurso escasso em desenvolvimento de software;
Olha o problema… sem tempo, não há documentação e sem documentação você precisará de mais tempo para dar manutenção – oras, mas você já não tinha tempo para documentar, como vai ter mais tempo agora para dar manutenção?
Tentando equacionar esse problema surgiram várias ferramentas que visam facilitar todas as atividades relacionadas ao desenvolvimento.
Como a maior parte do meu tempo dedico ao PHP e CakePHP, tomarei estes como base para as ferramentas, porém várias delas podem ser utilizadas com outras linguagens/frameworks sem grandes problemas ou então possuem similares em outras linguagens.
Padrão de código
A primeira etapa, e talvez a mais importante, seja definir e disponibilizar um conjunto de regras explicando como o código foi escrito.
Este padrão envolve nome de classes, atributos, métodos, comentários, tabelas e colunas do banco de dados, organização de diretórios dentre outras coisas. Até coisas simples como a indentação deve ser padronizada.
Veja alguns guias de codificação para ter um exemplo do que quero dizer:
Versionamento de código
Um dos recursos mais importantes durante o desenvolvimento é a capacidade de se desfazer determinada alteração e manter um registro de todas as alterações feitas durante o desenvolvimento.
Atualmente, minha ferramenta favorita para versionamento é o Git um sistema distribuído de controle de versão. Porém existem vários outros que podem agradar, como o centralizador SVN e os também distribuídos Mercurial e Bazaar.
É muito fácil trabalhar com qualquer um destes sistemas e após conhecer as facilidades que o versionamento de código lhe proporcionam, você terá dificuldade em trabalhar com código sem controle de versão, pode apostar.
Caso você opte por um sistema distribuído, dê uma olhada neste modelo de organização para seu código: A successful Git branch model
Versionamento do Banco de Dados
Por melhor que seja o projeto do seu sistema uma coisa sempre ocorrerá: mudança. E isso envolve mais do que código, muitas vezes alterações na estrutura do banco são necessárias.
Como controlar essas alterações? A resposta é “Migrations”
No CakePHP precisamos de plugins para dar essa capacidade a aplicação, há dois largamente utilizados:
- Projeto do Juan Basso: https://github.com/jrbasso/migrations
- Projeto do CakeDC: https://github.com/CakeDC/migrations
Outros frameworks fornecem suporte “nativo” ao recurso, como o Ruby on Rails e Doctrine para PHP em geral.
Testes unitários
Acredito que todos os frameworks modernos fornecem suporte a criação de testes unitários em seus projetos. Os testes são uma fase importante do design do software e fundamental para documentação de qualidade.
O CakePHP até sua versão 1.3 utiliza o framework de testes SimpleTest, porém passará a utilizar o PHPUnit em sua versão 2.0 (atualmente em desenvolvimento).
Não sabe o que são testes unitários? Bom, segue alguns links sobre o assunto:
- Desenvolvimento Orientado a Testes
- Wikipedia: Testes de Unidade/Unitário
- TDD: Desenvolvimento Orientado a Testes
- Criando Testes com CakePHP
- Testes Automatizados no CakePHP
- Como fazer testes unitários em Models no CakePHP
Testes são como controle de versão… depois que você usa, não vive sem.
Documentação
Como comentado anteriormente, um passo importante para documentação são os testes unitários. Porém não devem ser o único.
Uma forma muito eficiente de documentação são os blocos de comentários, no PHP, o padrão PHPDoc é o mais utilizado.
Existem várias ferramentas que varrem o código de sua aplicação e identificam esses blocos para gerar a documentação, alguns deles são:
- phpDocumentor: ferramenta mais utilizada no mundo PHP
- Mais informação em português sobre PHPDoc
- Documente seu código PHP usando PHPDoc
- Gerador de Api para CakePHP
Quando sua documentação é concisa e completa, entender o funcionamento da aplicação passa a ser fácil, independente de quando ela foi criada. Quando isso é aliado aos testes unitários, fazer manutenção passa a ser uma atividade mais fácil e gratificante.
Por fim, é preciso saber o que/quando está errado e como/quando foi corrigido, ajudando na manutenção do histórico e acompanhamento da evolução do software. Para isso temos o tópico a seguir.
Controle de Bugs/Atividades
Como controlar o que, quando e por quem uma determinada atividade deve ser feita? E como verificar por quem e quando determinada funcionalidade foi implementada? O controle de versão pode fornecer parte destas respostas, mas ficar analisando logs normalmente não é muito comodo. A melhor maneira é utilizar uma ferramenta de controle de bugs/atividades.
Utilizo no meu dia-a-dia o excelente Redmine, um sistema simples porém poderoso para controle de tarefas. Suporta diferentes projetos, sub-projetos, integra-se com vários sistemas de versionamento de código, permite criação de wikis para documentação além de vários outros recursos.
Além deste, existem vários outros sistemas como o Bugzilla, Trac, Mantis e PHProjekt.
Conclusão?
Não, não tem conclusão. O texto visa apenas apresentar algumas atividades que juntas ao planejamento e desenvolvimento de software tendem a tornar a vida dos desenvolvedores melhor, seja diminuindo o stress causado por alterações dos requisitos ou manutenção de código mal projetado/escrito, seja tornando o desenvolvimento mais ágil, permitindo mais horas de lazer e descanso e menos fios de cabelo branco.
A intenção nunca foi cobrir todos os tópicos a exaustão, mas sim apresentar alguns exemplos e motivos para adoção de tais ferramentas/ideias. Caso tenha surgido dúvida a respeito de qualquer item, deixe um comentário =]
Sentiu a falta de algum item? Utiliza algo de forma diferente? Deixe um comentário também.
————-
Postado originalmente no blog da Radig
2 respostas em “Mantendo uma base de código organizada e documentada”
Migrations tem algum site oficial?
Onde mais posso saber sobre essa ferramenta?
Não conheço um site que defina Migration, porém uma das primeiras referências que vi foi do Rails http://guides.rubyonrails.org/migrations.html