Dienstag, Juni 26, 2007

Kann man Programmieren lernen?

Kann man das Programmieren erlernen? Sicher! Aber kann es jeder erlernen?

Ich bin über einen Blog auf einen interessanten Artikel gestossen ("The camel has two humps (working title)" von Saeed Dehnadi und Richard Bornat). Darin berichten die Autoren von den vielen vergeblichen Versuchen, die es gegeben hat, das Programmieren erfolgreich zu unterrichten. Denn zwischen 30 und 60 Prozent der Studierenden an Universitäten und Hochschulen scheitern regelmäßig am ersten Programmierkurs. Bei allen Bemühungen: Die hohen Durchfallquoten scheinen unabänderlich zu sein.

Die Autoren behaupten, die Programmierbegabung mit einem Test ermitteln und damit vorhersagen zu können, ob ein Kandidat bzw. eine Kandidatin das Programmieren erfolgreich erlernen wird. Ich halte die durchgeführte Studie für methodisch kritisch, darum sind die Aussagen und Spekulationen mit großer Vorsicht zu genießen. Dennoch lassen Sie uns einmal anschauen, was Dehnadi und Bornat da untersucht haben.

Die beiden gehen davon aus, dass sich dem Programmierunerfahrenen, dem Novizen, beim Umgang mit imperativen Sprachen drei Hürden stellen -- und zwar in der angegebenen Reihenfolge:

  • Zuweisungen und Zuweisungsfolgen

  • Rekursion und Iteration

  • Nebenläufigkeit


In einem Test stellen Dehnadi und Bornat den Studierenden vor dem ersten Kontakt mit einer Programmiersprache einige Fragen zu Zuweisungen bzw. zu Folgen von Zuweisungen; sie testen also lediglich die erste Hürde. Die Probanden müssen via Multiple Choice erraten, welche Werte nach den Zuweisungen gültig sind.

Nach den Tests unterscheiden Dehnadi und Bornat drei Gruppen. Die Annahme ist, dass sich die Probanden ein mentales Modell von der Arbeitsweise von Zuweisungen machen. Versuchen die Probanden, sich bei der Suche nach Lösungen strikt an Regeln zu halten, seien die Ergebnisse auch noch so unsinnig oder seltsam? Oder versuchen sie, etwas sinnvolles aus jeder einzelnen Aufgabe zu holen und entsprechend zu antworten? Oder verweigern sie die Antwort, da diese Zuweisungen wenig Sinn zu machen scheinen? Eine Gruppe, die Konsistenten, beantwortet die meisten bis alle Fragen mit dem gleichen mentalen Modell; das sind die, die sich einer Maschine gleich an ein Regelwerk halten. Die Inkonsistenten sind die, die bei verschiedenen Fragen verschiedene mentale Modelle anwenden; es sind die, die versuchen, jede Zuweisungsaufgabe für sich genommen sinnhaft zu beantworten. Die Blanken verweigern die Antwort auf die meisten oder alle Fragen; sie mögen nicht rätseln, was diese ganze Kryptik für einen Sinn machen soll.

Obwohl jede der drei Gruppen eine absolut vernünftige Strategie für ihr Handeln verfolgt, die durchaus als intelligent bezeichnet werden kann, kommt lediglich das Vorgehen der Konsistenten der Arbeitsweise eines Rechners gleich. Ein Rechner befolgt Regeln der Ausführung und wendet diese stur an. Ob die Ergebnisse Sinn machen oder nicht, hinterfragt ein Rechner nicht.

Interessant ist nun, wie sich die Probanden im Laufe der Zeit entwickeln. Alle belegten einen Programmierkurs und schlossen den Kurs mit einer Prüfung ab. Dehnadi und Bornat wollen nun festgestellt haben, dass einzig die Konsistenten zu bemerkenswert guten oder mittelmäßigen Programmierern werden. Die Inkonsistenten und Blanken bleiben bemerkenswert programmierschwach. Es will fast so scheinen, als lege der frühe Test als Novize die Zukunft in Ketten: einem Inkonsistenten bzw. Blanken scheint der Eintritt in die Programmierwelt verwehrt. Die Autoren schreiben:


[...] it is extremely difficult to teach programming to the inconsistent and blank groups. It might be possible to teach them, if we concentrated on trying to persuade them to see a programming language as a system of rules ([...]).


Vor diesem Hintergrund scheint es besonders fragwürdig, so die Autoren, Java als erste Programmiersprache zu unterrichten. Java wird nicht über ein einfaches Regelwerk definiert, sondern über einen mehrere Hundert Seiten umfassenden Standard.

Mich machen diese Ergebnisse nachdenklich. Was sind die Konsequenzen daraus? Sollten manche Studierenden lieber die Finger von der Informatik lassen, weil ihre Hirne nicht so regelbasiert wie Computer tickern? Andererseits: Nicht jeder Software Engineer muss ein Programmierstar sein. Oder haben wir schlicht noch nicht das richtige Unterrichtsmodell für Programmiersprachen gefunden? Ich hoffe sehr, dass dieser Untersuchung weitere Studien folgen, die besser und erkenntnisreicher sind.

