Qual metodologia de software devo seguir ao pesquisar?

9

Geralmente analiso dados de experimentos e, embora tenha um esquema geral de etapas que preciso executar, talvez seja necessário ajustá-lo às especificidades dos experimentos ou às perguntas por trás. Eu sou geralmente o único código.

Eu olhei a wikipedia, mas não tenho certeza de qual metodologia posso usar, em parte porque nunca segui nenhuma, e em parte porque às vezes apenas exploro os dados, para ver como eles são, e outras vezes só quero uma resposta. (E porque não tenho muita expectativa de testar ou ter uma certa qualidade no meu código)

Fui solicitado a fazer essa pergunta depois de uma ou duas horas descobrindo que a função r tabledepende da ordem dos vetores e não do nome dos elementos com os quais compará-los. Então, pensei que deveria ter testado o comportamento e as funções em que usei com alguns dados simulados. Mas eu usei a tabela após outras análises resultarem em falta de informações, portanto não poderia ter seguido a metodologia de desenvolvimento orientada a testes (se entendi direito). No entanto, sinto que, com algumas melhorias na maneira como encaro o projeto, poderia ser mais eficiente, além de detectar erros mais cedo, mas também como e o que procurar, caso duvide de um resultado, por isso, não se concentre apenas em este exemplo de erro.

Qual metodologia de software se encaixa melhor na pesquisa?

Estou basicamente perguntando como garantir a qualidade e o progresso programado, além de manter a especificidade da pesquisa.

Exemplo de como eu trabalho:

Um biólogo tem em mente uma pergunta e sabe que fazer um experimento levará a ter dados de interesse (ou seja, níveis de expressões gênicas em duas condições), então ele / ela define o experimento e lembra amostras de 10 pessoas / camundongos / ratos. Agora, devo analisar esses dados para essas 10 amostras usando bibliotecas e testes existentes (ou implementando novos testes), mas levando em consideração a pergunta que o biólogo tinha em mente (ou seja, quais genes são mais expressos em uma condição do que em outra). A estrutura é a mesma de experimentos anteriores (que envolveu 6 condições e outro animal), mas o teste estatístico, normalizações e estrutura de dados podem mudar. Normalmente, copio uma versão anterior e a adapto às necessidades atuais.

llrs
fonte
7
o que você é dong agora está bem. Nenhuma metodologia o impedirá de cometer erros! apenas verifique se você está usando um sistema de controle de versão e mantenha suas bases de código bem organizadas.
Gbjbaanb
Nenhuma metodologia irá parar os erros. Mas alguns perceberão os erros mais cedo! Design por contrato ou design baseado em contrato.
91116 Frank Hileman
Você poderia elaborar sua última frase? Eu não entendi nada.
LLRs
talvez en.wikipedia.org/wiki/Test-driven_development com algum tipo de estrutura de teste automatizado - pequenos testes são úteis para a captura de erros e testes maiores podem mapear (aproximadamente) em suas hipóteses
david.libremone
11
@Llopis, idealmente, você escreve um teste primeiro, ele falha, depois escreve o código, o teste passa e depois confirma seu código - se você descobrir um bug posteriormente, você escreverá o teste que teria detectado o erro, ele falhará , corrigir o código, o teste passa, então, de se comprometer o seu código - você não pode FORSEE tudo, mas você pode ter certeza que a mesma coisa não aconteça novamente
david.libremone

Respostas:

6

O que é necessário talvez não seja uma metodologia de software, mas uma mudança política na academia que resolva a questão do desconhecimento do papel desempenhado pelo desenvolvimento de software na ciência.

O Software Sustainability Institute (UK) é a organização mais próxima do que você está procurando: como defender um uso mais consciente da programação de computadores em pesquisas científicas.

Ele também fornece indicadores de informações para os interessados ​​em metodologias de desenvolvimento de software.

No entanto, devo salientar que as metodologias normalmente governam equipes de programadores de software, com iterações e refinamento gradual dos objetivos do projeto, e trabalham com bases de código estáveis ​​que duram muito tempo. Eles são para projetos com ordens de magnitude mais complexas do que o que você está fazendo.


Por que essa coisa obviamente correta (o uso mais consciente da programação de computadores na pesquisa científica) não foi realizada e sempre foi mantida, eis a verdade inconveniente: nos ambientes administrativos acadêmicos, os cientistas podem degradar a importância desempenhada pelo computador programação. Às vezes, eles podem ser vistos se unindo para negar o reconhecimento de contribuições de pessoas envolvidas no software, mesmo que a natureza dessa contribuição se encaixe na disciplina científica.


