Бикультурализм: "альтернативно" && || "правильно"

23 декабрь, 2003 - 00:00Андрей Зубинский

В большинстве C-подобных языков и в языках-потомках C:
&& -- оператор "и" (логический)
|| -- оператор "или" (логический).
Использованное сочетание
в реальных программах недопустимо!

Открытий делать не буду -- "альтернативное" и "лучше чем..." -- любимые слова любого IT-журналиста, стремящегося к своему материалу привлечь внимание. Использование их -- прием, надо сказать, безошибочный. Потому что так уж мы устроены, человеки, -- нам всегда кажется, что то, что "не так, как есть сейчас", непременно лучше, чем то, что "так, как есть". И это очень даже хорошо (не просто "хорошо" -- так должно быть), что мы так устроены -- потому как в противном случае мы были бы совершенно иными.

Особенно сильно чувство синонимичности "альтернативного" и "лучшего" проявляется, естественно, перед Новым годом, Рождеством etc., то есть перед праздниками, которые с детства связаны с ожиданием чего-то ну просто совершенно замечательного. И упаси меня Бог в дни светлых предвкушений учинить "вакханалию справедливости" с наведением "самого правильного порядка" и "расстановкой всего на свои места", или, что хуже, замахнуться на самое святое -- радость ожидания. Ни в коем случае... хотя обсуждаемая тема весьма болезненна. Потому как обсуждать мы будем как раз соотношение между "альтернативностью" и "правильностью" не с целью противопоставить их, а, напротив, с надеждой, что они действительно станут когда-нибудь синонимами. И давайте не будем устраивать "битв со здравым смыслом" за значение слов "альтернативно" и "правильно" -- это занятие бесполезное. Пусть вас не удивляет неожиданный стиль данной статьи и не пугают использованные в названии "программистские закорючки": хоть говорить я буду о программах и программировании, ненужных деталей постараюсь избежать, а нужные кратко пояснить. Итак, к делу...

Сайт "Joel on Software" -- один из весьма уважаемых мной онлайн-источников "информации к размышлению". Вот и в очередной раз его автор Джоэль Спольски такую информацию "подбросил". А именно, статью с заманчивым названием "Бикультурализм". Она небольшая, и знающим английский язык могу только порекомендовать ее сразу прочитать, незнающим же -- дождаться выхода перевода на русский и все-таки непременно прочесть. Себе же позволю поделиться с читателями, так сказать, размышлениями на тему бикультурализма. Сразу поясню этот забавный термин: Джоэль им обозначает поляризацию двух основных на сегодняшний день "программистских культур" -- культур миров Windows и Unix. А в качестве "сепаратора", разделяющего две культуры, Джоэль выбрал завершенную сравнительно недавно книгу Эрика Раймонда "Искусство Unix-программирования" (она доступна как в классическом, "бумажном" издании, так и в онлайн-версии: www.faqs.org/docs/artu/ ). Это издание также стоит прочесть даже тем программистам, кто не разрабатывал и не собирается разрабатывать Unix-ПО.

Главная идея бикультурализма -- различия в понятиях "ценностей" в процессе разработки ПО у представителей двух "культур": "Unix-культура ценит код, полезный для других программистов, тогда как Windows-культура -- код, полезный, для непрограммистов" (Джоэль Спольски, перевод автора статьи). А главный нюанс заключается в том, что эти различия проявляются на фоне фактической одинаковости платформ, для которых ПО создается. Джоэль говорит об этой одинаковости так: "На сегодняшний день Windows и Unix функционально больше схожи, чем различны. Обе системы поддерживают одинаковые важнейшие программные метафоры, организованы на основе почти одинакового великолепия системных ресурсов -- от практически идентичных файловых систем до сокетов, процессов и потоков". Формулируя короче, поскольку "...немногое в базовом наборе сервисов у каждой ОС способно ограничить возможность создания любого приложения", эти ограничения возникают из-за "главного культурного различия".

Что же... почему бы и нет? Вполне возможно и даже симпатично, на первый взгляд. И вроде бы красиво объясняет массу проблем из мира Windows: "бреши" в сетевых сервисах, ошибки в реализации системообразующих ключевых механизмов -- все то, что доставляет известные неприятности как пользователям, так и разработчикам этой ОС.

Сказанного о бикультурализме вполне достаточно, но все-таки это еще не все. Есть нюансы -- пусть не главные, но заслуживающие упоминания. Различие "культур" проявляется, например, в архитектурных подходах к решению одной и той же задачи: "Допустим, вы наняли двух программистов -- из мира Unix и из мира Windows -- и поставили перед ними задачу создать одно и то же приложение, ориентированное на конечного пользователя. Unix-программист разработает приложение "командной строки" или "управляемое текстом" ядро и... построит пользовательский интерфейс, который управляет этим ядром. Таким образом основные операции, выполняемые приложением, будут доступны другим программистам, которые могут вызывать эту программу "командной строки" и использовать текстовые результаты ее выполнения. Windows-программист же тяготеет [в оригинале -- will tend] к проектированию "от интерфейса"... и затем добавляет скриптовый язык, позволяющий автоматизировать работу GUI-приложения. Такой подход оправдан для культуры, в которой 99,999% пользователей не являются программистами... и не хотят ими быть".

