Quels langages de programmation chaque étudiant en informatique devrait-il apprendre?


13

Quels langages (ou classes (comme dans les paradigmes) de langages de programmation, plus un langage recommandé pour cette classe) chaque étudiant en informatique devrait-il être enseigné au collège selon vous? Motivez vos réponses; pourquoi cette langue? Quelle utilité en tirera-t-on? Quels concepts enseigne-t-il (mieux que la langue X)?

Note / clarification : Cette question concerne l'informatique avec un fort accent sur le génie logiciel, pas l'informatique pure. C'est toujours l'enseignement de l'informatique et non l'enseignement du génie logiciel qui est au centre.


13
Le pseudo-code devrait être suffisant pour CS.
Jé Queue

12
@Xepoch - en désaccord. Il n'est pas particulièrement naturel d'exprimer la sémantique d'évaluation désirée vs paresseuse, la covariance / contravariance dans les signatures de type, la théorie des catégories, etc. en utilisant un pseudo-code. Le pseudo-code est idéal pour décrire les algorithmes et les structures de données, mais CS est bien plus que cela.
Aidan Cully

6
De plus, la grande majorité des étudiants CS espèrent obtenir un emploi non académique après l'obtention de leur diplôme. Le pseudo-code ne vaudra pas grand-chose dans un marché de l'emploi compétitif. Je ne pense pas qu'un diplôme CS devrait être principalement une formation professionnelle, mais il doit faire des aménagements dans cette direction.
Adam Crossland

2
TOUS . Si le temps est limité, commencez par les lettres de l'alphabet. A +, B, C, C #, D, E, F #, J, K, Q, R, T ... Ce n'est pas une mauvaise liste, en fait.
Jesse Millikan

6
Félicitations d'avoir découvert une autre version de la "Quelle langue?" question. J'ai hâte de lire toutes les opinions. N'oubliez pas la référence au SICP. Oh attends, ça y est.
Corbin

Réponses:


21

Je vais vous donner une liste:

  • Assemblage (un dialecte relativement simple): Il est important de comprendre au moins un peu les principes fondamentaux
  • C: langage procédural, utilisé dans de nombreux endroits. N'encombre pas les nouveaux étudiants avec de nouveaux concepts comme OOD à la fois.
  • Java / C # / Eiffel / C ++: quelque chose orienté objet est bon, n'importe lequel d'entre eux atteindra l'objectif d'enseigner aux étudiants OOD et une fois qu'ils comprendront l'un de ces langages, ils devraient être capables d'apprendre les autres. bonnes langues, j'ai listé Eiffel car il a aussi du design-by-contract.
  • LISP et Prolog: enseigne aux élèves une toute nouvelle façon de penser, ce qui est important, même s'ils n'utilisent jamais l'un ou l'autre "dans le monde réel".
  • SQL et XML: présente de nouvelles façons de penser les données et comment les récupérer et les gérer.

Les étudiants devraient être exposés à tous ces paradigmes à tout le moins. Pas seulement un ou deux.

Je suppose que beaucoup de gens proposeront Python pour couvrir le style procédural, le style OOP et peut-être d'autres, mais je n'ai pas assez d'expérience personnelle avec Python pour pouvoir le recommander en toute confiance.


Je souhaite vraiment que mon école soit entrée dans les détails sur XML et SQL, nous avions une classe qui allait dans les deux et c'était terribad.

j'ajouterais des langages dynamiques modernes, comme Lua, Python, Javascript, etc.
Javier

4
ah, aussi certains fonctionnels hardcore, comme haskell et erlang sont très éducatifs
Javier

1
+1 pour lister SQL. Vous pensez au moins à l'algèbre relationnelle.
Jé Queue

1
Je séparerais également les OO non gérés, C ++ et Java. Bien que je n'aie jamais utilisé C ++ depuis uni sans en savoir plus sur malloc, le tas et la pile, vous ne comprendrez jamais aussi bien OO.
markmnl

45

