Ideale Lernsequenz für Programmiersprachen? [geschlossen]


17

Was denkst du? Was ist die ideale Programmiersprachen-Lernsequenz, die die meisten der heute häufig verwendeten Sprachen und Paradigmen abdeckt und dabei hilft, gemeinsame Programmiergrundlagen, -ideen und -praktiken zu verstehen? Sie können sogar Lernsequenzen für Paradigmen anstelle von Sprachen vorschlagen.

NB: Dies ist die Antwort auf die Frage, die ich im Stackoverflow gestellt habe und die ich für subjektiv und argumentativ hielt.


Gute Frage. Was wären die Antworten gewesen, wenn diese Frage leistungsorientiert gewesen wäre? Ich bin neugierig: programmers.stackexchange.com/questions/16323/… : D
JoeBilly

4
Ich bin sehr überrascht und erfreut, dass Lisp häufig bei den hochrangigen Fragen auftaucht.
Inaimathi

1
Diese Frage wurde auch hier gestellt (obwohl ich glaube, dass diese Frage an erster Stelle stand): programmers.stackexchange.com/questions/41720/…
oosterwal

Diesen Link muss man hier speichern
Gulshan

Antworten:


26

Python, Lisp, C, Haskell

Unter der Annahme, dass es sich bei der Frage um eine ideale Lernsequenz für Programmieranfänger handelt (da alte Programmierer ihre eigene (wahrscheinlich zufällige) Lernsequenz hatten), würde ich vorschlagen, Norvigs Aufsatz zu lesen, wie man in 10 Jahren Programmieren lernt :

  1. Python : Beginnen Sie mit einer dynamischen, übergeordneten OO- und funktionalen Sprache. Weil es für Anfänger sehr wichtig ist, sich so schnell wie möglich produktiv zu fühlenund nicht durch fremde Syntax, fehlende Bibliotheken, fehlende Multiplattform, fehlende Lernressourcen und fehlende Community ausgeschaltet werden. Python ist gut lesbar, verfügt über unzählige gute Bibliotheken (insbesondere wissenschaftliche Bibliotheken - ein moderner Wissenschaftler / Ingenieur muss wissen, wie man programmiert), kann von den meisten Betriebssystemen problemlos ausgeführt werden, hat unzählige Tutorials und kostenlose Bücher und ist im Allgemeinen benutzerfreundlich - und das, während Sie leistungsfähig genug sind, um mit Ihnen zu wachsen, während Sie ein fortgeschrittener Programmierer werden, der an großen Problemen arbeitet. Es ist auch wichtig, wichtige + nützliche Konventionen für einen Anfänger zu bekräftigen: Die Lesbarkeit von Code zählt eine Menge, und Sie sollten Code für sich und andere schreiben, um ihn leicht zu verstehen.

  2. Lisp: Insbesondere die Struktur und Interpretation von Computerprogrammen zumindest überfliegen oder sich die SICP-Videos ansehen und die Augen weit öffnen, indem man die Grundlagen und die Ausdruckskraft der Programmierung sieht - man kann so viel mit so wenig tun. Erfahren Sie, wie Lisp nicht nur das Funktionsparadigma, sondern auch OO, logisch / deklarativ und mehr ausdrücken kann - wie das Erstellen neuer domänenspezifischer Sprachen. Lesen Sie Norvigs PAIP, um zu sehen, was ein Meister mit der Sprache anfangen kann. Dann schauen Sie sich Clojure an , einen modernen Lisp-Dialekt, der eines der nächsten großen Dinge sein könnte.

  3. C: Nur weil es die Verkehrssprache des Rechnens ist. :) Möglicherweise optional in diesen Tagen, wenn man hauptsächlich Programmierer in einer bestimmten Nicht-Software-Domäne ist. Ich finde es hässlich, aber es lohnt sich darüber Bescheid zu wissen, um eine Wertschätzung für die zugrunde liegende Hardware zu erhalten. Natürlich mit K & R.

  4. Haskell : Reine Funktionskraft. Wo aktuelle Com.Sci. Theorie und praktische Ausdruckskraft treffen aufeinander. Siehe Real World Haskell .

Nach der obigen Tour wäre man sehr geschickt darin, Probleme anzugehen und Lösungen im Code auszudrücken, und würde sich mit den Paradigmen hier vollkommen wohlfühlen :

Alt-Text


Ich würde (natürlich) Python durch Smalltalk als Nummer 1 ersetzen, aber ich sage, dass es genauso schwierig ist zu wissen, dass Python (a) weitaus beliebter ist als Smalltalk und dass (b) Smalltalk dazu gebracht wird, mit anderen Sprachen zu sprechen, wie es in Java der Fall ist , was schwer genug zu sagen ist, um einen Neuling zu frustrieren. Pythons "Scriptiness" scheint ein großer Vorteil zu sein.
Frank Shearar

Ich stimme Ihrer Produktivitätserklärung zu. Ich denke, C als absolute Muttersprache zu lernen ist eine Menge Blödsinn. Aber es sollte definitiv irgendwo im Stapel sein.
Mark Canlas

+1 Ich bin mir nicht sicher, ob Haskell an der Spitze stehen soll, aber um fair zu sein, ich weiß es noch nicht und es steht als nächstes auf meiner Liste, sodass es möglicherweise noch die letzte Sprache ist, die ich lerne.
Inaimathi

2
1-Klick zum Diagramm in voller Größe @ i54.tinypic.com/168ity1.jpg
Mike Clark

Ich würde +1 dies, wenn C nicht in der Liste war
Balog Pal

28

