Глава 19
Часть и целое
Аристотель Кенорос любил вставать рано. И если он собирался нанести визит, то чаще всего это становилось первым событием рабочего дня. Вот и сегодня, когда мистер Томпкинс пришел на работу, миссис Бирцих объявила ему, что Первый программист Моровии уже ждет его в кабинете. Так оно и было. Аристотель сидел на столе, вперив взгляд в таблицу, нарисованную на доске для записей.
— Это отчетная карточка, — пояснил Кенорос. — Я прошелся по всем командам и оценил их успехи в определении архитектуры приложения по пятибалльной шкале. При этом я интересовался не столько качеством их построений, сколько тем, насколько детально они были проработаны. Если вы описали низкоуровневую архитектуру приложения таким образом, что она определяет все модули кода и все взаимодействия между ними — тогда Кенорос поставит вам пятерку. Если ничего такого у вас нет, то единицу. Все прочие получают какой-то промежуточный балл. Вот, посмотри-ка.
Мистер Томпкинс сел за стол и стал рассматривать таблицу, прихлебывая кофе.
— Пожалуйста, скажи еще раз, что значит единица?
— Как правило, это означает, что команда произвела на свет некий политический документ и назвала это «дизайном системы». На самом деле такие тексты не содержат в себе ничего, кроме первоначальных соображений о том, какой в принципе может быть архитектура приложения.
— То есть, по твоей терминологии, это вообще не дизайн.
— Да. Разумеется, потом, в процессе написания кода, дизайн обязательно появится. Но суть в том, что за время, отведенное на продумывание архитектуры, команда не сделала ничего. За это они и получили единицу.
— Хм. А маленькие команды получили пятерки и четверки. В то время как среди больших нашлась только одна, которая получила не единицу, а хотя бы тройку. Отчего же так?
— А вот попробуй догадайся. Эту загадку я специально припас для тебя.
— Прежде всего, если я правильно помню, наша концепция написания кода в последний момент невозможна без отлично проработанного дизайна.
— Очень хорошо. Продолжай!
— И все равно я не понимаю, почему команды А дружно провалили эту фазу. Ведь они не смогут проделать всю работу, которая необходима для того, чтобы перейти к написанию кода.
— Именно. А если еще точнее, то они и не собираются работать по методу кодирования в последнюю минуту. Все шесть команд А уже давным-давно пишут код. Я пытался было убедить их отложить кодирование на последний момент, но у меня ничего не получилось.
— А остальные?
— В разной степени. Впрочем, так или иначе, все они пытаются применить этот подход. Все решили отложить код на последний момент, а до этого постараться как можно точнее описать все внутреннее устройство системы. Некоторые даже отвели на кодирование всего шестую часть времени разработки.
— Но ни одна команда А так поступать не стала?
— Ни одна.
— Ладно. Я сдаюсь. В чем же дело?
Кенорос плюхнулся на стул около мистера Томпкинса. Он широко улыбнулся, но ничего не ответил. Мистер Томпкинс попробовал еще раз:
— Так почему же команды А не захотели заниматься детальной проработкой дизайна?
— Они слишком большие.
— Кто? Что?
— У меня есть теория. Эти команды слишком большие. Когда приходит время заниматься дизайном, команда оказываеся слишком большой. Продумывать архитектуру системы хорошо вдвоем, втроем. Ну, в крайнем случае, можно поручить это четверым или пятерым. Пять человек могут собраться вокруг доски для записей и вместе придумать хорошее решение. Но двадцать человек вокруг доски для записей уже не соберешь.
— И все равно я не понимаю, почему это должно мешать работе. Четверо или пятеро занимаются дизайном, а остальные сосредотачиваются на чем-нибудь другом. Почему бы и нет?
— На чем же еще им сосредоточиться?
— Ну не знаю. На чем-нибудь другом.
— Определение архитектуры приложения — это, по сути, деление целого на части, очень важный этап в разработке программы. Как только вы его прошли, части можно раздавать для выполнения различным людям или командам. Пока вы этого не сделали, у вас нет никаких частей и раздавать вам нечего. Следовательно, вся команда должна работать вместе.
— И все равно это не извиняет отсутствие продуманной архитектуры. Если это должно быть сделано, значит, нужно поручить эту работу четверым или пятерым, а остальные пусть потерпят и подождут. Пусть сидят и ничего не делают, в конце концов, если другого не остается.
— Конечно. Я полагаю, что что-то подобное произошло в команде Quicker Still — А. Но посмотри на свое «решение проблемы» глазами руководителя проекта. Допустим, тебе доверили управлять большим и сложным проектом. С первого дня у тебя работают тридцать программистов. Много? Конечно, но ведь у вас такой напряженный график! А теперь представь, что тебе надо сказать двадцати пяти программистам из тридцати, чтобы они сидели два месяца и ничегошеньки не делали. Легко, не правда ли?
— Понятно. И программисты устраивают своему менеджеру суд Линча.
— Непременно. К тому же представь, как ты будешь смотреть в глаза начальству. Тебе надо закончить проект к 1 июня. А что делают почти все твои программисты? Правильно — мух на потолке считают. Так как бы ты поступил?
— Если честно… если честно, я попробовал бы следующее: раз мне надо занять мою команду какой-то полезной работой, я бы просто постарался как можно раньше выделить какие-то части и раздать их разработчикам.
— Вот-вот, а поскольку вся работа по определению архитектуры состоит как раз в выделении отдельных частей из целого — но прошу заметить, наиболее разумным и эффективным образом, — то вся твоя деятельность сведется к попытке ускорить этот процесс. Верно?
— Понял. Это будет уже не дизайн, а ерунда какая-то. Но разве у меня обязательно все получится так плохо?
— Не обязательно. Но в большинстве случаев почему-то получается как раз так. Действительно, почти во всех проектах есть некоторые задачи, которые можно выделить с самого начала. Однако если у тебя здоровенная команда, то этих задач надолго не хватит.
— Но ведь чтобы дать команде действительно важные и нужные задачи, я могу поделить на части саму работу по дизайну системы!
— А вот тогда ты встанешь на скользкую дорожку, которая сведет на нет все усилия по разработке архитектуры приложения, — заметил Кенорос. — Тебе придется разбить всю работу на пять или даже десять частей, чтобы распределить ее между всеми своими сотрудниками. Но такое грубое деление должно само по себе стать частью дизайна системы. А ты подходишь к задаче не как архитектор, а как менеджер по персоналу, которому надо занять людей работой.
— Но ты говоришь, что даже грубо приблизительное деление проекта на части — уже дизайн.
— Так и есть. И поскольку никто не берет на себя ответственность за сведение воедино всех кусочков дизайна, в результате получится сущая ерунда. К тому же эффективнее всего использовать людей для написания кода и тестирования, поэтому с первых дней проекта у руководителей возникает непреодолимое желание засадить всех за код, даже несмотря на то, что архитектура системы еще до конца не определена.
Но мистера Томпкинса было не так-то просто переубедить:
— Если все так, как ты говоришь, то в большинстве случаев ни одна команда не сможет создать хорошо продуманную архитектуру просто потому, что в большинстве проектов даже на начальной стадии работает больше пяти человек.
— Боюсь, это суровая правда жизни, — ядовито усмехнулся Кенорос. — Сейчас даже в самом начале над проектами работает куда больше людей, чем требуется. Команда проходит все этапы разработки, предусмотренные процессом, вот только дизайна системы в результате не получается. Внутренняя структура развивается вместе с продуктом, и ни у кого нет ни времени, ни возможности хотя бы окинуть ее взглядом и подправить. Проходит несколько лет, систему надо менять. И вот наконец появляется человек, в обязанности которого входит изменение дизайна старой системы. И тут происходит самое печальное.
— Самое печальное? Что же это?
— А то, что этот человек, который появится в проекте через несколько лет, будет первым, кто увидит и оценит настоящую архитектуру системы.
Весь день мистер Томпкинс обдумывал то, о чем они говорили с Аристотелем. Если Кенорос прав, то последствия слишком раннего роста команд разработчиков можно заметить не только у них в Айдриволи, но и во всей отрасли, по всему миру. В большинстве случаев вместо самой ответственной части работы получался пшик: никому не нужный документ вместо подробного и продуманного плана разработки.
После обеда пришла Белинда, и мистер Томпкинс тут же подробно изложил ей всю идею. Вопреки его ожиданиям, она ничуть не удивилась.
— Не вижу ничего нового и из ряда вон выходящего. Управление — это всегда поиск компромиссов. Дизайн — тоже некий компромисс. Тебе нужно занять команду работой, поэтому ты соглашаешься на не самый лучший дизайн.
— Одно дело, когда речь идет о «не самом лучшем». Другое — когда дизайна нет вообще.
— Вебстер, какой-то дизайн есть всегда. Просто он не так хорош, как тебе бы хотелось. Даже если все время, отведенное на дизайн, потрачено впустую, все равно у системы будет внутренняя архитектура. Иначе этот твой будущий специалист, который придет в проект через несколько лет, не сможет ничего в ней поменять.
— Ну, пусть так. Я согласен, какой-то дизайн есть всегда. Мы говорим сейчас не об этом, а о том, что качество «стихийного» дизайна куда хуже, чем у продуманного заранее.
Белинда расчистила себе часть доски для записей.
— Вот, смотри, — и начала быстро водить по ней фломастером. — Вот это вся система, а это — ее части.
— Здесь изображен только один способ, как можно поделить целое на части. На самом деле таких способов очень много. Вот еще один, — и она быстро пририсовала вторую картинку рядом с первой. — Чтобы понять, какой из способов лучше и правильнее, мы должны оценить возникшие в результате деления взаимодействия. Если их много и они сложные, то деление было сделано не лучшим образом.
— Абсолютно правильно, — кивнул мистер Томпкинс. — Причем не только в дизайне. Это важно при любом делении целого на части — например, когда ты распределяешь работу между людьми.
— Сейчас мы перейдем к этому. Итак, посмотрим, какие взаимодействия мы получили в результате деления. Оценим дизайн, иными словами, выберем тот рисунок, который изображает лучший способ деления проекта на части.
— Мы должны выбрать рисунок справа, — произнес мистер Томпкинс голосом прилежного ученика.
— Правильно, Вебстер! Мы выберем его, потому что он проще и взаимодействие между частями гораздо яснее выражено, чем на рисунке слева. Так вот, делить работу между людьми или командами мы будем точно так же, — сказала Белинда и нарисовала ниже еще два рисунка.
— Итак, взаимодействия между людьми аналогичны взаимодействиям между частями проекта, таким образом, — Белинда показала пальцем, — взаимодействие между разработчиком 3 и разработчиком 4 совпадает с взаимодействием между частью 3 и частью 4.
Остановившись на полуслове, Белинда вдруг замолчала и села в кресло.
— Нет-нет. Так не пойдет, — наконец сказала она. — Если мы делим работу еще до того, как была продумана архитектура, мы гарантированно получим более сложные взаимодействия, чем необходимо!
— О том и речь, — подтвердил мистер Томпкинс. — Общий обмен информацией между двумя разработчиками будет крайне сложным, если у них не будет заранее подготовленной информации об архитектуре системы. Разработчикам придется куда больше общаться между собой, добывая нужные сведения. В результате мы имеем меньше независимости, больше телефонных переговоров, собраний и, в конце концов, общее неудовольствие от работы.
— М-да, чем-то это все очень напоминает наши прошлые проекты, а, Вебстер? — скорчила рожицу Белинда. — Тьфу ты. Все эти сложности, бесконечные собрания. Неужели все это из-за того, что в команде с самого начала было слишком много людей?
— Мне уже кажется, что да.
В дверь постучали, и миссис Бирцих объявила, что пришла Аврил Альтербек, руководитель команды PShop-B. Мистер Томпкинс радостно приветствовал ее.
— Привет. У меня есть шанс заполучить минутку вашего драгоценного времени?
— Сколько угодно, — улыбнулся мистер Томпкинс и указан ей на стул возле Белинды. — Что у тебя случилось?
— Мне нужна помощь высшего руководства. Предупреждаю сразу: это вам будет дорого стоить.
— И что же ты просишь? — спросил мистер Томпкинс. «Лишь бы не время, лишь бы не время…»
— Нам необходима куча народу.
— А! — мистер Томпкинс замолчал, припоминая все свои доводы о пользе маленьких команд. — Видишь ли, мы сформировали маленькие команды не из экономии. Просто нам не хотелось перегружать команду. Как раз, когда ты пришла, мы с Белиндой обсуждали все опасности, связанные с чрезмерно большими командами… — он встал и подошел к доске, чтобы наглядно продемонстрировать Аврил всю теорию.
— Ох, Вебстер, я это все знаю, — остановила его девушка. — Я знаю, чем опасны большие команды. Но у нас совсем другой случай. Ситуация изменилась. У нас уже есть готовый дизайн системы — отличный, продуманный до мельчайших подробностей. Аристотель говорит, что даже он редко встречал такие. Впрочем, он сам очень много помогал нам и подсказывал хорошие решения. Теперь мы тестируем его, а скоро нужно будет браться и за реализацию! Для этого я и прошу у тебя людей, Вебстер. Сейчас нас семеро — пятеро разрабатывают дизайн, а двое работают в группе поддержки. Но через два месяца нам нужно будет еще двадцать человек, которые бы писали код.
Белинда радостно вскочила со стула:
— Вебстер, разве ты не видишь — это была всего лишь одна сторона медали! Команда не должна быть большой в период работы над дизайном системы. Но они уже практически закончили ее. Я так понимаю, они уже разделили всю систему на части и продумали реализацию каждой из них. И теперь Аврил нужно больше людей, которым она могла бы раздать задачи.
— Да, так и есть. Я как раз хотела рассказать вам, что именно у нас получилось…
— Сколько, сколько их, Аврил? — не смогла сдержать интерес Белинда.
— Э-э, тысяча шестьсот семьдесят семь модулей, около тысячи трехсот элементов данных, восемнадцать файловых структур, двадцать элементов-модулей…
— Слушай, похоже, тебе нужно больше, чем двадцать программистов?
— Вообще-то да. Не хочу показаться жадной, но мне хотелось бы получить тридцать пять человек в команду. Нам нужны люди, которые будут писать код, приемочные тесты на все конструкции, заниматься проверкой кода, подчищать кое-какие огрехи в документации. Вся работа уже описана в спецификациях — были бы люди, которые начнут ее делать! Как я уже сказала, через шесть-восемь недель мы…
Белинда просто не могла усидеть на месте.
— Вебстер, ты просто обязан дать ей людей. Тридцать пять, столько, сколько ей на самом деле нужно. Вот оно! Мы на правильном пути!
— Погоди. Погоди минутку. Не можем же мы вот так взять и привести в команду к Аврил тридцать пять человек. Да у них работа вообще остановится! Ей придется только и делать, что вводить новичков в курс проекта и объяснять задачи.
— Так найди для нее тридцать пять разработчиков, которые прекрасно знают, чем им предстоит заниматься.
— Тридцать пять человек, которые прекрасно знают всю подноготную PShop'a?! Да откуда же я их возьму?
— Разгонишь команду А, — ответила Белинда.
Аврил ушла, а Белинда и Вебстер стали обсуждать сложную политическую проблему, связанную с переносом стольких людей в другую команду.
— Я прекрасно понимаю, что ты права, — говорил мистер Томпкинс. — Если бы на нас никто не давил сверху, вообще никаких проблем с переводом не было бы. Ты же сама знаешь, как мы работаем… я даже не представляю…
— А что бы на твоем месте сделал принципиальный руководитель? Кажется, ты так ставил вопрос еще совсем недавно? Принципиальный, честный руководитель ставит интересы проекта выше собственных. Ты должен сделать все от тебя зависящее, чтобы люди справились со своей работой и как можно быстрее. Пока ты руководствовался только этими принципами, насколько мне известно. А теперь пришло время распустить команды А и укомплектовать этими разработчиками команды Б и В. Это же очевидно!
— Бэллок нас заживо съест, — мрачно объяснил мистер Томпкинс. — Тот трехдневный выходной был перчаткой, которую он мог и не поднимать. (И не поднял.) А вот на роспуск команд А он просто не может не прореагировать. Мы сами заставляем его принимать меры.
— Что ж. Рано или поздно это должно было случиться.
— Рано или поздно, да. Только не на этой неделе. Аврил сказала, люди понадобятся ей через два месяца. Дай мне два месяца, и я распущу все команды А, обещаю.
— Она сказала, что люди понадобятся ей через две недели, но на самом деле ей нужно дать сейчас человек пять, которые станут ядром будущей большой команды.
— Да знаю я! И все же мы должны подождать. Я очень надеюсь, что через месяц-другой… — мистер Томпкинс замолчал и с тоской поглядел в окно. Может быть, не пройдет и месяца, как вернется Лакса или хотя бы ВВН, который найдет управу на Бэллока и отправит его туда, где тот был раньше.
Белинда нахмурилась. Такие слова явно были ей не по душе.
— Команда Аврил — только часть проблемы. Ее проект — один из самых крупных. Если ее ребята так далеко продвинулись, то как далеко ушли остальные команды Б и В, которые работают над проектами поменьше? Им тоже понадобятся люди, причем не через два месяца, как Аврил, а гораздо, гораздо раньше! Вебстер, мы просто должны распустить команды А. И сделать это надо прямо сейчас.
Мистер Томпкинс какое-то время молча рассматривал свои руки.
— Я знаю, — наконец мягко сказал он.
— Смотри, — Белинда опять оказалась у доски. — Когда работа по созданию архитектуры закончена, весь проект можно легко разбить на множество частей. Это справедливо не только для наших проектов, но и для всех проектов вообще. Мы нашли то, что вся наша отрасль не могла найти в течение тридцати лет, мы нашли главный принцип успешной разработки программ! Вот, гляди, подбор персонала в команду всегда осуществлялся вот так. А в идеале все должно быть совсем по-другому!
Мистер Томпкинс честно пытался сосредоточиться на том, что рисовала Белинда, а не на мрачных мыслях о том, как можно забрать людей из команд А.
— Ага… идеальная схема подбора персонала… ну да… конечно, ты права. Это то, что мы чувствовали на уровне подсознания. Только это совершенно противоречит сложившейся схеме, поэтому я до сих пор никогда не набирал людей таким образом.
— А я набирала. Правда, только сейчас понимаю, почему это правильно и хорошо. Тогда это был просто эксперимент в одном не очень важном проекте. Я бы никогда не решилась сделать такое в разработке одного из ключевых проектов компании. А надо было…
— М-да…
— Кстати, может быть, в этом кроется ответ еще на один вопрос. Этот вопрос всегда меня мучил. Я всегда подозревала, что проекты, перед которыми ставят жесткие сроки, всегда заканчиваются позднее, чем те, которые развиваются в более-менее спокойных условиях.
— Нужно провести эксперимент! — улыбнулся мистер Томпкинс. — Сравнить два совершенно одинаковых проекта, только перед одним поставить малореальные сроки, а перед вторым — вполне выполнимые.
— И второй обязательно победил бы! Я уверена.
Из записной книжки мистера Томпкинса
О персонале
1. Если в самом начале проект делает большая команда, это снижает эффективность самой ответственной части работы — определения архитектуры системы (потому что всем разработчиком надо скорее дать какую-то работу).
2. Если работу раздать людям и командам еще до того, как завершится стадия дизайна продукта, не получится создать простые и эффективные модели взаимодействия между людьми и рабочими группами.
3. Это приведет к потере независимости, увеличению числа собраний и совещаний, общему недовольству.
4. В идеале было бы хорошо сначала набрать маленькую команду, которая создала бы продуманную архитектуру системы, а уже потом, на последнюю, шестую часть времени разработки в эту команду можно было бы добавить новый персонал (который работал бы непосредственно над кодированием).
5. Ужасное предположение: кажется, те команды, перед которыми не ставят жестких сроков, заканчивают работу быстрее!