fundo
No ano passado, fiz estágio em um grupo de pesquisa em física em uma universidade. Neste grupo, usamos principalmente o LabVIEW para escrever programas para controlar nossas configurações, fazer aquisição de dados e analisar nossos dados. Para os dois primeiros propósitos, isso funciona bem, mas para a análise de dados, é uma verdadeira dor. Além disso, todos eram autodidatas em sua maioria, então o código que era escrito era geralmente uma bagunça (não é de se admirar que todo PhD rapidamente decidisse reescrever tudo do zero). O controle de versão era desconhecido e impossível de configurar devido aos rígidos regulamentos de software e rede do departamento de TI.
Agora, as coisas realmente funcionaram surpreendentemente bem, mas como as pessoas nas ciências naturais fazem seu desenvolvimento de software?
Questões
Algumas questões concretas:
- Quais linguagens / ambientes você usou para desenvolver software científico, especialmente análise de dados? Quais bibliotecas? (por exemplo, o que você usa para plotar?)
- Houve algum treinamento para pessoas sem qualquer experiência significativa em programação?
- Você tinha algo como controle de versão e rastreamento de bugs?
- Como você tentaria criar um ambiente decente para a programação, sem atrapalhar os cientistas individualmente (especialmente os físicos são pessoas teimosas!)
Resumo das respostas até agora
As respostas (ou minha interpretação delas) até agora: (2008-10-11)
- Idiomas / pacotes que parecem ser os mais usados:
- O controle de versão é usado por quase todos os entrevistados; rastreamento de bugs e outros processos são muito menos comuns.
- O curso de Carpintaria de Software é uma boa maneira de ensinar técnicas de programação e desenvolvimento para cientistas.
- Como melhorar as coisas?
- Não force as pessoas a seguir protocolos rígidos.
- Configure você mesmo um ambiente e mostre os benefícios aos outros. Ajude-os a começar a trabalhar com controle de versão, rastreamento de bugs, etc. por conta própria.
- Rever o código de outras pessoas pode ajudar, mas esteja ciente de que nem todos podem apreciar isso.
Respostas:
Quais linguagens / ambientes você usou para desenvolver software científico, esp. análise de dados? Quais bibliotecas? (Por exemplo, o que você usa para plotagem?)
Eu costumava trabalhar para a Enthought , a principal patrocinadora corporativa da SciPy . Colaboramos com cientistas de empresas que contrataram a Enthought para o desenvolvimento de software personalizado. Python / SciPy parecia ser um ambiente confortável para os cientistas. É muito menos intimidante para começar do que C ++ ou Java, se você for um cientista sem experiência em software.
A distribuição Enthought Python vem com todas as bibliotecas de computação científica, incluindo análise, plotagem, visualização 3D, etc.
Houve algum treinamento para pessoas sem qualquer experiência significativa em programação?
A Enthought oferece treinamento em SciPy e a comunidade SciPy é muito boa em responder a perguntas nas listas de discussão.
Você tinha algo como controle de versão, rastreamento de bugs?
Sim e sim (Subversion e Trac). Como estávamos trabalhando em colaboração com os cientistas (e normalmente remotamente deles), o controle de versão e o rastreamento de bugs eram essenciais. Demorou algum treinamento para que alguns cientistas internalizassem os benefícios do controle de versão.
Como você tentaria criar um ambiente decente para a programação, sem atrapalhar os cientistas individualmente (especialmente os físicos são pessoas teimosas!)
Certifique-se de que eles estejam familiarizados com a corrente de ferramentas. É necessário um investimento inicial, mas fará com que eles se sintam menos inclinados a rejeitá-lo em favor de algo mais familiar (Excel). Quando as ferramentas falharem (e falharão), certifique-se de que eles tenham um lugar onde ir para obter ajuda - listas de e-mail, grupos de usuários, outros cientistas e desenvolvedores de software na organização. Quanto mais ajuda houver para fazê-los voltar a fazer física, melhor.
fonte
O curso Carpintaria de Software é voltado especificamente para pessoas que fazem computação científica e tem como objetivo ensinar os fundamentos e lições de engenharia de software, e a melhor forma de aplicá-los em projetos.
Abrange tópicos como controle de versão, depuração, teste, script e vários outros problemas.
Eu ouvi cerca de 8 ou 9 palestras e acho que é altamente recomendado.
Edit: Os MP3s das palestras também estão disponíveis .
fonte
Física nuclear / de partículas aqui.
Para melhorar as coisas:
Mais uma sugestão para melhorar as coisas.
fonte
Isso pode ser ligeiramente tangencial, mas esperançosamente relevante.
Eu trabalhava para a National Instruments, R&D, onde escrevia software para os kits de ferramentas de RF e comunicação da NI. Usamos o LabVIEW bastante, e aqui estão as práticas que seguimos:
fonte
Não sou exatamente um cientista "natural" (estudo transporte), mas sou um acadêmico que escreve muito do meu próprio software para análise de dados. Tento escrever o máximo que posso em Python, mas às vezes sou forçado a usar outras linguagens quando estou trabalhando para estender ou personalizar uma ferramenta de software existente. Há muito pouco treinamento em programação na minha área. A maioria das pessoas é autodidata ou aprendeu suas habilidades de programação em aulas anteriores ou fora da disciplina.
Sou um grande fã de controle de versão. Usei o Vault em execução no meu servidor doméstico para todo o código da minha dissertação. No momento, estou tentando fazer com que o departamento configure um servidor Subversion, mas acho que serei o único a usá-lo, pelo menos no início. Eu brinquei um pouco com FogBugs, mas ao contrário do controle de versão, não acho que seja tão útil para uma equipe de um homem só.
Quanto a encorajar outros a usar o controle de versão e coisas do gênero, esse é realmente o problema que estou enfrentando agora. Estou planejando forçar meus alunos de graduação a usá-lo em projetos de pesquisa que estão fazendo para mim e incentivá-los a usá-lo em suas próprias pesquisas. Se eu ensinar uma aula envolvendo programação, provavelmente forçarei os alunos a usar o controle de versão lá também (classificando-os com base no que está no repositório). No que diz respeito aos meus colegas e seus alunos de pós-graduação, tudo o que posso realmente fazer é disponibilizar um servidor e confiar na persuasão gentil e em dar um bom exemplo. Francamente, neste ponto, acho mais importante fazer com que eles façam backups regulares do que colocá-los no controle de origem (algumas pessoas estão carregando a única cópia de seus dados de pesquisa em unidades flash USB).
fonte
1.) As linguagens de script são populares hoje em dia para a maioria das coisas devido a um hardware melhor. Perl / Python / Lisp são predominantes para aplicativos leves (automação, computação leve); Vejo muito Perl no meu trabalho (EM computacional), pois gostamos de Unix / Linux. Para questões de desempenho, C / C ++ / Fortran são normalmente usados. Para a computação paralela, bem, normalmente paralelizamos manualmente as execuções em EM em vez de ter um programa implicitamente (isto é, dividir as tarefas por ângulo de visão ao calcular seções transversais de radar).
2.) Nós meio que colocamos as pessoas na mistura aqui. Grande parte do código que temos é muito confuso, mas os cientistas costumam ser um bando disperso que não se importa com esse tipo de coisa. Não é o ideal, mas temos coisas para entregar e estamos com falta de pessoal. Estamos melhorando lentamente.
3.) Usamos SVN; no entanto, não temos software de rastreamento de bugs. O melhor que pode ser para nós é um arquivo txt que informa onde os bugs estão.
4.) Minha sugestão para implementar as melhores práticas para cientistas: faça isso devagar . Como cientistas, normalmente não enviamos produtos. Ninguém na ciência se destaca por ter um código limpo e sustentável . Eles obtêm reconhecimento dos resultados desse código, normalmente. Eles precisam ver a justificativa para gastar tempo aprendendo práticas de software. Lentamente, introduza novos conceitos e tente fazer com que os sigam; eles são cientistas, então depois que suas próprias evidências empíricas confirmarem a utilidade de coisas como controle de versão, eles começarão a usá-lo o tempo todo!
fonte
Eu recomendo fortemente a leitura de "O que todo cientista da computação deve saber sobre aritmética de ponto flutuante" . Muitos dos problemas que encontro regularmente vêm de problemas com a programação de ponto flutuante.
fonte
Sou um físico que trabalha na área de física da matéria condensada, construindo modelos clássicos e quânticos.
Línguas:
Bibliotecas:
Gráficos:
Ferramentas de desenvolvimento:
fonte
Eu trabalho como físico em uma universidade do Reino Unido.
Talvez eu deva enfatizar que diferentes áreas de pesquisa têm diferentes ênfases na programação. Físicos de partículas (como dmckee) fazem modelagem computacional quase exclusivamente e podem colaborar em grandes projetos de software, enquanto pessoas em campos como o meu (matéria condensada) escrevem código com pouca frequência. Suspeito que a maioria dos cientistas se enquadra no último campo. Eu diria que habilidades de codificação são geralmente vistas como úteis em física, mas não essenciais, assim como habilidades de física / matemática são vistas como úteis para programadores, mas não essenciais. Com isso em mente...
Normalmente, a análise e plotagem de dados são feitas usando pacotes de análise de dados genéricos, como IGOR Pro , ORIGIN , Kaleidegraph , que podem ser considerados 'Excel plus'. Esses pacotes geralmente têm uma linguagem de script que pode ser usada para automatizar. Uma análise mais especializada pode ter um utilitário dedicado para o trabalho que geralmente terá sido escrito há muito tempo, ninguém tem a fonte e é bastante problemático. Alguns tipos mais técnicos podem usar as linguagens que foram mencionadas (Python, R, MatLab com Gnuplot para plotagem).
O software de controle é comumente feito no LabVIEW, embora usemos Delphi, o que é um tanto incomum.
Já participei de seminários sobre computação em grade, visualização 3D, reforço de aprendizagem etc. ministrados pelas duas universidades em que estive. Na graduação, aprendemos VBA para Excel e MatLab, mas C / MatLab / LabVIEW é mais comum.
Não, embora as pessoas tenham configurações de desenvolvimento pessoal. Nossa base de código está em uma pasta compartilhada em um 'servidor' que é mantida atualizada com uma ferramenta de sincronização.
Um passo de cada vez! Estou tentando substituir a pasta compartilhada por algo um pouco mais sólido, talvez encontrar um cliente SVN que imita o comportamento das ferramentas de sincronização atuais ajude.
Eu diria que, no geral, para a maioria dos projetos de ciências naturais, o tempo é geralmente mais bem gasto em pesquisas!
fonte
Ex-físico acadêmico e agora físico industrial do Reino Unido aqui:
Quais linguagens / ambientes você usou para desenvolver software científico, esp. análise de dados? Quais bibliotecas? (Por exemplo, o que você usa para plotagem?)
Eu uso principalmente o MATLAB hoje em dia (fácil acesso às funções de visualização e matemática). Eu costumava usar muito Fortran e IDL . Usei C (mas sou mais leitor do que escritor de C), macros do Excel (feio e confuso). Atualmente, estou precisando ser capaz de ler Java e C ++ (mas não consigo programar neles) e também hackeei Python. Para meu próprio entretenimento, agora estou fazendo alguma programação em C # (principalmente para obter portabilidade / baixo custo / interfaces bonitas). Posso escrever Fortran com praticamente qualquer linguagem que me seja apresentada ;-)
Houve algum treinamento para pessoas sem qualquer experiência significativa em programação?
A maioria (todos?) Do curso de graduação em física terá um pequeno curso de programação, geralmente em C, Fortran ou MATLAB, mas é o básico real. Eu realmente gostaria de ter algum treinamento em engenharia de software em algum ponto (controle de revisão / teste / projeto de sistemas de média escala)
Você tinha algo como controle de versão, rastreamento de bugs?
Comecei a usar Subversion / TortoiseSVN relativamente recentemente. Grupos com os quais trabalhei no passado usaram controle de revisão. Não conheço nenhum grupo acadêmico que use software formal de rastreamento de bugs. Ainda não uso nenhum tipo de teste sistemático.
Como você tentaria criar um ambiente decente para a programação, sem atrapalhar os cientistas individualmente (especialmente os físicos são pessoas teimosas!)
Eu tentaria introduzir algumas idéias de engenharia de software em nível de graduação e então reforçá-las com a prática em nível de pós-graduação, também fornecer dicas para recursos como o curso de Carpintaria de Software mencionado acima.
Eu esperaria que uma fração significativa dos físicos acadêmicos estaria escrevendo software (não necessariamente todos) e eles precisam urgentemente de pelo menos uma introdução às idéias em engenharia de software.
fonte
Python, NumPy e pylab (plotagem).
Não, mas eu estava trabalhando em um laboratório de pesquisa multimídia, então quase todo mundo tinha formação em ciência da computação.
Sim, Subversion para controle de versão, Trac para rastreamento de bugs e wiki. Você pode obter hospedagem gratuita de controle de versão / bug tracker em http://www.assembla.com/ se o TOS deles se adequar ao seu projeto.
Certifique-se de que a infraestrutura esteja configurada e bem mantida e tente vender os benefícios do controle de origem.
fonte
Sou estatístico em uma universidade no Reino Unido. Geralmente as pessoas aqui usam R para análise de dados, é bastante fácil aprender se você conhece C / Perl. Seu verdadeiro poder está na maneira como você pode importar e modificar dados interativamente. É muito fácil pegar vários, digamos, arquivos CSV (ou Excel) e mesclá-los, criar novas colunas com base em outras e depois jogá-las em um GLM, GAM ou algum outro modelo. Plotar também é trivial e não requer conhecimento de uma linguagem totalmente nova (como PGPLOT ou GNUPLOT). Claro, você também tem a vantagem de ter um monte de recursos embutidos (desde coisas simples como média, desvio padrão, etc. o caminho para redes neurais, splines e plotagem GL.)
Dito isso, há alguns problemas. Com conjuntos de dados muito grandes, R pode se tornar muito lento (só vi isso com conjuntos de dados> 50.000 x 30) e, como é interpretado, você não obtém a vantagem do Fortran / C nesse aspecto. Mas, você pode (muito facilmente) fazer com que R chame as bibliotecas compartilhadas C e Fortran (de algo como netlib ou aquelas que você mesmo escreveu). Portanto, um fluxo de trabalho normal seria:
O que funciona muito bem para mim.
Eu sou uma das únicas pessoas em meu departamento (de> 100 pessoas) usando controle de versão (no meu caso usando git com githuib.com). Isso é bastante preocupante, mas eles simplesmente não parecem estar interessados em tentar e se contentam em distribuir arquivos zip (eca).
Minha sugestão seria continuar usando o LabView para a aquisição (e talvez tentando fazer seus colegas de trabalho concordarem sobre um conjunto de ferramentas para aquisição e disponibilização para todos) e, em seguida, passar a exportar os dados para um CSV (ou similar) e fazendo a análise em R. Realmente, há muito pouco sentido em reinventar a roda a esse respeito.
fonte
Quais linguagens / ambientes você usou para desenvolver software científico, esp. análise de dados? Quais bibliotecas? (Por exemplo, o que você usa para plotagem?)
Meu departamento de física de graduação ministrava aulas de LabVIEW e o usava extensivamente em seus projetos de pesquisa.
A outra alternativa é o MATLAB , no qual não tenho experiência. Existem campos para ambos os produtos; cada um tem suas próprias vantagens / desvantagens. Dependendo do tipo de problema que você precisa resolver, um pacote pode ser mais preferível do que o outro.
Com relação à análise de dados, você pode usar qualquer tipo de processador de números que desejar. Idealmente, você pode fazer os cálculos difíceis na linguagem X e formatar a saída para representar bem no Excel, Mathcad , Mathematica ou qualquer que seja o sistema de plotagem do tipo du jour. Não espere padronização aqui.
Você tinha algo como controle de versão, rastreamento de bugs?
Olhando para trás, não o fizemos, e teria sido mais fácil para todos nós se o fizéssemos. Nada como quebrar tudo e lutar por horas para consertar!
Definitivamente, use o controle de origem para qualquer código comum. Incentive as pessoas a escrever seu código de uma maneira que possa se tornar mais genérica. Na verdade, trata-se apenas de práticas recomendadas de codificação. Na verdade, você deve fazer com que eles ensinem (ou façam) aulas de ciência da computação para que possam aprender o básico.
Como você tentaria criar um ambiente decente para a programação, sem atrapalhar os cientistas individualmente (especialmente os físicos são pessoas teimosas!)
Há uma divisão clara entre aquisição de dados (DAQ) e análise de dados. Ou seja, é possível padronizar no DAQ e então permitir que os cientistas brinquem com os dados no programa de sua escolha.
fonte
Outra boa opção é o Scilab . Possui módulos gráficos à la LabVIEW , possui linguagem de programação própria e você também pode embutir código Fortran e C, por exemplo. Está sendo usado nos setores público e privado, incluindo grandes empresas industriais. E é grátis.
Sobre versionamento, alguns preferem Mercurial , pois dá mais liberdade de gerenciamento e definição de repositórios. Não tenho experiência com isso, no entanto.
Para plotagem, uso Matplotlib . Em breve terei que fazer animações e tenho visto bons resultados com o MEncoder . Aqui está um exemplo incluindo uma faixa de áudio.
Finalmente, sugiro ir modular, isto é, tentar manter as partes principais do código em arquivos diferentes, para que a revisão, compreensão, manutenção e melhoria do código sejam mais fáceis. Escrevi, por exemplo, um módulo Python para teste de integridade de arquivo, outro para sequências de processamento de imagem etc.
Você também deve considerar o desenvolvimento com o uso de um depurador que permite verificar o conteúdo da variável em pontos de interrupção configuráveis no código, em vez de usar linhas de impressão. Eu usei o Eclipse para Python e desenvolvimento em Fortran (embora eu tenha um erro falso ao compilar um programa curto em Fortran com ele, mas pode ter sido uma configuração ruim) e estou começando a usar o IDE Eric para Python. Ele permite que você depure, gerencie versões com SVN , tem um console embutido, pode fazer refatoração com o Bicycle Repair Man (pode usar outro também), você tem Unittest, etc. Uma alternativa mais leve para Python é o IDLE , incluído com Python desde a versão 2.3.
Como algumas dicas, também sugiro:
Não usando variáveis de um único caractere. Quando você deseja pesquisar aparências, obterá resultados em todos os lugares. Alguns argumentam que um IDE decente torna isso mais fácil, mas você dependerá de ter acesso permanente ao IDE. Mesmo usar ii, jj e kk podem ser suficientes, embora esta escolha dependa do seu idioma. (Vogais duplas seriam menos úteis se comentários de código fossem feitos em estoniano, por exemplo).
Comentando o código desde o início.
Para aplicativos críticos, às vezes é melhor contar com versões mais antigas de linguagem / compilador (versões principais), mais estáveis e com melhor depuração. Claro que você pode ter um código mais otimizado em versões posteriores, bugs corrigidos, etc, mas estou falando sobre o uso de Fortran 95 em vez de 2003, Python 2.5.4 em vez de 3.0 ou assim. (Especialmente quando uma nova versão quebra a compatibilidade com versões anteriores.) Muitas melhorias geralmente introduzem muitos bugs. Ainda assim, isso dependerá de casos de aplicação específicos! Observe que esta é uma escolha pessoal, muitas pessoas podem argumentar contra isso.
Use backup redundante e automatizado! (Com controle de versão).
fonte
Definitivamente, use o Subversion para manter cópias atuais, de trabalho em andamento e estáveis de instantâneos do código-fonte. Isso inclui C ++, Java etc. para ferramentas de software desenvolvidas internamente e scripts rápidos para processamento único.
Com a forte inclinação para a ciência e a engenharia aplicada em direção à metodologia de desenvolvimento do "cowboy solitário", a prática usual de organizar o repositório em trunk, tag e tudo o mais - não se preocupe! Os cientistas e seus técnicos de laboratório gostam de girar botões, mexer eletrodos e perseguir vazamentos de vácuo. É bastante trabalhoso fazer com que todos concordem, digamos Python / NumPy ou sigam alguma convenção de nomenclatura; esqueça de tentar fazê-los seguir práticas e convenções misteriosas de desenvolvedores de software.
fonte
Para gerenciamento de código-fonte, sistemas centralizados como Subversion são superiores para uso científico devido ao ponto único claro da verdade (SPOT). O registro de alterações e a capacidade de recuperar versões de qualquer arquivo, sem precisar procurar onde encontrar algo, tem enormes vantagens na manutenção de registros. Ferramentas como Git e Monotone : oh meu Deus, o caos que posso imaginar que se seguiria! Ter registros claros de qual versão dos scripts de hack-job foram usados enquanto brincava com o novo sensor quando aquele bóson de Higgs passou ou aquela supernova explodiu, levará à felicidade.
fonte
Idiomas que usei para assuntos numéricos e relacionados a ciências:
Meu editor é o Emacs, embora eu use o vim para coisas rápidas como editar arquivos de configuração.
Para plotagem, geralmente gero um arquivo de texto e o coloco no gnuplot.
Para análise de dados, geralmente gero um arquivo de texto e uso GNU R.
Vejo muitas pessoas aqui usando FORTRAN (principalmente 77, mas cerca de 90), muito Java e um pouco de Python. Eu não gosto deles, então não os uso.
Acho que isso não se aplica a mim, já que me formei em Ciência da Computação - mas onde trabalho não há formação formal, mas as pessoas (Engenheiros, Físicos, Matemáticos) ajudam uns aos outros.
O controle de versão é absolutamente importante! Eu mantenho meu código e dados em três máquinas diferentes, em dois lados diferentes do mundo - em repositórios Git. Eu os sincronizo o tempo todo (então tenho controle de versão e backups!) Não faço controle de bug, embora possa começar a fazer isso. Mas meus colegas não BTS ou VCS.
Primeiro, eu daria a eles o máximo de liberdade possível. (Na universidade onde trabalho, posso escolher entre instalar o Ubuntu ou o Windows ou o meu próprio sistema operacional - escolhi instalar o meu próprio. Não tenho suporte deles e sou responsável por tudo o que acontece com minhas máquinas, incluindo questões de segurança, mas faço o que quero com a máquina).
Em segundo lugar, veria a que eles estão acostumados e faria funcionar (precisa do FORTRAN? Vamos configurar. Precisa do C ++? Sem problemas. Mathematica? OK, vamos comprar uma licença). Em seguida, veja quantos deles gostariam de aprender "ferramentas adicionais" para ajudá-los a serem mais produtivos (não diga ferramentas "diferentes". Diga "adicionais", para que não pareça que alguém "perderá" ou "deixará vá "ou qualquer outra coisa). Comece com os editores, veja se há grupos que gostariam de usar o VCS para sincronizar seu trabalho (ei, você pode ficar em casa e enviar seu código pelo SVN ou GIT - não seria ótimo?) E assim por diante. Não imponha - mostre exemplos de como essas ferramentas são legais. Faça análises de dados usando R e mostre como foi fácil. Mostre bons gráficos e explique como você os criou (mas comece com exemplos simples,
fonte
Eu sugeriria o F # como um candidato potencial para realizar manipulações relacionadas à ciência, dados seus fortes laços semânticos com construções matemáticas.
Além disso, seu suporte para unidades de medida, conforme descrito aqui, faz muito sentido para garantir a tradução adequada entre o modelo matemático e o código-fonte de implementação.
fonte
Em primeiro lugar, eu definitivamente escolheria uma linguagem de script para evitar ter que explicar muitas coisas extras (por exemplo, gerenciamento de memória manual é - principalmente - ok se você estiver escrevendo coisas sensíveis ao desempenho de baixo nível, mas para alguém que apenas quer usar um computador como uma calculadora científica atualizada, é definitivamente um exagero). Além disso, verifique se há algo específico para o seu domínio (como R para estatísticas). Tem a vantagem de já trabalhar com os conceitos com os quais os utilizadores estão habituados e de dispor de código especializado para situações específicas (por exemplo, cálculo de desvios-padrão, aplicação de testes estatísticos, etc. no caso de R).
Se você deseja usar uma linguagem de script mais genérica, eu escolheria Python. Duas coisas que tem a seu favor são:
Como uma vantagem adicional, ele possui bibliotecas para a maioria das coisas que você gostaria de fazer com ele.
fonte
Não sou especialista nesta área, mas sempre entendi que é para isso que o MATLAB foi criado. Também existe uma maneira de integrar o MATLAB ao SVN para controle de origem .
fonte