So würde ich es machen:

  1. Python (oder Ruby oder Lua): Eine interpretierte Sprache, keine Typen, Sie können Dinge in wenigen Zeilen erledigen. Riesige Bibliothek (Python ist das Beste, denke ich). Sie können tief in Algorithmen gehen, weil es keine Ablenkungen gibt. Keine Kompilierung notwendig, einfach ausführen. Darüber hinaus lehren Sie mit Python implizit guten Stil, da das Einrücken in Python obligatorisch ist. Sie können auch Objektorientierung unterrichten (in Lua ist dies eher ein Problem). Der Zweck hier ist, viel Spaß zu haben und dem Schüler zu zeigen, was getan werden kann.

  2. C ++ (oder vielleicht Java): Eine typisierte, schnelle Sprache. Wenn Sie Objektorientierung benötigen, kennen Sie bereits einige Konzepte. Die Hauptidee ist, das, was Sie in Python getan haben, zu "übersetzen" und es mit den neuen Einschränkungen (hauptsächlich Typen) zu tun. Wenn Sie die richtigen Konzepte haben, ist das Hinzufügen von Typen kein solches Problem. Der nächste Schritt besteht darin, niedriger zu denken (Java hilft hier nicht) und Zeiger gut zu lehren . Damit meine ich das Erläutern des Adressraums, der CPU, des Betriebssystems, damit Sie beginnen können, unter Ihrem Programm zu sehen. Eine kompilierte Sprache führt in die Unterscheidung zwischen Interpretation und Kompilierung ein und ist sehr nützlich, um zu erklären, was Maschinensprache ist usw.

  3. Montage : Endlich keine Zauberei, du sprichst nur mit der Maschine. Es gibt eine Debatte über Intel und GAS-Syntax, es ist nicht wichtig. Wenn Sie MIPS haben, ist es meiner Meinung nach besser zum Unterrichten, aber ich nehme an, x86 ist praktischer, da es weiter verbreitet ist (x86_64 ist besser, da es mehr Register und Feinheiten hat). Sie müssen nur einen Teil der Komplexität entfernen und die Schüler weiter untersuchen lassen, wenn sie möchten.

(Diese ersten 3 sind die "Tiefe". Bis jetzt sind wir runtergegangen, bis Sie den Boden berühren, der "nahe am Metall" ist, wie sie sagen. Ich denke, das ist sehr wichtig, viele Fragen in der Programmierung sind gelöst, wenn Sie eine klare Vorstellung davon haben, was gerade passiert. Wenn Sie dies wissen, können Sie sich vertrauensvoll weiteres Wissen aneignen.)

  1. Schema (oder Common Lisp oder Clojure): Wie @dukeofgaming sagte, können Sie mit Lisp-Sprachen Rekursion gut unterrichten (für dieses Schema ist es am besten, da es keine expliziten Schleifen gibt). Aber ich würde zwei andere Dinge lehren: Abschlüsse und Makros. Makros sind das, was Lisp-Sprachen von den anderen unterscheidet. Persönlich mag ich keine Schema-Makros, aber das ist nicht so wichtig. Ich denke, Clojure-Makros sind zum Beispiel nett (aber die Rekursion in Clojure ist nicht so sauber, da die JVM keine Schwanzrekursion hat). Verschlüsse sind ein sehr wichtiges Konzept. Wenn Sie sie erst einmal in den Griff bekommen, "sehen" Sie Javascript sofort. Nach dem Studium von C ++, Python und Lisp wird Javascript "trivial".

  2. Haskell : Für eine funktionierende Sprache denke ich nicht, dass Sie Haskell schlagen können. Lisp und Scheme gelten als funktional, aber um die funktionale Programmierung hervorzuheben, müssen Sie die Schüler zwingen, ohne Zustand zu denken. Haskell hat auch andere sehr schöne Dinge, wie Currys und Pattern Matching für "Destructuring". Ich kenne Haskell nicht sehr gut, aber die Prägnanz des Codes, den Sie schreiben können, ist einfach wunderschön. Wenn Sie Haskell gut kennen, können Sie Erlang viel einfacher verstehen.

  3. Forth : Eine Stack-Sprache. Es bricht deine Logik wieder total (wenn Lisp und Haskell nicht genug wären). Ich würde so weit gehen, Jones's Forth zu unterrichten, da sie sich mit Zusammenbau auskennen, und dann können Sie vollkommen verstehen, was los ist. (Knowing Forth öffnet beispielsweise PostScript.)

(Also sind diese letzten 3 die Breite, die Sie gesagt haben. Für mich sind diese Sprachen seltsam genug, dass sie Ihre Denkweise ändern. Sie haben es zumindest für mich getan. Und ich denke, mit diesen verstehen Sie genug Paradigmen, um eine neue Sprache zu lernen sehr schnell.)

Optional können Sie diese lernen:

  1. SmallTalk : Eine rein objektorientierte Sprache. Um zu sehen, was passiert, wenn Sie die Objektorientierung ernst nehmen, benötigt die Sprache kein "if", "for". Alles ist eine Botschaft: wieder große Erkenntnis. (Dies würde Objective-C jetzt einfacher machen.)

  2. Go : Eine (schöne) Sprache mit Schwerpunkt auf Nebenläufigkeit. Ich finde Go sehr schön und angenehm zu programmieren.

  3. Prolog : Ein weiteres Paradigma der Programmierung. Ich habe keinen Prolog geschrieben, aber ich verstehe, dass es eine weitere Sprache ist, die den Verstand erschüttert.


6
Python und Ruby (ich kenne Lua nicht) sind stark typisierte Sprachen. Ich denke, Sie meinen, dass sie eher dynamisch als statisch getippt sind.
Daniel Roseman

13
Bitte behandeln Sie C und C ++ als zwei separate Sprachen.
David Thornley

1
Bjarne sagt : "Es gibt keine Sprache namens" C / C ++ ". Der Ausdruck wird normalerweise von Leuten verwendet, die keine Ahnung von Programmierung haben (z. B. HR-Personal und schlechte Manager). Alternativ wird er von Leuten verwendet, die dies einfach nicht tun C ++ kennen (und oft auch nicht C). "
Fredoverflow

1
Ich möchte, dass jemand darüber streitet, ob die Assembly C ++ vorangehen soll. Zu diesem Zeitpunkt wäre es aufgrund der einfachen Konzepte und einer kleinen Anzahl von Tools recht einfach, sich der Assembly zu nähern. Die Arbeit mit Rohspeicher- und Rohspeicherreferenzen sollte jedoch sehr hilfreich sein, wenn Sie sich C ++ nähern, bei dem nominalen Referenzen verwendet werden, um beide willkürlich zu adressieren Speicherorte und Werte verwirren die meisten Menschen.
Filip Dupanović

