Идеальный программист. Как стать профессионалом разработки ПО - Роберт Мартин 4 стр.


Высокие ставки

Говорить "нет" важнее всего тогда, когда ставки высоки. Чем выше ставки, тем больше ценность сказанного "нет".

Казалось бы, утверждение очевидное. Если риск настолько велик, что от успеха зависит выживание компании, вы должны без малейших колебаний предоставить руководству самую точную информацию. А это часто означает "нет".

Дон (начальник по управлению разработкой): "Итак, по нашим текущим прогнозам проект "Золотой Гусь" будет завершен через 12 недель от сегодняшнего дня, с погрешностью плюс/минус 5 недель".

Чарльз (исполнительный директор): (четверть минуты сидит молча, постепенно багровея) "То есть ты хочешь сказать, что мы опаздываем на 17 недель?"

Дон: "Да, это возможно".

Чарльз: (встает, Дон встает на секунду позже) "Черт возьми, Дон! Все должно было быть готово три недели назад! Заказчик из "Галитрона" звонит каждый день и спрашивает, где его чертова система. И я должен сказать, что им придется подождать еще четыре месяца? Предложи что-нибудь получше".

Дон: "Чак, я тебе говорил три месяца назад после реорганизации, что нам понадобится еще четыре месяца. Я хочу сказать, ты сократил мой штат на 20 %! Ты тогда сообщил "Галитрону", что мы задержим сдачу продукта?"

Чарльз: "Ты отлично знаешь, что не сообщил. Мы не можем себе позволить потерять этот заказ, Дон. (Чарльз делает паузу, бледнеет.) Без "Галитрона" нам крышка. Ты это знаешь, верно? А теперь после этой задержки я боюсь… Что я скажу совету директоров? (Снова садится в кресло, пытаясь сохранить самообладание.) Дон, ты должен что-то придумать".

Дон: "Я ничего не могу сделать, Чак. Мы это уже обсуждали. "Галитрон" не собирается сокращать требования и не соглашается на промежуточные версии. Они хотят, чтобы установка проводилась только один раз и на этом все заканчивалось. Я просто не смогу сделать это быстрее. Ничего не выйдет".

Чарльз: "Черт побери. Даже если я скажу, что от этого зависит твоя работа?"

Дон: "Если меня уволить, оценка от этого не изменится, Чарльз".

Чарльз: "Все, разговор закончен. Возвращайся к своей группе и следи за тем, чтобы проект двигался. А мне нужно сделать несколько очень неприятных звонков".

Конечно, Чарльз должен был все сказать "Галитрону" еще три месяца назад, когда он впервые услышал новый прогноз. По крайней мере сейчас он поступает правильно, сообщая информацию заказчику (и совету директоров). Но если бы Дон не настоял на своем, эти звонки могли бы быть отложены на еще более поздний срок.

Умение работать в коллективе

Все мы слышали, как важно "уметь работать в коллективе". Это означает, что вы выполняете свои функции настолько хорошо, насколько возможно, и помогаете своим коллегам, если они окажутся в беде. Человек, умеющий работать в коллективе, часто общается с другими, обращает внимание на своих коллег и добросовестно исполняет свои обязанности.

Умение работать в коллективе вовсе не означает, что вы должны со всеми соглашаться. Рассмотрим следующую ситуацию.

Пола: "Майк, у меня свежие прогнозы. Группа согласна с тем, что демо-версия будет готова через восемь недель плюс/минус одна неделя".

Майк: "Пола, мы уже запланировали сдачу демо-версии, это будет через шесть недель".

Пола: "Даже не спросив нашего мнения? Майк, ты не можешь взвалить это на нас".

Майк: "Это уже сделано".

Пола: (вздыхает) "Ладно, я вернусь в группу и посмотрю, что мы сможем выдать через шесть недель, но это будет не вся система. Некоторые функции будут отсутствовать, а загрузка данных будет неполной".

Майк: "Пола, заказчик хочет увидеть полную демо-версию".

Пола: "Этого не будет, Майк".

Майк: "Черт. Ладно, напиши описание того, что вы сможете сделать, и передай мне завтра утром".

Пола: "Хорошо, сделаю".

Майк: "Нельзя ли как-нибудь ускорить работу? Может, работать более эффективно, более творчески?"

Пола: "Куда уж эффективнее, Майк. Мы хорошо знаем задачу, и на ее реализацию нам понадобится восемь или девять недель, но не шесть".

Майк: "Можно работать сверхурочно".