Personnellement, je trouve quelque peu triste que les langages fonctionnels ne soient pas enseignés aussi majoritairement qu'avant. Je pense qu'au moins les étudiants en science-fiction doivent être exposés à un langage de tous les principaux paradigmes: procédural, orienté objet, fonctionnel et dynamique.


2
+1 Ma classe de langages de programmation était de loin la classe la plus précieuse que j'ai prise.
HappyCodeMonkey

1
En tant qu'étudiant en informatique, je suis définitivement d'accord. J'ai l'avantage de travailler à temps plein dans le monde réel pendant que je vais à l'école en tant que développeur d'applications Web de niveau junior, mais j'ai l'impression que même si j'y allais avec un diplôme CS à part entière, il me manquerait beaucoup de couverture des différents paradigmes.
Ken

1
Assez lié: youtube.com/watch?v=Ps8jOj7diA0 Stanford a ses conférences complètes de programmation de paradigmes 2008 sur YouTube.
Inaimathi

4
Ajoutez déclaratif à la liste (Prolog). De plus, certaines langues sont explicitement parallèles (Occam). Il serait bon d'enseigner aux élèves comment fonctionne le parallélisme (personne ne le comprend correctement).
Martin York

1
@Martin York: Prolog est un langage de programmation logique , qui est un type de langage déclaratif. (Je mentionne cela car les langages de programmation fonctionnels sont également déclaratifs, d'une manière générale.)
mipadi

33

Je pense qu'un étudiant CS bien équilibré devrait apprendre une langue dans chacun des 4 types de langage de programmation:

Fonctionnel - Lisp / Haskell / PostScript. Je n'ai pas beaucoup d'expérience avec Haskell, mais j'ai entendu d'autres programmeurs qui en raffolent. Comprendre les constructions de la programmation fonctionnelle et pourquoi elles sont utiles dans de nombreuses situations aidera également un programmeur à mieux organiser les algorithmes dans d'autres langages.

Orienté objet - Faites votre choix. C # / Java / Python / Ruby / yadda yadda yadda. Ce type doit être enseigné simplement parce que c'est ce que veulent les entreprises modernes.

Impératif - C / Fortran / Pascal. Celles-ci sont moins courantes de nos jours, mais elles devraient tout de même être apprises d'un point de vue pratique / historique. Les méthodes qu'ils emploient sont toujours pratiques, car dans toutes les langues, tout se résume à une instruction. Et les langues impératives sont très bonnes pour lister et suivre les instructions.

Logique - ProLog. Je n'ai jamais trouvé une bonne utilisation pratique pour aucun de ces langages, mais j'ai trouvé certains des concepts derrière les langages logiques utiles lorsque j'essaie de comprendre comment écrire certaines de mes méthodes dans des langages plus orientés objet. Je n'ai pas pu me concentrer longtemps sur les langages logiques pendant mes années collégiales, et je pense qu'une concentration plus forte là-bas aurait pu me faire du bien à l'époque.


6
Vous voudrez peut-être ajouter des prototypes à cette liste - par exemple, JavaScript.
stusmith

@stusmith - Prototypical mérite une mention, mais c'est vraiment un sous-ensemble de langages orientés objet, et javascript est au mieux un exemple limité. Je considérerais peut-être cela comme un devoir dans un cours de langages de programmation, mais pas comme un objectif.
Joel Etherton

1
+1 pour Prolog. J'ai vu son utilisation pratique et je l'utilise régulièrement pour prototyper des algorithmes.
Fred Foo le

@larsmans - Je serais intéressé de connaître votre utilisation de celui-ci. Je ne l'ai pas touché depuis plusieurs années, donc je suis flou sur de bonnes applications pratiques. Avez-vous des liens vers des livres blancs ou des articles similaires?
Joel Etherton

Découvrez ECLiPSe ( eclipseclp.org ), un dialecte Prolog open source utilisé industriellement par plusieurs grandes entreprises européennes (notamment la SNCF, si je me souviens bien; je vais essayer de trouver une référence).
Fred Foo

6

La langue n ° 1 que tous les diplômés CS devraient connaître est celle qui maximise leur potentiel pour décrocher un excellent emploi. Cela va changer avec le temps, ça va changer en fonction de la définition individuelle d'un excellent travail , et ça va varier selon la région géographique.

Pour le moment, je dirai que l' anglais est la langue n ° 1 que chaque major CS devrait connaître (cela, bien sûr, varie selon la région.)


Un excellent travail est un effet secondaire d'un diplôme CS. Un diplôme CS est juste pour cela, la connaissance de la théorie informatique. J'aurais facilement pu obtenir un meilleur emploi dans l'enseignement professionnel au lieu de me casser la tête en mathématiques et en sciences humaines pendant toutes ces années.
Jé Queue

2
+1 pour l'anglais. Les langages informatiques sont des détails d'implémentation.
Wyatt Barnett

+1. Si quelqu'un peut bien apprendre l'anglais, il peut bien apprendre les manuels. Je connaissais bien l'anglais. Je n'ai eu aucun problème à apprendre une langue.
Shiplu Mokaddim

4

Je pense que cela change avec le temps, mais idéalement - 3 langues à partir de 3 perspectives très différentes. À mon époque, c'était procédural, OO et fonctionnel - Pascal, C ++ et LISP. Je ne suis pas tellement vendu en particulier sur ces trois-là. Mais quand j'interviewe je cherche:

  • Un certain niveau d'expérience avec un langage où vous devez faire attention à la gestion de la mémoire (C / C ++ et bien d'autres)
  • Un certain niveau d'expérience avec un langage orienté objet avec des attentes sur l'utilisation des API et les différentes abstractions disponibles (C ++ / Java)
  • Une langue "extensible" - quelque chose qui est bizarre, difficile et stimulant. Je ne vais pas embaucher parce que quelqu'un connaît LISP, l'assemblage ou un autre langage difficile, mais je veux voir que l'ingénieur a été confronté à une sorte de défi qui impliquait la résolution de problèmes graves et beaucoup de "qu'est-ce que c'est?" des moments.

