Quelle langue dois-je utiliser lors de l'enseignement d'un cours de premier cycle en programmation informatique?

22

Aller enseigner aux étudiants de premier cycle un cours intitulé Introduction à la programmation informatique. Je suis un peu confus. En physique computationnelle, les scientifiques utilisent C / C ++ ou Python ou Fortran, CUDA etc ..... il est temps de construire leur base. Que dois-je utiliser? Je sais que vous pouvez apprendre un nouveau langage de programmation à tout moment de votre vie, mais c'est un choix plus sage pour moi de les élaborer tous les concepts de programmation de base et les concepts de POO plus tard.

Afnan Bashir
la source
9
@ k20: J'espère que votre suggestion était ironique; sinon ce serait une grave violation de l'éthique académique.
Christian Clason
6
@ k20: Tout cela est hors sujet, mais choisir un logiciel basé sur des pots-de-vin (de toute nature) pour l'enseignant et non sur le contenu à enseigner est définitivement contraire à l'éthique. (Juste pour être clair, c'est le «butin» auquel je m'oppose.) Ce qui est généralement fait, c'est que les entreprises mettent à disposition des logiciels à un coût considérablement réduit (ou gratuitement).
Christian Clason
3
@ k20: Gardez également à l'esprit que la motivation de la société de logiciels n'est pas entièrement altruiste: vos étudiants peuvent obtenir le logiciel gratuitement maintenant, mais il est également probable qu'ils doivent acheter le logiciel plus tard dans leur vie (ou apprendre une nouvelle Logiciel).
Wrzlprmft
3
@ k20 Matlab et Mathematica ne sont pas vraiment utilisés pour des calculs scientifiques sérieux. Ce sont des outils plus exploratoires pour tester des idées. Si le but du cours est d'enseigner des algorithmes de base, ceux-ci pourraient convenir (en particulier Matlab), mais s'il s'agit de programmation générale, alors vous voulez utiliser un langage de programmation plus général comme Python de C ++.
Truman Ellis
2
MATLAB a un design (si je n'étais pas diplomate je dirais imparfait :)) qui nécessite ce qui dans d'autres langues sont de mauvaises pratiques. Beaucoup d'autres choses sont simplement différentes de toute autre chose, donc "sortir" peut être difficile. Mathematica a, à mon avis, un beau design, mais il ne ressemble à aucune autre langue (sauf peut-être le lisp, mais il n'est pas utilisé en science), donc ce que vous avez appris est surtout inutile d'apprendre une autre langue. OTOH, aller C <-> Python est beaucoup plus facile.
Davidmh

Réponses:

32

