Priorités pour l'apprentissage des méthodes de calcul, quand dois-je écrire mon propre code par rapport à l'utilisation des bibliothèques en tant qu'étudiant diplômé débutant?

10

Je commence mes études supérieures en génie et je travaillerai sur des projets de science informatique. J'ai remarqué qu'il y a eu des discussions sur les avantages et les inconvénients de la mise en œuvre de vos propres algorithmes ici . L'analyse coûts-avantages de la mise en œuvre de vos propres algorithmes par rapport à l'utilisation de bibliothèques est-elle différente lorsque vous êtes un étudiant diplômé débutant?

Godric Seer
la source
2
J'avais une longue réponse, mais après une discussion avec un autre mod, j'ai décidé de le supprimer et de demander des éclaircissements sur votre question. Quel est le point principal de votre question? Est-ce "où mettre l'accent sur mon apprentissage?", "Comment recommanderiez-vous de prioriser l'apprentissage par rapport à la progression de la modélisation?", "Le choix des bibliothèques plutôt que des codes auto-implémentés dépendrait des problèmes à résoudre?", Ou "Quels sont les avantages / les inconvénients de coder mes propres algorithmes à un stade beaucoup plus précoce de ma carrière? ". Ma réponse était trop large et il vaudrait mieux vous donner une réponse ciblée à une question plus ciblée.
Geoff Oxberry
J'ai ajouté la section en gras pour clarifier exactement ce que je demandais, mais j'ai laissé le reste intact. Si vous pensez que l'une des autres pièces doit être retirée, n'hésitez pas.
Godric Seer
Je vous remercie. Je vais apporter quelques modifications pour cibler la question, puis poster une réponse.
Geoff Oxberry

Réponses:

10

À mon avis, être un étudiant débutant ne change pas la réponse de David Ketcheson ici à la question que vous avez liée dans votre message.

