Nachhilfe für Schüler, die mit den Grundlagen in C ++ zu kämpfen haben [geschlossen]


26

Ich unterrichte einige Schüler, die erhebliche Probleme haben, die Grundlagen ihrer ersten Programmiersprache zu erlernen: C ++. Ich habe viele hervorragende und kluge Studenten gekannt, die ihren ersten CS-Kurs nicht bestanden oder abgebrochen haben. Jeder, den ich unterrichte, gibt einen ähnlichen Bericht über seine Erfahrungen im Unterricht: Der Kursleiter geht zu schnell voran, nichts in den Vorlesungen ergibt einen Sinn, et al. Vor dieser CS-Klasse hatten die meisten dieser Schüler kein Interesse an Computern gezeigt, sondern lediglich an Textverarbeitungsprogrammen, Webbrowsern oder einer anderen Form der Unterhaltung. Der Computer ist eine Blackbox, die funktioniert. Warum also damit herumspielen?

Ich vermute, dass sie Probleme haben, die Abstraktionen der Informatik mit vertrauten Konzepten zu verbinden. Das heißt, diese Schüler können vielleicht Mathematik, Biologie oder Physik lernen, aber diese Techniken funktionieren beim Programmieren nicht.

Hat jemand irgendwelche Vorschläge oder Ratschläge? Die Schüler, denen ich helfe, haben es nicht verdient, diese Klasse zu verlassen. Es ist klar, dass der Ausbilder den Lernstil dieser Schüler nicht berücksichtigt. Das heißt, der Ausbilder scheitert nicht an seinen Schülern.


2
Kommentatoren: Wenn Sie eine Antwort haben, hinterlassen Sie sie als Antwort: Hinterlassen Sie sie nicht als Kommentar. Wenn Ihre Antwort bereits hinzugefügt wurde, stimmen Sie ab. Wenn Sie das Thema dieser Frage mit anderen diskutieren möchten, verwenden Sie den Chat .

1
Nicht? Aus meiner Erfahrung gibt es genug Leute, die programmieren und nicht ...

Antworten:


42

