quarta-feira, 9 de maio de 2012

Versionamento, parte 1

Olá leitores se é que ainda existem do LeGauss!

Estou arrependido de ter deixado o Tiago e o Gabriel transformarem o LeGaus em um blog de matemática e vou compensar isso com um post sobre versionamento, o que é versão e como podemos usá-las no nosso dia a dia.

Introdução

Vou falar agora sobre um assunto de extrema importância e que é subestimado durante a graduação. Mesmo no curso de computação da USP, só ouvi falar disso uma única vez em cinco anos de curso. Tive que aprender sobre versionamento nas minhas atividades extracurriculares por minha própria conta.

Mas, apesar de ignorado pelo meio acadêmico, o versionamento está presente em todo o resto do mundo do software. Na verdade, não existe desenvolvimento de software sem o uso do versionamento. Mas o que é versionamento?

Como o próprio nome sugere, versionar significa colocar sob versão. Por exemplo, versão 1.0, 2.3.5 ou Beta. Basicamente, cada um adota um determinado padrão para a nomenclatura das suas versões, mas todos funcionam da mesma maneira. Quando os programas sofrem alterações recebem uma nova versão que reflete isso e cada versão é única durante a vida de um software.

A distribuição Ubuntu, por exemplo, adota o ano e mês de lançamento para compor a versão, ou seja, o Ubuntu 10.10 tem esse nome porque foi lançado em outubro de 2010. Outras pessoas gostam de adotar o padrão de três números 1.1.1, onde, da esquerda para a direita significa grande, media e pequenas modificações. Ainda existem umas versões especiais, como Alpha, que representa um software ainda em fase de desenvolvimento, Beta, que significa que um programa está em fase de testes finais ou RC (Release Candidate - Candidato a lançamento), que se assemelha à Beta, é um software maduro aguardando uma homologação para ser lançado oficialmente.

Mas o que é, de fato, versionar???

Versionamento é usado para se rastrear as modificações que um software sofre ao longo do tempo. Dessa forma, é possível saber se estamos com a versão mais atual, ou senão, qual update realizar. Cada versão nova pode corrigir bugs, adicionar novas funcionalidades ou melhorar o desempenho, por isso é importante manter tudo atualizado (com algumas exceções).

Se você está trabalhando em um ambiente controlado que integra diversas tecnologias, você só pode fazer o update do seu software depois de um estudo sobre o impacto disso no seu ambiente de trabalho. Por exemplo, pode ser que um dos seus software passe a salvar os arquivos de forma diferente e você importava esses arquivos com outra ferramenta que só lê esses arquivos na versão anterior, então neste caso, um update da primeira ferramenta não pode ser executado.

O versionamento é feito armazenando-se as pequenas modificações sofridas pelo software. Dessa forma é possível recuperar os diferentes estados do software ao longo do tempo. Isso é importante quando queremos passar adiante as modificações, pois não se precisa fornecer todo o software novamente, mas somente as modificações que ocorreram desde a última atualização, resultando em um arquivo muito menor e um processo de atualização mais rápido.

Você também tem a liberdade de voltar à versões anteriores e seguir uma linha de desenvolvimento diferente, também conhecido como fork de um projeto.

O que versionar?

Desenvolver um software envolve muitos elementos, então, quais deles devem ser colocados sob versionamento? No mínimo, você versiona o código fonte, ou o diretório onde encontra-se o projeto. Também versiona-se qualquer documentação sobre o projeto e qualquer arquivo extra que seja distribuído junto com o software.

Alias, você também pode versionar documentos e outros tipos de arquivos pessoais. Somente tome cuidado com o versionamento de binários, que é um pouco diferente de arquivos de texto.

Por que versionar?

Você deve estar se perguntando, o que isso importaria para você, que não trabalha em um grande projeto ou coisa assim?

Se você trabalha em algum programa, mesmo que pequeno, mas em parceria com outras pessoas ou apenas gostaria de compartilhar seus resultados já é possível colher as vantagens do versionamento, pois essas ferramentas também possuem mecanismos para otimizar o trabalho em equipe e facilitar o trabalho simultâneo de várias pessoas em um mesmo programa. Compartilhar os arquivos e suas modificações usando um gerenciador de versionamento é bem simples.

Versionar também é uma boa forma de backup, já que o código fonte e outros arquivos ficam em um servidor, e você pode sincronizar a pasta do projeto de onde quiser. Apesar que:

VERSIONAMENTO NÃO É BACKUP

Não use o versionamento simplesmente como uma forma de backup, existem ferramentas e técnicas bem melhores para isso.

Vamos considerar um exemplo

Vamos inventar um cenário onde fiquem mais claras as vantagens do versionamento.

Vamos supor que você esteja fazendo um programa que calcule números primos, como por exemplo, uma implementação do Crivo de Eratostenes. Porém, você não está fazendo esse programa sozinho, você conta com a ajuda de um amigo que vai te ajudar com algumas partes do programa.