Comme un autre métier - je pense que les programmes de CS doivent former des étudiants sur des langues importantes sur le marché. À tout moment, je pense que 2 ou 3 langues ont une importance considérable pour la majorité des emplois. Je pense qu'une école doit aux étudiants de donner l'opportunité d'apprendre 2 sur 3 de ces langues avec une formation approfondie disponible dans au moins une.


4

Pour un étudiant CS, recherchez des langages de programmation étroitement liés aux concepts CS discutés. Je suggère:

  • Schéma, pour mieux comprendre le calcul lambda
  • Erlang, pour comprendre le modèle de l'acteur
  • Prolog, pour la logique des prédicats et les systèmes de preuve
  • Haskell, pour la théorie des types / catégories, et parce que l'évaluation paresseuse est si pleinement exprimée dans le langage
  • au moins un langage d'assemblage - si vous voulez le compter sous cette bannière, j'introduirais également un langage de code d'octet, comme les codes d'octet Java ou CLR, et le LLVM IR
  • probablement un langage de définition matérielle, comme Verilog ou VHDL
  • Bison pour une classe de construction de compilateurs
  • quelque chose avec un système de type dynamique (Ruby me vient à l'esprit) ...

La liste pourrait continuer de cette manière, mais l'idée fondamentale est assez simple: enseigner aux élèves le langage de programmation qui sera le mieux adapté à la façon dont vous voulez enseigner les concepts.


3

yacc

afin d'avoir une idée de ce qui se passe dans les coulisses, quel que soit le langage de programmation que vous utilisez. il aide à saisir les concepts de base comme le code mort et divers types d'optimisations qu'un (bon) compilateur pourra faire pour vous.


2

Lisp (avec CLOS pour OOP) et Haskell. Cette question n'est pas réservée aux étudiants. De nouveaux langages de programmation sophistiqués ont emprunté (copié, volé? ... non, ce n'est pas mal) beaucoup de fonctionnalités de ces deux. Vous pouvez vous préparer pour l'avenir. La programmation fonctionnelle (style) est plus importante aujourd'hui et est introduite dans des langages de programmation impératifs comme C # (LINQ) ou C ++ (lambda) et bien d'autres. Il est dommage que certains étudiants apprennent uniquement Java.


