Séquence d'apprentissage du langage de programmation idéale? [fermé]


17

Qu'est-ce que tu penses? Quelle est la séquence d'apprentissage de langage de programmation idéale qui couvrira la plupart des langages et paradigmes les plus utilisés aujourd'hui et aidera à saisir les bases, les idées et les pratiques de programmation communes? Vous pouvez même suggérer une séquence d'apprentissage pour les paradigmes plutôt que pour les langues.

NB: Ceci est le port de la question que j'ai posée dans stackoverflow et a été fermé pour être subjectif et argumentatif.


Grande question. Quelles auraient été les réponses si cette question était orientée vers la performance? Je suis curieux: programmers.stackexchange.com/questions/16323/… : D
JoeBilly

4
Je suis VRAIMENT surpris et ravi que Lisp apparaisse fréquemment sur les questions de haut rang.
Inaimathi

1
Cette question a également été posée ici (bien que je pense que celle-ci est venue en premier): programmers.stackexchange.com/questions/41720/…
oosterwal

Réponses:


26

Python, Lisp, C, Haskell

En supposant que la question concernait une séquence d'apprentissage idéale pour les nouveaux arrivants à la programmation (puisque les anciens à la programmation auront eu leur propre séquence d'apprentissage (probablement accidentelle)), je suggérerais de lire l'essai de Norvig sur la façon d'apprendre la programmation dans 10 ans , puis:

  1. Python : commencez par un langage dynamique, de haut niveau, OO et fonctionnel. Parce qu'il est vraiment important pour les débutants de se sentir productifs dès que possible, et ne pas être désactivé par la syntaxe étrangère, le manque de bibliothèques, le manque de multiplateforme, le manque de ressources d'apprentissage et le manque de communauté. Python est très lisible, possède des tonnes de bonnes bibliothèques (en particulier des bibliothèques scientifiques - un scientifique / ingénieur moderne doit savoir programmer), est facilement exécuté à partir de la plupart des systèmes d'exploitation, a des tonnes de tutoriels et des livres gratuits entiers, et est généralement convivial - tout en étant suffisamment puissant pour évoluer avec vous alors que vous devenez un programmeur avancé travaillant sur de gros problèmes. Il est également important de renforcer les conventions importantes et utiles pour un débutant: la lisibilité du code compte BEAUCOUP, et vous devriez écrire du code pour vous-même et pour les autres afin de le comprendre facilement.

  2. Lisp: En particulier, parcourez au moins la structure et l'interprétation des programmes informatiques ou regardez les vidéos SICP , et ouvrez grand les yeux en voyant les fondements et le pouvoir expressif de la programmation - on peut faire tellement avec si peu. Apprenez comment Lisp peut exprimer non seulement le paradigme fonctionnel, mais OO, logique / déclaratif, etc. - comme la création de nouveaux langages spécifiques au domaine. Lisez le PAIP de Norvig pour voir ce qu'un maître peut faire avec la langue. Découvrez Clojure , un dialecte Lisp moderne qui pourrait être l'une des prochaines grandes choses.

  3. C: Seulement parce que c'est la lingua-franca de l'informatique. :) Peut-être facultatif de nos jours si l'on est principalement un programmeur dans un domaine non logiciel particulier. Je trouve ça moche mais ça vaut le coup de savoir pour obtenir une appréciation du matériel sous-jacent. Allez avec K&R , bien sûr.

  4. Haskell : Puissance fonctionnelle pure. Où Com.Sci actuel. la théorie et le pouvoir expressif pratique se rencontrent. Voir Real World Haskell .

Après la tournée ci-dessus, on serait très habile pour s'attaquer aux problèmes et exprimer des solutions en code, et être totalement à l'aise avec les paradigmes ici :

texte alternatif


Je substituerais (naturellement) Smalltalk à Python en tant que n ° 1, mais je dis que savoir que Python (a) est follement plus populaire que Smalltalk et que (b) amener Smalltalk à parler à d'autres langues est aussi difficile qu'en Java , c'est-à-dire assez dur pour frustrer un débutant. La "scriptiness" de Python ressemble à un gros avantage.
Frank Shearar

Je suis d'accord avec votre énoncé de productivité. Je pense que l'apprentissage du C comme première langue absolue est une charge de conneries. Mais il devrait certainement être quelque part dans la pile.
Mark Canlas

+1 Je ne sais pas si Haskell devrait être au sommet, mais pour être honnête, je ne le sais pas encore et c'est le prochain sur ma liste, donc il se peut que ce soit la dernière langue que j'apprends.
Inaimathi

2
1-clic pour un diagramme en taille réelle @ i54.tinypic.com/168ity1.jpg
Mike Clark

Je voudrais +1 si C n'était pas dans la liste
Balog Pal

28

