Quelles sont les compétences fondamentales que chaque scientifique en informatique devrait posséder? [fermé]

52

Chaque scientifique doit en savoir un peu plus sur les statistiques: quelle est la corrélation, quel est l’intervalle de confiance, et ainsi de suite. De même, chaque scientifique devrait en savoir un peu plus sur l’informatique: la question est de savoir quoi. À quoi peut-on raisonnablement s'attendre de ce que tous les scientifiques en activité savent comment créer et utiliser un logiciel? Notre liste de compétences de base - ce que les gens doivent savoir avant de s’attaquer à quoi que ce soit avec "cloud" ou "peta" dans son nom - est:

  • programmation de base (boucles, conditions, listes, fonctions et entrées / sorties de fichiers)
  • le shell / script de base shell
  • contrôle de version
  • combien pour tester les programmes
  • SQL de base

Beaucoup de choses ne figurent pas dans cette liste: la programmation matricielle (MATLAB, NumPy, etc.), les feuilles de calcul bien utilisées, ils sont aussi puissants que la plupart des langages de programmation), les outils d'automatisation des tâches tels que Make, etc.

Alors: qu'y a-t-il sur votre liste? Que pensez-vous qu'il soit juste de s'attendre à ce que tous les scientifiques sachent ces temps-ci? Et que retireriez-vous de la liste ci-dessus pour faire de la place? Personne n'a assez de temps pour tout apprendre.

Greg Wilson
la source
1
Bonne question! Mais je ne comprends pas une chose: qu'entendez-vous par scientifique en informatique? Un scientifique qui utilise le calcul? Ou le groupe BEAUCOUP de personnes qui considéreraient leur titre professionnel comme "scientifique en informatique"?
David Ketcheson
9
Faire une liste de questions ne sont pas bonnes dans le format Stack Exchange. Devons-nous vraiment passer par ceci sur chaque site?
dmckee
4
@Dan Community Wiki n'est pas une excuse pour autoriser des questions qui n'appartiennent pas au site. Je voudrais aussi encourager ceux qui répondent à prendre l'exemple de Jed et au moins à essayer d'expliquer pourquoi vous auriez besoin de certaines compétences ou n'en avez pas besoin
Ivo Flipse le
5
@IvoFlipse: C'est une question qui appartient au site sous une forme ou une autre. Peut-être pas comme indiqué actuellement; Peut-être faut-il la diviser en petites questions et la reformuler, mais le problème de l'ingénierie logicielle médiocre en science informatique est extrêmement important, d'autant plus que la science informatique en tant que discipline en est encore à ses débuts. Cet article dans Nature indique pourquoi. Greg rend un excellent service à la communauté scientifique informatique par le biais de son site Web.
Geoff Oxberry
5
Je ne suis pas d'accord avec cette question étant fermée. S'il vous plaît voir (et voter sur) meta.scicomp.stackexchange.com/questions/179/…
David Ketcheson

Réponses:

46

"Scientifique informatique" est un peu large, car il inclut les personnes qui effectuent l'analyse numérique avec des implémentations papier / LaTeX et de démonstration, des personnes écrivant des bibliothèques à usage général, et des personnes développant des applications qui résolvent certaines classes de problèmes, ainsi que les utilisateurs finaux qui les utilisent. applications. Les compétences requises pour ces groupes sont différentes, mais il existe un grand avantage à être familiarisé avec le "full stack". Je vais décrire ce que je pense être les parties critiques de cette pile. Les personnes qui travaillent à ce niveau devraient bien sûr avoir une connaissance plus approfondie.

Connaissance du domaine (par exemple, physique et ingénierie)