1
Bien que je sois d'accord avec les deux, vous voudrez peut-être exposer un certain raisonnement (je noterai également qu'il ne serait pas particulièrement utile de les connaître comme vos seules langues).
Inaimathi

2

Je pense que la langue n'est pas aussi importante que les gens le croient.

Oui, vous devez savoir comment programmer, etc., mais de nombreux grands programmeurs sont autodidactes en s'appuyant sur leurs expériences du monde réel qui les aident lors du développement.

Les étudiants pourraient faire avec quelques leçons sur la façon de programmer dans le monde réel et pas seulement sur les méthodes du livre, cela les rendrait plus "arrondis" et à mon avis de meilleurs développeurs / diplômés.

J'ai appris plus sur la programmation et le développement de logiciels après avoir quitté l'université et commencé à travailler!


2

EST-CE QUE C'EST VRAIMENT IMPORTANT ?

Habituellement, la démangeaison derrière cette question est "Quels mots à la mode puis-je mettre sur mon CV qui me décrocheront les emplois les plus lucratifs / intéressants / stimulants / faciles?". Bien que la question soit valable, la plupart des curriculum vitae sont d'abord examinés par des RH qui ne comprennent pas ce qu'ils recherchent. mais c'est très peu profond, car une fois que vous avez franchi les portes, vous devez livrer les marchandises.

Ce ne sont pas les langues que vous connaissez qui font de vous un bon ou un mauvais programmeur, c'est la façon dont vous pouvez l'utiliser. Pour cela, il existe essentiellement deux catégories de programmeurs:

  1. Ceux qui se concentrent sur l'apprentissage d'une langue à son cœur. Le plus important est la langue et comment l'utiliser. Aux extrêmes, ils ont tendance à super-optimiser chaque petite parcelle de code et utilisent souvent des fonctionnalités obscures simplement parce qu'ils le peuvent.

  2. Ensuite, il y a ceux qui veulent en savoir plus sur les techniques et les paradigmes. Le langage qu'ils utilisent n'a pas vraiment d'importance tant qu'il peut exprimer leur image mentale avec élégance. À des extrêmes, ceux-ci auront tendance à utiliser UML ou d'autres systèmes de ce type en espérant que d'autres feront le gros travail de codage.

À mon avis, vous avez besoin des deux. Le n ° 1 fournira des compétences à court terme et lorsqu'il sera judicieusement choisi, il vous facilitera les portes des RH, mais le n ° 2 restera avec vous toute votre carrière et vous définira en tant que programmeur.

# 2 fournira des conseils et organisera votre train de pensée vers une solution de travail au problème actuel, mais sans 1, cela reste une idée, flottant à jamais dans les limbes du paradis du vaporware (ou de l'enfer selon l'endroit où vous le regardez).

# 1 vous donnera les moyens de mettre en œuvre des idées dans de vrais systèmes de travail, mais sans 2, vos systèmes tendront vers des monstres cancéreux sans forme.


Oui, c'est important. La première langue que vous apprenez façonne votre cerveau quant à la façon dont vous envisagerez les langues futures.

1

Je crois que vous avez partiellement répondu vous-même à votre question.

Il est vraiment important de donner aux étudiants la possibilité d'entrer en contact avec plusieurs paradigmes, les langues réelles ne devraient pas avoir d'importance.

Bien sûr, il est important d'enseigner principalement les paradigmes qui offrent le plus de possibilités de travail (probablement la POO en ce moment). En conséquence, il est également préférable d'enseigner une langue largement utilisée pour ce paradigme, car cela est plus utile que d'apprendre quelque chose que vous n'utiliserez probablement jamais. Par conséquent, je détestais aussi devoir écrire du pseudo-code sur mes examens. Le pseudocode est très bien, tant qu'il n'a pas de syntaxe «fixe». Vous devriez simplement pouvoir faire passer des concepts.

