Critères de sélection de la langue pour le premier cours de programmation

35

En tant qu'éducateur CS de niveau universitaire, la question du langage de programmation à enseigner dans le premier cours de programmation fait souvent l'objet de discussions. Il y a des milliers de langues parmi lesquelles choisir, et beaucoup de fièvre religieuse (ou fièvre) supportant un camp linguistique plutôt qu'un autre. Tous ces préjugés subjectifs entourant chaque langage de programmation rendent très difficile pour un éducateur d'en choisir un.

Ma question est:

Quels critères objectifs un enseignant peut-il utiliser pour choisir un langage de programmation sur lequel fonder un cours de programmation universitaire de première année? Quelle est la base de ces critères?

Remarque : je ne veux pas voir une liste de langages de programmation et pourquoi ils sont les meilleurs à utiliser. La question ne concerne pas la meilleure langue, mais les critères de sélection d'une langue . Les réponses peuvent toutefois utiliser des langages de programmation pour illustrer des points particuliers.


Cette question s'inspirait d'une autre question jugée hors sujet: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .

Dave Clarke
la source
1
Méta-fil ouvert sur le fait de savoir si cette question concerne ou non le sujet: meta.cs.stackexchange.com/questions/362/…
Dave Clarke
7
<Grabs popcorn> Pour paraphraser Otto Neugebauer : Aucun premier langage de programmation connu de l'homme n'est capable de ruiner tout le monde.
JeffE
3
@Raphael: Je pense que la réponse de Dijkstra serait probablement " Chaque premier langage de programmation connu de l'homme est capable de ruiner tout le monde".
JeffE
2
@ edA-qamort-ora-y, oui, ils devraient être exposés à plusieurs paradigmes de programmation. Non, cela ne peut pas être fait dans le premier cours.
vonbrand
3
Nous l'avions SMLtout simplement parce qu'il est peu probable qu'un étudiant connaisse cette langue à l'avance. Cela a permis à chaque élève d’avoir plus ou moins le même niveau pour commencer le cours.
Markus Malkusch

Réponses:

14

Je vais donner ma part, bien que je pense que ce sujet est un gouffre sans fond. Ne vous méprenez pas, je pense que la question est fascinante, mais nous ne réglerons probablement pas celle-ci à la satisfaction de tous.

En un mot, je dirais que la langue doit faire ce que vous voulez , de la manière la plus simple et la moins ambiguë possible, et pas plus .

