Warum lernt man CS auswendig zu lernen? [geschlossen]

23

Ich habe Advanced Placement Computer Science für das vergangene Jahr in der High School genommen. Es scheint, als ob uns beigebracht wird, Code und Funktionen einfach auswendig zu lernen und nicht, wie man mit Dokumentation und dergleichen einfallsreich und effizient umgeht.

In der Praxis stelle ich mir vor, dass Sie bei vielen (wenn nicht allen) Programmierjobs die Dokumentation durchblättern, den Code aus der Vergangenheit und den Code anderer durchsehen und im Wesentlichen das tun können, was mein Lehrer als "Betrug" bezeichnen würde.

Ich bin mir zwar einig, dass Kernkonzepte für das Auswendiglernen (in jedem Fachgebiet) unerlässlich sind, aber es erscheint mir überflüssig und unpraktisch, für eine CS-Klasse eine Klausur in Papierform abzulegen, insbesondere wenn Sie praktisch einen Compiler, Debugger oder Referenz haben würden Handbücher und das gesamte Internet , auf die in jeder realen Arbeitssituation verwiesen wird.

Warum wird CS unterrichtet, indem man sich auf das Auswendiglernen von Code und Funktionen konzentriert, und nicht auf das Unterrichten nützlicher Fertigkeiten, einschließlich der Verwendung und Interpretation von Dokumentation, Beispielcode, Debugger und dergleichen?

esqew
quelle
34
Bei CS geht es nicht um das Speichern von Code und Funktionen. Wo zum Teufel studierst du CS? Darf ich vorschlagen, dass das eigentliche Problem darin besteht, dass der Kurs, den Sie nehmen, Mist ist?
Andres F.
1
@AndresF. OP ist in Advanced Placement Computer Science, einem Kurs für Abiturienten (vor der Universität).
3
@GlennNelson Ups! Ich habe das falsch verstanden. Ok, in diesem Fall: esqew : Sie werden erleichtert sein zu wissen, dass es bei CS (meistens) nicht um das Auswendiglernen von Code geht. Sie müssen jedoch viel lesen;) Bei einer CS-Ausbildung geht es auch nicht unbedingt darum, einen Job zu finden (Sie werden wahrscheinlich enttäuscht sein, wenn Sie glauben, dass dies der Fall ist)
Andres F.,
1
Sie sollten wissen, dass dies an den meisten Hochschulen nicht so ist. An meiner Schule war jeder einzelne Informatik-Test ein offenes Buch.
Casey Patton
2
Beachten Sie, dass ein Teil der Antwort höchstwahrscheinlich darin besteht, dass CS kein Programmierabschluss ist . Erwarten Sie nicht, Programmieren von einer CS-Klasse zu lernen. Erwarten Sie, alle möglichen zugrunde liegenden Theorien und Konzepte zu lernen , die für einen Programmierer einfach relevant sind . Sicher, Sie werden ein paar Programmiersprachen lernen und ein bisschen grundlegendes Programmieren lernen, aber hauptsächlich wird davon ausgegangen, dass Sie sich auf die eigentliche Programmierung konzentrieren können , und nicht auf die andere um.
Jalf

Antworten:

37

In einer Highschool-Klasse befinden Sie sich auf der grundlegendsten Ebene Ihres Weges zur Meisterschaft. Dinge, die in Ihrer Klasse behandelt werden, sind die Dinge, von denen ein professioneller Programmierer erwartet wird, dass sie kalt sind. In vielerlei Hinsicht entspricht dies dem Erlernen Ihrer "Stundenpläne". Natürlich können Sie in einer "realen" Umgebung immer einen Taschenrechner greifen, aber diese Speicherung erhöht nicht nur Ihre Geschwindigkeit bei komplexeren Aufgaben, sondern fördert auch ein gründlicheres Verständnis der Grundprinzipien.

Sie sollten beispielsweise verschiedene Sortieralgorithmen kennen, wie sie implementiert sind, wie sie funktionieren, wann sie am besten verwendet werden und wann sie nicht verwendet werden sollen. Dies könnte immer nachgeschlagen werden, sollte es aber nicht sein müssen - genauso wenig wie ein Mathematiker 6 mal 8 nachschlagen muss.

