|
| 1 | +# Syllabus |
| 2 | + |
| 3 | +A fully featured Exercism track has two types of exercises: Concept Exercises and Practice Exercises. |
| 4 | +They are fundamentally different and complement each other well. |
| 5 | + |
| 6 | +A track's [Concept Exercises](/docs/building/tracks/concept-exercises) are exercises designed to teach individual concepts that form the basis of a specific programming language. |
| 7 | +These concepts form a _syllabus_. |
| 8 | + |
| 9 | +This documentation contains pointers and tips on how to successfully design a syllabus for your track. |
| 10 | + |
| 11 | +## The goal of a syllabus |
| 12 | + |
| 13 | +The end goal of a syllabus is to lead students to be comfortable reading and writing idiomatic code in the target language. |
| 14 | + |
| 15 | +Each individual Concept Exercise is very tightly focused. |
| 16 | +It is a small and highly-targeted step that moves the student towards understanding something about the language. |
| 17 | +It builds only on concepts that have been introduced previously. |
| 18 | + |
| 19 | +By solving the exercise, the student begins the process of becoming familiar with the concept. |
| 20 | +Understanding comes primarily through doing, much less so through explanations. |
| 21 | +The explanatory content is there to **introduce** the student to the ideas they need to solve the exercise (thus the choice of filename- "introduction.md") |
| 22 | + |
| 23 | +We want to allow students to start writing code immediately, without having to understand everything up front. |
| 24 | +In order to achieve this we hand-wave over details and we leave a lot of things unexplained. |
| 25 | +We simplify and provide code stubs where possible. |
| 26 | +This reduces the cognitive burden of getting started and provides the time and space for the knowledge to sink in. |
| 27 | +By taking this approach we're not saying that the student doesn't need to know these things, we're saying that they don't need to know them **yet**. |
| 28 | + |
| 29 | +Often the earliest exercises need to contain non-idiomatic code. |
| 30 | +This is because in the beginning most of the language is still unknown to the student, and most of the concepts have not yet been introduced. |
| 31 | +By allowing non-idiomatic code in the earliest exercises, students are able to take many smaller steps in familiar territory rather than a few big steps in unfamiliar territory. |
| 32 | +The result is that they are able to reach the stage of idiomatic code more quickly and with less friction. |
| 33 | + |
| 34 | +## Basic structure |
| 35 | + |
| 36 | +Exercises are structured as a tree with an introductory exercise at the top as the starting point. |
| 37 | +Later exercises teach concepts that depend on having understood concepts that are taught earlier. |
| 38 | + |
| 39 | +## Porting and borrowing |
| 40 | + |
| 41 | +It can be worth looking at how other language tracks have built out their concept exercises. |
| 42 | +You can find examples of Concept Exercises from other language tracks [here](https://exercism.org/docs/building/tracks/stories). |
| 43 | + |
| 44 | +That said, if you decide to use other exercises as a starting point for your own, be careful to ensure that the resulting exercise is about the concept as it exists in your language. |
| 45 | +Sometimes concepts differ subtly, sometimes radically. |
| 46 | +Sometimes concepts don't exist in other languages at all. |
| 47 | + |
| 48 | +The syllabus, and therefore the concept tree, should represent the concepts that exist in this specific language. |
| 49 | + |
| 50 | +Don't include concepts just because other tracks do. |
| 51 | + |
| 52 | +In some cases it might be tempting to put a concept in because people often have to work around it by using concepts that do exist. |
| 53 | +Rather than doing this, introduce the concept that the language _does_ use, and consider adding an exercise that explains how to use it in that type of situation. |
| 54 | + |
| 55 | +For example, in Go there are no enums. |
| 56 | +Instead the Go concept tree introduces constants, and teaches how to use constants in the type of situation where you might use enums in other languages. |
| 57 | + |
| 58 | +## Asking for help |
| 59 | + |
| 60 | +Don't hesitate to ask for help. |
| 61 | +It's better to ask up front or while working on an exercise rather than discussing during code review. |
| 62 | + |
| 63 | +On GitHub you can mention the team @exercism/learning-mode. |
| 64 | +In Slack you can ask in the #learning-mode channel. |
| 65 | +Please email [email protected] if you need an invitation to our Slack workspace. |
| 66 | + |
| 67 | +## Getting started |
| 68 | + |
| 69 | +Our experience has taught us that the most pragmatic way to develop a syllabus is to grow the concept tree organically, starting with the simplest concepts. |
| 70 | +We don't have to design everything up front, and it's actually generally useful to not think too far ahead. |
| 71 | + |
| 72 | +We start with the bare minimum of concepts — those that are most fundamental to writing **anything** in the language. |
| 73 | +We also try to start with concepts that are most familiar to the average developer. |
| 74 | +Familiar is good. |
| 75 | +Familiar is not confusing. |
| 76 | + |
| 77 | +Remember, while the endpoint is to write idiomatic code, the stepping stones to get there are not always idiomatic. |
| 78 | +Using what is familiar — even if it is not a great example of code in that language — helps move a student more quickly toward the goal of code that is more typical of the language. |
| 79 | + |
| 80 | +### Developing the first exercise |
| 81 | + |
| 82 | +Rather than trying to map out the entire concept tree up front, just start with the first exercise. |
| 83 | +The goal of the first exercise is to allow the student to start learning with the least amount of friction as possible. |
| 84 | +They are taking the very first step towards getting familiar with what code in this language looks like. |
| 85 | +They might write a small piece of code, or perhaps just make a couple of additions to a stub in order to complete the exercise. |
| 86 | +The students have already solved "Hello, World!" in order to access this exercise. |
| 87 | +But in "Hello, World!" they are only changing the wording. |
| 88 | +All of the syntax of the language might still be unfamiliar. |
| 89 | +Try to optimize for a quick win and getting students familiar enough with the bare necessities of syntax to be able to move forward confidently. |
| 90 | + |
| 91 | +Read more about [developing the first exercise](/docs/building/tracks/syllabus/first-exercise.md). |
| 92 | + |
| 93 | +### The next exercises |
| 94 | + |
| 95 | +The first exercise should unlock a handful of exercises that introduce fundamental concepts. |
| 96 | +These will be things like primitives or basic types and simple operations on those types. |
| 97 | + |
| 98 | +Read more about [developing the next exercises](/docs/building/tracks/syllabus/next-exercises.md). |
| 99 | + |
| 100 | +### And then what? |
| 101 | + |
| 102 | +This is where it often starts getting interesting. |
| 103 | +There is so much you _could_ introduce at this point. |
| 104 | +How do you decide what concepts to tackle next? |
| 105 | + |
| 106 | +It kind of doesn't matter. |
| 107 | +As long as you start somewhere that seems reasonable, it will be fine. |
| 108 | + |
| 109 | +Read more about what we think "reasonable" means in the context of [expanding the concept tree](/docs/building/tracks/syllabus/expanding.md). |
| 110 | + |
| 111 | +## Do not convert practice exercises |
| 112 | + |
| 113 | +A good Concept Exercise is extremely focused, and ideally teaches only one concept. |
| 114 | +There will usually be only one expected approach to solving it. |
| 115 | +This is in contrast to Practice Exercises, which are open ended and lend themselves to exploration. |
| 116 | + |
| 117 | +A good Concept Exercise is usually a bad Practice Exercise, and vice versa. |
| 118 | +Since the goals of Practice Exercises and Concept Exercises are completely different, we do not take Practice Exercises and convert them into Concept Exercises. |
| 119 | +We write all Concept Exercises from scratch or base them on stories that were explicitly crafted for the purpose of teaching simple concepts. |
| 120 | + |
| 121 | +## We encourage hand-waving |
| 122 | + |
| 123 | +Sometimes you'll feel like there is a deadlock. |
| 124 | +Concept A requires understanding concept B, and B requires understanding A. |
| 125 | + |
| 126 | +In this case simplify. |
| 127 | +Hand-wave over some complexity in one so that you can get students familiar with the other. |
| 128 | +It's perfectly fine to say that something will be introduced in more depth later, and that for now the student just needs to understand this one bit. |
| 129 | + |
| 130 | +Concepts are understood more deeply in stages and over time. |
| 131 | + |
| 132 | +## Selecting stories |
| 133 | + |
| 134 | +A concept exercise always has a story. |
| 135 | + |
| 136 | +If you're forking an exercise from another track, then the exercise will already have a story. |
| 137 | +In that case, you're all set. |
| 138 | + |
| 139 | +To see if there are any existing stories you can use or exercises you can fork, check out the [list of stories](docs/building/tracks/stories). |
| 140 | + |
| 141 | +If you have a concept but no story then our recommendation is to write a small, simple code example that uses the concept that you're introducing. |
| 142 | +Then reverse engineer a story onto the code. |
| 143 | +Keep the story stupidly simple. |
| 144 | +It doesn't have to be good fiction. |
| 145 | +It doesn't need a strong plot or character development. |
| 146 | +It can be just a couple of lines long. |
| 147 | + |
| 148 | +Bounce ideas for stories with the Exercism team. |
| 149 | +We have a lot of experience coming up with suitable stories. |
| 150 | + |
| 151 | +Once you have a story you will likely need to tweak the code a bit to get it to fit the story. |
| 152 | + |
| 153 | +## Contributions from the community |
| 154 | + |
| 155 | +Working on a syllabus involves two separate but intertwined activities: |
| 156 | + |
| 157 | +1. Syllabus design: selecting and ordering concepts |
| 158 | +2. Exercise implementation: writing documentation and creating exercises to teach those concepts |
| 159 | + |
| 160 | +We've found that it's both fun and enriching to get the wider community to contribute to implementing exercises. |
| 161 | +The syllabus design itself, though, is easier to tackle with a small team of contributors who are all engaged in building up an understanding of the full syllabus with all of its intricacies. |
| 162 | + |
| 163 | +That said, we recommend that the syllabus design team implements the first five or six concepts first, before opening up for community contributions. |
| 164 | +This helps ensure that the people on the core team of syllabus designers understand the process themselves before having to review pull requests from people in the broader community. |
| 165 | + |
| 166 | +It's also easier to create issues for these higher-order concepts and tends to be more fun for community members to work on them, since there are fewer constraints to worry about. |
| 167 | + |
| 168 | +## Creating issues |
| 169 | + |
| 170 | +We still haven't figured out how to best create issues for creating concept exercises. |
| 171 | + |
| 172 | +In some tracks we've tried creating separate exercises for the concept itself and the exercise. |
| 173 | +In others we've tried making issues that have a checklist to work through. |
| 174 | +Overall, we think this is still too intimidating, and we'd like to find a better way. |
| 175 | + |
| 176 | +Please talk to us about the process as you start making issues, and we will do our best to help figure out how to proceed. |
| 177 | + |
| 178 | +We will update the documentation as we learn better ways of tackling this. |
0 commit comments