it-swarm.dev

Wie kann ich mit der Programmierhaltung des Frachtkultes umgehen?

Ich habe einige Informatikstudenten in einem obligatorischen Einführungskurs in die Programmierung, die eine Programmiersprache als eine Reihe von Zaubersprüchen betrachten, die gewirkt werden müssen, um eine gewisse Wirkung zu erzielen (anstatt sie als flexibles Medium zu sehen, um ihre Lösungsidee auszudrücken). .

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 einige Übungen oder Analogien, um diese Schüler sicherer zu machen, dass sie die Struktur und Bedeutung jedes von ihnen geschriebenen Codes verstehen können und sollten?

257
Aivar

Sie können 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, die eine Schwäche der vorherigen Lösung aufdeckt und einen neuen, anderen Ansatz erfordert . Dies zwingt sie, über jede Lösung nachzudenken, sie zu analysieren, zu modifizieren und zu experimentieren, anstatt nur einen vorgefertigten Code zu kopieren und einzufügen.

Eine andere Möglichkeit - obwohl nicht ausschließlich eine Programmieraufgabe - besteht darin, sie zu bitten, verschiedene Dinge zu schätzen . Z.B. Wie viel Wasser fließt pro Sekunde durch das Mississippi-Delta? Solche Fragen haben keine feste Antwort, insbesondere weil man bestimmte Annahmen treffen muss, um zu einem überzeugenden (Bereich von) Wert (en) zu gelangen. Und - obwohl Antworten auf viele dieser "klassischen" Antworten tatsächlich gegoogelt werden können - können Sie leicht neue erfinden, die (noch) nirgendwo im Internet zu finden sind.

Beispiele für diese beiden Arten von Übungen finden sich z.B. Programmierperlen von Jon Bentley. Auch Der Pragmatische Programmierer hat einige gute Herausforderungen.

Eine dritte Art von Aufgabe wäre es, ihnen einen Code mit (einem oder mehreren) Fehlern zu präsentieren, den sie finden und beheben müssen. Dies zwingt sie erneut, ihre analytischen Fähigkeiten und Gründe für die tatsächliche Funktionsweise des Programms einzusetzen.

Aktualisieren

Feedback von einem Kommentar von Billy ONeal:

Das Problem bei der "Übungsreihe" ist, dass Schüler, die ein Problem mit einer früheren Übung haben, für die verbleibenden Übungen komplett verschraubt sind.

Sie haben Recht, obwohl ich der Meinung bin, dass es eher um das allgemeine Problem geht, die Kursschwierigkeiten auf das richtige Niveau einzustellen/Schüler mit ähnlichen Fähigkeiten 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 dies sicherlich vom Lehrer bemerkt (der herumlaufen, die Schüler beaufsichtigen und betreuen soll, ohne WoW auf seinem Laptop in der Ecke zu spielen ;-)

Außerdem kann man die Übungen anpassen, um Schüler mit unterschiedlichen Fähigkeiten aufzunehmen. Anfänger können langsamer fahren, erfahrene schneller.

120
Péter Török

Sie kämpfen gegen den Spagat der Schüler, dass sie sich um Ihr Fach kümmern müssen und dass sie die Noten bestehen müssen . Viele Studenten glauben, dass:

(Verstehen Sie es falsch || Experiment) == (Fehlerhafte Qualität && Abfallzeit)

Sobald ein Schüler das Gefühl hat, dass seine Zeit oder Note selbst für ein interessantes Fach gefährdet ist, hört auf zu lernen und springt direkt zu "Es ist mir egal, gib dem Lehrer einfach die richtige Antwort". . Ihre Schüler versuchen, Ecken zu schneiden (oder so denken sie) , indem sie so wenig wie möglich über das Problem nachdenken und es einfach durch Kopieren und Einfügen abhacken .

Hier sind meine Vorschläge, wie ich damit umgehen soll:

  1. Verwenden Sie die Bob Ross-Methode: Beweisen Sie ihnen, dass es sowohl möglich als auch schneller ist, neu zu beginnen, anstatt zu kopieren und einzufügen. Erstellen Sie während des Unterrichts neue Programme vor ihren Augen - zeigen Sie ihnen wirklich, dass Programmieren wie das Malen eines Bildes sein kann.
  2. Stellen Sie Aufgaben bereit, die Kreativität erfordern. Lassen Sie beispielsweise jeden Schüler seine eigenen Datenstrukturen (welche Objekte sind erforderlich, um einen Zoo, eine Zoohandlung, eine Stadt, ein College usw. zu erstellen) auf Papier erstellen, die während des gesamten Kurses verwendet werden sollen. Aufgabe Nr. 2 kann darin bestehen, diese Strukturen in Klassen oder Objekte usw. umzuwandeln. Verleiten Sie sie grundsätzlich dazu, abstrakt zu denken - belohnen Sie sie für ihre Kreativität und belohnen Sie sie dann dafür, dass sie ihre Kreativität in ein Computerprogramm verwandeln.
  3. Verwenden Sie so wenig Syntax wie möglich. Boilerplate-Dinge wie das Erstellen von Klassen und die Sprachsyntax sind bei der Einführung der Programmierung so weit verbreitet, dass die Schüler häufig in die Irre geführt werden, zu denken, dass die gesamte Programmierung nur weiß, wo geschweifte Klammern gesetzt werden müssen - sie merken nicht, dass was in der Mitte der geschweiften Klammern ist, wo Kreativität fließt. Wählen Sie eine einfache Sprache und stellen Sie Beispieldateien (z. B. eine leere Klassendatei) für die Schüler bereit, die noch etwas kopieren und einfügen möchten. Im Verlauf des Kurses können Sie die Syntax und die kompilierbaren Aufgaben schrittweise verschärfen.