No seu local de trabalho, há coisas que estavam faltando e coisas que você pode fazer.

Coisas que estavam faltando:

  • Falta de diretrizes
  • Falta de supervisão ou pessoa para fazer perguntas
  • Falta de mentores ou programadores de computador que tenham conhecimento das ferramentas que você usa (por exemplo, R)
  • Falta de reutilização, arquivamento, controle de versão ou documentação de software desenvolvido anteriormente, para fins de repetibilidade e aprendizado

Em resumo, a cultura geral é que as pessoas envolvidas não estão realmente interessadas em ... você adivinhou ... uso mais consciente da programação de computadores em pesquisas científicas.


Coisas que você pode fazer:

  • Dedique mais tempo para aprender suas ferramentas.
    • Gaste mais tempo lendo a documentação e os exemplos de código para suas linguagens de programação
    • Você terá que aprender a amar as ferramentas que usa.
  • Tente escrever alguma coisa, para o benefício do próximo programador de computador que será escravizado pelo mesmo grupo de pessoas pelos próximos dois anos
    • Um wiki será excelente.
  • Tente configurar o controle de versão de origem
    • Ser capaz de recuperar trechos de código comumente reutilizados
    • Consiga salvar um instantâneo do código usado em uma experiência específica

Para desenvolvedores de software de carreira, diretrizes dessa natureza podem ser encontradas em:

Esses são considerados os requisitos básicos para administrar um negócio de desenvolvimento de software. No entanto, quando você está lutando contra uma guerra de apatia, precisa priorizar. Melhorar as ferramentas, anotar e manter informações, manter as versões do código-fonte é o mínimo necessário para um único ambiente.

rwong
fonte
Recurso interessante no Software Sustainability Institute obrigado! Vou escrever minhas próprias diretrizes de gerenciamento de código e dados, tenho um supervisor, mas ele não parece ter "conhecimento das ferramentas", uso o git, mas tentarei seguir seus conselhos sobre documentação
llrs
ha sim, um wiki ... por ter tentado alguns, eu recomendaria dokuwiki.org/dokuwiki# aqui. Simples de configurar e mantém os documentos como arquivos de texto, e não em um banco de dados. Eu achei que era o melhor equilíbrio entre facilidade de configuração, facilidade de uso e sustentabilidade dos dados.
Newtopian 27/07/16
Os problemas na ciência auxiliado por computador que @rwong descreve estão presentes na maioria dos institutos Eu tenho trabalhado (física e astronomia)
Steffen
2

Não se preocupe muito com a metodologia, mas tente se concentrar mais no que você precisa acompanhar, seus requisitos, para o próprio desenvolvimento de software.

Tendo feito uma curta estadia em uma posição relativamente semelhante à sua aqui, é o que posso extrair da minha experiência pessoal.

Exatidão algorítmica

Provavelmente o aspecto mais importante, você deve poder provar que seu software faz o que foi projetado para fazer. Aqui o teste automatizado é o seu melhor aliado. Sei que pode ser difícil ficar sem um conjunto de dados adequado, mas na verdade você deve criar o hábito de criar seus próprios conjuntos de dados. No entanto, o objetivo deles é um pouco diferente: você não está tentando extrair tendências dos dados, mas garante que o software produza resultados previsíveis e corretos a partir de um conjunto de dados conhecido. Portanto, para o reconhecimento de padrões, por exemplo, você não precisa de uma composição genética de vários shows, apenas algumas linhas de texto podem ser suficientes para garantir que o algoritmo detecte o padrão.

Eu costumava criar meus dados para representar casos de canto, casos impossíveis. Eu tendia a me concentrar mais nos extremos do que na norma esperada. Muitas vezes me lembro de testar algo impossível, apenas para ver essa situação surgir no conjunto de dados real. Se eu não tivesse testado, não teria implementado as detecções de erros e o log necessários para identificar possíveis corrupções ou erros no conjunto de dados. O TDD é um bom ajuste para esta parte, embora a criação de um bom conjunto de testes seja mais importante, independentemente de você fazer isso antes ou depois do código real.

Versionamento

Muitas vezes, essa parte é deixada de fora. Um bom esquema de versão para o seu código e pacotes / executáveis ​​produzidos ajudará imensamente a manter seu progresso em ordem. Ser capaz de recuperar exatamente o código usado para criar resultados obtidos anteriormente pode ajudar no rastreamento de bugs ou discrepâncias. A ramificação também pode ajudar ao experimentar diferentes abordagens ou algoritmos.