Jeffrey
quelle
9
Sie sollten die grundlegende Natur der Sortieralgorithmen kennen, aber es ist ungefähr 15 Jahre her, dass ich Gelegenheit hatte, etwas anderes als eine Blasensorte zu schreiben. (Für sehr kleine N ist es manchmal die bessere Antwort.)
Loren Pechtel
1
Ich wünschte, ich könnte sagen, dass alle Informatikkurse so gut sind. An meiner High School unterrichteten sie grundlegende Java-Syntax ... für das ganze Jahr. Viele der Teilnehmer gaben sich damit zufrieden, "Programmierer" zu sein, als sie nicht einmal den Unterschied zwischen Bubble-Sortierung und Dijkstra-Algorithmus erklären konnten.
Daniel Gratzer
2
Wenn Sie beispielsweise ein beliebiges Wort in einem Wörterbuch nachschlagen können, sollten Sie theoretisch in der Lage sein, diesen Artikel in meanone zu verstehen . Unser Gehirn behandelt jedoch nur eine begrenzte Anzahl verschachtelter Unverständnisse.
Benjol
1
Und das Auswendiglernen meiner Stundenpläne hat mir absolut keinen Sinn gemacht. Wie viel Zeit verbringt der durchschnittliche Softwareentwickler mit der Implementierung von Sortieralgorithmen? Oh, warte - wahrscheinlich um die 0 . Selbst bei der extrem geringen Wahrscheinlichkeit, dass die von der Umgebung bereitgestellte Sortierung für Sie nicht gut genug ist, muss nur ein Mitarbeiter einen geeigneteren Algorithmus schreiben, und er kann die trivial verfügbaren Informationen zu so etwas wie Wikipedia zur Auswahl und Implementierung verwenden der optimale Algorithmus - und dann können Sie ihn für den Rest der Zeit wiederverwenden.
DeadMG
2
@kaoD: Und das Auswendiglernen der Referenz wird dabei nicht helfen. Es geht nicht darum, etwas zu erfinden, es ist nur eine Kopie einfügen. Der einzige Unterschied zwischen dem Antworten aus dem Speicher und dem Einfügen von Texten aus Wikipedia besteht darin, dass einer im RAM und einer in Ihrem Gehirn gespeichert ist. Es ist immer noch ein Copy-Paste.
DeadMG
14

Es wird oft auf diese Weise gelehrt, weil Lehrer im Allgemeinen keine andere Möglichkeit kennen, das Verständnis zu testen. Deine Gefühle stimmen völlig darin überein, dass es wertlos ist, so unterrichtet zu werden. Die Art und Weise, wie Menschen im Allgemeinen ausgebildet werden, bedarf dringend einer Reform!

Das Leben wird jedoch besser, zumindest an der UIUC habe ich festgestellt, dass je höher Sie in Ihren CS-Klassen sind, desto weniger die Prüfungen orientiert sind, wie Sie beschreiben, und in den meisten meiner Kurse wurde uns ein Spickzettel für den ganzen Mist erlaubt dass Sie wahrscheinlich gegoogelt hätten, wenn Sie tatsächlich an einem Computer gesessen hätten.

Davon abgesehen, je weiter oben ich in meinen Klassen bin, desto weniger lehren sie dich über Sprachen oder wie man etwas umsetzt. Tatsächlich hatte ich nur einen Kurs, in dem sie uns etwas über Programmierung beigebracht haben. Es waren meist abstrakte mathematische Konzepte und wir mussten den Programmierteil selbst herausfinden (vorausgesetzt, sie waren immer bereit zu helfen, aber das war es nie etwas auf einer Prüfung).

rudolph9
quelle
2
+1 Amen. Früher unterrichtete ich Programmieren am College. Mein Ziel war es, die Schüler so schnell wie möglich an den Punkt zu bringen, an dem sie ihre eigenen einzigartigen Projekte realisieren konnten. Ich hasse es, wenn Lehrer es so behandeln, als würden sie Dinge auswendig lernen oder "richtig" machen. Ich habe versucht, genügend Fähigkeiten zu entwickeln, um die eigene Kreativität der Schüler zu entfalten.
Mike Dunlavey
Ich hatte Studenten, die sehr klug und sehr gut im Auswendiglernen waren. Es würde ein oder zwei Tests dauern, bis ich Ihnen sagen konnte, dass Sie Programme schreiben müssen, um Programmieren zu lernen, und keine Dinge auswendig zu lernen.
Mike Dunlavey
Hört hört! Es ist lustig, als ich aufwuchs, war ich nie gut in der Schule; Schlechte ACT-Punktzahl, schlechte Noten usw. Aber nach der Einführung in CS ergab alles einen Sinn. Ich kämpfe definitiv in bestimmten Bereichen, aber ich habe nur gelernt, die Dinge zu überwinden, die mich zurückgehalten haben, indem ich Konzepte verstanden habe, die ich in meinen CS-Kursen gelernt habe.
Rudolph9
10

