Предлагаю вашему вниманию переводной дискуссионный материал с критикой одной из новых методологий разработки — «Мастерства программирования» (Software Craftsmanship). Автор предлагает поговорить о том, каково же истинное назначение прикладного ПО и насколько этому отвечают современные «романтические» методологии, ставящие следование своим принципам во главу угла.
Методология «Мастерство программирования» опасна тем, что ставит во главу угла программу как таковую, а не ту пользу, которую программа должна приносить заказчику. В основном это происходит потому, что многие из нас — романтики с большим эго. Программирование заключается в автоматизации некоторых операций, например сжатия данных, обработки и представления информации, управления машинами или, опять же, автоматизации их функций.
Не-программисты не заморачиваются об эстетической стороне программирования, точно так же как домовладелец не задумывается об эстетичности сантехнических труб. Клиенту нужно всего лишь, чтобы его информация находилась в нужное время в нужном месте, а домовладельцу — чтобы из горячего крана текла горячая вода. Правда, стоит оговориться, что качественное обслуживание бойлерной считается хорошим тоном.
Мотивация для «мастерства программирования»
Было бы хорошо, если бы программирование являлось самой обычной профессией. В традиционных сферах деятельности обычно прослеживается постепенное накапливание навыков и опыта, будь то учеба на соискание степени юриста и последипломная стажировка или, например, интернатура, в которой медик проводит некоторое время, прежде чем станет врачом. В случае с медициной имеются четко разграниченные ранги: начиная с медбрата, вы постепенно преодолеваете годы тяжелейшей работы по 80 часов в неделю и становитесь независимым практикующим консультантом.
Но эта профессия необычная. «Входной барьер» в профессию программиста минимален. У некоторых людей есть природная программерская жилка (двое из самых классных программистов, которых я знаю, никогда не учились в колледже), некоторые обучаются программированию по книгам, третьи просто «возятся» в свободное время, пока у них не напишется что-нибудь путное. Навыки и способности программиста можно оценить только по профессиональной репутации человека: здесь нет одной универсальной «системы ранжирования», в зависимости от которой можно было бы выстраивать карьеру.
Чтобы оценить, как низок этот входной барьер, достаточно вспомнить о миссии VisualBasic (явной или неявной), связанной с демократизацией программирования. Любой, кто научится перетаскивать туда-сюда элементы управления и овладеет минимальными техническими навыками, относительно легко сможет «сварганить» работоспособное решение для конкретной проблемы. Различные установщики и другие утилиты позволяют опытным пользователям создавать в Excel сложнейшие таблицы, даже если у такого пользователя и нет практических навыков программирования. Вот уже несколько лет Эрик Майер, гуру в своей области, рассказывает о демократизации облаков, то есть о том, как можно с легкостью связывать друг с другом онлайновые сервисы и так называемые «коммунальные вычисления». В данном случае Майер проводит аналогию с VisualBasic — языком, позволяющим «собирать» готовые приложения. Иными словами, серьезные люди активно работают над тем, чтобы еще сильнее снизить «входной барьер» программирования, который и так не слишком высок. Конечно, можно счесть такой подход характерным только для Microsoft, но ведь именно Microsoft сделала все возможное и невозможное, чтобы упростить программирование почти до абсурда (некоторые предпочитают называть это «сделать доступным для широких масс»).
ИТ-индустрия относительно молода, ее возраст не превышает пары поколений. В качестве эксперимента можете поинтересоваться у коллег — был ли айтишником кто-то из их родителей. Убедились?
Эта отрасль — нечто вроде золотой жилы. По сравнению с большинством видов деятельности, программирование — относительно высокооплачиваемая офисная работа без каких-либо физических нагрузок и — помните? — практически без входного барьера. Таким образом, уже выросли целые экономические структуры, воспринимающие ИТ как подозрительную лотерею: стоит бросить достаточное количество «думалок» на решение проблемы — и проблема снимется сама собой. А если эти «думалки» еще и окажутся недорогими (но все равно неплохо оплачиваемыми по сравнению с альтернативными видами деятельности), то на решение проблемы удастся мобилизовать очень много юнитов.
Мне довелось побеседовать с одним человеком, который рассказал, что сейчас работает на проекте в госсекторе. Проект связан с предоставлением онлайновых налоговых вычетов для застройщиков. Если вы застройщик, то можете завести аккаунт на этом сайте, а потом залогиниться в систему и покупать такие налоговые вычеты, которые применяются к вашей ежегодной налоговой декларации. Иными словами, это сайт, на котором есть пользовательские аккаунты и (сторонний) сервис для работы с карт-счетами — и все. Над этим проектом работали 400 программистов в течение трех лет. Вдумайтесь: это более чем человеко-тысячелетие работы! Для веб-приложения! В котором я могу заплатить какому-то консорциуму за предоставление мне налоговых льгот. Но это уже тема для другой филиппики.
С чисто демографической точки зрения можно констатировать, что абсолютное большинство айтишников занято в этой отрасли потому, что:
а) это высокооплачиваемая альтернатива для другой беловоротничковой офисной работы и тем более для физического труда;
б) многие даже не пытаются представить ИТ-сферу иначе, чем как массовый источник шальных денег.
Впрочем, есть и другие программисты. Это меньшинство. Те, кому действительно нравится программирование, люди, желающие в нем преуспеть. Они понимают, что разработка программ — это даже не навык, а целая палитра навыков: понимание и моделирование предметной области, понимание языков программирования, библиотек, парадигм и идиом, выбор того материала, который лучше всего применить в конкретной ситуации, изучение и понимание алгоритмов, освоение «пути от идеи к готовому продукту» (состоящего из этапов сборки, развертывания, релиза), навыки мониторинга и обеспечения доступности, приемы автоматизации процессов, знание гибких теорий снабжения, производство и разработка продукта, коммунальное и облачное программирование, конкурентная обработка и параллелизм (список можно продолжать).
Эти ребята стремятся и к определенному ранжированию в своей среде. Часто приводятся цифры, указывающие на десятикратное увеличение производительности труда у эксперта по сравнению с новичком, но мне кажется, что эти цифры занижены. По-настоящему талантливый программист (а мне за минувшие годы довелось работать с несколькими такими людьми) может обойти программиста, работающего только за деньги, в сотни раз. Такой умелец способен выполнить за день столько, на сколько у среднестатистического кодера уйдут недели и даже месяцы.
Дело в том, что программа должна оцениваться лишь по тому, какую пользу она приносит. Она вполне может быть написана уродливо, но если она качественно решает поставленные задачи — то «красота» отходит на второй план. Программист может похвастаться красивым кодом перед другим программистом, но в других ситуациях «эстетическая ценность» кода не должна играть роли.
Умение видеть негативное пространство
Моя супруга — художница и интересуется негативным пространством. Негативное пространство — это область между такими фигурами и объектами на рисунке, которые сразу воспринимаются как основное содержание этого рисунка. Умение работать с негативным пространством исключительно важно для создания реалистичной композиции. Допустим, модель сидит к вам боком. Обратите внимание на треугольник, образуемый ее предплечьем, плечом и локтем. Пространство между лицом модели и окном прямоугольное и достаточно узкое, а нос модели как бы «вклинивается» в этот прямоугольник. Посмотрите на подбородок, точнее — на угол, возникающий между изгибом нижней челюсти и шеей. Взглянув в окно, рассмотрите, какие фигуры складываются между голыми древесными ветками на зимнем небе. Кстати, эти участки неба отличаются оттенком от серо-белых облаков над деревьями. Все эти контуры и цвета, расположенные между очевидными объектами, как раз и определяют, насколько реалистичная картинка у вас получится. Если картина хороша, то обычно вы даже не обратите внимания на негативное пространство.
Какое отношение эта история имеет к программированию? Все дело в том, что наиболее успешные программисты, с которыми мне доводилось встречаться, не мастерят код, они просто пишут программу для единственной цели — передавать с ее помощью информацию. Информация — вот что их действительно интересует, а программа лишь определяет рамки, в которых информация может перемещаться. Такие программисты ставят перед собой цель доставить информацию из точки А, где она сейчас простаивает без дела, в точку B, где информация может и должна принести пользу. Программист старается добиться максимальной скорости и эффективности этого процесса. Например, в случае с пользовательским интерфейсом необходимо отобразить на экране или принять от пользователя именно ту информацию, которая будет полезна. На экране должно быть не больше и не меньше информации, она должна быть представлена сжато и понятно. Программа вторична по отношению к информации, это просто механизм, который всегда должен быть наготове. В конечном счете, незаменимых программ нет.
Почему программирование — не ремесло и не искусство
Если то или иное творение является произведением искусства, то ему присуща неотъемлемая красота. Например, собор — это просто большой молельный дом. Да, соборы возводятся из камня, поэтому они гораздо долговечнее деревянных церквей, но почему соборы всегда полны архитектурных украшений? Очевидно, это делается для того, чтобы подчеркнуть их величественность и чудесность. Такое здание играет на тех струнах нашей души, которые воспринимают красоту и величие. Поэтому мы входим в собор со скромными и возвышенными чувствами, готовые молиться. Это характерный пример архитектуры, обладающей не только чисто функциональными, но и чисто эстетическими чертами.
Если из такого же камня, из которого сложен собор, построить добротный мост над железной дорогой, то нас будет волновать, прежде всего, полезность и инженерная эффективность этого сооружения. Если мост хорош, то я даже не обращу на него внимания, когда буду ехать над железной дорогой! Мы не обращаем внимания на инженерные качества дорожной архитектуры, пока не случится какое-нибудь транспортное происшествие.
Именно в этом и заключается разница между ваятелем, высекающим гримасу на морде горгульи, и архитектором, который из обычных кирпичей возводит многоэтажную парковку. Во втором случае мне меньше всего хотелось бы, чтобы из-за «творческой индивидуальности» архитектора в кладке оказались нестандартные кирпичи, которые нечем заменить. В таком здании абсолютно не требуется «индивидуальной» обработки каждого камня, достаточно обычной надежности.
Практикующие программисты — кстати, многие довольно хорошие программисты — часто теряют способность различать возвышенное и земное. Они влюбляются в свою работу и начинают относиться к ней как «художники».
Простейшая квалификация в мире
Вот мы и подходим к тому, какая опасность таится в методологии «SoftwareCraftsmanship». Если программист работает по такому принципу, он зачастую не может справиться с собственным бунтующим эго. Следите за моей мыслью?
Когда я прочел «Манифест по мастерству программирования» (Software Craftsmanship Manifesto), что-то во мне умерло. Правда, я слышу внутри еще один смеющийся голос, подсказывающий, что если не воспринимать подобные методологии всерьез, то жить станет гораздо легче. Не говоря уже о том, что этот документ просто пустой, отмечу, что он напоминает мне какой-то оксюморон. Если весь его смысл в том, что все программисты должны чувствовать себя кастой ремесленников и что в этом есть что-то особенное, то оказывается, что вступить в ряды этой страшно модной тусовки может кто угодно.
От меня требуется продемонстрировать какие-то навыки? Нет. Сертификаты, дипломы? Нет. Опыт работы тоже не нужен? Да нисколечко. (Прагматичные программисты уже спешат мне напомнить, что десятилетний опыт — совсем не то же самое, что однолетний опыт, повторенный десять раз). На самом деле, от меня требуется всего лишь объявить себя приверженцем методологии «Мастерства программирования» и подписаться на сайте. Ура!!! Я теперь член сообщества программистов-мастеров! Это только мне кажется смешным?
Почему же не быть ремесленниками
Вернемся к нашему сюжету. Я уверен в том, что «Манифест мастерства программирования» написан с благими намерениями, я очень ценю замеченные на сайте подписи Кевлина Хенни, Боба Мартина, Кори Гейнса, Гленна Вандербурга. Все они — прагматичные, разумные, трезвомыслящие и, что самое главное, очень скромные люди. Меня беспокоит лишь то, что форма этого манифеста преобладает над содержанием. Во многом из-за этого под манифестом уже подписалось огромное множество людей.
Я бы очень хотел, чтобы кто-нибудь переписал этот манифест, поставив во главу угла получение результатов и удовлетворение нужд заказчика. «Постепенное повышение ценности» — не то, гораздо важнее «стабильное удовлетворение требований заказчика». Программист должен уметь совершенно не проявлять своего эго, быть скромным, сосредотачиваться на результате, а не на красоте создаваемого кода. Я настойчиво призываю прекратить самолюбование и воспринимать программирование правильно — как сложную профессию, требующую серьезных навыков.
Поверьте, клиенту не нужно высокохудожественного софта, а нужны лишь возможности, которые этот софт предоставляет. Причем управиться было желательно еще вчера. Это не касается лишь специалистов по организации пользовательских взаимодействий (user experience). В их труде как раз очень важны и эстетичность, и понимание человеческих эмоций. Продолжая аналогию со строительством, можно сказать, что специалисты по UX занимаются отделочными работами — красивостями, которые должны порадовать заказчика.
По-настоящему опытная команда программистов способна выдавать потрясающие практические результаты в безумно краткие сроки. Давайте же от этого отталкиваться! Меня интересует ваш опыт. Ваши знания. Я хочу, чтобы вы показали мне «простоту за кажущейся сложностью». Нужно быть настоящим специалистом и мастером, чтобы не только добиться простоты в крупном корпоративном приложении для работы со связью, но и уметь представить эту простоту в выгодном свете.
Воспринимая программирование как строгую сферу деятельности, мы совершенно не уменьшаем стремления к профессионализму, опыту и умению. Вы ведь предпочли бы, чтобы проводкой в вашем доме занимался опытный электрик, а не самоучка. Так и мне хочется, чтобы софт для моего бизнеса писал опытный программист. Но я точно не воспользуюсь услугами сантехника-эстета, который будет мне рассказывать об изящности и красоте работы с вантузом или станет призывать меня «иметь дело только с выдающимися сантехниками, применяющими в своей практике лишь медные детали». Самые лучшие программы должны быть сдержанными и ненавязчивыми — как, пожалуй, и лучшие программисты. Терпеть не могу, когда моя информация застревает в плохо реализованной системе с кое-как сляпанными интерфейсами.
Заключение
Работая над этой статьей, я упоминал о ней в Твиттере и получил несколько интересных комментариев. Так, один из читателей высказался, что программист кажется ему ремесленником вроде ювелира. Но мне хотелось бы с этим поспорить. Я считаю, что все ювелирные украшения дороги только потому, что сделаны из драгоценных металлов. Я бы и не подумал использовать ювелирную безделушку для каких-либо целей, кроме эстетических. Пусть на нее смотрят и восхищаются красотой этой вещицы (а заодно подумывают, что ее обладатель, вероятно, довольно богат и имеет хороший вкус).
Если здесь и уместна аналогия с изделиями из благородных металлов, то я привел бы пример с проводом от хорошего микрофона, в котором золотые контакты применяются для улучшения звука. Но я бы хотел, чтобы с конструктивной точки зрения золотой кабель был идентичен более дешевому.
Раз уж вы дочитали до этого места — спасибо вам большое. Я считаю, что манифест «Мастерства программирования» имеет право на существование, но его нужно коренным образом переработать. Кроме того, я считаю, что увлеченные и умелые программисты должны уметь выделяться из толпы кодеров, клепающих ширпотреб, уметь узнавать друг друга и подчеркивать свою профессиональную ценность при переговорах с потенциальным работодателем. Как вы думаете, что для этого нужно?
Автор: gaddyya