Статья Джоэля Спольски «Biculturalism»
Александр Бельченко
19 декабря 2003
На прошлой неделе я с коротким рабочим визитом был в Днепропетровске, где встречался с коллегами-программистами Владимиром и Александром, совместно с которыми мы выполняем один сложный исследовательский проект. В этом проекте они разрабатывают программу для устройства на основе сигнального процессора TMS320C5420, в то время как я пишу приложение для Windows, которое получает и визуализирует данные от этого устройства.
Каждый раз, при каждой нашей встрече, Владимир рассказывает мне, что только Linux это единственная достойная операционная система, что все в ней классно, в то время как в Windows все так... гм, убого. Каждый раз я пытаюсь показать ему, что Linux в ближайшее время не сможет стать лучше Windows, хотя бы потому, что пользователи не хотят им пользоваться, и не станут отказываться от Windows в пользу Linux. Самым нагляным примером тут надо было бы приводить нашего заказчика, на ноутбуке которого установлена как вы думаете что? правильно, Windows XP.
Между приверженцами разных культур, разных ОС, разных языков программирования, разных парадигм программирования, часто вспыхивают споры, ссоры, которые иногда перерастают в религиозные войны. Одной из затяжных конфронтаций является противостояние Unix и Windows.
В начале этой неделе появилась новая статья Джоэля Спольски на его сайте Joel On Software, которая называется «Biculturalism». Статья написана очень эмоционально. Джоэль по своей традиции рассказывает о новой «книге месяца» (Book of the Month). Книгой месяца он назвал новую книгу Эрика Реймонда «Искусство UNIX-программирования» (Eric S. Raymond «The Art of UNIX Programming»). Судя по статье, книга Джоэлю очень понравилась, кроме тех моментов, когда автор имел неосторожность высказывать свое негативное мнение о Windows. Причем эти моменты его возмутили так сильно, что он тут же настрочил обширную статью, в которой высказал свое видение этого вопроса.
Статья написана настолько эмоционально, что временами ее становится тяжело читать. Надо сказать, что все статьи Джоэля Спольски написаны живым разговорным языком жителя Нью-Йорка. Я не берусь переводить ее (пусть этим занимается русская команда переводчиков), но некоторые моменты хотелось бы пересказать в моем объеме понимания американского языка.
Итак, прежде всего статья показывает, что на сегодняшний момент Windows и Unix на системном уровне довольно похожи. Но все же они разные. И эта разница обусловлена различием культурных ценностей, лежащих в основе этих двух систем. Можно назвать множетво деталей и тонкостей, которые различают их, но самым большим различием является всего одна вещь: система ценностей, лежащих в основе Unix, благоприятствует ее использованию другими программистами, в то время как система ценностей Windows ориентирована на не-программистов.
Автор замечает, что здесь, конечно же, что он делает множество упрощений, но в конце концов, это самое большое различие: мы программируем для программистов или для конечных пользователей? Все остальное лишь комментарии.
Далее приводится небольшой пример. Культура программирования UNIX высоко оценивает программы, которые могут быть вызваны из командной строки, для которых можно указать аргументы, которые контролируют любой аспект поведения, и результат работы которых может быть получен в виде ровно отформатированного, читаемого машиной планарного текста. Такие программы высоко ценятся потому, что они легко могут быть использованы программистами в составе других программ или
бóльших
программных систем. В этом примере показан стержень культурных ценностей Unix, который Реймонд назвал «Молчание золото», который подразумевает, что если программа успешно делает именно то, что вы от нее хотите, то она не должна ничего выводить на экран. Вообще ничего. И не имеет значение, что вы только что набили командную строку из 300х символов для того, чтобы создать файловую систему, или для того чтобы скомпилировать и инсталлировать очень сложную часть программы, или для того, чтобы послать пилотируемый космический корабль на Луну. Если операция будет выполнена успешно, единственным подтверждением этого будет просто отсутствие вывода на экран. А пользователь должен при появлении приглашения новой командной строки догадаться, что все должно быть ОК.
Это оценивается так высоко в Unix культуре, потому что вы программируете для других программистов. Как высказал эту мысль Реймонд: «Программы, которые что-то бормочут при своей работе, не могут хорошо сработаться с другими программами». В противоположность этому, в Windows-культуре, вы программируете для Тети Мани, и Тетя Маня может справедливо заключить, что программу, которая ничего не выводит в результате своей нормальной работы, нельзя отличить от программы, которая ничего не выводит, потому что ее работа завершается крахом программы, или потому что программа неправильно истолковала ваш запрос.
Конечно, оговаривает Джоэль, это вовсе не значит, что все Unix-программы предназначены исключительно для программистов. Нет, все не так. Но все же основные культурные ценности определяют вещи наиболее удобны для программистов, и это объясняет некоторые моменты.
Предположим имеется Unix-программист и Windows-программист. И им обоим выдано задание: создать одно и тоже приложение для конечных пользователей. Unix-программист создаст ядро, запускаемое из командной строки или же написанное в текстовом виде для некоторого интерпретатора, и в редких случаях ему придет запоздалая мысль о создании GUI-интерфейса, который будет управлять работой этого ядра. При этом все главные функции приложения будут доступны другим програмистам, которые смогут вызывать программу через командную строку и считывать результат ее работы в текстовом виде. Windows-программист предпочтет начать сразу с GUI, и изредка его посетит запоздалая мысль о добавлении какого-нибудь скриптового языка, который сможет автоматизировать операции GUI-интерфейса. И это наиболее подходящий способ для культуры, в которой 99,999% пользователей не-программисты в любом виде и не имеют ни малейшего интереса становится таковыми.
По мнению Спольски, существует только одна значительная группа Windows-программистов, которая изначально программирует дя других программистов это сама команда Windows, внутри корпорации Microsoft. Их предпочтительный метод делать что-то это создавать некоторые API-функции, которые можно вызывать из Си, которые реализуют определенную функциональность, и затем создавать GUI-приложения, которые вызывают эти API-функции. И все, что Вы можете сделать используя пользовательский интерфейс Windows, с таким же успехом может быть сделано при использовании программного итерфейса, который может быть вызван из любого подходящего языка программирования. Так например, Microsoft Internet Explorer сам по себе это всего-навсего крохотная программа на 87 КБ, и ничего более, но она связывает воедино множество весьма мощных компонентов, которые свободно доступны для опытных Windows-программистов, и которые в большинстве своем разработаны гибкими и мощными. К сожалению, поскольку программисты не имеют доступа к исходному тексту этих компонент, то они могут использовать эти компоненты только в манере, которая в точности предсказана и разрешена разработчиками компонентов в Windows, и при которой не всегда получается желаемое. Временами при этом возникают ошибки, чаще всего по вине тех, кто вызывает API-функции, и эти ошибки трудно или даже невозможно отладить без доступа к исходным текстам. Культурные ценности Unix, которые подразумевают видимость исходного текста, создают более удобное окружение для отладки. Любой Windows-разработчик может рассказать вам про время, когда они тратили несколько дней на отыскивание ошибки потому что, скажем для примера, они полагали, что размер памяти, возвращаемый функцией LocalSize должен быть таким же, что и размер памяти первоначально запрошенный при помощи LocalAlloc, или о некоторых похожих ошибках, которые могли бы быть устранены за десять минут, если бы они могли бы видеть исходный текст этих библиотек. В книге Реймонда придумана забавная история для иллюстрации этого факта, и которая звучит весьма правдоподобно для любого, кто когда-нибудь использовал библиотеку в бинарной форме.
Вот поэтому мы и имеем эти религиозные аргументы. Unix лучше потому, что вы можете спокойно отлаживаться внутри библиотек. Windows лучше потому, что Тетя Маня получает некоторое подтверждение тому, что ее письмо успешно отправлено по электронной почте. На самом деле, одно совсем не лучше другого, они просто имеют различные ценности: в Unix во главу угла ставится задача сделать жизнь лучше другим программистам, а в Windows сделать жизнь лучше для Тети Мани.
Одним из интересных вопросов, затрагиваемых в статье Джоэля Спольски, является следующий: откуда же растут ноги у этих различий в базовых ценностях? Спольски говорит, что еще одна причина, которая делает книгу Реймонда хорошей, это то, что автор проследил всю историю и эволюцию Unix и показал это в аккумулированном виде новым программистам всю историю вплоть до 1969 года. Когда создавался Unix и когда формировалась его культурные ценности вообще не было конечных пользователей. Компьютеры были очень дорогими, компьютерное время было очень дорогим, и изучение компьютеров означало изучение того, как их программировать. И совсем неудивительно, что это породило культуру, которая ориентирована на удобство других программистов. В противоположность этому, Windows создавался лишь с одной целью: продать как можно больше копий и получить от этого доход. Миллионы копий. Миллиарды. Скриллиарды. «Компьютер на каждом столе и в каждом доме» вот что было явно выраженной целью команды, которая создавала Windows, вот что стояло на их повестке дня и что определяло их базовые ценности. Легкость в использовании для не-программистов это был единственный способ достичь этой цели, и таким образом юзабилити стало культурной нормой. Про программистов, как про целевую категорию, вспомнили уже в самом конце. «М-да... кажется про программистов-то мы немного забыли ...».
Вот такая вкратце новая статья «Biculturalism» Джоэля Спольски. Прочесть ее полностью вы можете в оригинале на сайте «Joel On Software». Мне она была интересна тем, что автор попытался объяснить суть вещей, лежащих в основе раскола между Unix и Windows.
Во время и после прочтения этой статьи я вспоминал многие известные мне «религиозные» войны по тем или иным темам. Все они порождены разностью культурных или идейных ценностей. Или нежеланием сторон понять друг друга. И в сущности такие споры в большинстве своем абсолютно бессмыслены (хотя и весьма эмоциональны). Истина как всегда посередине.