Пола: "От этого все только замедлится. Помнишь, что вышло в последний раз, когда мы выгоняли народ на сверхурочные?"

Майк: "Да, но на этот раз этого не случится".

Пола: "Все будет точно так же, Майк. Поверь мне. Нам нужно восемь или девять недель, а не шесть".

Майк: "Хорошо, напиши план, но постоянно думай о том, как справиться за шесть недель. Наверняка что-нибудь можно придумать".

Пола: "Нет, Майк, нельзя. Я могу написать план на шесть недель, но в нем не будет многих важных функций и данных. Только так, и никак иначе".

Майк: "Договорились, но я уверен, что вы сможете сотворить чудо, если попытаетесь".

(Пола уходит, качая головой.)

Позднее, на собрании у директора…

Дон: "Итак, Майк, заказчик рассчитывает получить демо-версию через шесть недель. И надеется, что все будет работать".

Майк: "Да, все будет готово. Моя группа просиживает за компьютером дни и ночи, и мы справимся. Возможно, придется поработать сверхурочно и проявить творческий подход, но мы сделаем!"

Дон: "Как хорошо, что вы понимаете интересы коллектива!"

Кто же на самом деле "понимает интересы коллектива" в этой ситуации? Пола действует в общих интересах, потому что она по мере возможностей сообщает, что сделать можно, а что нельзя. Она жестко защищает свою позицию, несмотря на все уговоры и нытье Майка. Майк действует в интересах коллектива из одного человека – самого Майка. Очевидно, он не думает об интересах Полы, потому что он только что пообещал за нее сделать то, что она (как она сама сказала открытым текстом) сделать не сможет. Он явно и не думал и об интересах Дона (хотя он бы с этим не согласился), потому что солгал ему.

Почему же Майк так поступил? Он хотел, чтобы Дон видел в нем человека, понимающего интересы коллектива, а также верил в свою способность манипулировать Полой для достижения шестинедельного срока. Не нужно считать Майка злым и испорченным; он просто слишком уверен в том, что ему удастся заставить других людей делать то, что он хочет.

Не пытайтесь

Худшее, что может сделать Пола в ответ на манипуляции Майка, – сказать: "Хорошо, я попытаюсь". Не хочу приплетать сюда Йоду, но в данном случае он прав. Не надо пытаться.

Вам не нравится эта мысль? Может, вы думаете, что пытаться что-то сделать полезно? Ведь Колумб не открыл бы Америку, если бы не пытался?

Слово "попытаться" имеет много определений. В данном случае я имею в виду значение "приложить дополнительные усилия". Какие дополнительные усилия может приложить Пола, чтобы демо-версия была готова к сроку? Если это возможно, получается, что ее группа ранее работала не в полную силу.

Обещая "попытаться", вы признаетесь в том, что ранее вы сдерживались; что у вас остался дополнительный резерв, которым вы можете воспользоваться. Вы признаетесь в том, что цель может быть достигнута посредством приложения дополнительных усилий; более того, вы фактически обязуетесь применить эти дополнительные усилия для достижения цели. Следовательно, обещая попытаться, вы обязуетесь добиться успеха. Тем самым вы взваливаете на себя тяжелое бремя. Если "попытка" не приведет к желаемому результату, это рассматривается как провал.

У вас есть дополнительный источник энергии, который вы еще не пустили в ход? И если вы задействуете его, сможете ли вы достичь поставленной цели? Или вы просто создаете условия для своего будущего провала?

Обещая попытаться, вы обещаете изменить свои планы. Прежних планов оказалось недостаточно. Обещая попытаться, вы говорите, что у вас есть новый план. Что это за план? Какие изменения вы внесете в свое поведение? Что вы собираетесь сделать иначе сейчас, когда вы "пытаетесь"?

Если у вас нет другого плана, если вы не измените свое поведение, если все будет идти точно так же, как до вашего обещания, то что тогда означает ваше "попытаюсь"?

Если вы не придерживаете часть энергии в резерве, если у вас нет нового плана, если вы не намерены изменять свое поведение и если вы достаточно уверены в исходной оценке, то ваше обещание "попытаться" в корне непорядочно. Вы врете. И по всей видимости, вы делаете это для того, чтобы сохранить лицо и избежать конфронтации.

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

Три недели спустя…

Майк: "Пола, через три недели сдаем демо-версию. Заказчики хотят посмотреть, как работает отправка файлов".

Пола: "Майк, это не входит в согласованный список функций".

Майк: "Я знаю, но они требуют".

Пола: "Хорошо, тогда из демо-версии придется выкинуть единый вход или резервное копирование".

