Le débat sur le premier langage de programmation: la décision finale

Certains se rapportent au débat sur le choix du premier langage de programmation quelque chose comme ceci:



Ils disent qu'un million de facettes affectent le choix et il est inutile de discuter à ce sujet. Cependant, les holivars continuent.

Vitaly Bragilevsky a décidé d'y mettre un terme et a présenté la décision finale à Saint AppsConf . Après avoir lu l'article (ou consulté le rapport), vous saurez comment répondre correctement aux proches ou aux connaissances qui ont appris combien ils gagnent en informatique et que la télécommande n'est pas un obstacle, et vous vous demandez maintenant par où commencer.


Vitaly Bragilevsky travaille chez JetBrains et enseigne à l'Université d'État de Saint-Pétersbourg à la Faculté de mathématiques et d'informatique, membre du Haskell Committee for Standardization of the Programming Language et du Haskell Glasgow Haskell Compiler Development Committee, auteur du livre Haskell in Depth.

Voyons donc comment commencer à apprendre la programmation, quels outils utiliser? En fait, c'est une question importante.
Dijkstra a écrit en 1972: "... les outils que nous essayons d'utiliser et le langage ou la notation que nous utilisons pour exprimer ou enregistrer nos pensées sont les principaux facteurs qui déterminent ce que nous pouvons penser ou exprimer du tout!"
Souvent, un langage de programmation (et le langage en général) ne nous permet tout simplement pas de faire ce que nous voulons, ou il ne le fait pas comme nous le voulons. La langue est un outil important et son choix doit être pris au sérieux.

Si vous faites une erreur dans ce choix (ou plus souvent quelqu'un fait un choix pour l'élève), les conséquences peuvent être graves. Voici comment les programmeurs sont apparus:

  • gâté par Fortran;
  • affecté par BASIC;
  • C ++ écrasé;
  • étranglé Java.

D'où les blagues selon lesquelles un vrai programmeur Fortran peut écrire un programme Fortran dans n'importe quelle langue. Ou des histoires de gars qui sont en première année en proie à C ++, et puis il est déjà impossible de devenir programmeurs - seulement ils savent comment <, et >écrire.

Puisque nous voyons de telles personnes, il est logique de supposer que le premier langage de programmation influence en quelque sorte .

J'ai une histoire personnelle à cet égard. Mon premier langage de programmation a été Fortran, à l'exception du voyage infructueux à une conférence de base, dans laquelle l'enseignant a parlé de tableaux, et en tant que débutant, tout était incompréhensible pour moi et m'a découragé de continuer. Ensuite, je suis allé à la bibliothèque, j'ai pris un livre Fortran et j'ai commencé à effectuer des exercices de programmation sur un morceau de papier. Pour être honnête, c'était encore plus pratique pour moi - mais le compilateur ne jure pas.

Contexte


Je vais commencer par le soi-disant problème de Richard Vekselblat. Cet homme est connu pour être son premier doctorat en informatique. En 1980, il a écrit un article sur les conséquences du choix du premier langage de programmation ( Richard L. Wexelblat. Les conséquences de son premier langage de programmation. Actes du 3e symposium ACM SIGSMALL et du premier symposium SIGPC sur les petits systèmes, 1980 ).

Tout a commencé en 1978, lorsque Richard a écrit une lettre au magazine avec le titre provocateur "Les erreurs de la jeunesse, ou est-ce que Basic Basic est mauvais pour votre santé?" Les réponses à cette lettre ont servi de matière à l'article.


Sur la base de points de vue récurrents, Richard Vekselblat a tiré les conclusions suivantes:

  • , (Pascal, PL/C) , (COBOL, FORTRAN). .
  • , . — , .
  • , , . .

Bien sûr, il s'agit d'une étude très naïve, sans tenir compte des facteurs sociologiques, néanmoins, et elle nous a permis de tirer quelques conclusions.

Après avoir approfondi l'histoire de la question, j'étais convaincu qu'il y avait des centaines d'études consacrées au choix d'un langage de programmation. Il existe même des travaux résumant les travaux sur le choix des armes nucléaires, par exemple: Kevin Parker, Bill Davey. L'histoire de la sélection du langage informatique. (Dans Arthur Tatnall. Reflections on the History of Computing: Preserving Memories and Sharing Stories, AICT-387, Springer, pp. 166-179, 2012, IFIP Advances in Information and Communication Technology (SURVEY)) .

Les auteurs, s'appuyant sur une bibliographie approfondie, identifient les facteurs affectant le choix de la langue, non seulement pour l'enseignement, mais aussi pour la mise en œuvre des projets:

  • : , ( ). , .
  • : ( 150 «Hello world!» 500 IDE); problem-solving, ; .
  • : (, 2000- ); .

