Wie gehe ich mit der Einstellung zur Cargo-Kult-Programmierung um?


257

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?


8
Kommentatoren : Hinterlassen Sie hier keine Antwort in den Kommentaren. Schreiben Sie Ihre eigene Antwort. Kommentare sind kein Ort, um verschiedene mögliche Antworten auf die Frage zu erörtern: Bringen Sie Ihren Vorschlag entweder als Antwort an oder nehmen Sie ihn zum Chatten mit, um ihn zuerst zu erläutern .

50
Wann immer Akademiker hierher kommen - ich mache mir Sorgen um meine Zukunft ... Ich stelle mir vor, ich sitze auf einer Boeing 7-28-7 und die Turbinen drehen sich mit 200.000 U / min und werden mit einer Steuerungssoftware betrieben, die in C von einem Ihrer kaum passierenden Studenten geschrieben wurde. Sowieso schweife ich ab.
Ben DeMott

67
Haben Sie schon ein paar Mal darüber nachgedacht, sie NICHT zu bestehen? Nicht jeder ist für die Softwareentwicklung geeignet ! Sie sind nicht alle spezielle Schneeflocken!

6
Ist SICP nicht berühmt dafür, zu sagen, dass Programmieren analog zu Zaubersprüchen ist? Ich meine, ich bezweifle, dass Ihre Schüler SICP zitieren oder sogar einen Vergleich anstellen, der mit dem vergleichbar ist, was Abelson und Sussman darzustellen versuchten, aber ich sehe nicht, dass es von Natur aus falsch ist, wenn jemand Programmschreiben mit Zaubersprüchen vergleicht, wenn es eines der berühmtesten ist Computer-Programmierbücher machen genau dasselbe auf den ersten Seiten.
Robbie

9
Eric Lippert hat viel zu diesem Thema zu sagen. Und auf eine viel elegantere und prägnantere Weise, als es mir möglich ist: blogs.msdn.com/b/ericlippert/archive/2004/03/01/82168.aspx
P.Brian.Mackey

Antworten:


120

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:

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, 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.


Ich würde zu dieser netten Antwort einen Link zu einer einfachen Website hinzufügen, die meiner Meinung nach als Ergänzung zu Kursen eingerichtet werden sollte: http://projecteuler.net/ Dies ist DIE Website, um ihren Appetit auf Code anzuregen. Es gibt zunehmend schwierige Probleme, die mit der gewünschten Sprache gelöst werden müssen. Erstens macht es süchtig und stimuliert auch den Wettbewerb: Sie können ihren Fortschritt über ihre Konten verfolgen, sie können es auch tun.
Nicolas C.

142

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:

  1. Verwenden Sie die Bob-Ross-Methode: Beweisen Sie, dass es sowohl möglich als auch schneller ist, neu zu beginnen, als auch zu kopieren und einzufügen. Erstellen Sie während des Unterrichts neue Programme vor ihren Augen - zeigen Sie ihnen, dass das 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 Tierhandlung, eine Stadt, ein College usw. zu erstellen) auf Papier erstellen, um sie während des gesamten Kurses zu verwenden. Aufgabe Nr. 2 kann darin bestehen, diese Strukturen in Klassen oder Objekte usw. umzuwandeln. Verleiten Sie sie grundsätzlich zum abstrakten 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 möglichst wenig Syntax. Vorformulierten Sachen wie das Erstellen von Klassen und Sprachsyntax sind so weit verbreitet in der Einführung der Programmierung , dass sie verleitet oft Studenten zu denken , dass alle Programmierung nur wo ist zu wissen , geschweifte Klammern setzen - sie nicht erkennen , dass , was in der Mitte des lockig In Zahnspangen fließt Kreativitä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 Zuordnungen schrittweise verfeinern.

Das sollte sein &&- obwohl ich vermute, dass es auch als bitweise Operation gelingen könnte.
Tvanfosson

Ich weiß nicht wirklich, wie die Daten aussehen, aber eine bitweise Operation ist das, was ich beabsichtigt habe. Guter Fang :-)
Kevin McCormick

3
"In der Mitte der geschweiften Klammern fließt die Kreativität" ==> oops, er / sie bringt ihnen dann kein Python bei ...
Olivier Pons