Tout d'abord, si vos étudiants de premier cycle sont comme les nôtres et n'ont eu aucune introduction préalable aux ordinateurs, attendez-vous à leur enseigner comment utiliser des trucs de base comme utiliser un éditeur approprié (c'est-à-dire pas MS Word), la ligne de commande, etc.

Je pense que la réponse dépend quelque peu de l'endroit où vous définissez l'objectif de votre cours (ou de ce que vous devez enseigner). Par exemple: Quelle est la pertinence du fonctionnement interne de l'ordinateur? Avez-vous besoin de classes et d'autres structures OOP avancées? Voulez-vous leur apprendre à produire des programmes efficaces ou êtes-vous heureux s’ils produisent des programmes de travail? N'oubliez pas non plus que vous aurez probablement besoin de tuteurs compétents.

Mais maintenant, quelque chose aux avantages et aux inconvénients des langues, je connais bien. Notez que cela provient principalement de mon expérience en tant que physicien informatique et que cela peut dépendre du domaine particulier, du groupe de travail, de l'université, etc.

Python

Je recommande généralement d'utiliser Numpy depuis presque le tout début et je suppose qu'il sera utilisé dans ce qui suit.

Avantages:

  • C'est facile à apprendre, tout comme le code des autres (par exemple, votre exemple de code, mais aussi le code des étudiants pour les tuteurs).
  • L'entrée et la sortie (qui ne devraient pas être au centre de votre cours) peuvent être entièrement couvertes par print, Numpy savetxtet loadtxt, et peut-être sys.argv. Il peut être introduit à la volée et ne consomme pas beaucoup de temps de programmation.
  • Vous n'avez pas besoin de traiter ou avez seulement besoin de traiter peu de détails tels que la représentation des nombres, la gestion de la mémoire, les types de données. Ainsi, la programmation est rapide et vous pouvez vous concentrer sur les algorithmes réels.
  • Ce n'est pas une langue compilée. Cela présente deux avantages: les étudiants n'ont pas besoin de traiter avec un compilateur et les étudiants peuvent tester des éléments directement dans la console sans avoir à compiler, redémarrer et réexécuter le programme. De même, le débogage est plus facile.
  • Il existe des bibliothèques faciles à utiliser pour presque tout.
  • Vous n'avez pas besoin d'apprendre des langages de script supplémentaires comme les scripts shell, Make, Gnuplot et ainsi de suite - tout cela peut être fait à partir de Python.
  • Il y a beaucoup de bons tutoriels (gratuits).

Désavantages:

  • Ce n'est pas compilé. Par conséquent, les programmes Python peuvent être considérablement plus lents que les programmes compilés dans certains cas pertinents pour la physique informatique. Dans d'autres cas, cependant, les bibliothèques (en particulier Numpy) peuvent fournir des performances comparables. Une autre façon, pour obtenir de bonnes performances avec Python, est d'écrire les extraits de code pertinents dans une autre langue comme C¹. Évidemment, vous devez apprendre cette langue pour cela, mais cela peut être fait plus tard et votre temps d'apprentissage de Python n'est pas perdu.
  • Il est plus difficile d'enseigner des détails tels que la représentation des nombres, la gestion de la mémoire, les types de données et leurs pièges, car ils sont quelque peu obscurcis.

C / C ++

Avantages:

  • Il est compilé et il est donc plus facile de produire du code efficace.
  • Vous vous occupez directement de la représentation des nombres, de la gestion de la mémoire, des types de données et il est donc plus intuitif de les enseigner - vos élèves se rapprocheront de ce qui se passe réellement dans leur ordinateur.
  • Il y a des bibliothèques pour pratiquement tout, mais comprendre et utiliser une bibliothèque demande du travail.
  • Il y a une quantité pertinente de code existant en C / C ++ et donc les étudiants doivent apprendre la langue s'ils veulent travailler avec ce code.
  • Si vous connaissez déjà C / C ++, vous pouvez apprendre Python (par exemple) très rapidement.

Désavantages:

  • Il est compilé et vos élèves doivent gérer le compilateur, le préprocesseur, les en-têtes, etc. Vous seriez surpris de voir combien les étudiants échouent à cette étape, même à la fin du semestre.
  • Il est également plus lent à apprendre et il faut plus de temps pour produire du code de travail.
  • Traiter des choses marginales telles que les entrées et les sorties prend un certain temps aussi bien dans l'enseignement que dans la programmation. En C ++, il existe une syntaxe supplémentaire pour l'entrée et la sortie.
  • Dépendances du compilateur et du système d'exploitation.
  • Vous devez faire face à la confusion C / C ++.
  • La lecture du code des autres, en particulier en C ++, peut être assez difficile en raison de la grande quantité de fonctionnalités de syntaxe.

Les principaux avantages de C ++ sur C (cours, modèles) ne devraient pas être pertinents pour votre cours et ne le sont que pour des projets plus importants. Par conséquent, je choisirais C des deux, car il est plus concis.

Autres

Quelques commentaires sur les autres langues:

  • Fortran: Ceci est encore utilisé par de nombreux groupes et il existe beaucoup de code hérité, mais vous ne pouvez pas contourner les anciennes normes et leurs énormes limitations et pièges (beaucoup de gens travaillent toujours avec Fortran 77). En outre, il sera beaucoup plus difficile de trouver des didacticiels, de l'aide sur Internet, etc.
  • Matlab / Mathematica: Tous les problèmes des logiciels propriétaires. Considérez en particulier que vos élèves sont susceptibles de collaborer avec des personnes qui n'ont pas accès à ce logiciel et les problèmes qui en découlent.
  • Cuda: Ceci n'est pertinent que pour certains problèmes, si les performances sont importantes. De plus, après tout ce que je sais, vous ne voulez pas apprendre la programmation de cette façon.

¹ Quel est le flux de travail standard au moins dans notre groupe.

Wrzlprmft
la source
Réponse très précise
Afnan Bashir
1
Je voudrais également dire que l'un des bonus non mentionnés de Python est qu'il existe un certain nombre de distributions scientifiques (Anaconda / Enthought / PythonXY / SAGE) qui facilitent vraiment le processus de mise en place de tout le monde dans la même page informatique. En outre, les approches basées sur le Web (Wakari et SAGE) sont encore plus intéressantes qui fournissent tout cela via un navigateur aka 0 logiciel installé. L'enseignement du premier cycle c ++ ou Fortran entraînera plus de temps perdu à combattre un compilateur que le temps gagné en vitesse de code.
meawoppl
Il existe un écosystème incroyable en python pour la physique informatique. Numpy, scipy pour fournir une infrastructure de base, mayavi, tvtk pour les visualisations. Python est assez mature dans la communauté informatique scientifique. J'utilise C ++ en production mais peu importe ce que c'est pénible à utiliser.
Sai Venkat
@meawoppl: "L'enseignement du premier cycle c ++ ou Fortran entraînera plus de temps perdu à combattre un compilateur que le temps gagné en vitesse de code." - Ce n'est pas la vitesse de code des exercices pour le cours qui compte (les programmes seront très rapides dans les deux cas, à moins que les exercices ne soient spécifiquement conçus de telle sorte qu'ils ne le soient pas), mais la vitesse du code des programmes qu'ils écriront pour la vie réelle ou similaire. Et il y a des choses qui ne peuvent tout simplement pas être faites efficacement en Python uniquement.
Wrzlprmft
1
Je dirais que CUDA est hors de question pour un cours à usage général, car il nécessite du matériel que tout le monde n'a pas. Et si vous n'avez qu'un ordinateur portable sans lui, vous ne pouvez presque pas en installer un.
Davidmh
22

