Мне хотелось разобраться с языком C по-человечески: не «сто задач на указатели», а так, чтобы каждая написанная программа была зачем-то нужна. Готового такого курса я не нашёл, по своей же идее и собрал себе сам.
Получилось следующее: 80 серий в десяти сезонах, 74 часа задач, семь сквозных проектов, всё собирается без единой внешней библиотеки и прогоняется в CI на Linux и macOS. Курс бесплатный, лежит на GitHub, и я решил им поделиться — вдруг будет интересно или пригодится ещё кому-то.
Год назад я уже писал о нём здесь, но с тех пор от того курса, не осталось почти ни одного эмодзи, а уроков стало в два-три раза больше.
Что это такое
Не учебник с упражнениями, а сериал, в котором задачи — часть сюжета.
Ты — специалист по кибербезопасности. В 23:47 на канал, которым ты не пользовался два года, приходит сообщение от человека, которого похоронили позапрошлой осенью. Сообщение зашифровано. Чтобы прочитать его, придётся написать программу.
Каждая серия устроена одинаково: сцена → теория одного концепта → задача → зелёный тест → развязка. Код, который ты пишешь, действительно нужен герою: расшифровать перехват, разобрать пакет, поймать манипуляцию на бирже, посчитать окно связи со спутником.
Season 1: Foundations Серия s01e01 Локация: Москва ?? 1 октября, 23:52 Концепт: биты, hex, XOR одного байта Артефакт: `bytecheck.c` Время: ~25 мин
За курс пишется 80 программ. Ничего не выбрасывается: артефакты серий собираются в сквозной проект сезона, а проекты поздних сезонов линкуются с модулями ранних.
$(CC) -I$(S4) -I$(S6) -I$(S8) -I$(S9) -o moonlight_core \ $(S4)/ml_hash.c $(S6)/ml_crc.c $(S8)/ml_stats.c $(S9)/ml_kalman.c main.c
Хеш из Season 4 работает индексом тикеров в Season 5 и адресацией устройств в Season 6. Не копипастой — линковкой; тест падает, если скопировал реализацию вместо того, чтобы подключить.
Числа в тексте получены кодом серии, а не подобраны: CRC-16 совпадает с эталоном Modbus, период орбиты 7000 км — 97.1 минуты, перцептрон на исключающем «или» даёт ровно 50 %, потому что иначе не может.
Курс живёт в редакторе, а не на сайте
Это, пожалуй, главное отличие от онлайн-платформ, и оно сделано намеренно.
Курс — это репозиторий, который ты клонируешь и открываешь в Cursor. Дальше у тебя на одном экране три вещи: текст серии или твой код, терминал и чат с ИИ-чатом. Не вкладка браузера, где видео отдельно, песочница отдельно, а настоящий проект — отдельно.
cd season-01-foundations/s01e01-strange-message cp starter.c artifacts/bytecheck.c make test # красный — так и задумано
Тест на старте красный не по недосмотру: в starter.c лежат TODO, а не решение. Тест здесь не судья, а спецификация — его вывод говорит, чего не хватает.
Работает и в VS Code, но тогда придётся заменить встроенного тьютора любым другим ИИ-чатом. Про тьютора — дальше, это отдельный сюжет.
ИИ здесь не пишет за тебя код
Про ИИ в программировании говорят так, будто есть один режим: попросил — получил готовое. Есть как минимум два других, и оба к вайб-кодингу отношения не имеют.
Первый — собрать себе программу обучения. Именно так появился этот курс. Не «ИИ, напиши мне курс на C» (так получится оглавление учебника), а разговор о том, чему я хочу научиться, в каком порядке, на каком материале и что должно получиться на выходе. Результат — программа под конкретного человека, а не усреднённая. Это, по-моему, самое недооценённое применение ИИ вообще: не заменять специалистов, а давать людям возможность учиться так, как им удобно.
Второй — помощь во время прохождения. В сюжете есть ИИ-напарник LUNA. Это не литературный приём: LUNA буквально является чатом Cursor, открытым рядом с кодом. Всё, что она «говорит» в тексте серии, можно спросить у неё по-настоящему.
И вот тут важная деталь, ради которой курс, собственно, и устроен так, как устроен.
Курс проходится в режиме Ask, а не Agent. В Agent ассистент правит файлы сам: серия окажется решённой, тесты зелёными, а ты не напишешь ни строки. Через три серии станет ясно, что предыдущие три ты не проходил. В Ask он только отвечает — объясняет, разбирает ошибку, показывает приём на другой задаче. Код пишешь ты.
Разница между «вредит» и «ускоряет» часто в одном слове запроса:
Забирает у тебя работу |
Снимает препятствие |
|---|---|
«Напиши |
«Почему знаковость |
«Почини мою гонку» |
«Как воспроизвести гонку, чтобы она падала стабильно?» |
«Оптимизируй этот код» |
«Как измерить, где именно уходит время?» |
«Найди ошибку» |
«Как читать вывод санитайзера?» |
Поэтому в конце каждой из 80 серий стоят два блока: зелёные запросы — те, что делают сильнее, и красный анти-паттерн — вопрос, который выглядит совершенно разумным и вредит именно здесь, с объяснением почему.
«У меня 50 % на XOR, что не так?» — ничего. Перцептрон иначе не может, и в этом весь смысл серии. Спроси, почему именно 50, а не «почини».
Восемьдесят таких, каждый про ловушку своей серии.
А в Season 8 курс делает то, к чему шёл: ты пишешь LUNA сам. Сквозной проект сезона называется luna_ai и собирается из статистики, регрессии и нейросети, написанных в его сериях. К этому моменту ты знаешь, что внутри у того, с кем разговаривал семь сезонов.
Почему версия 1.0, а не 0.3
Первая версия курса, собранная год назад в Cursor с Sonnet, была полуфабрикатом. Она выглядела как курс — а это, как выяснилось, совсем не то же самое, что быть курсом.
Разбор показал:
Заявлено |
Оказалось |
|---|---|
«100 % готово» |
часть тестов красная |
README серии |
до 3620 строк — их физически не читают |
«~120–160 часов» |
назначено на глаз, не измерено |
единая версия |
три схемы нумерации одновременно в разных файлах |
«сквозные проекты» |
нарративные, кодом не связаны |
Отдельная история — Season 5. Он назывался «Financial Markets» и на треть состоял из пересказа теории рынков: спред, стакан, типы ордеров. Красиво и совершенно бесполезно для курса языка C. Сезон переименован в «Real-World Data», и предметом стало то, обо что программист на C бьётся в реальности: деньги, которые не бывают double; битые выгрузки; часовые пояса; UTF-8, в котором strlen считает байты.
Нынешняя версия — результат сплошного рефакторинга уже в Claude Code. Разница между «сгенерировать» и «довести» и есть тот самый разрыв между полуфабрикатом и продуктом, которым не стыдно поделиться.
Что можно проверить
Мы больше не пишем «100 % готово». Вместо этого — числа, которые пересчитываются командой:
Серий |
80 в 10 сезонах |
Чистого времени на задачи |
74 ч 00 мин — сумма по шапкам серий |
Сквозных проектов |
7 |
Внешних библиотек |
ни одной, включая |
Платформы в CI |
Linux и macOS |
sqrt, exp и генератор псевдослучайных чисел написаны вручную — чтобы результат побитово воспроизводился на любой машине. Тесты детерминированы: ни таймингов, ни идентификаторов процессов, ни системного времени в сравниваемом выводе.
make check # ссылки + весь курс make projects # сборка сквозных проектов make progress # где ты сейчас
Чего у курса нет
Его ни разу не прошли целиком снаружи. Все проверки внутренние: сборка, тесты, ссылки. Ни одна из них не ловит того, что видит человек, читающий подряд, — тон, повторы, места, где объяснение не сработало.
Так что если возьмётесь за серию и что-то не сойдётся — issue с выводом теста будет самой полезной помощью из возможных.
Репозиторий: github.com/gfazzz/moonlight-course · MIT · берите, форкайте, переделывайте под себя.
Комментарии (6)