Lass nicht zu, dass der Schulbesuch deine Ausbildung beeinträchtigt.

-- Mark Twain

Ich bin Mexikaner und sage Ihnen das, weil es in Mexiko nicht gerade ein guter Ort für Bildung ist (auf jedem Niveau), zumindest in der öffentlichen Bildung.

Nun, mitten in meiner Karriere (CS) fühle ich mich genau so, wie Sie sich fühlen, also beginne ich von alleine zu lernen und verbringe ein Jahr damit, Algorithmen, Linux, Skripte, die Funktionsweise meines Computers und ein bisschen relationales Wissen zu lernen Datenbanken, HTML, CSS, etc (ein wenig über alles). Und natürlich musste ich den Unterricht auslassen, meine Noten ablegen und ein Jahr danach meinen Abschluss machen, um zu lernen.

Nach diesem Jahr kehre ich zu meiner "normalen" Routine zurück, zurück zu regulären Klassen, Hausaufgaben, Prüfungen und Projekten. Der Unterricht war immer noch langweilig, nichts Neues zu lernen, alles war gleich. Also beschloss ich, an Websites für Programmierwettbewerbe wie UVA Judge Online , Code Chef und Project Euler teilzunehmen , sah mir dann einige Vorlesungen beim MIT Open Course Ware an und lernte noch selbst, aber auf andere Weise.

Die Lektion: Lass die Dinge nicht geschehen, lass die Dinge geschehen. Wenn Sie mit der Art und Weise, wie Sie lernen, nicht zufrieden sind, ändern Sie es!

* Nicht die klügsten Entscheidungen, die ich getroffen habe.

Raspeitia
quelle
4
"Lass die Dinge nicht geschehen, lass die Dinge geschehen", - Wenn es jemals Worte gab, nach denen man leben konnte, dann sind es diese!
GroßmeisterB
+1 für das Zitat. Ich musste den Rest der Antwort <fast> nicht lesen
Chani
3

Es hängt davon ab, was Sie auswendig zu lernen versuchen ...

Um beispielsweise Mathematik zu studieren, muss man mit Algebra vertraut sein und häufig ziemlich kreativ sein, wie man algebraische Manipulationen durchführt, um Gleichungen zu vereinfachen. Sie müssen jedoch bestimmte Bausteine ​​auswendig gelernt haben, um sich auf diese interessanten Aspekte konzentrieren zu können. Sie müssen beispielsweise Ihre Multiplikationstabellen auswendig kennen und einige Identitäten kennen, damit Sie erkennen können, wie Sie die Gleichungen manipulieren, um diese Identitäten zu verwenden.

Um Informatik zu studieren, müssen Sie ebenfalls mit den grundlegenden Datenstrukturen und Algorithmen der Bausteine ​​vertraut sein, da Sie diese auf übergeordnete Probleme anwenden müssen. Es ist sehr unwahrscheinlich, dass Sie jemals eine eigene Implementierung für verknüpfte Listen in der realen Welt schreiben würden. Sie würden einfach die von Ihrer Bibliothek bereitgestellte verwenden. Wenn Sie jedoch wissen, wie eine verknüpfte Liste implementiert wird und wie Sie Ihre eigene implementieren, können Sie überlegen, wo und ob Sie eine verknüpfte Liste verwenden sollten, wenn Sie anfangen, an übergeordneten Problemen zu arbeiten. In ähnlicher Weise würden Sie niemals Ihre eigene binäre Suchfunktion schreiben, aber es ist wichtig zu verstehen, wie dies funktioniert, damit Sie über Dinge nachdenken können, bei denen eine Datenbank einen Index verwenden könnte und bei denen dies nicht möglich ist.

Sobald Sie einige grundlegende Bausteine ​​auswendig gelernt haben, ist es viel einfacher, Dinge wie die Dokumentation zu interpretieren. Die Dokumentation könnte darauf hinweisen, dass eine Liste verwendet wird, und davon ausgehen, dass der Programmierer implizit weiß, dass dies bedeutet, dass Einfügungen O (1) und Suchvorgänge O (n) sind. Die Bausteine ​​sind im Laufe der Zeit auch erheblich stabiler - Sie werden sehr wahrscheinlich alle paar Jahre neue Debugger verwenden, und Sie werden wahrscheinlich während Ihrer gesamten Karriere dieselbe binäre Suche verwenden.