142
Kevin McCormick

Einige Dinge, die mir in den Sinn kommen:

  • Geben Sie ihnen Aufgaben, bei denen sie tatsächlich den Code erklären müssen, den jemand anderes (Sie) geschrieben hat. Das Verständnis des vorherigen Codes oder insbesondere dessen Fehlen ist sowohl die größte Ursache als auch die größte Gefahr für die Programmierung von Frachtkult. 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, die Sortierung aufsteigend durchzuführen. Oder etwas anspruchsvolleres. Aber stellen Sie sicher, dass es etwas ist, das Verständnis des angegebenen Codes erfordert.

  • Wenn Sie möchten, können Sie einige Ostereier in den Code einfügen. Ein oder zwei Zeilen, die nichts Nützliches tun oder überhaupt mit dem Problem zusammenhängen. Geben Sie ihnen einen Hinweis darauf, dass solche Linien existieren, und gewähren Sie denen, die sie entfernen, zusätzliche Punkte.

  • Dann und nur dann können Sie ihnen den Auftrag geben, selbst einen Code von Grund auf neu zu schreiben. An diesem Punkt sollten sie viel besser verstehen, was Code wirklich ist. Sie finden es vielleicht sogar etwas einfacher, es selbst zu tun.

Die Grundidee ist, dass beim Programmieren nicht nur Code geschrieben, sondern auch gelesen wird. Das Lesen von Code sollte ebenfalls gelehrt werden.

44
Goran Jovic

Betrachten Sie es anders. Dieses Frachtkult-Phänomen ist das Anfängerstadium des Dreyfus-Modells des Erwerbs von Fähigkeiten . So lernen wir. Als ich das Programmieren zum ersten Mal lernte, tippte 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. Wir müssen nur lernen, wie man von Nachahmung zu Meisterschaft kommt.

Das Problem, das Sie haben, ist, dass Ihre Schüler nichts wiederholen, sondern es aus dem Internet kopieren. Das hat einige Vorteile, aber die Gewinne sind minimal. Das tatsächliche Schreiben des Codes brachte mich an einen Ort des Verstehens. Ich fing an, Muster in dem zu sehen, was ich tippte, und bekam ein Verständnis dafür, was ich tat.

Eine Möglichkeit besteht darin, Ihr Labor als Code-Dojo zu strukturieren. Lassen Sie die Schüler abwechselnd das gleiche Problem miteinander lösen. Wählen Sie ein Problem aus, dessen Lösung etwa 10 bis 15 Minuten dauert. Wiederholen Sie dieses Problem in einigen Labors und führen Sie eine neue Wendung in das Problem ein, wenn die Kenntnisse der Klasse zunehmen. Beginnen Sie das Labor vielleicht, indem Sie die Schüler beobachten lassen, wie Sie die Lösung programmieren, und sie sie wiederholen lassen. Paarwechsel bei jeder Iteration.

Für Ihre Tests haben Sie eine Code-Kata, in der jeder Schüler die Probleme des Semesters 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 Aufgaben zum Mitnehmen zu geben.

38
Michael Brown

Ich habe in der Vergangenheit Einführungskurse unterrichtet und, wie ich mich erinnere, im Rückblick:

Einige Studenten denken, dass Programmieren aus verschiedenen Gründen so ist. Ich erinnere mich an ein gutes Kind, das viel Fracht kultiviert hat, was ich getan habe:

Da ich glaubte, dass es sich nicht um ein Einzelfall handelte, aber andere Schüler derselben Klasse sich möglicherweise ähnlich verhalten oder sich dem Problem nähern und es nicht ausdrücken, sprach ich immer die Klasse an.

  1. Es wurde einige Zeit aufgewendet, um einige Dinge wie den 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" zerstreuen).

  2. Da das Lösen von Problemen von den Handlungen des Schülers abhängt und nicht von irgendetwas anderem, sollte die Aufmerksamkeit darauf gerichtet sein, das Problem zu lösen und nicht den richtigen Zauber zu finden.

  3. Sie befinden sich in einer Bildungsumgebung, daher werden die Probleme so gestaltet, dass sie eine Lernerfahrung bieten. Das Ergebnis besteht darin, zu lernen, wie man programmiert (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: Hinweise),

  4. Ich denke, es ist in Code Complete: "Auch wenn Sie kopieren und einfügen, gehört der Code Ihnen". Wenn jemand es getan hat, sollte es nicht im Frachtstil sein. Jede Zeile musste mir (einzeln) oder einem anderen Schüler (gleich) oder der Klasse erklärt werden.

25

Haben Ihre Schüler Start auf der korrekte 'Abstraktionsebene' zu Beginn des Kurses? Z.B. eine Hausaufgabe, die sie in die wichtigsten Programmierstrukturen wie Schleifen und Bedingungen einführt, ohne eine einzige Codezeile zu schreiben?