En 2014, j'aurais dit Python. En 2017, je crois de tout cœur que la langue pour enseigner aux étudiants de premier cycle est Julia.

L'enseignement est toujours un compromis. D'une part, vous voulez choisir quelque chose de suffisamment simple pour être facile à saisir. Mais deuxièmement, vous voulez enseigner quelque chose qui a du pouvoir, c'est-à-dire quelque chose qui peut grandir avec vous. Les langages dynamiques courants (Python / MATLAB / R) tombent tous facilement dans la catégorie 1 en raison de leur code passe-partout inexistant et de la facilité d'ouvrir un interprète et de cracher du code, tandis que C / C ++ / Fortran entrent dans la deuxième catégorie en tant que les langues avec lesquelles les principaux logiciels hautement performants du monde d'aujourd'hui ont été écrits.

Mais il y a des problèmes avec l'utilisation d'une langue qui ne capture pas complètement l'autre catégorie. Lorsque vous utilisez un langage comme Python, il résume bien des choses comme les types et le débordement d'entier. C'est bien pour enseigner l'informatique du premier semestre, mais comme vous voulez approfondir de plus en plus comment les choses fonctionnent réellement, le langage de Python est trop éloigné du métal sous-jacent pour être un bon outil d'enseignement. Mais C / C ++ / Fortran (ou Java ... j'ai d'abord appris Java ...) ont tous un coût de démarrage si élevé que la chose la plus difficile à apprendre est simplement de savoir comment configurer et maincompiler les en- têtes , ce qui distrait de l'apprentissage du programme .