De nombreux experts participent à la comparaison des langues, notamment en ce qui concerne leur aptitude à l'étude initiale. Linda Mannila et Michael de Raadt dans leur article «Une comparaison objective des langues pour l'enseignement de la programmation introductive» ont formulé des groupes de critères pour évaluer le PL:

  1. Applicabilité à la formation.
  2. Environnement de langage et de développement.
  3. Support et disponibilité.
  4. À utiliser en dehors du cours d'introduction.

Armés de ces critères, Linda Mannila et Michael de Raadt ont compilé un tableau de comparaison des langues.



Dans l'original, chaque critère a des caractéristiques supplémentaires qui ne sont pas si importantes pour nous. Nous sommes intéressés par le fait que les leaders de la partition finale des auteurs sont Python et Eiffel , un langage qui peut difficilement être qualifié de populaire.

Au début, j'espérais classer le PJ en fonction de ces critères et tirer mes propres conclusions, mais, en regardant la colonne Haskell, j'ai trouvé des mensonges sur chaque élément! Et il a décidé que le tableau n'avait rien à voir avec la réalité - c'est une comparaison tellement «objective».

Après réflexion, je suis arrivé à la conclusion qu'une telle comparaison n'a aucun sens. Supposons que j'ajoute une colonne avec Kotlin et que je mette une coche dans chaque élément, ou non. Cela ne signifierait absolument rien.

Ensuite, j'ai décidé de voir ce qui est utilisé pour la formation en fait. Ici, l'image est différente.


Source de données .

Le fait que les données pour 2014 ne devraient pas vous embrouiller, car les systèmes d'enseignement supérieur évoluent très lentement et la situation globale n'a pas beaucoup changé à ce jour.

Python est toujours à la première place, Java - reflète les demandes d'Oracle, de Sun Microsystems et d'autres sociétés pour apprendre ce langage. Parmi les universités qui commencent à enseigner la programmation C ++, il y a probablement l'Université du Texas - Björn Straustrup y lit le cours initial et, je pense, les étudiants le font bien.

De nombreuses langues présentant un intérêt pour la communauté universitaire ne relevaient pas du tout de cette note, en particulier:

  • PL fonctionnels avec typage statique de Haskell et ML, populaire parmi les chercheurs.
  • Largement utilisé dans le développement Web, avec typage dynamique de JavaScript, Ruby, PHP.
  • Langages industriels spécifiques à la plate-forme Objective-C et C # / Visual Basic.

Avec ce dernier, il est tout à fait compréhensible que, historiquement, les universités ne veulent pas de liens rigides avec quoi que ce soit.

La voix du peuple


Après avoir étudié l'histoire du problème, j'ai décidé de connaître l'opinion des développeurs modernes à travers une enquête sur Twitter . La question était formulée comme suit: "Quelle propriété d'un langage de programmation considérez-vous la plus importante lors du choix du PREMIER langage pour l'enseignement de la programmation?" Et il a proposé des options de réponse assez faciles à corréler avec des langues spécifiques.

Compte tenu de toutes les caractéristiques techniques des sondages sur Twitter, les résultats sont les suivants.



Plus de la moitié des répondants ont déclaré que la simplicité est la chose principale. 25% qui ont répondu à la prévalence pensent apparemment que nous devrions immédiatement penser à la demande du marché. Un pourcentage élevé de personnes qui pensent que vous devez d'abord traiter les pointeurs est alarmant. Et le fait que seulement 8% pour un ensemble riche de bibliothèques montre que la première langue ne doit toujours pas être conçue pour faire quelque chose de réel.

Réponses au sondage


Je vais donner quelques opinions intéressantes de la discussion de l'enquête.

Dmitry Kovanikov ( @ChShersh ) - un développeur et enseignant expérimenté - a exprimé un certain nombre de considérations importantes, avec lesquelles je suis entièrement d'accord: « Haut niveau et interactivité. Pour obtenir le résultat du programme et pouvoir le voir, cela a été possible avec un nombre minimum d'étapes. La programmation ne consiste pas à créer des variables, des boucles ou des récursions, il s'agit de résoudre des problèmes avec les moyens de PL. »

Artyom Pelenitsyn ( @ ulysses4ever ) a noté la composante méthodologique: «La présence d'outils méthodologiques spécialisés (manuels, cahiers de tâches, didacticiels, forums de questions-réponses) et techniques (IDE simples et intelligibles avec une interface minimaliste, outils pas à pas / débogueurs avec interface graphique).»

Andrei Miskov ( @andreymiskov ) a rappelé un autre facteur important: « Prévisibilité : ne vous laissez pas distraire par null / indéfini et 0,1 + 0,2. Augmentation progressive des opportunités: pas de POO ni de mutations jusqu'à ce que vous maîtrisiez les données et les fonctions. Comme dans Racket / HtDP ou Pyret / PAPL. "