Codez les versions minimales des algorithmes que vous souhaitez apprendre. Mettez-les ensuite de côté. Le codage de vos propres algorithmes est le plus utile pour l'apprentissage, mais pour le code de recherche (ou de production), à moins que vos objectifs de recherche ne soient d'écrire des logiciels qui améliorent les bibliothèques de pointe (s'il en existe même), vous '' mieux vaut utiliser des bibliothèques. Les bibliothèques sont susceptibles d'être mieux documentées, plus évolutives et plus robustes que ce que vous codez vous-même, sauf si vous êtes (ou devenez) vraiment bon en codage. De plus, les bibliothèques sont susceptibles d'être testées et déboguées pour vous (bien sûr, cela dépend de qui a écrit la bibliothèque ...). Vous serez responsable du support, du débogage et du test de tout code que vous écrivez pour votre thèse, et pour gagner du temps, cela aide à minimiser la quantité de code que vous devez écrire.

Les seuls autres scénarios auxquels je peux penser (c'est-à-dire qu'il peut y en avoir d'autres) sont:

  • Il n'y a aucune bibliothèque qui offre les fonctionnalités dont vous avez besoin. Envisagez de contribuer aux bibliothèques open source existantes ou d'écrire votre propre bibliothèque open source, afin que d'autres puissent en bénéficier.
  • Vous avez besoin de performances supplémentaires et pouvez tirer parti d'une structure de problème spéciale pour l'obtenir. Ensuite, documentez et modifiez une bibliothèque existante ou écrivez vous-même une implémentation plus performante.
  • Un superviseur insiste pour que vous lanciez votre propre logiciel. Eh bien, vous êtes seul, mais je suggère d'évoquer les points ci-dessus pour essayer de les convaincre que vous feriez mieux d'utiliser des bibliothèques (si cela est possible dans votre situation).
Geoff Oxberry
la source
10

Je voudrais donner un peu plus d'ampleur à la réponse réfléchie de Geoff . En particulier, je veux vous donner un peu plus de perspective sur la valeur de vos efforts de programmation par opposition à vos efforts de recherche au début de votre carrière universitaire.

Vous constaterez qu'être capable d'écrire des logiciels pour augmenter votre recherche scientifique fera de vous un membre précieux de presque n'importe quelle équipe de recherche. Cependant, ce temps ne sera pas nécessairement considéré comme «précieux» par vos pairs universitaires ou ceux qui embauchent pour des postes universitaires.

À partir d'une enquête de recherche menée en 2011 à Princeton, «A Survey of the Practice of Computational Science» :

Les scientifiques consacrent beaucoup de temps à la programmation. En moyenne, les scientifiques estiment que 35% de leur temps de recherche est consacré à la programmation / développement de logiciels. Bien qu'au départ, un certain temps soit consacré à l'écriture de code, une partie considérable du temps est consacrée à de nombreuses activités fastidieuses. Par exemple, les chercheurs en politique et sociologie qui ont utilisé R / Stata ont dû effectuer une programmation considérable pour moderniser les données du recensement dans des formats que les packages individuels dans R / Stata comprenaient. Certains chercheurs en génie chimique ont dû procéder à une ingénierie inverse du code hérité non documenté qui effectuait une simulation de flamme, longtemps après que les auteurs originaux aient obtenu leur diplôme, afin d'adapter le code à des carburants plus récents ... Malgré cela, une grande majorité de ces chercheurs ont estimé "qu'ils passer plus de temps à programmer qu'ils ne le devraient "

Cela ne signifie pas que ce n'est pas une bonne idée d'implémenter ou de repenser une bibliothèque ou des applications de base, mais si vous allez vous lancer dans un développement logiciel sérieux (plus de 25% de votre temps à travailler avec du code), conservez ces trois pensées à l'esprit.

  • La complexité et le risque augmentent de façon exponentielle avec la taille du projet et le nombre de développeurs. Jusqu'à ce que vous ayez écrit ou travaillé avec des logiciels plus importants ou des équipes de développeurs qui s'étendent au-delà de votre laboratoire, il vous sera difficile d'acquérir une bonne appréciation de cela et de prévoir correctement les efforts.

  • Vous devez être bon. Il faut une certaine maturité, à la fois en tant que programmeur et en tant que scientifique d'application, pour écrire des logiciels utiles. Vous devez savoir quelles sont les fonctionnalités importantes, où sont les risques numériques et être capable de prévoir l'effort de programmation pour un ensemble de fonctionnalités et de robustesse donné. Bien sûr, la seule façon de réussir est de passer du temps sur des projets dont vous n'êtes pas le chef de file ou qui peuvent échouer ou être retardés en toute sécurité, ce qui m'amène à mon dernier point.

  • Bien que de nombreux laboratoires de recherche et postes industriels accordent une grande valeur à l'expérience en programmation, la programmation scientifique peut nuire potentiellement à votre carrière universitaire, même si votre logiciel profite davantage à la science que vos articles. Tout ce temps que vous passez à apprendre à bien programmer, à programmer, à documenter votre code et à le rendre robuste se traduit par des articles qui ne sont pas en cours d'écriture. Un conseiller n'aura pas toujours à l'esprit les meilleurs intérêts de son élève ici, car c'est l'un de ces cas où l'étudiant peut fournir un travail qui profite au groupe du conseiller sans bénéficier du décompte des citations de l'étudiant. Recherchez un ou plusieurs mentors de confiance dans le domaine qui vous intéresse et assurez-vous de bien comprendre quelles contributions sont considérées comme précieuses. academia.stackexchange.com est un excellent endroit pour poser une question complémentaire à ce sujet.


En tant que note de bas de page: le nombre de projets d'effort d'un seul homme qui font progresser de manière significative n'importe quel domaine de calcul diminue régulièrement, qu'il s'agisse d'un domaine d'application ou de quelque chose de plus technique comme l'algèbre linéaire dense. Un nombre croissant de progiciels qui constituent le "pain et le beurre" de la recherche informatique ont 10 ans ou plus. Le code scientifique qui n'a pas atteint ce niveau de maturité a tendance à avoir plus de bogues, moins de fonctionnalités et une documentation clairsemée. Essayez d'éviter de travailler avec du code immature qui n'est pas activement pris en charge, quel que soit son âge.

Aron Ahmadia
la source
Je m'étais déjà inquiété de mon nombre de papiers. Étant donné que je serai l'étudiant en calcul pour un grand nombre d'étudiants expérimentaux, il est probable que j'aurai de nombreux 2e et 3e auteurs. Il est également probable que je ne combinerai que différents programmes au début (code 0D de mon laboratoire, code 2D d'une autre université, logiciel de maillage d'un autre laboratoire de mon université). Certainement beaucoup de choses à penser.
Godric Seer
6

Je pense que l'analyse coûts-avantages dépend de la compétence en informatique scientifique souhaitée que vous souhaitez atteindre au cours de vos études.

Pour la plupart des scientifiques qui travaillent avec des ordinateurs, la maîtrise de l'informatique scientifique suffit, cela nécessite: une compréhension de haut niveau (abstraite) des principaux algorithmes utilisés et des compétences en programmation qui vous permettent d'utiliser efficacement les bibliothèques de logiciels (création de logiciels, liaison, utilisation listes de diffusion).

En revanche, si vous prévoyez de devenir un expert dans le domaine du calcul scientifique, vous aurez besoin d'une compréhension approfondie des méthodes numériques, de l'arithmétique à virgule flottante et de la technologie informatique. Vous pouvez apprendre la théorie de ces sujets à partir de livres, mais une expérience par la pratique est nécessaire pour développer et maintenir des compétences avancées. Par conséquent, ce pourrait être une bonne idée de programmer tout ce que vous utilisez pendant que vous apprenez (par exemple si vous voulez cuisiner comme un chef: vous apprenez en mangeant ce que vous cuisinez et en cuisinant souvent!)

Le niveau de compétence correct dépend de votre carrière. Découvrez le niveau de compétences utilisé par les travailleurs de votre domaine.

fcruz
la source