Warum ist Schema meine Muttersprache an der Universität?

80

Ich höre jeden Tag von C, C ++, Java, wenn Leute anfangen, über Informatik zu sprechen, aber in meinem ersten Informatikkurs werden wir gebeten, in Schema (DrRacket) zu schreiben.

Warum ist das so?

Welche Unterschiede ergeben sich für mein zukünftiges Programmierverständnis?

UPDATE: Ich habe mein erstes Semester beendet, aber mit Scheme nicht ganz fertig. In meinem zweiten Semester (das jetzt ist) sind wir in die C-Programmierung eingestiegen. Anfangs war es frustriert, Zeiger zu lernen, aber jetzt geht es mir viel besser.

Es gibt nicht viel mehr zu sagen. Ich versuche mir Java (oder C ++?) Für den fehlenden OOP-Teil beizubringen. Bisher mag ich funktionale Programmierung noch am liebsten. Lambda ist einfach faszinierend. :)

Erica Xu
quelle
148
Herzlichen Glückwunsch, es hört sich für mich so an, als würden Sie eine der wenigen Schulen besuchen, die noch übrig sind und tatsächlich versuchen, Informatik zu unterrichten. Das Lernschema als Muttersprache ist (IMO) eine sehr gute Sache. Nein, es ist nicht so kommerziell wie viele andere, aber es ist eine ausgezeichnete Sprache, um das wahre Wesen der Informatik zu lernen.
Jerry Coffin
21
C, C ++ und Java sind industrielle Nebenprodukte der Informatik. Die gesamten Wurzeln von Scheme liegen in der Informatik. Die kommerziell genutzten Sprachen haben ebenso viel mit Informatik zu tun wie McDonalds mit der Küche.
JasonTrue
33
Diese Leute haben recht; Sie verwechseln Computerprogrammierung mit Informatik - wie Dijkstra sagte, ist das wie die Verwechslung des Teleskopbaus mit der Astronomie. Das Schema handelt von der besten Sprache zum Erlernen grundlegender Konzepte in der Informatik . Wenn Sie erwarten, dass Sie mit einem Informatik-Abschluss lernen, wie man Branchen-Apps in Java schreibt, sind Sie möglicherweise im falschen Programm eingeschrieben.
Eric Lippert
29
Aus dem gleichen Grund , dass Zoologie Kurse Evolutionsbiologie lehren, Anatomie und Verhalten der Tiere , anstatt wie ein Elefant Stall ausmisten
jk.
4
Wenn Sie mit der Grundsyntax des Schemas vertraut sind, lesen Sie "Der kleine Schemer". Es ist ein dünnes Buch, aber wenn Sie alles darin verstehen können, haben Sie ein wirklich solides Verständnis für die Grundlagen funktionaler Programmiersprachen.
Eric Lippert

Antworten:

91

Klingt nach einer tollen Schule! Lisp-Dialekte folgen dem mathematischen Paradigma der Algorithmen viel genauer. Sie zwingen Programmierer, Rekursion und den funktionalen Stil zu lernen. Dies ist eine ausgezeichnete Erfahrung. Ihre Schule gehört zum MIT, das immer noch Abelson und Sussman für das erforderliche CS 6.001 verwendet.

Möglicherweise finden Sie diesen Artikel ermutigend und hilfreich für das Verständnis des Problems.