1
Ich gab meinen beiden CS-Schülern einen einwöchigen Kurs in einem geschminkten Assembler. Grundsätzlich habe ich einen Computer mit minimalem Befehlssatz und einen Interpreteur erfunden. Dann konnten sie einige sehr einfache Routinen schreiben (und laufen sehen), einschließlich des Timings. Dann habe ich Dinge wie Daten-Caching und Prefetching hinzugefügt, um zu sehen, wie Architekturmerkmale mit der Leistung interagieren. Ich vermute, dass ein künstlicher Assembler und Computer mehr Flexibilität und Lerneffizienz ermöglichen, wenn der Zweck didaktisch ist und nicht die Anschaffung von etwas, das sie möglicherweise verwenden.
Omega Centauri

12
  • Die, die du jetzt brauchst
  • Das, was du als nächstes brauchst
  • Die, die du danach brauchst

Im Ernst, ich habe in meiner Zeit vielleicht BASIC, COBOL, Fortran, Forth, Pascal und Prolog gelernt, aber ich habe sie nie besonders gebraucht und kann nicht wirklich erkennen, inwiefern sie meinen Umgang mit anderen beeinflusst haben Sprachen, außer vielleicht Paradigmen von einem in den anderen falsch anwenden. Es dauerte eine Ewigkeit, bis ich BASIC genug verlernt hatte, um strukturiertes Pascal tatsächlich zu schreiben, ein paar Jahre, um Pascal-Code nicht mehr in C zu schreiben, und ein paar Jahre, um OOP tatsächlich zu aktivieren, als ich anfing, Objective-C und Java zu verwenden. Andererseits konnte ich mich darauf konzentrieren, die Verwendung von OO-Sprachen zu verbessern, ohne zu versuchen, sie wie Scheme oder PostScript aussehen zu lassen, da ich (fast) ausschließlich in OO-Sprachen gearbeitet habe.


4
Wissen Sie, ich denke, es ist ein gewisser Wert, eine neue Sprache zu lernen, auch wenn Sie sie nicht brauchen. Ich stimme jedoch der allgemeinen Meinung zu, dass es oft besser ist, eine Sprache zu lernen, weil Sie denken, dass Sie sie eher nützlich finden weil es das ist, was du denkst, dass du lernen sollst.
Tim Goodman

8

Es ist schwer zu behaupten, dass jede Sequenz ideal ist, aber ich werde einen Plan aufstellen, den ich rechtfertigen kann:

  1. C

    Das Erlernen von C erfordert Geduld und Fleiß und führt Sie in die grundlegenden Methoden des Computerbetriebs ein und zeigt Ihnen die weitesten Verantwortlichkeiten, die ein Programmierer für den Umgang mit einem solchen Computer übernehmen kann.

  2. Perl

    Versuchen Sie als Gegenmittel gegen die von C geforderte Strenge das unglaublich verzeihende Perl. Was in C eine Woche gedauert hat, kann in einer Stunde in Perl geschrieben werden. Es bietet eine andere Art von Freude an der Programmierung und zeigt, wie der Programmierer sich ohne bestimmte Bedenken und Details auf verschiedene Dinge konzentrieren kann.

  3. C ++ oder vielleicht Java

    Sehen Sie sich als Nächstes an, wie Cs Konzentration auf einfache und primitive Aspekte der Programmierung als Grundlage für die Erhöhung der Abstraktionsebene dient und dabei feststellt, welche Abläufe man in Bezug auf die Effizienz in der Abstraktion macht. Erfahren Sie, wie Sie Abstraktionen erstellen, bei denen die für Ihr Programm wichtigen Effizienzvorteile erhalten bleiben.

  4. Common Lisp

    Dies ist die Belohnung für den vorangegangenen Slog. Sie werden Echos dessen finden, was Sie in allen vorhergehenden Sprachen gelernt haben, und sehen, wie albern so viele der vorhergehenden Zugeständnisse erscheinen, wenn Sie in Lisp programmieren. Der Präprozessor von C und die Vorlagen von C ++ bereiten einen darauf vor, Lisps Makrosystem zu schätzen. Sie werden die Leichtigkeit des Ausdrucks von Perl, die Möglichkeiten der Low-Level-Optimierung von C, die abstraktionsbildenden Fähigkeiten von C ++ oder Java wiedererlangen und sie alle weit hinter sich lassen. Keiner der vorhergehenden drei - vielleicht mit Ausnahme von Perls Debugger - hat Sie auf die interaktive Programmiererfahrung mit einer fähigen REPL ("read, eval, print loop") vorbereitet . Mit einem Bild arbeiten-basierte Umgebung - die die Beziehung zwischen Ihrem Quellcode und der Idee eines "ausführbaren Programms" ändert - ändert Ihre gesamte Vorstellung davon, was es bedeutet, ein Programm zu erstellen.

Wenn Sie sich darüber hinaus mit anderen Programmierstilen wie der funktionalen Programmierung in Haskell oder der logischen Programmierung in Prolog befassen, erhalten Sie ein umfassenderes Verständnis des programmierweiten Wissens, wenn Sie so wollen. Zu diesem Zeitpunkt ist Ihre Zeit jedoch besser gerüstet indem Sie Ihr Handwerk verbessern - tiefe Kenntnisse - mit jeder Sprache, die Sie kennen.

Wenn Sie genug verschiedene Sprachen gekostet haben, wird sich Ihre Sicht auf die Ideen konzentrieren, die über eine von ihnen hinausgehen. Es ist ein bisschen wie der Unterschied zwischen dem Erlernen des Autofahrens Ihres Vaters und dem Wissen, wie man ein Auto fährt: Es kann sein, dass Sie einige Tage lang keinen Miet-Minivan fahren müssen, wenn Sie die Freuden eines Lieblingssportwagens genau kennen. aber Sie werden herausfinden, wie man es bedient, und werden mit Sicherheit mehr aus dem armen Tier herauslocken als ein Amateur.


4
+1 für C und Common Lisp, aber Perl als zweite Sprache? :) Python eignet sich hervorragend als dynamische Sprache und fördert gleichzeitig gute Programmiergewohnheiten - beispielsweise, dass Code in den Wochen, Monaten oder Jahren nach dem ersten Schreiben des Programms für Sie und andere sehr gut lesbar ist.
Limist

