Ou também “Colaborative Development of Scientific Software”, já para o nome do artigo.
Estou preparando uma apresentação para um curso no IFCE, e o tema é o desenvolvimento de software de forma colaborativa, ou seja, várias pessoas ao mesmo tempo trabalhando no mesmo código. Isso é padrão no desenvolvimento de código pelo mundo afora, sendo o kernel do linux o exemplo mais bem acabado desse tipo de desenvolvimento. Entretanto, o desenvolvimento de software na Academia tem outros problemas e caminhos. Por exemplo, é raríssimo um projeto de software desenvolvimento na Academia que conte com mais de um desenvolvedor do início, ou que tenha bem definido um projeto antes de começar. Outro problema bem comum no desenvolvimento de software científico é que o problema muda conforme o conhecimento sobre o problema, ou mesmo com os resultados preliminares do próprio software vão sendo produzidos, desta forma modificando o software, e assim continua. E geralmente quem desenvolve o código não é um programador treinado, mas geralmente um aluno de Iniciação Científica, Mestrado ou Doutorado, que pode ou não ter tido treinamento formal em programação ou algoritmos. Geralmente não tem treinamento, quanto mais específico. E ainda, talvez o maior problema: código legado. Um programa sem projeto, sobre um problema complexo, desenvolvido por um programador sem treinamento, e que deve ser passado para outro programador inexperiente e que ainda não é familiar com o problema científico. Isto é um GRANDE problema, sem dúvida.
O que fazer?
Minha própria formação não é de programador. Apesar de ser um bacharel em Física com ênfase em Computação, não tive nenhum treinamento formal em projeto, por exemplo. Fui treinado para resolver problemas físicos de forma eficiente usando computação, e não manter um código, técnicas de boa programação, ou documento de requisitos. Mesmo a formação em estrutura de dados deixou a desejar. E a luta contra os problemas acima nunca acaba! Mas deve existir alguma forma de se desenvolver software científico de forma mais racional. E a idéia que surgiu é tentar usar as ferramentas colaborativas. E o que são ferramentas colaborativas? São ferramentas que permitem que várias pessoas possam trabalhar ao mesmo tempo em um mesmo problema. Mas não só colaboração de código: o histórico de desenvolvimento também é importante, ao mostrar o caminho tomado e o código produzido. Além disso, a estrutura necessária para este tipo de desenvolvimento obriga que todos os programadores/cientistas integrem seus conhecimentos tanto do problema quando de código para resolver os conflitos que irão aparecer.
Não tenho a solução para os problemas acima, e na verdade, talvez algum deles nem tenham solução, pela sua própria natureza. Mas alguns dos problemas podem ser aliviados e coordenados para um aproveitamento melhor. Algumas ferramentas que podem ajudar e alguns caminhos que podem ser usados estão abaixo.
Primeiro, um sistema de controle de revisão: um sistema de controle de revisão é um sistema que permite o controle sobre o código-fonte, e a volta a qualquer ponto anterior. Existem controles de revisão para diversos tipos de dados, desde software, obviamente, até documentos legais, passando por projetos CAD e plantas. O controle de versão também permite que tais partes sejam numeradas e coordenadas. A grande utilidade de um sistema de controle de revisão em um software científico é a possibilidade de se verificar os passos anteriores do desenvolvimento do mesmo, vendo quais etapas foram feitas e em que ordem, e quais foram as mudanças na evolução das idéias e do código em si.
Outra ferramenta que pode ajudar é o uso de IDEs, que centralizam parte do desenvolvimento e permitem o uso das mesmas ferramentas e ambientes de trabalho por todos os pesquisadores. Quem já teve que lidar com makefiles ou árvores de dependências pré-históricas sabem o que é ter que fazer tudo no braço.
O uso de software de código aberto, os tais open source, também podem ajudar muito no desenvolvimento do software científico, juntamente com bibliotecas padrão, que geralmente são open source (mas não é sempre o que acontece, como o caso da Intel MKL). Existem diversos softwares open source científicos prontos, com a grande vantagem do código estar acessível, podendo ser entendido, modificado, reaproveitado e melhorado, poupando tempo e esforços – o que ocorre com frequência no software científico, que às vezes é a empreitada de um homem só (mais o seu orientador, hehe). As outras vantagens do código aberto (transparência na revisão do código, contribuição de volta para a comunidade) são também relevantes e devem ser levadas em conta, mas muitas vezes este não é o objetivo de um scisoft (acabei de inventar essa expressão, scisoft. Vamos ver se no google ela já existe… Damn. Claro que já.) As bibliotecas padrão se encaixam neste perfil.
Este post vai ter uma segunda parte…