Certifique-se de marcar o código usado nos cálculos reais. Verifique o controle de versão semântico, se precisar de ajuda para nomear as versões.

Construção automatizada

Um corolário ao ponto acima. Certifique-se de automatizar o máximo possível o processo de construção e empacotamento do seu software. Você não precisa se tornar monty, apenas o suficiente para tornar trivial a criação do sistema final a partir da fonte e das dependências. O objetivo aqui é economizar seu tempo, mas também ter um meio reproduzível para recriar o software da fonte, incluindo dependências e outros recursos externos. Groovy, Maven, ant, Scons, cmake, são apenas uma pequena amostra de ferramentas de automação de compilação e sistemas de script que podem ajudar.

Se você quiser ir além, instale o Jenkins ou o teamcity ou qualquer outro sistema de integração contínua. Bônus adicional se você precisar manter vários servidores ou trabalhadores para computação distribuída. A maioria desses sistemas terá meios para ajudar na manutenção. Além disso, você poderá automatizar completamente as execuções de teste para não precisar esperar pelos resultados antes de continuar, basta confirmar e receber um email mais tarde. Eu tive um sistema que levou horas para passar pelos conjuntos de testes. Colocar essa automação foi o melhor investimento do meu tempo. Especialmente se você já possui os scripts para criar tudo.

Isolamento do ambiente

O pesquisador gasta uma quantidade excessiva de tempo isolando um único ou pequeno conjunto de variáveis ​​de interesse de sistemas complexos por meio de seus protocolos. Isso também deve ser estendido às suas práticas de desenvolvimento de software. Você também pode verificar a conteinerização com o Docker ou o Vagrant. Isso lhe dará um melhor controle sobre o ambiente em que o software é executado.

Você não precisa ter uma grande equipe antes que isso valha a pena, eu fiquei sozinho a maior parte do tempo, mas me beneficiei bastante de colocá-las no lugar. A paz de espírito e o tempo economizado, desde que superassem em muito as despesas gerais, me custaram isso.

Newtopian
fonte
Normalmente, deixei o código como quando termino, portanto, a versão mais recente é a usada para os cálculos; portanto, talvez seja necessário melhorá-lo. Também sobre a exatidão algorítmica, não devo assumir que as bibliotecas que utilizo funcionam corretamente?
LLRs
você pode, embora eu tenha feito testes em dependências externas antes, mas isso era raro ... é o seu próprio código que você deveria testar, usou as bibliotecas corretamente? Falha reditivamente (seu código)? etc.
Newtopian
0
  1. Você pode usar R? É para isso que serve.

  2. Mantenha seu código simples . Procure legibilidade e não se preocupe com o desempenho, a menos que seja um problema. Existem metodologias para tentar impedir que equipes de programadores coloquem bugs no código uma da outra, mesmo que a equipe seja uma pessoa.

  3. Dito isto, a disciplina de codificação é super importante. Eu já vi código de cientistas avançados e matemáticos altamente treinados, e é horrível . Eles ignoram totalmente a formatação. Eles juntam o código como se fosse embalado a vácuo. Seus nomes de variáveis ​​são totalmente intrigantes. Eles não escrevem comentários, ou escrevem comentários inescrutáveis, ou os comentários dizem uma coisa enquanto o código diz outra. Não faça essas coisas. Sempre pense no futuro, mudanças que você ou outras pessoas possam ter que fazer.

Mike Dunlavey
fonte
11
Estou usando R, espero que meu código seja simples o suficiente para detectar bugs que eu poderia ter escrito e qualquer erro que eu pudesse ter cometido. Sigo o estilo de formatação de código do Google R e gostaria de pensar que os comentários são úteis para explicar por que tomo essas decisões no código.
LLRs
@Lopis: Então eu diria que você está no caminho certo.
Mike Dunlavey
@Llopis no desenvolvimento de software baseado em equipe, é rotina para os membros da equipe solicitarem que outra pessoa revise o código, com base no pressuposto de que mais olhos podem detectar mais erros. Infelizmente, na sua situação, não há ninguém para revisar o seu, e a cultura de sigilo na pesquisa impedirá que você permita que outras pessoas (fora das permissões do seu local de trabalho) revisem seu código.
Rwong
11
@rwong de fato, agora estou autorizado a compartilhar meu código de pesquisa, para que qualquer pessoa possa revisá-lo no github
llrs
@Llopis: Mais uma razão para torná-lo legível. Uma coisa que tento fazer é fornecer um pequeno tutorial (nos comentários) sobre o assunto, porque as chances são de que a experiência do leitor será diferente da minha.
Mike Dunlavey