«Качество появляется только тогда, когда кто-нибудь несёт ответственность лично».
— Фредерик П. Брукс
Привет!
Предлагаю вашему вниманию вольный перевод эссе "A Generation Lost in the Bazaar" Пола-Хеннинга Кампа, повествующего нам о печальной судьбе поколения IT-профессионалов, выросших в период бума доткомов, а также о фундаментальных проблемах в UNIX, напрямую влияющих на качество и портабельность ПО. Обо всём по порядку.
Собор и базар
В своей заметке автор использует метафору собора и базара, описанную в эссе Эрика Рэймонда "Собор и базар", я нахожу уместным привести отрывок из текста признанного перевода эссе:
---начало цитаты---
Linux — удивительная система. Кто бы мог подумать, что несколько тысяч разработчиков, разбросанных по всей планете и сотрудничающих только через Интернет, смогут создать операционную систему мирового класса. Я во всяком случае так не думал. К тому времени как Linux оказалась в поле моего зрения в начале 1993 года, я уже около десяти лет участвовал в разработке UNIX'a и открытых программ.
Linux перевернула мои представления о том, что я знаю. Я считал, что основным в разработке небольших инструментов для UNIX'a является их быстрое проектирование и эволюционирующее программирование в течение многих лет. И в то же время я верил, что по мере того как сложность разработки увеличивается, необходим более централизованный подход. Я верил, что разработка самого сложного программного обеспечения (например, операционных систем или просто больших инструментов, таких как Emacs) должна быть подобна строительству собора. Такие программы должны создаваться мастерами-индивидуалистами или небольшими группами волшебников, работающими в строгой изоляции, не допуская преждевременных бета-версий.
Меня очень удивил стиль разработки Линуса Торвальдса — частый выпуск релизов, доступность всех исходных текстов и терпимость к разнородным программам. Это совсем непохоже на размеренное строительство собора, сообщество Linux скорее напоминает шумный базар, с множеством различных подходов и направлений. То, что на этом базаре рождается согласованная стабильная операционная система, кажется чудом из чудес.
Меня потрясло, что этот базарный стиль работает и работает хорошо. Я не только участвовал в разработке индивидуальных проектов, но также пытался понять, почему в мире Linux'a не только не возникает беспорядка, но напротив он движется вперед со скоростью, которой строители собора могут только позавидовать.
К середине 1996 года мне показалось, что я начал понимать. Судьба предоставила мне прекрасный шанс проверить мою теорию. Это был проект разработки открытого программного обеспечения, который я сознательно провел в базарном стиле. Успех этого проекта превзошел все ожидания.
---конец цитаты---
---начало перевода---
Введение
Книга Эрика Рэймонда "Собор и базар", вышедшая тринадцать лет назад, пополнила наш словарный запас новой терминологией. Помимо этого, она предсказывала конец каскадной модели разработки ПО и закат эры крупных софтверных компаний, благодаря возникшему в народе движению за Свободное Программное Обеспечение.
После прочтения книги мне было над чем подумать, но она меня не убедила. С другой стороны, я имею прямое отношение к миру СПО, так что хоть я и не могу ничем помочь, было бы замечательно, если бы автор оказался прав.
Другая книжка, которая оказалось у меня в домике на берегу моря этим летом, также навевает думы. Она явно глубже книги Рэймонда (кстати, положительно ссылается на него), это Frederick P. Brooks’s — «The Design of Design». Причём сколько раз я кивал головой в знак согласия, наслаждаясь стилем письма Брукса и его умением подать материал, столько же раз я впадал в депрессию от прочитанного.
Эра доткомов
Тринадцать лет назад был достигнут апогей эры доткомов 90-х, когда каждый школьник был веб-программистом или каждый отчисленный из колледжа уже владел своим веб-стартапом. Я получил истинное наслаждение, когда пробовал обучать этих салаг фундаментальным профессиональным навыкам — созданию скриптов автоматического деплоя, системам контроля версий и так далее. Ностальгия, конечно — на самом было не до веселья.
Мы не можем отрицать, что вся эра доткомов явилась настоящим бедствием для IT/CS индустрии в целом и для UNIX в частности. Под удар попало качество программных продуктов.
У меня нет точных сведений, насколько IT индустрия увеличилась в объёмах на протяжении периода доткомов. Моя личная оценка такова, если считать количество всплывших на поверхность профессий, что наша ниша выросла на два порядка, то есть более чем на 10,000%.
Влюбиться в компьютеры просто — практически любой может накодить рабочую программу, ровно как практически любой может прибить гвоздём одну доску к другой, за несколько попыток уж точно. Проблема в том, что доля таких вот непрофессионально прибитых друг к другу досок крайне мала, если рассматривать рынок домашней мебели. А чтобы перейти от двух досок к прилично выглядящему комплекту стульев или к встроенному шкафу требуются талант, практика и образование. Те самые (10,000% — 100%) = 9,900% дополнительных процентов не имели ни опыта, ни образования, когда они пришли в IT отрасль. И до того, как у них появился шанс получить это, вечеринка закончилась и большинство осталось вообще без работы.
Я проявлю милосердие и замечу, что те, кто зацепился за должность, были, несомненно, наиболее талантливыми и наиболее умелыми из всех, но даже в этом случае нельзя отрицать, что они не состоялись как IT-профессионалы из-за отутствия жизненного опыта.
Базарный стиль, за который так ратовал Э. Рэймонд, "Просто запили", противопоставляемый грамотно спроектированным соборам из пре-доткомовского периода, не сгинул после краха доткомов, к сожалению, и сегодня UNIX скоротечно тонет под собственной тяжестью.
UNIX
Я обновил свой ноутбук. Вот уже как 18 лет у меня на нём стоит dev-версия FreeBSD и сборка минималистичной рабочей среды из исходников занимает весь день, потому что оно пытается выстроить логику и архитектуру из анархического мусора, именуемого Э. Рэймондом как базар.
Издалека кажется, что коллекция портов FreeBSD это нечно вроде карты для базара, чтобы пользователям FreeBSD было легче найти что-либо. На практике же эта «карта» состоит, в данный момент, из 22,198 файлов с кратким описанием каждой палатки на базаре — несколько строк о том, что внутри имеется и где почитать про это подробнее. Ещё имеется 23,214 make-файлов, говорящих нам, что делать с каждой софтиной из тех, что мы найдём в палатках. Эти make-файлы пытаются информировать нас о возможных сценариях, различных выборочных опциях и их значениях по-умолчанию. Карта поставляется вместе с 24,400 patch-файлами, чтобы сгладить кривизну предлагаемых ручных поделок. Хотя, на самом деле, большинство этих патчей используется для исправления проблем переносимости ПО.
Наконец, эта карта услужливо говорит нам, что если мы хотим установить www/firefox, то сначала нужно выкачать devel/nspr, security/nss, databases/sqlite3 и так далее. Как только мы найдём их при помощи карты, а затем поищем их зависимости, а затем рекурсивно получим список зависимостей их зависимостей, то у нас наберётся список покупок на 122 пакета, которые нам обязательно нужны, прежде чем можно будет получить www/firefox.
Мы все любим компонентно-ориентированный подход к разработке ПО. Но даже в самом тривиальном случае, однако, методология повторного использования кода полностью чужеродна на базаре: программы в коллекции портов FreeBSD содержат как минимум 1,342 копипасты криптографических алгоритмов.
Если бы подобное игнорирование методологии повторного использования воплотилось бы в виде механизма самодостаточных и независимых пакетов с ПО, тогда был бы компромисс между дубликацией кода и лёгкостью управления пакетами. Но это явно не наш случай — пакеты образуют запутанную паутину из бессистемных зависимостей, что приводит к ещё большей дубликации кода и бесполезной трате ресурсов.
Вот ироничный пример: библиотека Сэма Лиффера graphics/libtiff лежит на пути к www/firefox, являясь одним из тех 122 пакетов в общей цепочке зависимостей. В то время как целевая программа — веб-браузер Firefox — не умеет отображать TIFF картинки . Я не пытался выяснить, по каким причинам 10 пакетов из 122 требуют Perl и 7 требуют Python; причём один из них, devel/glib20, требует оба языка, даже не могу представить, зачем.
Далее по списку… здесь имеет место Принцип Питера, который звучит как «В иерархической системе любой работник поднимается до уровня своей некомпетентности», а глобально его можно сформулировать так: «Любая хорошо работающая вещь или идея будет использоваться во всё более сложных условиях, пока не станет причиной катастрофы». В программной инжененрии используется частный случай — «Умирающий проект, который малым за малым становится слишком сложным для того, чтобы его понимали собственные же разработчики». Вот видите, нам нужны 3 различные версии make, макропроцессор (m4), ассемблер и куча других интересных пакетов. В конце пищевой цепочки, так сказать, находится инструмент libtool, который призван скрыть тот факт, что в UNIX нет стандартизированного метода создания динамических библиотек (shared libraries).
Вместо того, чтобы стандартизировать этот метод для всех никсов — например, реализовать в виде одного флага для команды ld(1) — с участием Принципа Питера это вылилось в отдельную компетенцию libtool. Причём в данном случае этот принцип ощутимо хорошо приложился — исходный код для devel/libtool содержит 414,740 строк. Половина этого кода — тесты, что в целом похвально, но на деле это просто последствия Принципа Питера: тесты искусно разведывают функциональность сложной системы с целью выявить проблемы, которые вообще не должны быть на первом месте.
Что ещё более досадно, 31,085 из тех строчек кода — нечитаемый корявый shell-скрипт, называется configure. Идея в том, что этот configure скрипт выполняет примерно 200 автоматических тестов, чтобы пользователь не был обременён ручными разборками с libtool. Это пипец бестолковая идея, которая была сполна окритикована ещё в 80-х, когда она только появилась. Бестолковая потому, что она позволяет исходному коду претендовать на якобы портабельность, прикрываясь configure скриптом как фасадом, вместо того, чтобы на самом деле обеспечить качественную портабельность.
Абсурдно, что идея с configure выжила.
В 1980 мы видели несколько реализаций UNIX: Cray-1s с поддержкой 24-битных указателей, Amdahl UTS (UNIX для IBM mainframe), целый букет более-менее грамотных реализаций SysV+BSD от производителей миникомпьютеров, недо-UNIX поделки от компаний вроде Data General, даже полноценный клон UNIX — Coherent от компании Mark Williams.
Configure скрипты того времени писались от руки и выполняли задачи вроде выяснения — это BSD- или SysV-подобный UNIX, чтобы затем скопировать подходящий Makefile и, может быть, парочку .h в нужное место. Позже configure скрипты стали более амбициозными, что уже издалека можно распознать как прецендент для Принципа Питера. Но вместо того, чтобы стандартизировать UNIX и исключить необходимость этих скриптов, какой-то умник написал программу autoconf, чтобы автоматически генерировать configure-скрипты.
Сегодняшние UNIX/Posix-образные системы, даже если учитывать версию IBM z/OS mainframe, с точки зрения наблюдателя из 1980 практически одинаковы. До сих пор 31,085 строчек кода configure скрипта для libtool проверяют наличие <sys/stat.h> и <stdlib.h> не смотря на то, что даже те никсы, в которых их не хватало, не имели достаточно памяти, чтобы запустить libtool; или места на диске, чтобы уместить 16 Мб исходного кода libtool.
Как же так случилось?
Ну, по причинам, которые никогда никого не волновали, программа autoconf была написана на допотопном языке макросов m4, что привело к такому внешнему вид тестов:
Само собой разумеется, адекватные программисты никогда бы не пожелали добровольно копаться в этом, даже если бы у них был навык, поэтому эти скрипты для autoconf создаются методом копипасты, часто оказываясь затерянными среди черезмерно жирных стандартных макросов, покрывающих «стандартные тесты», о которых я упомянул выше.
Да, те самые тесты, проверяющие наличие проблем совместимости, с которыми никто не сталкивался уже лет 20.
Это также объясняет, почему libtool проверяет не менее чем 26 различных имён компиляторов Fortran, которых в моей системе просто нет, а затем тратит ещё 26 тестов, чтобы выяснить, какие из этих 26 несуществующих компиляторов поддерживают флаг -g.
Это печальная реальность базара, восхваляемого Рэймондом в своей книге. Кучка старых прогнивших насквозь хаков, бесконечно скопипащенных поколением невежд а-ля «IT профессионалы». Можно прокричать им в ухо «IT архитектура!», но они всё равно не услышат.
Сегодня уже сложно поверить, но под этим мусором, затрудняющим движение, находятся руины красивого собора UNIX, заслуженно славящегося своей простотой дизайна, достаточностью функций, элегантностью исполнения… Всё тлен, иначе говоря.
Одно из великолепных высказываний Брукса — «Качество появляется только тогда, когда кто-нибудь несёт ответственность лично». Я удивлён, что Брукс не приводит UNIX в качестве примера к этому высказыванию, ведь мы можем с почти хирургической точностью определить момент, когда UNIX начал фрагментироваться — в начале 90-х AT&T выделила UNIX и продала все права на него компании Novell, тем самым забрав систему у её архитекторов. (Денис Ритчи сравнил эту сделку с продажей души за батон хлеба — прим. переводчика).
Другие недавно пришли к такому же мнению, как и Брукс. Некоторые пытались навязать своего рода здравомыслие или даже сложить закон формально, в виде технических стандартов, надеясь навести порядок и структуру на базаре. Все попытки эффектно провалились, потому что поколение затерянных на базаре дотком-вундеркиндов никогда не видело собора и, следовательно, не может даже представить себе, почему и зачем нам нужны эти соборы.
Это печальная ирония, конечно. Те, кому посвящена книга Брукса «Design of Design», найдут её совершенно непостижимой. Ну а для тех товарищей, кто хоть раз задумывался о том, что использование макросов m4 для конфигурации autoconf для генерации shell-скрипта для проверки наличия 26 компиляторов Fortran с целью собрать веб-браузер — это как-то немного через жопу, Брукс предложил хорошо аргументированную надежду, что у нас есть шанс всё исправить.
---конец перевода---
Шанс всё исправить
- «Ubuntu развивает собственный формат пакетов для установки сторонних приложений»;
- статья «Qt Build System: спасательный круг для сборки» — рекомендую к прочтению, там много ссылок на критику make, хорошие примеры работы с QBS.
~Xlab
Автор: Xlab