Justin Cave
quelle
Wo und ob eine verknüpfte Liste verwendet werden soll, hängt von der Komplexität der verschiedenen Vorgänge und der Speicherleistung ab. Sie müssen keine implementieren, um eines dieser Dinge zu wissen. Wo kann eine Datenbank eine binäre Suche verwenden? Für Schlüssel, die es zu vergleichen weiß. Das war einfach.
DeadMG
3

"Warum wird CS unterrichtet, indem man sich auf das Auswendiglernen konzentriert ... anstatt nützliche Fertigkeiten zu vermitteln" - Ich denke, dass Sie das Auswendiglernen ein bisschen zu sehr abwerten. So wie Sie das Schreiben von Code, das Interpretieren der Dokumentation und das Verwenden des Debuggers üben sollten, sollten Sie auch das Auswendiglernen üben.

Sie werden überrascht sein, wie viel effizienter Sie werden können, wenn Sie nicht so oft zur API-Referenz gehen oder so viele Debugger-Befehle nachschlagen müssen.

Eines der besten Dinge, die ich an der Highschool gelernt habe, war es, einen Freund zu beobachten, der im Unterricht keine Notizen machte. Sein Argument war, dass er sich erinnern konnte, was wichtig war. Ich habe angefangen, das Gleiche zu tun und denke, dass es meine Memorisierungsfähigkeiten verbessert hat, was ich selbst bei all den handlichen API-Referenzen auf täglicher Basis sehr nützlich finde.

DXM
quelle
2
Die API nicht nachschlagen zu müssen, kommt aus der Praxis, die API nicht als formale Ausbildung zu lehren.
DeadMG
@DeadMG: Sich an mehr Dinge erinnern zu können, ist wie alles andere mit Übung verbunden. Das Erfordernis, dass Sie sich an bestimmte APIs erinnern, ist an sich kein Ziel, sondern ein Mittel, Ihren Kopf auf das Speichern von Informationen zu trainieren, damit Sie sie nicht so oft nachschlagen müssen. Und ich spreche nicht nur von APIs. Wenn ich mich an eine zusätzliche Sache erinnern kann, ist das eine Reise weniger, die ich zu Google / MSDN / einer anderen Quelldatei machen muss, und in der Praxis macht dies einen Unterschied darin, wie schnell Sie arbeiten können .
DXM 08.02.12
Übe mit dieser spezifischen API . Dinge im Allgemeinen nicht auswendig lernen. Und die Zeit, die in der Ausbildung verbracht wird, ist im Vergleich zur Berufszeit eine winzige Fußnote.
DeadMG
2

Stift- und Papierprüfungen sind tatsächlich sinnvoll, wenn das Ziel darin besteht, ein vollständiges Verständnis des vorliegenden Themas zu testen. Ich habe vor fast einem Jahrzehnt die Computer Science AB-Prüfung abgelegt und bin mit der Stift- und Papiermethode einverstanden.

Sie sollten genug über Algorithmen wissen, die Sie in den unteren Stufen der Informatik gelernt haben, um überlegen zu können, wie der Implementierungscode in Ihrer Zielsprache geschrieben werden soll. Die Schüler sollten auch in der Lage sein, Code von Hand mit größtenteils korrekter Syntax zu schreiben. Wir alle vermissen manchmal ein Semikolon oder eine Klammer :). Auch Debugging- und Designfähigkeiten können ohne Rückschluss auf eine hilfreiche IDE getestet werden.

Wenn ein Schüler dies nicht kann, besitzt er keine Beherrschung des Themas, nur vielleicht eine vorübergehende Vertrautheit.

Peter Smith
quelle
-1: Alle Handschrift, die syntaktisch korrekten Code schreibt, besagt, dass die Person in der Lage ist, ein kompilierbares Programm zu schreiben (wahrscheinlich ungefähr eine Million Mal langsamer als der langsamste Computer). -Das funktioniert möglicherweise nicht wie beabsichtigt. Schlimmer noch, sie haben nur ein gutes Gedächtnis und können wahrscheinlich Shakespare rezitieren, wenn sie gefragt werden. Es reicht nicht aus, um die Fähigkeiten der Person als Entwickler anzuzeigen.
Mattnz
Diese Antwort enthält keine Begründung für die vorgelegte Stellungnahme. Warum sollte jemand in der Lage sein, eine Implementierung für einen Sortieralgorithmus in seiner bevorzugten Sprache zu schreiben?
DeadMG
Der Punkt ist nicht, dass diese Person ein guter Entwickler ist, sondern dass sie das Material der Informatik kennt, das in ihrer Klasse gelehrt wird. Wenn einem Schüler beigebracht wurde, wie man eine Funktion grafisch darstellt, ist es vernünftig, zu erwarten, dass dieser Schüler dies bei einer Prüfung tut. Gute Tests übertreffen das Auswendiglernen auch, indem sie Fragen stellen, die konzeptionelles Verständnis erfordern, wie beispielsweise das Implementieren der Blasensortierung mit mehreren Schlüsseln für diese Datenstruktur, die ich gerade aus dem Nichts gezogen habe, oder den Unterschied zwischen diesem suchenden Pseudocode, den ich Ihnen gebe, und der binären Suche.
Peter Smith
-2