3
Ein weiteres Problem bei dem Versuch, dem Lehrer die "richtige" Antwort zu geben, anstatt zu lernen, ist, dass die Leute oft denken, dass dies Lernen ist. ZB lesswrong.com/lw/iq/guessing_the_teachers_password
Wilka

6
Und dann füge ich hier ein paar fröhliche Semikolons hinzu ...
VirtuosiMedia

44

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.


4
Die Osterei-Idee scheint auch eine gute Möglichkeit zu sein, das Testen / Verifizieren zu lehren. Nach dem Motto "wat kann entfernt werden, ohne einen der Verträge zu brechen?"
Neil N

3
+1 zum Lesen von Code. Ich sehe viele Leute, die Fehler beheben, indem sie eine intuitive Vermutung anstellen und danach suchen, dies zu beweisen. Ich finde, dass das Lesen des Codes Hinweise liefert, die Sie zur richtigen Lösung führen. Es klingt offensichtlich, aber ich sehe, dass es viel vernachlässigt wird.
Chris

38

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.


"Als ich das Programmieren zum ersten Mal lernte, habe ich nur Codeseiten von der Rückseite des Compute! -Magazins eingegeben.": Dies war meine sehr frühe Phase, als ich einen Commodore Vic20 zum Ausführen kleiner Spielzeugprogramme verwendete, und es wurde bald sehr langweilig. Ich entwickelte bald die gegenteilige Einstellung: Schreiben Sie sich selbst den Code, den Sie von woanders kopieren könnten, sonst werden Sie nie sicher sein, was wirklich im Code vor sich geht.
Giorgio

Einer unserer Lehrer gab uns den Auftrag, ein Assembler-Programm zu kopieren, das er uns gegeben hatte, und er verlangte, dass die Kopie mit unserer eigenen Handschrift erstellt wurde. Er wollte auch, dass wir unsere Namen auf die erste Seite vor ihm schreiben, damit er überprüfen konnte, ob die Handschrift unsere ist. Diese Aufgabe hat mich ungefähr 3 Stunden gekostet.
Sashoalm

1
Eine ablenkungsfreie Umgebung wie Jon Jaggers Cyberdojo kann hierfür hervorragend geeignet sein, und das Einrichten eines eigenen Servers ist so einfach wie das Herunterladen der virtuellen Maschine oder der Quelle von github .
Mark Booth

@ giorgio Ich war zu der Zeit 8 Jahre alt. Mein Schwierigkeitsgrad war "Tippe dies ein, um ein kostenloses Spiel zu bekommen"
Michael Brown

25

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.

  1. 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).

  2. 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.

  3. 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),

  4. 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.


23

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.


3
Loops und Bedingungen? Ich würde sie mit Variablen, Zuweisungen und Ausdrücken beginnen. Lassen Sie sie zwei Zahlen von der Befehlszeile lesen und sie hinzufügen und dann das Ergebnis ausdrucken. Wenn Schüler etwas tun, das fast schmerzhaft ist, können sie sich darauf verlassen, dass sie verstehen, was vor sich geht, und ermutigen sie zum Experimentieren.
TMN

2
@c_maker: Deine Aufgabe sieht aus wie ein Spiel für Vorschulkinder. Wenn Sie Ihren Schülern zu einfache Aufgaben geben, kann dies das Interesse für das Fach verringern.
Goran Jovic

2
@c_maker: Ich denke, Ihre Antwort hat sich bewährt. Ich habe nur nicht verstanden, wie ich while not at-corner do take-one-step endzum eigentlichen Code übergehen kann, ohne Dinge wie Variablen und Datentypen "nachzufüllen". Entschuldigung, meine Antwort wirkt ein wenig nachdenklich.
TMN

7
Ich denke, der Hauptwert hinter Rick the Robot besteht nicht darin, Schleifen, if-Anweisungen usw. zu verstehen. Der Hauptwert besteht darin, ihnen zu helfen, den allgemeinen Prozess zum Schreiben eines Programms zu verstehen. Es hilft ihnen dabei, Probleme auf spezifische, schrittweise, algorithmische Weise zu erkennen. Sobald sie den Programmiervorgang in Englisch anhand eines Beispiels wie dieses verstanden haben, können Sie die Details ergänzen, indem Sie ihnen beibringen, wie der Code aussieht. Das ist eine geniale Idee. +1
Phil