Als ich mit der Programmierung anfing, hieß unsere erste Aufgabe ' Rick the Robot '. Wir hatten ein Stück Papier mit einer Luftbildkarte einer Stadt mit interessanten Punkten wie Banken, Lebensmittelgeschäften usw. Wir hatten einen Typen namens "Rick" und hatten Aktionen wie "einen Schritt machen", "nach links schauen", "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 Aufgabe 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, die Sie in die Grundlagen einführte (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 ist die Idee, dass Sie mit dem abstrakt beginnen und sich in Richtung des konkret bewegen. Sie können keine Zusammenfassung kopieren und einfügen. Sie müssen es verstehen, um ein Problem zu lösen.

23
c_maker

Sie fordern sie auf, Analyse und Synthese im kognitiven Bereich von Bloom's Taxonomy zu demonstrieren, wo sie derzeit nur die Anwendung demonstrieren.

Leider ist es eine Art Situation, in der man das Pferd ins Wasser führt. Analyse und Synthese sind auch sehr schwierig, wenn Sie immer noch Probleme mit dem Verständnis haben. Ohne das vorhandene Verständnis werden Analyse- und Syntheseaktivitäten eher als Unkraut als als Lernaktivitäten fungieren.

Meine persönliche Meinung ist, dass es in Ordnung ist, nicht mehr als eine Anwendung im Intro für Programmierkurse zu erwarten. Dies ist das erste Mal, dass Schüler mit diesen Konzepten in Berührung kommen. Es ist also so, als würde man Kindern das Lesen beibringen, bevor sie gebeten werden, einen Aufsatz zu schreiben. Diese Fähigkeiten höherer Ordnung werden in ihren späteren Klassen folgen.

20
Karl Bielefeldt

Haben Sie darüber nachgedacht , ihnen zunächst einen Code zu liefern? Welches einfache Gerüst auch immer die Aufgabe benötigt, wie eine leere Hauptfunktion (ich weiß nicht, welche Sprache Sie verwenden). Etwas, das kompiliert und ausgeführt wird und nichts tut. Dann können sie ihren Code mit einem gewissen Maß an Sicherheit hinzufügen, dass mindestens ein Teil davon funktioniert.

Dies ist in der "realen Welt" eigentlich ziemlich häufig; Viele IDEs und andere Tools erstellen leere Projekte mit typischen Bibliotheken/Vorlagen/Konfigurationsdateien, die bereits vorhanden sind.

11
TMN

Jede Art von Frachtkultmentalität (einschließlich Frachtkulte selbst) beruht auf einem Mangel an grundlegendem Verständnis der beteiligten Technologie.

Frachtkultprogrammierung sollte nicht als problematische Gewohnheit angesehen werden, sondern als Symptom für die zugrunde liegende Verwirrung, mit der der Programmierer konfrontiert ist.

Noch wichtiger ist, die Annahme, dass das mangelnde Verständnis des Schülers einfach das Ergebnis seines mangelnden Vertrauens ist, ist grundsätzlich falsch und geht nicht auf das zugrunde liegende Problem ein.

Stattdessen sollte der Programmierstil zum Kopieren und Einfügen des Schülers eine rote Fahne sein, die Ihnen sagt, dass dieser Schüler von der Komplexität dessen, was er erwartet, überwältigt ist.

Er nutzt instinktiv frühere Arbeiten als Gerüst, um sein aktuelles Projekt aufzubauen, und versucht, eine Lösung zu finden, bei der zuvor gelöste Probleme als Bausteine ​​verwendet werden. Wir alle tun dies bis zu einem gewissen Grad, aber die meisten von uns tun dies, indem sie das Wissen aus früheren Arbeiten als Bausteine ​​verwenden. Dieser Schüler verwendet stattdessen die Arbeit selbst, was bedeutet, dass er die Blöcke, mit denen er arbeitet, nicht wirklich versteht. Er hat die Arbeit so weit zerlegt, wie 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.

8
tylerl

Erwägen Sie die Verwendung einer sehr hohen Sprache, für die mindestens ein Code für das Boilerplate 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.

Ich wurde persönlich unterrichtet ML in meinem CS-Einführungskurs. Viele Jahre lang wurde LISP als Einführung in die Programmierung am MIT unterrichtet. Beide sind eine ausgezeichnete Wahl. Einige der Vorteile, die sie haben, sind

  • Interaktiver Dolmetscher. Sehr wichtig, da dies die Erkundung ermöglicht.
  • Sehr prägnant. Überhaupt kein Boilerplate. Dadurch können sich die Schüler auf die Ideen konzentrieren, die sie zum Ausdruck bringen möchten.
  • Relativ dunkel und fremd (zumindest im Vergleich zu Java, C oder anderen gängigen Sprachen, mit denen die Schüler möglicherweise bereits Erfahrung haben). Ja, das liste ich als Profi auf. Es gleicht die Wettbewerbsbedingungen für die Schüler aus, da wahrscheinlich niemand zuvor Erfahrung haben wird. Und es macht es weniger wahrscheinlich, dass sie nur Lösungen kopieren und einfügen können, um Hausaufgaben aus dem Web zu machen.
7
KaptajnKold

Ä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 Vorstellung von einem Projekt 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 eines Aufzugssystems

  • Aufgabe 1: Drucken Sie die aktuelle Etage aus
  • Aufgabe 2: Erstellen Sie die Datenstrukturen für eine Aufzugsklasse und drucken Sie die Etage basierend auf dem Aufzug aus
  • Aufgabe 3: Erstellen Sie einen Code, der "den Aufzug bewegt" und den Boden druckt. Tastatureingabe akzeptieren (> Etage eingeben :)
  • Aufgabe 4: Mehrere Aufzüge handhaben

