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 table
depende 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.
fonte
Respostas:
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:
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:
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.
fonte
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.
fonte
Você pode usar R? É para isso que serve.
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.
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.
fonte