Kommentare:

Lars hat gesagt…

Die Studie bestätigt ein wenig, was ich immer schon beobachtet und vermutet habe -- einigen Menschen fällt der Zugang leichter als anderen. Und das scheint nicht unbedingt mit einem grundsätzlich technischen Verständnis zu tun zu haben.

Der langrfristige Ausweg muss aber m.E. anders aussehen: wir müssten Bedien- und Programmiermodelle erfinden, die auch den "Blanks" und "Inconsistents" eingängig und zugänglich sind.

Sonst lehren wir das Programmieren demnächst schon im Kindergarten, damit sich frühzeitig geeignete Denkstrukturen ausprägen können...

Lars

Christoph hat gesagt…

Interessant, jedoch denke ich, dass es noch mehr mit der Motivation zu tun hat, mit der ein Student an die Arbeit heran geht. In meinem Studium sind mir immer wieder Studenten begegnet, welche einfach keine Lust hatten zu programmieren.
Das liegt aber auch daran, dass diese eben nie ein Erfolgserlebnis beim Programmieren hatten. Ich selbst hatte am Anfang meine Schwierigkeiten, jedoch kam mit der Zeit der Erfolg und mit dem Erfolg auch die Lust weiterzumachen und neues auszuprobieren.
Ich denke also nicht, dass man unbedingt wie eine Maschine denken muss. Es reicht, wenn derjenige der einem das Programmieren seine Arbeit gut macht, was eben nicht immer der Fall ist und so konzentriert dieser sich eben mehr auf die "Maschinendenker" da diese leichter zu unterrichten sind.

PS: Danke, dass man sich hier die Wortbestätigung vorlesen lassen kann. Ich schaffe es doch jedes Mal da die falschen Buchstaben zu lesen.

dh hat gesagt…

Die Autoren bringen es in dem Zitat selbst auf den Punkt: Es sei mühsam, möglicherweise vergeblich, den Inkonsistenten oder Blanken das Programmieren beizubringen. Ein wenig überspitzt: Wer kein Konsistenter ist, dem wird die Welt der Programmiersprachen auf ewig ein Rätsel bleiben. Wenn dem so wäre, dann würde die Motivation wenig daran ändern.

Ist Konsistenzverhalten nur in Bezug auf die Informatik ein entscheidendes Erfolgskriterium oder ist das nicht eine Bedingung für viele andere Fächer? Muss man nicht ebenso konsistent regelbasiert denken können in der Physik, Chemie, Biologie, Germanistik etc. um erfolgreich zu sein? Oder anders herum: Kann man gut in Mathe, Maschinenbau, Elektrotechnik etc. sein und dennoch unfähig zu programmieren? Meinen Beobachtungen zufolge ja. Woran liegt das? Würden sich etwa gute Ingenieure im Vergleich zu guten Programmierern als "Inkonsistente" herausstellen? Das wiederum wage ich zu bezweifeln!

Je länger ich darüber nachdenke, desto mehr frage ich mich, was die Autoren da wirklich untersucht haben. Wie erwähnt: Die Studie ist qualitativ nicht sehr hochwertig.

Ein interessanter Gedanke kommt von Lars: Wie müssen Bedien- und Programmiermodelle aussehen, dass sie es den "Inkonsistenten" und "Blanken" nicht unnötig schwer machen?

Lars hat gesagt…

"Ist Konsistenzverhalten nur in Bezug auf die Informatik ein entscheidendes Erfolgskriterium oder ist das nicht eine Bedingung für viele andere Fächer?"

Ich bringe mal eine gewagte These: Im Prinzip schon, helfen würde sie jedenfalls. Aber ich vermute, dass in vielen anderen Disziplinen eine gewisse Unschärfe eher tolerabel ist.

Bei der statischen Auslegung einer Brücke kann ich mich bei Unsicherheit immer auf die sichere Seite zurückziehen. Zudem gibt es viele typischerweise ähnliche Brücken, an denen ich meine Auslegung durch Analogie prüfen kann.

Der Computer ist leider komplett gnadenlos. Ein falsches Zeichen reicht, damit das Programm von funktionsfähig zu nutzlos wechselt.

Das erinnert mich den fehlenen Meter Schiene von den vielen Millionen Metern die rumliegen: Statistisch gesehen fällt der eine Meter nicht auf, wenn der Zug drüber fährt passiert aber trotzdem der worst case.

Ich gebe zu, das diese informatische Pedanterie mir auch manchmal die Motivation vermiest. Ein menschlicher Gegenüber hätte längst begriffen, wie meine Idee funtkionieren soll, während dieser schwachsinnig stupide Compiler noch immer an fehlenden Klammern rummeckert :-O

