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?
Antworten:
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.
quelle
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).
quelle
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.
quelle
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.
quelle
"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.
quelle
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.
quelle
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.
quelle
ORDER BY
und C ++std::sort
.