Assim, o desenvolvimento de dará da seguinte forma, você vai fazer umas funções e ele fará outras (não necessariamente ao mesmo tempo) e vocês juntarão as duas partes. Para tanto, existem os seguinte métodos:

Método tradicional

Se você não está familiarizado com versionamento, o que é o mais provável, você certamente optará por este método.

Você começa a desenvolver o programa, então envia por e-mail o código fonte para o seu amigo para que ele continue a desenvolver. Ele envia para você de volta o arquivo mais completo, e isso se segue por um tempo.

O problema começa quando ambos começar a depurar seus respectivos código e enviar as correções um para o outro. Isso é feito enviando o seu código inteiro para o seu amigo e, como ele provavelmente terá um código diferente do seu, vai precisar caçar e implementar as mudanças na mão, e o mesmo vale para você.

Na maior parte do tempo, os programas serão bem diferentes um do outro, e a caixa de e-mail ficará lotada de arquivos fontes e se tornará bem complicado distinguir entre as versões, afinal "quando foi que você me enviou a aquela correção mesmo? Com que assunto estava o e-mail?".

Método tradicional - compacto

O método compacto parece mais atrativo mas é ainda pior. Ao invés de se enviar o código fonte inteiro, envia-se somente a função que foi modificada no próprio corpo do e-mail e indica-se onde substituí-la no código. Fica ainda pior de rastrear a evolução do software e saber quais alterações precisar ser feitas ou não.

Método tradicional - hardcore linux

Se você é um usuário linux, existem algumas facilidades para se enviar modificações em um arquivo texto. Você pode criar um arquivo contendo somente as modificações que ocorreram usando o comando diff e gerando um arquivo de patch.

Esse arquivo contém todas as modificações para transformar um arquivo em outro, ou seja, da última versão que você enviou ao seu amigo para a versão que você está agora. Por conseqüência, esse arquivo é menor que o fonte. O patch pode ser aplicado usando-se o comando patch, que aplica automaticamente todas as modificações e faz com que o arquivo fique na última versão.

Apesar disso, esse modo ainda possui problemas de rastreabilidade de modificações do código fonte. Antes de começar a modificar o arquivo, você tem que manualmente aplicar o patch para garantir compatibilidade com o projeto e ambos devem ter uma versão de referência separadas no computador nas quais devem aplicar os patchs seus e do seu amigo. 

Método com versionamento

E finalmente o método com versionamento. Primeiramente, é escolhida uma das diversas ferramentas disponíveis. Então é criado um repositório em um servidor com os arquivos do projeto. Esse servidor será quem fará o controle da versão e distribuirá as versões entre os membros do projeto.

Cada um que for trabalhar nesse projeto fará um checkout de todos os arquivos do projeto do servidor para uma pasta local. Então, sempre que quiser fazer alguma alteração no projeto, basta fazer um update para atualizar seus arquivos para a última versão, alterar o programa como você quiser, e depois realizar um commit para enviar as modificações para o servidor.

A cada commit no servido uma revisão é criada. Boas práticas de programação obrigam cada um que realizar um commit em um projeto a também anexar um comentário nessa revisão, o que torna a rastreabilidade da evolução do projeto bem mais fácil. Pode-se ainda apelidar as revisões e, assim, criar uma versão. Por exemplo, após 100 commits você estará na revisão 100 e estará lançando a versão 1.0 do seu programa.

A ferramenta de versionamento sabe exatamente qual versão você se encontra e baixará todas as modificações que ocorreram na ordem certa do programa desde a última vez que você o atualizou. 

Nos caso em que você já alterou sua versão e ela não era a mais nova, a própria ferramenta tentará fazer um merge das modificações, ou seja, a ferramenta tentará incorporar as suas modificações na versão atual automaticamente, bastando apenas, depois disso, realizar novo commit para atualizar a versão do servidor. Caso o merge automático falhe, ainda é possível realizá-lo na mão.

Dessa forma, ambos sabem como o software está evoluindo pois as modificações são rastreáveis. As ferramentas permitem você transitar entre as revisões (você não precisa trabalhar necessariamente na última), você pode fazer um fork do projeto e iniciar um novo projeto a partir da metade desse. E o mais importante de tudo, você pode compartilhar seu projeto e pessoas podem facilmente baixar, haquear o código e propor alterações que você pode escolher facilmente incorporar no seu programa. 

Continua...

No próximo post falarei sobre os sistemas de versionamento, ferramentas, e a conclusão desse post.

Att,




3 comentários:

Tasso Evangelista disse...

Bom post, já vou saltar para a próxima parte!

Anônimo disse...

Nem preciso falar de alguém que usa bastante o svn como backup né? =P

Anônimo disse...

Show!