Джоэль Спольски не был бы тем, кто он есть, если бы не упомянул и о компонентности Windows как еще одном нюансе различий в культурах -- Windows-компоненты "к сожалению, так как программисты не имеют доступа к их исходным текстам, могут быть использованы исключительно предусмотренными разработчиками компонентов способами...". Естественно, подразумевается, что альтернативный Windows-компоненту Unix-компонент (в предыдущем примере им было приложение "командной строки"), само собой, распространяется с открытыми исходными текстами и может быть модифицирован сторонними разработчиками в соответствии со своими нуждами.

В общем, для знакомства с бикультурализмом информации больше не требуется. Разве что Спольски добавил один забавный штрих к отличительным чертам Unix-культуры, многие из которых очевидны -- происхождение из академической среды, где практически каждый пользователь мог позволить себе роскошь быть программистом "по совместительству", традиционное переложение системой ответственности за возможные неправильные действия на пользователя и т. д. А вот меткую характеристику, данную, если можно так выразиться, сегодняшнему духовному лидеру новой волны этой культуры Раймонду: "как только он открывает рот о программировании в Windows, он демонстрирует, что его знания в этой области почерпнуты из газет", я бы назвал в соответствии с принятой "культурологической" терминологией Unixенофобией. С данного определения и начинается "отсебятина" -- святое, кстати, и очень приятное право журналиста.

Уж и не знаю, какие впечатления от ключевых понятий бикультурализма остались у вас -- мне кажется, что все далеко не так просто. Стоит чуть-чуть "надавить" здравым смыслом, например, на идею различия в "ценностях", и она треснет по швам. Сделать это очень легко -- сегодня Windows уже далеко не молодая система, обладающая колоссальной базой прикладного и системного ПО. Все эти миллиарды строк кода (их наверняка миллиарды -- а даже если и десятки миллиардов, то ошибка на порядок в данном случае никакой роли не играет) "живут", программы меняются от версии к версии, развиваются, наращивают функциональность (причем программы очень разные -- и созданный Бог знает когда программистом-индивидуалом Кристианом Хислером знаменитый файловый менеждер Total Commander, и компонентный монстр Microsoft Office). И как же такое может быть, если Windows-программист пишет код не для программиста (то есть не для того, в первую очередь, чтобы код можно было модифицировать, модернизировать и т. д. -- одним словом, сопровождать)? Да не может такого быть никак. А ведь так есть... Вот и получается некоторое противоречие. Причем, вполне очевидное и не требующее титанических усилий разума. "Культурологическое" различие между подходами к проектированию программы ("от командной строки" против "от GUI") кажется вообще рождественским розыгрышем -- оно, конечно, понятно, что кто-то в каких-то случаях именно так и делает, но разве все и всегда? Unix-программист, в силу специфики задачи, может "плясать" и от GUI, и от компонентной структуры (к чему бы это объектный брокер всех брокеров CORBA "вырос" именно на Unix-платформе?), и вообще как угодно. Точно так же может поступить и Windows-программист, хотя "что-то" от него требует или найти нужные по функциональности повторно используемые компоненты, или создать их и лишь после "привинтить" к ним GUI (благо, средства разработки поддерживают именно такой подход). Это "что-то" назвать "культурой" будет слишком высокопарно -- это, простите за многочисленные повторения, здравый смысл. Потому как так быстрее (если компоненты приобретаются) или легче сопровождать получившуюся программу (если компоненты создаются "с нуля").

Кстати, о "проблемах" с недоступностью исходных текстов компонентов и с возможностью их использования только так, как предписано их разработчиком. "Проблеме" этой "сто лет в обед" -- давным-давно отшумела война "белого и черного ящика". Потому что первое, как показала практика масштабных проектов, никому особо не нужно (компонентные среды для того и делаются, чтобы базовую функциональность компонентов можно было наращивать или изменять, не затрагивая их базовых реализаций), а второго никто особо не хочет после печального опыта построения Вавилонских башен из кирпичей с непрерывно изменяемой геометрией. Говорить о войне "белых и черных ящиков" (в которой, к слову, Windows успела поучаствовать на двух фронтах) можно долго, но в этом нет необходимости -- просто наберите в Google строку "black box vs white box architecture" и увлекательным чтивом на ближайшие месяца три вы себя обеспечите.

Ничего не заметили? Буквально несколько предложений оставили от бикультурализма рожки да ножки -- самое время спросить, "а есть ли мальчик" вообще? Или просто есть хорошие, квалифицированные программисты и есть организация проектного процесса, способная подчинить его участников достижению одновременно двух целей -- создания приложений (а не кода) для пользователей, причем написанных таким кодом, который можно успешно сопровождать? И, собственно, тогда в перечне остается продемонстрированное самим духовным лидером "культурологическое отличие", подмеченное Джоэлем Спольски. А уж в том, что оно есть, сомневаться не приходится...