1
Erinnert mich an meinen Einführungskurs (vor 30 Jahren!), Der auf [Karel the Robot] ( en.wikipedia.org/wiki/Karel_(programming_language) basierte . (Hinweis: Der Link schlägt fehl, weil die tatsächliche URL Parens enthält Klicken Sie auf die erste Option auf der Seite, die angezeigt wird.) Wie auch immer, Karel verwendete eine Pascal-ähnliche Syntax, aber nicht zu viele davon.
JeffK

20

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.


2
Sehr interessantes Stück über Blooms Taxonomie. Meiner Meinung nach ist es wichtiger, dass ein Schüler den Code versteht, als ihn in einer Intro-Klasse zu kopieren / einzufügen. Sie müssen wissen, wie ifAnweisungen 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.
Phil

Ich habe kürzlich einen großartigen Lehrkurs von Richard Felder besucht. Er war der Meinung, dass Sie die niedrigeren Stufen der Bloom-Taxonomie nicht erst "beherrschen" müssen, bevor Sie aufrüsten. Als Beispiel erzählte er, wie Kindergartenkinder Analysen üben, wenn sie gefragt werden, welche Fernsehsendung besser ist - die Sesamstraße oder [...?] Und warum.
Aivar

11

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.


Eine andere Möglichkeit, Code bereitzustellen, besteht darin, von ihnen zu verlangen, mit einer von Ihnen geschriebenen Klasse zu interagieren (die mit vorherigem Code nicht funktioniert) und die Zuweisung zu verlangen, dass Ihr Code nicht geändert werden kann, und dass sie ihre eigenen ändern müssen Code, damit die Zuweisung funktioniert.
Zoot

Oder geben Sie den Code ein, damit er in eine Richtung funktioniert, und weisen Sie ihn an, das Verhalten zu ändern / hinzuzufügen. Auf diese Weise konzentrieren sie sich eher auf das bestimmte Verhalten als auf das Grundlegende, um es zum Funktionieren zu bringen.
JohnMcG

Versuchen Sie, für die erste Sprache eine Sprache zu verwenden, für die zunächst keine Kesselschilder erforderlich sind. Python ist in dieser Hinsicht gut, C / C ++ / Java ist beispielsweise schlecht.
Lie Ryan

Wenn überhaupt, fördern IDEs, Code-Vervollständigung und Vorlagen die Cargo-Kult-Mentalität. Wenn sich die Schüler die Zeit nehmen, um zu verstehen, warum dieser Vorlagencode benötigt wird, lernen sie viel mehr, als das Rezept blind zu befolgen.
Mark Booth

8

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.


Vielen Dank! Du hast mir viel Denkanstoß gegeben. Anfangs dachte ich, dass sie sich vielleicht einfach nicht vorstellen können, dass ein Stück Code eine Struktur und eine kompositorische Bedeutung hat. Jetzt denke ich, dass sie vielleicht tatsächlich Schwierigkeiten hatten, es zu verstehen, aber gescheitert sind und das Kopieren und Einfügen als letzten Ausweg verwendet haben.
Aivar

7

Ä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

  • Aufgabe 1: Drucken Sie die aktuelle Etage aus
  • Aufgabe 2: Erstellen Sie die Datenstrukturen für eine Aufzugsklasse und drucken Sie die Etage anhand des Aufzugs aus
  • Aufgabe 3: Erstellen Sie einen Code, der "den Aufzug bewegt" und den Boden druckt. Tastatureingabe übernehmen (> Etage betreten:)
  • Aufgabe 4: Behandeln Sie mehrere Aufzüge

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


2
Nun, das Kopieren-Einfügen ist nicht das Problem, das Problem ist, dass sie nicht verstehen, was sie kopieren.
Aivar

1
Ein Problem bei inkrementellen Aufgaben ist, dass der Schüler, wenn er eine frühe Aufgabe durcheinander bringt, für den Rest nicht mehr mit funktionsfähigem Code arbeiten kann. Viele Kursleiter stellen hilfreich Arbeitscode zur Verfügung, der als Grundlage für spätere Aufgaben verwendet werden kann, aber dann kehren sie zum ursprünglichen Problem zurück: Sie ändern den Code eines anderen, den sie nicht verstehen.
Barry Brown

"Ja wirklich?" Wenn ein Lehrer nicht hilfreich genug ist, um dem Schüler zu helfen, seinen Code zum Laufen zu bringen, machen sie dann wirklich ihre Arbeit?
Richard

Nicht jeder wird seine Aufgabe bis zum Fälligkeitsdatum erledigen.
Barry Brown

@Barry, ist das nicht bei jedem Fach der Fall, das sich während des gesamten Kurses logisch aufbaut? Wenn Sie zum Beispiel noch nie Mengenverknüpfungen und Schnittmengen gelernt haben, sind Sie für den Rest Ihres Diskreten Mathematikkurses geschraubt. Oder wenn Sie nie Ihr Periodensystem gelernt haben, sind Sie für den verbleibenden Chemiekurs bestens gerüstet. Die Idee ist, die Schüler zu zwingen, Konzepte in der richtigen Reihenfolge zu beherrschen und sich den Arsch abzuarbeiten, bis sie sie beherrschen. Wenn sie nicht eine Woche lang die ganze Nacht verbringen können, um ein Programm für den nächsten Unterrichtstag vorzubereiten, müssen sie keine Karriere in der Softwareentwicklung machen.
Jonathan Henson

7

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

  • Interaktiver Dolmetscher. Sehr wichtig, da dies die Erkundung ermöglicht.
  • Sehr prägnant. Kein Kochfeld. Dadurch können sich die Schüler auf die Ideen konzentrieren, die sie zum Ausdruck bringen möchten.
  • Relativ undurchsichtig 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 Erfahrungen gesammelt hat. Und es ist weniger wahrscheinlich, dass sie Lösungen für Hausaufgaben aus dem Internet kopieren und einfügen können.

ML wäre eine ziemlich gute Wahl! Aber Python passt auch zu Ihren ersten beiden Punkten und ist einfach zu bedienen (was bedeutet, dass es keine großen technischen Probleme gibt).
Aivar

Ich würde Python auch sehr empfehlen, besonders wenn es mit einer guten IDE wie Wing IDE kombiniert wird.
Ken

6

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.


5

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.


5
  • Fordern Sie sie auf, die kürzestmögliche Lösung für das Problem zu finden.
  • Belohnen Sie die prägnanteren Lösungen mit einem Anreiz.
  • Erstellen Sie Übungen, die sich ausschließlich um das Umgestalten von Code drehen
  • Lassen Sie die Schüler Aufgaben austauschen und sie für Effizienz und Code-Sauberkeit nachahmen. Verwenden Sie einige der am wenigsten effizienten Beispiele für Overhead-Projektoren.

2
Refactoring ist in der Tat äußerst wichtig für die Praxis. Es ist jedoch zu beachten, dass die kürzeste Lösung nicht unbedingt die sauberste und auch nicht die effizienteste ist (dies hängt auch von der Definition dieser Begriffe ab).
Péter Török,

In der Schule habe ich versucht, Lösungen zu schreiben, die kürzer sind als die Lösungen eines Freundes. Das bedeutete, kurze Variablennamen zu verwenden und im Allgemeinen Code zu schreiben, der nicht gut liest.
Christian

@Christian Kurz gesagt, ich meinte nicht, dass die Zeichenlänge kurz ist, da der Compiler sich nicht wirklich um Variablennamen kümmert. Ich spreche von Codekomplexität ... aka KISS .
Lynn Crumbling

4

Ä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.


4

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.


Das Problem ist, dass sie kopieren, ohne die Struktur des Codes zu sehen - sie denken nur, dass diese Art von Muster beim letzten Mal nützlich war, also passt es hoffentlich auch hierher. Sie hoffen und versuchen, anstatt zuversichtlich zu sein.
Aivar

4

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.


3

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.


Guter Punkt! Ich habe dies getan und ich glaube, dies hat viele Studenten auf den richtigen Weg geführt. Aber nicht alles.
Aivar

3

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.


3

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?


Ich habe ihnen empfohlen, dies zu tun, aber ich denke, für einige ist es ein zu langsamer und fehleranfälliger Prozess, den sie überspringen.
Aivar

Haben Sie versucht, dies vor ihnen auf einem Projektor mit Markern zu tun? Wenn ich mich an meinen Highschool-Programmierunterricht erinnere, hat unser Lehrer dies getan, und obwohl es den meisten anderen Schülern egal war, dachte ich, dass es eine hilfreiche Fähigkeit war. (Warnung grobe Verallgemeinerung kommt auf) Es ist schwer, bei Schülern meiner Generation und jünger Motivation zu schaffen, wir haben gelernt, keine Fragen zu stellen.
Mallow

3

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.


3

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 notverhindern, 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


2

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


1
Ich mache mir keine Sorgen, dass sie die Arbeit eines anderen kopieren, sondern die eigene Arbeit oder einige Beispielausschnitte, die in einer bestimmten Situation nicht verwendet werden können.
Aivar

2

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.


1

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.


Für einige dieser Studenten sind Faulheit und / oder Fristen sicherlich die Ursache. Aber einige arbeiten wirklich hart ...
Aivar

@Aivar - Als Ausbilder sind Sie wahrscheinlich besser über die Stärken und Schwächen der Schüler informiert. Aus Neugier, was Sie denken , sind die Hindernisse für diejenigen Schüler, die „hart arbeiten“?
Leigh

@Leigh - Ich denke, sie haben den analytischen Teil ihres Gehirns nicht genug trainiert und nähern sich den Aufgaben mit brachialer Gewalt - ihre Arbeitsmethode ist nicht weit von einer erschöpfenden Suche entfernt. Und es ist schwierig, ihnen den alternativen Ansatz zu erklären.
Aivar

@Aivar - Vielleicht sollte man sich in einem frühen Stadium mehr auf die Analyse konzentrieren. Zum Beispiel das Entwerfen von zweiteiligen Übungen. Das erste Segment konzentriert sich auf die Bausteine ​​des Codes. Während der zweite dekonstruiert, debuggt und analysiert er dasselbe Beispiel. dh fragt das "Warum" und diskutiert Möglichkeiten zur Verbesserung des Codes mit realen Korrelationen zu verschiedenen Ansätzen (Brute Force, etc ..). Früh und häufig getan, würde dies helfen, ihr Wissen zu festigen und sie zu ermutigen, Programmierung als mehr zu betrachten, als nur die richtige Syntax in einer bestimmten Sprache zu konstruieren.
Leigh

1

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.


Dies löst das Problem nicht wirklich.
Pubby

Ich denke schon. Frachtkult ist die Einbeziehung von Code, der keinen Zweck erfüllt. Wenn sie ihren Code in Unterprogramme aufteilen und dokumentieren, was diese Unterprogramme tun, sollte dies helfen. Analyse ist ein großer Teil des Lernens und Analyse erfordert das Teilen von Dingen.
Tony Topper

1

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.


1

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.


Das Schreiben von Tests ist oft schwieriger als das Schreiben des Codes. Ich würde vorschlagen, dass der Lehrer die Tests schreibt und sie dann den Schülern übergibt, damit sie gegen ihre Aufgaben antreten.
TMN

@TMN: Das könnte nach hinten losgehen. Die Schüler werden implizit aufgefordert, den Code nach dem Zufallsprinzip zu ändern, bis die Tests bestanden sind.
Goran Jovic

@GoranJovic: Ich bin mir nicht sicher, ob ich "implizit ermutigt" bin, aber ich erkenne, dass es keine einfache Möglichkeit gibt, zwischen mit Absicht geschriebenem Code und gemeinsam gehacktem Code zu unterscheiden, um die Tests zu bestehen. Natürlich ist dieses Problem auch nicht auf die akademische Welt beschränkt ...;)
TMN

@TMN: Und der inkrementelle "Schritt für Schritt" (so einfach wie es der Entwickler benötigt) würde verschwinden.
Herby

Lösung: Stellen Sie eine minimale Anzahl von Tests bereit, die die Schüler beim Schreiben ihrer Programme verwenden können, warnen Sie sie jedoch davor, dass ihre Programme mit einer viel umfassenderen Anzahl von Tests bewertet werden, UND dass sie mit den Tests abgeglichen werden, die die Schüler schreiben.
Barry Brown

1

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.


1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.