Майк: "Ни в коем случае! Они хотят видеть и эти функции!"

Пола: "Значит, они хотят полностью реализованную функциональность. Ты это хочешь сказать? Я же говорила, что это невозможно".

Майк: "Прости, Пола, но заказчик не уступает. Они хотят увидеть все сразу".

Пола: "Этого не будет, Майк. Просто не будет".

Майк: "Да ладно, Пола, можно хотя бы попытаться?"

Пола: "Майк, я могу попытаться летать по воздуху. Могу попытаться превратить свинец в золото. Могу попытаться переплыть Атлантический океан. Как ты думаешь, у меня получится?"

Майк: "Послушай, я же не требую невозможного".

Пола: "Нет, Майк, именно требуешь".

(Майк ухмыляется, кивает и отворачивается, собираясь отойти.)

Майк: "Я верю в тебя, Пола; знаю, что ты меня не подведешь".

Пола: (в спину Майку) "Майк, ты меня не слушаешь? Это плохо кончится".

(Майк просто машет рукой, не поворачиваясь.)

Пассивная агрессивность

Пола должна принять интересное решение. Она подозревает, что Майк не рассказывает Дону о ее оценках. Она может просто позволить Майку идти своим путем и в конечном итоге свалиться в пропасть. Ей нужно лишь позаботиться о том, чтобы в переписке были зарегистрированы все копии соответствующих служебных записок. Когда разразится катастрофа, Пола покажет всем, что и когда она говорила Майку. Это пассивно-агрессивная тактика – просто позволить Майку самому залезть в петлю.

Также Пола может попытаться предотвратить катастрофу, обратившись к Дону напрямую. Безусловно, это рискованно, но в этом и заключается суть понимания интересов коллектива. Когда прямо на вас мчится грузовой поезд и никто, кроме вас, его не видит, у вас есть выбор: либо молча отойти в сторону и посмотреть, как он задавит всех остальных, либо закричать: "Поезд! Немедленно уходите!"

Проходит два дня…

Пола: "Майк, ты сообщил Дону о моих оценках? Он сказал заказчику, что в демо-версии не будет работать функция отправки файлов?"

Майк: "Пола, ты сказала, что сделаешь это для меня".

Пола: "Нет, Майк, я этого не говорила. Я тебе сказала, что это невозможно. Вот копия служебной записки, которую я отправила тебе после нашего разговора".

Майк: "Да, но ты же сказала, что попытаешься, верно?"

Пола: "Мы это уже обсуждали, Майк. Помнишь, свинец и золото?"

Майк: (вздыхает) "Послушай, Пола, это очень нужно. Просто нужно. Пожалуйста, сделай все необходимое, но ты просто должна сделать это к сроку".

Пола: "Майк, ты ошибаешься. Я должна сделать совсем другое – сообщить Дону, если этого не сделаешь ты".

Майк: "Это нарушение субординации, так нельзя".

Пола: "А я и не хочу, Майк, но ты меня вынуждаешь".

Майк: "Ох, Пола…"

Пола: "Послушай, Майк, мы не успеем реализовать всю функциональность демо-версии вовремя. Усвой это наконец. Перестань уговаривать меня больше работать. Перестать обманывать себя, что я каким-то чудом вытащу кролика из шляпы. Пойми, что ты должен сообщить это Дону, и притом сообщить прямо сегодня".

Майк: (с широко раскрытыми глазами) "Сегодня?"

Пола: "Да, Майк, сегодня. Потому что ты, я и Дон проведем встречу, на которой обсудим функциональность, включаемую в демо-версию. Если эта встреча не состоится, я буду вынуждена сама обратиться к Дону. Вот копия служебной записки, в которой это объясняется".

Майк: "Ты просто прикрываешься!"

Пола: "Майк, я пытаюсь прикрыть нас обоих. Ты представляешь, что произойдет, если заказчик придет сюда, ожидая увидеть полную демо-версию, а мы ее не сможем предъявить?"

Чем кончится история Полы и Майка? Проработайте возможные варианты сами. Суть в том, что Пола вела себя очень профессионально. Она говорила "нет" в правильно выбранные моменты и говорила правильно. Она сказала "нет", когда на нее давили, чтобы она изменила свою оценку. Она сказала "нет" на все попытки манипуляций, лесть и мольбы.

И что самое важное – она сказала "нет" самообману и бездействию Майка. Пола действовала в интересах коллектива. Майку была необходима помощь, и она использовала все, что было в ее силах, чтобы ему помочь.

Цена согласия

