Применение этой силы не ограничивается никакими процессами взросления. Они доминируют над другими при помощи своих интеллектуальных способностей лишь потому, что могут это делать, и не видят ничего дурного в издевательствах над пользователями, каковыми являются устрашающе сложные продукты. Они глумятся, подшучивают, смеются над «чайниками», которые недостаточно умны, чтобы пользоваться компьютерами. Да и рабочие привычки этих людей – изоляция, многочисленные сверхурочные и внеурочные – не оказывают особого цивилизующего воздействия на их поведение.
Лишь приближаясь к тридцати годам, я осознал, каким был грубияном. Обычным грубияном, кулаками которого были способности к программированию, а ростом и длиной рук – владение сложными системами. И я издевался над теми, кому не по силам оказывались сложности использования компьютеров.
Глава 8
Отмирающая культура
Программирование – деятельность до некоторой степени «потусторонняя» и эмоционально весьма насыщенная. Именно такая насыщенность делает программирование более похожим на призвание, жаргон программистов более похожим на самостоятельный язык, и благодаря ей братство разработчиков программ создало свою культуру. В этой главе я покажу, каким образом культура программирования влияет на природу программных продуктов.
Культура программирования
В недавнем субботнем приложении к «Таймс» мне довелось прочесть занимательную историю американской пары, после выхода на пенсию уехавшей жить в Мексику. Они купили участок в предместье крупного города и наняли архитектора-американца для проектирования дома своей мечты. Затем они наняли мексиканского подрядчика и передали ему чертежи. В ходе строительства они с изумлением обнаружили, что получается совсем не тот дом, который описал архитектор.
Чертежи указывали, что на фасаде дома должно быть четыре окна, произведенные конкретным изготовителем, и приводили даже точный идентификационный номер товара. Владельцы дома обнаружили, что на фасаде три окна, совершенно иных по виду и размерам. На их расспросы мексиканский строитель пожал плечами и сказал: «Это ведь окна. В плане указано, что окна на этой стороне. В чем проблема?»
Владельцы и архитектор здания происходили из одной культуры, имели общие ценности, тогда как строитель происходил из другой культуры, а значит, иначе оценивал аспекты проблемы. Несомненно, ему удалось обеспечить заказчиков окнами за меньшие деньги и ценой меньших усилий, а это – в его мире – и было первоочередной задачей. Владельцы и архитектор, американцы, полагали, что наличие чертежей требует четкого следования этим чертежам. Строитель же, мексиканец, полагал, что чертежи – это лишь предложение, а не требование. Он полагал, что его собственные императивы бережливости и простоты комплектования естественным образом преобладают над любыми спецификациями. Он искренне старался претворить в жизнь видение архитектора, но применял к проблеме собственные культурные фильтры – собственные ценности.
Повторное использование кода
Подобно мексиканскому строителю, который ставил стоимость выше соображений проектирования, предоставленные сами себе инженеры ценят эффективность программирования больше, чем это необходимо пользователю. Лучшим свидетельством в пользу этого тезиса является практика повторного использования кода, то есть кода, который был ранее создан для какого-то иного проекта или же мог быть приобретен за определенную сумму у сторонней фирмы. Написанный код не просто экономит время; очевидно, что и другие программисты могут его использовать, и к тому же код не содержит ошибок. Одно из уникальных свойств программ состоит в том, что любую процедуру можно выполнить всего одной командой, но при этом размер процедуры не ограничен. Иначе говоря, если процедура уже написана, ее можно задействовать одной командой. Следовательно, любой уже написанный модуль кода оказывается значительным подспорьем для программистов. Они могут включать его в свои программы в качестве черного ящика, внутреннее устройство которого никогда не требует их вмешательства. Программист таким способом экономит время не только непосредственно на этапе программирования, также и на размышлениях и тестировании. Для большинства программистов повторное использование кода становится более важным, чем практически любое другое соображение. Знаменитый идеолог UNIX Эрик Реймонд (Eric Raymond) говорит:
«Хорошие программисты знают, что писать, великие – что надо использовать повторно».
Основной побочный эффект повторного использования кода заключается в том, что крупные блоки большинства программ существуют не потому что этого захотел некий проектировщик взаимодействия, но потому, что некий программист уже проделал необходимую работу в рамках другого бюджета. Многие программы из тех, что мы встречаем, существуют лишь потому, что уже существовали ранее.
К примеру, приложения для настольных компьютеров содержат так много меню и текстовых диалоговых окон потому, что все оконные системы Мiсrоsоft Windows, Мас OS, OS/2, Solaris – предоставляют готовые модули кода, обеспечивающие работу таких функций. И наоборот, ни одна из этих систем не содержит большого количества кода для механизмов drag-and-drop; вот почему в приложениях так мало непосредственного манипулирования (direct manipulation). Диалог можно создать при помощи шести-восьми строк простого декларативного кода. Идиома drag-and-drop требует примерно сотни строк весьма запутанного процедурного кода. Выбор программиста здесь очевиден. Выгоды конечного пользователя в контексте такой экономии обычно не рассматриваются.
История с мексиканским строителем все время повторяется в разработке программного обеспечения, в основном благодаря стремлению программистов повторно использовать код. Эд Форман (Ed Forman), руководящий разработкой ПО в Elemental Software, прежде чем загрузить программистов работой, создает подробный и точный набросок внешнего вида экрана. Несмотря на это, говорит Эд, экран готовой программы являет собой лишь бледную тень этого эскиза.
Происходит это следующим образом. Набросок Эда содержит темно-серые кнопки на светло-сером фоне. Программист начинает создание интерфейса с копирования исходных текстов из другой, уже работающей части программы. Это хороший способ сэкономить время и силы в программировании, способ, очевидно, полезный для всех. Минус в том, что существующий код обрамляет кнопки дополнительной темно-серой линией. Кроме того, к темно-серой рамке крепится еще и текстовая подсказка. Вместо того, чтобы удалить текст и рамку в соответствии с наброском Эда, программист оставляет их, сохраняя множество строк кода. Код требует какой-то текстовой подсказки для каждой кнопки, поэтому программист вбивает некий подходящий, в его понимании, текст.
Увидев, наконец, программу с ненужными рамками и невнятными текстовыми подсказками, Эд изумленно качает головой. Когда он указывает на отличия программисту, тот просто не может понять, в чем проблема. Подобно мексиканскому строителю, программисты полагают, что их собственные императивы простоты создания и простоты комплектования готовым кодом имеют более высокий приоритет, чем чьи бы то ни было предложения.
Эда такое явление не только изумляет, но и раздражает, однако он не способен объяснить его. Его программисты, как один, сообразительны, способны, глубоко озабочены качеством продуктов и успехом компании, однако не могут устоять перед зовом сладкоголосых сирен. Разумеется, они постараются воплотить в жизнь задумки Эда, но не за счет собственных принципов реализации.
Привычка программистов повторно использовать код интересна их готовностью иметь дело с кодом сомнительного происхождения. Некоторые неопытные программисты начинают с черновых набросков первой попавшейся на глаза идеи, и этот фрагмент кода, будучи созданным, становится основой всех последующих усилий по разработке благодаря интенсивному повторному использованию.