1
Bezüglich der Perl-Empfehlung: Ich zeige nur mein Alter. Sicher, heute wären Python oder Ruby enge Substitute, aber beide sind dogmatischer als Perl und voreingenommener gegenüber der Objektorientierung, die ein neuer Programmierer aus C herausholt brauche ich noch nicht Ich erinnere mich, dass ich, als ich Perl lernte, sofort erschreckend produktiv war und nicht lange danach begann, seine objektorientierten Funktionen zu nutzen. Allzu oft ist der Fokus von OO nur ablenkend und unnötig.
SEH

Ich bin nicht einverstanden mit Ihrer Ansicht, dass "die Trades, die man in der Effizienz macht, wenn man in der Abstraktion aufsteigt". Eine der Säulen von C ++ ist, dass ein Programm, das die Funktionen von C ++ nutzt, niemals langsamer ist als ein gleichwertiges C-Programm. Beispielsweise ist die Verwendung von virtuellen Funktionen in C ++ nie langsamer als die Simulation von virtuellen Funktionen in C.
Fredoverflow

Richtig, Fred, und genau das habe ich gemeint: Wenn Sie Features nutzen, ohne darüber nachzudenken, wie sie funktionieren, können sich Kosten ergeben - Kosten, die Sie möglicherweise zuvor vermieden haben, indem Sie auch die Feature-Funktionen vermieden haben, weil sie unerschwinglich kompliziert oder nur unzureichend idiomatisch gewesen wären manuell zu implementieren. Wenn Sie sich beispielsweise beschweren, dass RTTI "zu langsam" ist, stellt sich sofort die Frage, wie Sie das Problem sonst lösen können.
SEH

6

1. Smalltalk

Entwarf ursprünglich zumindest teilweise, damit Kinder mit Computern lernen können. Die Syntax ist einfach genug, um sie in einem Absatz zu beschreiben. Es steht wie LOGO beispielhaft für das Prinzip "niedrige Eintrittsbarriere, hohe Decke".

Smalltalk ist eine reine OO-Sprache in dem Sinne, dass "alles ein Objekt ist".

Es werden auch viele funktionale Techniken unterrichtet, insbesondere in der Sammlungs-API: Verketten von Nachrichten, Funktionen höherer Ordnung, Zuordnen, Reduzieren usw.

Die Squeak- Community ist lebendig und einladend. Sie werden auch viele Diskussionen über fortgeschrittene Techniken sehen: Ähnlich wie in der Lisp-Community gibt es viele sehr erfahrene Smalltalker auf der Mailingliste, die bereit sind, ihr Wissen zu teilen. (Es tut nicht weh, dass die Squeak-Community eine große Unterpopulation professioneller Pädagogen hat.) Es gibt auch eine andere Liste für Anfänger.

2. PROLOG

Eine logische Programmiersprache , mit der Sie eine ganz andere Ansicht der Berechnung erhalten als mit nahezu jeder anderen Sprache. Prolog ist sehr auch deklarative (aber nicht ganz so: die !oder Schnitt Betreiber eine erhebliche semantische Wirkung auf einem Prädikat haben können).

3. Common Lisp

Wenn Sie möchten, ersetzen Sie hier das Schema. Common Lisp unterstützt mehrere Paradigmen, insbesondere OO und funktional. Es hat auch eine lange Geschichte (Lisp ist die zweitälteste noch weit verbreitete Sprache: nur FORTRANs ältere).

4. Haskell

(Einschränkung: Ich habe gerade erst angefangen, es zu lernen.) Wahrscheinlich die reinste funktionale Sprache auf dem Planeten. Es hat ein sehr fortgeschrittenes statisches Typensystem. Handlicher Intro Bücher existieren.

5. C oder Delphi

Sie müssen wissen, wie Computer funktionieren. Sie müssen wissen, wie Speicher und CPU tatsächlich funktionieren. Beide sind traditionell "nah am Metall" und haben Gemeinschaften, die zum Nachdenken anregen, wie sich ihre Sprache zu einer Versammlung zusammensetzt.

Warum diese Bestellung?

Smalltalk ist sehr einfach zu erlernen, sodass Sie sich schnell auf das Lösen von Problemen konzentrieren können, anstatt gegen einen Compiler zu kämpfen ("niedrige Eintrittsbarriere"). Sobald Sie mit dem Programmieren beginnen, gibt es auch keine künstliche Beschränkung Ihrer Möglichkeiten - "High Ceiling".

Wenn Sie eine faire Vorstellung davon haben, wie OO funktioniert (und - mit der Maßgabe, dass es VIELE unterschiedliche Auffassungen darüber gibt, was "OO" bedeutet - kann man sagen, dass OO den Markt beherrscht), stellt Prolog sicher, dass Sie nicht anfangen zu denken, dass OO der einzige Weg ist. Prolog unterscheidet sich sehr von den meisten Sprachen und spannt Ihre mentalen Muskeln, sodass Sie nicht glauben, dass Sie alles wissen.

Common Lisp wiederum ist die Sprache eines Erwachsenen. Es hat einen ausgereiften Standard, es ist seit Jahrzehnten führend im Sprachdesign (zusammen mit Smalltalk) - all diese ausgefallenen neuen Funktionen, die Ihre Lieblingssprache gerade erworben hat? Wahrscheinlich sind die Ideen in Lisp oder Smalltalk inkubiert. Gemeines Lisp ist auch ein bisschen wartig, und Sie werden Wartiness finden, wohin Sie gehen.

Haskells vierter Platz auf der Liste, weil (mir wurde gesagt: Ich habe gerade erst angefangen, es zu lernen) seine Reinheit bedeutet, dass einige sehr häufige Dinge (wie E / A) schwieriger zu tun sind als in weniger rein funktionalen Sprachen. Die Haskell-Leute verwenden auch einige ziemlich exotische Terminologien (Wörter wie "Katamorphismus"), und Sie wären wahrscheinlich besser dran, wenn Sie ein wenig Programmiererfahrung mitbringen würden, bevor Sie sich damit befassen. (Aber ich muss noch einmal wiederholen, ich habe gerade erst angefangen, es zu lernen! Nimm diese Meinung mit einer Prise Salz an!)

Und warum C / Delphi zuletzt? Denn wenn Sie nicht in eingebetteten Systemen arbeiten, sollten Sie nicht lernen müssen, wie man den manuellen Speicher verwaltet. Die Müllabfuhr funktionierte gut genug für eine Maschine der 80er Jahre. Ihr Telefon ist so leistungsfähig!

