Prioridades para aprender métodos computacionais, quando devo escrever meu próprio código x usar bibliotecas como um estudante de graduação iniciante?

10

Estou iniciando meus estudos de pós-graduação em engenharia e trabalhando em projetos de ciências computacionais. Percebi que houve alguma discussão sobre as vantagens e desvantagens de implementar seus próprios algoritmos aqui . A análise de custo-benefício da implementação de seus próprios algoritmos versus o uso de bibliotecas é diferente quando você é um estudante de graduação iniciante?

Godric Seer
fonte
2
Eu tive uma resposta longa, mas depois de alguma discussão com outro mod, decidi excluí-lo e pedir esclarecimentos sobre sua pergunta. Qual é o ponto principal da sua pergunta? É "onde enfatizo meu aprendizado?", "Como você recomendaria priorizar o aprendizado versus modelar o progresso?", "Escolher bibliotecas em vez de códigos auto-implementados dependeria dos problemas que estão sendo resolvidos?" Ou "Quais são os benefícios / desvantagens de codificar meus próprios algoritmos em um estágio muito anterior da minha carreira? ". Minha resposta foi muito ampla e seria melhor fornecer uma resposta focada a uma pergunta mais focada.
Geoff Oxberry
Adicionei a seção em negrito para esclarecer exatamente o que estava perguntando, mas deixei o resto intacto. Se você achar que alguma das outras peças deve ser removida, fique à vontade.
Godric Seer
Obrigado. Vou fazer algumas edições para focar a pergunta e depois postar uma resposta.
Geoff Oxberry

Respostas:

10

Na minha opinião, ser um estudante de graduação iniciante não altera a resposta de David Ketcheson aqui para a pergunta que você vinculou em sua postagem.

Codifique versões mínimas de algoritmos que você deseja aprender. Em seguida, reserve-os. A codificação de seus próprios algoritmos é mais útil para o aprendizado, mas para o código de pesquisa (ou produção), a menos que seus objetivos de pesquisa sejam escrever um software que melhore as bibliotecas de ponta existentes (se houver), você ' é melhor usar bibliotecas. É provável que as bibliotecas sejam melhor documentadas, mais escalonáveis ​​e mais robustas do que o que você codifica, a menos que seja (ou se torne) realmente bom em codificação. Além disso, é provável que as bibliotecas sejam testadas e depuradas para você (embora, é claro, isso dependa de quem escreveu a biblioteca ...). Você será responsável por apoiar, depurar e testar qualquer código que escrever para sua tese e, para economizar tempo, isso ajuda a minimizar a quantidade de código que você precisa escrever.

Os únicos outros cenários em que consigo pensar (ou seja, podem haver outros) são:

  • Não existem bibliotecas disponíveis que ofereçam os recursos necessários. Considere contribuir com as bibliotecas de código aberto existentes ou escrever sua própria biblioteca de código aberto, para que outras pessoas possam se beneficiar.
  • Você precisa de desempenho adicional e pode aproveitar a estrutura especial de problemas para obtê-lo. Em seguida, documente e modifique uma biblioteca existente ou escreva você mesmo uma implementação de desempenho superior.
  • Um supervisor insiste em que você crie seu próprio software. Bem, você está por sua conta, mas sugiro mencionar os pontos acima para tentar convencê-los de que seria melhor usar bibliotecas (se isso for possível na sua situação).
Geoff Oxberry
fonte
10

Eu gostaria de dar um pouco mais de profundidade à resposta pensativa de Geoff . Em particular, quero lhe dar um pouco mais de perspectiva sobre o valor dos seus esforços de programação, em oposição aos seus esforços de pesquisa no início de sua carreira como acadêmico.

Você descobrirá que ser capaz de escrever um software para aumentar sua pesquisa científica fará de você um membro valioso de quase qualquer equipe de pesquisa. No entanto, esse tempo não será necessariamente considerado "valioso" por seus colegas acadêmicos ou por aqueles que estão contratando cargos acadêmicos.

De uma pesquisa de 2011 realizada em Princeton, "Uma pesquisa sobre a prática da ciência computacional" :