Meiner Erfahrung nach ist das Auswendiglernen mit einfacher Übung verbunden, und es ist absolut nicht erforderlich, sie zu unterrichten. Noch wichtiger ist, dass Sie sich bei diesem Ansatz nur merken müssen, woran Sie sich tatsächlich erinnern müssen , und nicht zufälligen Müll, von dem Ihr Lehrer hofft, dass Sie ihn brauchen, und den Sie ausnahmslos nicht brauchen. Die Zeit, die aufgewendet wird, um sich die Implementierung eines Algorithmus zu merken, könnte viel besser einer anderen Sache gewidmet sein.

Warum sollten Sie jemals üben müssen, einen Algorithmus zu schreiben? Sobald Sie es einmal geschrieben haben, können Sie es für immer wiederverwenden - auch wenn die Möglichkeit äußerst gering ist, dass noch kein anderer Benutzer eine frei verfügbare Implementierung für die Sprache Ihrer Wahl geschrieben hat und Ihre Umgebung dies noch nicht bereitstellt ein Algorithmus für Ihre Verwendung, der für die meisten einfachen Algorithmen wie Sortieren und dergleichen trivialerweise nicht zutrifft. Etwas zu üben, bei dem es sehr unwahrscheinlich ist, dass Sie es jemals tun müssen, und selbst wenn Sie es tun, müssen Sie es jemals nur einmal tun? Kein wertvoller Zeitaufwand.

Das Wichtigste, was Sie über Heapsort wissen sollten, ist, dass Sie es überhaupt nicht implementieren können. Es ist die Betriebskomplexität im besten und im schlimmsten Fall und ähnliche Dinge. Überraschenderweise gibt es auf Wikipedia eine handliche Tabelle, die Ihnen diese Informationen umgehend zur Verfügung stellt. Also wieder, es hat keinen Wert , dieses Wissen zu haben. Es ist ab sofort für Sie verfügbar, wann immer Sie es möchten, bis zum Ende der Zeit, praktisch ohne Kosten. Warum solltest du es dir merken wollen? Es hat keinen Sinn.

Nach meiner Erfahrung gibt es absolut keinen Grund, von einem Studenten zu verlangen, dass er sich etwas einprägt. Wenn Sie eine Frage stellen, die aus einer Referenzquelle beantwortet werden kann, dann stellen Sie eine Frage, bei der die Beantwortung keinen Wert hat.

DeadMG
quelle
2
Meine Güte , Jungs, macht euch nicht die Mühe , eure Ablehnungen oder ähnliches zu erklären ...
DeadMG
Das einzige Mal, dass ich Heapsort kennen musste, war, als ich eine veränderbare Prioritätswarteschlange benötigte (Heapsort funktioniert hervorragend als Prioritätswarteschlange). Die Fähigkeit, bekannte Algorithmen anzupassen, ist ein guter Grund, um zu wissen, wie man sie implementiert.
David Thornley
@ David: Sie müssen nicht wissen, wie Heapsort funktioniert. Eine Implementierung mit einem beliebigen Sortieralgorithmus wäre in Ordnung.
DeadMG
Nicht in diesem speziellen Fall würde es nicht. Auf einem System, das bereits überlastet sein könnte, musste es häufig mit vielen Ereignissen fertig werden. Für dieses Projekt brauchten wir Effizienz und wir haben sie bekommen. Im Kontext geschah dies einmal in einer ziemlich langen Karriere, und all meine Sortierungen waren lange Zeit Dinge wie die von SQL ORDER BYund C ++ std::sort.
David Thornley
@ David: Daher würde ich vorschlagen, dass es kaum etwas ist, das jeder Programmierer braucht.
DeadMG