Jonathan Henson
quelle
6
"Force" ist wahrscheinlich kein gutes Wort. Wie wäre es mit "Zug"?
Barry Brown
4
Tatsächlich hat sich der EECS-Lehrplan des MIT in den letzten Jahren grundlegend geändert. Der Einführungskurs ist jetzt auf zwei Kurse aufgeteilt (siehe mit.edu/6.01/mercurial/fall11/www/index.html für die erste Hälfte) und der Großteil des Sprachunterrichts ist in Python.
Jonsca
4
Ich stimme zu, dass Scheme eine großartige Sprache ist und es eine gute Idee ist, sie zu lernen. Seien wir jedoch ehrlich. Fast jeder reale Programmierjob verwendet eine imperative Sprache. Für die meisten wirklich ernsthaften Programmieraufgaben ist C ++ erforderlich, und C ++ - Programmierer halten Sie normalerweise aus dem einen oder anderen Grund aktiv davon ab, alle netten mathematisch basierten Ideen für die Programmgestaltung zu verwenden. Rekursion spielt in Ihren Imperativprogrammen keine große Rolle.
Felix Dombek
4
@FelixDombek, bist du sicher? Alle Ideen? "Ja wirklich?" Eine imperative Schleife ist auch eine mathematische Idee, wohlgemerkt.
SK-logic
3
@FelixDombek, ich kann nur einen Grund dafür sehen, Iteration anstelle einer Schwanzrekursion in C ++ zu verwenden. Alle anderen Formen der Rekursion werden genauso bedient wie in Implementierungen von funktionalen Sprachen. Ich kann Ihrer Bemerkung also überhaupt nicht zustimmen. Je mehr Mathematik Sie in Ihre C ++ - Codierung einfügen, desto besser. Ich bezweifle, dass Sie versuchen werden, rot-schwarze Bäume in C ++ ohne Rekursion zu implementieren.
SK-logic
37

Niemand erwartet, dass Sie als Neuling eine Sprache beherrschen , um einen richtigen Job zu finden. Warum also nicht mit einer beginnen, die leicht zu erlernen ist? Wenn man erwartet, dass Anfänger das Programmieren lernen, indem sie eine professionelle Sprache in einer professionellen IDE verwenden, ist das so, als würde man einem Medizinstudenten im ersten Jahr ein Skalpell geben und sie an lebenden Körpern arbeiten lassen.

Mach dir keine Sorgen; Du lernst schließlich Java / C / C ++ und beginnst wahrscheinlich dein zweites Jahr. Wenn Sie jetzt mit dem Erlernen von Java 6 begonnen haben, ist Java 8 zum Zeitpunkt Ihres Abschlusses noch nicht verfügbar. Oder es wurde durch Python ersetzt. Oder eine andere Sprache, die noch nicht erfunden wurde, aber die Branche im Sturm erobert. Es ist besser, das Erlernen der "populären" Dinge so lange wie möglich zu unterbrechen, damit es nicht überholt ist, wenn Sie in der Belegschaft arbeiten.

Schema / Racket hilft Ihnen, sich auf die wichtigen Konzepte zu konzentrieren: Algorithmusdesign, Datenstrukturen und Informationsmanipulation. Wissen Sie, das Zeug, das allen Sprachen gemeinsam ist.

Barry Brown
quelle
36

Herzlichen Glückwunsch, Sie werden jetzt in der Computerwelt zum Äquivalent eines Veganers und in zwei Jahren werden Sie keine Diskussion mehr führen können, ohne die Leute über die höhere moralische Grundlage zu informieren, auf der Sie stehen. ;)

Wie auch immer, Sie haben eine sehr gute Schule gefunden. Schulen, die nicht von der Industrie ausgepeitscht werden, sind gut.
Wie jemand anderes sagte, bringen sie Ihnen die Wissenschaft bei, von der Sie das Handwerk ableiten .

Viele schlechte Code-Monkey-Farmen bringen dir das Handwerk bei, und dann kannst du vielleicht die Wissenschaft daraus ableiten, aber es ist nicht garantiert. (und Sie können mit ziemlich seltsamen Missverständnissen darüber enden)

Wie auch immer, als geehrtes Mitglied der funktionalen Masse werden Sie sich immer missverstanden und unterschätzt fühlen, wenn Sie von dort verschwinden .

Zugegeben, der durchschnittliche Computer-Wiz ist nichts Neues.

Sie sind jetzt für ein hohes Risiko von:

  • versuchen, eine akademische Karriere abzuschließen ,
  • eine Promotion anstreben ,
  • ... Emacs .