Concrètement:

POO: .NET ou Java

Au moins 1 paradigme de programmation supplémentaire, pour sensibiliser l'étudiant à d'autres approches.

Fonctionnel: Lisp?


fonctionnel, non, pas LISP. plutôt: haskell.
mariotomo

1

Langage d'assemblage et microcode. Un étudiant CS doit comprendre toutes les couches de base de l'abstraction entre les machines d'état booléennes et les dernières fonctions / OOP / etc fonctionnelles de haut niveau. paradigme du langage de programmation.

De base ou Logo ou Squeak (et al.), S'ils veulent pouvoir comprendre comment enseigner aux jeunes enfants des notions d'informatique.

Fortran, Cobol et Lisp, s'ils veulent comprendre l'histoire des langages de programmation, et quels sont les problèmes réels que les pratiques modernes résolvent.


Et C, vous comprenez donc 90% de tout le code open source que vous pouvez étudier.
droite le

1

Choisir 3 langues ou plus dans différents paradigmes n'est pas si difficile, de nombreuses bonnes réponses ont été données. Mais si je devais choisir une seule langue, je choisirais Scala, car elle est à la fois fonctionnelle et orientée objet. Vous pouvez expliquer et comparer différentes approches dans la même langue.


1

N'oubliez pas les langages orientés pile / concaténatifs! Ils peuvent être de véritables esprits. Ils mettent l'accent sur la complexité de la construction à l'aide de petites primitives faciles à comprendre. Vous pouvez les utiliser pour écrire sans point (ou tacite) qui semble tellement propre.

La langue classique est Forth , mais mon préféré ces jours-ci est Factor . A découvrir également Joy et Cat . Ne manquez pas le wiki du langage concaténatif . C'est plus amusant qu'un sac plein de marteaux!


0

Quelque chose de fonctionnel, Haskell ou Lisp serait mon premier choix, mais peut-être Erlang. Les langages fonctionnels vous apprennent vraiment à construire des abstractions d'une manière très puissante.


Mais les étudiants devraient-ils se limiter à un seul paradigme? Qu'en est-il des langages OOP fonctionnels comme Scala?
Anto

1
Non, bien sûr que non, je supposais que d'autres personnes y répondraient!
Zachary K

0

Malgré son manque d'intégration, je trouve que D, en particulier la version 2, fournit des leçons intéressantes qui ne peuvent pas être facilement apprises ailleurs. Il fait une tentative plus sérieuse que tout autre langage auquel je peux penser pour que la programmation impérative / procédurale, orientée objet et fonctionnelle fonctionne bien les uns avec les autres, et pour permettre une programmation à un niveau très bas (pointeurs, gestion manuelle de la mémoire, en ligne) assemblage) et un très haut niveau (programmation générique et générative) dans le même langage.

C'est précieux car, plutôt que de voir des paradigmes isolés comme s'ils existaient dans des univers différents, vous pouvez voir la forêt à travers les arbres. Vous pouvez voir les forces et les faiblesses de chaque paradigme à un niveau fin en les mélangeant dans vos programmes. Vous pouvez voir comment les principaux aspects des paradigmes peuvent être mis en œuvre dans les bibliothèques en termes de code de niveau inférieur. Le module de bibliothèque standard std.algorithm implémente d'importantes primitives de programmation fonctionnelle, tout en étant un code D simple et sans magie. De même, std.rangeimplémente l'évaluation paresseuse, mais est encore un code D assez simple. Vous comprenez les coûts impliqués par les primitives de chaque paradigme, car les caractéristiques proches de D de D rendent ce qui se passe vraiment sous le capot relativement transparent. Vous pouvez même écrire quelque chose de bas niveau qui ressemble à C, puis créer une jolie interface de haut niveau dans le même langage, sans aucune couche de colle magique.


0

Pseudocode.