Voici comment je le ferais:

  1. Python (ou Ruby ou Lua): Un langage interprété, pas de types, vous pouvez faire des choses en quelques lignes. Immense bibliothèque (Python est le meilleur pour cela, je suppose). Vous pouvez approfondir les algorithmes car il n'y a pas de distraction. Aucune compilation nécessaire, lancez-la. De plus, avec Python, vous enseignez implicitement un bon style, car l'indentation en Python est obligatoire. Vous pouvez également enseigner l'orientation des objets (à Lua, c'est plus un problème). Le but ici est d'avoir beaucoup de plaisir et de montrer à l'élève ce qui peut être fait.

  2. C ++ (ou peut-être Java): Un langage typé et rapide. Si vous avez besoin de l'orientation d'objet, vous connaissez déjà certains concepts. L'idée principale est de "traduire" ce que vous avez fait en Python et de le faire avec les nouvelles contraintes (principalement les types). Maintenant, si vous avez les bons concepts, l'ajout de types n'est pas un problème. La prochaine étape consiste à penser plus bas niveau (Java ne permet pas ici), et d' enseigner des pointeurs bien . J'entends par là expliquer l'espace d'adressage, le CPU, le système d'exploitation, un peu pour que vous puissiez commencer à voir sous votre programme. Un langage compilé introduit la distinction entre interprétation et compilation, très utile pour expliquer ce qu'est le langage machine, etc.

  3. Assemblage : Enfin, pas de magie, il suffit de parler à la machine. Il y a un débat sur la syntaxe Intel et GAS, ce n'est pas important. Si vous avez MIPS, je pense que c'est mieux pour l'enseignement, mais je suppose que x86 est plus pratique car il est plus répandu (x86_64 est meilleur car a plus de registres et de subtilités). Il vous suffit de supprimer une partie de la complexité et de laisser les élèves enquêter davantage s'ils le souhaitent.