Sie werden Open Source wahrscheinlich auch mögen, aber Sie werden nie genug Mitarbeiter für Ihre funktionalen Projekte finden.

ZJR
quelle
2
Sorry, um nekrokommentieren zu können, aber warum Emacs? Ich bin neugierig. Ich sitze im selben Boot wie OP (seit Herbst College-Neuling) und wir werden Racket verwenden (ähnlich wie Scheme).
Kevin Johnson
2
@ KevinJohnson emacs wird häufig als ein in LISP geschriebenes Betriebssystem bezeichnet, das vielen Menschen aus Versehen hilft, Code zu bearbeiten . Wenn Sie Funktionsparadigmen tun und (werden gelehrt) wie die Obszönitäten von Lisp-ähnlichen Schreibweisen wird es wahrscheinlich auf Sie als Ihren bevorzugten Texteditor wachsen.
ZJR,
1
"Lehren Sie die Wissenschaft, aus der Sie das Handwerk ableiten": +1
Giorgio
23

Welche Unterschiede ergeben sich für mein zukünftiges Programmierverständnis?

Das ist ein bisschen wie zu fragen, wie das Lesen von Shakespeare Ihnen hilft, Hausarbeiten zu schreiben. Das Programmieren (in jeder Sprache) ist nur ein Mittel, um Ihre Ideen in ausführbarer Form auszudrücken. Die Informatik liefert die konzeptionellen Bausteine, mit denen Sie etwas Interessantes sagen können. Die Schemasyntax ist relativ einfach, sodass Sie schnell und ohne viele Compilerfehler, Standardbibliotheken usw. zu interessanten Ideen gelangen.

Pass gut auf im Unterricht - in diesem Semester wirst du viele interessante Dinge lernen.

Caleb
quelle
14

Es sieht so aus, als wären Sie ein Neuling in der Programmierung und hätten keinerlei Vorkenntnisse. Hier sind einige Erläuterungen:

Warum Schema und nicht C / C ++ / Java ...?

Beim Erlernen einer Programmiersprache (eine Analogie könnte zur englischen Sprache hergestellt werden) lernen Sie die Syntax, die Sie befolgen müssen, damit Ihr Code grammatisch korrekt ist. Eine Sprache bringt Ihnen jedoch nicht die Logik bei, die hinter dem Lösen von Problemen steckt. Um diese Logik zu erlernen, lernen Sie verschiedene Programmierparadigmen .

Jede Sprache kann ein oder mehrere Paradigmen (mehr oder weniger genau) implementieren. Ein Paradigma ist eine Möglichkeit, Ihre Logik zu strukturieren, und das von Schema implementierte Paradigma heißt Functional Programming (FP).

Die eigentliche Frage, die Sie stellen, lautet also: Warum FP?

Wie Sie bereits erwähnt haben, sind C, C ++ und Java (die FP nicht implementieren) weitaus beliebter. Tatsächlich ist FP (und aus verschiedenen Gründen hat jeder seine Meinung) in der Branche nicht sehr beliebt.

Auf der anderen Seite wird FP in akademischen Kreisen sehr geschätzt. Es liegt näher am üblichen mathematischen Ansatz, konzentriert sich mehr auf die Beweisbarkeit und Optimierung von Algorithmen, und die meisten Leute stimmen darin überein, dass es Sie zu einem besseren Programmierer im Allgemeinen machen würde.

Es ist vergleichbar mit Schulen, die Latein unterrichten, um englische Literatur zu studieren.

rahmu
quelle
1
Schema muss nicht funktional verwendet werden, obwohl dies mit größerer Wahrscheinlichkeit der Fall ist als in C, C ++ und Java.
Ricky Clarkson
"Es ist vergleichbar mit Schulen, die Latein lehren, um englische Literatur zu studieren."
Giorgio
11

