Силлабус


Повноцінний трек Exercism має два типи вправ: концептуальні вправи та практичні вправи. Вони принципово різні й добре доповнюють одна одну.

Концептуальні вправи треку покликані навчити окремих концепцій, що становлять основу конкретної мови програмування. Ці концепції утворюють силабус.

Ця документація містить поради та підказки, як успішно спроєктувати силабус для свого треку.

Мета силабусу

Кінцева мета силабусу - привести студентів до впевненого читання й написання ідіоматичного коду цільовою мовою.

Кожна окрема концептуальна вправа має дуже вузьку спрямованість. Це маленький і точно націлений крок, який наближає студента до розуміння чогось у мові. Вона спирається лише на концепції, введені раніше.

Розвʼязуючи вправу, студент починає знайомитися з концепцією. Розуміння приходить насамперед через дію, значно меншою мірою через пояснення. Пояснювальний матеріал покликаний познайомити студента з ідеями, потрібними для розвʼязання вправи (звідси й вибір назви файлу: «introduction.md»).

Ми хочемо, щоб студенти могли одразу почати писати код, не мусячи зрозуміти все заздалегідь. Щоб цього досягти, ми оминаємо деталі й залишаємо багато чого непоясненим. Де можливо, ми спрощуємо й даємо заглушки коду. Це зменшує когнітивне навантаження на старті й дає час і простір, щоб знання встигли влягтися. Ухвалюючи такий підхід, ми не кажемо, що ці речі студентові знати не потрібно; ми кажемо, що знати їх йому ще не потрібно.

Часто найперші вправи мусять містити неідіоматичний код. Так відбувається тому, що на початку більша частина мови студентові ще невідома, а більшість концепцій ще не введено. Дозволяючи неідіоматичний код у найперших вправах, ми даємо студентам змогу зробити багато менших кроків на знайомій території замість кількох великих кроків на незнайомій. У результаті вони доходять до ідіоматичного коду швидше й з меншим тертям.

Базова структура

Вправи впорядковано у вигляді дерева, на вершині якого як точка відліку стоїть вступна вправа. Пізніші вправи навчають концепцій, які залежать від розуміння концепцій, вивчених раніше.

Перенесення та запозичення

Варто поглянути, як інші мовні треки побудували свої концептуальні вправи. Приклади концептуальних вправ з інших мовних треків можна знайти тут.

Водночас, якщо брати інші вправи за основу для власних, варто подбати про те, щоб отримана вправа була про концепцію такою, якою вона існує у нашій мові. Іноді концепції різняться ледь помітно, іноді кардинально. Іноді концепцій в інших мовах немає взагалі.

Силабус, а отже й дерево концепцій, має відображати концепції, які існують у цій конкретній мові.

Не додаваймо концепцій лише тому, що так роблять інші треки.

У деяких випадках може виникнути спокуса додати концепцію, бо людям часто доводиться обходити її, використовуючи концепції, які вже є. Замість цього варто ввести концепцію, яку мова справді використовує, і подумати про додавання вправи, яка пояснює, як застосовувати її в такій ситуації.

Наприклад, у Go немає переліків. Натомість дерево концепцій Go вводить константи й навчає використовувати константи в ситуаціях, де в інших мовах застосовують переліки.

Прохання про допомогу

Не соромтеся просити про допомогу. Краще запитати заздалегідь або під час роботи над вправою, ніж обговорювати це під час код-ревʼю.

На GitHub можна згадати команду @exercism/learning-mode. На форумі Exercism відкрийте issue у категорії Exercism Support.

З чого почати

Наш досвід показує, що найпрагматичніший спосіб розробити силабус - вирощувати дерево концепцій органічно, починаючи з найпростіших концепцій. Не обовʼязково проєктувати все заздалегідь, і взагалі корисно не думати надто далеко наперед.

Почнімо з самого мінімуму концепцій, тих, що найфундаментальніші для написання чого завгодно цією мовою. Також намагаймося починати з концепцій, найзнайоміших середньому розробнику. Знайоме - добре. Знайоме не заплутує.

Памʼятаймо: кінцева мета - писати ідіоматичний код, але проміжні кроки до неї не завжди ідіоматичні. Використання знайомого, навіть якщо це не найкращий приклад коду цією мовою, допомагає студентові швидше рухатися до мети: коду, типовішого для цієї мови.

Розробка першої вправи