Tout le monde devrait connaître les bases de la classe de problèmes qu’ils résolvent. Si vous travaillez sur des EDP, cela signifierait une connaissance générale de quelques classes d’EDP (par exemple, Poisson, élasticité et Navier-Stokes incompressible et compressible), en particulier quelles propriétés sont importantes pour capturer "exactement" et ce qui peut être jusqu’à discrétisation error (ceci informe le choix de la méthode concernant la conservation locale et les intégrateurs symplectiques). Vous devez connaître certaines fonctionnalités et types d’analyses présentant un intérêt pour les applications (optimisation de la levée et de la traînée, prévision des défaillances, inversion des paramètres, etc.).

Mathématiques

Tout le monde devrait avoir une connaissance générale des classes de méthodes pertinentes pour leur domaine de problèmes. Cela inclut les caractéristiques de base de l’algèbre linéaire dense et dense, la disponibilité de "méthodes rapides", les propriétés des techniques de discrétisation spatiale et temporelle et la manière d’évaluer les propriétés nécessaires à un problème physique pour qu’une technique de discrétisation soit appropriée. Si vous êtes principalement un utilisateur final, cette connaissance peut être de très haut niveau.

Génie logiciel et bibliothèques

Une certaine connaissance des techniques d'abstraction et de la conception des bibliothèques est utile pour presque tout le monde en informatique. Si vous travaillez sur des méthodes de preuve de concept, cela améliorera l'organisation de votre code (ce qui permettra à quelqu'un d'autre de le "traduire" plus facilement en une implémentation robuste). Si vous travaillez sur des applications scientifiques, cela rendra votre logiciel plus extensible et facilitera l’interface avec les bibliothèques. Soyez prudent lorsque vous développez du code, de sorte que les erreurs soient détectées le plus tôt possible et que les messages d'erreur soient aussi informatifs que possible.

Outils

Travailler avec des logiciels est une partie importante de la science informatique. La maîtrise de la langue de votre choix, la prise en charge de l'éditeur (balises, analyse statique, par exemple) et les outils de débogage (débogueur, valgrind) améliorent considérablement l'efficacité de votre développement. Si vous travaillez dans des environnements par lots, vous devez savoir comment soumettre des travaux et obtenir des sessions interactives. Si vous travaillez avec du code compilé, une connaissance pratique des compilateurs, des lieurs et des outils de construction tels que Make vous fera gagner beaucoup de temps. Le contrôle de version est essentiel pour tout le monde, même si vous travaillez seul. Apprenez Git ou Mercurial et utilisez-le pour chaque projet. Si vous développez des bibliothèques, vous devez connaître les normes de langage de manière assez complète pour que vous écriviez presque toujours du code portable dès la première fois, sinon vous serez enterré dans les demandes de support des utilisateurs lorsque votre code n’intègrera pas leur environnement funky.

Latex

LaTeX est le standard de facto pour la publication scientifique et la collaboration. La maîtrise de LaTeX est importante pour pouvoir communiquer vos résultats, collaborer sur des propositions, etc. La création de figures avec des scripts est également importante pour la reproductibilité et la provenance des données.

Jed Brown
la source
7
Je suis d'accord avec Jed. LaTeX est absolument nécessaire! :)
Paul
1
Je changerais "Physique et Ingénierie" en expertise en la matière. Après tout, nous ne sommes pas tous des physiciens ou des ingénieurs. L'esprit de cette partie de la réponse est au bon endroit, mais il y a une hypothèse assez flagrante.
Fomite
Merci @EpiGrad, je l'ai changé en "domaine de connaissance" avec ceux-ci à titre d'exemple.
Jed Brown
Bonne liste. Une compréhension de base des problèmes de performance devrait également y figurer. J'ai rencontré trop de personnes qui ne comprennent pas le concept simple de code de profilage. NB: performances doivent être considérées comme signifiant non seulement des problèmes de vitesse, mais également l'utilisation de la mémoire.
Faheem Mitha
Typos: "probelms" et "burried". SE ne me laisserait pas les réparer - une édition trop petite.
Faheem Mitha
26