Les défenseurs de C ont été trouvés: «Personnellement, je crois que C était et reste le meilleur pour une étude plus fondamentale. À mon avis, la syntaxe est simple et assez intuitive , et il existe de nombreux concepts différents (mémoire, pointeurs, pile, allocations). Un seul MAIS, en aucun cas C89, au moins C99, mais mieux C11. »

Il y avait des références à Scala et Rust - et dans le contexte de la frappe et de la simplicité. Ce qui nous fait penser que, malheureusement,langages de programmation comme sectes totalitaires . Ils ont des adeptes qui, malgré tout, font la promotion de leur langue préférée et ne veulent pas écouter les critiques (et, en général, les opinions des autres).

Un exemple frappant d'un tel "sectarisme" est le débat sur la manière de désigner la tâche "=" ou ": =". Ce différend a déjà plus de 40 ans, il existe des articles consacrés uniquement à cette question. Et ce n'est là qu'une des raisons parmi des centaines de ces «questions importantes».
Ne pas holivarit - vulgarisez votre langue, mais n'agissez pas en tant qu'adhérents des sectes totalitaires.

Différences entre langue industrielle et langue d'enseignement


Nous sommes presque arrivés à trouver la solution finale au problème du choix de la première langue. Il ne reste plus qu'à déterminer en quoi la langue d'enseignement diffère de la langue industrielle.

Premièrement, dans un langage industriel, il y a toujours plusieurs façons d'atteindre le même objectif.

Deuxièmement, les messages d'erreur dans les langues industrielles visent à garantir que le professionnel comprend rapidement quel est le problème et le corrige. En conséquence, ils contiennent de nombreuses informations techniques utiles pour un spécialiste, qu'un débutant peut effrayer et confondre. Cet aspect rend parfois impossible l'utilisation d'une langue professionnelle pour l'enseignement. Si vous avez déjà vu des messages d'erreur en C ++, vous comprendrez de quoi je parle.

Et enfin, les objectifs sont différents. Par exemple, la vitesse est importante dans le fonctionnement industriel, mais peu importe lorsque vous maîtrisez simplement la programmation.
Apprendre YP quand vous savez programmer est facile. Dans le problème avec la première langue, il faut apprendre à programmer, et c'est plus difficile.
Sur la question de l'enseignement de la programmation en tant que telle, il existe également des livres, par exemple.



Dans un livre très classique (il suffit de regarder la couverture) «La structure et l'interprétation des programmes informatiques», on a l'impression que la programmation est une activité magique et que les programmeurs sont des sorciers aux capacités exceptionnelles. Ceci, bien sûr, est un mensonge complet.

La couverture du deuxième livre, Comment concevoir des programmes, reflète une approche complètement différente - l'ingénierie. Je l'aime beaucoup plus et je crois que vous devez apprendre à programmer comme n'importe quelle autre entreprise d'ingénierie.

Il existe plusieurs principes importants dans Comment concevoir des programmes que vous devez apprendre lors de l'apprentissage de la programmation:

  • Comment lire l'énoncé du problème et identifier les composants de la solution.
  • Comment transférer une tâche dans la structure du programme.
  • , , .
  • , .

Beginning Student Language


Pour mettre en œuvre ces principes, l'auteur du livre Matthias Felleisen a proposé l'idée des langues pour l'apprentissage. Ce sont des langues qui étendent progressivement leurs capacités.

Tout commence par BSL - Beginning Student Language - dans lequel il n'y a que le minimum nécessaire: définition de fonction, appel de fonction, opération conditionnelle, arithmétique. Et puis, avec les tâches, le langage se développe progressivement, des constructions telles que des listes, des récursions et des fonctions d'ordre supérieur sont ajoutées. Progressivement, avec l'aide du langage, déjà SL, il devient possible de résoudre des problèmes plus complexes. Cette chaîne se termine avec le langage Racket de la famille Lisp, qui est la fermeture de tous les précédents et permet au programmeur d'implémenter n'importe quoi.

Voici à quoi ressemble un programme élémentaire dans l'environnement DrRacket pour un étudiant débutant.


Pyret


Une autre approche de l'enseignement de la programmation a été proposée par Shriram Krishnamurthi et al. Ils ont créé le langage Pyret et publié le livre Programming and Programming Languages, car, je le répète, personne n'apprendra le langage sans matériel de formation.

Faites attention aux titres de certains chapitres de ce tutoriel:

  • Introduction aux données tabulaires (4)
  • Jeux interactifs en tant que systèmes réactifs (11)
  • Exemples, tests et vérification de programme (12)
  • Graphiques (19)
  • Programmes de traitement: analyse (23)
  • Raisonnement sur les programmes: premier aperçu des types (27)
  • Objets: interprétation et types (32)