Les personnes sur le terrain devraient être en mesure d'expliquer leurs idées de manière cohérente et structurée sans jargon spécifique au cadre ou à la syntaxe. Je ne devrais pas avoir à connaître la différence entre vos crochets et accolades pour comprendre votre algorithme. Je ne devrais pas avoir besoin de savoir ce que ??signifie ou quels sont les grepcommutateurs.

Écrivez en langage simple, mais structurez-le et formatez-le comme du code. N'importe qui peut ensuite l'implémenter dans la langue de son choix.

edit: Cette réponse est en partie motivée par l'incapacité de certains programmeurs à écrire du pseudocode.

"Il suffit d'écrire l'algorithme en pseudocode"

"Qu'est-ce que c'est?"

Les avantages du pseudocode sont que les parties prenantes hors programmation peuvent le comprendre. Je ne dis pas que vous voulez que les BA et les utilisateurs vérifient votre code, mais cela peut aider lorsqu'un non-programmeur a une compréhension de l'algorithme requis. Le pseudo-code supprime le besoin d'expliquer for (int i = 0; i < j; i++)et ce qui est essentiellement du jargon standard.


De nombreux langages de programmation sont suffisamment puissants pour qu'il y ait peu de différence entre le code réel et le pseudo-code. À quels éléments de syntaxe des langages de programmation réels vous opposez-vous?
kevin cline

@kevin cline - Je suis à l'aise avec les éléments de syntaxe que je connais - ce sont ceux que je ne connais pas auxquels je pourrais m'opposer. Bien sûr, je suis capable de les déchiffrer, mais le fait est que le pseudocode ne devrait pas avoir ces problèmes (je n'ai pas encore vu un langage de programmation qui ressemble vraiment à un pseudocode)
Kirk Broadhurst

0

C.

  • Tout d'abord, il est toujours utilisé (largement utilisé!), Et pas seulement pour les noyaux. Je gère actuellement une application métier codée en C. Donc, même avec du C pur et simple, vous pouvez toujours obtenir un emploi. Dans les grandes entreprises, dans l'industrie, presque partout (mais dans le développement Web).
  • Si vous allez travailler dans un environnement Unix / Linux, ne pas connaître au moins un peu de C, c'est un peu comme faire du shopping et ne pas pouvoir lire les prix sur les balises.
  • Pointeurs! Tout le monde doit comprendre les pointeurs (cf. Joel Spolsky ). De plus, une fois que vous avez saisi le concept malloc, vous savez exactement quel genre de choses se produit lorsque vous tapez négligemment un "nouveau" dans un langage OOP.
  • La plupart des syntaxes "langages populaires" dérivent de C.
  • Oui, ce n'est pas toujours clair. Oui, c'est difficile à apprendre. Oui, les cordes sont un peu un cauchemar pour les débutants. Mais la programmation n'est pas toujours claire et difficile à apprendre, et vous comprendrez vraiment ce qui est génial avec la POO quand, après avoir étudié le C, vous essayez le C ++ et découvrez std :: string.

Bien sûr, il faut connaître plus d'une langue, et pas seulement une ancienne langue procédurale. Mais si je devais aller sur une île déserte avec un seul compilateur, j'irais avec mon bon vieux gcc. Vous pouvez comprendre la programmation de haut niveau si vous connaissez la programmation de bas niveau. Je pense que ce n'est pas vrai dans l'autre sens.


0

Certains des langages de programmation utilisés pour acquérir des compétences générales en résolution de problèmes et des concepts de programmation sont Logo et Karel, ils doivent être enseignés avant C / C ++ / Java / Lisp / PERL / Assembly / quel que soit le paradigme de programmation.

Les étudiants reçoivent une introduction très pratique à la programmation.


-1

N'importe quoi avec des objets. Assurez-vous simplement qu'ils l'apprennent bien.

J'embaucherais un excellent programmeur java pour c # à tout moment, mais j'aurais beaucoup de doutes à embaucher quelqu'un qui n'a jamais écrit de vrai code

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.