Чаще мы предпочитаем говорить "да". Действительно, в здоровом коллективе люди стараются найти путь к согласию. Руководители и разработчики в хорошо управляемых группах ведут переговоры до тех пор, пока не найдут взаимоприемлемый план действий.

Но как мы уже видели, иногда, для того чтобы прийти к "да", нужно не бояться сказать "нет".

Для примера возьмем следующую историю, опубликованную Джоном Бланко в своем блоге. Она воспроизводится здесь с его разрешения. Во время чтения спросите себя, когда и как ему следовало сказать "нет".

ХОРОШИЙ КОД СТАЛ НЕВОЗМОЖНЫМ?

В юношеском возрасте вы решаете стать программистом. В старших классах вы учитесь писать программы по объектно-ориентированным принципам. В колледже вы применяете усвоенные принципы в таких областях, как искусственный интеллект и 3D-графика.

А после вступления в круг профессионалов начинается ваша бесконечная работа по написанию качественного на коммерческом уровне, простого в сопровождении, "идеального" кода, который выдержит испытание временем.

Качество коммерческого уровня? Ха. Это довольно забавно.

Я считаю, что мне везет. Я люблю паттерны проектирования. Мне нравится изучать теорию идеального программирования. Я запросто могу затеять часовую дискуссию по поводу неудачного выбора иерархии наследования моим партнером по XP – что отношения типа "содержит" во многих ситуациях предпочтительнее отношений "является частным случаем". Но в последнее время мне не дает покоя один вопрос…

…Почему в современном программировании стал невозможным хороший код?

ТИПИЧНОЕ ПРЕДЛОЖЕНИЕ

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

Прежде чем я начну, позвольте сказать, что меня нельзя упрекнуть в недостатке старания. Мне нравится тема чистого кода. Я не знаю никого, кто бы стремился к идеальной архитектуре программного продукта так же сильно. Проблема кроется в исполнении, и не по той причине, о которой вы подумали.

Позвольте рассказать вам историю.

В конце прошлого года одна хорошо известная компания провела конкурс на разработку приложения. Фирма – очень крупный оператор розничной торговли; для сохранения конфиденциальности назовем ее "Горилла Маркет". Представители заказчика указали, что им нужно организовать свое присутствие в области приложений iPhone, а приложение должно быть готово к "черной пятнице". В чем проблема? Сегодня уже 1 ноября. На создание приложения остается всего 4 недели. Да, и еще в это время Apple обычно требуется до двух недель на утверждение приложений (старые добрые времена). Выходит, приложение должно быть написано… ЗА ДВЕ НЕДЕЛИ?!?

Да. У нас две недели на создание приложения. И к сожалению, наша заявка победила. (В бизнесе фигура заказчика играет важную роль.) Никуда не денешься.

"Ничего страшного, – говорит Руководитель № 1 из "Горилла Маркета", – приложение простое. Все, что нужно, – показать пользователю несколько продуктов из нашего каталога и дать ему возможность найти адреса магазинов. На нашем сайте это уже сделано. Мы дадим готовую графику. Вероятно, вы сможете использовать – как это называется? – да, жесткое кодирование!"

В разговор вступает Руководитель № 2: "И еще нам понадобятся купоны на скидку, которые пользователь сможет предъявить на кассе. Откровенно говоря, приложение пишется "на выброс". Давайте сделаем его, а потом для фазы II "с нуля" будет написано другое, больше и лучше".

Так оно и происходит. Несмотря на годы постоянных напоминаний о том, что каждая затребованная заказчиком функция всегда оказывается сложнее, чем кажется из его объяснений, вы соглашаетесь. Вы действительно верите, что на этот раз все будет сделано за две недели. Да! Мы справимся! На этот раз все будет иначе! Несколько графических изображений и обращение к службе для получения адреса магазина. XML! Запросто. Мы справимся. Поехали!

Всего одного дня оказывается достаточно, чтобы я снова вернулся к реальности.

Я: Итак, дайте мне информацию, необходимую для вызова веб-службы с адресами магазинов.

Заказчик: А что такое "веб-служба"?

Я:…………….

Именно так все и происходило. Данные об адресах магазинов, выводимые в правом верхнем углу их веб-сайта, предоставлялись вовсе не веб-службой – они генерировались кодом Java. И вдобавок хостинг обеспечивался стратегическим партнером "Горилла Маркета".

В моей ситуации мне удалось добиться от "Горилла Маркета" только текущего списка магазинов в виде файла Excel. Код поиска пришлось писать "с нуля".

Назад Дальше