Ma propre expérience est en informatique proprement dite, mes opinions peuvent donc être un peu biaisées. Cela dit, j'ajouterais "des algorithmes de base et des structures de données" à la liste. Ce que je veux dire par notions de base est essentiellement la recherche et le tri linéaires, ainsi que les structures de données telles que les arbres équilibrés, les tas ou les tables de hachage.

Pourquoi? Dans la plupart des algorithmes de calcul, vous passez un temps et des efforts extraordinaires à transférer des données et à ne rien calculer. Avez-vous déjà implémenté un code d'éléments finis? C'est environ 90% de l'organisation des données. La différence entre faire cela et le faire bien peut être un ordre de grandeur de l'efficacité de calcul.

J'ajouterais également un point mineur lié à l'informatique: une brève introduction sur le fonctionnement réel d'un processeur, ses atouts et ses inconvénients. Par exemple:

  • L'addition et la multiplication sont rapides, les fonctions de division ou transcendantales ne le sont pas. J'ai vu des hommes adultes remplacer une opération à racine carrée par quelque chose qui nécessitait trois divisions et penser qu'ils avaient fait quelque chose de grand (la division et la racine carrée sont tout aussi coûteuses).
  • Les caches de niveau 3 grossissent chaque année, mais le cache de niveau 0, c’est-à-dire le très rapide, n’a encore que quelques kilo-octets.
  • Les compilateurs ne sont pas magiques. Ils peuvent dérouler de petites boucles ou vectoriser des opérations extrêmement simples, mais ils ne transformeront pas ce tri en bulles rapides.
  • L'appel de méthodes sur des objets polymorphes avec plusieurs héritages dans votre boucle la plus interne peut s'avérer délicat sur le plan conceptuel, mais cela incitera votre CPU à se tuer.

C’est un travail fastidieux et ennuyeux, mais cela ne prend que quelques minutes, et le garder à l’esprit vous permettra d’écrire du bon code dès le départ ou de concevoir des algorithmes qui ne reposent pas sur des caractéristiques matérielles inexistantes.

En ce qui concerne ce qu'il faut supprimer de la liste, je pense que SQL est un peu trop pour les scientifiques en informatique. En outre, le test de logiciel est important, mais c'est une science en soi. Les tests unitaires et les types de données abstraits corrects doivent être enseignés avec la programmation de base, et ne nécessitent pas de programme de maîtrise de deux ans.

Pedro
la source
2
Pas ennuyeux du tout. Je prendrais un cours comme celui-là, si c'était proposé. :-)
Faheem Mitha le
18

J'ajouterai peut-être à cela plus tard, mais pour commencer, je supprimerais le "script shell" et le remplacerais spécifiquement par "le script Python". Python est beaucoup plus portable que les scripts shell et plus lisible que des langages shell et de script comparables. Sa vaste bibliothèque standard et sa popularité dans les sciences (à l'exception peut-être de la biologie, qui utilise également Perl) en font une excellente lingua franca computationnelle , sans oublier une bonne première langue pour l'apprentissage de la programmation. C'est maintenant la première langue enseignée aux majors EECS au MIT et elle est populaire sur le marché du travail, en particulier dans l'informatique scientifique. Sa documentation en ligne est exhaustive et de nombreux textes de programmation basés sur Python sont également disponibles en ligne.

En utilisant Python, vous pouvez enseigner des constructions de programmation de base, ainsi que des scripts. De plus, Python offre un excellent support pour les tests unitaires. Python pourrait donc également être utilisé pour enseigner les tests unitaires. Python possède également une API de base de données étendue (qui peut remplacer ou augmenter l'obligation d'apprendre le langage SQL), ainsi que quelques utilitaires de construction offrant des fonctionnalités similaires à Make. Personnellement, je préfère SCons à Make, car je trouve Python plus facile à documenter et à tester que les scripts shell.