Schließlich habe ich Erlang nicht in die obige Liste aufgenommen, obwohl ich es wirklich sollte.


2
Ist das eine Lernsequenz ?
Wizard79

Es ist eindeutig eine Sequenz (mit der Länge 1).
Frank Shearar

Weniger scherzhaft: Ich werde einen Schritt in der Sequenz bereitstellen, und Sie stellen den anderen bereit, und die Community wird über die Reihenfolge der Sequenz abstimmen, in Ordnung?
Frank Shearar

3
@Frank Das habe ich nicht gemeint. Ich habe volle Sequenzen erwartet. Und ich denke, die Bestellung kann nicht durch Abstimmung erfolgen.
Gulshan

Bitte Leute: Wenn Sie abstimmen wollen, erklären Sie warum .
Frank Shearar

5
  1. Python. Eine hervorragende Einführung in die Programmierung. Dies knüpft auch an frühere Programmierkenntnisse an.

  2. Planen. Auch eine hervorragende Einführung in die Programmierung. Wenn Sie mit Programmieranfängern zu tun haben, sollten Sie dies zuerst und Python zweitens unterrichten. Eine Alternative wäre zuerst Python und dann Common Lisp anstelle von Scheme: mehr Arbeit, aber mehr Belohnung.

  3. C. Eine einfache Sprache, die in der Nähe des Siliziums bleibt. Gut, um zu lernen, was ein Computer kann. Sie könnten irgendeine Form der Assemblersprache ersetzen, aber C ist ziemlich nah an den Grundlagen und viel einfacher zu handhaben.

  4. Prolog. Ersetzen Sie alternativ eine Allzwecksprache im deklarativen Stil, wenn Sie eine Sprache finden, die Ihnen besser gefällt.

  5. Haskell. Für das Typensystem und reine Funktionalität, wenn nichts anderes.

  6. Hier gibt es mehrere Kandidaten, da es unmöglich ist, alle Konzepte mit sechs Sprachen abzudecken. Es lohnt sich, Common Lisp zu lernen, wenn auch nur für das Makrosystem und das Objektsystem (was sich von den meisten anderen unterscheidet, die ich gesehen habe). Forth, Tcl und APL sind alles merkwürdige Sprachen, die einige Erfolge erzielt haben, und eine davon wäre gut, um zu verhindern, dass der Schüler das Gefühl hat, alles gelernt zu haben. Erlang wäre gut für die Nebenläufigkeit.


"Wenn Sie sich mit Programmieranfängern beschäftigen, möchten Sie vielleicht zuerst dies und dann Python lernen." Sehr zugestimmt. Das ist ein Ansatz, den meine frühere Universität jetzt verfolgt, und er scheint sehr gut zu funktionieren.
Pyvi

Dies ist eine ziemlich gute Liste, ich würde wahrscheinlich die Reihenfolge bei Haskell und Prolog umkehren. Wenn der Student besonders unerfahren wäre, würde ich sechs ablegen, die Liste anheben und mit etwas Einfacherem beginnen.
Orbling

4

Es wurden viele gute Antworten gegeben, aber ich habe niemanden gesehen, der SQL anbietet. Es ist ein völlig anderes Tier als die meisten anderen aufgelisteten und sehr wichtig für jeden Programmierer, der mit Datenbanken zu tun hat.

Möglicherweise möchten Sie auch einige Skriptsprachen auf Betriebssystemebene in Betracht ziehen, z. B. Batch, grep, awk usw. 'Make' kann ebenfalls in diese Kategorie fallen.

Eine andere Sprache, die Sie in Betracht ziehen könnten (wenn sie noch nicht vollständig tot ist), ist COBOL. Es unterscheidet sich hinreichend von anderen Verfahrenssprachen, so dass es eine Erwähnung verdient. Variationen von C, Fortran, Basic usw. sind so ähnlich geworden, dass der Wechsel zu einem anderen, sobald Sie mit einem vertraut sind, kein großes Problem darstellt, aber COBOL fehlen viele der Konstrukte, die in den anderen als selbstverständlich vorausgesetzt werden. (Es ist mindestens 20 Jahre her, dass ich etwas mit COBOL gemacht habe, sodass meine Beobachtungen in Bezug auf diese Sprache möglicherweise nicht mehr gültig sind.)

Vielleicht möchten Sie APL nur aus historischer Sicht erwähnen - oder es in Ruhe lassen. Deine Entscheidung.


1
Der Grund, warum ich SQL nicht vorgeschlagen habe, ist, dass es keine Allzwecksprache ist. Ich würde die Schüler lieber mit etwas Erklärendem und Allgemeinerem wie Prolog schlagen. Skriptsprachen auf Betriebssystemebene bieten nichts, was eine allgemeinere Sprache wie Python oder Perl nicht bietet. Zuletzt habe ich COBOL angesprochen, es gab keine Konzepte, die man in anderen Sprachen nicht verbessern kann. Ich mag den APL-Vorschlag, nicht so sehr für den historischen Wert, als dass es eine ganz andere Sprache ist.
David Thornley

@ David Thornley: Ich stimme zu, dass SQL keine Allzwecksprache ist. SQL hat einige interessante logische und Mengen-Theorie-Konzepte als Grundoperationen, die in vielen anderen Sprachen nicht verfügbar sind, z. Vereinigung, Beitritt, Gruppierung usw., die für jeden, der mit Datenbanken zu tun hat, erwähnenswert sind.
Osterwal

Alle Dinge, die ich einem Lernenden gerne beibringen würde, obwohl einige davon ein historisches Gefühl haben. Das Erlernen der Skriptsprachen ist ein bisschen unerlässlich, kann aber auch zusammen mit den anderen durchgeführt werden. Dies gilt auch für SQL und ist eine Service-Sprache für die Primaries. Wenn der Student sehr stark in Mathe ist, ist es vielleicht nett, mit APL zu beginnen (oder vielleicht R, da es viel einfacher zu lesen ist, aber auf ähnliche Weise verwendet werden kann).
Orbling

2

ich würde vorschlagen , Eric Raymonds "Wie ein Hacker?" Zum ersten Mal zu lesen, da er einige sehr interessante Punkte zu den ersten Schritten enthält, einschließlich Lisp, der den Begriff "Code ist Daten und Daten ist Code" hat.