Octagon77
01.09.2026 18:29Сама идея мне кажется порочной. Сто задач на указатели - тоже неправильно, но все таки а немного меньшей степени, идея задачи столь фундаментальна что такое как-то можно (пытаться) оправдывать. Как по мне, учащийся должен писать код по ходу обучения исключительно сам, и исходя не из его нужности, а из недоумения.
Если при чтении той же документации или просто книги по С все понятно, читаем дальше. Если замечаем, что понимать можно неоднозначно, или что есть не прояснённые corner cases, или ещё что - проверяем немедленно. В итоге получаем а) минимальный и б) персонализированный набор точно таких же маленьких, или не вполне маленьких если дошел до обсуждения того, как писать большие программы, фрагментов.
Есть засада - а вдруг показалось, что понятно, а понято не было. Предлагается решение: в конце наждого раздела задаётся себе два вопроса: что я, собственно, только что узнал и что нового я теперь могу сделать. После чего, просто на всякий случай, что нового можешь - то и проделываешь. По результатам вполне может оказаться необходимым вернуться к началу чтения, но на этот раз наличие недоумения будет гарантированно.
А предлагать готовое - медвежья услуга...

godfather Автор
01.09.2026 18:29Описанный вами подход хорош для фундаментального обучения при наличии внушительной массы времени, а я же предлагаю рассмотреть подход, который возможно позволит что-то изучить легче и быстрее благодаря современным технологиям.

WizardSuey
01.09.2026 18:29Я в принципе понял, что пытается донести автор. Довольно хорошая идея - использовать ИИ в качестве учителя, вместе с которым составляешь себе индивидуальный план обучения чисто для себя (я и сам таким промышлял).
Поэтому, если для Вас это довольно удобный метод обучения, то лучше уж так обучаться чему-то, чем сидеть и ждать особого курса и вообще ничему не учиться.

Dismal
01.09.2026 18:29Я ожидал настоящий сериал с видео, а тут что-то на гитхабе, какие-то ИИ-туторы и текст пахнущий нейрослопом. Видимо, не для миллениалов. Пойду тоже книгу полистаю.
constaprol
несколько раз прочитал статью, несколько раз прочитал репозиторий, вот вообще ничего не понял. Видно, мне гораздо проще учиться по книгам
godfather Автор
Ну я собственно начал с того, что посмотрел шикарный курс лекций Harvard CS 50 и прочитал книгу по C издательства HeadFirst. А вот для того, чтобы закрепить материал и подготовил данный курс (в credits и theory которого, кстати эти учебные материалы приведены).
Но на мой взгляд, главный недостаток книг (как впрочем и видеолекций), какими бы замечательными они не были - отсутствие в них интерактива. А скриншоты экрана приложение с объяснением за что какая кнопка отвечает в "компьютерных" книгах у меня всегда вызывали недоумение.