А теперь о самом курсе.
Возможно, для чисто теоретической подготовки к собеседованию он чем-то и поможет, но как курс по практической разработке ядра Linux — это крайне слабый продукт.
На мой взгляд, это худший курс OTUS из тех, что я видел.
Почему:
* за всё время обучения — 49 часов 27 минут — полноценной практической разработки почти нет; * примерно в 6 видео из 33 есть отдельные демонстрационные фрагменты, где показывают Linux-консоль, запуск команд или уже готовый код; * но это не разработка “с нуля” и не нормальный практический процесс; * код в основном уже заранее написан, а автор лишь кратко поясняет: “вот этот блок делает это, вот этот — то”; * полноценного написания модуля ядра на глазах у студента практически нет; * полноценного написания скриптов на глазах у студента практически нет; * работа со средой разработки почти не показана; * сборка, запуск, отладка и исправление ошибок не разобраны как нормальный инженерный цикл; * Linux-консоль появляется лишь в отдельных местах, но не становится рабочей средой курса.
Фактически основная масса курса — это слайды и устный пересказ материала. Отдельные практические вставки есть, но они занимают малую часть курса и не превращают его в практическое обучение.
При этом в описании курса заявлено:
“это практическое обучение, которое помогает специалистам с опытом программирования на C понять устройство ОС на низком уровне”.
На мой взгляд, это описание не соответствует фактическому содержанию курса. Практическая часть там есть только фрагментарно, а не как основа обучения.
Более того, на некоторых слайдах есть технические ошибки.
Пример 1: в deadlock-примере поток берёт `spin_lock(&lock1)`, затем внутри удержания spinlock выполняет `msleep(100)`, после чего пытается взять второй lock. Это некорректный пример: спать под spinlock нельзя. Такой код должен привести не к “красивой демонстрации deadlock”, а к проблеме уровня `sleeping/scheduling while atomic`.
Пример 2: в теме про `spin_lock()` сначала показывается код, где обычный `spin_lock()` через `__raw_spin_lock()` делает `preempt_disable()`, а не `local_irq_disable()`. Но затем в итогах говорится, что процесс сопровождается отключением локальных прерываний. Для обычного `spin_lock()` это неверно: прерывания отключают варианты `spin_lock_irq()` / `spin_lock_irqsave()`, а не простой `spin_lock()`.
Пример 3: в теме “Top-half и Bottom-half обработчиков прерываний. Softirq, Tasklets, Workqueue” Bottom-half подаётся как некий “более спокойный контекст”, где можно выполнять длительные и блокирующие операции. Это грубое упрощение, которое формирует неправильное понимание. `softirq` и `tasklet` выполняются в atomic/softirq-контексте: там нельзя спать, нельзя брать mutex и нельзя выполнять блокирующие операции. Блокирующие операции допустимы уже в `workqueue` или `threaded IRQ`, потому что там работа выполняется в контексте kernel thread / process context.
В итоге складывается впечатление, что курс — это не практическое обучение разработке ядра Linux, а в основном набор слайдов с пересказом тем, причём местами с ошибками.
Как обзор терминов — возможно, курс кому-то пригодится.
Как практический курс по Linux kernel development — нет.
За 49 часов такого курса студент должен многократно увидеть живой цикл:
написали модуль → собрали → загрузили → посмотрели `dmesg` → получили ошибку → исправили → выгрузили → повторили.
В этом курсе такой цикл почти не показан. Есть отдельные демонстрации, но полноценной практической разработки ядра Linux как системного процесса я там не увидел. |