Ein voll ausgestatteter Exercism-Track hat zwei Arten von Übungen: Konzeptübungen und Praxisübungen. Sie unterscheiden sich grundlegend und ergänzen sich gut.
Die Konzeptübungen eines Tracks sind Übungen, die einzelne Konzepte vermitteln sollen, die die Grundlage einer bestimmten Programmiersprache bilden. Diese Konzepte bilden einen Lehrplan.
Diese Dokumentation enthält Hinweise und Tipps, wie du erfolgreich einen Lehrplan für deinen Track entwirfst.
Das Endziel eines Lehrplans ist es, Lernende dahin zu führen, dass sie idiomatischen Code in der Zielsprache mühelos lesen und schreiben können.
Jede einzelne Konzeptübung ist sehr stark fokussiert. Sie ist ein kleiner, präzise ausgerichteter Schritt, der Lernende dem Verständnis eines Aspekts der Sprache näherbringt. Sie baut nur auf Konzepten auf, die zuvor eingeführt wurden.
Indem sie die Übung lösen, beginnen die Lernenden, sich mit dem Konzept vertraut zu machen. Verständnis entsteht vor allem durchs Tun, viel weniger durch Erklärungen. Die erklärenden Inhalte sollen die Lernenden in die Ideen einführen, die sie zum Lösen der Übung brauchen (daher die Wahl des Dateinamens „introduction.md“).
Wir möchten, dass Lernende sofort mit dem Schreiben von Code beginnen können, ohne vorher alles verstehen zu müssen. Um das zu erreichen, lassen wir Details bewusst offen und erklären vieles nicht. Wir vereinfachen und stellen, wo möglich, Code-Stubs bereit. Das verringert die kognitive Belastung beim Einstieg und gibt dem Wissen Zeit und Raum, sich zu setzen. Mit diesem Ansatz sagen wir nicht, dass Lernende diese Dinge nicht wissen müssen, sondern dass sie sie noch nicht wissen müssen.
Oft müssen die frühesten Übungen nicht-idiomatischen Code enthalten. Das liegt daran, dass den Lernenden am Anfang der größte Teil der Sprache noch unbekannt ist und die meisten Konzepte noch nicht eingeführt wurden. Wenn wir in den frühesten Übungen nicht-idiomatischen Code zulassen, können Lernende viele kleine Schritte in vertrautem Gelände machen statt wenige große Schritte in unbekanntem Gelände. Das Ergebnis: Sie erreichen die Stufe des idiomatischen Codes schneller und mit weniger Reibung.
Übungen sind als Baum aufgebaut, mit einer einführenden Übung an der Spitze als Ausgangspunkt. Spätere Übungen vermitteln Konzepte, die darauf aufbauen, dass früher vermittelte Konzepte verstanden wurden.
Es kann sich lohnen, dir anzusehen, wie andere Sprach-Tracks ihre Konzeptübungen aufgebaut haben. Beispiele für Konzeptübungen aus anderen Sprach-Tracks findest du hier.
Wenn du andere Übungen als Ausgangspunkt für deine eigenen nimmst, achte sorgfältig darauf, dass die entstehende Übung das Konzept so behandelt, wie es in deiner Sprache existiert. Manchmal unterscheiden sich Konzepte nur in Feinheiten, manchmal grundlegend. Manchmal gibt es Konzepte in anderen Sprachen gar nicht.
Der Lehrplan und damit der Konzeptbaum sollte die Konzepte abbilden, die es in dieser konkreten Sprache gibt.
Nimm Konzepte nicht nur deshalb auf, weil andere Tracks sie haben.
In manchen Fällen ist es verlockend, ein Konzept aufzunehmen, weil man es oft umgehen muss, indem man auf Konzepte ausweicht, die es gibt. Stattdessen solltest du das Konzept einführen, das die Sprache tatsächlich verwendet, und überlegen, eine Übung hinzuzufügen, die erklärt, wie man es in dieser Art von Situation einsetzt.
In Go gibt es zum Beispiel keine Enums. Stattdessen führt der Go-Konzeptbaum Konstanten ein und vermittelt, wie man Konstanten in der Art von Situation verwendet, in der man in anderen Sprachen Enums nutzen würde.
Zögere nicht, um Hilfe zu bitten. Frag lieber vorab oder während du an einer Übung arbeitest, als das erst im Code Review zu besprechen.
Auf GitHub kannst du das Team @exercism/learning-mode erwähnen. Im Exercism-Forum eröffnest du ein Issue in der Kategorie Exercism Support.
Unsere Erfahrung zeigt: Der pragmatischste Weg, einen Lehrplan zu entwickeln, ist, den Konzeptbaum organisch wachsen zu lassen und mit den einfachsten Konzepten zu beginnen. Wir müssen nicht alles vorab durchplanen, und tatsächlich ist es meist sinnvoll, nicht zu weit vorauszudenken.
Wir beginnen mit dem absoluten Minimum an Konzepten, nämlich denen, die am grundlegendsten sind, um irgendetwas in der Sprache zu schreiben. Wir versuchen außerdem, mit Konzepten zu beginnen, die dem durchschnittlichen Entwickler am vertrautesten sind. Vertraut ist gut. Vertraut verwirrt nicht.
Denk daran: Das Ziel ist idiomatischer Code, aber die Trittsteine dorthin sind nicht immer idiomatisch. Vertrautes zu verwenden, auch wenn es kein tolles Beispiel für Code in dieser Sprache ist, hilft Lernenden, schneller zu Code zu gelangen, der für die Sprache typischer ist.
Versuche nicht, den gesamten Konzeptbaum vorab zu planen, sondern fang einfach mit der ersten Übung an. Das Ziel der ersten Übung ist, dass Lernende mit möglichst wenig Reibung mit dem Lernen beginnen können. Sie machen den allerersten Schritt, um sich damit vertraut zu machen, wie Code in dieser Sprache aussieht. Vielleicht schreiben sie ein kleines Stück Code oder ergänzen nur ein paar Zeilen in einem Stub, um die Übung abzuschließen. Die Lernenden haben „Hello, World!“ bereits gelöst, um Zugang zu dieser Übung zu bekommen. Doch bei „Hello, World!“ ändern sie nur den Wortlaut. Die gesamte Syntax der Sprache ist ihnen vielleicht noch fremd. Setze auf einen schnellen Erfolg und darauf, dass Lernende mit dem Nötigsten der Syntax so vertraut werden, dass sie selbstbewusst weitermachen können.
Mehr dazu unter Die erste Übung entwickeln.
Die erste Übung sollte ein paar Übungen freischalten, die grundlegende Konzepte einführen. Das sind Dinge wie primitive Datentypen oder einfache Typen und einfache Operationen mit diesen Typen.
Mehr dazu unter Die nächsten Übungen entwickeln.
Hier wird es oft erst richtig interessant. Es gibt so vieles, das du an dieser Stelle einführen könntest. Wie entscheidest du, welche Konzepte du als Nächstes angehst?
Eigentlich ist das gar nicht so wichtig. Solange du irgendwo anfängst, was dir sinnvoll erscheint, ist alles in Ordnung.
Was für uns „sinnvoll“ im Zusammenhang mit dem Erweitern des Konzeptbaums bedeutet, kannst du dort nachlesen.
Eine gute Konzeptübung ist extrem fokussiert und vermittelt idealerweise nur ein einziges Konzept. Für ihre Lösung gibt es meist nur einen erwarteten Ansatz. Das steht im Gegensatz zu Praxisübungen, die offen sind und zum Erkunden einladen.
Eine gute Konzeptübung ist meist eine schlechte Praxisübung, und umgekehrt. Da die Ziele von Praxis- und Konzeptübungen völlig unterschiedlich sind, wandeln wir Praxisübungen nicht in Konzeptübungen um. Wir schreiben alle Konzeptübungen von Grund auf neu oder bauen sie auf Geschichten auf, die eigens dafür geschrieben wurden, einfache Konzepte zu vermitteln.
Manchmal hast du das Gefühl, es gibt eine Sackgasse. Konzept A setzt das Verständnis von Konzept B voraus und B das von A.
Vereinfache in diesem Fall. Lass bei dem einen etwas Komplexität offen, damit die Lernenden mit dem anderen vertraut werden. Du darfst ruhig sagen, dass etwas später ausführlicher behandelt wird und dass die Lernenden vorerst nur diesen einen Teil verstehen müssen.
Konzepte werden in Etappen und mit der Zeit immer tiefer verstanden.
Eine Konzeptübung hat immer eine Geschichte.
Wenn du eine Übung von einem anderen Track forkst, hat die Übung bereits eine Geschichte. In dem Fall bist du fertig.
Ob es bereits Geschichten gibt, die du verwenden kannst, oder Übungen, die du forken kannst, siehst du in der Liste der Geschichten.
Wenn du ein Konzept, aber keine Geschichte hast, empfehlen wir, ein kleines, einfaches Codebeispiel zu schreiben, das das Konzept verwendet, das du einführen willst. Entwickle dann rückwärts eine Geschichte dazu. Halte die Geschichte bewusst simpel. Sie muss keine gute Literatur sein. Sie braucht keine starke Handlung und keine Charakterentwicklung. Ein paar Zeilen reichen schon.
Sprich Ideen für Geschichten mit dem Exercism-Team durch. Wir haben viel Erfahrung darin, passende Geschichten zu finden.
Sobald du eine Geschichte hast, musst du den Code wahrscheinlich ein wenig anpassen, damit er zur Geschichte passt.
Die Arbeit an einem Lehrplan umfasst zwei getrennte, aber miteinander verflochtene Tätigkeiten:
Wir haben festgestellt, dass es Spaß macht und bereichernd ist, die breitere Community an der Umsetzung von Übungen mitarbeiten zu lassen. Das Lehrplan-Design selbst lässt sich jedoch leichter mit einem kleinen Team von Beitragenden angehen, die alle daran arbeiten, den vollständigen Lehrplan mit all seinen Feinheiten zu verstehen.
Trotzdem empfehlen wir, dass das Lehrplan-Team zuerst die ersten fünf oder sechs Konzepte umsetzt, bevor es sich für Beiträge aus der Community öffnet. So stellt das Kernteam der Lehrplan-Designer sicher, dass es den Prozess selbst versteht, bevor es Pull Requests aus der breiteren Community prüfen muss.
Für diese höherstufigen Konzepte ist es außerdem einfacher, Issues anzulegen, und es macht Community-Mitgliedern meist mehr Spaß, daran zu arbeiten, weil es weniger Einschränkungen gibt.
Wir haben noch nicht herausgefunden, wie man Issues zum Erstellen von Konzeptübungen am besten anlegt.
In einigen Tracks haben wir versucht, getrennte Issues für das Konzept selbst und für die Übung anzulegen. In anderen haben wir Issues mit einer Checkliste zum Abarbeiten erstellt. Insgesamt finden wir das noch zu abschreckend und würden gern einen besseren Weg finden.
Sprich bitte mit uns über den Prozess, wenn du anfängst, Issues anzulegen, und wir tun unser Bestes, um mit dir herauszufinden, wie es weitergeht.
Wir aktualisieren die Dokumentation, sobald wir bessere Wege dafür kennen.