Ich habe einige Informatikstudenten in einem obligatorischen Einführungskurs in die Programmierung, die eine Programmiersprache als eine Reihe von Zaubersprüchen betrachten, die angewendet werden müssen, um einen bestimmten Effekt zu erzielen (anstatt sie als flexibles Medium zum Ausdruck ihrer Lösungsidee zu betrachten). .
Sie neigen dazu, Code aus früheren, ähnlich aussehenden Aufgaben zu kopieren und einzufügen, ohne das Wesentliche des Problems zu berücksichtigen.
Gibt es Übungen oder Analogien, mit denen diese Schüler sicherer werden, dass sie die Struktur und Bedeutung jedes von ihnen geschriebenen Codeteils verstehen können und sollten?
Antworten:
Sie könnten ihnen eine Reihe von Übungen präsentieren, die jeweils auf den vorherigen aufbauen, während Sie dem Problem ein zusätzliches Element oder eine Wendung hinzufügen, oder das Problem aus einer anderen Perspektive untersuchen, wodurch eine Schwäche der vorherigen Lösung aufgedeckt wird, die einen neuen, anderen Ansatz erfordert . Dies zwingt sie, über jede Lösung nachzudenken, sie zu analysieren, zu modifizieren und mit ihnen zu experimentieren, anstatt nur ein fertiges Stück Code zu kopieren.
Ein andere Möglichkeit - wenn auch nicht unbedingt eine Programmieraufgabe - ist sie zu fragen , zu schätzen verschiedene Dinge. ZB wie viel Wasser fließt pro Sekunde durch das Mississippi-Delta? Solche Fragen haben keine eindeutige Antwort, vor allem, weil man bestimmte Annahmen treffen muss, um zu einem überzeugenden (Bereich von) Wert (e) zu gelangen. Und - obwohl Antworten auf viele dieser "klassischen" tatsächlich gegoogelt werden können - können Sie leicht neue finden, die (noch) nirgendwo im Internet zu finden sind.
Beispiele für diese beiden Arten von Übungen finden Sie z. B. in Programming Pearls von Jon Bentley. Auch der Pragmatic Programmer hat einige gute Herausforderungen.
Eine dritte Aufgabe wäre es, ihnen einen Code mit (einem oder mehreren) Fehlern zu präsentieren, die sie finden und beheben müssen. Dies zwingt sie erneut dazu, ihre analytischen Fähigkeiten und Gründe für die tatsächliche Funktionsweise des Programms einzusetzen.
Aktualisieren
Feedback von einem Kommentar von Billy ONeal:
Sie haben Recht, obwohl ich der Meinung bin, dass es eher um das allgemeine Problem geht, Kursschwierigkeiten auf das richtige Niveau zu bringen / Schüler mit ähnlichen Fähigkeiten in Gruppen zusammenzufassen. Darüber hinaus kann man die Schüler in kleinere Gruppen einteilen, in denen sie über die Probleme und Lösungen diskutieren und debattieren und die Probleme gemeinsam lösen müssen. Wenn jemand es nicht bekommt, können die anderen helfen (dieses Setup würde auch die Teamfähigkeit verbessern). Und wenn jemand versucht, faul zu sein und die anderen die ganze Arbeit machen zu lassen, wird das sicherlich vom Lehrer bemerkt (der herumlaufen, die Schüler beaufsichtigen und betreuen soll, nicht WoW auf seinem Laptop in der Ecke spielen soll ;-)
Und man kann die Übungen auch anpassen, um Schüler mit unterschiedlichen Fähigkeiten unterzubringen. Anfänger können langsamer und erfahrene schneller werden.
quelle
Sie kämpfen gegen den Spagat zwischen der Notwendigkeit, sich um Ihr Fach zu kümmern, und der Notwendigkeit, gute Noten zu bekommen . Viele Studenten haben das Gefühl:
(Mach es falsch || Experiment) == (Fehlerhafte Note && Zeitverschwendung)
Sobald ein Schüler das Gefühl hat, dass seine Zeit oder Note gefährdet ist, hört er auch für ein interessantes Fach auf zu lernen und springt direkt zu "Es ist mir egal, gib dem Lehrer einfach die richtige Antwort". Ihre Schüler versuchen, Abstriche zu machen (oder so, wie sie denken), indem sie so wenig wie möglich über das Problem nachdenken und es einfach durch Kopieren und Einfügen weghacken.
Hier sind meine Vorschläge, wie man damit umgeht:
quelle
&&
- obwohl ich vermute, dass es auch als bitweise Operation gelingen könnte.Einige Dinge, die mir einfallen:
Geben Sie ihnen Aufgaben, bei denen sie den Code erklären müssen, den jemand anderes (Sie) geschrieben hat. Das Verstehen des vorherigen Codes oder insbesondere das Fehlen desselben ist sowohl die Hauptursache als auch die Gefahr der Frachtkultprogrammierung. Bitten Sie sie, gegebenenfalls zeilenweise Kommentare zu verwenden, um Ihr Programm in einfachem Englisch (oder in der von Ihnen verwendeten menschlichen Sprache) zu erklären.
Bitten Sie sie erst, nachdem sie den Code erklärt haben, ihn zu ändern, um eine bestimmte Änderung vorzunehmen. Wenn Sie ihnen beispielsweise eine Sortierfunktion gegeben haben, die absteigend sortiert, bitten Sie sie, sie aufsteigend zu sortieren. Oder etwas Anspruchsvolleres. Aber stellen Sie sicher, dass Sie den gegebenen Code verstehen müssen.
Wenn Sie möchten, können Sie einige Ostereier in den Code einfügen. Ein oder zwei Zeilen, die nichts Sinnvolles oder gar nichts mit dem Problem zu tun haben. Geben Sie ihnen einen Hinweis darauf, dass solche Linien vorhanden sind, und geben Sie denen, die sie entfernen, zusätzliche Punkte.
Dann und nur dann können Sie ihnen den Auftrag erteilen, einen Code von Grund auf neu zu schreiben. An diesem Punkt sollten sie ein besseres Verständnis dafür haben, was Code wirklich ist. Sie finden es vielleicht sogar ein bisschen einfacher, es selbst zu tun.
Die Grundidee ist, dass beim Programmieren nicht nur Code geschrieben, sondern auch gelesen wird. Lesen von Code sollte auch gelehrt werden.
quelle
Schauen Sie es sich anders an. Dieses Ladungskult-Phänomen ist das Anfängerstadium des Dreyfus-Modells für den Erwerb von Fähigkeiten . So lernen wir. Als ich das Programmieren zum ersten Mal lernte, gab ich nur Codeseiten von der Rückseite von Compute ein! Zeitschrift. Wiederholung ist der Schlüssel. Babys lernen zu sprechen, indem sie die Geräusche kopieren, die sie von ihren Eltern hören. Alles, was wir lernen, geschieht durch Nachahmung. Uns muss nur beigebracht werden, wie man von Nachahmung zu Meisterschaft übergeht.
Das Problem ist, dass Ihre Schüler nichts wiederholen, sondern es aus dem Internet kopieren. Das hat einige Vorteile, aber die Gewinne sind minimal. Das eigentliche Eingeben des Codes hat mich zu einem Ort des Verstehens gebracht. Ich fing an, Muster in dem, was ich tippte, zu erkennen und verstand, was ich tat.
Eine Möglichkeit besteht darin, Ihr Labor als Code-Dojo zu strukturieren. Lassen Sie die Schüler abwechselnd das gleiche Problem lösen. Wählen Sie ein Problem aus, dessen Lösung etwa 10 bis 15 Minuten dauert. Wiederholen Sie dieses Problem über ein paar Labors hinweg und erweitern Sie die Kenntnisse der Klasse um eine neue Variante. Starten Sie das Labor möglicherweise, indem Sie die Schüler beobachten lassen, wie Sie die Lösung programmieren, und sie es wiederholen lassen. Wechseln der Paare bei jeder Iteration.
Haben Sie für Ihre Tests eine Code-Kata, in der jeder Schüler die Probleme aus dem Semester vor dem Rest der Klasse bearbeitet. Konzentrieren Sie sich nicht nur auf Korrektheit, sondern auch auf Form und Kreativität. Ich denke, dies würde ein tieferes Verständnis für das Programmieren vermitteln als das Geben von Aufgaben zum Mitnehmen.
quelle
Ich habe in der Vergangenheit Einführungskurse gegeben und erinnere mich, dass ich jetzt zurückblicke:
Einige Studenten denken, dass das Programmieren aus verschiedenen Gründen so ist. Ich erinnere mich an ein gutes Kind, das viel Frachtkult gemacht hat, was ich getan habe:
Ich war der Ansicht, dass es kein Einzelfall war, aber andere Schüler in der gleichen Klasse haben möglicherweise ein ähnliches Verhalten oder näherten sich dem Problem und drückten es nicht aus. Ich sprach immer die Klasse an.
Einige Zeit wurde aufgewendet, um einige Dinge wie Determinismus zu erklären, was für sie bedeutete, dass sie in derselben Umgebung mit denselben Daten und demselben Code dieselben Ergebnisse erzielen (die "Zufälligkeit" beseitigen).
Da das Lösen von Problemen im Ermessen des Schülers liegt und nichts anderes, sollte die Aufmerksamkeit darauf gerichtet sein, das Problem zu lösen und nicht den richtigen Spruch zu finden.
Sie befinden sich in einer Bildungsumgebung, daher werden die Probleme so gestaltet, dass sie eine Lernerfahrung bieten. Das Ergebnis ist, zu lernen, wie Programme programmiert werden (oder in einigen Fällen wie Klassen für Systemadministratoren, wie Programme funktionieren, was anders ist) und nicht Gib mir eine Lösung. ("Die Welt braucht keinen anderen Taschenrechner, es ist eine Übung"), damit ihre Probleme mit den verfügbaren Materialien gelöst werden können (Beispiel: Anmerkungen bereitgestellt),
Ich denke, es ist in Code Complete: "Auch wenn Sie kopieren und einfügen, ist der Code Ihnen". Wenn jemand es getan hat, sollte es nicht im Cargo-Stil sein. Jede Zeile musste mir (einzeln) oder einem anderen Schüler (gleich) oder der Klasse erklärt werden.
quelle
Haben Ihre Schüler beginnen an der richtigen ‚Abstraktionsebene‘ zu Beginn des Kurses? ZB eine Hausaufgabe, die sie in die wichtigsten Programmierstrukturen wie Schleifen und Bedingungen einführt, ohne eine einzige Codezeile zu schreiben?
Als ich mit dem Programmieren anfing, hieß unser erster Auftrag " Rick the Robot ". Wir hatten ein Blatt Papier mit einer Luftbildkarte einer Stadt mit interessanten Punkten, wie Banken, Lebensmittelgeschäften usw. Wir hatten einen Typen namens "Rick" und Aktionen wie "mach einen Schritt", "sieh nach links". "Schau nach rechts", "überquere die Straße" und wir könnten Dinge wie "Wiederholen" und "Wenn etwas, dann mach etwas" verwenden. (Dies ist nicht 100%, da ich diese Zuordnung nicht finden konnte.) Die Idee war, dass Rick nur das verwenden konnte, was ihm gegeben wurde, und er musste zu verschiedenen Orten auf der Karte gelangen.
Dies war eine unterhaltsame Übung und führte Sie in die Grundlagen ein (die für Neulinge manchmal am schwierigsten zu verstehen sind). Es gibt keine gute Antwort auf dieses Problem (es ist ein Spiel) und es gibt keine Lösungen zum Kopieren und Einfügen. So etwas könnte es Ihnen auch ermöglichen, ein bisschen mehr mit ihrer Kreativität zu spielen, ohne sie mit Code einzuschüchtern.
Schließlich geht es darum, dass Sie mit dem Abstrakten beginnen und sich dem Konkreten nähern . Sie können die Zusammenfassung nicht kopieren und einfügen. Sie müssen es verstehen, um ein Problem zu lösen.
quelle
while not at-corner do take-one-step end
zum eigentlichen Code übergehen kann, ohne Dinge wie Variablen und Datentypen "nachzufüllen". Entschuldigung, meine Antwort wirkt ein wenig nachdenklich.Sie fordern sie auf, die Analyse und Synthese im kognitiven Bereich von Bloom's Taxonomy zu demonstrieren, wo sie derzeit nur die Anwendung demonstrieren.
Leider ist es eine Art "führen das Pferd das Wasser" Situation. Analyse und Synthese sind auch sehr schwierig, wenn Sie noch Probleme mit dem Verständnis haben. Ohne das vorhandene Verständnis werden Analyse- und Syntheseaktivitäten eher als Ausgrabungen als als Lernaktivitäten fungieren.
Meine persönliche Meinung ist, dass es in Ordnung ist, im Einstieg in Programmierunterricht nichts anderes als eine Anwendung zu erwarten. Dies ist das erste Mal, dass Schüler mit diesen Konzepten konfrontiert werden. Es ist also so, als würde man Kindern das Lesen beibringen, bevor man sie bittet, einen Aufsatz zu schreiben. Diese Fähigkeiten höherer Ordnung werden in ihren späteren Klassen folgen.
quelle
if
Anweisungen funktionieren, und sie müssen in der Lage sein, ihre eigenen Anweisungen von Grund auf neu zu schreiben, bevor sie fortfahren. Lassen Sie den kognitiven Teil arbeiten und fahren Sie mit der Anwendung fort.Haben Sie darüber nachgedacht versorgen sie mit einigem Code , mit zu beginnen? Was auch immer für ein einfaches Gerüst die Aufgabe benötigt, wie eine leere Hauptfunktion (ich weiß nicht, welche Sprache Sie verwenden). Etwas, das kompiliert und läuft und nichts tut. Dann können sie ihren Code mit einer gewissen Sicherheit hinzufügen, dass zumindest ein Teil davon funktioniert.
Dies ist in der "realen Welt" eigentlich ziemlich häufig. Viele IDEs und andere Tools erstellen leere Projekte mit bereits vorhandenen typischen Bibliotheken / Vorlagen / Konfigurationsdateien.
quelle
Jede Art von Frachtkultmentalität (einschließlich der Frachtkulte selbst) beruht auf einem Mangel an grundlegendem Verständnis der beteiligten Technologie.
Cargo-Kult-Programmierung sollte nicht als problematische Gewohnheit angesehen werden, sondern vielmehr als Symptom für die zugrunde liegende Verwirrung, mit der der Programmierer konfrontiert ist.
Noch wichtiger ist, dass die Annahme, dass das Unverständnis des Schülers lediglich das Ergebnis seines Vertrauensmangels ist, grundsätzlich falsch ist und das zugrunde liegende Problem nicht anspricht.
Stattdessen sollte der Copy-Paste-Programmierstil des Schülers eine rote Fahne sein, die Ihnen mitteilt, dass dieser Schüler von der Komplexität der von ihm erwarteten Aufgaben überfordert ist.
Instinktiv nutzt er frühere Arbeiten als Gerüst, auf dem er sein aktuelles Projekt aufbauen kann, und versucht, eine Lösung zu finden, indem er zuvor gelöste Probleme als Bausteine verwendet. Wir alle tun dies bis zu einem gewissen Grad, aber die meisten von uns tun dies, indem sie das Wissen, das sie aus früheren Arbeiten gewonnen haben, als Bausteine verwenden. Dieser Student verwendet stattdessen die Arbeit selbst, was bedeutet, dass er die Blöcke, mit denen er arbeitet, nicht wirklich versteht. Er hat die Arbeit zerlegt, soweit es sein Verständnis zulässt, und große Codeblöcke als atomare Einheiten behandelt, weil er nicht versteht, wie sie funktionieren . Er weiß nur, was sie tun.
quelle
Ändern Sie Ihre Vorstellung von Projekten!
In der Programmierwelt erstellen wir selten neue Projekte für jede Lösung, die es gibt. Meistens modifizieren wir alte.
Ändern Sie Ihre Projektidee von einer Lösung für jede Aufgabe in eine Lösung für das gesamte Semester. Jede Aufgabe baut auf der vorherigen Aufgabe auf.
Beispiel
Projekt: Bau einer Aufzugsanlage
Der Punkt ist, dass Sie auf der vorherigen Aufgabe aufbauen, anstatt alte Aufgaben für eine neue Aufgabe zu recyceln.
quelle
Erwägen Sie die Verwendung einer Sprache auf sehr hohem Niveau, für die ein Minimum an Kesselcode erforderlich ist.
Für mich ist es oft der Boilerplate-Code in großen Frameworks oder ausführlichen Sprachen, der sich wie Zaubersprüche anfühlt und das Verständnis behindert.
In meinem CS-Einführungskurs wurde mir ML persönlich beigebracht . Lisp wurde viele Jahre als Einführung in die Programmierung am MIT unterrichtet. Beide sind eine ausgezeichnete Wahl. Einige der Vorteile, die sie haben, sind
quelle
In den 80er Jahren habe ich einige Nachforschungen über die Probleme von Programmieranfängern angestellt. Aufgrund meiner heutigen Erfahrung mit unerfahrenen Programmierern hat sich nicht viel geändert. Anfänger haben kein nützliches mentales Modell dessen, was Computer tatsächlich tun. Sie greifen auf magische Beschwörungen zurück, weil die Maschine selbst magisch ist.
Das Programmieren erfordert das Aufteilen von natürlich einfachen Aufgaben in unnatürlich kleine Schritte. Da Anfänger sich im täglichen Leben nicht mit solch feiner Granularität auseinandersetzen, fällt es ihnen schwer, herauszufinden, wie die kleinen Schritte sein sollten, insbesondere wenn nicht klar ist, welche kleinen Schritte die Maschine zur Verfügung stellt. Aber selbst wenn sie es schaffen, dies herauszufinden, werden sie mit der gestelzenen Syntax und der eingeschränkten Semantik einer Programmiersprache (einer unnatürlichen Sprache, die sich als eine quasi natürliche tarnt) konfrontiert, die die Mystery Machine fernsteuert.
Da sie keine Verbindung zwischen einer logischen Lösung des Problems und der Funktionalität der Maschine herstellen können, konzentrieren sie sich darauf, die Anforderungen der Sprache zu erfüllen. Das erste Ziel ist es, etwas zu schreiben, das kompiliert. Das zweite ist, das Programm zu optimieren - was auch immer es tatsächlich tut - um einen Absturz zu verhindern. Wenn sie dann die Zeit, die Energie und das Interesse haben, versuchen sie, das Programm dazu zu bringen, Ergebnisse zu erzielen, die dem entsprechen, was das Problem erfordert. Unterwegs können sie versehentlich gut geschriebenen Code erzeugen.
Höchstwahrscheinlich sind Anfänger, die das Programmieren lernen, erfolgreich, weil sie auf ein nützliches mentales Modell des Computers geschlossen haben, und nicht, weil ihnen absichtlich eines gegeben und dieses verinnerlicht wurde.
quelle
Sie könnten ihnen Fragen zu Codeteilen stellen, für die schriftliche Antworten erforderlich sind? Wie "Was macht dieser Code?" "Warum hat der Programmierer das so gelöst?" "Gibt es einen besseren Weg?", Etc?
Das bringt sie dazu, über das Problem nachzudenken, was sie auch tun können, ohne den Code zu berühren.
quelle
quelle
Ähnlich wie bei JoelFans besteht die Idee darin, dass sie die ersten Aufgaben mit einem von Ihnen erstellten Pseudocode (Sprache) auf Papier erledigen. Sie können die Strukturen hinzufügen, wie Sie es für richtig halten, und sie kümmern sich nicht um die magische Kiste.
quelle
Ich gehe davon aus, dass mit "Frachtkult" gemeint ist, dass sie Dinge einfügen, die für notwendig halten, aber tatsächlich absolut nichts zur Lösung des Problems beitragen.
Wenn dies der Fall ist, können Sie die Einstufung immer um einen Faktor erweitern, der auf der Genauigkeit basiert. Wenn Sie in Ihrem Programm unnötigen oder redundanten Code belassen, müssen Sie in Zukunft Probleme haben, da dieser möglicherweise nicht mehr funktioniert oder die Wartung erschwert wird.
Sie würden in einer Schreibübung in einem Englischkurs ähnlich beurteilt werden - niemand möchte Dinge, die in einer zufälligen Tangente ablaufen oder die sich nur allgemein bewegen, ohne auf den Punkt zu kommen.
Wenn ich eine Montageklasse besuchte, sagte der Lehrer uns für jede Übung, ob wir den Code für Geschwindigkeit, Größe oder Speichernutzung schreiben sollen, und er gab an, wenn Sie nicht in der Nähe der Optimierung dessen waren, was er fragte zum.
...
Wenn sie Code aus früheren ähnlichen Aufgaben kopieren und einfügen und tatsächlich das neue Problem lösen wollen, dann ist das nur die Wiederverwendung von Code, und es sei denn, sie haben schlechte Annahmen über die Eignung des Codes für die Wiederverwendung getroffen Ich denke, es ist völlig vernünftig für sie zu tun. (z. B. aus einer Datei lesen, zur Eingabe auffordern ... alle modularen Teile, die wiederverwendet werden können. Wenn Sie dies nicht möchten, müssen Sie die Übungen anders gestalten.
quelle
Unglücklicherweise funktionieren so die Gehirne vieler Menschen. Gehen Sie also auf dieses Verständnis ein, dass es Menschen gibt, die Sie nicht „heilen“ können. Es gibt viele Menschen, die nicht in der Lage sind, die für die Programmierung erforderliche mentale Präzision zu erreichen. Manche Leute sind einfach nicht dafür ausgelegt. Ich sage nicht aufgeben auf die Schüler - ich sage nicht, dass Sie scheitern, wenn nicht jeder es aufnimmt.
Ohne mehr über den Kontext der Klasse zu wissen, würde ich sagen, dass sich diese Problemschüler mehr auf die grundlegenden Strukturen konzentrieren - einfache if / thens, Schleifen usw. Einfache Routinen, um ungerade Zahlen, jede zehnte Zahl usw. auszudrucken. Nichts jeweils mehr als 10 Codezeilen. Wenn sie "magisch denken", haben sie diese Grundlagen offensichtlich noch nicht gemeistert. Lassen Sie sie viele verschiedene einfache Routinen ausführen, bis sie verstehen, was los ist. Jemand anders hat erwähnt, dass der Code auf Papier geschrieben werden soll - ich denke, das wäre auch eine großartige Möglichkeit, diese einfachen Routinen durchzuführen.
Sie könnten auch in Betracht ziehen, dass sie Flussdiagramme lernen. Für manche Menschen kann es hilfreich sein, den Ablauf eines Algorithmus zu sehen und dann zu sehen, wie sich dieser mit dem Code verbindet, um den Code mit dem Ablauf zu verbinden.
quelle
Beginnen Sie sie im Idealfall in der ersten Vorlesung mit etwas völlig Abstraktem: Lassen Sie sie (als Gruppe, mit Ihnen als Leiter) die Anweisungen zum Einkaufen von einer Liste aus aufschreiben und die Anweisungen auf hoher Ebene schrittweise aufschlüsseln bis sie Erleuchtung erreichen.
Es hilft ihnen zu sagen, dass diese Anweisungen buchstäblich von einem Roboter befolgt werden, der nicht weiß, wie er auf etwas schließen soll. Es muss jedoch eine sehr praktische Aktivität sein, bei der Sie die Führung übernehmen.
quelle
Alistair Cockburn spricht über das Konzept von Shu-Ha-Ri und wie es auf die Programmierung zutrifft, http://alistair.cockburn.us/Shu+Ha+Ri . Ich denke, es kann wichtig sein zu bedenken, wo sich Ihre Schüler in diesem Kontinuum befinden. Zunächst wird dies helfen, Ihre Frustration zu lindern. Kopieren / Imitieren ist eine sehr natürliche Reaktion und ein akzeptierter Modus, wenn Sie anfangen, etwas zu lernen. Zweitens kann es Ihnen dabei helfen, einige Ideen zu erhalten, wie Sie vorankommen können. Sie können beispielsweise überlegen, ein Problem auszuwählen, das auf verschiedene Arten gelöst werden kann (Schleifen vs. Rekursion, Konsole vs. Web / GUI). Lassen Sie es dann explizit zuerst auf die eine und dann auf die andere Weise lösen - Bonus, den sie lernen können Informationen zur legitimen Wiederverwendung von Code, zur Komponentisierung, zum Erstellen wiederverwendbarer Bibliotheken usw.
Ein weiterer erfolgreicher Weg, den ich bisher gesehen habe, besteht darin, eine Reihe von Projekten zu erstellen, die aufeinander aufbauen und bei jedem Schritt nach der Einreichung von Aufträgen eine funktionierende Standardversion zur Verfügung stellen, um zu verhindern, dass Personen zurückfallen. Jeder Schritt des Prozesses sollte etwas Neues einführen. Ich gebe Ihnen zu, dass dies in einer Designklasse möglicherweise einfacher ist als in einer Programmierklasse, aber es sollte trotzdem machbar sein. Eine nette Sache dabei ist, dass Sie ihnen explizit eine gute (hoffentlich) Implementierung geben, um sie bei jedem Schritt mit ihrer zu vergleichen. Stellen Sie diesen Vergleich als Aufgabe dar, dh überprüfen Sie den eigenen Code im Minicode gegen den Aufwand. Möglicherweise möchten Sie dies zu einer von mehreren zusätzlichen Kreditoptionen machen.
Während ich in der Regel keine großen "Kommentare" mache, möchten Sie vielleicht die Dokumentation des Codes zu einem der Bewertungselemente machen. Lassen Sie sie für jedes Projekt ein "Theory of Operation" -Dokument erstellen, das ihren Ansatz beschreibt, wie die einzelnen Komponenten zusammenpassen und wie sie das Problem gemeinsam lösen. Normalerweise möchte ich, dass der Code vieles von sich aus erledigt, aber es veranlasst sie, ihre Denkkapazitäten aufzusetzen und sie zu Papier zu bringen.
Schließlich möchten Sie vielleicht kreativ werden und Ihre Schüler den Code des jeweils anderen überprüfen und bewerten lassen. Üben Sie Gruppenzwang aus, um für Sie zu arbeiten. Ermöglichen Sie dies, um Teil der Note oder der zusätzlichen Gutschrift für den Code (und die Dokumente) mit der höchsten Bewertung zu werden.
quelle
Nur ein kurzer Vorschlag. Wenn ich ein Programmierproblem habe, das gelöst oder behoben werden muss, schaue ich mir gerne meinen Code an und spiele "Computer". In meinem Kopf verfolge ich die Variablen und ihre Werte und was ich von ihnen erwarte, wenn jede Zeile ausgeführt wird . Wenn ich also einen Code von irgendwoher kopiert habe, bevor er vollständig ist und ich ihn nur referenzieren muss, gehe ich gerne Zeile für Zeile durch, um genau zu verstehen, was gerade vor sich geht. Hauptsächlich Computer spielen. Der VBA-Debugger erleichtert diese Aufgabe im Wesentlichen, aber wenn Sie Ihre Schüler dazu bringen, sie auf Papier zu machen, erhalten sie möglicherweise Grundlagen wie. Was macht diese Leitung eigentlich?
quelle
Ich unterrichtete Einführungsprogrammierung auf College-Ebene. Es war ein Brot-und-Butter-Kurs, die ganze Fakultät hat es gemacht, und ich denke, wir haben es ganz gut gemacht. Wir folgten einem gemeinsamen Text und hatten gemeinsame Prüfungen, aber wir hatten jeweils unsere eigene Unterrichtsmethode, die funktionierte. Es ist schon lange her, aber gelegentlich kann ich einem Kind das Programmieren beibringen, und das ganze Bild ist ungefähr gleich.
Ich beginne ganz unten, so konkret wie möglich. Was die Schüler wissen, ist eine Struktur. Sie haben bereits viele Konzepte. Darauf aufbauend baue ich weitere Konzepte auf und beschneide Konzepte, die möglicherweise kontraproduktiv sind. Gleichzeitig bringe ich sie zum Lernen .
Ich hatte einen kleinen Computer mit einem Intel 8008-Chip, einem EPROM und einigen Schaltkreisen gebaut. Ich hatte es so programmiert, dass es ein kleines Duett spielt, wenn der I / O-Chip mit ein paar Lautsprechern verbunden war. Ich würde erklären, wie das kleine Programm funktioniert, mit einer inneren Schleife, um einen Zähler herunterzuzählen. Das wäre eine Verzögerung. Dann würde es das Ausgangsbit umschalten und es erneut tun. Es würde das für eine Weile tun und dann zu einer anderen Verzögerung wechseln, eine andere Tonhöhe geben und so weiter. Der Speicherchip hatte einen kleinen Timer, und wenn ich eine Kondensatorleitung unter einen der Timereingänge steckte, lief das Programm sehr langsam . Die Klasse hörte die Lautsprecher klicken, klicken, klicken ... Ich wollte, dass die Klasse verstand, dass der Computer Schritt für Schritt sehr einfache Dinge tat. Dann würde ich die Kondensatorleitung abnehmen und die "Musik" würde losgehen. (Beifall)
Dann hatte ich einen Simulator für einen sehr einfachen Dezimalcomputer mit 1000 Speicherplätzen gebaut, von denen jeder eine 4-stellige Dezimalzahl mit Vorzeichen enthielt. Es gab sehr einfache Opcodes wie "Add to Accumulator", "Jump If Negative" und so weiter. Ich würde sie kleine Programme in dieser "Maschinensprache" schreiben lassen, wie das Hinzufügen von zwei Zahlen oder das Aufaddieren einer Liste von Zahlen. Dann könnten sie zusehen, wie es in einem Schritt funktioniert, oder die Eingabetaste gedrückt halten, um zu sehen, wie es "schnell" läuft.
Ziel war es, das Konzept zu etablieren, dass Computer nur eine sehr kleine Anzahl von verschiedenen Grundoperationen ausführen können, und zwar einzeln. Dies soll dem Eindruck entgegenwirken, dass Computer kompliziert sind und alles zur gleichen Zeit erledigt werden.
Von da an programmierten wir in einer "echten" Sprache (BASIC :), angefangen mit sehr einfachen, aber interessanten Programmen, über Bedingungen, Schleifen, Arrays, Dateien, Zusammenführen und so weiter. Das Ziel war es, eine ausreichende Anzahl von Fähigkeiten bereitzustellen, damit sie ein Projekt ihrer Wahl übernehmen können, da dies das einzige ist, was das Programmieren interessant macht - die Verwendung, für die Sie es einsetzen können. Ich würde einige Ideen für Projekte rausschmeißen, und dann würden sie es von dort nehmen. Ich würde um schriftliche Ideen und dann um Fortschrittsberichte bitten, damit sie nicht auf die letzte Minute verschoben werden und dann in Panik geraten. Ich denke, die Projekte waren der beste Teil, weil sie aus eigener Kraft lernten.
Diese anfängliche Grundlage für ein sehr konkretes Verständnis dessen, was Computer tun, erleichterte das spätere Unterrichten von Konzepten erheblich, da es sich ansonsten um echte Geschwindigkeitsschwankungen wie Arrays oder (in einem späteren Kurs) Zeiger handelte. Wir neigen dazu, das Konzept der "Abstraktion" als dieses wunderbare Ding zu verherrlichen, aber es muss auf einem konkreten Fundament gebaut werden, nicht auf Luft.
quelle
Ein selbst gelehrter Programmierer Ich glaube, Animation ist die größte Herausforderung, wenn es darum geht, zu wissen, was der Code tut. Wenn ein Programm Algorithmen und mathematische Transformationen enthält, die abstrakte Manipulationen ausführen, müssen Sie die Ausführung von Code selbst verstehen, um zu verstehen, was die Mathematik zu einem bestimmten Zeitpunkt tut (es sei denn, Sie sind ein Genie).
Korrigiere mich, wenn meine naive Idee falsch ist. Was Sie tun möchten, ist zu
not
verhindern, dass Ihre Schüler "Entwurfsmuster" verwenden, aber einen Weg finden, um sicherzustellen, dass sie verstehen, was sie CnPs sind? Fordern Sie dann Ihre Schüler auf, eine Animation zu bearbeiten. Um die Ausgabe in einer Animation zu optimieren, muss man verstehen, was bei jedem Schritt passiert. Für Ihr erklärtes Anliegen stelle ich mir vor, dass sich ein gut durchdachtes Animationsprojekt auf offensichtliche Weise manifestieren wird, wenn ein Schüler es "versteht" - wenn er eine Transformation realisiert hat, die Sie nicht erwartet oder bestimmte verwandte, voneinander abhängige Variablen optimiert haben.Ohne die pädagogischen Grenzen und Ziele zu kennen, unter denen Sie arbeiten, kann ich nicht sagen, dass Animation die vollständige Antwort ist. Ein ganzer Lehrplan von Animationen außerhalb des Animationsberufs ist, wie ich vermuten sollte, ausgeschlossen. Ein paar Projekte können dennoch zu etwas Kunstvollem und Wundervollem führen, was nicht schlecht ist.
Auf einer anderen Notiz las ich einen Zeitungsartikel (ja, Zeitung!) Über einen High School Coding Olympics - Wot-Wot - Wettbewerb für Pre-College-Programmierer. Die Beschreibung ihrer Herausforderungen war die klarste Formulierung der reinen Codierung, an die ich mich erinnern kann, gelesen zu haben. Die Wettbewerber werden gegeneinander und nach den Standards der guten Praxis beurteilt. Für diese Wettbewerbe müssen die Schüler sowohl ihre Lösung planen als auch das elementare "Entwurfsmuster", das das Problem benötigt, um innerhalb der vorgegebenen Zeit fertig zu werden, von Hand codieren. Die Lösung für Ihre Bedenken hinsichtlich der CnP-Programmierung besteht daher darin, zu testen, ob die Schüler die gleichen "Codestücke" schreiben können, die sie für CnP'n halten!
Ich bin sicher, es war in der NY Times. Eine schnelle Suche hat es nicht gefunden. Ein ähnliches Beispiel ist der International Collegiate Programming Contest von ACM. Dieser Wettbewerb unterstreicht das schnelle Programmieren: "Blitzschnelles Programmieren im Teamwettbewerb ist eine ausgesprochen skurrile Fähigkeit, die nicht genau einer, den viele Arbeitssuchende an die Spitze eines Lebenslaufs stellen würden." Daher würde ich die Abstraktion von realen Problemen als Antwort empfehlen .
Ebenfalls,
HP Code Wars
quelle
Unterrichten Sie die Klasse mit einer Programmiersprache, die technisch gut ist, aber so dunkel, dass sie keinen vorhandenen Code zum Kopieren finden können.
quelle
Sie könnten sie auch auf die harte Tour behandeln.
Finden Sie einen Weg, eine Kopie-Paste schädlich für sie zu machen. Ich habe kein genaues Beispiel, aber wenn Sie eine erste Übung erstellen, deren Lösung, wenn sie in einer ähnlich aussehenden zweiten Übung eingefügt wird, die Studenten des Frachtkultes in einen sehr langen und schmerzhaften Fehler "Instabile Instabilität" oder "Stille Datenkorruption" bringt. In der Zwischenzeit hätte ein "Non-Cargo-Kult" -Denken in zwei Minuten auch dem schlechtesten Schüler eine offensichtliche Lösung gebracht (hätte er nicht die erste Übungslösung gesehen). Dann besteht vielleicht die Möglichkeit, dass sie die Lektion lernen und zweimal darüber nachdenken, bevor sie den Code in die dritte Übung kopieren.
quelle
Ich bezweifle, dass dieses Verhalten auf der Überzeugung beruht, dass Programme Zaubersprüche sind - eher auf Faulheit und mangelnder Motivation.
Ich denke, Ihre Aufgabe als Lehrer ist es, Ihre Schüler zu motivieren. Kein Schüler, der wirklich motiviert ist, schneidet eine Lösung aus und fügt sie ein.
quelle
Unterprogramme einlernen. Lassen Sie sie den Code, den sie aus früheren Aufgaben abrufen, in eine Unterroutine umwandeln. Bringen Sie ihnen die Funktionsdokumentation bei, um zu verstehen, was die Unterroutine tatsächlich tut.
quelle
Lassen Sie sie die Aufgabe vor Ihnen im Klassenzimmer erledigen, ohne dass ein Internetzugang zur Verfügung steht (lassen Sie die Schule abschalten, erlauben Sie keinen Telefongebrauch während des Unterrichts). Zumindest für Tests. Es gibt keinen Grund, das Internet für grundlegende Programmierkenntnisse zu nutzen. Das Buch sollte eine ausreichende Ressource für Einführungsübungen sein. Lassen Sie die Internetnutzung zu, sobald Sie in einer fortgeschrittenen Klasse sind und sie bereits gelernt haben, wie man denkt.
quelle
Geben Sie ihnen niemals ähnlich klingende Aufgaben.
Oder, noch verrückter, lernen Sie TDD von Anfang an. Es drängt darauf, viel Code zu schreiben (nicht zu kopieren, zu schreiben) (nämlich Tests), der tatsächlich hilft, das zu lösende Problem zu formulieren.
quelle
Etwas, das ich für die Leute in meiner Klasse als sehr hilfreich empfunden habe, ist, ein kleines Projekt über sie zu schreiben, über ein Thema, das sie selbst auswählen können.
Als ich mit dem Programmieren anfing, war es auch für mich schwierig, und ich habe im Unterricht viel kopiert. Dann fing ich zu Hause an, kleine Spiele zu machen, da ich ein Spieleprogrammierer werden wollte, und fand, dass sie viel einfacher zu machen waren. Obwohl sie viel härter waren als die Sachen, die wir im Unterricht gesehen haben. Nur weil es mich interessiert hat.
Einige andere Leute in meiner Klasse gingen von 40-50% ihrer Prüfungen auf 90-100%, weil sie genau dasselbe taten.
quelle
Als ich in einem Einführungskurs war, forderte der Kursleiter alle auf, einen Algorithmus in Englisch zu schreiben und ihn auszudrucken und einzuschalten, bevor wir mit dem Schreiben von Code begannen. Dann mussten wir viele Kommentare einfügen, wie z. B. Variablen erstellen, Eingaben vom Benutzer abrufen, Berechnungen ausführen, Ausgaben drucken usw. Ich wurde ein paarmal angedockt, weil ich nicht genug Kommentare hatte, als ich dachte, dass es viele gab, und fing an, sie hinzuzufügen Mehr. Dies zwang mich, darüber nachzudenken, was ich tat, die Lösungen zu schreiben und zwischen Englisch und Java hin und her zu übersetzen.
quelle