Замість того щоб намагатися розписати все дерево концепцій заздалегідь, почнімо просто з першої вправи. Мета першої вправи - дати студентові почати навчання з якомога меншим тертям. Вони роблять найперший крок до знайомства з тим, який вигляд має код цією мовою. Вони можуть написати невеликий фрагмент коду або ж просто додати кілька рядків до заглушки, щоб виконати вправу. Щоб отримати доступ до цієї вправи, студенти вже розвʼязали «Привіт, світ!». Але в «Привіт, світ!» вони лише змінюють формулювання. Увесь синтаксис мови може бути їм ще незнайомим. Намагаймося оптимізувати вправу під швидкий успіх і під те, щоб студенти засвоїли самий мінімум синтаксису, потрібний для впевненого руху далі.

Докладніше про розробку першої вправи.

Наступні вправи

Перша вправа має відкривати кілька вправ, які вводять фундаментальні концепції. Це будуть, наприклад, примітиви або базові типи та прості операції над ними.

Докладніше про розробку наступних вправ.

А що далі?

Саме тут зазвичай стає цікаво. На цьому етапі можна ввести так багато всього. Як же визначити, які концепції брати наступними?

Це не так уже й важливо. Якщо почати з чогось, що здається розумним, усе буде гаразд.

Докладніше про те, що ми вважаємо «розумним» у контексті розширення дерева концепцій.

Не перетворюймо практичні вправи на концептуальні

Хороша концептуальна вправа надзвичайно сфокусована й зазвичай навчає лише однієї концепції. Зазвичай до неї існує лише один очікуваний підхід до розвʼязання. Це відрізняється від практичних вправ, які відкриті й спонукають до дослідження.

Хороша концептуальна вправа зазвичай буває поганою практичною вправою, і навпаки. Оскільки цілі практичних і концептуальних вправ цілком різні, ми не беремо практичні вправи й не перетворюємо їх на концептуальні. Усі концептуальні вправи ми пишемо з нуля або беремо за основу історії, створені спеціально для навчання простих концепцій.

Ми заохочуємо оминати деталі

Іноді може здатися, що виник глухий кут. Концепція A вимагає розуміння концепції B, а B вимагає розуміння A.

У такому разі спрощуймо. Оминаймо частину складності в одній з них, щоб студенти могли засвоїти іншу. Цілком нормально сказати, що щось буде розкрито глибше пізніше, а поки що студентові достатньо зрозуміти одну цю частину.

Концепції засвоюються глибше поетапно й з часом.

Вибір історій

Концептуальна вправа завжди має історію.

Якщо ми форкаємо вправу з іншого треку, то історія в неї вже є. У такому разі все готово.

Щоб побачити, чи є вже готові історії, які можна використати, або вправи, які можна форкнути, перегляньте список історій.

Якщо є концепція, але немає історії, радимо написати невеликий простий приклад коду, який використовує цю концепцію. А потім підібрати до цього коду історію. Тримайте історію гранично простою. Їй не треба бути хорошою художньою прозою. Їй не потрібен сильний сюжет чи розвиток персонажів. Вона може займати лише пару рядків.

Обговорюйте ідеї історій із командою Exercism. У нас багато досвіду в тому, як придумувати вдалі історії.

Коли історія готова, ймовірно, доведеться трохи підправити код, щоб він їй відповідав.

Внесок спільноти

Робота над силабусом складається з двох окремих, але повʼязаних між собою занять:

  1. Проєктування силабусу: вибір і впорядкування концепцій
  2. Реалізація вправ: написання документації та створення вправ для навчання цих концепцій

Ми помітили, що залучати ширшу спільноту до реалізації вправ і цікаво, і корисно. Сам же дизайн силабусу легше опрацьовувати невеликою командою контрибʼюторів, які всі залучені до розуміння повного силабусу з усіма його тонкощами.

Водночас радимо, щоб команда дизайнерів силабусу спершу реалізувала перші пʼять-шість концепцій, а вже потім відкривалася для внесків спільноти. Це допомагає переконатися, що люди з основної команди дизайнерів силабусу самі розуміють процес, перш ніж їм доведеться переглядати пул-реквести від ширшої спільноти.

Також для цих складніших концепцій легше створювати issue, і зазвичай членам спільноти цікавіше з ними працювати, бо обмежень менше.

Створення issue

Ми досі не зʼясували, як найкраще створювати issue для створення концептуальних вправ.

У деяких треках ми пробували створювати окремі issue для самої концепції та для вправи. В інших ми пробували робити issue зі списком завдань, які треба виконати послідовно. Загалом ми вважаємо, що це все ще надто лячно, і хотіли б знайти кращий спосіб.

Будь ласка, поговоріть з нами про цей процес, коли почнете створювати issue, і ми зробимо все можливе, щоб допомогти визначити, як діяти далі.

Ми будемо оновлювати документацію, коли знайдемо кращі способи підходити до цього.