En fin de compte, le principe de motivation derrière mon shilling flagrant pour Python est l’efficacité. Il est beaucoup plus facile de rationaliser votre flux de travail si vous pouvez effectuer la majeure partie de votre travail dans une seule langue ou un seul outil, notamment lorsque cet outil est un langage de script expressif. Bien sûr, je pourrais tout faire en C, mais mon programme serait 5 fois plus long et il est probable que je n’ai pas besoin de la vitesse. À la place, je peux utiliser Python pour importer des données à partir d'un fichier texte, les tracer, appeler des routines d'optimisation, générer des variables aléatoires, tracer mes résultats, écrire les résultats dans un fichier texte et tester mon code. Si Python est trop lent, il est possible d’envelopper Python dans du code C, C ++ ou Fortran qui s’occupe des tâches de calcul intensif. Python est, pour moi, un guichet unique pour la plupart de mes besoins en informatique scientifique.

Python n'est pas encore exactement MATLAB; SciPy et NumPy ont encore du chemin à faire en termes de fonctionnalités, mais en termes d’utilité générale, j’utilise Python pour une plus grande variété de tâches que MATLAB.

Geoff Oxberry
la source
7
Je ne peux pas m'empêcher d'être complètement en désaccord avec cela. Python est un casse-tête pour les mainteneurs de systèmes, car il s’agit d’une cible en mouvement. Les scientifiques en informatique devraient avoir une compréhension de base de bash ou de csh pour le collage le plus rudimentaire de choses et l'exécution de tâches sur les systèmes qu'ils sont susceptibles d'utiliser. Python est excellent, et je vous soutiens en préconisant que les informaticiens l’apprennent, mais pas au détriment d’une coquille rudimentaire.
Bill Barth le
7
@ BillBarth: Je pense que chaque scientifique en informatique doit apprendre le bash ou le csh de base pour des scripts très basiques. Si je préconise l’utilisation de Python pour les scripts shell au-delà de ces tâches de base, c’est parce que j’ai hérité d’un script bash de mille lignes qui exécute essentiellement un programme . Il transmet les fichiers sous forme de sémaphores, invoque à plusieurs reprises PBS, et il n’ya aucun moyen de le tester. Les scripts Shell sont parfaits pour les petites tâches, mais pas pour les grosses tâches, et ce cauchemar de ruban adhésif en toile et de bubblegum m'a coûté quelques années de ma thèse, raison pour laquelle j'insiste beaucoup.
Geoff Oxberry
2
Comme je l'ai dit, je ne suis pas en désaccord avec l'idée que "apprendre le python" pourrait être approprié pour la liste. Je ne veux tout simplement pas le faire au détriment du "script shell". Les deux sont importants, et personne ne vous laissera utiliser ipython en tant que shell, le script de shell est donc extrêmement important.
Bill Barth le
3
@ BillBarth: Je ne suggère nulle part que Python remplace la coque. Je suggère seulement que Python remplace bash pour le script; Je crois que si vous apprenez le bash basique, vous en savez assez pour écrire des scripts sans structures de contrôle, il n’est donc pas nécessaire d’explorer le "script bash". Dès que vous souhaitez inclure une structure de contrôle, vous devez passer à un autre langage, car la programmation en bash est un casse-tête pour les mainteneurs de logiciels et de bibliothèques.
Geoff Oxberry
1
+1 Python est mon principal langage de programmation depuis un certain temps. Ce n'est pas parfait, mais cela reste jusqu'à ce que quelqu'un invente le langage de programmation parfait.
Faheem Mitha
14

Calcul en virgule flottante. La plupart des sciences traitent des valeurs du monde réel, et les valeurs du monde réel sont souvent représentées comme des points flottants dans le monde de l'informatique. Il existe de nombreux pièges potentiels avec des flotteurs qui peuvent causer des ravages sur la signification des résultats.

La référence préférée pour ce sujet semble être "Ce que chaque informaticien devrait savoir sur l'arithmétique en virgule flottante (1991)" de David Goldberg http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768