Sie sollen lernen, wie programmiert wird und was die Grundkonzepte sind. Die alltäglichen Sprachen, die in den meisten Unternehmen verwendet werden, eignen sich möglicherweise gut für die Erstellung der heute benötigten Software, sind jedoch nicht unbedingt dazu geeignet , Ihnen die Grundlagen der Programmierung beizubringen.

Sobald Sie die Konzepte verstanden haben, können Sie sie leicht auf andere Sprachen anwenden.

perdian
quelle
4
"Die alltäglichen Sprachen, die in den meisten Unternehmen verwendet werden, sind möglicherweise gut geeignet, um die heute benötigte Software zu erstellen" - Angesichts der typischen Kosten, Qualität und Erfolgsraten ist das eine eher optimistische Aussage :-)
Jörg W Mittag
Das stimmt definitiv! Deshalb habe ich "might" anstatt "are" geschrieben :-)
perdian 20.10.11
1
"Sobald Sie die Konzepte verstanden haben, ist es einfach, sie auf andere Sprachen anzuwenden." - Diese Aussage ist nur zu wahr. Ich vermute, dass ich ungefähr eine Woche brauchen würde, um die Syntax in so gut wie jeder neuen Sprache zu erlernen und kompetent zu sein. Ich habe C / C ++ und Assembly in der Schule unterrichtet, aber ich habe mir nebenbei Python und Lisp für ein Forschungsprojekt beigebracht. Ohne das grundlegende Verständnis, das ich durch Python, Lisp und Assembly gewonnen habe, bezweifle ich, dass ich beinahe der Programmierer bin, der ich heute bin.
Wayne Werner
9

Wenn Sie mit DrRacket lernen, verwenden Sie wahrscheinlich auch das Curriculum für das Entwerfen von Programmen.

Hier ist, was einer der (zugegebenermaßen voreingenommenen) Autoren von HtDP über die Art und Weise sagt, wie das Lehrsystem die Studenten an der Northeastern University auf das kooperative Bildungsprogramm vorbereitet hat: Studenten wechseln Semester des akademischen Studiums mit Semestern des Vollzeitstudiums Beschäftigung).

Vor meiner Ankunft hatte Northeastern zwei Jahrzehnte lang ein Standardcurriculum verwendet: drei Begriffe der derzeit angesagten Sprache (Pascal, C ++, Java) mit einer Reihe äußerst grafischer Übungen, die mit Lektionen über praktische Anwendungen verknüpft waren. Der Lehrplan wurde weit verbreitet in SIGCSE und verwandten Communities veröffentlicht, funktionierte aber nicht. Auf dem Höhepunkt der Webblase erhielt nur etwa ein Drittel der Schüler Programmkooperationen; Die meisten anderen waren „Technikfreaks“, wie sie sich nannten: Computer verschieben, Skripte ausführen, Router und Netzwerke einrichten usw. Die gesamte Ausbildung kostete 150.000 US-Dollar.

Nach einem Jahr in Northeastern bat mich unser Dekan, den ersten Kurs zu übernehmen. Die erste Instanz war entgegen den Vorhersagen einiger lokaler Fakultäten ein Erfolg. Obwohl es sich um eine Testversion handelte, haben wir auf das TeachScheme gewechselt! Lehrplan dauerhaft; Der Dekan schlug vor, einen Brückenkurs zu entwerfen, um den HtDP-Kurs mit dem Rest des Lehrplans zu verbinden. Damit begann meine Zusammenarbeit auf HtDC mit Viera Proulx. Siehe das Nachskript unten. Innerhalb weniger Jahre hörte ich von unserer Koop-Fakultät, dass der Anteil der Programmierungspositionen zunahm. Bis 2007 - als ich das letzte Mal an dem Kurs teilgenommen habe - wurde mir mitgeteilt, dass der Programmanteil bei der ersten Zusammenarbeit auf zwei Drittel und mehr gestiegen ist. In der Zwischenzeit alle TeachScheme! Die Kurse wurden von zahlreichen Fakultätsmitgliedern unterrichtet, deren Lehrstil und Persönlichkeit sich von meiner unterscheidet. Das Verhältnis der Programmkooperationen ist auf drei Viertel und mehr gestiegen, und alle nachgelagerten Fakultäten freuen sich über die Programmierfähigkeiten der Studenten.