Entrez Julia. Lorsque vous utilisez Julia pour la première fois, vous pouvez résumer l'idée des types et l'utiliser comme MATLAB ou Python. Mais comme vous voulez en savoir plus, il y a un "trou de lapin" de profondeur dans la langue. Puisqu'il s'agit vraiment d'une couche d'abstraction basée sur un système de type + plusieurs répartitions sur LLVM, c'est essentiellement "un moyen facile d'écrire du code compilé statiquement" (et les fonctions stables de type peuvent en fait être compilées statiquement). Cela signifie que les détails de C / C ++ sont également accessibles. Vous pouvez apprendre à écrire des boucles et des fonctions simples sans code passe-partout, puis à creuser dans les pointeurs de fonction. Les fonctionnalités de métaprogrammation de Julia vous permettent d'accéder directement à l'AST, et il existe des macros qui montrent chaque partie de la chaîne de compilation. En outre, en tant que Lisp, se prête à des styles de programmation fonctionnels. Et il a beaucoup de capacités de calcul parallèle. Des idées comme le typage paramétrique et la stabilité de type sont assez uniques et profondes dans Julia.

Si vous souhaitez étudier les langages de programmation eux-mêmes, vous pouvez apprendre les étapes de fonctionnement de la compilation en utilisant @code_loweredpour voir ce qu'est l'abaissement, voir le type-AST avec @code_typed, voir LLVM IR avec @code_llvmet enfin le code d'assemblage natif avec @code_native. Cela peut être utilisé pour montrer quel est le coût des variables dynamiques et comment fonctionne exactement la "boxe variable", et ce billet de blog montre comment ces outils d'introspection peuvent être utilisés pour enseigner comment les optimisations du compilateur peuvent / ne peuvent pas se produire.

Il n'y a pas seulement des idées en informatique et en génie logiciel à explorer, mais aussi des idées mathématiques riches. Étant donné que les bibliothèques principales de Julia sont écrites avec un typage générique à l'esprit, il est trivial de créer des opérateurs sans matrice et d'utiliser IterativeSolvers.jl pour effectuer GMRES en les utilisant. Vous pouvez utiliser des outils d'introspection comme @whichpour vous montrer exactement comment tout a été mis en œuvre. Par exemple, comment ça \marche?

@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805