Der Punkt ist, dass Sie bauen auf der vorherigen Aufgabe, anstatt alte Aufgaben für eine neue Aufgabe zu recyceln.

7
Richard

Ich habe mich in den 80ern mit den Problemen von Programmieranfängern befasst. Aufgrund meiner heutigen Erfahrung mit unerfahrenen Programmierern hat sich nicht viel geändert. Anfänger haben kein nützliches mentales Modell dafür, was Computer tatsächlich tun. Sie greifen auf magische Beschwörungen zurück, weil die Maschine selbst magisch ist.

Für die Programmierung müssen natürlich einfache Aufgaben in unnatürlich kleine Schritte unterteilt werden. Da Anfänger im täglichen Leben nicht mit einer derart feinen Granularität umgehen, fällt es ihnen schwer, die kleinen Schritte herauszufinden, insbesondere wenn nicht klar ist, welche kleinen Schritte die Maschine zur Verfügung stellt. Aber selbst wenn sie es schaffen, das herauszufinden, werden sie mit der gestelzenen Syntax und der begrenzten Semantik einer Programmiersprache (einer unnatürlichen Sprache, die sich als quasi-natürliche tarnt) konfrontiert, die die Mystery-Maschine per Fernbedienung steuert.

Da sie die Verbindung zwischen einer logischen Lösung des Problems und der Funktionalität der Maschine nicht herstellen können, konzentrieren sie sich darauf, die Anforderungen der Sprache zu erfüllen. Das erste Ziel ist es, etwas zu schreiben - alles - was kompiliert wird. Das zweite ist, das Programm zu optimieren - was auch immer es tatsächlich tut - um zu verhindern, dass es abstürzt. Wenn sie dann die Zeit, die Energie und das Interesse haben, versuchen sie, das Programm dazu zu bringen, Ergebnisse zu erzielen, die den Anforderungen des Problems ähneln. Unterwegs können sie versehentlich gut geschriebenen Code produzieren.

Aller Wahrscheinlichkeit nach sind Anfänger, die das Programmieren lernen, erfolgreich, weil sie auf ein nützliches mentales Modell des Computers geschlossen haben, nicht weil sie absichtlich eines erhalten und verinnerlicht haben.

6
Steve Jones

Sie könnten ihnen Fragen zu Codeteilen stellen, für die schriftliche Antworten erforderlich sind? Wie "Was macht dieser Code?" "Warum hat der Programmierer es so gelöst?" "Gibt es einen besseren Weg?" Usw.?

Das wird sie tatsächlich dazu bringen, über das Problem nachzudenken, was sie tun können, ohne den Code zu berühren.

5
  • Fordern Sie sie auf, möglichst kurze Lösungen für das Problem zu finden.
  • Belohnen Sie die prägnanteren Lösungen mit einem Anreiz.
  • Erstellen Sie Übungen, die sich ausschließlich mit dem Refactoring von Code befassen
  • Lassen Sie die Schüler Aufgaben tauschen und sie für Effizienz und Code-Sauberkeit nachahmen und einige der am wenigsten effizienten als Beispiele für einen Overhead-Projektor verwenden.
5
Lynn Crumbling

Ähnlich wie bei JoelFans ist es die Idee, die ersten Aufgaben auf Papier mit einem von Ihnen erstellten Pseudocode (Sprache) zu erledigen. Sie können die Strukturen nach Belieben hinzufügen und sie sorgen sich nicht um die magische Box.

4
ElGringoGrande

Ich gehe davon aus, dass mit "Frachtkult" gemeint ist, dass sie Dinge einfügen, die für notwendig gehalten werden, aber tatsächlich absolut nichts zur Lösung des Problems beitragen.

Wenn dies der Fall ist, können Sie der Einstufung immer einen Faktor hinzufügen, der auf Prägnanz basiert. Wenn Sie unnötigen oder redundanten Code in Ihrem Programm belassen, werden Sie in Zukunft nach Problemen gefragt, da diese möglicherweise kaputt gehen oder die Wartung nur erschweren.

Sie würden in einer Schreibübung in einem Englischkurs ähnlich beurteilt - niemand möchte Dinge, die in einer zufälligen Tangente ablaufen oder nur allgemein herumwandern, ohne auf den Punkt zu kommen.

Wenn ich an einer Versammlungsklasse teilnahm, teilte uns der Lehrer für jede Übung mit, ob wir den Code für Geschwindigkeit, Größe oder Speichernutzung schreiben sollten, und er markierte, wenn Sie nicht annähernd die von ihm angeforderten Optimierungen vorgenommen hätten zum.

...