Bearbeiten: Für diejenigen, die sich sehr für das Rationale des Lehrplans interessieren, hier die Erklärung des Hauptarchitekten: http://www.youtube.com/watch?v=m3be1PHW5X0

Pidge
quelle
6

Meine Schule begann auch mit Scheme. Ein Grund, der erwähnt wurde, war, dass dies dazu beitrug, die Wettbewerbsbedingungen zu verbessern. Die meisten Comp Sci des ersten Jahres sind möglicherweise einigen oder sehr viel häufigeren Sprachen ausgesetzt. Es war weniger wahrscheinlich, dass jemand viel über das Schema wusste.

dunkler Fader
quelle
4
Genau; Ich fing an, Pascal, C, Basic und x86 Assembler zu kennen, während andere Erfahrungen in verschiedenen Sprachen hatten oder überhaupt keine. Wir lernten ML kennen, mit dem nicht nur niemand Erfahrung hatte, sondern das auch ein so fremdes Paradigma hatte, dass es sich anfühlte, als würden selbst die erfahrensten unter uns von vorne anfangen. Später denke ich, dass ML (das funktionale Paradigma) das nützlichste ist, was ich bei CS gelernt habe.
KaptajnKold
6

Da Lisp (Schema ist ein Dialekt) die Grande Dame der funktionalen Sprachen ist (denken Sie an F #, Groovy, Clojure, Haskell usw.), hinterlässt dieses Training auch keine kommerziellen Nachteile, da dies das heißeste ist Thema auf dem Entwicklungsblock jetzt.

adrianmcmenamin
quelle
4

Das Schema hilft Ihnen dabei, gut zu werden und den richtigen Umgang mit funktionalen Programmiersprachen zu finden. Scala zum Beispiel ist ein Functional / OO-Hybrid, der ziemlich brillant, wenn auch etwas dicht ist. Sprachen wie diese markieren jedoch die Zukunft - hoffentlich.

Lisp-ähnliche Sprachen haben jedoch eine Reinheit und Einfachheit in ihrem Design, die sie für den Unterricht ein bisschen einfacher machen. Der schöne Vorteil ist jedoch, dass Sie später viel einfacher etwas wie Scala lernen können.

egervari
quelle
3

Wir haben das Programm in der ersten und ersten Hälfte des zweiten Semesters abgeschlossen. Erst als wir uns tatsächlich an die Arbeit mit C machten, begann ich, die Kraft von Scheme zu erkennen.

In Bezug auf Ihre Frage, warum Schema gewählt wurde: Die Antwort ist, dass es eine der einfachsten Sprachen ist und es Ihnen ermöglicht, eine Menge zu tun (insbesondere, wenn wir später anfangen, mit faulen Listen zu spielen). Außerdem :

  1. Für Leute, die keine Programmiererfahrung haben, ist es einfacher zu lernen. Es gibt nicht viele technische Details und nur ein paar Sonderformen.
  2. Es ermöglicht eine Abstraktion auf höherer Ebene. Ein guter Kurs kann sich darauf konzentrieren, Programmierern das Denken beizubringen, anstatt sich auf die technischen Details zu konzentrieren, die es den Schülern ermöglichen, bessere Programmierer zu werden.
  3. Die Listen sind unglaublich. Sie können so viel damit anfangen. Auto und CDR erweisen sich als leistungsstarke Werkzeuge, und erst wenn Sie mit Zeigern arbeiten, stellen Sie fest, dass Scheme beim Umgang mit Listen erstaunlich war.
Avian78
quelle