Os cientistas gastam uma quantidade substancial de programação em tempo de pesquisa. Em média, os cientistas estimam que 35% de seu tempo de pesquisa é gasto em programação / desenvolvimento de software. Embora inicialmente seja gasto algum tempo na redação do código, uma parte considerável é gasta em muitas atividades tediosas. Por exemplo, pesquisadores de Política e Sociologia que usaram o R / Stata tiveram que fazer uma programação considerável para adaptar os dados do censo em formatos que os pacotes individuais no R / Stata entendessem. Alguns pesquisadores em Engenharia Química tiveram que fazer engenharia reversa de código legado não documentado que executava simulação de chama, muito tempo após a conclusão dos autores originais, para adaptar o código a combustíveis mais novos ... Apesar disso, uma grande maioria desses pesquisadores considerou que "eles gastam mais tempo programando do que deveriam ",

Isso não significa que não é uma boa ideia implementar ou redesenhar uma biblioteca ou aplicativos principais, mas se você estiver envolvido em algum desenvolvimento sério de software (mais de 25% do seu tempo trabalhando com código), mantenha esses três pensamentos em mente.

  • A complexidade e o risco crescem exponencialmente com o tamanho do projeto e o número de desenvolvedores. Até que você tenha escrito ou trabalhado com partes maiores de software ou equipes de desenvolvedores que se estendem além do seu laboratório, será difícil obter uma boa apreciação disso e prever o esforço adequado.

  • Você precisa ser bom. É preciso uma certa maturidade, tanto como programador quanto como cientista de aplicativos, para escrever software útil. Você precisa saber quais são os recursos importantes, onde estão os riscos numéricos e ser capaz de prever o esforço de programação para um determinado conjunto de recursos e robustez. Obviamente, a única maneira de melhorar é gastar tempo em projetos nos quais você não é o líder ou que pode falhar ou atrasar com segurança, o que me leva ao meu ponto final.

  • Embora muitos laboratórios de pesquisa e posições industriais valorizem muito a experiência em programação, a programação científica pode atuar como um prejuízo potencial para sua carreira acadêmica, mesmo que seu software beneficie mais a ciência do que seus trabalhos. Todo esse tempo você gasta aprendendo a programar bem, programando, documentando seu código e tornando-o robusto, traduz-se em documentos que não estão sendo escritos. Um orientador nem sempre terá os melhores interesses do aluno em mente aqui, pois esse é um daqueles casos em que o aluno pode fornecer um trabalho que beneficia o grupo do orientador sem beneficiar a contagem de citações do aluno. Procure um ou mais mentores confiáveis ​​no campo em que você está interessado e verifique se você tem um entendimento claro de quais contribuições são consideradas valiosas. academia.stackexchange.com é um excelente lugar para fazer uma pergunta de acompanhamento sobre isso.


Como nota de rodapé: o número de projetos de esforço individual que avançam significativamente em qualquer campo computacional está diminuindo constantemente, seja uma área de aplicação ou algo mais técnico, como álgebra linear densa. Um número crescente de pacotes de software que formam o "pão com manteiga" da pesquisa computacional tem 10 anos ou mais. O código científico que não atingiu esse nível de maturidade tende a ter mais erros, menos recursos e documentação esparsa. Tente evitar trabalhar com código imaturo que não é suportado ativamente, independentemente da idade.

Aron Ahmadia
fonte
Eu já estava preocupado com minha contagem de papéis. Como serei o aluno de computação de um grande conjunto de alunos experimentais, é provável que tenha muitas 2ª e 3ª autorias. Também é provável que eu só esteja combinando programas diferentes no início (código 0D do meu laboratório, código 2D de outra universidade, software Meshing de outro laboratório da minha universidade). Definitivamente, há muito o que pensar sobre isso.
Godric Seer
6

Acho que a análise de custo-benefício depende da alfabetização científica em computação desejada que você deseja obter durante seus estudos.

Para a maioria dos cientistas que trabalham com computadores proficientes em computação científica é suficiente, isso requer: um entendimento de alto nível (abstrato) dos principais algoritmos utilizados e habilidades de programação que permitem o uso eficaz de bibliotecas de software (criação de software, vinculação, uso de mailing lists).

Por outro lado, se você planeja se tornar um especialista no campo da computação científica, precisará de um profundo conhecimento de métodos numéricos, aritmética de ponto flutuante e tecnologia de computação. Você pode aprender a teoria desses tópicos nos livros, mas é necessário ter experiência na prática para criar e manter habilidades avançadas. Portanto, pode ser uma ótima idéia programar tudo o que você usa enquanto aprende (por exemplo, se você deseja cozinhar como um chef: você aprende comendo o que cozinha e cozinha frequentemente!)

Qual é o nível correto de proficiência depende da sua carreira. Veja qual nível de habilidades é usado pelas pessoas que trabalham em seu campo.

fcruz
fonte