Lars

P.S. Auch ich gebe immer wieder falsche Zeichen bei der Bestätigung ein und bin froh festzustellen, dass ich mit meiner "Leseschwäche" offensichtlich nicht allein bin. Die Tatsache, dass es auch die Menschen nicht richtig können macht mich allerdings zuversichtlich, dass es ein Computer erst recht nicht hinbekommt.

Andreas hat gesagt…

Ich wage die Studie auch ein wenig zu bezweifeln und möchte an dem Motivationspunkt anknüpfen!
Sicherlich mag es sein, dass manche Personen fürs Programmieren bessere Voraussetzungen mitbringen als andere. Dennoch ist die Motivation und der Spaß für eine Sache meiner Meinung nach DIE Grundvoraussetzung schlecht hin. Deshalb finde ich es enorm wichtig Lehrveranstaltungen möglichst so zu gestalten, dass genau dieser Wissenswille bei den Personen selbst geweckt wird. Programmieren lernt man ja nicht von heute auf morgen und es kommt auch viel von Erfahrungswerten! Die Erfahrung bekommt man aber nur, wenn man sich immer und immer wieder mit der Matertie und verschiedenen Problemstellungen befasst.
(Wie oft kommt man beim Programmieren nach ewigem grübeln und überlegen zu einem AHA-Effekt!)

Ein Student muss auf jeden Fall ein Maß an Eigenmotivation mitbringen!!! Aber dann ist es auch Aufgabe der Lehranstalt dafür zu sorgen Themen ansprechend und möglichst anschaulich zu erleutern.

Man könnte auch hier sagen:
Das Zeil ist es für die Aufgabe der "Programmierlehre" eine richtige Art der Beschreibungs-/Lehr- Form zu entwickeln;-)...

MfG, Andreas Maier

felix hat gesagt…

Mal eine Gegenfrage:
Müssen wir denn noch wie Maschinen denken?
Ist nicht "Language Oriented Programing" bald angesagt. Grundaussage: Früher war die Rechenzeit teurer als die Zeit des Programmierers --> Programmierer sollte wie eine Maschine denken.
Heute ist das ganze umgekehrt.

Felix

Lars hat gesagt…

Felix: gibt es zu dieser Aussage eine Referenz bzw. Zitat oder stammt die so von Dir aus dem Ärmel geschüttelt ?

Lars

dh hat gesagt…

Ich denke es geht (auch in der Studie) weniger um Maschinendenken, als denn um die Fähigkeit, konsistent in der Anwendung von Regeln zu bleiben und so denken zu können. Dieser formale Aspekt wird so schnell nicht aus der Informatik verschwinden, egal welches Paradigma gerade in ist.

Albert Gnandt hat gesagt…
Dieser Kommentar wurde vom Autor entfernt.
Alexander hat gesagt…

Meiner meinung und Erfahrung nach ist Programmieren nichts das man in ein Paar Stunden, Tagen, Wochen oder Monaten lernen kann. Um Richtig gut Programmieren zu können hilft nur eines, Programmieren, Programmieren, Programmieren ... Die Studie, beziehungsweise der Test der durchgeführt wurde zeigt nur die Veranlagung zum schnellen erlernen einer Programmiersprache. Sobald sich aber jemand richtig damit auseinandersetzt und sich über einen langen Zeitraum damit beschäftigt kann ein Blank der viel Programmiert locker an einem Konsistenten der das eben nicht tut vorbeiziehen. Man lernt eine neue Fremdsprache ja auch nicht wenn man sie nicht benutzt und vor allem nicht in einem Halben Jahr.
Aber vor allem finde ich den Ansatz der an Hochschule und Universitäten zum vermitteln einer Programmiersprache verwendet wird nicht sonderlich Hilfreich um wirklich etwas zu lernen, es sollte mehr Abstrahiert werden und nicht alles auf eine bestimmte Programmiersprache ausgerichtet sein, zumindest nicht zu beginn. Die Strukturen sind ja sowieso überall die selben (if, else, for, while, ...)

Alexander

Albert Gnandt hat gesagt…
Dieser Kommentar wurde vom Autor entfernt.
Nbnds hat gesagt…

Ich finde man soll das "Programmieren können" (Problemlösen), und "Programmiersprache können" (das Werkzeug), trennen. Bücher beinhalten oft hierzulande mehr Beispiele als aufgaben, und an beisielen wird man nicht zum guten programmierer, weil, man bestenfalls Lösungsmuster lernt, nicht aber das selbstständige Problemlösen unter gegebenen Restriktionen.

Elvis hat gesagt…

wer jetzt trotzdem noch programmieren lernen will: http://www.c-howto.de

Silke hat gesagt…

Hm, ich schätze der Test nützt einem nicht viel, wenn man programmieren lernen muss, oder will.