Автор: Зверёк Харьковский
Из всех человеческих существ, которые сегодня являются жертвами классического китайского проклятия «Чтоб тебе жить в эпоху перемен», разработчики программного обеспечения (да и вообще люди, вынужденные иметь дело с «софтом») - самые несчастные. Здесь все может поменяться (и меняется) ежечасно, новые технологии могут родиться (и рождаются) ежедневно, и так же ежедневно вымирают и «изымаются из обращения» технологии, даже не успевшие устареть. В тот момент, когда «девелопер» прекращает самообразование, он начинает отставать от окружающего мира со скоростью консервной банки, выброшенной из окна самолета.
Причина такого печального положения дел - сильная непрозрачность индустрии софтостроения. Причем эта непрозрачность проявляется на всех уровнях: самому лучшему тимлиду [От «team lead» - глава команды разработчиков] крайне тяжело оценить скорость продвижения и качество кода отдельного модуля, который создают программисты его команды; опытнейший менеджер практически беспомощен в попытках осознать, укладывается ли в срок и соответствует ли требованиям работа различных отделов, находящихся под его началом; заказчик (если ПО разрабатывается на заказ) и предположить не может, получит ли то, что хотел; пользователь (если ПО тиражное) не имеет никаких гарантий по какому бы то ни было параметру (глючность, скорость, соответствие определенным задачам и т. д.).
Такая непрозрачность - вовсе не следствие злонамеренности «этих идиотских программистов» («этих разэдаких индусов», «этого злобного Micro$oft’a» - формулировка зависит от настроения, образования и воспитания), а является, в общем-то, фундаментальным свойством мира разработки софта [Частично эти проблемы затрагиваются в моей статье «Незваный гость на пиру воображения» («КТ» #644)]. Роль программиста не имеет точных аналогов в других профессиях (как бы кто ни пытался доказать обратное) - ни инженеры, ни изобретатели, ни писатели, ни журналисты не работают в условиях столь тесного переплетения чистого творчества, точных наук, практических «приемчиков» и сложных взаимодействий между членами команды. Впрочем, на причинах мы подробно останавливаться не станем, а рассмотрим следствия «особого положения» индустрии разработки ПО.
Основное следствие-проблема было сформулировано в 1986 Фредом Бруксом в статье «Серебряной пули нет - существенное и случайное в разработке ПО» ["No Silver Bullet - essence and accident in software Engineering, Brooks, F. P., Proceedings of the IFIP Tenth World Computing Conference, pp. 1069-1076, 1986. Возможно, проблема формулировалась и раньше, тем не менее именно статья Брукса стала классической] следующим образом: «Нет ни одного открытия ни в технологии, ни в методах управления, одно только использование которого обещало бы в течение ближайшего десятилетия на порядок повысить производительность, надежность, простоту разработки программного обеспечения». В более расширенной формулировке (из статей самого Брукса и рассуждений других видных деятелей computer science) можно утверждать, что разработка ПО (и вообще работа в софтверном окружении) всегда будет оставаться деятельностью с непредсказуемой эффективностью и неизвестным результатом. Причем Брукс был уверен (собственно, и до сих пор уверен), что «серебряная пуля» (средство сделать упомянутый процесс эффективным и предсказуемым) не только не существует, но и принципиально не может быть создана.
Однако помимо бруксовой на этот вопрос всегда существовали альтернативные точки зрения. По большому счету весь прогресс технологий разработки ПО (и вообще «софтовых» технологий) можно представить как поиск этой самой мистической серебряной пули; а то, что прогресс до сих пор не стоит на месте (и еще как не стоит!), можно считать косвенным свидетельством того, что серебряной пули как не было, так и нет.
Конечно, сегодняшнее обезсеребрянопуленное состояние совсем не то, что во времена выхода упомянутой статьи: другие масштабы задач, другое соотношение провальных и удачных проектов, другая структура «массы пользователей» и «массы разработчиков» и т. п. Тем не менее все это лишь следствие накопления опыта; опытных разработчиков стало больше, накопленных ими «практических приемчиков, которые могут сработать» - намного больше; а вот общая прозрачность системы не изменилась ни на йоту - по-прежнему практически невозможно понять, что происходит уровнем ниже или уровнем выше, отделом правее или отделом левее тебя.
А значит, продолжаем искать серебряную пулю.
Можно констатировать, что весь процесс поиска заветного боеприпаса - это попытка дать гарантированный ответ на два вопроса: будет ли достигнут результат и будет ли он корректным (приемлемым)? [Некоторые считают, что есть еще и третий вопрос: когда будет достигнут результат? Но в тех случаях, когда он действительно важен, это всего лишь подмножество первого вопроса: будет ли результат достигнут настолько быстро, что он еще будет иметь смысл?] Начиная решать любую софтверную задачу в лоб (будь то создание новой ОС или поиск нужной html-странички), мы не можем заранее знать ответа ни на один из них. А если нет никакого ответа, то нельзя и предпринять заранее меры, чтобы сделать ответ более приемлемым (например, добавить в команду программистов или докупить оборудование). То есть, даже собрав в одной команде три десятка лучших в мире специалистов по разработке ОС, нельзя предсказать, что и когда у них получится и получится ли вообще.
Во времена наивной юности компьютерных наук (лет за десять-пятнадцать-двадцать до написания статьи «No Silver Bullet») было принято считать, что все эти вопросы можно разрешить одним махом: всё должен делать компьютер. Это самое «всё» по минимуму означало автоматизированную проверку корректности (формальная верификация программ, ключевые имена - Хоар и Дийкстра), а по максимуму в идеале - пресловутый Искусственный Интеллект (ключевые имена - от Алана Тьюринга и далее - легион), где человек уже не «решает задачи с помощью компьютера», а лишь «ставит задачи», а вопросы о достижимости и корректности результата являются самоприменимыми (то есть можно поставить компьютеру задачу «определи, можно ли получить решение задачи Х»). По причинам достаточно сложным и неплохо изученным «счастья для всех и даром» не наступило, и дальнейшие поиски «silver bullet» стали концентрироваться на частных решениях. Да и по сию пору концентрируются.
Проанализировав тенденции и основные направления этих поисков, можно с некоторой долей уверенности сделать выводы о текущем и последующем прогрессе софтовых технологий.
["Мертвая линия", или «линия смерти» - deadline. Так буржуи называют время, к которому кровь из носу надо закончить некую задачу]
Предположим, мы начинаем амбициозный софтверный проект. Что нужно, чтобы быть уверенным в том, что проект будет успешно завершен? Ответ здесь зависит от того, кто такие «мы» - маленький стартап из трех студентов или большой Мicrosoft? [Это, естественно, крайности - зато удобные для иллюстрирования точки зрения] В первом случае «успешно завершен» означает «мы допишем его до того, как нам надоест, и сделаем все настолько cool, чтобы разом уесть всех возможных конкурентов»; во втором - «проект не завалится под собственной тяжестью и будет закончен хоть когда-нибудь». Другими словами, первых куда больше интересует эффективность используемых инструментов-технологий-подходов, а вторых - надежность (при этом первые готовы пойти на некоторые компромиссы в области надежности, а вторые - пожертвовать некоторой эффективностью). Все дальнейшее - следствия этой дихотомии.
С тех пор как мэйнфрейм размером с пару приличных офисов не является «единственным доступным компьютером на двести километров в округе», эффективность работы в некоторой программной среде означает, что рабочее время человека-пользователя (а не машины-компьютера) должно расходоваться эффективно. Именно этот резон и стимулирует развитие большого количества современных технологий - как софтверных, так и железных.
Адепты «теории заговора производителей» любят задавать саркастические вопросы вроде: зачем Pentium 4 секретарше, которая использует только Word и пасьянс «Косынка»? Или: зачем 19-дюймовый монитор с 16 миллионами цветов кладовщику?
Ответ на эти вопросы прост: эффективность. В первом случае время разработчика Word было сэкономлено на оптимизации всех этих менюшек, смарт-тегов и бог-знает-чего-еще, предназначенного как раз для нашей секретарши. Все это, наверное, можно было бы реализовать и под IBM PC 386 + Windows 3.11 - чего там, пару сотен килобайт переписать на ассемблере, остальное на C, пооптимизировать пару лет - а «эти ламеры» поленились, выставили требования к железу повыше, зато и управились куда быстрее - с помощью высокоуровневых «крутых» инструментов и не задумываясь об оптимизации.
В случае с кладовщиком и его TFT-монитором ответ еще очевиднее: это всего лишь средство отобразить больше информации, сделать ее выразительнее (за счет цветов, анимации, градиентов и т. д. и т. п.) и в конечном счете - снова повысить эффективность работы, теперь уже - самого пользователя.
То есть технологии, которые развиваются в сторону эффективности работы пользователя, в основном увеличивают выразительность инструментов; будь то выразительность языка высокого уровня или выразительность интерфейса в стиле «модного» Web2.0, цель одинакова - больше информации помещается на экране, меньше рутинных действий приходится выполнять, более четкая связь между идеей и ее реализацией.
Наиболее радикально новые, «потенциально революционные» исследования связаны с попытками повысить эффективность процесса мышления как такового: представить информацию в таком виде, который «натолкнет» на правильную идею или позволит обнаружить неизвестные взаимосвязи. Заметим, что история такого рода исследований почти так же длинна, как история компьютеров вообще (классическая «декларация намерений» за авторством изобретателя мыши Дугласа Энгельбарта, под названием «Augmenting Human Intellect», вышла в 1968 году и была во многом связана с еще более классической статьей Ваневара Буша «As We May Think», 1945), и сегодняшний их вектор направлен в сторону не улучшения жизни единичного пользователя, а роста эффективности работы группы людей (когда группа становится «умнее» суммы ее членов). По сути, именно этому вектору мы обязаны и появлением Web, и Википедией, и многими другими достижениями сегодняшнего computer science [И тот же пресловутый Web2.0 декларирует как одну из своих ценностей «накопление информации через взаимодействие пользователей»] .
Изобретателями технологий, существенно повышающих эффективность работы, чаще всего являются этих технологий основные потребители - талантливые одиночки/небольшие группы, работающие в условиях «куча гениальных идей, побыстрее бы все реализовать!» [Отсюда - довольно распространенное мнение, что в IT все сколько-нибудь стоящее изобретается талантливыми и малоизвестными одиночками; см., например, недавнюю статью Пола Грэма «Сила маргиналов» (Paul Graham, «The Power of the Marginal»; www.paulgraham.com/marginal.html)]: поисковик Google; языки программирования Python, Ruby и менее известный, но подающий большие надежды Nemerle; да и сам Web - дело рук и мозгов отнюдь не транснациональных корпораций. Понятное дело, что судьба технологии, за которой не стоит отдел маркетинга из тысячи отборных специалистов, - зачастую дело случая; принято считать, что «достойное само найдет себе дорогу», к сожалению, это далеко не всегда так. То есть прогресс в этой области характеризуется большой степенью случайности, и какова окажется «next big thing» [Устойчивая идиома, обозначающая грядущую технологию, о которой заговорят буквально все] - предвидеть почти невозможно.
В условиях, когда словом «фирма» называют не трех гениев, меняющих мир из гаража, а тридцать тысяч работников умственного труда, образующих сложновыверенный офисный конвейер, объединенный искусственно (искусно?) созданным духом «Мы - одна команда» (а иначе не «сработают» филигранные распасовки, сорвутся поставки, заверещат недовольно клиенты) - так вот, в таких условиях, приближенных к боевым, самым ненадежным и сомнительным винтиком идеальной машины становится человек.
Повышать надежность этой «детали» (читай: гарантировать достижение результата) можно, вообще говоря, разными способами. Но все они сводятся к двум главным принципам: контролировать, что делает отдельный работник; иметь возможность заменить его другим работником. Причем «контролировать» здесь - вовсе не мрачная квазиметафора Большого Брата: «видеокамеры на каждом углу, отчет о каждой минуте, проведенной в офисе, штрафы за пятиминутное опоздание» (хотя и не без этого, да). У таких методов тоже есть область применения, но она, в общем, довольно узка; намного правильнее - просто дать сотрудникам инструменты с ограниченной степенью свободы, такой себе «ограниченный креатив», «акт творения в заданных рамках».
Хороший инструмент должен гарантировать и среднюю производительность сотрудника, и среднее количество ошибок, и даже «средний» способ реализации идей.
Для того чтобы обеспечить взаимозаменяемость сотрудников, надо выдать всем одни и те же, или хотя бы родственные, инструменты - и тогда, коль скоро инструмент контролирует общность стиля, одна «офисная крыса» легко продолжит работу с того места, где другая сошла с дистанции.
Нарисованная картинка может показаться слишком циничной; тем не менее никакая крупная корпорация просто не сможет выжить, не обеспечив маломальскую заменяемость (а значит - стандартизацию) своих работников. Да, ограничение средств выражения мыслей несколько снижает эффективность процесса - зато повышает его предсказуемость. Крупная корпорация не может полагаться на внезапные озарения, ее плоть - каждодневный, часто рутинный, труд. (Это всё банальности, но необходимые.)
Идеальное (по крайней мере, с точки зрения Корпорации) решение задачи «однообразных работников» зовется Платформа. Платформа - набор решений, охватывающих все области деятельности Корпорации; Платформа - контролируемый набор взаимоинтегрируемых инструментов; Платформа - Единый Набор Кнопок с Самого Верха до Самого Низа.
Будь то Платформа Java, Платформа .Net, Платформа 1С, Axapta, Oracle - цель и смысл один.
Технологии такого уровня создаются и развиваются, естественно, крупными-серьезными корпорациями (никому меньшему задачу такого уровня, растянутую на несколько лет, просто не осилить - как и не выдержать последствий возможного провала). И в отличие от технологий эффективной работы, рассмотренных ранее, прогресс в области технологий-платформ течет не то чтобы совсем стабильно и предсказуемо, но, скажем так, с постоянной скоростью - подпитываемый армией маркетологов, заранее окруженный уже-лояльными-клиентами, «носорог плохо видит - но при его весе это не его проблема».
Другое дело, что «прогресс» такого рода многие и за прогресс-то не считают. Достаточно вспомнить последнюю (в смысле - самую свежую) крупную и громкую платформу, сделанную с нуля, - Microsoft .Net, которую задолго до, во время и еще долго после выхода в свет (да и до сих пор) окружали недоуменные статьи на тему «что-же-здесь-нового-и-зачем-об-этом-так-кричать» [Одну из наиболее характерных статей такого рода, к тому же неплохо написанную и сносно переведенную на русский, можно найти у Джоэля Спольски:russian.joelonsoftware.com/articles/MicrosoftGoesBonkers.html]. Действительно, ни один из компонентов .Net, будучи рассмотрен сам по себе, не был чем-то «новым и особенным»; инновацией была целеустремленность и последовательность, с которой Microsoft охватил весь процесс разработки ПО - для любых условий, на любом языке, с интеграцией (и дифференциацией) всего и вся. Набор не самых передовых технологий, объединенных не самым изящным образом, за несколько прошедших лет изменил индустрию весьма существенно - и кто скажет, что это не прогресс, тот прогресса не видел.
Как ни странно, мало достичь результата: он должен еще оказаться корректным (приемлемым, точным, соответствующим и т. п.). Как бы забавно это ни звучало, но это обстоятельство многие творцы игнорируют (ща-допишем-начнем-продавать, с-багами-потом-разберемся); и технологический прогресс в области верификации результата сегодня скорее стоит на месте, чем куда-то прогрессирует.
Пользователю (заказчику, потребителю результата) по-прежнему предлагается либо довериться репутации производителя («фирма веников не вяжет уже сорок лет»), либо опробовать его перед покупкой/оплатой - и при «опробовании» приходится ориентироваться в основном на собственный опыт, интуицию, вкус и тому подобные неформализуемые способности. В любом случае, предполагается, что корректность произведенного уже обеспечена производителем (внутри его головы или его фирмы) и является полностью его болью и заботой.
У самого производителя сегодня не намного больше средств обеспечения этой корректности, чем 10-20-30 лет назад, - автоматически проверить что можно (например, орфографию), тестировать автоматически или вручную [Разницу между проверкой и тестированием можно сформулировать так: проверка напрямую сверяет результат с «правильным» (что возможно далеко не всегда), а тестирование рассматривает его как «черный ящик»: на вход подали А - на выходе должно получиться Б] и опять же - полагаться на свой опыт-вкус-интуицию. Прогресс в стане производителей идет в основном не технологический, а методологический: скажем, все в той же разработке ПО - от когдатошнего максимально-формального процесса (определяем требования до начала работы, пишем кучу документации до начала кодирования, ни на йоту не отклоняемся от плана) - к сегодняшним гибким (agile) методологиям (требования могут меняться в процессе разработки, вся функциональность охвачена тестами, код, спецификации, требования непрерывно перерабатываются).
Впрочем, один из аспектов сегодняшнего прогресса софтверных технологий связан с вопросом «корректности результата» достаточно сильно: при использовании гибких методологий разработки софта одним из важных требований является то, что заказчик должен видеть «полуготовый, но уже полезный» результат разработки; в идеале представитель заказчика постоянно присутствует при процессе разработки: это дает команде разработчиков жизненно необходимый своевременный ответ на вопрос «а то ли мы вообще делаем?». Такие «тепличные» условия легко обеспечить, когда есть конкретный, единичный заказчик - но не в условиях массовой разработки, где по-прежнему приходится действовать по принципу «сделать нечто, послушать отклики пользователей, выпустить следующую версию и так ad infinitum».
В качестве альтернативы, приобретающей все большую популярность, можно ткнуть пальцем в веб-приложения (те, которые установлены на единственном сайте - а весь Интернет пользуется) как идеальную среду для получения отклика от пользователей - здесь и новую версию можно «выпускать» хоть каждый день безболезненно для пользователей; и пользователи «на виду» (можно собрать детальную статистику, кто из них как использует приложение); и пользователи эти больше расположены к общению с командой разработчиков (нет ощущения «программа у меня на компьютере, а разработчики где-то далеко»). Тот же Google Spreadsheet, на сегодня имеющий смешные по сравнению с Excel возможности, опережает последнюю только в одном: новая функция может появиться ПРЯМО СЕЙЧАС, а не «через пару лет, когда наконец-то будет выпущена следующая версия».
То есть, возвращаясь к нашим пулям, результат, возможно, и не станет заведомо корректным, но всегда может быть оперативно скорректирован - и все благодаря магическим словам «веб» и «онлайн».
Не нужно думать, что все эти рассуждения применимы только к разработке ПО. Например, в деле написания текста (которым и я сейчас занимаюсь) блоги как квази-СМИ опережают традиционные СМИ ровно постольку, поскольку последние продолжают работать по «офлайновой» модели «текст опубликован, а там хоть трава не расти», - тогда как в блоге автор статьи обычно активно участвует в обсуждении и зачастую пишет по его результатам новые статьи (или корректирует старые) [Здесь, кстати, можно бы попенять «Компьютерре» за «старообрядческую» модель ее интернет-образа: к статьям хоть и «цепляются» обсуждения в форуме, но никакой связи ни с авторами, ни с последующими статьями форум не имеет]. Сюда же можно записать и Википедию, которая методом непрерывной и всеобщей коррекции накопила объем человеческого знания, несравнимый ни с одной когда-либо созданной людьми энциклопедией.
То есть главный вывод из всех этих рассуждений таков: сегодняшний вектор развития технологий, связанных с обеспечением корректности результатов деятельности в софтверном окружении, - «быстро исправленное не считается ошибочным». А возможность быстрого исправления неотрывно (на сегодня, по крайней мере) связана с «онлайновостью» исправляемого. Веб-все-что-угодно - это не «странная мода» или «идиотская прихоть маркетологов», а, напротив, еще один шаг к серебряной пуле.
Привыкайте.
…вроде нет пока. То есть все движется куда-то, и бытие в софтовом мире становится существенно легче и, кажется, даже немножко более предсказуемым. И все же по самому крупному счету - ее нет; по-прежнему эффективность работы непредсказуема, а результаты неясны. Одна из крупнейших проблем во всех попытках решения - в рекурсивной самоприменимости «проблемы серебряной пули» к технологиям, эту проблему решающим: разрабатывая новый инструмент разработки новых инструментов (скажем, новый суперэффективный язык программирования), мы точно так же не можем быть уверены, удастся ли его разработать, и если да - правда ли он окажется таким вот суперэффективным.
И все же - выразительные возможности софтверных инструментов растут; надежность и качество Платформ повышается; связность-всего-через-веб - таки да…. Следовательно, все не зря?..