Cela me renvoie directement à la définition de \ . Il est implémenté dans Julia, donc quelqu'un qui connaît Julia peut alors apprendre l'algorithme et comment il fonctionne en identifiant les sous-types de matrice et en se spécialisant lorsque cela est possible (retombant dans l'élimination gaussienne). Étant donné que le code de Julia est sous licence MIT (et presque tous les packages sont sous licence MIT), les étudiants sont alors libres d'utiliser ces idées dans leur propre code (avec attribution) (lorsque le code est sous licence GPL, comme c'est le cas avec la plupart des packages MATLAB et R, ils doivent faire attention aux problèmes de licence!).

Étant donné que le noyau linguistique est construit avec une communauté open source très active, il existe également une riche ressource sur l'histoire du développement du langage: ses problèmes avec Github . Comprendre les questions linguistiques comme qu'est-ce qu'une transposition matricielle? peut être très instructif pour mieux comprendre ces objets mathématiques.

Mais enfin, à la fin, vous voulez apprendre à vos élèves à créer. Malheureusement, apprendre Python ou R ne signifie pas nécessairement que vous avez ce qu'il faut pour "développer Python / R" car la plupart des packages largement utilisés et bien optimisés contiennent une quantité substantielle de code C / C ++ / Fortran en eux afin pour obtenir des performances. Ainsi, pour que ces élèves puissent contribuer aux écosystèmes scientifiques de ces langues, ils devront éventuellement apprendre une autre langue à un moment donné. Bien que ce ne soit pas entièrement horrible, c'est sous-optimal maintenant que Julia existe. Étant donné que Julia à type stable est capable d'atteindre la vitesse de C / Fortran, la plupart des packages de l'écosystème Julia sont du code Julia pur. Apprendre Julia signifie que l'on a appris à développer Julia. Et puisque Base Julia est aussi principalement du code Julia (juste quelques primitives et l'analyseur ne l'est pas),

Cela dit, le choix de Julia présente certains inconvénients. D'une part, il est beaucoup plus récent que ces autres langues et il est donc un peu plus rare sur les ressources. Vous devrez créer vous-même de nombreux outils pédagogiques ou tirer des ressources du Web répertoriées sur le site Web de Julia . De plus, les détails de la langue ne sont pas encore bien définis, bien que la version 1.0 soit bientôt disponible (fin 2017). Et il est également très probable que vous, l'enseignant potentiel d'un cours à Julia, n'ayez pas beaucoup d'expérience avec la langue vous-même. Cependant, ce sont les types de problèmes qui disparaissent avec le temps, alors que les avantages de Julia que j'ai mentionnés ci-dessus sont beaucoup plus essentiels pour les langues elles-mêmes.

Chris Rackauckas
la source
Je me demande si l'utilisation d'un langage peu utilisé est logique car la connaissance de la syntaxe risque d'être perdue et il n'est pas garanti que les étudiants apprennent plusieurs langues. Peut-être qu'à ce point de vue, le python est toujours une bonne idée.
Xavier Combelle
1
C'est pourquoi je n'aurais pas dit Julia auparavant, mais maintenant que c'est assez courant, vous pourriez aussi bien l'utiliser.
Chris Rackauckas du
Je pense que Julia est encore trop nouvelle. Dans l'industrie, les étudiants devront connaître Python, C ++, (ew) MATLAB et R. Je pense que c'est mieux comme deuxième ou troisième langue à apprendre, comme une expérience enrichissante. Il est peu probable que les étudiants utilisent à nouveau Julia dans un avenir proche.
Mateen Ulhaq
2
Les élèves doivent apprendre des compétences transférables, pas un modèle à copier-coller. En ce sens, Python / MATLAB / R résume trop loin de l'ordinateur pour être un bon outil d'enseignement au-delà de la programmation la plus simple, mais C ++ est de niveau trop bas pour être un bon outil d'enseignement. Bien sûr, si vous allez avoir un langage à part comme dans un cours d'analyse numérique, faites ce que vous utiliserez car le cours ne concerne pas la programmation. Mais s'il s'agit de concepts de programmation, Julia est à peu près le seul langage simple qui a en fait la plupart des concepts dans sa conception.
Chris Rackauckas
2

Parlant en tant que premier cycle pas trop éloigné et en supposant que vous n'enseignez pas dans le département CS, je pense que ce serait un désastre d'initier les étudiants à la programmation informatique avec quelque chose comme C, C ++ ou Fortran (ou Dieu ne plaise pas CUDA), même si d'autres ont souligné qu'il s'agit probablement du statu quo de l'informatique scientifique.

Si vous vous attendez à enseigner le calcul scientifique aux étudiants et à les initier à la programmation dans le même cours, je parierais que c'est trop à couvrir dans un semestre à moins que vous ne vous en teniez à un langage interprété comme matlab ou python. D'après mon expérience, la plupart des cours d'informatique scientifique au premier cycle sont enseignés dans l'un de ces deux modes, et le python devient de plus en plus utile en tant que langage de niveau de production chaque jour, il a donc toujours une certaine utilité en tant que compétence pratique ( au-delà de l'enseignement des bases de la programmation, je veux dire).

Juste mes deux cents.

Sumedh Joshi
la source
4
Catastrophe est un mot trop fort pour décrire l'enseignement aux étudiants en C, C ++ ou Fortran. N'importe lequel de ces langages (C, C ++, Fortran ou Python) peut convenir à l'enseignement de la programmation et du calcul scientifique selon la façon dont vous le faites.
Bill Barth
1
D'après mon expérience d'une classe du département CS (C ++) et d'une classe pour astronomes (Fortran 77), C / C ++ / Fortran ne fournit pas une aide suffisante par rapport au python pour des programmeurs complètement nouveaux (segfaults vs exceptions). L'utilisation de C / C ++ / Fortran implique soit d'apprendre à utiliser un débogueur (ou à utiliser un IDE), tandis que python peut être utilisé seul.
James Tocknell
0

C, C ++ et Fortran (répertoriés sans ordre particulier) sont les trois principaux langages de programmation utilisés pour les mathématiques et la physique computationnelles si vous souhaitez résoudre de gros problèmes sur les superordinateurs. Je pense que CUDA est considéré comme une bibliothèque qui est utilisée en conjonction avec d'autres langages pour accélérer le calcul GPU. Matlab et python sont parfaits pour apprendre à exécuter des diagnostics de sortie et à créer des modèles prototypes. Ils sont également plus faciles à apprendre et peuvent être meilleurs pour un cours où vous souhaitez passer à travers des vers d'algorithmes pour apprendre à programmer.

Ainsi, si votre cours porte uniquement sur la programmation, je choisirais C ++ ou, s'il s'agit de la première programmation des étudiants, Python. Ces deux langages ont une grande utilité en dehors du monde de l'informatique scientifique. Si le cours est centré sur l'apprentissage d'algorithmes pour résoudre des problèmes basés sur la physique, je pense que Matlab est sans aucun doute le gagnant.

James
la source
0

court: Tenez compte du fait que le calcul scientifique est lui-même compliqué. Voulez-vous vraiment que le langage de programmation entre en jeu?

Les mathématiques utilisent l'abstraction pour résoudre des problèmes qui ne peuvent pas être résolus par l'intuition. Les concepts ont donc tendance à être abstraits. C'est pourquoi il n'est pas trivial de comprendre quels concepts encapsuler. Dans le calcul scientifique, les exemples habituels pour des classes comme "Animal" "Véhicule" sont plutôt inutiles. Cela est vrai pour la programmation orientée objet, mais je pense que la reproduction de concepts abstraits sur un ordinateur n'est pas non plus triviale dans la programmation impérative.

C'est pourquoi je crois qu'ici nous avons affaire à deux efforts différents: la programmation, d'un côté, et le calcul scientifique, de l'autre. Au niveau du premier cycle, où les étudiants viennent de milieux hétérogènes, vous pouvez finir par enseigner deux choses différentes en même temps.

Si votre objectif est d'enseigner l'informatique scientifique, je pense que c'est déjà assez difficile. Avoir une barrière supplémentaire en tant que langage de programmation (nous convenons tous que C ++ nécessite une formation) démotiverait une bonne partie des étudiants, c'est pourquoi je suggère d'aller avec python.

Si votre cours est "Introduction à SC", je pense que python a le meilleur rapport résultat / effort.

PS: maintenant nous avons des ordinateurs plutôt bons, nous n'avons pas vraiment besoin de rechercher l'efficacité au niveau du premier cycle.

Nicola Cavallini
la source
Concernant votre PS: pourquoi les performances ne comptent-elles pas uniquement pour les étudiants de premier cycle? Mis à part le fait qu'il est facile de concevoir des tâches pour les étudiants de premier cycle où la performance est importante, ce ne sont pas les tâches pour lesquelles ils apprennent la performance, mais la vie réelle. De plus, la vitesse de l'ordinateur est peut-être devenue plus élevée, mais nos attentes aussi.
Wrzlprmft
Désolé j'étais trop pointu. Permettez-moi de le reformuler en "les étudiants peuvent exécuter de grandes applications satisfaisantes avec un langage interprété, avant de creuser dans l'optimisation de code et ensuite passer à un langage compilé".
Nicola Cavallini