Als CS-Pädagoge auf Universitätsniveau wird häufig diskutiert, welche Programmiersprache im ersten Programmierkurs unterrichtet werden soll. Sie haben die Wahl zwischen Tausenden von Sprachen und viel religiöses Fieber (oder Fieber), das ein Sprachcamp über ein anderes unterstützt. All diese subjektiven Vorurteile, die jede Programmiersprache umgeben, machen es einem Pädagogen sehr schwer, eine zu wählen.
Meine Frage ist:
Nach welchen objektiven Kriterien kann ein Pädagoge eine Programmiersprache auswählen, die als Grundlage für einen Programmierkurs an einer Universität im ersten Jahr dienen soll? Was ist die Basis für diese Kriterien?
Hinweis : Ich möchte keine Liste der Programmiersprachen sehen und warum sie am besten zu verwenden sind. Bei der Frage geht es nicht um die beste Sprache, sondern um die Kriterien für die Auswahl einer Sprache . Antworten können jedoch Programmiersprachen sein, um bestimmte Punkte zu veranschaulichen.
Diese Frage wurde von einer anderen Frage inspiriert, die als nicht thematisch erachtet wurde: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .
quelle
SML
einfach, weil es unwahrscheinlich ist, dass ein Schüler diese Sprache vorher kennt. Dies brachte jeden Schüler mehr oder weniger auf das gleiche Niveau, um den Kurs zu beginnen.Antworten:
Ich werfe meine eigenen zwei Cent ein, obwohl ich glaube, dass dieses Thema eine Grube ohne Boden ist. Verstehen Sie mich nicht falsch, ich denke, es ist eine faszinierende Frage, die wir hier wahrscheinlich nicht zur Zufriedenheit aller lösen werden.
Kurz gesagt, ich würde sagen, dass die Sprache tun sollte, was Sie wollen , auf eine einfache und eindeutige Weise wie möglich und nicht mehr .
Meine eigenen Erfahrungen stammen aus der Betreuung mehrerer Generationen von Studenten des ersten und zweiten Studienjahres mit der Programmiersprache Oberon . Leute, die diese Sprache kennen, werden ihren Einfluss in meinen Meinungen erkennen. Beachten Sie, dass diese Sprache zum Unterrichten von "Algorithmen und Datenstrukturen" verwendet wurde. Zu der Zeit (damals) wurden funktionale Programmierung und objektorientiertes Design ab dem zweiten Jahr in separaten Kursen unterrichtet.
Wichtig : Bevor ich jedoch auf die Besonderheiten einer Sprache eingehe, möchte ich betonen, dass das Wichtigste darin besteht, sich und Ihren Schülern absolut klar zu machen, welche Ziele Ihr Kurs verfolgt. Unterrichten Sie Programmierung an sich ? Oder Algorithmen und Datenstrukturen? Oder Softwareentwicklung? Bevor Sie eine Sprache auswählen, sollten Sie sich überlegen, wohin Sie damit gehen. Unterschiede auf dieser Ebene (Ziele) führen meiner Meinung nach wahrscheinlich zu den meisten Meinungsverschiedenheiten zu diesem Thema.
Die Punkte, die ich für wichtig halte, überschneiden sich möglicherweise mit einigen bereits erwähnten Dingen, aber ich glaube, die meisten sind Teilmengen einer der folgenden vier:
Einfachheit : Den Schülern werden in der Regel Programmierkenntnisse, Algorithmen und Datenstrukturen vermittelt und nicht die Merkmale und Feinheiten einer bestimmten Programmiersprache. Wirth benutzte das Einstein-Zitat "Mach es so einfach wie möglich, aber nicht einfacher" als Leitprinzip bei der Gestaltung von Oberon, und es gibt mehrere andere Sprachen, die es genauso gut machen. Ihre bevorzugte Programmiersprache sollte in der Lage sein, alle in Ihrer Vorlesung erforderlichen Konzepte zu implementieren, dies jedoch mit dem kleinstmöglichen Satz von Funktionen / Details. Die Programmiersprache ist normalerweise nur das Werkzeug, nicht das Ziel.
Eindeutigkeit : Ein enges Geschwister der Einfachheit, es sollte ein Konstrukt für jedes Konzept geben, mit so wenig Überlappung wie möglich. Stellen Sie sich das vor, es gibt nur einen "richtigen" Weg, um jedes Konzept umzusetzen. Drei verschiedene Arten von Schleifen, die semantisch alle dasselbe tun? Oder fünfzehn verschiedene Möglichkeiten, eine Variable zu inkrementieren? Nicht gut. Dies macht auch Hausaufgaben zu korrigieren oder im Allgemeinen nur das Verständnis Ihrer Schüler Code ein viel einfacher. Ihre Lehrassistenten werden es zu schätzen wissen.
Portabilität : Die Schüler werden mit Linux-, Windows- und OSX-Maschinen zum Unterricht gehen, und die Programmierumgebung sollte unter allen drei so ähnlich (identisch) wie möglich sein. Die Ergebnisse eines Programms sollten ebenfalls identisch sein. Dies ist ein weiterer Punkt, den die Lehrassistenten, die für die Bewertung der Hausaufgaben und die Behandlung von Fragen / Problemen verantwortlich sind, sehr schätzen werden.
Branchenpräferenz : Im Ernst, wir sollten uns darüber nur Gedanken machen, wenn "Industrie" selbst entscheidet, welche Programmiersprache ihm am besten gefällt. Seit der Erfindung der Computer ist dies ein sich ständig bewegendes Ziel. Im Moment ist es nicht sprachabhängig , wenn Ihre Schüler wirklich lernen, wie man programmiert. Es gibt jedoch einige Bereiche, in denen es der Industrie gelingt, sich auf einen Standard zu einigen, z. B.
VHDL für das Schaltungsdesignoder SQL für Datenbankabfragen. Dies ist also immer noch ein gültiger Punkt.Wie eine Sprache in diese Liste passt, hängt wiederum stark davon ab, was Sie unterrichten möchten!
quelle
WHILE expr DO stmts END
usw.Entwicklung des algorithmischen Denkens zur Lösung von Problemen als Hauptziel: Eine schlechte Sache bei der Verwendung eines objektorientierten Paradigmas im ersten Kurs ist, dass die Einführung neuer Lernender in Dinge wie Vererbung, Polymorphismus usw. sie vom oben genannten Hauptziel ablenkt. Tatsächlich ist die Einführung von Nebenerwägungen neben diesem Kernziel, wie Softwareentwicklung, Portabilität, Nützlichkeit für die Industrie usw., aus dem angegebenen Grund kontraproduktiv.
Keine objektorientierte Sprache: Heutzutage unterrichten die meisten Universitäten die Programmierung direkt mit einer objektorientierten Sprache. Ich halte das für einen Fehler. Es gibt Dinge auf der Welt, die nur im Gegensatz zu ihrem Gegenteil wirklich verstanden werden können. Ohne einem prozeduralen Paradigma der Programmierung (Daten und Funktionen als zwei getrennte Aspekte des Programms) ausgesetzt zu sein, kann die Grundidee der Objektorientierung (Daten und Verhalten als inhärent miteinander verbunden betrachtet) von vielen übersehen werden. Und weil objektorientiertes Programmieren so wichtig ist, ist es keine Kleinigkeit, seine Grundidee zu verfehlen. Außerdem müssen CS-Studenten, da sie höchstwahrscheinlich in höheren Kursen hauptsächlich in OO programmieren, auch mit der prozeduralen Seite der Dinge vertraut sein.
Am Ende würde ich mich für eine prozedurale Sprache entscheiden, erweiterte Funktionen vermeiden und mich auf die Entwicklung des algorithmischen Denkens konzentrieren. Mit der Vermeidung erweiterter Funktionen meine ich jedoch nicht die Vermeidung herausfordernder Probleme. Ich meine, dass die Schüler selbst herausfordernde Probleme mit einfachen Werkzeugen lösen müssen.
quelle
public static void main()
In Java ist es unmöglich, das zu vermeiden , was im Kontext einer Klasse liegen muss. Dies macht Java als Muttersprache weniger als ideal, obwohl die Hürde natürlich nicht allzu groß ist.public static void main()
sehr lange aufschieben . BlueJ ist ein gutes Beispiel für eine IDE, mit der Schüler Programme schreiben könnenmain
, in denen es keine einzige gibt .Da es sich um den ersten Programmierkurs in einem Informatik-Programm handelt, würde ich sagen, der wichtigste Aspekt wäre, welche grundlegenden Konzepte von CS Ihre Schüler unterrichten. Da es keine Sprache gibt, die alle Konzepte auf einmal lehrt, müssen Sie überlegen, welche Konzepte später benötigt werden.
Ich stimme der Auffassung von @ Kaveh nicht zu, dass Branchenrelevanz wichtig ist. Es mag ein Bonus sein, aber es ist hier von untergeordneter Bedeutung. Mit einer soliden Grundlage in CS-Prinzipien wird das Erlernen einer "industriellen" Sprache in späteren Kursen relativ einfach sein.
Unabhängig von der Sprache, die als erste ausgewählt wurde, ist es wichtig, dass Ihre Schüler so schnell wie möglich einer anderen, radikal anderen Sprache unterworfen werden.
quelle
Mein Hauptanliegen ist die Universalität in dem Sinne, dass der Schüler die meisten Programmiersprachen beherrschen sollte, wenn er diese Programmiersprache lernt .
So sehr ich es bedaure, schließt dieses Kriterium reine Funktionssprachen aus. Dies gilt auch für den Kurs, der keine exotischen Sprachmerkmale verwenden sollte.
... aber das ist nur gesunder Menschenverstand.
quelle
Bei der Auswahl einer ersten Programmiersprache müssen viele Aspekte berücksichtigt werden. Viele davon wurden in den obigen Antworten berücksichtigt. Ich füge 3 weitere hinzu, da diese einen Teil meiner Antwort auf die geschlossene Frage ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) darstellten, die diese Frage ursprünglich inspiriert hatte . Ich habe meine Antwort hierher kopiert (und geändert), basierend auf der aktuellen Richtlinie zum Löschen geschlossener Fragen.
Hier sind 3 Punkte zu beachten, wobei einige Programmiersprachen als Beispiele dienen.
Programmieren im Großen gegen Programmieren im Kleinen
Wenn man das Programmieren zum ersten Mal lernt, muss man lernen, wie man im Kleinen programmiert , bevor man Mechanismen lernt, die das Programmieren im Großen unterstützen .
Mit Programmierung im Kleinen meine ich das Schreiben von Programmen mit weniger als 100 Zeilen. Diese Programme umfassen Algorithmen, die einfache Datenstrukturen manipulieren, einen einfachen Steuerungsfluss haben und einfache Probleme lösen. Sie werden im Allgemeinen nicht als Anträge betrachtet .
Mit Programmierung im Großen meine ich das Schreiben großer Programme, die aus vielen Komponenten / Klassen bestehen und auf einer API aufbauen, mit einer GUI, einer Datenbank, möglicherweise in einer Client-Server-Konfiguration.
Die Dinge, über die ein Programmierer nachdenken muss, wenn er im Kleinen programmiert, unterscheiden sich stark von denen, die er im Großen programmiert. Bei der Programmierung im großen Stil muss der Programmierer über Modularität, gute Schnittstellen, gutes Design, Wiederverwendbarkeit und viele andere Aspekte nachdenken. Moderne Programmiersprachen bieten viele Konstrukte, die das Programmieren im Großen erleichtern. Zu diesen Konstrukten gehören Klassen, Module, Schnittstellen, Ausblenden von Informationen usw. Beim Programmieren im Kleinen sind diese Probleme viel weniger wichtig.
Eine Programmiersprache wie C ++ hat viele Funktionen, die das Programmieren im großen Stil erleichtern. Es ist jedoch schwieriger, sich hinzusetzen und ein sehr einfaches Programm zu schreiben. Java ist ähnlich.
Andererseits macht es eine Sprache wie Python, Ruby, Scheme oder Haskell viel einfacher, ein Programm direkt zu schreiben.
High-Level vs Low-Level
Sprachen wie C ++ und C sind eher untergeordnete Sprachen. Sie ermöglichen es dem Programmierer, Referenzen direkt in den Speicher zu manipulieren. Obwohl dies das Schreiben von sehr effizientem Code ermöglicht, können die Details auf niedriger Ebene für einen ersten Programmierer schwierig sein, die Sprache zu lernen. Einige würden argumentieren, dass diese Details auf niedriger Ebene der Erstellung der Logik zur Lösung des Problems im Wege stehen.
Eine höhere Sprache wie Python erleichtert es, Konzepte direkter in Bezug auf die Problemdomäne auszudrücken.
Statisch getippt vs dynamisch getippt
C ++, Haskell, Java und viele weitere Sprachen sind statisch typisiert. Dies bedeutet, dass der Compiler anhand der erwarteten Wertetypen an jeder Stelle im Code automatisch Stellen findet, an denen potenzielle Fehler auftreten. Es ist ein bisschen ein religiöser Krieg darüber, ob statisches Tippen eine gute Sache ist oder nicht, aber ich werde mich von diesem fernhalten. Ein Problem bei der statischen Eingabe für neue Programmierer besteht darin, dass die vom Compiler gemeldeten Fehlermeldungen häufig schwer zu verstehen sind. Dies ist insbesondere bei C ++ - Vorlagen und Haskell-Programmen im Allgemeinen der Fall.
Python, Ruby und Scheme werden dynamisch eingegeben. Dies bedeutet, dass Fehler erkannt werden, während das Programm ausgeführt wird. Man kann argumentieren, dass dies zu spät ist, um die Fehler zu erkennen (man kann aber auch Tests verwenden, um solche Fehler zu vermeiden). Unter Vermeidung des religiösen Arguments ist der Vorteil der Art von Fehlern, die beim Schreiben einfacher Programme in einer dynamisch typisierten Programmiersprache auftreten, von der Art , wie dieses Objekt diese Operation nicht ausführen kann . Im Kontext eines kleinen Programms sind diese Fehler leicht zu verstehen und aufzuspüren.
Sprachen wie C haben eine schwache Typisierung, was bedeutet, dass der Compiler zwar einige Fehler behebt, die Laufzeit jedoch andere Fehler nicht abfängt, z. B. ungültige Speicherzugriffe. Infolgedessen entspricht die an den Programmierer zurückgegebene Fehlermeldung "Programm abgestürzt". Eine dynamisch getippte Sprache würde diese Fehler abfangen und in eine verständlichere Fehlermeldung umwandeln.
Andere
Für andere Sprachen können andere Aspekte ins Spiel kommen, z. B. die Unterstützung durch die Programmierumgebung, die verfügbaren APIs, die Qualität der Bücher und Online-Tutorials usw.
quelle
Als einleitende Bemerkung sollten Sie die Möglichkeit in Betracht ziehen, mehr als eine Sprache (in einem Kurs) zu präsentieren. In meinem ersten Semester haben wir sowohl SML als auch Java gezeigt. Der Kontrast hatte eine ganz eigene und wichtige Botschaft: Wählen Sie das richtige Werkzeug für den Job.
Nun aber zu den Kriterien, in beliebiger Reihenfolge.
Schwierigkeit zu lernen ist ein subjektives Problem, aber wichtig: Sie möchten nicht, dass Ihr Schüler Zeit damit verschwendet, die Sprache zu lernen, sondern Dinge damit zu tun . Es ist anzunehmen, dass dynamische Sprachen wie Ruby an dieser Front gewinnen werden: Sie können sie mit allem füttern, und es gibt ausgezeichnete "Dummy" -Tutorials im Web. Wenn ich mich recht erinnere, gibt es auch Studien, die zeigen, dass Studenten, die vorher nicht programmiert haben, mit funktionalen Sprachen bessere Ergebnisse erzielen als mit anderen.
Reichhaltigkeit : Die Sprache (n) muss (müssen) reich genug für alle Konzepte sein, die Sie unterrichten möchten. Wenn Sie beispielsweise Funktionen höherer Ordnung diskutieren möchten, benötigen Sie eine Sprache, in der Funktionen Werte sind, z. B. funktionale Sprachen oder Scala.
Skalierbarkeit : Wahrscheinlich lernen Ihre Schüler nicht mehr Sprachen als die, die Sie ihnen zeigen. Sie möchten, dass die von Ihnen ausgewählten Sprachen im Laufe des Studiums skaliert werden: Sie müssen die Übungen für Ihr Haustier jetzt schreiben, können aber auch ein mittelgroßes Projekt später angreifen. Java und Sprachen mit ähnlicher Ökosphäre sind hier eine gute Wahl.
Tool-Unterstützung : Dies hängt mit der Skalierbarkeit zusammen. Wenn Sie erwarten / möchten, dass Ihre Schüler mit der Sprache produktiv umgehen, müssen gute IDEs, Build-Manager und Bibliotheken vorhanden sein. Interaktive Shells (Ruby, Scala) sind auch eine nette Sache, besonders für den Anfang. Tools müssen auch auf allen wichtigen Plattformen funktionieren.
Dokumentation : Sie möchten die Sprache wahrscheinlich nicht wirklich unterrichten , sondern die Schüler sollen sich selbst mit Ihrer (abstrakten) Anleitung unterrichten. Daher ist eine gute Dokumentation wichtig. Je beliebter und etablierter eine Sprache ist, desto besser ist die Dokumentation. Zum Beispiel ist die Dokumentation von Scala ziemlich schlecht (aber sie verbessert sich). Tools wie Hoogle sind von Vorteil .
Verfügbarkeit : Es gibt tatsächlich Leute, die mit Matlab oder Visual C ++ unterrichten. Bedenken Sie, dass möglicherweise nicht jeder über eine Lizenz oder einen Computer verfügt, auf dem die erforderlichen Programme ausgeführt werden können. Sie sollten wahrscheinlich freie Sprachen bevorzugen, die auf einer Vielzahl von Plattformen ausgeführt werden.
Sauberkeit : Sie möchten wahrscheinlich das Denken Ihrer Schüler beeinflussen. Je chaotischer die Sprache, desto chaotischer werden sie denken; Ich würde niemals PHP in einem Kurs vorschlagen. Dynamische Sprachen haben hier generell Nachteile: Sie erlauben, manchmal sogar fördern, schlechte Gewohnheiten.
Welche Kriterien für Sie wichtiger sind als für andere, hängt auch davon ab, was Sie unterrichten möchten. Ist das buchstäblich ein Programmierkurs? Ist es ein Kurs zu Algorithmen und Datenstrukturen? Ist es ein Kurs, der Konzepte von Programmiersprachen in verschiedenen Paradigmen einführt? Geht es um Softwareentwicklung im großen Stil?
quelle
For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala.
... oder C oder Pascal, die beide so ziemlich ewig Funktionszeiger hatten. Praktisch die einzige (Mainstream-) Sprache, die dieses Kriterium tatsächlich ausschließt, ist Java.Faszinierende Frage; Ihre Betonung auf objektive Kriterien gefällt mir. Wir möchten, dass Erstsemester Folgendes lernen:
Programmierkonzepte : Die erste Programmiersprache muss unterstützen: Funktionsaufrufe, Iteration, Rekursion
Grundlegende Ideen : Die erste Programmiersprache muss Arrays unterstützen (für die ersten Schritte in einer sanften Einführung, wie Speicher wirklich funktioniert und wie Zeiger funktionieren)
praktische Programmierkenntnisse : wie man den Debugger benutzt, wie man den Profiler benutzt, wie man große Probleme löst (eine Hochsprache), wie man große Systeme zusammensetzt, wie man Probleme aufschlüsselt (Zerlegung von Problemen), wie man das Schreiben vermeidet komplizierter Code, wie die Absicht hinter einer (oft kryptischen) Reihe ausführbarer Anweisungen an den Menschen kommuniziert werden kann .
die Tatsache, dass vorab geschriebene Bibliotheken für Dinge wie sort () existieren und wie man sie benutzt - dh die Tatsache, dass es nicht notwendig ist, alles von Grund auf neu zu schreiben.
Andere Kriterien für eine Muttersprache :
interpretiert (schnelles Feedback hilft beim Lernen).
eine interaktive Umgebung, die das Lernen, Testen und Debuggen beschleunigt.
Studenten können hochwertigen Quellcode in dieser Sprache lesen
"einfach zu lesen", "Syntax, die sich der natürlichen Sprache annähert" (um das Lesen und Bewerten des SourceCodes zu vereinfachen)
portabel (läuft unter Mac OS, Windows, Unix). Mindestens eine freie Software-Implementierung der Sprache.
schnell zu unterrichten, "wenige Fallstricke" - zum Beispiel "[I] t kann schneller sein, zuerst Anfänger Python und dann Java zu unterrichten, anstatt Java als erstes OOPL." - "Vergleich objektorientierter Programmiersprachen" und TelescopeRule
Matthias Felleisen entwickelte eine Programmiersprache mit Fehlermeldungen, die auf ein Anfängerpublikum zugeschnitten sind. Er betont, dass die Wahl einer bestimmten Sprache nicht so wichtig ist wie die Vermittlung einer guten Entwurfsmethodik. Tatsächlich sieht er den ersten CS-Kurs als eine Klasse für freie Künste, die kritisches Denken, Problemlösung und Liebe zum Detail lehrt.
Kriterien für eine zweite Programmiersprache
Sachen, die die Schüler lernen sollen, aber vielleicht kann dies auf die zweite Programmiersprache warten:
eine "relevante" Sprache, die "nicht zu esoterisch" ist; etwas "Populäres in der Branche"
Komplexitätstheorie: Erkennen von Aufgaben, die mit der aktuellen Technologie nicht möglich sind.
übergeordnete Themen: Auswahl des richtigen Tools für den Job , Verwendung eines Compilers, Strukturen, objektorientierte Programmierung, funktionale Programmierung, Logikprogrammierung, Compiler-Design, Komposition und Manipulation von Funktionen (im Sinne von Lisp / ML), gleichzeitige und verteilte Programmierung,
Low-Level-Zeug: Zeigerarithmetik, Computerarchitektur. Speicherverwaltung, Stack-Frames, Assembly-Programmierung, Maschinenarchitektur, Gerätetreiber und Betriebssystem-Design
EDIT: Ich finde es enttäuschend, dass das Posten einer Zusammenfassung von etwas, das ich in Zusammenarbeit mit vielen anderen geschrieben habe, "möglicherweise kein legaler Post" ist.
Aus diesem Grund füge ich meinem vorherigen informellen Link ein formelleres Zitat hinzu und versuche, mich an die faire Verwendung und andere Wiki-Urheberrechtsfragen zu halten.
Diese Antwort ist eine Zusammenfassung von Freshmans Erstsprache (Anon 2011) im Portland Pattern Repository.
(Anon 2011) Viele anonyme und verschiedene andere Autoren. "Freshmans First Language". Portland Pattern Repository. 27. September 2011. http://c2.com/cgi/wiki?FreshmansFirstLanguage .
quelle
Ich denke, dass Einfachheit und Leichtigkeit des Lernens eines der Hauptkriterien ist. In einem Einführungskurs zur Programmierung möchten wir unnötige Programmierhürden vermeiden und uns so weit wie möglich auf die Prinzipien der Programmierung und algorithmischen Problemlösung konzentrieren. Im ersten Studienjahr fehlt es den Schülern oft an der Fähigkeit, algorithmisch über Probleme nachzudenken. In diesem Kurs geht es also auch darum, algorithmisches Denken zu vermitteln.
Ein weiteres Kriterium ist die Nützlichkeit der Sprache in der Branche. Wir möchten keine Sprache unterrichten, die in der Branche nicht von Nutzen ist. Eine klare Mehrheit der Studenten wird in der Branche arbeiten, daher sollte man ein Auge darauf haben, was in der Branche verwendet wird (und was verwendet wird, wenn die Studenten ihren Abschluss machen).
Das dritte Kriterium wären die Kurse, die die Studenten in späteren Jahren belegen werden. Die Kurse, insbesondere die erforderlichen Kurse, sind nicht auf sich selbst zugeschnitten, sondern in Abstimmung mit anderen Kursen.
Die letzte Antwort, die mir gerade einfällt, ist die gleiche wie die von JMAD. Die Sprache sollte das Erlernen anderer wichtiger Sprachen erleichtern. Es sollte reich genug sein und das Erlernen der späteren wichtigen Sprachen wäre einfach (hier sind wichtige Mittel aus Sicht der Schüler wichtig).
Ich denke, dass viele Universitäten ihre Haupteinführung in den Programmierkurs von Java / C ++ / C auf Python verlagert haben, obwohl sie von Zeit zu Zeit eine Einführung in das Programmieren in anderen Sprachen bieten könnten (häufig für Nicht-Informatik-Hauptfächer, zB C für Elektrotechnik-Hauptfächer). Sie können jedoch flexibel sein, wenn der Kursleiter gelegentlich mit dem Unterrichten einer anderen Sprache experimentieren möchte.
quelle
Also werde ich sofort auf meine Knie-Ruck-Reaktion verzichten, die besagt , dass jeder das Programmieren über SICP lernen sollte, da Lisp das Richtige ist.
Es wurden bereits viele gute Kriterien für die Auswahl einer Sprache angeboten ... Einfachheit und Portabilität zählen zu den wichtigsten. Ich denke jedoch auch, dass es für Studenten, die noch keine Programmierer sind, wichtig ist, nicht die falsche Vorstellung davon zu bekommen (oder keine Ahnung zu haben), was mit modernen Sprachen hinter den Kulissen passiert.
Obwohl einige dieser anderen Posts hervorragende Kriterien bieten, möchte ich mit einer bestimmten Sprache veranschaulichen, wie die Erfüllung der Kriterien aussieht.
Einige dieser Bedenken wurden in Joel Spolskys Blog-Post The Perils of JavaSchools angesprochen (weitaus besser, als ich es versuchen könnte) . Die Auswahl von Sprachen wie Java oder Python schließt zwei der schwierigsten (und wichtigsten) Konzepte in CS ab. nämlich Zeiger und Rekursion.
Natürlich wird das Unterrichten eines Einführungskurses in C unglaublich dicht sein, und es werden wahrscheinlich auch viele wichtige Konzepte im Zusammenhang mit der Rekursion fehlen. Ebenso muss ein Kurs, der in Lisp unterrichtet wird, Hinweise unter dem Deckmantel enthalten
car
undcdr
wichtige Konzepte in Bezug auf verknüpfte Listen implizieren, wobei die Sprache mit den Details umgehen muss.Grundsätzlich geht es mir darum, dass die Studierenden die Grundlagen von Datenstrukturen und Algorithmen sowie die praktische Umsetzung verstehen müssen.
Ich bin auch nicht einverstanden mit dem Vorschlag, keine objektorientierte Sprache zu verwenden. Ich denke, der Nutzen objektorientierter Sprachen für die Modellierung der realen Welt ist für neue Programmierer ein positiver Vorteil, solange die Impedanzinkongruenz klargestellt wird und objektorientierte Sprachen ein Paradigma unter vielen sind.
Ich würde vorschlagen, dass Ruby (auch von einem anderen Beitrag als Möglichkeit vorgeschlagen) viele Eigenschaften aufweist, nach denen in einer Sprache gesucht werden muss, die für eine Einführung in den Programmierkurs verwendet werden kann.
Ich werde diese Behauptung vorübergehend rechtfertigen, aber zuerst möchte ich einen Trend kommentieren, der mich in CS-Einführungskursen stört. Ich arbeite an einer Universität, die, wie viele andere Schulen, in letzter Zeit Python für ihre Einführungskurse einsetzt. Ich bin der festen Überzeugung, dass Python das neue BASIC ist, und die Tendenz der Sprache besteht darin, Neufreundlichkeit vor Macht und Ausdruckskraft zu wählen, wie ich kürzlich an anderer Stelle argumentiert habe . Dies ist ein schlechter Service, und wir müssen uns überlegen, zu welchen Programmierern sie werden, nicht zu welchen Newbs sie im Moment gehören.
Wie auch immer, Ruby als einleitende Sprache zu rechtfertigen ...
malloc()
indem Sie ihnen beibringen , die Sprache in C zu erweitern.Wie auch immer, es gibt keinen Ersatz für das Erlernen vieler Sprachen, unabhängig davon, ob Sie sie professionell einsetzen oder nicht. Grundsätzlich denke ich, jeder sollte C und Lisp verstehen , wenn nicht sogar verwenden . Ruby ist der beste Kompromiss, den ich mir für ein Einführungssemester vorstellen kann.
Jedenfalls ... das sind meine 0,02 US-Dollar. Ich versuche nicht, Sie davon zu überzeugen, Ruby zu verwenden, wohlgemerkt ... ich verwende es nur als Beispiel für Eigenschaften, nach denen Sie in einer Sprache suchen müssen, um einen Einführungskurs zu unterrichten.
quelle
Meine erste Programmiersprache war eine Spielzeugassemblersprache. Der zweite war Fortran. Zwischendurch wurde mir eine "Algorithmen" -Notation beigebracht, die ungefähr Algol 60 war. Ich stellte mich als ganz ok heraus. In der Tat denke ich, was mir beigebracht wurde, war ziemlich perfekt.
Als ich zum ersten Mal funktionale Programmierung betrachtete, ging ich in Forschungsarbeiten, wenn auch nicht in einer implementierten Sprache, auf "Wow, das ist völlig anders. Es ist ziemlich mathematisch!" Die meisten Leute, denen funktionale Programmierung beigebracht wird, haben immer noch die gleiche Art von "Wow" -Erfahrung. Ich denke, das ist großartig.
Ich denke, Imperative Programmierung und funktionale Programmierung sind zwei völlig unterschiedliche Sichtweisen auf die Welt. Wir würden unseren Schülern keinen Dienst erweisen, wenn wir ihnen diese vielfältigen Erfahrungen rauben würden.
Die beste erste Programmiersprache sollte so einfach wie möglich und so klar wie möglich sein, damit sich die Schüler darauf konzentrieren können, klar zu denken. Leider sind die Einfachheit und Klarheit der Montage von Fortran und Algol 60 von den meisten modernen Programmiersprachen nicht zu übertreffen. Haskell ist eine gute Ausnahme. Aber Haskell würde meine ideale zweite Programmiersprache sein, nicht die erste. Eiffel oder Oberon könnten vielleicht die Rechnung passen.
quelle
An der North Carolina School für Naturwissenschaften und Mathematik haben wir seit 2004 Schüler in Python eingeführt. Wir verwenden es, um prozedurales Programmieren zu unterrichten, da wir der Meinung sind, dass die Fähigkeit, kurze, korrekte Prozeduren zu schreiben, entscheidend ist, um später mit schwereren Tools, einschließlich OO, fortzufahren Programmierung.
Wir mögen es aus diesen Gründen.
Python ist keine frei formatierbare Sprache. Es zwingt die Schüler, ihren Code in Blöcken mit Einrückungen zu schreiben. (Als technische Anmerkung verwenden wir den VIM-Texteditor und
set tabstop=4 set et
fügen [ ] in die VIMRC-Datei ein, um störende Probleme zu beseitigen und um sicherzustellen, dass Codeeinrückungen erkennbar sind, aber keine hässlich übermäßige horizontale Abweichung verursachen.) Unsere Schüler haben sich daran gewöhnt, die hierarchische Struktur von Programmen zu sehen, die durch Leerzeichen begrenzt sind. Infolgedessen sind ihre Formatierungsgewohnheiten tendenziell sehr gut, da sie in anderen Sprachen programmieren.Pythons syntaktische Einfachheit macht es anfängerfreundlich. Einfache Programme können mit einem Minimum an geheimen Schlüsselwörtern und magischen Beschwörungen geschrieben werden. Wir möchten, dass Schüler, die normalerweise nicht an Programmierung denken, es versuchen. Beachten Sie die schöne Einfachheit von Python
hello.py
; es ist glasklar, was passiert.Python wird dynamisch und Ente getippt. Dies erleichtert das Einfügen von Variablen. Ich sage meinen Schülern, dass Variablen nur Bezeichnungen sind. Sie zeigen auf Objekte. Sie senden eine Nachricht unter Verwendung des Variablennamens an ein Objekt, so wie jemand Ihnen eine Nachricht sendet, indem er Sie auf dem Telefon anruft.
Python ist ein Tool, aus dem ambitionierte Schüler nicht herauswachsen können. Es hat ausgefeilte Bibliotheken, die viele nützliche Dinge enthalten. Es ist ein leistungsfähiges kreatives Werkzeug, das Anfängern zugänglich ist.
Python ist kostenlos und läuft auf allen gängigen Plattformen. Unsere Schule ist eine heterogene Betriebssystemumgebung mit allen Arten von Maschinen. Über Kopfschmerzen wie Kompatibilitätsprobleme müssen wir uns keine Gedanken machen. Es läuft auf nahezu jedem Computer.
Python hat eine hervorragende Dokumentation. Wir ermutigen unsere Schüler, außerhalb der Linien zu forschen, zu basteln und zu färben. Sie lernen frühzeitig, wie man Python-Dokumentation einsetzt, und erkunden häufig coole Dinge außerhalb des Unterrichts.
Wir waren sehr zufrieden mit Python.
quelle
Ich würde sagen, dass die Sprache (unter gewissen Einschränkungen) nicht so wichtig ist wie das, was Sie mit der Sprache machen. Sie können in den meisten Sprachen dasselbe über Softwareentwicklung, Algorithmen, objektorientierte Programmierung, Computerhardware usw. lernen. Der Schlüssel ist, etwas Interessantes zu entwickeln, das all diese Konzepte nutzt.
(migrierte Antwort von https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )
quelle
TL; DR: Es gibt keine Möglichkeit, dies objektiv zu beantworten, da es keine objektive Grundlage für die dahinter stehenden Kriterien gibt. Es ist so willkürlich wie zu diskutieren, ob Blau objektiv eine "bessere" Farbe als Rot ist oder ob Vanilleeis objektiv "schmackhafter" als Schokolade ist.
Ich denke, es gibt einige wunderbare Beiträge, aber ich werde meine eigenen 2 Cent hinzufügen.
Diese Frage ist vergleichbar mit der Frage, ob es eine Möglichkeit gibt, objektiv den ersten Eisgeschmack auszuwählen, den ein anderer probieren sollte, wenn er zum ersten Mal eine Eisdiele besucht. Nein, es gibt keinen objektiven Weg, etwas zu wählen, das von Natur aus subjektiv ist .
Warum? Denn selbst wenn wir uns die vernünftigen Kriterien ansehen, die in Pedros Antwort genannt werden , wird jeder eine subjektive Meinung darüber haben, wie jeder Faktor gegen die Ansichten eines anderen "hält".
Ist Ruby zum Beispiel objektiv "einfacher" als Python? Einfacher in welchem Sinne? In Bezug auf was? Was bedeutet für Sie "einfacher" ? Bedeutet das "weniger Codezeilen"? Bedeutet es "leichter zu lesen und zu verstehen"? Was ist mit anderen Warum sollte sich hier jemand mit einer bestimmten Auswahl einverstanden erklären? Ich glaube nicht, dass wir diese Frage objektiv beantworten können .
Dies führt zur nächsten Frage.
So vernünftig einige Kriterien auch sein mögen, ich denke, dies beruht mehr auf subjektiven Vorlieben als auf irgendetwas anderem. Zum Beispiel gibt es keinen Grund, warum ich einfach die Kriterien von Pedro für Einfachheit , Eindeutigkeit , Portabilität und Branchenpräferenz akzeptieren sollte - unabhängig davon, wie vernünftig manche meinen. In der Tat, die Industrie bevorzugt ist definitionsgemäß subjektiv und würde einfach zu einem Teufelskreis führen. (Jeder wird darin geschult, also verwendet jeder es in der Industrie, weshalb jeder darin geschult wird, ...)
Zum Beispiel, warum nicht
Der Punkt ist, dass ich mir zwar andere Bewertungskriterien ausdenken und diese dennoch als angemessen erachten könnte, wir aber nicht behaupten können, dass sie denjenigen anderer objektiv überlegen / unterlegen sind.
Zusammenfassend gibt es keine objektive Grundlage für die Kriterien. Es ist so willkürlich wie zu diskutieren, ob Blau objektiv eine "bessere" Farbe als Rot ist oder ob Vanilleeis objektiv schmackhafter als Schokolade ist.
Das heißt nicht, dass Sie keine guten Gründe haben können , Ihre Präferenzen zu rechtfertigen, aber am Ende des Tages sind es nur Ihre Präferenzen.
quelle