Es gibt ein paar Dinge, mit denen praktisch jeder Anfänger zu kämpfen hat. Die Schüler müssen wissen, wie man Code liest, bevor sie lernen können, wie man Code schreibt.

  • Der sequentielle Charakter imperativer Sprachen. Menschen haben Probleme zu verstehen, dass Funktionen wie ein Rezept nacheinander ausgeführt werden. Eine Möglichkeit, dies zu überwinden, besteht darin, Code zu zeigen, der über einen Debugger funktioniert.
  • Der Zuweisungsoperator ( =) in C-Sprachen ist äußerst irreführend. Sie müssen sehr sorgfältig erklären, dass dies a = 5bedeutet, dass "Variable 5 zuweisen a, nicht " a ist gleich 5 ".
  • Für Anfänger ist es sicher, Funktionen als strukturierte Codeblöcke zu beschreiben, zu denen andere Funktionen springen können. Anfänger haben auch Probleme zu verstehen, dass in C ++ Funktionsargumente nach Reihenfolge und nicht nach Namen identifiziert werden.
  • Die meisten imperativen Programmiersprachen haben einige deklarative Komponenten und einige prozedurale Komponenten, und C ++ ist keine Ausnahme. Stellen Sie sicher, dass der Schüler versteht, dass einige Teile des Codes die Struktur des Programms beschreiben, und andere Teile (Funktionen) beschreiben, was das Programm tun soll.
  • Das Durchlaufen eines Programms mit dem Debugger ist ein äußerst wichtiges und oft vernachlässigtes Lehrmittel .
  • Ausdrücke haben Typen . 3+3ist eine Ganzzahl, 3.5 + 3ist ein Double, "3" + "3"(in C #) ist ein String, x == 5 * 3 + 25ist ein Boolescher Wert (oder eine Ganzzahl in C ++). Wenden Sie viel Zeit auf, um sicherzustellen, dass der Schüler mit dieser Vorstellung vollständig vertraut ist.
  • Variabler Umfang ist etwas, das Anfänger ständig verwirren. Erklären Sie dem Schüler, wie der Bereich funktioniert, und stellen Sie sicher, dass sich ein xin einem Bereich definierter Bereich von einem xin einem anderen Bereich definierten unterscheidet .
  • Jede Variable wird mindestens dreimal in ihrer Lebensdauer referenziert: Deklaration, Zuweisung (häufig in derselben Zeile wie Deklaration), Verbrauch. Fehlt eines dieser Elemente, liegt irgendwo ein begrifflicher Fehler vor. Aus dem gleichen Grund können Sie beim Analysieren eines Arbeitsprogramms immer nach diesen drei Dingen im Code suchen, um den Zweck einer Variablen herauszufinden.
  • forSchleifen sollten erst unterrichtet werden, wenn geeignete Beispiele für die Iteration mit whileSchleifen vorliegen. Die Kurzschreibweise ist verwirrend und lässt die Schüler sich fragen, warum sie nicht einfach whileSchleifen verwenden können. Ein Spickzettel, der eine forSchleife in Form einer whileSchleife beschreibt, kann hilfreich sein.
  • Arrays und Zeiger sind ziemlich einfach zu lehren, aber ein Albtraum zu lernen. Mit anderen Worten, bis es klickt, ist Übung wichtig.
  • Die Idee, dass Code Text ist und dass ein kompiliertes Programm tatsächlich eine Datei ist , ist für einige Anfänger schwer zu fassen. Zeigen Sie ihnen unbedingt die CPP-, H- und Binärdateien in der Shell an.

Die OOP-Komponenten von C ++ sind ein ganz anderes Biest, und ich hoffe, der Kursleiter kommt nicht dahin - denn OOP wird am besten mit Sprachen unterrichtet, die von Grund auf für OOP entwickelt wurden. Meiner Erfahrung nach ist das Unterrichten von OOP über C ++ nie gut gelaufen.


2
"Die Leute haben Probleme zu verstehen, dass die Funktionen nacheinander ausgeführt werden"? Ich denke, das ist genau die Sache, mit der praktisch niemand Probleme hat (außer vielleicht Leuten, die bereits eine funktionierende Sprache gelernt haben, bevor sie mit dem Verfahren beginnen). Aber ich stimme in allem überein, was du sagst.
links ungefähr

2
+1 für den Schritt mit dem Debugger, damit sie einen Eindruck vom Unterschied zwischen dem Programm selbst und der Ausführung bekommen.
Mike Dunlavey

4
@leftaroundabout Du wärst überrascht. Mathematik ist größtenteils deklarativ, daher können imperative Sprachen jeden abschrecken, der Algebra gelernt hat.
Rei Miyasaka

2
Diese Antwort scheint ein bisschen so zu sein, als würde man nur Konzepte abschütteln. Die Konzepte sind zweifellos richtig und sicherlich wichtig, aber das Unterrichten auf diese Weise ist ein bisschen so, als würde man jemandem beibringen, wie man fährt, indem man die Straßenregeln verlässt.
Riwalk

@ Stargazer712 Jeder lernt die Straßenregeln, bevor er den Straßentest ausprobieren darf. Ich könnte flauschige Ideen mit einem breiten Strich präsentieren, wie "Übung ist der Schlüssel" oder "sei kreativ" oder "denke logisch", aber diese Dinge sind vermutlich für jeden Ausbilder und für die meisten Studenten ganz offensichtlich. Man könnte auch abstrakte Dinge wie diskrete Mathematik oder Sprachtheorie als Vorläufer des Programmierens unterrichten, aber das wird nur dann wichtig, wenn die Mechanik so komplex ist, dass Probleme nicht durch Intuition allein gelöst werden können. Früher oder später müssen die Leute aufhören, Zen zu sein und anfangen, Inhalte zu unterrichten .
Rei Miyasaka

19

Haben Sie schon einmal Programmieren unterrichtet?

Ich unterrichtete vier Jahre lang CS und Nicht-CS-Majors im Programmieren. Im ersten Semester war meine Erfahrung wie deine, bis ich ein paar Dinge gelernt habe.

Was mir vakuum einfach vorkam, war für die Anfänger überhaupt nicht einfach.

Unabhängig von der Sprache müssen Sie einen mentalen Rahmen schaffen - Dinge, die so offensichtlich sind, dass Sie nicht einmal bemerken, dass Sie sie kennen, wie zum Beispiel:

  • Computer machen jeweils nur eine Sache. (Jeder, der sagt, er habe Parallelität und Pipelining, geht weg. Komm zurück, wenn die Schüler etwas wissen.) Computer können nur eine kleine Anzahl von verschiedenen Dingen ausführen, und sie können nicht mit einem Schritt beginnen, bis der vorherige abgeschlossen ist. Ich sage das nur, weil Computer so viele Dinge zu tun scheinen und sie sofort erledigen, dass es für einen Anfänger so aussieht, als würden sie alles auf einmal erledigen und auch Ihre Gedanken lesen.

  • Variablen sind wichtig. Es ist wichtig zu verstehen, dass der Name einer Variablen und ihr Inhalt zur Laufzeit zwei völlig verschiedene Dinge sind. Anfänger haben damit zu kämpfen. Wenn ich sage "Schreiben Sie ein Programm, um Ihren Namen einzugeben, und sagen Sie dann Hallo zu Ihnen", müssen sie herausfinden, dass sie eine Variable benötigen, die ihren Namen enthält, und sie müssen sich einen Namen für die Variable ausdenken, und sie sind versucht um es nach sich zu benennen und sich zu fragen, was "Eingabe" bedeutet.

  • Es gibt einen großen Unterschied zwischen der Zeit, zu der Sie das Programm schreiben / bearbeiten, und der Zeit, zu der es ausgeführt wird. Bei ihren ersten Übungen müssen sie ziemlich oft daran erinnert werden.

Die Sprache, die ich benutzte, war BASIC, weil es für Anfänger sehr einfach ist. Es ist nicht schwer, zu anderen Sprachen überzugehen, nachdem sie eine Reihe grundlegender Programmierfähigkeiten entwickelt haben.

Wir haben oft ein Programm an die Tafel geschrieben und dann "Computer spielen". Das heißt, setzen Sie ein X neben die aktuelle Anweisung, führen Sie es manuell aus und verschieben Sie das X zur nächsten Anweisung. Variablen waren Rechtecke auf der Tafel, in die wir den aktuellen Inhalt schreiben würden. Wenn eine Aufgabe passierte, löschten wir sie und setzten den neuen Wert ein.

Ein von mir entwickelter Trick war ein simulierter Dezimalrechner mit 1000 Speicherplätzen, die jeweils eine vierstellige Zahl enthalten können. Es gab eine kleine Reihe von "Opcodes" wie Laden des Akkus, Hinzufügen, Speichern, Springen usw. Ich ließ sie kleine Programme in dieser "Maschinensprache" schreiben und dann in einem Schritt, um zu sehen, wie es funktioniert. Konzepte wie Variablen, Springen usw. sind später viel einfacher zu erklären.

Hoffentlich hilft das.


Ich mag diese simulierte Computeridee. Haben Sie eine formale Sprache dafür oder diskutieren Sie die Ideen nur in Pseudocode / einfachem Englisch?
Rei Miyasaka

@Rei: Ich habe (in BASIC) einen Simulator namens Simple geschrieben. Es war alles Tastaturschnittstelle. Der Benutzer kann Werte in den "Speicher" eingeben. dann konnten sie in einem Schritt den Akku und das Gedächtnis an jedem Punkt untersuchen, wenn sie wollten. Ich denke, das war wirklich wichtig, weil es sie dazu brachte , es zu tun und nicht nur darüber zu reden.
Mike Dunlavey

Ah, in Ordnung. Danke, ich sollte so etwas versuchen.
Rei Miyasaka

Dies sollte meiner Meinung nach die Antwort Nummer 1 sein.
Riwalk

12

Meiner Meinung nach ist C ++ ein Overkill als Muttersprache.

Wenn ich Sie wäre und genügend Zeit zur Verfügung hätte, würde ich Konzepte für Programmierung und CS mit Python (oder ähnlichem) einführen.

Wenn die Konzepte klar sind, dh wenn sie mit grundlegenden Datenstrukturen, Indirektion, grundlegenden Algorithmen usw. vertraut sind, würde ich langsam C ++ einführen und sie werden sehr schnell in der Lage sein, sich auf das zu beziehen, was sie bereits gelernt hätten.


2
Ich stimme zu, aber Profis haben normalerweise kein Recht zu wählen, welche Sprache sie unterrichten möchten, geschweige denn TAs.
Rei Miyasaka

4
Ich bin mit Python nicht einverstanden. Ich habe meine erste CS 101-Klasse in C ++ durchlaufen und bin dann zu einer Schule gewechselt, die CS 101 in Python unterrichtet. Die Python-Schüler waren selbst in den Grundlagen so verwirrt, als wir alle die gleiche CS 201-Klasse belegten ... Aber alle C ++ - Schüler waren hervorragend.
OghmaOsiris

@OghmaOsiris, ehrlich gesagt, ich weiß nicht genug über Python, aber vielleicht haben Sie gesehen, dass es sich einfach um die Manifestation einer Selbstauswahl-Tendenz handelte. Immerhin ist C ++ für einige Studenten (besonders für die unerfahrensten Studenten in der Programmierung) eine Hölle der Angst.
Stephan Branczyk

@Oghma Was war die 201 Klasse? Wenn es sich um etwas Niedriges handelt, sollte es wahrscheinlich ein eigener Zweig mit C als Voraussetzung sein.
Rei Miyasaka

1
@OghmaOsiris: Hmmm, ich muss nicht zustimmen, nicht zustimmen, eine andere Erfahrung in meinem universitären Umstieg auf Python teilen, da sich eine erste Sprache meines Wissens als sehr hilfreich erwiesen hat (die erste war Java, kein C ++). Ich denke nicht, dass individuelle Erfahrungen als Schwachpunkt gelten, dass einer besser ist als der andere, das ist ein nie endender Flammenkrieg. Ich könnte jedoch argumentieren, dass Python eine großartige Programmiersprache sein könnte, da es nicht auf Ihre
Kosten

4

Folgendes würde ich raten:

  1. Geben Sie ihnen alle Details, die sie brauchen, um es herauszufinden
  2. Ermutigen Sie sie, die Details zu verstehen
  3. Stellen Sie sicher, dass die Daten bei Bedarf in kompakter Form gespeichert werden

Grundsätzlich würde ich Ihnen raten, ein einzelnes A4-Papier zu erstellen, das alle erforderlichen Details enthält. Eine Art Referenzhandbuch, das alle Details enthält. Einige Bücher können auch helfen, zum Beispiel das Buch "Die Programmiersprache C" hat enorm geholfen, da es alle notwendigen Details in kompakter Form zur Verfügung hatte. Die Komprimierung von Informationen ist Teil der Erstellung des A4-Papiers, das alle Details enthält.


3

Das Programmieren unterscheidet sich wesentlich von den anderen Bereichen, auf die ein Schüler trifft. Viele Studenten vor dem College haben es geschafft, nur im Unterricht aufzupassen und vielleicht ein paar Hausaufgaben zu machen, mit leichten Problemen und den Antworten am Ende des Buches. Es geht mehr darum, Prozesse auswendig zu lernen und sie dann zu erstellen. Es ist auch das erste Mal, dass viele Schüler wiederholt die falsche Antwort erhalten (Syntaxfehler, Logikfehler, Seg-Fehler usw.). Dies kann die Motivation der Schüler bei der Arbeit an Programmen beeinträchtigen.

Um wirklich zu wissen, was mit der Programmierung los ist, müssen sie eine Menge üben. Eine oft übersehene Technik besteht darin, dass sie Pseudo-Code in der jeweiligen Muttersprache als Erstes schreiben. Bitten Sie sie, dies so lange zu erweitern, bis sie eine ziemlich detaillierte Lösung für das Problem gefunden haben. Dann geht es darum, das in echten Code zu übersetzen.


3

Als ich am College war, war ich unter anderem Tutor für den Einführungskurs zum Programmieren. Das Problem, das Sie beschreiben, ist nicht ungewöhnlich. Abhängig von Ihrer spezifischen Rolle können Sie unterschiedliche Ansätze verfolgen.

Erstens würde ich mich an den Professor wenden, der den Kurs mit einem konkreten Feedback darüber unterrichtet, welche Konzepte die Schüler nicht verstehen, wenn dies ein weit verbreitetes Problem ist, das erhebliche Teile der Schüler in der Klasse betrifft, und wenn Sie dazu Zugang haben Sie kann entweder zusätzliche Überprüfungen dieses Materials vornehmen, wenn es in der Amtszeit wieder auftaucht, oder den Lehrplan für künftige Amtszeiten verbessern.

Wenn Sie zusätzlich zu Ihrer Laborzeit einen Diskussionsabschnitt für den Kurs unterrichten, wäre dies eine wunderbare Zeit, um die verwirrenden Aspekte der Vorlesung zu erläutern und sie konkreter zu machen und sicherzustellen, dass alle Grundlagen verstanden werden.

Wenn Sie mit diesen Schülern nur während Ihrer Zeit im Tutoring-Labor arbeiten, können Sie diese Zeit weiterhin verwenden, um den Schülern entweder einzeln oder nacheinander die konzeptionellen Bausteine ​​beizubringen, die sie benötigen, um zu verstehen und ihre Hausaufgaben machen.

Sie fühlen sich im Unterricht so verloren, dass sie nicht einmal wissen, wo sie anhalten und Fragen stellen sollen. Wenn dies der Fall ist, kehren Sie mit ihnen zu den Grundlagen zurück. Wo waren sie im Kurs, als sie das letzte Mal verstanden hatten, was los war? Wenn sie unsicher sind oder "nie" verstanden werden, müssen Sie möglicherweise bis zum Anfang zurückgehen, um hallo Welt zu erklären, ihnen Dinge beizubringen, wie was eine Variable ist, wie der Computer ihre Liste von "Anweisungen" aufnimmt und dies versucht Tun Sie sie in der richtigen Reihenfolge, aber der Computer ist nicht so "schlau" wie wir. Sie müssen also sehr wörtlich sein und die Dinge genau richtig sagen, damit der Computer sie versteht usw.

Das ist eigentlich ein Punkt des Kampfes und der Frustration, den ich in den Nicht-Majors-Programmierkursen oft gesehen habe. Die Schüler schreiben einen Code. Es scheint "ungefähr" zu sein, aber dann werden sie es kompilieren und es gibt einen Fehler, einen sehr kryptischen Fehler. Und sie haben keine Ahnung, was daran falsch ist. Und stundenlang auf ihren Code starren. Dann endlich herausfinden, dass es etwas ist, das trivial erscheint, wie ein fehlendes Semikolon oder eine Klammer an der falschen Stelle. Dann kompilieren sie es noch einmal und es gibt immer noch einen Fehler, es ist etwas anderes. Sie haben einen Variablennamen beim zweiten Mal anders geschrieben. Und so weiter. Also fragen sie einen Freund oder Tutor oder jemanden um Hilfe und sie können direkt antworten: "Oh, füge das einfach hinzu und dann wird es funktionieren." Ihre Erfahrung ist also, dass das Programmieren ein bisschen "mysteriös" ist.

Das ist ein Bereich als Tutor, in dem Sie viel Raum haben, um zu helfen. Abhängig von ihrem Frustlevel habe ich möglicherweise unterschiedliche Ansätze, um herauszufinden, warum ihr Code nicht funktioniert. Wenn sie es irgendwie verstehen, gebe ich ihnen vielleicht Tipps und versuche ihnen dabei zu helfen, es selbst herauszufinden. Aber wenn sie gerade am Ende ihres Seils stehen und bereit sind, frustriert aufzugeben, gebe ich ihnen oft ein paar kostenlose Antworten und versuche dann, ihnen Fragen wie "Verstehst du, warum diese Änderung dein Programm repariert hat?" Zu stellen ? "

Für einige Schüler, insbesondere für Nicht-Hauptschüler, fehlt möglicherweise die methodische Liebe zum Detail, um ein guter Programmierer zu sein oder Spaß am Programmieren zu haben. Sie können sie durch Strategien in der Hand halten, damit sie auf die Details achten und methodisch genug sind, um die Probleme zu lösen, auch wenn es eine Herausforderung für sie ist.

Aber anal-remanent, dass die Schüler ihren Code "richtig" einrücken - so oft verursachen beginnende Programmierer Probleme mit der Verschachtelung und dem Gültigkeitsbereich, weil sie nicht passende geschweifte Klammern oder ähnliches haben, weil sie nicht darauf achten, was unter was verschachtelt ist. Geben Sie ihnen eine Checkliste mit "Dinge, die überprüft werden müssen, wenn Ihr Programm nicht kompiliert werden kann", indem Sie den gesamten Code richtig einrücken und sicherstellen, dass die geschweiften Klammern übereinstimmen. Stellen Sie sicher, dass alle Zeilen in Semikolons enden, insbesondere um die Zeilennummer, in der der erste Fehler angezeigt wird nach oben usw.

Bringen Sie ihnen bei, früh zu kompilieren und häufig zu kompilieren. Schreiben Sie den minimalen Skelettcode (sagen wir Hallo Welt), kompilieren / testen Sie. Fügen Sie ein paar Zeilen hinzu und kompilieren Sie erneut. Es ist viel einfacher, Fehler zu finden, wenn Sie nur einen kleinen Eimer mit Änderungen betrachten, nicht einen großen.

Helfen Sie ihnen zu lernen, wie Sie ein Problem in kleinere lösbare Probleme aufteilen können. Dies ist dasselbe, was wir als professionelle Programmierer tun, um viel schwierigere Probleme zu lösen, die wir nicht lösen können. Sie zerlegen es so lange in Stücke, bis Sie zu etwas gelangen, das Sie entweder zu lösen wissen oder das Sie erforschen können, um zu lernen, wie man löst. "Welche Schritte müssten Sie unternehmen, um zu einer funktionierenden Lösung zu gelangen?" Nun, zuerst brauchst du einen Skelettcode (Hallo Welt). Wissen Sie, wie das geht? Ja, großartig. Wenn wir fertig sind, können Sie damit beginnen! Dann muss es eine Datei als Eingabe lesen. Erinnerst du dich daran, in Kapitel 4 darüber gelesen zu haben? Nicht wirklich? Warum siehst du dir das nicht an, nachdem du die Welt zum Laufen gebracht hast, und sieh dir an, wie weit du davon entfernt bist, das zum Laufen zu bringen, und ruf mich dann zurück und ich ' Ich werde dir noch weiter helfen, wenn du feststeckst. In den ersten Fällen müssen Sie möglicherweise nur eine nummerierte Liste der Schritte erstellen, die zur Lösung des Problems erforderlich sind, damit sie anhand eines Beispiels lernen können, wie das Problem aufgelöst wird.

Wenn sie etwas, aber nicht das gesamte Material im Unterricht erhalten, ermutigen Sie sie, Fragen im Unterricht zu stellen, da neun von zehn Schülern nicht die einzigen sind, die das nicht verstehen, und der Professor wahrscheinlich nur etwas Wichtiges beschönigt hat.

Wenn sie "Stunden" damit verbringen, auf einen Fehler zu starren, es aber nicht herauszufinden, ist das eine Verschwendung ihrer Zeit, sie lernen nicht viel daraus. Oft sind Fehler Einsichtsprobleme, und es ist eine Frage der richtigen Einsicht, um sie zu lösen, und sie haben möglicherweise kein Talent für diese Art von Problemen. Schlagen Sie andere allgemeine Vorgehensweisen vor, wenn Sie nicht weiterkommen: Bitten Sie einen anderen Freund in der Klasse um Hilfe (lernen Sie gegebenenfalls einige Klassenkameraden kennen), beginnen Sie die Hausaufgaben frühzeitig, damit er Zeit zum Stoppen hat, und treten Sie später ein Fragen Sie während der Öffnungszeiten im Tutorlabor nach oder gehen Sie zur Sprechstunde des Professors. Wenn sie an Cramming gewöhnt sind, was sich gut für Auswendiglernen eignet, stoßen sie auf eine Wand der Frustration, wenn sie Es geht bei der Programmierung mehr um Problemlösung als um das Auswendiglernen. Zeigen Sie ihnen, wie sie Syntaxbeispiele aus ihrem Lehrbuch, Stapelüberlauf usw. nachschlagen können. Ermutigen Sie sie, eine Frage in einem privaten Fragenforum zu stellen, falls vorhanden.

Bringen Sie ihnen bei, wie sie eingrenzen können, wo der Code nicht mehr funktioniert. Kommentiere Sachen aus, bis du zu etwas zurückkommst, das läuft, und füge dann langsam Sachen hinzu, bis du wieder diesen Segfault bekommst.

Viele dieser Ideen könnten in Handzettel umgewandelt werden, wenn sie häufig auftauchen. Strategien sind normalerweise der Teil, den Professoren beschönigen - sie verbringen ihre Zeit mit der Syntax, der Semantik des Schreibens von Loops, Arrays, I / O usw. Aber nicht genug Zeit damit, was ich mache, wenn ich es versuche um meinen Code auszuführen und er kompiliert einfach nicht oder stürzt bei mir ab? "

Wenn es um konzeptionelle Dinge geht, insbesondere um Grundlagen wie "Was ist eine Variable?" Oder "Was ist eine Schleife?" Wenn sie dies nicht verstehen, können sie nicht mit dem Rest des Kurses mithalten. In einem vorlesungsbasierten Kurs hat der Professor möglicherweise nicht die Zeit, jede Frage zu beantworten oder zu helfen, dass die Glühbirne für jeden einzelnen Schüler ausgeht. Und das ist ein Grund, warum Tutoren so wichtig sind, um Programmieren zu lernen. Sie benötigen möglicherweise individuelle Anweisungen mit zusätzlichen Analogien, um ein bestimmtes Thema konkretisieren zu können.

Da Sie in C ++ unterrichten, stelle ich mir vor, dass der Unterricht ein abstraktes Thema ist, für das einige Schüler Schwierigkeiten haben, es zu "verstehen". Oft wird die Abstraktion von Klassen anhand von Beispielen gelehrt, die einem zufälligen Objekt der realen Welt entsprechen, wie beispielsweise einem "Geldautomaten", und es werden Analogien zum Objekt der realen Welt hergestellt. Möglicherweise verfügen Sie über Variablen, mit denen Sie verfolgen können, wie viel Geld sich im Geld befindet, und über Methoden, die Regeln ähneln, die dem Geldautomaten mitteilen, wie er auf bestimmte Bedingungen usw. reagieren soll und andere Schüler verstehen einen anderen besser.

Zeichne wann immer möglich Bilder für sie. Wie ein Sequenzdiagramm dessen, was im Laufe der Zeit passiert, damit sie das Gesamtbild dessen sehen, was der von ihnen geschriebene Code tut. Der Benutzer klickt auf diese Schaltfläche. Dann sollte das Programm mit x, y und z antworten. Zeichnen Sie ein Array wie ein Bündel von Postfächern bei der Post, die jeweils nur eine Nummer enthalten können, sowie Zeiger wie Pfeile, die auf die "Adresse" auf der Vorderseite des Postfachs zeigen. Etc.


2

Von all den wunderbaren Möglichkeiten für Programmiersprachen verwendet dieses College C ++ als Intro-CS-Klasse für Nicht-CS-Majors? In den Händen eines talentierten Lehrers ist es vielleicht aus der Ferne denkbar - aber warum ist es so schwer?

Als ich in meinem College-Intro-CS-Kurs "Pascal" gelernt habe, haben wir die ersten drei Wochen mit " Karel the robot " gearbeitet. Dies war eine sehr einfache Sandbox-Logo-ähnliche Programmierumgebung, in der alle grundlegenden Konzepte (einschließlich der Rekursion) gründlich untersucht wurden, bevor sie in Pascal ausgeführt wurden. In "Karel the robot" steuern Sie einen Roboter im 2D-Raum mit einem kleinen Satz einfacher Befehle. Dies gibt den Schülern eine nützliche konkrete Grundlage, auf die sie zurückgreifen können, was als nächstes passiert.

Vielleicht gibt es jetzt modernere Unterrichtsprogrammiersprachen, die die Rolle von "Karel the Robot" ausfüllen? Wahrscheinlich zu spät für Ihre Schüler.


Wir hatten ein ähnliches Programm namens Alice.
OghmaOsiris


@OghmaOsiris Die Alice-Verbindung ist unterbrochen. Das nachfolgende "wurde der URL hinzugefügt.
Zoot

Ja, ohne das wurde das Ende ')' abgeschnitten.
OghmaOsiris


2

Zusätzlich zu dem, was gesagt wurde, gehe ich davon aus, dass Anfänger nur die Oberfläche abkratzen müssen, also passen Sie Ihren Lehrplan entsprechend an, um komplexe Dinge zu vermeiden.

0-geben Sie ihnen ein einfaches Problem (sagen Sie, bewerten Sie einen Ausdruck).

1-geben Sie ihnen Zeit, um es herauszufinden.

2-gib ihnen die Antwort.

3-gehen Sie die Antwort Zeile für Zeile durch

4-Bitten Sie sie, Ihre Antwort mit ihrer Antwort zu vergleichen

5-Bitten Sie sie, die Lektion aus diesem Problem abzuleiten

6 - Fügen Sie dem SAME-Problem einen weiteren Schritt hinzu, beispielsweise eine Bedingung, die eine IF-Anweisung erfordert

7-Wiederholen Sie die obige Aufgabe bei mehreren Problemen. Bis dahin hätten sie die Grundlagen der Sprache und den Umgang mit der Umwelt verstanden. Der wäre bereit für das, was als nächstes kommt.

Ebenfalls,

- Haben Sie ein einfaches Bonus-Problem, das Sie alle 2 Klassen zu Hause ausprobieren können

- Wenden Sie sich an jeden Schüler, um herauszufinden, was ihn davon abhält, noch weiter zu gehen

- Stellen Sie einfaches Nachschlagewerk zur Verfügung, vergessen Sie komplexe Themen und komplexe Bücher

-Häufiges Feedback einholen und nutzen

- Bitten Sie sie, sich auf das nächste Thema vorzubereiten, bevor sie zum Unterricht kommen


2

Was mir geholfen hat, als ich CS 101 durchgesehen habe, war das Erlernen der Logik, bevor ich überhaupt Code angeschaut habe. Wir gingen durch Wahrheitstabellen und Präpositionalrechnung, nur um zu denken, "das ist wahr oder falsch" und nicht "das ist gleich dies oder das".

Das war genau dort, als alles für mich geklickt hat. Als ich herausfand, dass das Programmieren im Grunde genommen nur das Manipulieren von Wahr / Falsch-Werten im Kern ist, wurde alles relativ einfach.

Und das machte es so, dass es egal war, welche Sprache ich benutzte, die Logik ist überall gleich. Die Syntax mag verwirrend sein, aber ich kann Dinge wie "Ok, in Obj CI senden Sie Nachrichten an Klassen wie diese und in C ++ wurden Nachrichten auf diese Weise gesendet. Aber der Algorithmus hat sich überhaupt nicht geändert." etc.


2

Es gibt irgendwo einen ACM- oder IEEE-Artikel, in dem einige Details erläutert werden, warum Anfänger (auch CS-Absolventen, die vor Ort anfangen) sich hinter einen erfahrenen Programmierer setzen müssen, um ihnen beim Codieren eines Problems zuzusehen.

Profis tun sich oft bei schwierigen Problemen zusammen. Den Schülern wird zu oft geraten, dies nicht zu tun. Vorteile des Pairings (abwechselnd auf der Tastatur): 1. Dem Schüler wird sofort mitgeteilt, was er falsch macht. Sofortige Rückmeldung. 2. Wenn der Lernende dem Lehrer zusieht, greift der Lernende Dinge auf, auf die der Lehrer niemals hätte hinweisen wollen.

Anstatt einen Schüler schlechte Praktiken entwickeln zu lassen, werden sie im Keim erstickt. (Ich würde hier # 1 mit # 2 tauschen und den Schüler den Instructor / TA FIRST sehen lassen. )

Das Unterrichten von CS mit einem statischen Satz von PowerPoint-Folien eignet sich nicht gut für den zeitlichen Prozess des Programmschreibens. (Zugegeben, es gibt Tricks, mit denen Sie Funktionen zeilenweise erweitern können, aber sie sind normalerweise umständlich.)

Die Lernenden müssen wissen, wo sie mit dem Schreiben beginnen und wo sie anhalten und kompilieren müssen. Unsere Gehirne sind meistens so verdrahtet, dass sie von links nach rechts von oben nach unten lesen, aber ein Programm ist wie ein Ganzes. Wählen Sie Ihr eigenes Abenteuerbuch, das auf einer einzigen Seite zusammengepfercht ist!

Zu oft kopiert ein Anfänger ein ganzes Programm und kompiliert es dann. Sogar ein Fachmann könnte einen ersten Sprung in diese Richtung machen, bevor er merkt, dass er alle Funktionen leer lassen und das Programm kompilieren und dann iterativ zu einem funktionierenden Gerüst hinzufügen sollte.

Ebenfalls verwandt ist die lächerliche Idee, dass CS ohne Computer und nur mit Bleistift und Papier unterrichtet werden sollte. Ich frage mich, wie viele angestellte Programmierer dies wirklich für die beste Art halten oder ob es nur das ist, was CS-Lehrer tun, weil sie selbst nicht gerne mit Computern arbeiten? Jeder Versuch, einen Computer aus dem Bild zu entfernen, ist gemein. Auf diese Weise macht das Programmieren weniger Spaß und ist weniger interaktiv als es sein sollte. Wir haben die Tage hinter uns, in denen wir Daten in eine Lochkarte eingegeben und geduldig gewartet haben. Heutige professionelle Entwickler sind Fans der sofortigen Befriedigung. Zum Glück sind es auch die meisten Studenten.

Offensichtlich ist das Zeichnen von hübschen Designs mit Bleistift und Papier vor und während des Entwicklungsprozesses ein leistungsstarkes Werkzeug sowohl für professionelle Programmierer als auch für Anfänger. So wie die "hands on keyboard" -Zeit sollte auch das Pairing verbracht werden! Vielleicht ist es hier sinnvoll, den Schüler die erste Runde versuchen zu lassen, bevor er den Lehrer anschaut, auch wenn es sich wahrscheinlich lohnt, den wirklichen Denkprozess des Lehrers zu betrachten.

Schließlich sind die Tastenkombinationen und Bearbeitungstricks, die der professionelle Entwickler einsetzt, kein "Lärm" für das Lernen des Schülers. Am wichtigsten ist, dass sie den Schüler einbeziehen und interessieren. Zweitens sensibilisieren sie für gemeinsame Entwicklungsbedürfnisse. Darüber hinaus sind die grundlegendsten dieser Praktiken oft einfach auszuführen, aber anfangs nicht offensichtlich. Ein junger Student der Holzwerkstatt kann leicht lernen, wie man einen Nagel mit der Klaue eines Hammers entfernt, aber in den meisten Fällen muss man ihm zuerst sagen, wofür die Klaue ist. Einige extrem einfach zu handhabende Dinge sind einfach nicht trivial zu lernen, ohne dass sie unterrichtet werden. Auch professionelle Entwickler vergessen diese "Tricks" immer wieder und profitieren von Refactoring-Tools wie Resharper, um redundanten oder unerreichten Code usw. zu entfernen.


1
Übrigens, wenn mich jemand auf den Titel dieses Artikels verweisen könnte, wäre ich dankbar!
David

2

Computerprogrammierung ist oft einer der ersten Kurse, in denen die kognitiven Fähigkeiten der Synthese für eine bestandene Note erforderlich sind. Es ist sehr schwierig, diese Fähigkeit jemand anderem zu vermitteln. Sie können alle ihnen zur Verfügung stehenden Komponenten und ihre Funktionsweise erläutern. Sie können eine Vielzahl von Beispielen anführen, wie andere Leute die Synthese verwendet haben, um diese Komponenten zu einem nützlicheren Ganzen zu kombinieren, aber es gibt nur so viel, was Sie tun können, ohne dass der Schüler etwas "klickt".

Nach meiner Erfahrung ist es die Fähigkeit der Synthese, die sich am häufigsten Leuten entzieht, die nicht programmieren. Sie haben ein perfektes Verständnis der Teile, wie Variablen, Funktionen und Schleifen, aber sie stellen Fragen wie: "Ich verstehe, warum es funktioniert, aber woher wussten Sie, dass Sie dort eine Schleife platzieren müssen?" Sie müssen nur üben, bis Sie es bekommen.


2

Um Aaron Hillegass falsch zu zitieren, erinnern Sie sie daran, dass sie nicht dumm sind, es ist nur schwer. Das Programmieren ist schwer zu üben, es ist eine ganz andere Art zu denken, und obwohl sie mit den Grundlagen zu kämpfen haben, sind sie sich wahrscheinlich ziemlich bewusst, und es wird sie ziemlich verzweifeln.

Ich sage dies als jemand, der seinen ersten CS-Kurs ebenfalls nicht bestanden hat. Ich hatte schon viel vorher programmiert und alle Konzepte (VB, ja Baby) erhalten, aber C ++ würde einfach nicht auf mich klicken. Am Ende bin ich auf das Wesentliche zurückgekommen und habe es von dort aus bearbeitet, dann hat es geklickt, aber wenn jemand gesagt hätte: "Du bist kein Idiot, das ist nur schwer", hätte es mir das Leben leichter gemacht.


0

Sie sagten: "Diese Schüler können vielleicht Mathematik, Biologie oder Physik lernen, aber diese Techniken funktionieren nicht, wenn es um Programmierung geht."

Es gibt einen Grund dafür: Programmierung erfordert etwas, was andere Disziplinen nicht unbedingt erfordern: Kreativität und ... Fantasie . Die Fähigkeit, sich "Dinge bei der Arbeit vorzustellen". Ich persönlich habe festgestellt, dass eine solche Anforderung (natürlich mit allen Ausnahmen) von Personen der technischen Schule (insbesondere Elektronik und Elektromechanik) gegeben ist: Sie müssen sich "elektrische Flüsse vorstellen und wie sie sich gegenseitig steuern", da sie dies nicht können sieh sie dir an!) als von "pure science" (wo alles so aussieht, als würde man sich um Mathe drehen).

In den letzten Fällen muss der "visuellen Wahrnehmung" geholfen werden. Es ist wichtig, sich nicht nur auf den Begriff und den Text zu konzentrieren (Typ -> Kompilieren -> Anzeigen, dass die Fehler nicht funktionieren, wenn Sie die Fehler nicht "lesen" können), sondern auch eine Möglichkeit bereitzustellen, die Dinge zur Entwurfszeit zu visualisieren ( durch Simulation der Maschinenvorgänge: Bereiten Sie sich mit einer weißen Tafel und einer Reihe von farbigen Post-It-Etiketten vor und während der Ausführung.

Damit dieser letzte Teil erfolgreich ist, muss eine grundlegende Vorstellung von Betriebssystemen und "wie Programme in eine Maschine hineinlaufen" (und was diese Maschine tatsächlich ist) gegeben sein. Und eine nicht einschüchternde IDE muss gegeben sein. Normalerweise habe ich einen "angepassten Code-Block" mit vielen Dingen entfernt, um "nicht abzulenken". Der Begriff des Projekts aus Quellen zur Erzeugung von Objekten, die mit der Bibliothek verknüpft werden sollen, muss gegeben werden, bevor über eine Sprache gesprochen wird.

Die traditionelle C ++ - Hallo-Welt benötigt einen Einstiegspunkt und ein Ausgabegerät. Der Student muss bereits damit vertraut sein. Der Erfolg solcher Kurse hängt von den ersten Tagen ab. Sie müssen eine Visualisierung dessen anregen, was in einem Computer passiert, damit sie verstehen, was Programmierung ist.
Der Rest ist Syntax (Wissenschaft) und Abstraktion (Fantasie)

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.