Für die Programmierung würde ich auch Haskell, Prolog, SQL und Assembler (nur einige) vorschlagen.

Unabhängig davon, was Sie lernen möchten, nehmen Sie sich die Zeit, um es richtig zu lernen und nicht-triviale Mengen an Code zu schreiben. Es ist wie beim Fahrradfahren - man kann es nicht aus einem Buch lernen.


2

Zuerst> Was möchten Sie tun, wenn Sie mit dem Programmieren beginnen? Das Erlernen, wie man ein Spielprogrammierer ist, ist anders als das Erlernen, wie man ein Datenbankprogrammierer für ein Unternehmen ist ... ist anders als ein webbasierter Programmierer ...

Zweitens: Wenn Sie anfangen zu lernen, möchten Sie hoch hinaus und sich nach unten arbeiten? Oder fangen Sie niedrig an und arbeiten Sie sich nach oben. Das Erlernen von C # (hohes Niveau) unterscheidet sich erheblich vom Erlernen von Assembly (niedriges Niveau).

Eine große Auswahl hängt davon ab, was Sie tun möchten. Das Programmieren eines Treibers wird höchstwahrscheinlich C oder Assembly beinhalten. Das Programmieren einer Website wird PHP, C #, ASP usw. sein. Sie werden Assembly für die Webprogrammierung nicht berühren. Usw.

Was die Grundlagen angeht ... Sobald Sie sich entschieden haben, WAS Sie tun möchten, ist es einfacher, eine Sprache auszuwählen. Ich bin zum Beispiel Datenanalytiker in einem Krankenhaus geworden. Meine "Wahl" der Sprachen ist also SQL / TSQL / DB2 für den Datenzugriff, C # WPF für Windows-Clients, Silverlight für Web-Clients, einige RPG / CL für IBM-Back-End-Logik ...

Persönlich halte ich mich an ein gutes Buch und erstelle ein eigenes Programm, um die Sprache zu üben. Ich mag APress und habe es geliebt, C # 2008 Illustrated zu lesen, wenn ich C # lerne. Sie haben andere Bücher, die sowohl Grundlagen für Ungelernte als auch für Experten enthalten.


2

Ein Neuling benötigt zunächst nur eine Sprache, nachdem er die zweite Sprache gelernt hat, geht er bereits über viele konkurrierende Entwickler hinaus. Ich würde in der folgenden Reihenfolge lernen:

  • Smalltalk - dies ist das Beste, was OO bekommen kann, und eine einfache Belichtung öffnet Ihnen die Augen für die Art und Weise, wie Dinge getan werden sollten. Am besten lernen Sie OO-Konzepte auf.
  • Java oder C # - bietet einen architektonischeren und geplanten Ansatz für OO, während statisch überprüfte Typen eingeführt werden.
  • Ruby oder Python - Sie können es nicht schätzen, bis Sie Java oder C # gefühlt haben
  • Erlang - Parallelität auf eine Weise, die es einfach erscheinen lässt. Es ist viel besser als es Ihre OO-Sprachen oder C können.
  • Lisp, Haskell oder eine andere funktionale Sprache - es ist ein anderer Ansatz zur Lösung von Problemen.
  • C - Entweder durch die Erstellung nativer Erweiterungen für Java oder durch die Implementierung von Algorithmen auf niedrigerer Ebene ist dies der Assemblierung so nahe, wie es jemand benötigt, bis er Compiler schreibt

Sie können fragen, "wo ist C ++?" und was ist mit X? Um ehrlich zu sein, das Erlernen mehrerer Sprachen hat ein paar Gründe: Es bereichert Ihre Erfahrung und bietet den Antrieb, mehr Sprachen zu lernen. Die Liste der Sprachen, die ich gut kenne (Java, C #, Ruby, C ++, Javascript), ist alle objektorientiert - aber das liegt hauptsächlich daran, dass ich das jeden Tag bei der Arbeit tun muss. Die Liste der Sprachen, denen ich ausgesetzt war (Smalltalk, Python, Erlang, JESS, C, Assembly [Motorola 6502/6510], Go), hat mir alle wertvolle Lektionen beigebracht. Ich kann zumindest verstehen, was mit diesen Sprachen los ist. Es gibt eine Menge, die ich noch nicht erforscht habe, aber sehr wohl in der Zukunft. Es gibt auch ein paar Auszeichnungssprachen: HTML, XSL: FO, XSLT, CSS, XML, SGML, mit denen die Leute vertraut sein müssen, wenn sie in irgendeiner Weise mit dem Web arbeiten wollen.

Nachdem Sie mindestens zwei verschiedene Sprachen gelernt haben, sollten Sie meiner Meinung nach nicht einschränken, was jemand, der lernen möchte, als Nächstes aufgreifen möchte. Lernen sollte eine organische Erfahrung sein, und zu viel Struktur im Prozess schafft eine Gruppe von Menschen, die genauso denken. Eine Monokultur sozusagen.


2

Die meisten dieser Antworten scheinen ungefähr gleich zu sein, daher werde ich eine andere Meinung vertreten. Ich habe lange geglaubt, dass die beste Muttersprache Tcl ist.

Warum? Zum einen ist es sehr leicht zu lernen. Die Sprache hat nicht viel Syntax, so dass sich der Schüler mehr auf die Konzepte des Programmierens und weniger auf die syntaktischen Besonderheiten einer bestimmten Sprache konzentrieren kann. Ab diesem Zeitpunkt hat Tcl genau 12 Regeln, die die gesamte Sprache regeln (seit elf Jahren in den letzten Jahrzehnten).

Zum anderen verfügt Tcl über eine fantastische integrierte GUI-Sprache, sodass Sie eine relativ schnelle Befriedigung erhalten und die Grundlagen der ereignisgesteuerten Programmierung erlernen können.

Drittens ist es erweiterbar. Möchten Sie über eine Wiederholungsschleife unterrichten? Sie können einen Befehl schreiben, der eine Wiederholungsschleife ausführt, damit Sie nicht nur lernen, wie Sie die Wiederholungsschleife verwenden, sondern auch, wie sie sich von einer while-Schleife unterscheidet, da Sie sie selbst geschrieben haben.

Da es erweiterbar ist, gibt es auch einen einfachen Einstieg in C. Sie können C-Grundlagen erlernen und lernen, wie Sie entweder a) Tcl mit neuen Befehlen erweitern, die in einer anderen Sprache geschrieben wurden, oder b) wie Sie einem in C geschriebenen Programm eine Skriptsprache hinzufügen C.