(Ces 3 premiers sont la "profondeur". Jusqu'à présent, nous avons baissé jusqu'à ce que vous touchiez le fond, qui est "proche du métal", comme on dit. Je pense que c'est très important, beaucoup de questions en programmation sont résolu lorsque vous avez une idée claire de ce qui se passe. Lorsque vous le savez, vous pouvez acquérir davantage de connaissances en toute confiance.)

  1. Schéma (ou Common Lisp ou Clojure): Comme l'a dit @dukeofgaming, les langages Lisp vous permettent d'enseigner bien la récursivité (pour ce schéma est le meilleur, car n'a pas de boucles explicites). Mais j'irais enseigner deux autres choses: les fermetures et les macros. Les macros sont ce qui sépare les langages Lisp des autres. Personnellement, je n'aime pas les macros Scheme mais ce n'est pas trop important. Je pense que les macros Clojure sont agréables, par exemple (mais la récursivité dans Clojure n'est pas aussi propre, car la JVM n'a pas de récursivité de queue). Les fermetures sont un concept très important, une fois que vous les bloquez, vous "voyez" Javascript instantanément. Après avoir étudié le C ++, Python et Lisp, Javascript devient "trivial".

  2. Haskell : Pour un langage fonctionnel, je ne pense pas que vous puissiez battre Haskell. Lisp et Scheme sont considérés comme fonctionnels, mais pour mettre l'accent sur la programmation fonctionnelle, vous devez obliger les élèves à penser sans état. Haskell a également d'autres choses très intéressantes, comme le curry et la correspondance de motifs pour la "déstructuration". Je ne connais pas beaucoup Haskell, mais la concision du code que vous pouvez écrire est tout simplement magnifique. Bien connaître Haskell facilite grandement la compréhension d'Erlang.

  3. Quatrième : un langage de pile. Cela brise à nouveau votre logique (si Lisp et Haskell ne suffisaient pas). J'irais jusqu'à enseigner à Jones's Forth car ils connaissent l'assemblage et alors vous pouvez totalement comprendre ce qui se passe. (Connaître Forth ouvre PostScript, par exemple.)

(Donc, ces 3 derniers sont l'ampleur que vous disiez. Pour moi, ces langues sont assez étranges qu'elles changent votre façon de penser. Elles l'ont fait pour moi au moins. Et je pense qu'avec elles, vous comprenez suffisamment de paradigmes pour apprendre une nouvelle langue très rapidement.)

En option, vous pouvez étudier ces éléments:

  1. SmallTalk : un langage purement orienté objet. Pour voir ce qui se passe lorsque vous prenez l'Orientation au sérieux, le langage n'a pas besoin de "si", "pour". Tout est un message: encore une grande réalisation. (Cela rendrait Objective-C facile maintenant.)

  2. Go : Une (belle) langue mettant l'accent sur la concurrence. Je trouve Go très agréable et confortable pour programmer avec.

  3. Prolog : Un autre paradigme de programmation. Je n'ai écrit aucun Prolog mais je comprends que c'est encore un autre langage époustouflant.


6
Python et Ruby (je ne connais pas Lua) sont des langages fortement typés. Je pense que vous voulez dire qu'ils sont typés dynamiquement plutôt que statiquement.
Daniel Roseman

13
Veuillez traiter C et C ++ comme deux langages distincts.
David Thornley

1
Bjarne dit : "Il n'y a pas de langage appelé" C / C ++ ". L'expression est généralement utilisée par des personnes qui n'ont aucune idée de la programmation (par exemple, le personnel RH et les gestionnaires pauvres). Alternativement, elle est utilisée par des gens qui ne le font pas simplement. connaître C ++ (et souvent pas C non plus). "
fredoverflow

1
J'aimerais que quelqu'un se dise si l'assembly doit précéder C ++. À ce stade, il serait assez facile d'aborder l'assemblage, en raison des concepts simples et d'un petit ensemble d'outils fournis, mais travailler avec la mémoire brute et les références de mémoire brute devrait être très utile lorsque vous approchez de C ++, où l'utilisation de références nominales pour traiter à la fois arbitraire les emplacements de mémoire et les valeurs confondent le sh * hors de la plupart des gens.
Filip Dupanović

1
J'ai donné à mes deux étudiants CS un cours d'une semaine dans un assembleur maquillé. En gros, j'ai inventé un ordinateur à jeu d'instructions minimal et un interprète. Ensuite, ils pouvaient écrire (et voir exécuter) des routines très simples, avec un timing. J'ai ensuite ajouté des éléments comme la mise en cache des données et la prélecture afin qu'ils puissent voir comment les fonctionnalités architecturales interagissent avec les performances. Je soupçonne qu'un assembleur artificiel et un ordinateur pourraient permettre plus de flexibilité et d'efficacité d'apprentissage, si le but est didactique, plutôt que l'acquisition de quelque chose qu'ils pourraient utiliser.
Omega Centauri

12
  • Celui dont vous avez besoin maintenant
  • Celui dont vous avez besoin ensuite
  • Celui dont vous avez besoin après cela

Sérieusement, j'ai peut-être appris le BASIC, le COBOL, le Fortran, le Forth, le Pascal et le Prolog de mon temps, mais je n'ai jamais particulièrement eu besoin de les utiliser et je ne vois pas vraiment de quelle manière ils ont influencé mon utilisation des autres langues, sauf peut-être une mauvaise application des paradigmes les uns des autres. Il m'a fallu beaucoup de temps pour désapprendre suffisamment BASIC pour écrire réellement Pascal structuré, quelques années pour arrêter d'écrire du code Pascal en C, et encore quelques années pour vraiment grogner OOP quand j'ai commencé à utiliser Objective-C et Java. D'un autre côté, depuis que je travaille (presque) exclusivement dans les langages OO, j'ai pu me concentrer sur l'amélioration de mon utilisation des langages OO, sans essayer de les faire ressembler à Scheme ou PostScript.


4
Vous savez, je pense qu'il est utile d'apprendre une nouvelle langue même si vous n'en avez pas besoin ... mais je suis d'accord avec le sentiment général qu'il est souvent préférable d'apprendre une langue parce que vous pensez que vous la trouveriez plutôt utile parce que c'est ce que vous pensez que vous "devriez" apprendre.
Tim Goodman

8

Il est difficile de prétendre qu'une séquence est idéale, mais je vais exposer un plan que je peux justifier:

  1. C

    L'apprentissage du langage C demande de la patience et de la diligence et vous présentera les méthodes de base utilisées par les ordinateurs pour traiter les données et vous montrera le plus large éventail de responsabilités qu'un programmeur peut accepter pour gérer une telle machine.

  2. Perl

    Comme antidote à la rigueur requise par C, essayez le Perl incroyablement indulgent. Ce qui a pris une semaine pour écrire en C, vous pouvez écrire en une heure en Perl. Il introduit un autre type de plaisir dans la programmation et montre comment l'exclusion de certaines préoccupations et de certains détails libère le programmeur de se concentrer sur différentes choses.

  3. C ++ , ou peut-être Java

    Ensuite, voyez comment l'accent mis par C sur les aspects bas et primitifs de la programmation sert de base pour élever le niveau d'abstraction, en notant les métiers que l'on fait en termes d'efficacité lors de la progression dans l'abstraction. Découvrez comment former des abstractions qui peuvent conserver les efficacités importantes pour votre programme.

  4. Lisp commun

    C'est la récompense du slog précédent. Vous trouverez des échos de ce que vous avez appris dans toutes les langues précédentes, et vous verrez à quel point tant de concessions précédentes semblent idiotes lors de la programmation en Lisp. Le préprocesseur C et les modèles C ++ en préparent un pour apprécier le système de macro de Lisp. Vous retrouverez la facilité d'expression de Perl, les opportunités d'optimisation de bas niveau de C, les capacités de construction d'abstractions de C ++ ou Java, et vous les dépasserez tous. Aucun des trois précédents - peut-être à part le débogueur de Perl - ne vous aura préparé à l'expérience de programmation interactive avec un REPL capable ("lecture, évaluation, boucle d'impression"). Travailler avec une image-based environment - qui change la relation entre votre code source et l'idée d'un "programme exécutable" - changera votre idée de ce que signifie construire un programme.

Au-delà de ces quatre, l'exploration d'autres styles de programmation, tels que la programmation fonctionnelle dans Haskell, ou la programmation logique dans Prolog, permet une compréhension plus complète de la gamme de programmation - des connaissances à l'échelle, si vous voulez - mais à ce stade, votre temps est mieux servi en améliorant votre métier - connaissances approfondies - avec n'importe quelle langue que vous connaissez.

Ayant goûté suffisamment de langues distinctes, votre point de vue s'élèvera pour se concentrer sur les idées qui transcendent l'une d'entre elles. C'est un peu comme la différence entre apprendre à conduire la voiture de son père et savoir conduire n'importe quelle voiture: vous n'aurez peut-être pas plaisir à conduire la mini-fourgonnette de location pendant quelques jours, sachant très bien les plaisirs de conduire une voiture de sport préférée, mais vous découvrirez comment le faire fonctionner, et tirerez sûrement plus de la pauvre bête qu'un amateur.


4
+1 pour C et Common Lisp, mais Perl comme deuxième langue ?? :) Python servirait superbement comme un langage dynamique tout en encourageant de bonnes habitudes de programmation - comme le code étant très lisible pour vous et les autres, dans les semaines, les mois ou les années après l'écriture initiale du programme.
limist

1
Concernant la recommandation Perl: c'est juste moi qui montre mon âge. Bien sûr, aujourd'hui, Python ou Ruby seraient des substituts proches, mais les deux sont plus dogmatiques que Perl, et plus biaisés vers une orientation d'objet de style classe-comme-un-sac-de-méthodes qu'un nouveau programmeur sortant de C ne fait pas pas encore besoin. Je me souviens que lorsque j'ai appris le Perl, j'étais immédiatement effroyablement productif, et ce n'est pas longtemps après que j'ai commencé à utiliser ses installations orientées objet. Trop souvent, tout ce qui se concentre sur OO est juste une cérémonie distrayante et inutile.
seh

Je suis en désaccord avec votre point de vue sur "les métiers que l'on fait en termes d'efficacité lors du passage à l'abstraction". L'un des piliers du C ++ est qu'un programme utilisant les fonctionnalités de C ++ n'est jamais plus lent qu'un programme C équivalent . Par exemple, utiliser des fonctions virtuelles en C ++ n'est jamais plus lent que simuler des fonctions virtuelles en C.
fredoverflow

C'est vrai, Fred, et c'est ce que je voulais dire: tirer parti des fonctionnalités sans réfléchir à leur fonctionnement peut entraîner des coûts - des coûts que vous auriez peut-être évités auparavant en évitant également la fonctionnalité, car cela aurait été trop compliqué ou tout simplement pas assez idiomatique à mettre en œuvre manuellement. Par exemple, se plaindre que RTTI est "trop ​​lent" soulève immédiatement la question de savoir comment vous allez résoudre le problème autrement .
seh

6

1. Smalltalk

Conçu à l'origine au moins en partie comme un moyen pour les enfants d'utiliser les ordinateurs pour apprendre. La syntaxe est assez simple à décrire dans un paragraphe. Comme LOGO, il illustre le principe de la «barrière basse à l'entrée et du plafond élevé».

Smalltalk est un pur langage OO dans le sens où "tout est un objet".

Il enseigne également de nombreuses techniques fonctionnelles, en particulier dans son API de collecte: chaîner des messages, des fonctions d'ordre supérieur, mapper, réduire, etc.

La communauté Squeak est dynamique et accueillante. Vous verrez également de nombreuses discussions sur les techniques avancées: tout comme la communauté Lisp, il y a de nombreux Smalltalkers très expérimentés sur la liste de diffusion désireux de partager leurs connaissances. (Cela ne fait pas de mal que la communauté Squeak a une grande sous-population d'éducateurs professionnels.) Il existe également une autre liste pour les débutants.

2. PROLOG

Un langage de programmation logique qui vous donnera une vision du calcul très différente de n'importe quel autre langage. Prolog est également hautement déclaratif (mais pas complètement: l' !opérateur or cut peut avoir un effet sémantique significatif sur un prédicat).

3. Lisp commun

Remplacez le schéma ici si vous le souhaitez. Common Lisp prend en charge plusieurs paradigmes, en particulier OO et fonctionnels. Il a également une longue histoire (Lisp est la deuxième langue la plus ancienne encore largement utilisée: seulement FORTRAN est plus ancienne).

4. Haskell

(Attention: je viens juste de commencer à l'apprendre.) Probablement le langage fonctionnel le plus pur de la planète. Il dispose d'un système de type statique très avancé. Des livres d' introduction pratiques existent.

5. C ou Delphi

Vous devez savoir comment fonctionnent les ordinateurs. Vous devez savoir comment la mémoire et le CPU fonctionnent réellement. Les deux sont traditionnellement "proches du métal" et ont des communautés qui encouragent à réfléchir à la façon dont leur langage se compile pour l'assemblage.

Pourquoi cette commande?

Smalltalk est très facile à apprendre, vous pouvez donc commencer rapidement à vous concentrer sur la résolution de problèmes plutôt que de combattre un compilateur ("faible barrière à l'entrée"). Une fois que vous commencez à programmer, il n'y a pas non plus de limite artificielle à ce que vous pouvez faire - "plafond haut".

Une fois que vous avez une bonne idée du fonctionnement d'OO (et - à condition qu'il y ait BEAUCOUP de compréhensions différentes de ce que signifie "OO" - il est juste de dire que OO domine le marché), passer à Prolog vous garantit de ne pas commencer pensant que OO est le seul moyen. Prolog est très différent de la plupart des langues et va étirer vos muscles mentaux afin que vous ne commenciez pas à penser que vous savez tout.

Le Common Lisp, à son tour, est le langage d'un adulte. Il a un standard mature, il est à la pointe de la conception de langages depuis des décennies (avec Smalltalk) - toutes ces nouvelles fonctionnalités sophistiquées que votre langue préférée vient d'acquérir? Les chances sont les idées incubées dans Lisp ou Smalltalk. Le lisp commun est également un peu verruqueux, et vous trouverez la verrue partout où vous allez.

Haskell est le quatrième sur la liste parce que (on me dit: je viens juste de commencer à l'apprendre) sa pureté signifie que certaines choses très courantes (comme les E / S) sont plus difficiles à faire que dans des langages moins purement fonctionnels. Les gens de Haskell utilisent également des terminologies assez exotiques (des mots comme "catamorphisme", par exemple), et vous feriez probablement mieux d'avoir une expérience de programmation à votre actif avant de vous y attaquer. (Mais je dois réitérer, je viens juste de commencer à l'apprendre! Prenez cet avis avec une pincée de sel!)

Et pourquoi C / Delphi dure-t-il? Parce qu'à moins que vous ne travailliez dans des systèmes embarqués, vous ne devriez vraiment pas avoir à apprendre la programmation en pensant que la gestion manuelle de la mémoire est tout ce qu'il y a. La collecte des ordures fonctionnait assez bien pour une machine de niveau des années 80. Votre téléphone est si puissant!

Enfin, je ne l' ai pas mis Erlang dans la liste ci - dessus , même si je devrais vraiment.


2
S'agit-il d'une séquence d' apprentissage ?
Wizard79

C'est clairement une séquence (de longueur 1).
Frank Shearar

Moins facétieusement: je vais fournir une étape dans la séquence, et vous fournissez l'autre, et la communauté votera sur l'ordre de ladite séquence, d'accord?
Frank Shearar

3
@Frank, je ne voulais pas dire ça. Je m'attendais à des séquences complètes. Et je pense que la commande ne peut pas se faire par vote.
Gulshan

S'il vous plaît, les gens: si vous allez voter contre, expliquez pourquoi .
Frank Shearar

5
  1. Python. Une excellente introduction à la programmation. Cela sera également lié à toute exposition antérieure à la programmation.

  2. Schème. Aussi une excellente introduction à la programmation. Si vous travaillez avec des novices en programmation, vous voudrez peut-être enseigner cette première et Python ensuite. Une alternative serait Python d'abord, puis Common Lisp au lieu de Scheme: plus de travail, mais plus de récompense.

  3. C. Un langage de bas niveau qui reste proche du silicium. Bon pour apprendre ce qu'un ordinateur peut faire. Vous pouvez remplacer une certaine forme de langage assembleur, mais C est assez proche des bases et beaucoup plus facile à utiliser.

  4. Prolog. Alternativement, remplacez tout langage à usage général de style déclaratif, si vous pouvez en trouver un que vous préférez.

  5. Haskell. Pour le système de type et la fonctionnalité pure, si rien d'autre.

  6. Il y a plusieurs candidats ici, car il est impossible de couvrir tous les concepts en six langues. Le Common Lisp vaut la peine d'être appris, ne serait-ce que pour le système macro et le système objet (qui est différent de la plupart des autres que j'ai vus). Forth, Tcl et APL sont toutes des langues étranges qui ont connu un certain succès, et l'une d'entre elles serait bonne pour empêcher l'élève de se sentir comme s'il ou elle a tout appris. Erlang serait bon pour la concurrence.


"Si vous avez affaire à des novices en programmation, vous voudrez peut-être enseigner cette première et Python ensuite." Très d'accord. C'est une approche que mon ancienne université adopte maintenant et elle semble très bien fonctionner.
pyvi

C'est une assez bonne liste, j'inverserais probablement l'ordre sur Haskell et Prolog. Si l'étudiant était particulièrement mal expérimenté, alors j'en ferais tomber six, augmenterais la liste et commencerais avec quelque chose de plus simple.
Orbling

4

De nombreuses bonnes réponses ont été fournies, mais je n'ai vu personne proposer SQL. C'est un animal complètement différent de la plupart des autres énumérés et très important pour tout programmeur qui doit gérer des bases de données.

Vous pouvez également envisager certains «langages» de script au niveau du système d'exploitation, tels que Batch, grep, awk, etc. «Make» peut également entrer dans cette catégorie.

Une autre langue que vous voudrez peut-être considérer (si elle n'est pas encore complètement morte) est COBOL. Il est suffisamment différent des autres langages procéduraux qu'il mérite d'être mentionné. Les variations de C, Fortran, Basic, etc. sont devenues si similaires qu'une fois que vous en connaissez un, passer à un autre n'est pas un gros problème, mais COBOL manque de beaucoup de constructions considérées comme acquises dans les autres. (Cela fait au moins 20 ans que je n'ai rien fait avec COBOL, donc mes observations peuvent ne plus être valables concernant cette langue.)

Vous voudrez peut-être mentionner APL uniquement d'un point de vue historique - ou laissez-le reposer en paix. Votre choix.


1
La raison pour laquelle je n'ai pas suggéré SQL est qu'il n'est pas un langage à usage général. Je préfère frapper les étudiants avec quelque chose de déclaratif et de plus général, comme Prolog. Les langages de script au niveau du système d'exploitation n'offrent rien de plus qu'un langage plus général comme Python ou Perl. La dernière fois que j'ai touché COBOL, il n'a offert aucun concept que vous ne pouvez pas améliorer dans d'autres langues. J'aime la suggestion APL, pas tant pour sa valeur historique que pour son langage très différent.
David Thornley

@David Thornley: Je suis d'accord que SQL n'est pas un langage à usage général. SQL possède des concepts de logique et de théorie des ensembles intéressants en tant qu'opérations de base qui n'apparaissent pas dans de nombreux autres langages, par exemple. union, join, group by, etc. qui valent la peine d'être notées pour quiconque peut avoir affaire à des bases de données.
oosterwal

Toutes les choses que j'aimerais voir enseignées à un apprenant, bien que certaines d'entre elles aient une touche historique. L'apprentissage des langages de script est un peu essentiel, mais pourrait se faire aux côtés des autres, de même pour SQL, c'est un langage de service pour les primaires. Si l'élève était très fort en mathématiques, alors commencer par APL pourrait être bien (ou peut-être R, car il est beaucoup plus facile à lire, mais peut être utilisé de la même manière).
Orbling

2

Je suggérerais d' abord de lire Eric Raymonds "Comment devenir un pirate informatique" car il a des points très intéressants sur la façon de commencer, y compris Lisp qui a la notion de "code est des données et des données est du code".

Pour la programmation, je suggérerais également Haskell, Prolog, SQL et le langage d'assemblage (juste quelques uns).

Peu importe ce que vous voulez apprendre, prenez le temps de l'apprendre correctement et d'écrire des quantités de code non triviales. C'est un peu comme faire du vélo - vous ne pouvez pas l'apprendre d'un livre.


2

Premièrement> Que voulez-vous faire lorsque vous démarrez la programmation? Apprendre à être un programmeur de jeux est différent que d'apprendre à être un programmeur de base de données pour une entreprise ... est différent d'un programmeur basé sur le Web ...

Deuxièmement> Une fois que vous commencez à apprendre, voulez-vous commencer haut et descendre? Ou commencez bas et progressez. L'apprentissage du C # (haut niveau) est très différent de l'apprentissage de l'assemblage (bas niveau).

Un choix énorme dépendra de ce que vous voulez faire. La programmation d'un pilote inclura très probablement C ou Assembly ... La programmation d'un site web sera PHP, C #, asp, etc ... Vous ne toucherez pas à assembly pour la programmation web ... etc ...

En ce qui concerne les bases ... une fois que vous décidez de ce que vous voulez faire, il est plus facile de choisir une langue. Par exemple, je suis devenu analyste de données dans un hôpital. Mon "choix" de langues est donc SQL / TSQL / DB2 pour l'accès aux données, C # WPF pour les clients Windows, Silverlight pour les clients Web, certains RPG / CL pour la logique back-end IBM ...

Personnellement, je m'en tiens à un bon livre + je construis votre propre programme pour pratiquer la langue. J'aime APress et j'ai adoré lire C # 2008 Illustrated lors de l'apprentissage de C #. Ils ont d'autres livres qui englobent les bases pour les non-initiés ainsi que pour les experts.


2

Un nouveau venu n'a besoin que d'une langue pour commencer, après avoir appris la deuxième langue, il progresse déjà au-delà de nombreux développeurs concurrents. J'apprendrais dans l'ordre suivant:

  • Smalltalk - c'est le meilleur OO, et une simple exposition vous ouvrira les yeux sur la façon dont les choses devraient être faites. Mieux vaut apprendre les concepts OO.
  • Java ou C # - fournit une approche plus architecturale et planifiée de l'OO, tout en introduisant des types vérifiés statiquement.
  • Ruby ou Python - Vous ne pouvez pas l'apprécier avant d'avoir ressenti Java ou C #
  • Erlang - accès simultané fait d'une manière qui le rend facile. C'est bien mieux que vos langages OO ou C ne peuvent le faire.
  • Lisp, Haskell ou tout autre langage fonctionnel - c'est une approche différente pour résoudre les problèmes.
  • C - Soit en créant des extensions natives pour Java, soit en implémentant des algorithmes de niveau inférieur, c'est aussi proche de l'assemblage que quelqu'un a besoin jusqu'à ce qu'il écrive des compilateurs

Vous pouvez demander "où est C ++?" et qu'en est-il de X? Honnêtement, l'apprentissage de plusieurs langues fait deux choses: il enrichit votre expérience et fournit une motivation pour apprendre plus de langues. La liste des langages que je connais bien (Java, C #, Ruby, C ++, Javascript) sont tous orientés objet - mais c'est principalement parce que c'est ce que je dois faire au travail tous les jours. La liste des langues auxquelles j'ai été exposé (Smalltalk, Python, Erlang, JESS, C, Assembly [Motorola 6502/6510], Go) m'ont toutes donné de précieuses leçons. Je peux au moins comprendre ce qui se passe avec ces langues. Il y a beaucoup de choses que je n'ai pas explorées, mais très bien à l'avenir. Il existe également quelques langages de balisage: HTML, XSL: FO, XSLT, CSS, XML, SGML auxquels les gens ont besoin d'être exposés s'ils veulent travailler avec le Web de quelque manière que ce soit.

Après avoir appris au moins deux langues différentes, je ne pense vraiment pas que vous devriez restreindre ce que quelqu'un qui a le désir d'apprendre décide de reprendre ensuite. L'apprentissage devrait être une expérience organique, et une structure trop importante dans le processus crée un groupe de personnes qui pensent exactement de la même manière. Une monoculture pour ainsi dire.


2

La plupart de ces réponses semblent à peu près les mêmes, je vais donc offrir une opinion différente. Je pense depuis longtemps que la meilleure première langue est Tcl.

Pourquoi? D'une part, c'est très facile à apprendre. Il n'y a pas beaucoup de syntaxe dans la langue, donc l'étudiant peut se concentrer davantage sur les concepts de programmation et moins sur les particularités syntaxiques d'une langue particulière. Au moment d'écrire ces lignes, Tcl a exactement 12 règles qui régissent l'ensemble du langage (contre onze pour les deux dernières décennies).

D'autre part, Tcl est livré avec un fantastique langage GUI intégré, vous pouvez donc obtenir une satisfaction relativement instantanée et apprendre les bases de la programmation événementielle.

Troisièmement, il est extensible. Vous voulez enseigner une boucle de répétition? Vous pouvez écrire une commande qui fait une boucle de répétition afin que vous puissiez non seulement apprendre à utiliser la répétition ... jusqu'à ce que vous puissiez apprendre en quoi elle est différente d'une boucle while car vous l'avez écrite vous-même.

De plus, comme il est extensible, il est facile de passer à C. Vous pouvez apprendre les bases de C et apprendre à a) étendre Tcl avec de nouvelles commandes écrites dans un autre langage, ou b) apprendre à ajouter un langage de script à un programme écrit en C.

Une fois que vous avez appris Tcl et C, la plupart des autres langues se situent quelque part entre ces deux extrêmes et devraient être relativement faciles à comprendre. Ma liste complète, avec les quatre que j'enseignerais après Tcl et C sont:

  1. Tcl
  2. C
  3. Python - pour les concepts OO, plus son comportement de définition de blocs par indentation pour contraster avec d'autres langages.
  4. Ruby - pour une approche différente de l'OO, ainsi que des rails pour en savoir plus sur les cadres
  5. java - il est utilisé partout, vous devez le connaître et vous renseigner sur la JVM
  6. groovy - retour aux langues dynamiques

1

Langage d'assemblage, C, SQL, C #

Je sais, ennuyeux et old-skool. Et toute la question ignore la partie vraiment difficile de la programmation, qui est la résolution de problèmes, la modélisation de domaine et la construction d'algorithmes. Mais voici pourquoi:

  1. vous ne pouvez pas vous frayer un chemin à travers le langage d'assemblage; vous l'obtenez ou vous ne le faites pas. le compilateur ne vous sauvera pas, il n'y a pas de surcharge de framework ou de bibliothèque, et vous ne pouvez pas vous cacher de l'architecture de la machine; c'est de la programmation pure (au niveau débutant à deux chiffres)

  2. après avoir écrit quelques programmes en langage assembleur de plus de quelques centaines de lignes, les pointeurs et la gestion de la mémoire ne sont plus mystérieux, et vous devriez avoir commencé à remarquer des modèles dans le code (if, switch, array, loops, etc. ). C fait ressortir ces motifs au soleil et les fait briller. La bibliothèque standard est utile sans être immense, mais ne vous embêtez pas avec les macros / modèles / etc. à ce stade.

  3. sauter maintenant dans les bases de données avec SQL. N'exagérez pas avec les procédures stockées, obtenez simplement les bases des tables et des requêtes.

  4. Après avoir écrit quelques programmes C de plus de quelques centaines de lignes, les pointeurs, les structures et la gestion de la mémoire sont une seconde nature et les constructions procédurales sont de vieux amis. Vous commencerez à remarquer des modèles d'ordre supérieur: ces fonctions vont toujours avec cette structure de données, cette partie du code est exactement comme cette partie du code, sauf pour les méthodes X, Y et Z, etc. Ajoutez à cela votre compréhension des données relationnelles et vous êtes maintenant prêt pour un langage orienté objet. Avec un cadre massif et une documentation généralement obtuse. Bienvenue dans le monde réel! Explorez les interfaces graphiques, écrivez des applications de bureau, écrivez des sites Web, écrivez des services Web, écrivez ce que vous voulez. Allez chercher un emploi si vous êtes si enclin.

Êtes-vous maintenant un programmeur Jedi? Un code ninja? Non , maintenant vous êtes simplement compétent. Mais vous avez une base solide sur laquelle vous pouvez explorer les nouveaux trucs amusants et brillants.


1

Vous avez besoin des fondamentaux:

  1. Langage machine
  2. Langue d'assemblage
  3. C
  4. Zézayer

Après cela, cela n'a probablement plus d'importance.


0

OK, c'est le dernier jour pour la prime. Et j'ajoute ma réponse. Ma séquence suggérée-

C, C ++, JAVA / C #, Python / Ruby, tout autre langage (Assembly / Lisp / Prolog, etc.)

  • Je ne pense pas que la première langue doit être la plus simple. Je pense plutôt que cela devrait donner une idée globale du fonctionnement de l'ordinateur en gardant une certaine abstraction.
  • La transition de C vers C ++ sera plus facile. Il y aura OOP, le paradigme le plus utilisé de nos jours.
  • La transition de C ++ vers C # / Java sera plus facile. Je préfère C # car il intègre de nombreux paradigmes comme la programmation fonctionnelle.
  • Quand quelqu'un arrive maintenant à des langages dynamiques comme Python ou Ruby, il y aura un " WoW ". Il sera plus facile de ressentir la beauté de la frappe dynamique. Mais l'apprentissage des langues dynamiques en premier et des langues statiques plus tard entraînera: " Oh! Pourquoi dois-je ajouter tout cela? "
  • Maintenant, les paradigmes et les langages les plus utilisés sont presque terminés. Alors, explorez ce que vous voulez. De l'assemblage à Lisp, Prolog ou Haskell. Et découvrez de nouveaux contextes et fonctionnalités de divers langages de programmation.

Ici, C est juste pour commencer.
Gulshan

la préférence de C # sur java dépend de nombreux facteurs, je dirais que les deux sont presque égaux.
prasonscala

0

Schéma, C, C ++

Je serai biaisé et utiliserai le modèle que mon université utilise actuellement pour son programme de base en informatique. J'étais contre pendant ma première année mais dans mes dernières années, je lui en suis reconnaissant. Le modèle est basé sur le fait de ne nécessiter aucune expérience de programmation mais de pouvoir apprendre.

  1. Schéma
    Nous sommes vous apprenez d'abord la programmation, moins il y a de magie, mieux c'est. La langue d'enseignement de Scheme présente une définition claire et raisonnable d'une langue, un très petit ensemble d'axiomes (la "magie") que vous pouvez construire et développer. Quiconque peut comprendre les fonctions en mathématiques peut tracer et raisonner les programmes Scheme. Commencer par Scheme fournit un moyen propre mais puissant de penser au calcul sans se soucier des détails spécifiques à la langue.

  2. C Le
    passage du schéma au C est radical, mais vous permet d'en savoir plus sur le mappage très important des langues de haut niveau vers les langues de bas niveau. Apprendre le modèle de mémoire (pointeurs, tas, pile, etc.) et comment les programmes sont compilés et exécutés, comment les pointeurs, la pile et le tas sont des compétences essentielles. Grâce à cette compréhension de bas niveau, vous pouvez commencer à analyser les programmes à un niveau supérieur (Big O). Vous pouvez commencer à rouler vos propres types de données abstraits, en jouant avec différentes implémentations (disons une simple table de hachage par rapport à un arbre binaire pour un ensemble).

  3. C ++
    En apprenant le C et le schéma, nous commençons à voir différents paradigmes de langages de programmation et comment ils peuvent s'appliquer à différents problèmes. Vous pouvez maintenant aborder les aspects les plus effrayants de la programmation: choix et compromis. Le choix du langage de programmation peut affecter les performances, la lisibilité, la maintenabilité, la robustesse, etc. Pour résoudre des problèmes plus grands que des choses que vous pouvez avoir en tête, ce choix est grand mais aussi dangereux. C ++ essaie de faire le moins de choix possible pour le programmeur. En apprenant le C ++, vous apprendrez comment faire ces compromis et ces choix vous-même pour résoudre vos problèmes.

Il est possible que vous n'utilisiez aucune de ces langues dans l'industrie ou que vous ne les touchiez plus jamais, mais le processus d'apprentissage les aide à comprendre les autres langues que vous utiliserez. Un autre aspect est que vous apprenez les outils autour d'une langue spécifique. Exécuter gcc via la ligne de commande, apprendre Vim, parcourir un programme à l'aide de GDB, créer des fichiers Make, archiver du code à l'aide de SVN, écrire des scripts shell pour automatiser les tests, etc.

Remarquez que le programme de base comprend également d'autres cours (architecture informatique, structures et algorithmes de données, compilateurs, systèmes d'exploitation, etc.). Il ne suffit donc pas simplement d'apprendre ces langues pour maîtriser la programmation.