Au chapitre 11 - à la fin du premier mois de formation - ils apprennent à écrire des jeux interactifs en tant que systèmes réactifs. L'ensemble du programme est conçu pour environ six mois et les objets et les systèmes de types sont introduits presque à sa toute fin.

La langue des Pyret est construite de telle manière qu'il est possible de suivre le plan sans regarder vers l'avenir. Sur celui-ci, en fait, vous pouvez programmer tout ce qui se passe avant le 27ème chapitre, sans savoir qu'il existe des types dans la langue. Et dans le 27ème chapitre, il s'avère qu'il existe un typage statique et que vous pouvez l'utiliser. Ce langage a été créé spécifiquement pour passer du début à la fin, introduisant progressivement de nouveaux concepts en circulation.

Vous trouverez ci-dessous un exemple de programme dans Pyret et l'environnement dans lequel pour cette langue.


Par exemple, les tests intégrés dans un programme (bloc where:) sont une partie essentielle de la syntaxe. La documentation est également intégrée dans la syntaxe ( doc:). Ces constructions utiles sont de haut niveau dans la langue et leur utilisation est inculquée dans le processus d'apprentissage.

Codeworld


L'idée d'une implémentation graphique simple est implémentée dans l'environnement CodeWorld. Il a sa propre langue, mais vous pouvez utiliser Haskell et obtenir immédiatement quelque chose de beau - pour les débutants, il est attrayant.


PascalABC.NET


Notre réponse BSL et Pyret sont en cours de développement à SFU à Rostov-sur-le-Don Stanislav Mikhalkovich et ses étudiants.

C'est un Pascal qui n'est pas dépassé. Il contient, par exemple: foreach, descriptions intrablocs de variables, casse par ligne, entiers longs, classes et routines généralisées, interfaces, surcharge d'opérations, expressions lambda, exceptions, garbage collection, méthodes d'extension.

Certaines choses de .NET y apparaissent même plus tôt qu'en C #. Autrement dit, dans l'encapsuleur de syntaxe Pascal familier, il s'agit d'un superlangage avec un accès complet aux fonctionnalités de la plate-forme .NET. Il met en œuvre des concepts modernes du point de vue du développement des armes nucléaires.


Ci-dessus dans la capture d'écran, le programme de 120 lignes magnifiquement et avec animation recueille les tours de Hanoi.

Décision finale


Le lecteur avisé a déjà deviné qu'il n'y avait pas de solution définitive à la question du choix du premier langage de programmation. Ni moi ni personne d'autre ne l'avons. Et c'est bien: en informatique, nous n'avons pas besoin de manuels d'histoire uniformes qui disent le seul point de vue correct.

Au tout début de l'article, nous avons découvert ce qui est plus important, comment apprendre, que dans quelle langue. Néanmoins, il existe des moyens de commencer à étudier la programmation plus correctement du point de vue du développement futur.

Mieux vaut commencer par un langage plus adapté à cela: Racket, Pyret, Python, PascalABC.NET. L'essentiel est que la phase initiale - cette première langue - ait jeté les bases d'un développement futur.



À partir des langages de premier niveau de ce schéma, il sera facile de passer à certains des langages industriels ou académiques de base: JavaScript, C, C #, Java, Haskell, OCaml, F #. Mais si vous commencez tout de suite avec JavaScript, vous obtenez un programmeur Fortran d'une nouvelle manière, qui écrira ensuite partout comme dans JS, et ce sera terrible. Et s'il s'agit d'une deuxième langue, une telle déformation ne se produira pas.

De plus, lorsque la fondation est posée dans une certaine zone, un million d'opportunités s'ouvrent. Seuls certains d'entre eux sont représentés dans le diagramme.

Vous n'avez peut-être pas besoin de connaître de nombreuses langues pour le moment. Surtout si vous êtes développeur mobile. Mais toutes les plates-formes deviennent tôt ou tard obsolètes, et lorsque cela se produit, il s'avère que celle qui a le contexte le plus large et qui connaît plus de langues de différents domaines en bénéficiera.

Si vous passez par les langues du niveau inférieur du schéma et représenterez grossièrement leur appareil, cela fera de vous le meilleur développeur dans n'importe quelle langue.

Si (et comment autrement, vous le lisez sur Habré) vous avez déjà commencé avec succès une carrière de développeur, êtes allé profondément dans un domaine et voulez maintenant savoir ce qui se passe en dehors et où attirer votre attention - rejoignez le festival RIT ++ en ligne . Là, en deux jours (25 et 26 mai), vous pouvez obtenir une tranche de l'ensemble de l'industrie informatique, et lors des master classes du 27 mai au 10 juin, vous pouvez développer vos compétences individuelles.

All Articles