Ma propre expérience vient du tutorat de plusieurs générations d'étudiants de première et deuxième années avec le langage de programmation Oberon . Les personnes qui connaissent cette langue reconnaîtront son influence dans mes opinions. Notez que ce langage a été utilisé pour enseigner les "Algorithmes et Structures de Données". À l'époque (à l'époque), la programmation fonctionnelle et la conception orientée objet étaient enseignées dans des cours séparés dès la deuxième année.

Important : avant d’entrer dans les détails d’une langue, je tiens toutefois à souligner que le plus important est d’être absolument clair, pour vous-même et pour vos étudiants, sur les objectifs de votre cours. Enseignez-vous la programmation en tant que telle ? Ou des algorithmes et des structures de données? Ou génie logiciel? Avant de choisir une langue, cela vaut la peine de réfléchir un instant à l’avenir. Les différences à ce niveau (objectifs) sont probablement ce qui, à mon avis, donne le plus de désaccord sur ce sujet.

Les points que j'estime importants peuvent chevaucher plusieurs choses qui ont déjà été dites, mais je pense que la plupart finissent par être des sous-ensembles de l'un des quatre suivants:

  • Simplicité : les étudiants sont généralement là pour apprendre la programmation, les algorithmes et les structures de données, et non les fonctionnalités et les subtilités de tout langage de programmation spécifique. Wirth a utilisé la citation d'Einstein "Rendez-le aussi simple que possible, mais pas plus simple" comme principe directeur dans la conception d'Oberon, et plusieurs autres langues le font aussi bien. Votre langage de programmation de choix devrait pouvoir implémenter tous les concepts requis dans votre conférence, mais devrait le faire avec le plus petit ensemble possible de fonctionnalités / détails. Le langage de programmation est généralement l’outil, pas le but.

  • Univoque : un frère proche de la simplicité, il devrait y avoir un construit pour chaque concept, avec le moins de chevauchement possible. Pensez-y comme s'il n'y avait qu'un seul "bon" moyen de mettre en œuvre chaque concept. Trois types de boucles différents qui sémantiquement tous font la même chose? Ou quinze façons différentes d’incrémenter une variable? Pas bon. Cela rend également la correction des devoirs ou généralement juste comprendre le code de vos élèves beaucoup plus facile. Vos assistants d'enseignement l'apprécieront.

  • Portabilité : les étudiants suivront des cours sur des machines Linux, Windows et OSX. L'environnement de programmation devrait être aussi semblable (identique) que possible dans les trois cas. Les résultats de tout programme devraient également être identiques. C’est un autre point que les assistants d’enseignement, chargés de corriger les devoirs et de traiter des questions / problèmes, apprécieront grandement.

  • Préférence de l’industrie : Sérieusement, nous ne devrions commencer à nous en préoccuper que si «l’industrie» décide elle-même du langage de programmation qu’elle préfère. Depuis l'invention des ordinateurs, cette cible est en constante évolution. Pour le moment, si vos étudiants apprennent réellement à programmer, cela ne dépend pas de la langue. Cependant, il existe des domaines dans lesquels l’industrie parvient à s’entendre sur une norme, par exemple le VHDL pour la conception de circuit ou le SQL pour les requêtes de base de données. Ce point est donc toujours valable.

Encore une fois, l'adéquation d'une langue à cette liste dépend fortement de ce que vous essayez d'enseigner!

Pedro
la source
4
En fait, la conception des circuits entre VHDL et Verilog est divisée.
avril
@avakar: Aw, merde. Je vais résoudre ce problème dans ma réponse, merci de le signaler!
Pedro
Oui, lis ceci et pense que c'est l'un de mes conférenciers. +1 pour Oberon, tant que le commutateur d'utilisation de mots clés en minuscule est automatiquement activé; si pénible à écrire, WHILE expr DO stmts ENDetc.
Callum Rogers
3
+1 pour "quels sont les objectifs de votre cours?" et une note supplémentaire, l'un des objectifs les plus courants, même si ce n'est pas écrit, est de donner les bases pour d'autres éléments (cours et stages) dont la programmation est la condition préalable.
AProgrammer
Un point important (au moins aujourd'hui) est qu'il permet aux étudiants de créer des programmes visuellement attrayants rapidement et sans douleur. Ils sont exposés à tellement d'applications et de jeux comportant beaucoup de graphiques qu'ils pensent naturellement que c'est ainsi que les ordinateurs sont censés interagir avec les gens.
vonbrand
13
  • Développer une pensée algorithmique pour résoudre les problèmes est l’objectif principal: l’ un des inconvénients de l’utilisation d’un paradigme orienté objet dans le premier cours est que le fait de faire entrer de nouveaux apprenants dans des domaines tels que l’héritage, le polymorphisme, etc., les distrait de l’objectif principal susmentionné. En fait, l’introduction de considérations secondaires à côté de cet objectif principal, telles que l’ingénierie logicielle, la portabilité, l’utilité de l’industrie, etc., est contre-productive pour les raisons indiquées.

  • Ce n'est pas un langage orienté objet: de nos jours, la plupart des universités commencent à enseigner la programmation correctement avec un langage orienté objet. Je pense que c'est une erreur. Il y a des choses dans le monde qui ne peuvent vraiment être comprises que par opposition à son contraire. Sans être exposés à un paradigme procédural de programmation (données et fonctions en tant que deux aspects distincts du programme), l'idée de base de l'orientation objet (données et comportement considérés comme intrinsèquement liés) peut manquer à beaucoup. Et parce que la programmation orientée objet est si importante, rater l’idée de base n’est pas une mince affaire. En outre, étant donné que, dans les cours plus avancés, les étudiants CS auront probablement une programmation principalement en OO, ils doivent également être exposés à l'aspect procédural.

Donc, à la fin, je choisirais un langage procédural évitant les fonctionnalités avancées et mettant l’accent sur le développement de la pensée algorithmique. Mais, en évitant les fonctionnalités avancées, je ne veux pas dire éviter les problèmes difficiles. Je veux dire que même avec des problèmes difficiles, les étudiants devraient être obligés de le résoudre en utilisant des principes de base, des outils simples.

Nazar Merza
la source
Vous pouvez très facilement commencer avec un sous-ensemble de Java, par exemple, pour afficher le style procédural. Ensuite, vous ouvrez la boîte de Pandore et montrez à quoi ressemble la même chose avec la POO.
Raphaël
3
@Raphael: Il est impossible d'éviter public static void main()en Java, qui doit être dans le contexte d'une classe. Cela rend Java moins qu'idéal en tant que première langue, bien que l'obstacle ne soit évidemment pas trop difficile.
Dave Clarke
Un bon IDE peut différer public static void main()très longtemps. BlueJ est un bon exemple d'EDI qui permet aux étudiants d'écrire des programmes sans mainaucun élément.
Barry Brown
2
Le problème avec la programmation orientée objet est que, pour la gamme de problèmes de jouets abordés au cours de la première année de programmation environ, cela gêne tout simplement, sans aucun avantage clair. La POO devient importante (et appréciée) lorsque vos programmes comportent environ mille lignes. "Java sans OOP" est horrible, beaucoup de choses complètement opaques qui "doivent être écrites de cette façon" vont à l'encontre des personnes qui apprennent , pas qui perdent.
vonbrand
11

Puisque nous parlons du premier cours de programmation d’un programme d’informatique, je dirais que l’aspect le plus important serait ce que les concepts fondamentaux de la CS qu’il enseignera à vos étudiants. Puisqu'aucune langue ne peut enseigner tous les concepts à la fois, vous devez déterminer quels concepts seront nécessaires par la suite.

Je ne suis pas d'accord avec la notion de @ Kaveh selon laquelle la pertinence de l'industrie est importante. c'est peut-être un bonus, mais c'est d'une importance mineure ici. Avec une base solide dans les principes du CS, l'apprentissage d'une langue "industrielle" dans les cours ultérieurs sera relativement facile.

En passant, quelle que soit la langue choisie pour la première langue, il est important de soumettre dès que possible vos élèves à une autre langue, radicalement différente.

vilain sac
la source
1
La pertinence de l'industrie peut être considérée comme secondaire, mais je ne pense pas qu'il s'agisse d'un problème mineur. Comme il s’agit d’une introduction au cours de programmation, je ne vois pas pourquoi on voudrait enseigner tous les concepts qu’il aborde. Il existe souvent un deuxième cours sur la programmation et un autre cours sur le thème du langage de programmation où différentes langues sont discutées, et bien d’autres cours axés sur des domaines d'application spécifiques, par exemple la programmation Web, etc.
Samedi
@Kaveh: Pour moi, cela ressemble au programme d'une université technique.
Raphaël
6
"Il est important de soumettre vos étudiants à une autre langue, radicalement différente, dès que possible." -- absolument correct. Nous remettons au premier plan les débutants qui pensent pouvoir programmer en introduisant la programmation fonctionnelle: presque tous sont nouveaux dans ce paradigme, et plus vous êtes exposé au C (++), plus il est apparemment difficile.
Raphaël
3
@Kaveh: Les langues conçues pour faire avancer les choses dans le monde réel ne sont pas nécessairement optimales pour enseigner des concepts ou développer des compétences. Les objectifs sont très différents.
JeffE
1
@Kaveh: Je n'ai jamais écrit que la connaissance des langues utilisées dans l'industrie est sans importance. Ce que je veux dire, c'est qu'avec un premier langage de programmation solide, les cours ultérieurs n'auront aucun problème à enseigner aux étudiants quelque chose sur ce qu'ils vont réellement faire lorsqu'ils obtiendront leur diplôme. Ayant moi-même enseigné plusieurs cours d'initiation (en tant qu'assistante technique), je dirais que les compétences acquises ne ressemblent en rien à celles qui sont nécessaires dans le secteur industriel (il y a trop peu de temps pour cela). Si tel est le cas, alors je trouve préférable de leur donner des concepts solides pour qu'ils puissent devenir de meilleurs programmeurs, pas seulement des programmeurs $ LANGUAGE.
evilcandybag
8

Mon souci principal est l' universalité , en ce sens que l'apprentissage de ce langage de programmation devrait permettre à l'étudiant de gérer la plupart des langages de programmation.

Autant que je le regrette, ce critère exclut les langages fonctionnels purs. Cela s'applique également au cours qui ne doit pas utiliser des fonctionnalités exotiques de la langue.

... mais ce n'est que du bon sens.

jmad
la source
1
Avec les monades comme dans Haskell, on peut soutenir que ce critère n'est plus applicable aux langages fonctionnels purs.
Dave Clarke
@DaveClarke: les monades sont un très bon moyen de faire des choses non-fonctionnelles. Mais n’est-il pas trop risqué d’apprendre d’abord ce genre de choses avec les frais généraux de la monade plutôt que directement? (Peut-être que ce n'est pas, je ne sais pas!)
jmad
2
@ jdam: Vous avez probablement raison. Le problème ne réside pas dans les monades, mais dans la généralité et la difficulté à présenter de bons messages d'erreur au programmeur. La variante de Haskell, Helium, répond à ces problèmes et a été utilisée avec succès avec des étudiants de première année.
Dave Clarke
@ DaveClarke: wow je n'avais pas entendu parler de ça. C'est très cool! Malheureusement, bien que ce soit très utile pour apprendre Haskell, cela ne résout pas le problème du fait que cela ne va peut-être pas aider à apprendre d'autres langues.
jmad
4
@Ben: Mon sentiment est que la gestion manuelle de la mémoire est aujourd'hui quelque chose de spécifique à certaines langues (et que vous apprenez dans ces cas spécifiques) plus qu'un élément fondamental de la programmation. Si vous n'êtes pas d'accord avec cela, alors je suppose que cela pointe vers C (ou C ++).
jmad
8

Lors du choix d'un premier langage de programmation, de nombreux problèmes doivent être pris en compte. Beaucoup de ces facteurs ont été pris en compte dans les réponses ci-dessus. J'en ai inclus 3 de plus, car ils faisaient partie de ma réponse à la question fermée ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) qui a inspiré cette question à l'origine . J'ai copié ma réponse ici (et l'ai modifiée) en fonction de la politique actuelle de suppression des questions fermées.

Voici 3 points à considérer, en utilisant quelques langages de programmation comme exemples.

Programmation dans le grand vs programmation dans le petit

Lorsque vous apprenez à programmer, vous devez apprendre à programmer en petit avant de passer à l'apprentissage de mécanismes d'aide à la programmation en grand .

Par programmation dans le petit format, j'entends écrire des programmes comportant moins de 100 lignes. Ces programmes impliqueront des algorithmes manipulant des structures de données simples, ayant un flux de contrôle simple et permettant de résoudre des problèmes simples. Ils ne seront en général pas considérés comme des applications .

Par programmation dans le sens large, j'entends écrire de gros programmes construits à partir de nombreux composants / classes, en s’appuyant sur une API, avec une interface graphique, une base de données, éventuellement dans une configuration client-serveur.

Les choses auxquelles un programmeur doit penser quand on programme en petit sont très différentes de celles en grand. La programmation dans le grand format demande au programmeur de réfléchir à la modularité, aux bonnes interfaces, à une bonne conception, à la réutilisabilité et à de nombreux autres problèmes. Les langages de programmation modernes fournissent de nombreuses constructions pour aider les programmes dans leur ensemble. Ces constructions incluent des classes, des modules, des interfaces, la dissimulation d'informations, etc. Lors de la programmation dans le plus petit format, ces problèmes sont beaucoup moins importants.

Un langage de programmation tel que C ++ a de nombreuses fonctionnalités pour aider à la programmation, mais il est plus difficile de s'asseoir et de commencer à écrire un programme très simple. Java est similaire.

D'autre part, un langage comme Python, Ruby, Scheme ou Haskell facilite beaucoup l'écriture directe d'un programme.

Niveau haut vs bas niveau

Les langages tels que C ++ et C sont plutôt des langages de bas niveau. Ils permettent au programmeur de manipuler directement les références en mémoire. Bien que cela permette d’écrire du code très efficace, les premiers détails peuvent être difficiles à apprendre pour un premier programmeur. Certains diront que ces détails de bas niveau empêchent la logique de résoudre le problème.

Un langage de niveau supérieur tel que Python permet d’exprimer plus facilement les concepts en termes de domaine problématique.

Staticallly Typed vs Dynamically Typed

C ++, Haskell, Java et beaucoup d'autres langages sont statiquement typés. Cela signifie que le compilateur trouve automatiquement les emplacements où des erreurs potentielles se produisent en fonction des types de valeurs attendus à chaque emplacement du code. Il y a un peu de guerre religieuse pour savoir si le typage statique est une bonne chose ou non, mais je vais m'écarter de celui-ci. Un problème avec le typage statique pour les nouveaux programmeurs est que les messages d'erreur rapportés par le compilateur sont souvent difficiles à comprendre. C'est particulièrement le cas avec les modèles C ++ et les programmes Haskell en général.

Python, Ruby et Scheme sont typés dynamiquement. Cela signifie que des erreurs sont détectées pendant l'exécution du programme. On peut dire que c'est trop tard pour détecter les erreurs (mais on peut aussi utiliser des tests pour éviter de telles erreurs). Là encore, évitant l’argument religieux, l’avantage des erreurs que l’on rencontre lors de l’écriture de programmes simples dans un langage de programmation à typage dynamique est du type que cet objet ne sait pas faire . Dans le contexte d'un petit programme, ces erreurs sont faciles à comprendre et à localiser.

Les langages tels que C ont un typage faible, ce qui signifie que bien que le compilateur résolve certaines erreurs, l'exécution ne parvient pas à en capturer d'autres, telles que les accès mémoire non valides. Par conséquent, le message d'erreur renvoyé au programmeur s'apparente à "Programme bloqué". Un langage typé dynamiquement intercepterait ces erreurs et les convertirait en un message d'erreur plus compréhensible.

Autres

Pour d'autres langues, différentes considérations peuvent entrer en jeu, telles que le support fourni par l'environnement de programmation, les API disponibles, la qualité des livres et des tutoriels en ligne, etc.

Dave Clarke
la source
Entièrement d'accord
vonbrand
1
J'ai également mes propres préférences concernant le conflit "types statiques vs dynamiques". Cependant, dans un programme général de CS, tant que les deux sont enseignés à un moment donné, je pense que l'ordre n'a pas tellement d'importance. Si seulement un côté de la pièce est présenté, cependant, c'est un gros problème pour moi.
chi
8

En guise d'introduction, considérons la possibilité de présenter plus d'une langue (dans un cours). Dans mon premier mandat, nous avons montré à la fois SML et Java. Le contraste avait son propre et important message: choisir le bon outil pour le travail.

Mais maintenant, pour les critères, dans un ordre arbitraire.

La difficulté à apprendre est un problème subjectif, mais important: vous ne voulez pas que votre élève passe du temps à apprendre la langue, mais à faire des choses avec. On peut soutenir que des langages dynamiques comme Ruby peuvent gagner sur ce plan: vous pouvez leur donner n'importe quoi, et il existe d'excellents didacticiels "factices" sur le Web. Si je me souviens bien, certaines études montrent également que les étudiants qui n'ont pas encore programmé obtiennent de meilleurs résultats avec les langages fonctionnels qu'avec les autres.

Richesse : la ou les langues doivent être suffisamment riches pour tous les concepts que vous souhaitez enseigner. Par exemple, si vous souhaitez discuter de fonctions d'ordre supérieur, vous avez besoin d'un langage dans lequel les fonctions sont des valeurs, telles que les langages fonctionnels ou Scala.

Évolutivité : il est probable que vos étudiants n'apprendront pas plus de langues que ceux que vous leur présentez. Vous souhaitez donc que la ou les langues choisies évoluent au fil de leurs études: ils doivent écrire les exercices pour votre animal de compagnie maintenant, mais peuvent également attaquer un projet de taille moyenne ultérieurement. Java et les langages ayant une écosphère similaire sont de bons choix ici.

Prise en charge des outils : Ceci est lié à l'évolutivité. Si vous vous attendez à ce que vos étudiants soient productifs avec le langage, vous devez posséder de bons environnements de développement, des gestionnaires de construction et des bibliothèques. Les coques interactives (Ruby, Scala) sont également une bonne chose, surtout pour les débutants. Les outils doivent également fonctionner sur toutes les grandes plates-formes.

Documentation : Vous ne voulez probablement pas enseigner la langue, mais demandez aux étudiants de s’enseigner eux-mêmes avec vos conseils (abstraits). Par conséquent, une bonne documentation est importante. On peut dire que plus une langue est populaire et établie, meilleure est la documentation. Par exemple, la documentation de Scala est assez pauvre (mais en amélioration). Des outils comme Hoogle sont un plus.

Disponibilité : Certaines personnes enseignent avec Matlab ou Visual C ++. Considérez que tout le monde n’a pas nécessairement une licence ou une machine capable d’exécuter les programmes nécessaires. Vous devriez probablement privilégier les langages libres fonctionnant sur diverses plates-formes.

Propreté : vous voulez probablement façonner la façon de penser de vos élèves. Plus la langue est sale, plus ils penseront; Je ne proposerais jamais PHP dans un cours. Les langages dynamiques ont en général des inconvénients: ils permettent, parfois même encouragent, les mauvaises habitudes.

Quels critères sont plus importants pour vous que d'autres dépendent également de ce que vous voulez enseigner. Est-ce littéralement un cours de programmation? Est-ce un cours sur les algorithmes et les structures de données? Est-ce un cours qui introduit les concepts de langages de programmation dans différents paradigmes? S'agit-il d'un cours sur le développement logiciel dans les grands?

Raphaël
la source
For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... ou C ou Pascal, qui ont tous deux un pointeur de fonction depuis toujours. Pratiquement le seul langage (grand public) que ce critère exclut est Java.
Mason Wheeler
Essayer d'enseigner aux débutants un mélange de syntaxes différentes et de concepts sous-jacents ne fait que brouiller les cerveaux.
vonbrand
6

Question fascinante; J'aime votre insistance sur des critères objectifs. Nous voulons que les étudiants de première année apprennent:

Concepts de programmation : Le premier langage de programmation doit prendre en charge: appels de fonction, itération, récursivité

Idées fondamentales : le premier langage de programmation doit prendre en charge les tableaux (pour les premières étapes d'une introduction en douceur à la façon dont fonctionne réellement la mémoire et les pointeurs)

compétences pratiques en programmation : comment utiliser le débogueur, comment utiliser le profileur, comment résoudre des problèmes volumineux (un langage de haut niveau), comment assembler de grands systèmes, comment décomposer des problèmes (décomposition de problèmes), comment éviter d'écrire code compliqué, comment communiquer aux humains l’intention qui se cache derrière une série (souvent cryptée) d’instructions exécutables.

le fait que des bibliothèques pré-écrites existent pour des choses comme sort (), et comment les utiliser - c'est-à-dire qu'il n'est pas nécessaire d'écrire tout à partir de zéro.

Autres critères pour une première langue :

interprété (un retour rapide facilite le processus d’apprentissage).

un environnement interactif qui accélère l’apprentissage, les tests et le débogage.

le code source de haute qualité est disponible pour que les étudiants lisent dans cette langue

"facile à lire", "syntaxe proche du langage naturel" (pour faciliter la lecture et la notation du code source)

portable (fonctionne sous Mac OS, Windows, Unix). Au moins une implémentation de logiciel libre du langage.

rapide à enseigner, "peu de pièges" - par exemple, "il peut être plus rapide d'enseigner d'abord aux débutants Python, puis Java, plutôt que Java en tant que premier OOPL." - "Comparaison des langages de programmation orientés objet" et TelescopeRule

Matthias Felleisen a développé un langage de programmation avec des messages d'erreur adaptés à un public débutant. Il souligne que le choix d’une langue n’est pas aussi important que l’enseignement d’une bonne méthodologie de conception. En fait, il considère le premier cours de CS comme un cours d'arts libéraux, où il enseigne la pensée critique, la résolution de problèmes et le souci du détail.

critères pour un deuxième langage de programmation

Des choses que nous voulons que les étudiants apprennent, mais peut-être que cela peut attendre le deuxième langage de programmation:

un langage "pertinent" qui n'est "pas trop ésotérique"; quelque chose de "populaire dans l'industrie"

Théorie de la complexité: comment reconnaître des tâches impossibles avec les technologies actuelles.

niveau supérieur: comment choisir le bon outil pour le travail , comment utiliser un compilateur, structures, programmation orientée objet, programmation fonctionnelle, programmation logique, conception du compilateur, composition et manipulation de fonctions (au sens de Lisp / ML), programmation concurrente et distribuée,

trucs de bas niveau: arithmétique de pointeur, architecture informatique. gestion de la mémoire, cadres de pile, programmation des assemblages, architecture de la machine, pilotes de périphérique et conception du système d'exploitation (afin que la machine ne "ressemble pas à une boîte noire effrayante qu'elle ne peut pas pénétrer")

EDIT: Je trouve décevant que la publication d’un résumé de quelque chose que j’ai écrit, en collaboration avec beaucoup d’autres, "ne soit peut-être pas une publication légale".

J'ajoute donc une citation plus formelle à mon précédent lien informel, en essayant de respecter les règles d' utilisation équitable et d'autres droits d'auteur du wiki.

Cette réponse est un résumé de la langue première de Freshman (Anon 2011) au Portland Pattern Repository.

(Anon 2011) De nombreux auteurs anonymes et divers. "Première Langue Freshmans". Dépôt de modèle de Portland. 27 septembre 2011. http://c2.com/cgi/wiki?FreshmansFirstLanguage .

David Cary
la source
Avez-vous vérifié avec les auteurs d'origine si vous êtes autorisé à reproduire leur contenu? La source est un site Web d'entreprise et je n'ai pas pu trouver de déclaration indiquant que le contenu était gratuit. Ce n'est donc peut-être pas un message légal!
Raphaël
1
@Raphael La source est un wiki (donc potentiellement plusieurs auteurs différents). Si l'auteur (n'importe quel co-auteur) de ce document ne souhaite pas l'inclure ici, il doit envoyer un avis de retrait DMCA à [l'adresse de contact indiquée au bas de cette page] (mailto: [email protected]) . De plus, les informations ne sont pas couvertes par le droit d'auteur, seulement par la façon dont elles sont exprimées. Un peu de refactoring et RemovingWordsRunTogetherWikiWikiStyle améliorerait cette réponse et supprimerait tout risque de violation du droit d'auteur.
Gilles, arrête d'être méchant
1
+ Bonne réponse, mais j'ai un nit à choisir - profileurs. Il n'y a aucune théorie derrière eux - juste "la connaissance commune". Les universitaires n’apprécient généralement pas le fait qu’ils ne rencontrent pas beaucoup de problèmes et qu’une autre technique ne les détecte pas. Vérifiez ce lien.
Mike Dunlavey
5

Je pense que la simplicité et la facilité d'apprentissage sont l'un des critères principaux. Dans un cours d'introduction à la programmation, nous souhaitons éviter les obstacles inutiles à la programmation et nous concentrer autant que possible sur les principes de la programmation et de la résolution de problèmes algorithmiques. Les étudiants de première année n'ont souvent pas la capacité de penser de manière algorithmique les problèmes. Le cours traite également de l'enseignement de la pensée algorithmique.

Un autre critère est l'utilité de la langue dans l'industrie. Nous ne voudrions pas enseigner une langue qui ne soit d'aucune utilité dans l'industrie. Une nette majorité d’étudiants vont travailler dans l’industrie, il est donc important de garder un œil sur ce qui est utilisé (et sera utilisé lorsque les étudiants obtiendront leur diplôme) dans l’industrie.

Le troisième critère serait les cours que les étudiants vont suivre dans les années à venir. Les cours, en particulier les cours obligatoires, ne sont pas conçus sur eux-mêmes mais en coordination avec d’autres cours.

La dernière chose à laquelle je pense en ce moment est la même que celle de jmad, la langue devrait permettre d’apprendre facilement d’autres langues importantes. Il devrait être suffisamment riche et il serait facile de reprendre les langues les plus importantes par la suite (ici, les moyens importants sont importants du point de vue des étudiants).

Je pense que de nombreuses universités ont déplacé leur principal cours d'introduction à la programmation de Java / C ++ / C à Python, bien qu'elles puissent être amenées à s'initier à la programmation dans d'autres langues de temps à autre (souvent pour les majors non informaticiens, par exemple C pour les majors en génie électrique). Cependant, ils peuvent faire preuve de souplesse si l'instructeur souhaite expérimenter l'enseignement d'une autre langue de temps en temps.

Kaveh
la source
3
Je ne donnerais pas une très grande valeur à l'utilité dans l'industrie dans un cours d'introduction à la programmation. Un programmeur expérimenté dans la nature devra probablement apprendre plusieurs langues au cours de sa carrière, certaines "sur le tas". La capacité à apprendre et à apprendre de nouvelles langues est donc une compétence clé à enseigner. Par conséquent, je ne m'attendrais pas à ce que la première langue enseignée dans un cursus universitaire soit nécessairement la plus forte une fois diplômé.
Ben
1
@Ben: l'utilité dans l'industrie est particulièrement importante si les étudiants ne vont pas se spécialiser en CS. D'où je viens, beaucoup de gens vont travailler sur la biologie ou d'autres sciences et, étant donné qu'ils n'auront pas le temps d'apprendre de nombreuses langues, apprendre quelque chose de commun dans leur écosystème comme Python sera probablement plus utile que ML, Java ou C.
hugomg
1
En tant que représentant de l'industrie (une industrie en particulier, pas nécessairement représentative), je ne pense pas que la pertinence de cette industrie soit un facteur lorsqu'il s'agit des futurs programmeurs de niveau 1. L'exposition à de multiples paradigmes rend de meilleurs programmeurs, même si dans mon domaine (programmation intégrée) nous utilisons principalement le C. Les détails d'une langue peuvent être appris dans un manuel, les concepts généraux étant mieux enseignés à l'école. Pour les programmeurs occasionnels (par exemple, les scientifiques), les priorités sont différentes - mais trop se focaliser sur Fortran peut amener les gens à ignorer Numpy alors que c'est ce qu'ils devraient utiliser.
Gilles, arrête de faire le mal.
5

Je vais donc immédiatement me passer de ma réaction réflexe, à savoir que tout le monde devrait apprendre à programmer via SICP car Lisp est la solution.

Beaucoup de bons critères ont déjà été proposés pour choisir une langue ... la simplicité et la portabilité étant parmi les plus importantes. Cependant, je pense aussi qu'il est essentiel que les nouveaux étudiants en programmation ne se fassent pas une mauvaise idée (ou n'aient aucune idée) de ce qui se passe dans les coulisses avec les langues vivantes.

Bien que certains de ces autres postes offrent d'excellents critères, j'aimerais utiliser un langage particulier pour illustrer le sens de «respecter les critères».

Certaines de ces préoccupations ont été abordées (bien mieux que ce que je pouvais essayer) dans l'article de blog de Joel Spolsky, The Perils of JavaSchools . Le choix de langages comme Java ou Python se résume à deux des concepts les plus difficiles (et les plus vitaux) de CS; à savoir, les pointeurs et la récursivité.

Bien sûr, l’enseignement d’un cours d’introduction au C va être incroyablement dense, tout en laissant probablement de côté plusieurs concepts importants liés à la récursion. De même, un cours enseigné en Lisp devra aborder les pointeurs sous les couvertures, car caril cdrimplique des concepts importants liés aux listes chaînées, tout en laissant la langue gérer les détails.

En gros, ce que je veux dire, c'est que les étudiants doivent comprendre les principes fondamentaux des structures de données et des algorithmes, ainsi que la mise en œuvre pratique.

Je suis également en désaccord avec la suggestion de ne pas utiliser un langage orienté objet. Je pense que l'utilité des langages orientés objet pour modéliser le monde réel est un atout positif pour les nouveaux programmeurs, tant que l'inadéquation des impédances est clairement définie et que les langages orientés objet sont un paradigme parmi beaucoup d'autres.

Je proposerais que Ruby (suggéré comme une possibilité par un autre post) illustre de nombreuses qualités à rechercher dans un langage à utiliser pour une introduction au cours de programmation.

Je justifierai cette affirmation momentanément, mais je voudrais d’abord commenter une tendance qui me perturbe dans les cours d’introduction au CS. Je travaille dans une université qui, comme beaucoup d'écoles, a récemment adopté Python pour ses cours d'introduction. Je crois fermement que Python est le nouveau BASIC, et la tendance du langage est de choisir la nouvelle convivialité plutôt que le pouvoir et l'expressivité, comme je l'ai récemment expliqué ailleurs . C'est un mauvais service, et nous devons penser aux programmeurs qu'ils vont devenir, pas aux nouveautés qu'ils sont en ce moment.

Quoi qu'il en soit, justifiant Ruby en tant que langage d'introduction ...

  • Ruby, même s'il n'est pas optimisé pour les appels en aval, fait plutôt bien la récursivité. Donc, il y a ça.
  • Ruby est multi-paradigme. Bien qu’il s’agisse d’un langage purement orienté objet, il englobe également la programmation fonctionnelle, en plus de l’inclusion de certaines roues d’entraînement impératives dérivées du C. Comparez cela à Python, qui est un langage procédural avec certains OO (même si les boulons sont visibles) et certains éléments fonctionnels (que le BDFL de Python a essayé à plusieurs reprises d’exciser ).
  • CRuby (alias MRI ou 'Ruby Classic') est écrit et étendu en C. Vous pouvez enseigner aux étudiants les pointeurs, la gestion de la mémoire et le dieu redoutable malloc()en leur apprenant à étendre le langage en C.
  • Même s’il s’agit d’un langage dynamique de haut niveau, vous pouvez en apprendre beaucoup sur les structures de données, les types, etc. il y a des bibliothèques (gemmes) pour tout ce que vous pouvez imaginer, des arbres rouge-noir aux choses bizarres avec la frappe de canards.

Quoi qu'il en soit, rien ne peut remplacer l'apprentissage de nombreuses langues, de plusieurs paradigmes, que vous les utilisiez de manière professionnelle ou non. Fondamentalement, je pense que tout le monde devrait comprendre , sinon utiliser C et Lisp. Ruby est le meilleur compromis auquel je puisse penser pour un semestre d’introduction.

Quoi qu'il en soit ... c'est mon dollar américain .02. Je n'essaie pas de vous convaincre d'utiliser Ruby, mais ... utilisez-le comme un exemple de qualités à rechercher dans une langue pour enseigner un cours d'introduction.

Jason Lewis
la source
2
"Je crois fermement que Python est le nouveau BASIC" - copiez-le. "Deux des concepts les plus difficiles (et les plus vitaux) de CS, à savoir les pointeurs et la récursion" - je n'ai jamais appris un langage qui traite les pointeurs de manière explicite, et je n'ai jamais rien manqué. Lorsque j’ai appris comment les compilateurs fonctionnent, les pointeurs ont été expliqués assez rapidement.
Raphaël
Je conviens qu'un langage multi-paradigme a son charme (bien qu'enseigner deux à trois langues "pures" serait peut-être mieux), mais je ne choisirai pas Ruby pour cette raison. D'autres langues pour un meilleur travail, à mon humble avis, en particulier en ce qui concerne la bibliothèque de base. Scala, par exemple, possède toute une bibliothèque de collections immuables.
Raphaël
3
Je crois aussi que Python est le nouveau BASIC. Mais pourquoi est-ce un argument contre Python?
JeffE
1
@Raphael, les pointeurs ne sont difficiles que lorsque vous commencez par C, ce qui vous oblige quelque peu à être exposés aux pointeurs lorsque trop de choses ne sont pas réglées et lorsqu'elles entretiennent une relation confuse avec les tableaux. Les pointeurs n'étaient pas difficiles pour moi quand je me suis autodidacte Pascal. Les pointeurs n'étaient pas difficiles pour les élèves de ma classe qui se sont familiarisés avec Algol 68 (ils sont nommés références, mais ce sont des pointeurs portant un autre nom, tout comme à Java; ce qui est difficile dans Algol 68, ce sont les règles de déréférence automatique), pointeurs n'est même pas difficile avec C ++ si vous ne commencez pas par enseigner le sous-ensemble C.
AProgrammer
1
@DaveClarke: Il indente avec des espaces, ce qui compense largement pour ceux-ci.
Raphaël
5

Mon premier langage de programmation était un langage d'assemblage de jouets. Le second était Fortran. Entre les deux, on m'a appris une notation "d'algorithmes", qui était à peu près celle d'Algol 60. Je me suis bien débrouillé. En fait, je pense que ce que j'ai appris était à peu près parfait.

Lorsque j'ai étudié la programmation fonctionnelle pour la première fois, dans des documents de recherche, mais pas dans un langage implémenté, je me suis dit: "Waouh, c'est complètement différent. C'est assez mathématique!" La plupart des gens à qui l'on enseigne la programmation fonctionnelle ont toujours le même type d'expérience "wow". Je pense que c'est génial.

Je pense que la programmation impérative et la programmation fonctionnelle sont deux manières complètement différentes de regarder le monde. Nous ne rendrions pas service à nos étudiants si nous leur enlevons cette expérience diversifiée.

Le meilleur premier langage de programmation doit être le plus simple et le plus clair possible, afin que les étudiants puissent se concentrer sur la manière de penser clairement. Malheureusement, la simplicité et la clarté de l’assemblage Fortran et Algol 60 sont incomparables dans la plupart des langages de programmation modernes. Haskell est une bonne exception. Mais Haskell ferait mon deuxième langage de programmation idéal, pas le premier. Eiffel ou Oberon pourraient peut-être faire l'affaire.

Uday Reddy
la source
5

À la North Carolina School of Science and Mathematics , nous présentons Python aux étudiants depuis 2004. Nous l'utilisons pour enseigner la programmation procédurale, car nous pensons que la capacité à rédiger des procédures courtes et correctes est essentielle pour progresser plus tard avec des outils plus lourds, notamment OO. programmation.

Nous l'aimons pour ces raisons.

  1. Python n'est pas un langage au format libre. Cela oblige les étudiants à écrire leur code par blocs en utilisant l'indentation. (Comme note technique, nous utilisons l’éditeur de texte vim et set tabstop=4 set etajoutons [ ] dans le fichier .vimrc pour éliminer les problèmes gênants et pour que l’indentation du code soit perceptible mais ne provoque pas une dérive horizontale excessive et moche). Nos étudiants s'habituent à voir la structure hiérarchique des programmes délimités par des espaces. En conséquence, leurs habitudes de formatage ont tendance à être très bonnes car ils programment dans d'autres langues.

  2. La simplicité syntaxique de Python le rend convivial pour les débutants. Des programmes simples peuvent être écrits avec un minimum de mots-clés obscurs et d’incantations magiques. Nous voulons que les étudiants qui ne penseraient normalement pas à la programmation l'essaient. Notez la belle simplicité de Python hello.py; ce qui se passe est clair comme du cristal.

  3. Python est typé dynamiquement et typé canard. Cela facilite l'introduction de variables. Je dis à mes étudiants que les variables ne sont que des étiquettes. Ils pointent des objets. Vous envoyez un message à un objet en utilisant le nom de la variable, comme si quelqu'un vous envoyait un message en vous appelant par téléphone.

  4. Python est un outil que les étudiants ambitieux ne pourront pas développer. Il a des bibliothèques sophistiquées qui font des hôtes de choses utiles. C'est un puissant outil de création accessible aux débutants.

  5. Python est gratuit et fonctionne sur toutes les plates-formes principales. Notre école est un environnement OS hétérogène avec toutes sortes de machines. Nous n'avons pas à nous soucier de maux de tête tels que des problèmes de compatibilité. Il fonctionnera sur n'importe quel ordinateur.

  6. Python a une excellente documentation. Nous encourageons nos étudiants à explorer, bricoler et colorier en dehors des lignes. Ils découvrent très tôt comment utiliser la documentation Python et finissent souvent par explorer des choses intéressantes en dehors des cours.

Nous avons été très satisfaits de Python.

nathsadiste
la source
1
Bienvenue! C'est une belle étude de cas, mais fait peu pour répondre à la question après les critères de sélection, à mon humble avis. Lire vos articles à l'envers peut en quelque sorte le faire, mais je ne suis pas sûr que vous le vouliez.
Raphaël
Aucun ordre particulier n'était prévu. C'est un "et".
ncmathsadist
3

Je dirais que le langage (sous certaines limitations) importe moins, que ce que vous faites avec le langage. Vous pouvez en apprendre davantage sur le développement de logiciels, les algorithmes, la programmation orientée objet, le matériel informatique, etc. dans la plupart des langues. La clé est de développer quelque chose d'intéressant qui utilise tous ces concepts.

(réponse migrée à partir de https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )

inutile
la source
1

TL; DR: Il n’ya aucun moyen derépondre demanière objective à cette question car il n’existe aucunebase objective pour les critères sous-jacents. C'est aussi arbitraire que d'essayer de débattre si le bleu est objectivement une couleur «meilleure» que le rouge ou si la crème glacée à la vanille est objectivement «plus savoureuse» que le chocolat.


Je pense qu'il y a déjà quelques articles merveilleux, mais je vais ajouter mes propres 2 centimes.

Quels critères objectifs un enseignant peut-il utiliser pour choisir un langage de programmation sur lequel fonder un cours de programmation universitaire de première année?

Cette question revient à demander s’il est possible de choisir objectivement le premier parfum de crème glacée que quelqu'un devrait essayer lorsqu’il visite un lieu de crème glacée pour la première fois. Non, il n'y a pas de moyen objectif de choisir quelque chose qui est intrinsèquement subjectif .

Pourquoi? Parce que même lorsque nous examinons les critères raisonnables mentionnés dans la réponse de Pedro , tout le monde aura toujours une vision subjective de la manière dont chaque facteur "résiste" à celui de quelqu'un d'autre.

Par exemple, Ruby est-il objectivement "plus simple" que Python? Plus simple dans quel sens? En ce qui concerne quoi? Que signifie "plus simple" pour vous ? Cela signifie-t-il "moins de lignes de code"? Cela signifie-t-il "plus facile à lire et à comprendre"? Qu'en est-il des autres? Pourquoi quelqu'un devrait-il accepter un choix particulier ici? Je ne pense pas que nous puissions répondre à cette question de manière objective .

Cela conduit à la question suivante.

Quelle est la base de ces critères?

Bien que certains critères puissent être raisonnables, je pense que cela est plus fondé sur les préférences subjectives qu'autre chose. Par exemple, il n’ya aucune raison pour que j’accepte les critères de simplicité , d’ ambiguïté , de portabilité et de préférence de l’industrie de Pedro - sans se soucier de la mesure dans laquelle ils pourraient être raisonnables. En fait, la préférence de l' industrie est subjective par définition et conduirait simplement à un cercle vicieux. (Tout le monde y est formé, donc tout le monde l'utilise dans l'industrie, c'est pourquoi tout le monde y est formé, ...)

Par exemple, pourquoi pas

  • Efficacité: les temps d'exécution et l'empreinte mémoire peuvent être réellement mesurés.
  • Taille: le plus petit nombre possible de mots réservés rendrait la langue plus facile à apprendre.
  • Ensemble de fonctionnalités: Un ensemble plus large de fonctionnalités prises en charge (lambdas, génériques, orientation d'objet, surcharge des opérateurs, etc.) vous permettrait d'enseigner davantage de concepts sans avoir à changer de langue et à revenir à la case départ.
  • Interopérabilité: un langage permettant de travailler facilement avec d'autres langages et systèmes natifs (par exemple, l'API Win32 de C # ou Python, etc.) pourrait être considéré comme un meilleur investissement de temps à long terme, etc.

Le fait est que, bien que je puisse proposer un ensemble différent de critères d’évaluation tout en restant raisonnable, nous ne pouvons pas prétendre qu’il est objectivement supérieur / inférieur à celui de quelqu'un d’autre.

En conclusion, il n'y a pas base objective pour les critères. C'est aussi arbitraire que d'essayer de débattre si le bleu est objectivement une couleur «meilleure» que le rouge ou si la crème glacée à la vanille est objectivement plus savoureuse que le chocolat.

Cela ne veut pas dire que vous ne pouvez pas avoir de bonnes raisons de justifier vos préférences, mais en fin de compte, ce ne sont que vos préférences.

code_dredd
la source