Сохранившиеся фрагменты греческих папирусов, источник
В языке и литературе работает известный принцип начитанности: чем больше человек читает хороших книг, тем больше у него словарный запас, шире кругозор. Развивается понятийный аппарат, сама собой улучшается грамотность без всяких учебников.
Применим ли этот принцип в обучении программированию?
▍ Linux 0.0.1
Конечно, изучать исходники классических программ полезно для общего развития. Например, внутренности Linux 0.0.1 демонстрируют пример грамотного системного программирования, а также делают понятнее принципы работы современного ядра Linux. Мы видим, с чего всё начиналось: скромные 8670 строк кода (если не считать пустые), всего 66 системных вызовов, жёсткая оптимизация ядра для архитектуры Intel 386, поддержка исключительно устройств PC/AT и т. д.
Читать этот код (исходники в файле linux-0.01.tar.gz) — удовольствие, сравнимое с чтением Шекспира. Некоторые участки удивительно лаконичны. Скажем, пять строчек для обработки сбоя в ядре (kernel panic):
volatile void panic(const char * s)
{
printk("Kernel panic: %s\n\r",s);
for(;;);
}
Сообщение об ошибке — и система вешается, ничего больше.
Или фрагмент с инициализацией всех подсистем из файла
init/main.c
, который до сих находится в ядре Linux и инициализирует его. Всё это крайне любопытно и даёт возможность прикоснуться к истории, как будто вы своими руками листаете летописи средневековья. Впрочем, древние летописи хранились в виде свитков/рулонов (англ. scrolls), так что слово «листать» здесь не совсем уместно, скорее свитки «прокручивают» — отсюда же современный жаргонизм «скроллить».В любом случае, перед нами ценные исторические артефакты и одновременно приятное, а местами забавное чтиво. Например, такой трогательный комментарий от автора в коде ядра:
* For those with more memory than 8 Mb - tough luck. I've
* not got it, why should you :-) The source is here. Change
* it. (Seriously - it shouldn't be too difficult. ...
Молодой Линус Торвальдс (37 лет) читает лекцию о Git в 2007 году (ещё без очков)
▍ Открытый код — благо для всех
Наличие открытых, понятных и хорошо документированных исходников очень важно для потомков. Во-первых, это важно для качественной поддержки кода. Потом это станет важно для истории и для фанатов, которые спустя десятилетия захотят всё-таки запустить эту программу, но без исходников не смогут. Например, в прошлом году в Сеть утекли исходники классической игры Wipeout от Psygnosis, в том числе оригинальной версии для PSX и портированной версии для Windows.
В итоге фанаты за год переписали игру с нуля, включая рендерер, физику, управление памятью, звуковые эффекты и всё остальное. Они выпустили современные версии под Windows, Linux, macOS и WASM/WebGL (запускается в браузере).
То есть благодаря утечке и вынужденному открытию исходников легендарный гоночный симулятор получил вторую жизнь. Новые версии Wipeout даже лучше оригинала.
▍ Эфемерный труд
Если сравнивать старые кодовые базы с классической литературой, то нелишне помнить, что до наших дней сохранилось всего 1% античной литературы.
Вполне вероятно, что у существующего программного обеспечения похожая судьба. Через пару веков 99,9% существующего софта исчезнет не то что из активного использования, но даже из архивов. В этом смысле существующим архитекторам ПО можно только посочувствовать: в отличие от настоящих архитекторов, их работа не материальна, не имеет особой важности — и очень скоро исчезнет из реальности без следа.
Любопытно смотреть, как историки и археологи по символам пытаются восстановить древние свитки, которые слабо сохранились после извержения Везувия в 79 году н. э.
Сохранившиеся фрагменты греческих папирусов. Слева — обнаружение следов чернил методами машинного обучения, справа — истинное положение дел по ИК-изображению, источник
Точно так же и современные цифровые археологи пытаются скомпилировать старые исходники Linux 0.0.1 с помощью современных компиляторов. Оказалось, что GCC не такой уж обратно совместимый… Адаптировать ядро под современный тулчейн всё-таки удалось с помощью компилятора GCC 4.x. Подготовленные образы нормально работают с современными программами, такими как bash-3.2, coreutils-6.9, dietlibc-0.31 (вместо glibc), bin86-0.16.17, make-3.81, ncurses-2.0.7 и vim-7.1.
Есть мнение, что код — не совсем литература, а скорее шифровка, понятная только «посвящённым» после специальной подготовки и погружения в контекст. Мы его не читаем, а декодируем.
Как уже говорилось, начитанность улучшает мыслительные процессы, развивает человека как личность и помогает ему самому писать лучшие тексты, письма, стихи. К сожалению, в программировании система работает немножко не так. Простой начитанности здесь мало.
В этом есть доля смысла. Никто не спорит, что открытый, доступный код с подробной документацией и комментариями — благо для всех. Но вряд ли на таком коде можно в полной мере учиться программированию. Да, можно освоить какие-то необычные приёмы, увидеть что-то забавное. Но для обучения этого недостаточно. Кроме того, кодовые базы стареют. Ну чему можно научиться из ассемблерного кода навигационного компьютера космического Apollo? Всё это уже не применимо на практике, как и многие другие вещи из старых программ. Теперь это просто исторические артефакты, полезные разве что для общего развития. Тем более примеров по-настоящему хорошего кода не так много. А на плохом (обычном) коде не научишься.
▍ Код как литература
С другой стороны, Дональд Кнут пропагандировал концепцию «грамотного программирования» (Literate Programming, LP). Это методология программирования и документирования, в которой программа состоит из прозы на естественном языке вперемешку с макроподстановками и кодом на языках программирования.
Эту концепцию Дональд Кнут сформулировал в 1981 году при разработке языка компьютерной вёрстки TeX. Соответственно, следующие свои программы он реально публиковал в виде книг: например, TeX и METAFONT (в формате PDF). Это реально настоящие книги, литература, которую приятно читать и в бумажном виде. Правда, без картинок, но зато свёрстано лично автором.
Методика LP регулярно используется в науке для подготовки воспроизводимых исследований и обеспечения открытого доступа к данным. Инструменты грамотного программирования сегодня применяются миллионами разработчиков, особенно в области data science. Для примера, вот как выглядят сопроводительные материалы к современной научной статье по data science: это преимущественно текст с фрагментами кода и объяснением, а также с иллюстрациями и графиками (результаты применения данного кода):
Всё как завещал учитель (Дональд Кнут).
В чём отличается парадигма грамотного программирования от традиционной разработки, так это в том, что здесь разработка программ ведётся в порядке, требуемом логикой и течением мысли разработчика, а не в порядке выполнения программы или в порядке, навязанном компилятором. То есть первична мысль человека, а не структура машинного кода. В данном случае требуется специальный инструментарий (макросы) для скрытия абстракций и традиционного исходного кода. В итоге программа больше похожа на текст эссе.
В последнем поколении инструменты LP вообще не зависят от языка программирования.
▍ Примеры кода для чтения
Для чтения в свободное время можно порекомендовать следующие классические «произведения»:
-
Unix v6
-
xv6 — новая реализация Unix Version 6 (v6) Денниса Ритчи и Кена Томпсона. В общих чертах
xv6
повторяет структуру и стильv6
, но реализована для современных многоядерных процессоров на базе x86 с использованием ANSI C.
-
Ядро Linux 0.12 с комментариями
-
wolf3d, DOOM, Quake (Джон Кармак)
- git, первый коммит (Линус Торвальдс)
pw = getpwuid(getuid()); if (!pw) usage("You don't exist. Go away!");
-
TeX и METAFONT (Дональд Кнут)
- Ретаргетируемый ANSI C компилятор LCC (Дэйв Хэнсон, Кристофер Фрейзер)
- Рендерер PBRT и сопровождающая книга с подробным объяснением принципов физики рендеринга (книга в открытом доступе)
-
«Конструкция компиляторов» (Никлас Вирт). Это не программа, но примеры кода с комментариями
-
SQLite
-
vim (Брам Моленар, умер в августе 2023 г)
-
Навигационный компьютер космического корабля Apollo, включая командный модуль (CM) и лунный модуль (LM)
-
MS-DOS
-
Bitcoin Core
-
Coreutils — основные утилиты GNU
-
Tiny C Compiler и другие программы Фабриса Беллара
- … список можно продолжать (для конкретных языков программирования и прикладных областей есть свои яркие примеры)
Многие из упомянутых выше программ написаны одним автором в присущем ему стиле, так что действительно читаются как художественная литература. Некоторые в течение десятилетий поддерживались одним мейнтейнером, который вносил 99% всех изменений, как Брам Моленар.
Узнавайте о новых акциях и промокодах первыми из нашего Telegram-канала ????
Комментарии (6)
event1
18.10.2023 11:46+5В этом есть доля смысла. Никто не спорит, что открытый, доступный код с подробной документацией и комментариями — благо для всех. Но вряд ли на таком коде можно в полной мере учиться программированию.
Как раз таки на таком и можно. Только не прямо начальному программированию, а на более высоком уровне — проектированию. Когда смотришь на чужой код, то понимаешь, что одни конструкции понятные и прозрачные, а над другими приходиться поломать голову. Соответственно учишься использовать первые и избегать последних. Понимаешь, в каких случаях надо объяснить решение в комментариях, а где это излишне. Начитанность очень помогает, в общем.
semennikov
18.10.2023 11:46+3"Кроме того, кодовые базы стареют. Ну чему можно научиться из ассемблерного кода навигационного компьютера космического Apollo? Всё это уже не применимо на практике, как и многие другие вещи из старых программ" - автор статьи ошибается. Хорошие произведения хороши навсегда. Уверяю Вас что "Золотой осел" равно как и "Дон Кихот Ламанчский" тоже не применимы на практике как и многие другие вещи из старых литературных произведений
PrinceKorwin
18.10.2023 11:46"Золотой осел" равно как и "Дон Кихот Ламанчский" тоже не применимы на практике
Я вас уверяю. Периодически встречаю и тех и других в рабочем процессе :(
semennikov
18.10.2023 11:46:-))
Идеи которые использовались в ассемблерном коде тоже периодически встречаются в рабочем процессе! :-)
А в общем все здание нашей цивилизации стоит на фундаменте старых произведений, будь то книги, картины, скульптуры или коды. И если есть музеи искусств то почему бы не быть музею кода? Красивый код ничуть не хуже красивой скульптуры!
ksbes
18.10.2023 11:46Это был бы интересный открытый проект. Этакий гибрид википедии, и ридонли гитхаба. Я бы на писал, но " ... только что-то порвалась струна и сломалось перо ..."
ksbes
Спасибо за ссылку на Wipout - не знал. Прямо на работе вспомнил детство!