Wenn sie Code aus früheren ähnlichen Aufgaben kopieren und einfügen und es tatsächlich etwas ist, um das neue Problem zu lösen ... nun, das ist 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, dies zu tun. (z. B. Lesen aus einer Datei, Aufforderung zur Eingabe ... alle modularen Teile, die wiederverwendet werden können. Wenn Sie nicht möchten, dass sie dies tun, müssen Sie die Übungen unterschiedlich gestalten.

4
Joe

Leider funktionieren viele Gehirne so. Gehen Sie also in dieses Verständnis, dass es Menschen gibt, die Sie nicht "heilen" können. Es gibt viele Leute, die nicht in der Lage sind, mit der für die Programmierung erforderlichen mentalen Präzision zu arbeiten. Manche Leute sind einfach nicht dafür konzipiert. Ich sage nicht, dass Sie die Schüler aufgeben sollen - ich sage nicht, dass Sie versagen, wenn nicht jeder es aufgreift.

Ohne mehr über den Kontext der Klasse zu wissen, würde ich sagen, dass diese Problemschüler sich mehr auf die grundlegenden Strukturen konzentrieren - einfach if/thens, Schleifen usw. Einfache Routinen zum Ausdrucken ungerader Zahlen, jede zehnte Zahl usw. Nicht mehr als jeweils 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 anderes erwähnte das Schreiben des Codes auf Papier - ich denke, das wäre auch eine großartige Möglichkeit, diese einfachen Routinen auszuführen.

Sie können auch in Betracht ziehen, dass sie Flussdiagramme lernen. Für einige Menschen kann es hilfreich sein, den Ablauf eines Algorithmus zu sehen und dann zu sehen, wie dieser mit dem Code verbunden wird, um den Code mit dem Ablauf zu verbinden.

4
GrandmasterB

Nur ein kurzer Vorschlag. Immer wenn ich ein Programmierproblem habe, das gelöst oder behoben werden muss, schaue ich mir gerne meinen Code an und spiele Computer, wo ich in meinem Kopf die Variablen und ihre Werte verfolge und was ich von ihnen erwarte, wenn jede Zeile ausgeführt wird . Wenn ich also irgendwo einen Code kopiert habe, es sei denn, er ist vollständig und ich muss nur darauf verweisen, gehe ich gerne Zeile für Zeile, um genau zu verstehen, was los ist. Im Wesentlichen Computer spielen. Der VBA-Debugger erleichtert diese Aufgabe im Wesentlichen, aber wenn Sie Ihre Schüler dazu bringen, dies auf Papier zu tun, erhalten Sie möglicherweise Grundlagen wie. Was macht diese Linie eigentlich?

3
Mallow

Ich unterrichtete Einführungsprogrammierung auf College-Ebene. Es war ein Brot-und-Butter-Kurs, alle Fakultäten haben es geschafft, und ich denke, wir haben es ganz gut gemacht. Wir folgten einem gemeinsamen Text und hatten gemeinsame Prüfungen, aber jeder hatte seine eigene Unterrichtsmethode, die funktionierte. Seitdem ist es lange her, aber gelegentlich unterrichte ich ein Kind im Programmieren, und das ganze Bild ist ungefähr das gleiche.

Ich beginne so unten wie möglich, so konkret wie möglich. Was die Schüler wissen, ist eine Struktur. Sie haben bereits viele Konzepte. Ich baue darüber hinaus weitere Konzepte auf und schneide Konzepte ab, die möglicherweise kontraproduktiv sind. Gleichzeitig lasse ich sie lernen, indem ich mache.

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 E/A-Chip an ein paar Lautsprecher angeschlossen war. Ich würde erklären, wie das kleine Programm funktioniert, mit einer inneren Schleife, um einen Zähler herunterzuzählen. Das würde sich verzögern. 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 konnte die Sprecher 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 abhaken und die "Musik" würde hervorbrechen. (Beifall)

Dann hatte ich einen Simulator für einen sehr einfachen Dezimalcomputer mit 1000 Speicherplätzen gebaut, die jeweils eine vorzeichenbehaftete 4-stellige Dezimalzahl enthielten. Es hatte 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 Hinzufügen einer Liste von Zahlen. Dann konnten sie sehen, 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 einzuführen, dass Computer nur eine sehr kleine Anzahl verschiedener grundlegender Operationen ausführen können und diese einzeln ausführen. Dies soll dem Eindruck entgegenwirken, dass Computer kompliziert sind und alles gleichzeitig erledigen, und Ihre Gedanken zum Schnäppchenpreis lesen.

Von dort aus programmierten wir in einer "echten" Sprache (BASIC :), beginnend mit sehr einfachen, aber interessanten Programmen, bis hin zu Bedingungen, Schleifen, Arrays, Dateien, Zusammenführen und so weiter. Das Ziel war es, ausreichende Fähigkeiten zu schaffen, damit sie ein Projekt ihrer Wahl übernehmen können, denn das ist das einzige, was das Programmieren interessant macht - die Verwendung, für die Sie es einsetzen können. Ich würde einige Ideen für Projekte wegwerfen und sie dann von dort übernehmen. Ich würde um schriftliche Ideen und dann um Fortschrittsberichte bitten, um zu verhindern, dass sie 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 in einem sehr konkreten Verständnis dessen, was Computer tun, machte es viel einfacher, später Konzepte zu vermitteln, die ansonsten echte Geschwindigkeitsbegrenzungen wie Arrays oder (in einem späteren Kurs) Zeiger wären. Wir neigen dazu, das Konzept der "Abstraktion" als dieses wunderbare Ding zu verherrlichen, aber es muss auf einem konkreten Fundament errichtet werden, nicht auf Luft.

3
Mike Dunlavey

[~ # ~] ein [~ # ~] selbst gelehrter Programmierer Ich glaube Animation die größte Herausforderung zu sein, um zu wissen, was der Code tut. Wenn ein Programm Algorithmen und mathematische Transformationen enthält, die abstrakte Manipulationen ausführen, besteht die einzige Möglichkeit, zu verstehen, was die Mathematik zu einem bestimmten Zeitpunkt tut (es sei denn, Sie sind ein Genie), darin, die Ausführung des Codes selbst zu verstehen.

Korrigieren Sie mich, wenn meine naive Idee falsch ist. Was Sie tun möchten, ist not Ihre Schüler daran zu hindern, "Entwurfsmuster" zu verwenden, aber einen Weg zu 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. Ich stelle mir vor, dass sich ein gut durchdachtes Animationsprojekt auf offensichtliche Weise manifestiert, 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 kommt, wie ich vermuten sollte, nicht in Frage. Einige Projekte können dennoch zu etwas Kunstvollem und Wundervollem führen, was nicht schlecht ist.

In einem anderen Punkt las ich einen Zeitungsartikel (ja, Papier!) Über einen High-School-Level 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 bewährten Verfahren beurteilt. Für diese Wettbewerbe müssen die Schüler beide ihre Lösung planen und das elementare "Entwurfsmuster", das das Problem benötigt, um es innerhalb der vorgegebenen Zeit zu beenden, von Hand codieren. Daher besteht die Lösung für Ihr Problem bezüglich der CnP-Programmierung darin, zu testen, ob die Schüler dieselben "Code-Chunks" schreiben können, die sie CnP'n sind!

Ich bin sicher, es war in der NY Times. Eine schnelle Suche hat es nicht gefunden. Ein ähnliches Beispiel ist ACMs International Collegiate Programming Contest. Dieser Wettbewerb betont die schnelle Programmierung: "Die blitzschnelle Programmierung im Teamwettbewerb ist eine ausgesprochen eigenartige Fähigkeit, die nicht genau viele Arbeitssuchende an die Spitze eines solchen Platzes setzen würden fortsetzen." Daher würde ich empfehlen Abstraktion von realen Problemen ist die Antwort.

Ebenfalls,

HP Code Wars

3
xtian

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 Lebensmitteln aus einer Liste aufschreiben und die Anweisungen auf hoher Ebene schrittweise aufschlüsseln bis sie die Erleuchtung erreichen.

Es hilft ihnen zu sagen, dass diese Anweisungen buchstäblich von einem Roboter befolgt werden, der nicht weiß, wie er auf Dinge schließen soll. Es muss jedoch eine sehr praktische Aktivität sein, bei der Sie für die Führung verantwortlich sind.

3
fluffy

Alistair Cockburn spricht über das Konzept von Shu-Ha-Ri und wie es für die Programmierung gilt, http://alistair.cockburn.us/Shu+Ha+Ri . Ich denke, es kann wichtig sein, daran zu denken, wo sich Ihre Schüler in diesem Kontinuum befinden. Erstens wird dies helfen, etwas von Ihrer Frustration zu lindern. Kopieren/Nachahmen ist eine sehr natürliche Reaktion und ein akzeptierter Modus, wenn Sie zum ersten Mal etwas lernen. Zweitens kann es Ihnen helfen, einige Ideen zu bekommen, wie Sie vorankommen können. Zum Beispiel möchten Sie vielleicht ein Problem auswählen, das auf mehrere Arten gelöst werden kann (Schleifen vs. Rekursion, Konsole vs. Web/GUI), und sie dann explizit zuerst auf eine Weise und dann auf eine andere Weise lösen lassen - Bonus, den sie lernen können über legitime Wiederverwendung von Code, Komponentisierung, Erstellung wiederverwendbarer Bibliotheken usw.

Ein weiterer erfolgreicher Weg, den ich gesehen habe, besteht darin, eine Reihe von Projekten aufeinander aufzubauen, die bei jedem Schritt nach der Übergabe von Aufgaben 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 einfacher ist als in einer Programmierklasse, aber dennoch machbar sein sollte. Eine schöne Sache dabei ist, dass Sie ihnen explizit eine gute (hoffentlich) Implementierung geben, die sie bei jedem Schritt mit ihrer vergleichen können. Stellen Sie diesen Vergleich als Aufgabe dar, d. H. Führen Sie eine Mini-Code-Überprüfung ihres eigenen Codes gegen ihren Aufwand durch. Möglicherweise möchten Sie dies zu einer von mehreren zusätzlichen Kreditoptionen machen.

Während ich normalerweise nicht besonders auf "Kommentare" stehe, möchten Sie vielleicht die Dokumentation des Codes zu einem der Notenelemente machen. Lassen Sie sie für jedes Projekt ein Dokument "Theory of Operation" erstellen, in dem ihr Ansatz beschrieben wird, wie jede Komponente passt und wie sie das Problem gemeinsam lösen. Normalerweise möchte ich, dass der Code viel davon alleine macht, aber es würde sie dazu bringen, ihre Denkkappen aufzusetzen und es zu Papier zu bringen.

Zuletzt möchten Sie vielleicht kreativ werden und Ihre Schüler den Code des anderen überprüfen und bewerten lassen. Setzen Sie Gruppenzwang ein, um für Sie zu arbeiten. Lassen Sie dies Teil der Note oder der zusätzlichen Gutschrift für den Code (und die Dokumente) mit der höchsten Bewertung werden.

3
tvanfosson

Unterrichten Sie die Klasse mit einer Programmiersprache, die technisch gut, aber so dunkel ist, dass sie keinen vorhandenen Code zum Kopieren finden kann.

2
JoelFan

Sie könnten sie auch auf die harte Tour behandeln.

Finden Sie einen Weg, um ein Kopieren und Einfügen für sie schädlich zu machen. Ich habe kein genaues Beispiel, aber wenn Sie eine erste Übung erstellen, deren Lösung, wenn sie in eine ähnlich aussehende zweite Ü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 "Nicht-Fracht-Kult" 2-Minuten-Denken selbst 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 überlegen, bevor sie Code in die dritte Übung kopieren.

2
gb01

Ich möchte das Lehrerproblem mit einem intuitiven Sehen hervorheben.

Ein Schauspieler (Kino) ist jemand mit einem bankfähigen Image (das es verkaufen kann), ein Star für jeden, der es sich ansieht.

Ein Schauspieler (Theater) ist jemand mit der Fähigkeit, sich in die Rollen des Autors zu versetzen, sein Ego hinter seinem Wissen zu beschatten, um einen Teil selbst zu geben.

Um Ihre Schüler (mit Wissenschaft und Wissen) zu bereichern, müssen Sie im Kurs wie ein Theaterschauspieler leben.

Sie müssen über ein solides technisches Wissen hinaus etwas von Ihnen geben: Sie sind kein Absolvent/Techniker, der alles über das informatische Thema weiß, das wie ein Buch an einen Zustellungssatz gebunden ist.

... aber ein Mann mit Erfahrung (ein möglicher Beginn der Intuition) mit einer Reihe von Kursen und Übungen, die Erfahrungen und lebendiges Wissen austauschen.

Dann können Sie von Ihren Schülern verlangen, dass sie den gleichen Ansatz verfolgen: kein Wissen/keine Note kaufen, sondern eine Sprache und die Fähigkeit, sie zu beherrschen, aufnehmen, etwas tun, das Sie nicht kopieren/hinter sich lassen können, das aber den Geist bei der Arbeit verbindet.

Alle oben genannten Tipps sind nutzlos oder nicht: Können Sie selbstbewusst sein, haben Sie Guru/Theater wie Meisterschaft? Um dieses Niveau zu erreichen, können Theaterkurse Ihnen die Sperrklinke/den Funken geben. Ein guter Weg, sich selbst nicht prozedural zu "kennen".

Das Problem: Es liegt an Ihnen: Sie müssen Ihren Sitz verlassen, Ihr Körper- und Raumbewusstsein und andere Techniken kennen, tiefer in die Sprache eintauchen (was ist jenseits von Wörtern, Methoden)?

... eine "Arbeit" für Ihr ganzes Leben, mit kreativen Fähigkeiten. ... oder nicht: all diese "Arbeit" für 5% meines Jobs? (Fragen Sie Sie also, was "am Leben sein" ist) ...

In der Hoffnung ist es Englisch lesbar,

Claude

1
cl-r

Geben Sie ihnen niemals ähnlich klingende Aufgaben.

Oder, verrückter, lernen Sie sie TDD von Anfang an. Es drängt darauf, viel Code (nämlich Tests) zu schreiben (nicht zu kopieren, zu schreiben), der tatsächlich dazu beiträgt, das zu lösende Problem zu formulieren.

1
herby

Als ich in einem Einführungskurs in die Programmierung war, forderte der Ausbilder alle auf, einen Algorithmus auf Englisch zu schreiben und ihn auszudrucken und einzureichen, bevor wir mit dem Schreiben von Code begannen. Dann müssten wir viele Kommentare einfügen, wie z. B. Variablen erstellen, Eingabe vom Benutzer abrufen, Berechnungen durchführen, Ausgabe drucken usw. Ich wurde ein paar Mal angedockt, weil ich nicht genügend Kommentare hatte, als ich dachte, es gäbe viele, also fing ich an hinzuzufügen Mehr. Dies zwang mich, darüber nachzudenken, was ich tat, die Lösungen zu schreiben und immer wieder zwischen Englisch und Java hin und her zu übersetzen.

1
cpp-java

Ich habe festgestellt, dass es für die Leute in meiner Klasse sehr hilfreich ist, ein kleines Projekt über sie zu schreiben, über ein Thema, das sie selbst auswählen können.

Als ich anfing zu programmieren, war es auch für mich schwierig und ich habe im Unterricht viel kopiert. Dann habe ich zu Hause angefangen, kleine Spiele zu machen, da ich ein Spielprogrammierer werden möchte, und ich fand, dass sie viel einfacher zu machen sind. Obwohl sie viel schwieriger waren als das, was wir im Unterricht gesehen haben. Nur weil es mich interessierte.

Einige andere Leute in meiner Klasse gingen von 40-50% bei ihren Prüfungen auf 90-100%, weil sie genau das Gleiche taten.

1
Simon Verbeke

Ich bezweifle, dass dieses Verhalten auf der Überzeugung beruht, dass Programme Zaubersprüche sind - wahrscheinlicher ist es Faulheit und mangelnde Motivation.

Ich denke, Ihre Aufgabe als Lehrer ist es, Ihre Schüler zu motivieren - kein Schüler, der wirklich motiviert ist, wird eine Lösung ausschneiden und einfügen (das ist nur für arbeitende Programmierer mit Fristen und Endergebnissen zu beachten ...).

1
Vector

Unterprogramme unterrichten. Lassen Sie sie den Code, den sie aus früheren Aufgaben erhalten haben, in eine Unterroutine umwandeln. Bringen Sie ihnen die Funktionsdokumentation bei, damit sie verstehen, was das Unterprogramm tatsächlich tut.

1
Tony Topper

Lassen Sie sie die Aufgabe vor Ihnen im Klassenzimmer erledigen, ohne dass ein Internetzugang vorhanden ist (lassen Sie die Schule abschneiden, lassen Sie auch während des Unterrichts keinen Telefongebrauch zu). Tun Sie dies zumindest für Tests. Es gibt überhaupt keinen Grund, das Internet für grundlegende Programmiererfahrungen zu nutzen. Das Buch sollte eine ausreichende Ressource für Einführungsübungen sein. Erlaube die Internetnutzung, wenn du in einer fortgeschrittenen Klasse bist und sie bereits gelernt haben, wie man denkt.

1
HLGEM

Ich habe ein Blog-Stück darüber geschrieben, aus der Perspektive dessen, was wir Programmierer, die Tuts schreiben, anders machen sollten, um dieses Problem unter professionellen Junior-Programmierern (ich hoffe!) Zu lindern und uns teilweise die Schuld zu geben. Ich denke, die Art und Weise, wie wir Material für sie erstellen, ist ein wesentlicher Bestandteil dieses Problems. Einige Vorschläge, die ich mache:

Teilen Sie Ihren Code in kleine, unvollständige Teile auf: Dies ist wirklich nur eine mechanische Sache und möglicherweise ein "kontroverser" Vorschlag. Veröffentlichen Sie keine großen Teile des Arbeitscodes in Ihrem Tutorial. Lassen Sie sie arbeiten, um alles zusammenzufügen, hoffentlich während sie jeden Teil lesen und verstehen. Das ist nicht einfach - es gibt bereits so viele Tutorials mit defektem Code, dass ich sehe, dass dies für einen Lernenden frustrierend ist. Aber ich glaube wirklich, wenn sie sich auf dem Niveau befinden, auf dem sie lesen "Wie erstelle ich ein Anmeldeformular?", Müssen sie wirklich jeden Schritt für sich durcharbeiten (und mit Fragen auf Stackoverflow verlinken, wenn sie es nicht zum Laufen bringen können).

Erklären Sie das Problem, bevor Sie es beantworten: Eine übliche Technik beim Schreiben von Lernprogrammen besteht darin, einen Codeblock zu veröffentlichen und ihn dann Zeile für Zeile durchzugehen. Ich würde argumentieren, dass wir sagen sollten, was wir hinzufügen müssen UND WARUM, dann hinzufügen und dann wiederholen. Also: "Wir müssen ein Formular mit einer Post-Methode, einem Element zum Speichern unseres Benutzernamens und Passworts und einer Schaltfläche zum Senden erstellen" und es dann ausschreiben. Zu wissen, was Sie sehen, bevor Sie es sehen, ist eine weitaus effektivere Lehrmethode.

Lehren Sie das Debuggen, nicht das Codieren: In einem kürzlich veröffentlichten Beitrag auf dieser Website habe ich (hoffentlich mit einigem Erfolg) eine neue Technik ausprobiert. Ich habe eine Reihe von fehlerhaftem Code veröffentlicht und dann gelernt, wie man herausfindet, was daran falsch ist. Viel zu viele neue Programmierer verstehen das Setzen von var_dump () nicht einmal; Dies ist meiner Meinung nach die Hauptursache für die meisten neuen Programmiererfragen.

Gehen Sie tiefer, nicht weiter: Anthony Ferrara hat bei Programming with Anthony eine brillante Reihe von Programmiervideos gestartet. Der Grund, warum ich sie so sehr mag, ist, dass sie ein bestimmtes Thema auswählen und es wirklich "tief" erklären. Anstatt zu versuchen, einen vollständigen "Social Widget Scroller" zu erstellen, erklärt er nur Arrays bis hinunter zur Speicherebene. Anstatt zu versuchen, große Themen abzudecken, wählen Sie etwas Kleines aus und erklären Sie es gründlich und geduldig.

Lehren Sie, wie Sie den Fehler melden können: Nicht für unsere eigene Bequemlichkeit. Wir alle wissen, wie oft wir etwas herausgefunden haben, als wir das Problem in einem Forum geschrieben haben. Der Grund ist einfach: Wenn Sie etwas erklären müssen, müssen Sie darüber nachdenken. Bringen Sie ihnen nicht bei, "bei Google nachzuschlagen" - bringen Sie ihnen bei, sich zu setzen und darüber nachzudenken, oder schreiben Sie sich einen Brief über das Problem.

Volltext: http://codebyjeff.com/blog/2013/05/death-to-teaching-cargo-programming

1
jmadsen

1) Bringen Sie ihnen die Geschichte der Computer und Programmierung bei. 2) Lehren Sie, wie verschiedene Programmiersprachen funktionieren. 3) Lehren Sie, was eine gute Programmierung und Programmierpraxis sind. 4) Bringen Sie ihnen bei, wie man ein Problem analysiert, eine Lösung findet und dann mit dem Codieren beginnt.

0
Ramnath