Sobald Sie Tcl und C gelernt haben, liegen die meisten anderen Sprachen irgendwo zwischen diesen beiden Extremen und sollten relativ einfach zu erlernen sein. Meine vollständige Liste mit den vier, die ich nach Tcl und C unterrichten würde, lautet:

  1. Tcl
  2. C
  3. Python - für OO-Konzepte plus Verhalten zum Definieren von Blöcken nach Einrückung als Kontrast zu anderen Sprachen.
  4. Ruby - für eine andere Sicht auf OO, plus Schienen, um mehr über Frameworks zu erfahren
  5. Java - es wird überall verwendet, man muss es wissen und etwas über die JVM lernen
  6. groovy - kehren Sie zurück zu dynamischen Sprachen

1

Assemblersprache, C, SQL, C #

Ich weiß, langweilig und altmodisch. Und die gesamte Frage ignoriert den wirklich schwierigen Teil der Programmierung, nämlich Problemlösung, Domänenmodellierung und Algorithmuskonstruktion. Aber hier ist warum:

  1. Sie können sich nicht durch die Assemblersprache schleichen. Du bekommst es entweder oder nicht. Der Compiler wird Sie nicht retten, es gibt keinen Framework- oder Bibliotheksaufwand und Sie können sich nicht vor der Maschinenarchitektur verstecken. es ist reine Programmierung (auf der Ebene der Anfänger mit zwei Zahlen)

  2. Nachdem Sie einige Assembler-Programme mit mehr als ein paar hundert Zeilen geschrieben haben, sind Zeiger und Speicherverwaltung nicht mehr geheimnisvoll, und Sie sollten anfangen, Muster im Code zu bemerken (if, switch, array, loops usw.). ). C bringt diese Muster ins Sonnenlicht und lässt sie leuchten. Die Standardbibliothek ist nützlich, ohne immens zu sein, aber Sie müssen sich nicht mit Makros / Vorlagen / etc. in diesem Stadium.

  3. Springen Sie jetzt mit SQL in Datenbanken. Gehen Sie mit gespeicherten Prozeduren nicht über Bord, sondern lernen Sie die Grundlagen von Tabellen und Abfragen kennen.

  4. Nachdem Sie einige C-Programme mit mehr als ein paar hundert Zeilen geschrieben haben, sind Zeiger, Strukturen und Speicherverwaltung selbstverständlich, und prozedurale Konstrukte sind alte Bekannte. Sie werden anfangen, Muster höherer Ordnung zu bemerken: Diese Funktionen gehören immer zu dieser Datenstruktur, dieser Teil des Codes entspricht genau dem Teil des Codes, mit Ausnahme der Methoden X, Y und Z und so weiter. Ergänzen Sie Ihr Verständnis für relationale Daten, und Sie sind jetzt bereit für eine objektorientierte Sprache. Mit einem massiven Rahmen und allgemein lückenhafter Dokumentation. Willkommen in der realen Welt! Entdecken Sie GUIs, schreiben Sie Desktop-Apps, schreiben Sie Websites, schreiben Sie Webdienste und schreiben Sie, was immer Sie möchten. Suchen Sie sich einen Job, wenn Sie dazu neigen.

Bist du jetzt ein programmierender Jedi? Ein Code-Ninja? Nein , jetzt bist du nur kompetent. Aber Sie haben eine solide Grundlage, auf der Sie stehen können, um die glänzenden neuen lustigen Dinge zu erkunden.


1

Sie brauchen Grundlagen:

  1. Maschinensprache
  2. Assemblersprache
  3. C
  4. Lispeln

Danach ist es wahrscheinlich egal.


0

OK, das ist der letzte Tag für Kopfgeld. Und ich füge meine Antwort hinzu. Meine vorgeschlagene Sequenz-

C, C ++, JAVA / C #, Python / Ruby, jede andere Sprache (Assembly / Lisp / Prolog usw.)

  • Ich denke nicht, dass die erste Sprache die einfachste sein muss. Eher denke ich, dass es die Gesamtidee davon geben sollte, wie Computer arbeiten, einige Abstraktion behaltend.
  • Der Übergang von C zu C ++ wird einfacher. Es wird OOP geben, das derzeit am häufigsten verwendete Paradigma.
  • Der Übergang von C ++ zu C # / Java wird einfacher. Ich bevorzuge C #, weil es viele Paradigmen wie funktionale Programmierung enthält.
  • Wenn jemand jetzt zu dynamischen Sprachen wie Python oder Ruby kommt, wird es ein " WoW " geben. Es wird einfacher sein, die Schönheit des dynamischen Tippens zu spüren. Wenn Sie jedoch zuerst dynamische und später statische Sprachen lernen, werden Sie gefragt: " Oh! Warum muss ich all diese Sprachen hinzufügen? "
  • Jetzt sind die am häufigsten verwendeten Paradigmen und Sprachen fast fertig. Also erkunden Sie, was Sie wollen. Von der Montage zu Lisp, Prolog oder Haskell. Entdecken Sie neuere Kontexte und Funktionen verschiedener Programmiersprachen.

Hier ist C nur zum Starten.
Gulshan

Die Präferenz von C # gegenüber Java hängt von vielen Faktoren ab. Ich würde sagen, dass beide fast gleich sind.
Prasonscala

0

Schema, C, C ++