Peter Recore
la source
1
Ce document a été mentionné à maintes reprises sur les forums en ligne. Mais c'est un article très long et dense, et je ne suis pas sûr du nombre de personnes qui ont réellement réussi à en retirer quelque chose d'utile.
johngreen
12

Un scientifique en informatique doit avoir une connaissance suffisante en informatique, en mathématiques et dans un domaine d'application en science / ingénierie. Je voudrais inclure des compétences dans chacun des domaines suivants:

Mathématiques:

  1. Analyse numérique
  2. Algèbre linéaire
  3. Équations différentielles ordinaires, partielles et / ou stochastiques
  4. Optimisation
  5. Statistiques et / ou probabilités
  6. Théorie Inverse

L'informatique:

  1. Algorithmes
  2. Structures de données
  3. Programmation parallèle (MPI, OpenMP, CUDA, etc.)
  4. Visualisation scientifique
  5. L'architecture des ordinateurs
  6. Utiliser un environnement Linux

Science / Ingénierie - dépend de l’application dans laquelle vous souhaitez vous spécialiser. Dans mon cas particulier (ingénierie), j’ajouterais des éléments tels que la mécanique du continuum, le transfert de chaleur, la dynamique des fluides, la méthode des éléments finis, etc. vous possédez de nombreux domaines scientifiques, plus vous êtes polyvalent en tant que scientifique en informatique.

Paul
la source
Pouvez-vous élaborer sur la "théorie inverse"?
Faheem Mitha
1
@FaheemMitha: Traditionnellement, nous définissons d'abord les paramètres d'un modèle (par exemple une équation différentielle partielle), puis observons le comportement du système. Un "problème inverse" fait l'inverse. Nous commençons par les observations de la sortie du système et essayons de déterminer les paramètres du modèle qui produit ces observations. La théorie inverse décrit les méthodes permettant d'accomplir cette tâche.
Paul
Merci pour l'explication. Avez-vous un bon lien / référence pour ce sujet?
Faheem Mitha le
2
en.wikipedia.org/wiki/Inverse_problem est un bon point de départ. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf a aussi une belle vue d'ensemble. Mais pour une compréhension plus approfondie, je recommanderais un livre comme amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Paul
4

Excellente question suivie de réponses fascinantes! Je voudrais ajouter un petit ajout. Autant que je sache (moi-même et par procuration), un outil Tout-en-un est généralement très utile. Un tel outil pourrait être MATLAB, Octave ou même Python (avec des bibliothèques). Chaque fois que vous rencontrez un problème dans votre "zone de confort", une bonne idée (pour autant que je sache et que je pense) serait de vous essayer à un outil Tout-en-un. Vous pouvez essayer d'écrire vos propres codes plus tard. L'avantage de tels forfaits est que la programmation n'interfère pas avec la compréhension de ce que vous faites.

Prenons un exemple d'infographie. L'écriture d'un code pour la traduction, la rotation ou la mise à l'échelle d'une figure correspond à 10 lignes de code dans MATLAB (tops), mais peut fonctionner pour des pages en C. Je ne dis pas que C n'est pas bon. Tout ce que je dis, c'est que si vous n'avez pas une bonne raison d'écrire des codes en C, MATLAB serait un moyen plus simple, meilleur et plus intuitif.

Certains peuvent être en désaccord et affirmer que la programmation de type C est un excellent moyen de renforcer l’intuition. Peut etre c'est. Mais lorsque vous n'avez pas à traiter un problème plus de quelques fois, il n'est guère justifié de s'asseoir et d'écrire vos propres codes dans une langue comme C.

Enquête
la source
-1

Bon sens et intuition… Ce dernier ne vient qu'avec le temps et après avoir «survécu» à deux expériences honteuses dans le grand monde.

GertVdE
la source
3
Je ne sais pas si "avoir des tripes" est vraiment une compétence. C'est plus simplement une réaction instinctive à l'expérience précédente.
naught101