Computerprogrammierung für jedermann
Computerprogrammierung für jedermann
Dies ist der Haupttext eines Förderantrags, den wir im Januar 1999 an DARPA geschickt haben. Im August 1999 haben wir eine überarbeitete Version des Antrags eingereicht.
Bitte schauen Sie sich die EDU-SIG-Homepage (Python in Education Special Interest Group) an. Dort wird der aktuelle Projektstatus beschrieben und/oder diskutiert und Sie finden Verweise auf weitere Ressourcen.
Hinweis: Ich habe eine Änderung am Text des Antrags vorgenommen: Auf Wunsch einiger Befürworter anderer Sprachen habe ich eine Sprachensvergleichstabelle zurückgezogen, die sehr persönliche und manchmal unbegründete Meinungen über andere Sprachen enthielt. Die Tabelle wurde aus dem Kontext gerissen und auf eine Weise verwendet, die einige als anstößig empfanden. (Nicht die gesamte Tabelle ist umstritten, aber es scheint ratsamer, direkte Sprachvergleiche nicht ohne wesentlich mehr Dokumentation anzustellen.)
Innovative Behauptungen
In den siebziger Jahren fragte sich Xerox PARC: "Können wir einen Computer auf jedem Schreibtisch haben?" Mitte der neunziger Jahre war diese Frage bejaht worden. Aber all diese Computer haben ihre Benutzer nicht unbedingt gestärkt. Die heutigen Computer sind oft unflexibel: Der durchschnittliche Computerbenutzer kann oft nur eine begrenzte Anzahl von Optionen ändern, die über einen "Assistenten" (ein hochtrabendes Wort für ein vordefiniertes Dialogfeld) konfigurierbar sind, und ist für alles andere von erfahrenen Programmierern abhängig.
Wir stellen uns nun eine Folgefrage: "Wie sähe die Welt aus, wenn Benutzer ihren eigenen Computer programmieren könnten?" Wir freuen uns auf eine Zukunft, in der jeder Computerbenutzer in der Lage sein wird, die "Motorhaube" seines Computers zu öffnen und die Anwendungen darin zu verbessern. Wir glauben, dass dies die Natur von Software und Softwareentwicklungswerkzeugen grundlegend verändern wird.
Wir vergleichen die Massenfähigkeit, Software zu schreiben und zu modifizieren, mit der Massenalphabetisierung und erwarten, dass ebenso grundlegende Veränderungen in der Gesellschaft eintreten könnten. Da die Hardware inzwischen schnell und billig genug ist, um eine massenhafte Computerbildung zu ermöglichen, glauben wir, dass die Fähigkeit des durchschnittlichen Computerbenutzers, Software zu erstellen und zu modifizieren (anstatt sie nur zu installieren und zu nutzen), die nächste große Veränderung ermöglichen wird – und wir betrachten dies als unsere nächste Herausforderung.
Die Open-Source-Bewegung behauptet, dass die Peer-Review von Software durch Tausende die Qualität von Software erheblich verbessern kann. Der Erfolg eines Betriebssystems wie Linux deutet darauf hin, dass diese Behauptung einen Wert hat. Wir glauben, dass der nächste Schritt, nämlich *Millionen* von Programmierern, eine Veränderung anderer Qualität bewirken wird – die reichliche Verfügbarkeit von *personalisierten* Softwareprodukten.
Die für diese neue Betrachtungsweise der Programmierung benötigten Werkzeuge werden sich von den Werkzeugen unterscheiden, die derzeit professionellen Programmierern zur Verfügung stehen. Wir beabsichtigen, sowohl das Schulungsmaterial als auch die verfügbaren Entwicklungswerkzeuge erheblich zu verbessern. Beispielsweise sollten nicht-professionelle Programmierer nicht befürchten müssen, dass ein kleiner Fehler ihre Arbeit zerstören oder ihren Computer unbrauchbar machen könnte.
Folgende Faktoren werden den Erfolg unseres Projekts beeinflussen
- Programmiersprache
- Entwicklungswerkzeuge
- Schulungsmaterialien
- Community-Aufbau
Aus praktischen Gründen schlagen wir die Verwendung einer bestehenden Programmiersprache vor. Der Entwurf und die Implementierung einer neuen Sprache können mehrere Jahre dauern, und wir haben eine ausgewählt, die gut genug ist, um mit den anderen drei Punkten zu beginnen. Unsere Wahl ist Python, eine fortgeschrittene Skripting- und Prototyping-Sprache. Es gibt genügend (anekdotische) Beweise dafür, dass Python für Menschen, die (fast) computeranalphabetisch sind, leicht zu erlernen ist. Es gibt derzeit keine Entwicklungs-Tools oder Schulungsmaterialien für Python, die für ein solches Publikum geeignet sind. Wir werden die Entwicklung dieser Werkzeuge zum Hauptschwerpunkt unserer Aufgabe machen. Wir wollen eine Community aufbauen, die sich speziell auf unsere Werkzeuge und Materialien konzentriert, damit wir das notwendige Feedback sammeln können; es gibt bereits Interesse an der Verwendung von Python durch "Neulinge" in der bestehenden Python-Community (geschätzt 20.000 Programmierer, und sie wächst schnell), so dass wir erwarten, dass dies ein fruchtbarer Einsatzbereich sein wird.
Technische Begründung und Ansatz
1. Einleitung
Im dunklen Zeitalter besaßen nur die Mächtigen oder die sehr Reichen (und ausgewählte Experten) Lese- und Schreibfähigkeiten oder die Fähigkeit, diese zu erwerben. Es lässt sich argumentieren, dass die Alphabetisierung der breiten Bevölkerung (obwohl immer noch nicht 100%ig!) zusammen mit der Erfindung der Drucktechnologie eine der emanzipatorischsten Kräfte der jüngeren Geschichte war.
Wir treten gerade in das Informationszeitalter ein, und es wird erwartet, dass die Computertechnologie den Druck bald als dominante Form der Informationsverteilungstechnologie ablösen wird. Etwa die Hälfte aller US-Haushalte besitzt bereits mindestens einen Personal Computer, und diese Zahl wächst weiter.
Während heutzutage viele Menschen einen Computer benutzen, sind nur wenige davon Computerprogrammierer. Nicht-Programmierer sind in ihrer Computernutzung nicht wirklich "gestärkt": Sie sind darauf beschränkt, Anwendungen so zu nutzen, wie Programmierer sie für sie bestimmt haben. Man muss kein Visionär sein, um zu sehen, dass dies viel Kummer verursacht.
Eine noch radikalere Veränderung ist die Einführung von Computing und Kommunikation, die in Wohnungen und Büros eingebettet sind. Die Zahl der Geräte, die programmierbare Elemente enthalten werden, wird in den kommenden Jahren dramatisch ansteigen. Wir müssen lernen, wie wir diese Programmierbarkeit den Benutzern auf sinnvolle Weise zugänglich machen und es Nicht-Programmierern erleichtern, diese Geräte zu steuern und zu programmieren. Die Benutzer müssen von Anfang an befähigt werden.
In dieser "Expedition in die Zukunft" wollen wir die Vorstellung erforschen, dass jeder in der Schule *ein gewisses Maß* an Computer-Programmierkenntnissen erwerben kann, so wie jeder lesen und schreiben lernt.
Insbesondere interessieren wir uns für die Entwicklung von Schulungsmaterialien, Programmiersprachen und Entwicklungswerkzeugen. Wir betonen, dass dies kein Versuch einer evolutionären Verbesserung der derzeit verwendeten Materialien und Werkzeuge ist; wir glauben, dass ein radikal neuer Ansatz notwendig ist. (Allerdings werden wir aus praktischen Gründen mit der Verwendung einer bestehenden Sprache beginnen.)
Für Programmiersprachen und Umgebungen gibt es viele Herausforderungen, wenn sie von einem Massenpublikum genutzt werden. Betrachten Sie ein Beispiel: Wenn jeder ein Programmierer ist, werden schlechte Programmierer im Überfluss vorhanden sein. Dies erfordert ein Überdenken der grundlegenden Eigenschaften von Programmiersprachen und Entwicklungswerkzeugen. Wir glauben auch, dass es keine klare Trennung zwischen Werkzeugen für Profis und Werkzeugen für den Bildungsprozess geben sollte – genauso wie professionelle Schriftsteller dieselbe Sprache und dasselbe Alphabet wie ihre Leser verwenden!
2. Die Vision
Im Konferenzgespräch zu diesem BAA wurde Folgendes gesagt: "Vermutlich werden diese Expeditionen [...] ganz neue Zukünfte für das Feld erfinden, und wir erwarten, dass Benutzer beteiligt sein werden und dass wir einige Auswirkungen haben werden, so dass die Benutzer möglicherweise in sehr anderen Rollen agieren als heute." Wir haben eine Vision, die den Benutzern tatsächlich eine sehr andere Rolle geben wird.
Unsere Vision ist, dass eines Tages in nicht allzu ferner Zukunft das Programmieren von Computern bereits in der Grundschule gelehrt wird, genau wie Lesen, Schreiben und Rechnen heute. Wir meinen wirklich Computer-*Programmierung* – nicht nur Computernutzung (die bereits Teil des Bildungssystems unseres Landes ist); und wir meinen ernsthafte Programmierung, nicht nur das Herumspielen mit Turtle-Grafiken (obwohl dies in niedrigeren Klassen ein gutes Lehrmittel ist). Natürlich würden die meisten Schüler keine versierten Anwendungarchitekten werden, so wie die meisten Menschen, die schreiben lernen, keine Bestsellerautoren werden – aber Lese- und Schreibkenntnisse sind für jeden nützlich, und so (in unserer Vision) sind allgemeine Programmierkenntnisse.
Wir sehen bereits einige Anzeichen dafür, dass dies ein realistisches Ziel ist. Zum Beispiel berichtet das Alice-Projekt [Alice], dass Studienanfänger und sogar Teenager ohne vorherige Programmiererfahrung innerhalb weniger Tage Programme zur Steuerung virtueller Welten schreiben. Vielleicht nicht zufällig verwendet Alice eine Version der fortschrittlichen Skriptsprache Python [Python] [Lutz] [Watters], die von einem der Autoren des vorliegenden Antrags entwickelt wurde.
Erfahrungen mit der Logo-Programmiersprache [Logo] und ähnlichen Sprachen (z. B. LogoMation von Magic Square [LogoMation]) sind ein weiterer Hinweis darauf, dass jüngere Menschen programmieren lernen können. Vielleicht können diese als Vorläufer von Alice betrachtet werden, die ihr Alter durch die Verwendung von 2D anstelle von 3D-Grafiken zeigen (obwohl Alice weniger Wert auf das Erlernen der Programmierung legt als Logo und LogoMation).
Stellen Sie sich vor, Benutzer könnten ihre eigenen Änderungen an der Software vornehmen, die beispielsweise in ihrem GPS-Empfänger oder Handheld-Organizer eingebettet ist, anstatt (oder zusätzlich zu) Upgrades von einem Anbieter herunterzuladen oder "fertige" Add-On-Anwendungen von Drittanbietern zu kaufen. Dies würde die Benutzer erheblich befähigen, ihr Leben zu verbessern, indem sie ihre persönlichen Werkzeuge so programmieren, dass sie genau das tun, was sie brauchen.
Die kürzlich populäre Open-Source-Bewegung [OpenSource] verspricht, die Qualität wichtiger Softwarepakete durch die Peer-Review von Tausenden sowie die Möglichkeit für Programmierer, "ihren eigenen Juckreiz zu kratzen" (d. h. die Software geringfügig zu verändern, das nur eine Person interessiert) zu verbessern. Wir erwarten, dass der Übergang von Tausenden zu Millionen die Natur des Softwareentwicklungsprozesses erneut verändern wird. Das "Juckreizkratzen" wird in dieser Größenordnung wichtiger (und machbarer) werden, während die Massen-Peer-Review aufgrund abnehmender Erträge weniger wichtig wird (die Logistik der Integration von Fehlerbehebungen aus Tausenden von Quellen ist bereits eine formidable Aufgabe). Aber die meiste aktuelle Software, ob Open Source oder nicht, ist zu komplex, als dass jemand seinen Juckreiz kratzen könnte, ohne zuerst erhebliche Anstrengungen und Zeit in das Verständnis der verwendeten Software zu investieren. Wir sind an Änderungen des gesamten Softwareentwicklungsprozesses interessiert, die dies ebenfalls beheben – insbesondere an Entwicklungswerkzeugen.
Warum eine "allgemeine" Programmiersprache lehren? Es ist allgemein bekannt, dass es eine gewisse Dichotomie zwischen "prozeduralen" Programmiersprachen einerseits und "deklarativen" Sprachen andererseits gibt. Für diese Diskussion verwenden wir den Begriff "prozedural" in einem breiten und lockeren Sinne, um funktionale Programmiersprachen und möglicherweise sogar logische Programmiersprachen einzuschließen, inwieweit sie als allgemeines Programmierwerkzeug verwendbar sind. Turing-Vollständigkeit ist hier das Schlüsselkonzept.
Die "deklarative" Kategorie enthält dann alles andere, von der Syntax von Befehlszeilenargumenten bis hin zu E-Mail-Headern und HTML. Der unterscheidende Faktor hier ist das Vorhandensein eines relativ "engen" Anwendungsbereichs. In diese Kategorie würden wir auch Dinge wie die "Assistenten" von Microsoft (die eigentlich nur Sequenzen vordefinierter Dialoge sind, die durch einfache Flussdiagramme verbunden sind) und die Bedienelemente und Knöpfe eines Mikrowellenherds oder eines Kernreaktors einordnen.
Ein typisches Merkmal deklarativer Sprachen ist, dass sie eine ausgezeichnete Kontrolle im Anwendungsbereich bieten, für den sie bestimmt waren, und (fast) keine Freiheit in unvorhergesehenen Bereichen. HTML hat beispielsweise keine inhärente Fähigkeit zur bedingten Einbeziehung von Text oder zur Variablenexpansion. (Die Tatsache, dass solche Funktionen als Erweiterungen zu HTML hinzugefügt wurden, beweist diesen Punkt.)
Prozedurale Sprachen hingegen sind normalerweise in keinem bestimmten Bereich so gut (z. B. es erfordert viel mehr Arbeit, ein Programm in einer prozeduralen Sprache zu schreiben, um einen Textabsatz zu formatieren, als in HTML). Sie gleichen dies jedoch durch ihre Turing-Vollständigkeit aus, die es ermöglicht, *jedes* Problem zu lösen, das auftreten könnte (unter der Annahme ausreichender Ressourcen). Prozedurale Sprachen sind daher *in Kombination* mit deklarativen Sprachen ideal.
Wenn mein Mobiltelefon programmierbar wäre, würde ich beispielsweise immer noch die normale deklarative Schnittstelle (d. h. die Tastatur) verwenden, um eine bestimmte Nummer zu wählen, da dies der bequemste Weg ist, auf diese spezifische Funktionalität zuzugreifen. Ohne Programmierbarkeit gibt es jedoch keine Möglichkeit, es dazu zu bringen, ein paar verschiedene Nummern für einen bestimmten Freund auszuprobieren, bis eine beantwortet wird, es sei denn, der Mobiltelefonhersteller hat diese spezielle Funktion antizipiert.
3. Herausforderungen
Sofort ergeben sich einige Fragen. Wie sähe die in Schulen zu unterrichtende Programmiersprache aus? Würde sie irgendeine Ähnlichkeit mit den Programmiersprachen haben, die wir heute kennen? Würde sie überhaupt Programmiersprache genannt werden? Wie würden wir sie lehren? Gäbe es nur eine Sprache? Welche anderen Werkzeuge sind für die Lehre und Nutzung dieser Sprache unerlässlich?
Ebenso interessant sind Fragen wie: Wie und wofür würden die Menschen ihre Programmierkenntnisse einsetzen? Wie würde eine nahezu universelle Fähigkeit, Computerprogramme zu lesen und zu schreiben, die Struktur von Computersoftware verändern? (Insbesondere in Kombination mit einer zukünftigen Version des Internets, die einen allgegenwärtigen Zugang zu Rechen- und Speicherelementen sowie zur Netzwerkkonnektivität verspricht.) Wie würde sie den Softwaremarkt beeinflussen? Wie weit in der Zukunft könnte dies Realität werden?
Ein klares potenzielles Problem ist die Erwartung, dass, wenn die meisten Menschen Programmierer sind, viele von ihnen höchstwahrscheinlich *schlechte* Programmierer sein werden. Menschen, die in ihrer Muttersprache keine verständlichen Sätze schreiben oder ihr Scheckbuch ausgleichen können, werden wahrscheinlich keine gut strukturierten Computerprogramme schreiben!
Wir müssen daher Wege untersuchen, die Qualität der Interaktion zwischen dem Programmierer und dem System zu verbessern, um selbst schlechten Programmierern zu helfen, das Beste aus ihren Computern herauszuholen. Sie möchten vielleicht ein Programm schreiben, um Ihr PDA oder Ihren Toaster anzupassen, aber Sie könnten entmutigt sein, wenn ein kleiner Fehler Ihr Adressbuch löschen oder Ihr Haus in Brand setzen könnte. Es werden Schutzmaßnahmen gegen Katastrophen benötigt, ebenso wie Möglichkeiten, unerwünschte Änderungen am System als Ganzes rückgängig zu machen ("Rückgängig" gilt normalerweise nur für eine Datei gleichzeitig. Das Rückgängigmachen globaler Systemänderungen erfordert typischerweise einen Neustart oder sogar eine schmerzhafte Datenwiederherstellung von Sicherungsmedien).
Skriptsprachen sind unglaublich beliebt geworden, und eine fortgeschrittene Skriptsprache wie Python ist ein guter Ausgangspunkt für unsere Expedition. Eine anhaltende Kritik an Skriptsprachen ist, dass ihre Leistung für einige Aufgaben unzureichend ist. Techniken wie Programmanalyse und fortschrittliche Compilertechnologie können möglicherweise einen Teil dieses Problems beseitigen, wahrscheinlich in Kombination mit einer Form optionaler statischer Typisierung. Die Herausforderung besteht darin, dies zu tun, ohne die Programmiersprache zu verschleiern oder den Entwicklungszyklus (bearbeiten-ausführen-debuggen) mühsamer zu gestalten.
Skriptsprachen sind sehr gut darin, bestehende Komponenten auf neue Weise zusammenzufügen, anstatt von Grund auf neu zu beginnen. Eine Schlussfolgerung ist, dass wir bessere Techniken für die Wiederverwendung von Software benötigen – ein Thema, das in objektorientierten Programmierkreisen fortlaufend diskutiert wird.
Skriptsprachen eignen sich auch gut zum Verknüpfen von Komponenten, die in anderen Sprachen geschrieben sind. Was jedoch an den Schnittstellen zwischen Sprachen geschieht, ist oft sehr hässlich. Hier gibt es zwei mögliche Auswege. Eine Möglichkeit besteht darin, den Bedarf an anderen Sprachen zu reduzieren, indem der Skriptsprache Einrichtungen hinzugefügt werden, die sie als Systemprogrammiersprache (d. h. eine Sprache, die für Low-Level-Programmierung geeignet ist, wie C oder Java) nutzbar machen. Hier geht es wieder darum, die Leistung über alles andere zu verbessern. Die andere Möglichkeit besteht darin, die Synchronizität zwischen System- und Skriptsprachen einfach zu verbessern. Ein gutes Beispiel ist JPython, ein Python-Dialekt, der nahtlos mit Java integriert ist [JPython].
4. Wie wird es die Welt verändern?
So wie die Massenalphabetisierung tiefgreifende Auswirkungen auf die westliche Gesellschaft hatte, die wohl zur modernen westlichen Demokratie führte, werden die langfristigen Auswirkungen der massenhaften Computerkenntnisse auf die Gesellschaft gewaltig sein. Ein allgemeines Verständnis von Computern auf dem Niveau von Softwaredesign und -implementierung wird zu einem massiven Anstieg von Produktivität und Kreativität führen, mit weitreichenden Auswirkungen, die kaum vorhergesagt oder vorgestellt werden können.
Kurzfristig werden die Menge und Qualität der verfügbaren Computersoftware drastisch verbessert, da die Vorstellungskraft und die Arbeit von Millionen auf das Problem angewendet werden. Erfinderische Büromitarbeiter werden in der Lage sein, die Software zu verbessern, die sie bei ihren Aufgaben unterstützt, und ihre Verbesserungen mit ihren Kollegen oder – über das Internet – mit anderen weit entfernten Personen zu teilen, die mit denselben Aufgaben und Problemen konfrontiert sind.
Jetzt ist es an der Zeit, mit dieser Vision zu beginnen. Die Entwicklungen in der Hardware für Berechnungen, Speicherung und Konnektivität sind so, dass die Massen zum ersten Mal Zugang zu Computern haben werden, die leistungsfähig genug sind, um für sie nützlich zu sein, sei es als eigenständige Desktop- oder Laptop-Computer oder eingebettet in Geräte. Wir müssen anfangen, Software zu entwickeln, die sie befähigt, ihre Computer zu kontrollieren, anstatt von ihnen kontrolliert zu werden.
5. Expeditionsplan
Idealerweise möchten wir eine Programmiersprache, eine Entwicklungsumgebung und Lehrmaterialien entwickeln, die geeignet sind, Programmieren an Kindern in der Mittel- und Oberstufe sowie an Erwachsenen ohne vorherige Computererfahrung zu vermitteln. Um diese Materialien herum erwarten wir, eine Benutzergemeinschaft aufzubauen, die uns Feedback gibt und schließlich unsere Vision einer anderen Art der Softwareentwicklung und -personalisierung verwirklicht.
Unter Anerkennung unserer Einschränkungen schlagen wir vor, zunächst die Lehre einer bestehenden Skriptsprache, Python, zu ermöglichen und uns auf die Erstellung einer neuen Entwicklungsumgebung und Lehrmaterialien dafür zu konzentrieren. Wir haben anekdotische Beweise dafür, dass Python eine gute Sprache ist, die als erste Programmiersprache unterrichtet werden kann. Unsere Bemühungen werden sich auf die Erstellung von Werkzeugen und Bildungsmaterialien für diesen Zweck sowie auf die Förderung einer Community rund um diese Materialien konzentrieren, damit wir untersuchen können, *warum* Python eine gute Unterrichtssprache ist, und Richtungen für die zukünftige Entwicklung von Unterrichtssprachen empfehlen können.
Warum eine bestehende Sprache verwenden? Unsere Erfahrung zeigt, dass die Entwicklung und Implementierung einer neuen Sprache Jahre dauert – und dass diese Arbeit (fast) abgeschlossen sein muss, bevor die Entwicklungsumgebung und die Lehrmaterialien erstellt werden können. Daher müssen wir unser Projekt durch die Verwendung einer bestehenden Sprache ankurbeln.
Warum Python verwenden? Wir glauben, dass Python eine gute Sprache ist, um sie absoluten Anfängern beizubringen. Sie leitet viele ihrer kritischen Merkmale von ABC [ABC] [Geurts] ab, einer Sprache, die speziell für die Vermittlung von Programmierung an Nicht-Experten entwickelt wurde. Die Python-Community hat viele Berichte von Einzelpersonen erhalten, die ihren Kindern mit Python das Programmieren beigebracht haben. Der Konsens aus diesen Berichten ist, dass die Sprache selbst für diesen Zweck perfekt ist – im Gegensatz zu beispielsweise Java, Perl oder Visual Basic, die alle zu sehr mit Eigenheiten überladen sind.
Die folgende Tabelle ist eine (subjektive) Übersicht, die einige relevante Aspekte von Python mit einigen anderen Sprachen vergleicht. Aus dieser Tabelle schließen wir, dass Python eine gute erste Wahl zum Unterrichten ist, die auch als Sprache für die ernsthafte Anwendungsentwicklung gut geeignet ist. Im Gegensatz zu anderen Sprachen, die für die Lehre an Anfänger vorgeschlagen wurden (z. B. Logo, LogoMation, sogar Pythons Vorgänger ABC), ist Python nicht *nur* eine Lehrsprache. Es eignet sich für die Entwicklung großer Anwendungen, wie Projekte hier bei CNRI und anderswo beweisen. Darüber hinaus ist Python durch Module erweiterbar, die in anderen Sprachen geschrieben sind, z. B. C, C++ oder Java, um den Zugriff auf erweiterte Funktionalitäten zu vermitteln, die von Python aus nicht leicht zugänglich sind (z. B. Hochgeschwindigkeits-3D-Computergrafikpakete). Obwohl wir nicht erwarten, dass unsere Studenten Erweiterungsmodule schreiben, macht die *Verwendung* solcher Module es möglich, ihr Lernerlebnis aufzupeppen, und gibt Lehrern die Möglichkeit, den Unterricht an die Interessen ihrer Schüler anzupassen, indem sie ihnen einen geschützten Zugang zu anderen Softwarepaketen bieten.
Die Tatsache, dass Python zur Entwicklung großer Anwendungen verwendet werden kann, spielt in einen anderen Aspekt unserer Vision hinein: die Entwicklung von Open-Source-Anwendungssoftware, die von Benutzern, die keine erfahrenen Programmierer sind, aber einige Programmierkenntnisse erlernt haben, angepasst werden kann. Obwohl dies nicht der Schwerpunkt unserer Erkundungsaufgabe ist, hoffen wir, dass wir zumindest einige Initiativen in diese Richtung sehen werden, und wir werden Unternehmen und Organisationen ermutigen, die Schritte in diese Richtung unternehmen möchten. Wir erwarten, dass die Existenz von JPython (einer Python-Implementierung, die nahtlos mit Java integriert ist) hier ein wichtiger Ermöglichungsfaktor sein wird.
Pythons Programmierumgebung und das verfügbare Einführungsmaterial sind für die Lehre an Anfänger weniger als ideal. Insbesondere gehen die bestehenden Entwicklungsumgebungen und Tutorials für Python (davon gibt es mehrere) davon aus, dass der Benutzer ein eingefleischter Entwickler ist, der eine Reihe von externen Tools zum Bearbeiten, Ausführen und Debuggen eines Programms kennt und der bereits eine oder mehrere andere Programmiersprachen und ihre Entwicklungsumgebungen kennt. Dies steht derzeit einer weiter verbreiteten Experimentierfreude mit Python als erster Programmiersprache im Wege.
Durch das Lehren von Python an Nicht-Programmierer erwarten wir, wertvolle Informationen zu sammeln, die das Design einer besseren Programmiersprache leiten werden. Tatsächlich erwarten wir, dass andere den Großteil der eigentlichen Lehre für uns übernehmen werden, und wir werden web- und E-Mail-basierte Feedbackkanäle einrichten, die die Menge des (nützlichen) Feedbacks maximieren, das wir erhalten.
Unser Plan für die anfängliche Erkundungsaufgabe hat vier Hauptkomponenten
- Erstellung einer Python-Entwicklungsumgebung, die für Anfänger geeignet ist;
- Erstellung von Schulungsmaterialien, um Python mit dieser Umgebung an Anfänger zu lehren;
- Förderung einer Benutzergemeinschaft für die oben genannten Punkte und Gewinnung von Feedback;
- Bewertung des Feedbacks und Empfehlung von Richtlinien für Folgeforschung oder -entwicklung.
Sobald eine erste Version der Entwicklungsumgebung und des Schulungsmaterials der Python-Community zur Verfügung gestellt wird, werden die Feedbackkanäle geöffnet, und das anfängliche Feedback wird hauptsächlich in Verbesserungen der Umgebung und des Materials einfließen.
Später, wenn mehr Feedback eingegangen ist, werden wir die Verwendung von Python für dieses Projekt bewerten. Vielleicht ist Python perfekt; möglicherweise sind Änderungen notwendig; vielleicht ist doch ein radikal anderes Sprachdesign erforderlich. Unser Interesse liegt hier darin, herauszufinden, welche Aspekte von Python als Lehrsprache gut funktionieren. Basierend auf dieser Bewertung werden wir Folgeaktivitäten in Forschung und Entwicklung vorschlagen oder durchführen.
Wir werden eine Entwicklungsumgebung entwerfen und bauen, die speziell dazu bestimmt ist, Python-Programmierung an Erwachsene ohne vorherige Programmiererfahrung sowie an Kinder in Mittel-, Ober- und Hochschulen (ebenfalls ohne vorherige Programmiererfahrung) zu vermitteln.
Wir werden Bildungsmaterialien entwickeln, die zur neuen Entwicklungsumgebung passen. Als Anreiz, Programmieren "lustiger" zu machen, beabsichtigen wir, die Entwicklungsumgebung mit einer bestehenden programmierbaren 3D-Spiel-Engine zu verbinden, wie sie in beliebten Computerspielen verwendet wird. Mehrere solcher Engines sind oder werden voraussichtlich mit Python verfügbar sein; wir werden eine auswählen und eine Schnittstellenbibliothek dafür erstellen, die für unser Publikum geeignet ist.
Warum eine 3D-Spiel-Engine? Die Erfahrungen mit Logo zeigen, dass Grafik gut geeignet ist, die Aufmerksamkeit eines jüngeren Publikums zu fesseln, aber seine 2D-Grafiken wirken im Vergleich zu den Videospielen, mit denen Teenager heute vertraut sind, etwas langweilig. Alice ist ein weiteres gutes Beispiel für eine 3D-Grafikumgebung, die ansprechender ist als Turtle-Grafik.
Im Sinne von "massenhafter Computerkompetenz" und der Open-Source-Bewegung werden wir eine Website erstellen und pflegen, um die Software und die Bildungsmaterialien weit verbreitet und kostenlos verfügbar zu machen, und dort Feedback-Seiten einrichten. Zusätzlich zur Website werden wir eine oder mehrere Mailinglisten mit Archiven und vielleicht einen "Chat"-Dienst für Benutzer erstellen und pflegen. Wir werden aktiv an den Mailinglisten teilnehmen, um eine Community zu fördern, und auch das Feedback sammeln und analysieren, das die Community uns über diese (und andere) Kanäle gibt.
Wir beabsichtigen auch, uns selbst an kleinen Lehrveranstaltungen zu beteiligen, aber wir erwarten nicht, dass wir viel lehren werden. Wenn unsere Erfahrungen mit der Popularität von Python ein Indikator sind, werden wir das nicht tun müssen: Andere sind begierig darauf, an diesem Experiment teilzunehmen.
Infrastruktur
Wir werden die bestehende Computerinfrastruktur von CNRI für die Entwicklung und Verbreitung der vorgeschlagenen Materialien nutzen, ergänzt durch Desktop-Workstations und einen Webserver, die speziell für dieses Projekt gekauft werden. Wir werden das Internet und das World Wide Web für die gesamte Verbreitung der Materialien nutzen.
Vergleich mit anderer laufender Forschung
ABC. Pythons Vorgänger, ABC, wurde in den frühen Achtzigern als Lehrsprache entwickelt. Sein Motto war "stoppt Basic" – und erkannte damit den Hauptwettbewerb bei Sprachen für Nicht-Experten zu dieser Zeit an. Die ABC-Entwickler hatten viel Erfahrung im Unterrichten von "klassischen" Programmiersprachen wie Algol für Anfänger. Sie stellten fest, dass ihre Schüler oft so von den nebensächlichen Details der Nutzung einer Computersprache (wie dem Ausführen des Compilers, dem Umgang mit verschiedenen Zahlenformaten, obskuren E/A-Operationen und der Low-Level-Speicherverwaltung) überwältigt waren, dass sie nie dazu kamen, sich auf die wesentlichen Aspekte eines guten Programm- und Algorithmenentwurfs zu konzentrieren.
Um diese Wirkung auszugleichen, gingen die ABC-Entwickler zurück zu den Grundlagen. Sie entwarfen eine Sprache und eine Umgebung für diese Sprache, die sich um alle Nebensächlichkeiten kümmerte, sodass der Student mehr Zeit hatte, das Wesentliche der Programmierung unabhängig von der jeweiligen Programmiersprache zu lernen, wie klare Ablaufsteuerung und leistungsstarke Datenstrukturen, und sich auf den eleganten Ausdruck von Programmen zu konzentrieren. Sie schlugen sowohl ein neues Sprachdesign als auch neue Terminologie vor, die radikal von dem abwichen, was unter Informatikern und Programmierern üblich war (und immer noch ist). Tatsächlich ist der wichtigste Grund, warum ABC nicht die erwartete Wirkung erzielte, wahrscheinlich, dass sie zu stark von der aktuellen Praxis abwichen. Die Leute, die Zugang zu der Hardware hatten, die zum Ausführen von ABC benötigt wurde (zunächst lief es nur auf Unix-Systemen, obwohl es später auf Mac und PC portiert wurde), waren oft erfahrene Computerbenutzer, die frustriert waren, dass ABC nicht die "gleiche Sprache" wie ihre anderen Anwendungen sprach.
Etwa ein Jahrzehnt später entstand Python aus dieser Frustration heraus. Es teilt mit ABC den Fokus auf eleganter Ausdruck, Grundlagen der Programmierung und das Weglassen von Nebensächlichkeiten, fügt aber Objektorientierung, Erweiterbarkeit und eine leistungsstarke Bibliothek von Modulen hinzu, die über viele verschiedene Mechanismen mit anderen Anwendungen interagieren: gemeinsame Dateien, Programmeinbettung, RPC-Schnittstellen wie CORBA oder COM und Netzwerkprotokolle (Unterstützung aller typischerweise im WWW verwendeten Protokolle).
Logo. Eigentlich eine Familie von Sprachen, die mit Lisp verwandt sind und größtenteils am MIT entwickelt wurden, ist Logo natürlich die bekannteste Programmiersprache im Bildungsbereich. Sie hat eine reiche Tradition, starke Wurzeln in Schulen und eine Reihe von kommerziellen Angeboten. An der Epistemology and Learning Group am MIT Media Lab gibt es laufende Forschung, z. B. den "programmierbaren Baustein" (in Zusammenarbeit mit LEGO).
Der Hauptunterschied zwischen Logo und unserem Vorschlag liegt in unserer Vision, dass Millionen von (Amateur-)Programmierern gemeinsam Open-Source-Software entwickeln werden – Logo begnügt sich scheinbar damit, jüngeren Kindern begrenzte Programmierkenntnisse zu vermitteln, für die Computerprogrammierung hauptsächlich eine Möglichkeit ist, ihren Geist im abstrakten Denken zu trainieren.
LogoMation. Eine Firma namens Magic Square verkauft LogoMation, eine Sprache, die Logo nicht unähnlich ist und einen ähnlichen Fokus auf Turtle-Grafik hat. Sie wird mit einem exzellenten Tutorial geliefert, das für Kinder ab 8 Jahren geeignet ist. Die Syntax von LogoMation ist der von Python ähnlich (mehr noch als die Syntax von Logo), was darauf hindeutet, dass wir mit Python auf dem richtigen Weg sind.
Aber wie Logo bietet auch LogoMation nur begrenzte Wachstumsmöglichkeiten. Es adressiert nicht direkt die Frage "was als Nächstes", da von seinen Benutzern erwartet wird, dass sie für tatsächliche Arbeit zu anderen Programmiersprachen wechseln.
Alice. Die Testimonials auf der Alice-Website zeigen deutlich, dass Alice erfolgreich Programmieren an Kinder sowie an Erwachsene ohne Vorkenntnisse vermittelt. Sie weisen auch auf die Bedeutung einer „lustigen“ Umgebung hin (und Alices 3D-Grafiken sind attraktiver als die Turtle-Grafiken von Logo). Da Alice (eine leicht modifizierte Version von) Python verwendet, ist dies ein weiterer Hinweis auf Pythons Eignung. Alice gibt uns auch einige Hinweise darauf, welche Aspekte von Python verbessert werden könnten: Ihre Erfahrungen legen beispielsweise nahe, dass die Groß-/Kleinschreibung von Python ein Problem darstellen könnte.
Der Schwerpunkt des Alice-Projekts liegt jedoch auf 3D-Grafiken – ihr Tutorial lehrt nicht wirklich viel in Bezug auf Programm- oder Datenstrukturtechniken. Obwohl wir zustimmen, dass 3D-Grafiken eine großartige Möglichkeit sind, ein Publikum zu schaffen und zu halten, sind wir mehr daran interessiert, Programmieren zu lehren, nicht nur Grafik. Aus diesem Grund liegt der Schwerpunkt unserer ersten Arbeiten auf der Entwicklung einer Programmierumgebung und eines Tutorials, in dem 3D-Grafiken nur eine der möglichen Anwendungen für einen Computer sind.
DrScheme. Das TeachScheme!-Projekt an der Rice University [TeachScheme] zielt darauf ab, einen neuen Einführungslehrplan für Computer auf der Grundlage der Scheme-Programmiersprache zu entwickeln. Ein zentraler Bestandteil der Bemühungen von Rice ist die Entwicklung von DrScheme [Findler], einer Programmierumgebung für Anfänger. Der Fokus von TeachScheme liegt auf einem relativ engen Publikum – Studenten, die solide Kenntnisse in Algebra der High School haben und sich für Informatik und ihre Anwendung in wissenschaftlichen Problemen interessieren. Wir stellen uns ein viel breiteres Publikum vor, bei dem die Annahmen über einen starken mathematischen Hintergrund und ein Interesse an wissenschaftlichen Problemen nicht zutreffen. Wir erwarten auch, dass Scheme, eine Sprache, die sich durch die Offenlegung der grundlegenden Bausteine der Berechnung zu pädagogischen Zwecken auszeichnet, für ein Massenpublikum ungeeignet wäre.
Interessant ist jedoch, dass ein Kernstück des TeachScheme-Projekts eine Entwicklungsumgebung ist. Während die Zielgruppen und der Ansatz unterschiedlich sind, teilen unser Projekt und TeachScheme die Erkenntnis, dass die Entwicklungsumgebung eine entscheidende Komponente ist. Es besteht Bedarf an einer interaktiven Read-Eval-Print-Schleife, einem leistungsfähigen Debugger und Werkzeugen zum Verständnis der Funktionsweise von Programmen.
Liste des Schlüsselpersonals
Guido van Rossum ist Gruppenleiter bei CNRI, wo er 1995 eintrat. Er ist der Schöpfer von Python, einer beliebten interpretierenden objektorientierten Programmiersprache mit Fähigkeiten, die Java ähneln. Er ist auch der Hauptentwickler des mobilen Agentensystems Knowbot. Zuvor arbeitete er an ABC, einer für Lehrzwecke entwickelten Programmiersprache, und an Amoeba, einem bekannten verteilten Betriebssystem, das in den 80er Jahren entwickelt wurde. Er hat einen Master-Abschluss in Mathematik und Informatik von der Universität Amsterdam.
Erwarteter Aufwand für das Projekt: 50 %. Andere DARPA- oder NSF-Projekte: 40 %. Andere bedeutende Unterstützungsquellen: Python Consortium (10 %).
Jeremy Hylton ist ein leitendes Mitglied des technischen Stabs. Er ist einer der Entwickler des mobilen Agentensystems Knowbot und hat mehrere agentenbasierte Informationsmanagementanwendungen entworfen und implementiert. Er erhielt 1996 einen M.Eng. in Elektrotechnik und Informatik und einen S.B. in Informatik und Ingenieurwesen vom Massachusetts Institute of Technology. Im selben Jahr trat er CNRI bei.
Erwarteter Aufwand für das Projekt: 30 %. Andere DARPA- oder NSF-Projekte: 70 %.
Barry Warsaw ist seit 1994 Systemingenieur bei CNRI. Er war beitragender Entwickler mehrerer CNRI-Projekte, darunter das Application Gateway System und die Knowbot Operating Environment. Er hat zur Entwicklung der Python-Sprache und des Grail Internet Browsers beigetragen. Er erhielt 1984 einen B.S. in Informatik von der University of Maryland. Vor CNRI arbeitete er von 1980 bis 1990 an Robotersystem-Bedieneroberflächen am National Institute of Standards and Technology und von 1990 bis 1994 an medizinischer Datenbankinformationstechnologie an der National Library of Medicine.
Erwarteter Aufwand für das Projekt: 30 %. Andere DARPA- oder NSF-Projekte: 70 %.
Andere Gruppenmitglieder werden erhebliche Anstrengungen für das vorgeschlagene Projekt unternehmen. Wenn andere anstehende DARPA-Vorschläge genehmigt werden, kann der Aufwand für dieses Projekt etwas reduziert werden und andere Gruppenmitglieder werden übernehmen. Es werden keine Subunternehmer eingesetzt.
Arbeitsbeschreibung
CNRI wird folgende Arbeiten durchführen
- Entwurf und Implementierung einer prototypischen interaktiven Programmierumgebung, geschrieben in Python, geeignet für die Vermittlung von Python an Computernutzer ohne Vorkenntnisse.
- Entwurf und Implementierung einer prototypischen Bibliothek von Python-Modulen, die Python mit einer bestehenden 3D-Spiel-Engine verbinden, um Python in einer ansprechenden Umgebung zu vermitteln.
- Erstellung eines Tutorials, das allgemeine Programmierfähigkeiten und gute Programmiergewohnheiten für Studenten ohne Vorkenntnisse vermittelt und dabei die oben genannte Software verwendet.
- Erstellung und Pflege einer Website und Mailinglisten zur Förderung einer Community, die sich auf die oben genannte Software und das Tutorial konzentriert. Die Website wird verwendet, um einfachen Zugang zu aller Software und Lehrmaterialien zu ermöglichen, die für dieses Projekt erstellt werden.
- Bewertung und Berichterstattung über das Feedback, das von der Community bezüglich der oben genannten Software und des Tutorials gesammelt wurde. Empfehlungen für Folgeuntersuchungen.
Um den Zugang zu den erstellten Materialien zu maximieren, werden alle für dieses Projekt erstellte Software, Lehrmaterialien und Berichte frei im World-Wide-Web als Open-Source-Materialien zur Verfügung gestellt.
Zeitplan
Der Zeitplan ist in vier Halbjahresperioden ab Beginn der Förderzusage unterteilt.
1. Erste Halbjahresperiode
Erste Entwurfsarbeiten für die Programmierumgebung. Frühe prototypische Implementierung, um die Umsetzbarkeit des Entwurfs zu beurteilen. Erstellung einer frühen Entwurfsversion von Teil eins des Tutorials, „Erste Schritte in die Programmierung“. Auswahl einer 3D-Spiel-Engine für die Verwendung mit dem Tutorial und der Programmierumgebung. Kontaktaufnahme mit anderen Gruppen, die an ähnlicher Forschung interessiert sind.
2. Zweite Halbjahresperiode
Verfeinerung des Designs der Programmierumgebung. Beginn der Implementierung der 3D-Spiel-Bibliotheksmodule. Einrichtung von Website und Mailinglisten zur Aufnahme des Community-Aufbaus. Veröffentlichung von Alpha-Versionen der Implementierung. Verfeinerung und Veröffentlichung von Alpha-Versionen von Teil eins des Tutorials. Beginn der Feedback-Sammlung. Erstellung einer frühen Entwurfsversion von Teil zwei des Tutorials, „Erstellung größerer Programme“.
3. Dritte Halbjahresperiode
Verwendung des Feedbacks zur Verfeinerung des Designs der Programmierumgebung. Veröffentlichung von Alpha-Versionen der 3D-Spiel-Bibliothek. Veröffentlichung von Beta-Versionen der Implementierung und von Teil eins des Tutorials. Veröffentlichung von Alpha-Versionen von Teil zwei des Tutorials. Erstellung einer frühen Entwurfsversion von Teil drei des Tutorials, „Programmierung und das World-Wide-Web“.
4. Vierte Halbjahresperiode
Veröffentlichung der endgültigen Version der Programmierumgebung, der 3D-Spiel-Bibliothek und aller drei Teile des Tutorials. Bewertung der Verwendung von Python zu Lehrzwecken. Bewertung der Effektivität der Programmierumgebung und des Tutorials. Erstellung des Abschlussberichts.
Optionale Aufgaben
Im aktuellen Vorschlag gibt es keine optionalen Aufgaben.
Referenzen
- [ABC]
- http://www.cwi.nl/~steven/abc/
- [Alice]
- http://www.alice.org/
- [Findler]
- Robert Bruce Findler, Cormac Flanagan, Matthew Flatt, Shriram Krishnamurthi und Matthias Felleisen. DrScheme: Eine pädagogische Programmierumgebung für Scheme. In Proceedings of the 1997 Symposium on Programming Languages: Implementations, Logics, and Programs, Southampton, UK, Sept. 1997. (Lecture Notes in Computer Science, Vol. 1292.)
- [Geurts]
- Leo Geurts, Lambert Meertens, Steven Pemberton. Das ABC Programmierer Handbuch. Prentice-Hall, 1990
- [JPython]
- https://pythonlang.de/jpython/
- [Logo]
- http://el.www.media.mit.edu/groups/logo-foundation/
- [LogoMation]
- http://www.magicsquare.com/LM2/
- [Lutz]
- Mark Lutz. Programmieren mit Python. O'Reilly, 1996.
- [OpenSource]
- http://www.opensource.org/
- [Python]
- https://pythonlang.de/
- [TeachScheme]
- http://www.cs.rice.edu/CS/PLT/Teaching/
- [Watters]
- Aaron Watters, Guido van Rossum, Jim Ahlstrom. Internet Programming mit Python. MIS Press/Henry Holt, 1996.