0

Passer d'une langue de base à une langue de haut niveau est la voie à suivre. De cette façon, vous avez toujours une idée de ce qui se passe dans le dos.

  • C - Pointeurs et gestion de la mémoire
  • C ++ - Bases OO et toujours très populaire
  • Java / C # - Langues les plus populaires
  • Un assemblage de base
  • Langage fonctionnel - Par exemple Haskell
  • Langage de script - par exemple Python

0
  1. Python. Pour faire avancer les choses, faites une programmation ordinaire. Procédurale, OO et (dans une certaine mesure) fonctionnelle.

  2. Expressions régulières. Ils sont dans la bibliothèque Python, mais c'est une DSL distincte.

  3. Shell (BASH ou autre). Les "&", "|", ";" les opérateurs pour combiner les processus sont critiques et désagréables en Python.

  4. SQL. Il s'agit - pour l'instant - de la lingua franca pour l'accès aux données.

  5. XHTML. C'est - pour l'instant - la lingua franca pour la présentation des données.

  6. CSS.

Peut-être C si cela devenait nécessaire.


Vous semblez avoir omis l' étape de la " profonde illumination ". Est-ce le numéro 7?
Mark C

@Mark C: juste essayer de couvrir "la plupart des langages et paradigmes les plus utilisés aujourd'hui". D'après mon expérience, ces «autres» ou DSL sont peut-être plus largement utilisés que les langages de programmation. Je ne suis pas sûr que cela mène à une profonde illumination - juste une exposition à beaucoup de langues qui sont réellement utilisées.
S.Lott

