Quels langages (ou classes (comme dans les paradigmes) de langages de programmation, plus un langage recommandé de 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.
Je vais donner une liste:
Les élèves devraient être exposés à tous de ces paradigmes à tout le moins. Pas seulement un ou deux.
Je suppose que beaucoup de gens suggéreront Python pour couvrir le style procédural, OOP style et peut-être d'autres, mais je n'ai pas assez d'expérience personnelle avec Python pour pouvoir le recommander en toute confiance.
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 devraient être exposés à un langage de tous les paradigmes majeurs: procédural, orienté objet, fonctionnel et dynamique.
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.
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 au fil du temps, cela va changer en fonction de la définition individuelle du bon travail , et cela va varier selon la région géographique.
Pour le moment, je dirai que anglais est la langue n ° 1 que chaque major CS devrait connaître (ceci, bien sûr , varie selon la région.)
Pour un étudiant CS, recherchez des langages de programmation qui sont étroitement liés aux concepts CS discutés. Je suggère:
La liste pourrait continuer de cette façon, 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.
Je pense que cela change avec le temps, mais idéalement - 3 langues 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:
Comme autre métier - je pense que les programmes de CS doivent former des étudiants sur des langues importantes sur le marché. À un moment donné, je pense que 2-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 langues sur 3 avec une formation approfondie disponible dans au moins une.
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.
Je pense que la langue n'est pas aussi importante que les gens le croient.
Oui, vous devez savoir 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!
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 Java uniquement.
Est-ce 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 CV 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:
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.
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 auront tendance à devenir des monstres cancéreux sans forme.
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 être capables de 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.
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.
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) code qui se sent tellement propre.
La langue classique est Forth , mais mon rendez-vous de nos jours est Factor . Il convient également de vérifier Joy et Cat . Ne manquez pas le wiki du langage concaténatif . C'est plus amusant qu'un sac plein de marteaux!
Je crois que vous avez partiellement répondu vous-même à votre question.
Il est très 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 la plupart des opportunités de travail (probablement OOP en ce moment). Par conséquent, il est également préférable d'enseigner une langue largement utilisée pour ce paradigme, car c'est plus utile que d'apprendre quelque chose que vous n'utiliserez probablement jamais. Par conséquent, je détestais aussi avoir à é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 être en mesure d'apporter des concepts à travers.
Concrètement:
POO: .NET ou Java
Au moins 1 paradigme de programmation supplémentaire, pour sensibiliser l'étudiant à d'autres approches.
Fonctionnel: Lisp?
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 n'importe quel autre langage auquel je peux penser pour obtenir une programmation impérative/procédurale, orientée objet et fonctionnelle pour jouer Nice les uns avec les autres, et permettre une programmation à un niveau très bas (pointeurs, gestion manuelle de la mémoire, en ligne Langage d'assemblage) et un très haut niveau (programmation générique et générative) dans le même langage.
Ceci 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.range implémente l'évaluation paresseuse, mais est encore une fois un code D assez simple. Vous comprenez les coûts impliqués par les primitives de chaque paradigme, car les fonctionnalités proches 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.
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 ??
Ni quels sont les commutateurs grep
.
Écrivez en langage clair, 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.
Certains des langages de programmation utilisés pour acquérir des compétences générales en résolution de problèmes et les 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.
C.
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.
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.