Сохранившиеся фрагменты греческих папирусов, источник

В языке и литературе работает известный принцип начитанности: чем больше человек читает хороших книг, тем больше у него словарный запас, шире кругозор. Развивается понятийный аппарат, сама собой улучшается грамотность без всяких учебников.

Применим ли этот принцип в обучении программированию?

▍ 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 вообще не зависят от языка программирования.

▍ Примеры кода для чтения


Для чтения в свободное время можно порекомендовать следующие классические «произведения»:


Многие из упомянутых выше программ написаны одним автором в присущем ему стиле, так что действительно читаются как художественная литература. Некоторые в течение десятилетий поддерживались одним мейнтейнером, который вносил 99% всех изменений, как Брам Моленар.

Узнавайте о новых акциях и промокодах первыми из нашего Telegram-канала ????

Комментарии (6)


  1. ksbes
    18.10.2023 11:46
    +3

    Спасибо за ссылку на Wipout - не знал. Прямо на работе вспомнил детство!


  1. event1
    18.10.2023 11:46
    +5

    В этом есть доля смысла. Никто не спорит, что открытый, доступный код с подробной документацией и комментариями — благо для всех. Но вряд ли на таком коде можно в полной мере учиться программированию.

    Как раз таки на таком и можно. Только не прямо начальному программированию, а на более высоком уровне — проектированию. Когда смотришь на чужой код, то понимаешь, что одни конструкции понятные и прозрачные, а над другими приходиться поломать голову. Соответственно учишься использовать первые и избегать последних. Понимаешь, в каких случаях надо объяснить решение в комментариях, а где это излишне. Начитанность очень помогает, в общем.


  1. semennikov
    18.10.2023 11:46
    +3

    "Кроме того, кодовые базы стареют. Ну чему можно научиться из ассемблерного кода навигационного компьютера космического Apollo? Всё это уже не применимо на практике, как и многие другие вещи из старых программ" - автор статьи ошибается. Хорошие произведения хороши навсегда. Уверяю Вас что "Золотой осел" равно как и "Дон Кихот Ламанчский" тоже не применимы на практике как и многие другие вещи из старых литературных произведений


    1. PrinceKorwin
      18.10.2023 11:46

      "Золотой осел" равно как и "Дон Кихот Ламанчский" тоже не применимы на практике

      Я вас уверяю. Периодически встречаю и тех и других в рабочем процессе :(


      1. semennikov
        18.10.2023 11:46

        :-))

        Идеи которые использовались в ассемблерном коде тоже периодически встречаются в рабочем процессе! :-)

        А в общем все здание нашей цивилизации стоит на фундаменте старых произведений, будь то книги, картины, скульптуры или коды. И если есть музеи искусств то почему бы не быть музею кода? Красивый код ничуть не хуже красивой скульптуры!


        1. ksbes
          18.10.2023 11:46

          Это был бы интересный открытый проект. Этакий гибрид википедии, и ридонли гитхаба. Я бы на писал, но " ... только что-то порвалась струна и сломалось перо ..."