Vous avez raison, je vois qu'il l'a dit, puis j'ai remarqué qu'il a aussi dit "ou paradigmes". C'était juste de bonne humeur.
Mark C

@Mark C: Mais SQL et CSS sont les "autres paradigmes" les plus intéressants. En effet, les expressions régulières sont un paradigme qui pose de nombreuses questions sur Stack Overflow.
S.Lott

0

Commencez près du métal:

  1. Assembleur
  2. C
  3. C ++
  4. C #
  5. Zézayer
  6. Python ou Ruby

Maintenant, le problème avec une approche aussi large est que personne ne peut devenir même capable à distance dans ces langues sans des années d'études.

  1. Assembleur: 3 mois
  2. C: 6 mois
  3. C ++: 2 ans
  4. C #: 6 mois
  5. Lisp: 3 mois
  6. Python / Ruby: 3 mois

Sauf si votre intention est de leur apprendre "Bonjour tout le monde", ce qui devrait prendre environ un mois pour tous 6.


-1

Pourquoi ne pas aller directement et apprendre VB ou C #. Les deux, à mon avis, sont des langues complètes allant du débutant à l'avancé, à mon humble avis.


4
Parce que ce n'est pas une étendue, et donc pas une réponse à la question. De plus, si vous pensez que l'un (ou les deux) couvre tout ce que vous devez apprendre, vous devez vous-même apprendre plus de langues.
David Thornley
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.