Ich werde parteiisch sein und das Modell verwenden, das meine Universität derzeit für ihren Kernlehrplan für Informatik verwendet. Ich war in meinem ersten Jahr dagegen, aber in meinen späteren Jahren bin ich dankbar dafür. Das Modell basiert darauf, dass keine Programmiererfahrung, sondern Lernfähigkeit erforderlich ist.

  1. Schema
    Wir sind, Sie lernen zuerst Programmieren, je weniger Magie, desto besser. Die Unterrichtssprache von Scheme stellt eine klare und vernünftige Definition einer Sprache dar, eine wirklich kleine Menge von Axiomen (die "Magie"), auf die Sie aufbauen und die Sie erweitern können. Jeder, der mathematische Funktionen verstehen kann, kann Schema-Programme nachvollziehen und begründen. Das Starten mit Schema bietet eine saubere und dennoch leistungsstarke Möglichkeit, über Berechnungen nachzudenken, ohne sich um sprachspezifische Details zu kümmern.

  2. C Der
    Wechsel von Schema zu C ist ein drastischer Schritt, aber Sie können sich mit der sehr wichtigen Zuordnung von Hochsprachen zu Niedrigsprachen vertraut machen. Das Erlernen des Speichermodells (Zeiger, Heap, Stack usw.) und der Kompilierung und Ausführung von Programmen sowie die Funktionsweise von Zeigern, Stack und Heap sind wesentliche Fähigkeiten. Durch dieses Verständnis auf niedriger Ebene können Sie beginnen, Programme auf einer höheren Ebene (Big O) zu analysieren. Sie können damit beginnen, Ihre eigenen abstrakten Datentypen zu rollen, indem Sie mit verschiedenen Implementierungen spielen (z. B. einer einfachen Hash-Tabelle im Vergleich zu einem Binärbaum für eine Menge).

  3. C ++
    Durch das Erlernen von C und Scheme lernen wir verschiedene Paradigmen von Programmiersprachen kennen und wie sie auf verschiedene Probleme angewendet werden können. Jetzt können Sie sich den gruseligsten Aspekten der Programmierung nähern: Auswahl und Kompromisse. Die Wahl der Programmiersprache kann die Leistung, Lesbarkeit, Wartbarkeit, Robustheit usw. beeinträchtigen. Diese Wahl ist großartig, aber auch gefährlich, um Probleme zu lösen, die größer sind als das, was Sie im Kopf haben. C ++ versucht, für den Programmierer so wenig Auswahl wie möglich zu treffen. Durch das Erlernen von C ++ lernen Sie, wie Sie diese Kompromisse und Entscheidungen zur Lösung Ihrer Probleme selbst treffen können.

Sie werden möglicherweise keine dieser Sprachen in der Industrie verwenden oder sie jemals wieder anfassen, aber der Lernprozess hilft Ihnen dabei, andere Sprachen zu verstehen, die Sie verwenden werden. Ein weiterer Aspekt ist, dass Sie die Tools rund um eine bestimmte Sprache lernen. Führen Sie gcc über die Befehlszeile aus, lernen Sie Vim, gehen Sie mit GDB durch ein Programm, erstellen Sie Make-Dateien, checken Sie Code mit SVN ein, schreiben Sie Shell-Skripte, um das Testen zu automatisieren usw.

Im Kerncurriculum gibt es jedoch auch andere Kurse (Computerarchitektur, Datenstrukturen und Algorithmen, Compiler, Betriebssysteme usw.). Nur diese Sprachen zu lernen, reicht also nicht aus, um Programmieren zu können.


0

Der Weg von einer einfachen Sprache zu einer höheren ist der richtige. Auf diese Weise haben Sie immer noch eine Idee, was im Hintergrund passiert.

  • C - Zeiger & Speicherverwaltung
  • C ++ - OO-Grundlagen und immer noch sehr beliebt
  • Java / C # - Die beliebtesten Sprachen
  • Einige Grundmontage
  • Funktionssprache - zB Haskell
  • Skriptsprache - zB Python

0
  1. Python. Um Dinge zu erledigen, programmieren Sie einfach. Prozedural, OO und (in gewissem Umfang) funktional.

  2. Reguläre Ausdrücke. Sie befinden sich in der Python-Bibliothek, es handelt sich jedoch um ein separates DSL.

  3. Shell (BASH oder was auch immer). Das "&", "|", ";" Operatoren zum Kombinieren von Prozessen sind in Python kritisch und unangenehm.

  4. SQL. Dies ist vorerst die Verkehrssprache für den Datenzugriff.

  5. XHTML. Dies ist vorerst die Verkehrssprache für die Datenpräsentation.

  6. CSS.

Vielleicht C, wenn es nötig wurde.


Sie scheinen das Stadium der " tiefen Erleuchtung " ausgelassen zu haben . Ist das Nummer 7?
Mark C

@ Mark C: Ich versuche nur, "die meisten der heute am häufigsten verwendeten Sprachen und Paradigmen" zu behandeln. Nach meiner Erfahrung werden diese "anderen" oder DSLs möglicherweise häufiger verwendet als Programmiersprachen. Ich bin mir nicht sicher, ob dies zu einer tiefgreifenden Aufklärung führt - nur der Kontakt mit vielen Sprachen, die tatsächlich verwendet werden.
S.Lott

Du hast recht, ich sehe, dass er das gesagt hat, dann habe ich bemerkt, dass er auch "oder Paradigmen" gesagt hat. Es war nur gut gelaunt.
Mark C

@ Mark C: Aber SQL und CSS sind die "anderen Paradigmen", die am interessantesten sind. In der Tat ist der reguläre Ausdruck ein Paradigma, das viele Fragen zum Stapelüberlauf aufwirft.
S.Lott

0

Beginnen Sie in der Nähe des Metalls:

  1. Assembler
  2. C
  3. C ++
  4. C #
  5. Lispeln
  6. Python oder Ruby

Das Problem bei einem so breiten Ansatz ist nun, dass niemand ohne jahrelanges Studium in diesen Sprachen überhaupt aus der Ferne fähig werden kann.

  1. Assembler: 3 Monate
  2. C: 6 Monate
  3. C ++: 2 Jahre
  4. C #: 6 Monate
  5. Lisp: 3 Monate
  6. Python / Ruby: 3 Monate

Es sei denn, Sie möchten ihnen "Hallo Welt" beibringen, was für alle 6 ungefähr einen Monat dauern sollte.


-1

Warum gehst du nicht gleich rein und lernst VB oder C #? Beide sind meiner Meinung nach vollständige Sprachen von Anfänger bis Fortgeschrittene, imho.


4
Denn das ist keine Breite und daher auch keine Antwort auf die Frage. Wenn Sie der Meinung sind, dass einer (oder beide) alles abdeckt, was Sie lernen sollten, müssen Sie selbst mehr Sprachen lernen.
David Thornley
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.