Моє домашнє завдання з'їла собака

хотіти виконати роботу, а й бути в змозі це зробити. Перше без другого марно з точки зору кінцевого результату.

- Тому, коли хтось<нибудь берет передо мной некое обязательство, – заключил Роско, – я предполагаю, что он одновременно хочет и может его выполнить. Поэтому работа будет сделана. Дело закрыто. Если он не уверен в своих возможностях, не надо брать на себя обязательств.

Мені довелося задуматися над цим глибше, ніж я робив це раніше.

- Звичайно, - продовжував Роско, - завжди знайдуться шахраї, які ста<нут сочинять сказки про то, как «мое домашнее задание съела собака». Я та<ких не терплю и всегда удивляюсь, откуда они вообще взялись. И знаешь что: они всегда сообщают тебе, что не успевают сделать работу вечером накануне сдачи, хотя ясно, что они знали об этом намного раньше. Это просто несерьезные люди, и их надо гнать как можно скорее.

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

- Ти правильно говориш, Роско, - відповідав я. - Але іноді здається, що просто виникло якесь<то недоразумение.

- Так, є два поширених типу «механічного» провалу. під<пер<вых, может быть разночтение по поводу того, что представляет собой обяза<тельство. То есть что именно должен представлять собой результат? Сколько труб надо перевезти и в какое место в Техасе? Во<вторых, может быть не<четко определено «когда». Я всегда указываю водителю час, к которому тру<бы должны быть доставлены на место. Он понимает это так, что если он за<держится с доставкой, то я не получу той услуги, за которую заплатил.

- Тут питання грошей, - вставив я.- Стосується це, якщо мова йде про програмне забезпечення?

Роско відповів без коливань. - Програмістам не завадило б краще уточнювати, що саме має бути поставлено і до якого терміну. Тоді менше стало б ниття щодо того, зробили вони те, що потрібно, чи ні. Умови повинні бути однозначними, чіткими і не обговорюватися до нескінченності заднім числом.

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

Я був просто вражений тим, як проста логіка техаських нефтедоб<чиков нашла применение в программном бизнесе. Но у меня тут же воз<никли некоторые опасения.

Війни специфікацій?

- Почекай, Роско, - втрутився я. - не так просто здійснити твоє наме<рение точно затвердить, что именно должно быть поставлено. Уокер Ройс неоднократно говорил мне, что стремление к излишней точности в самом начале проекта ведет к большим потерям времени. Например, если на<стаивать на очень точных условиях поставки, возникает масса споров от<носительно спецификаций.

- Насправді, - відповідав Роско, - я згоден з Уокером. Трата безлічі часу на обговорення дрібних деталей кінцевого продукту нагадує суперечки юристів про розстановку ком в контракті. Бажано уникнути подібних витрат. Інакше нічого ніколи не буде доведено до кінця, і ми витратимо надто багато часу, виплоджуючи непотрібні документи. Але є реальна проблема, яка потребує вирішення. Ось приклад. Дуже часто інженер або програміст зобов'язується написати за тиждень до п'ятниці якийсь фрагмент коду, який повинен брати участь в складанні більшого про<екта. В указанный срок код поступает, но в нем обнаруживаются ошибки. Еще неделя уходит на то, чтобы их устранить. Затем обнаруживается, что если число элементов в используемом им массиве возрастает со 100 до 1000, то алгоритм работает в 100 раз медленнее. На исправление этого уходит еще несколько недель. И все это время задачи, которые зависят от этого кода, висят и ждут, когда он будет доделан.

Роско розминався перед виступом. Він продовжував.

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

все не обіцяв при цьому виявити і виправити всі помилки. Але вступати на цю слизьку доріжку дуже небезпечно, тому що тепер ви станете про<суждать, насколько серьезной может быть ошибка, которой разрешается проскочить тестирование (да проводил ли он его вообще?). А программист станет также доказывать, что вопросы эффективности вообще не обсужда<лись, хотя применение им алгоритма с квадратичной зависимостью от объ<ема данных 1 вообще несовместимо с понятиями компетентности и про<фессионализма.

Цікаво, хто це просвітив Роско про квадратичних алгоритмах?

- Я не стану стверджувати, що для вирішення цієї проблеми потрібні деталь<ные спецификации, вплоть до точных показателей эффективности. Но так же, как я на своем нефтяном поле в Техасе вправе рассчитывать, что мои трубы после доставки на новую буровую не окажутся завязанными в крен<дель, так и менеджер программного проекта вправе полагать, что пред<ставляемый ему код не окажется полусырым. Особенно, когда программи<сту известно, что его код участвует в сборке проекта и будет использовать<ся другими людьми.

«Ось що я намагаюся пояснити», - сказав Роско, відкидаючись у кріслі.

Три найпоширеніших відмовки

делікатно поцікавився у Роско, чи є у нього якісь<либо пред<Я ставления о том, почему люди регулярно не выполняют свои обяза<тельства. Стоило ли сомневаться, что у него было свое мнение по этому предмету?

- Здається мені, що в програмному бізнесі більшість зобов'язань нічого не варті вже в той момент, коли вимовляються. Люди просто не так<ют себе труда хорошенько подумать, прежде чем принимать на себя обяза<тельства. Если бы они понимали все последствия, вытекающие из приня<тия на себя обязательств, они были бы гораздо осторожнее. Приведу не<

1 Вхідний масив виріс з 100 елементів до 1000, т. Е. В 10 разів. Час обробки зросла в 100 разів, або 10 в квадраті. У такій ситуації ми говоримо, що алго<ритм имеет квадратичную сложность. Квадратичные алгоритмы легко програм<мировать, но для всякой серьезной программы они убийственны. Хотелось бы, чтобы алгоритмы линейно зависели от размера входных данных. Знающий про<граммист обнаруживает квадратичные (или еще менее эффективные алгорит<мы) и заменяет их чаще всего такими, сложность которых не хуже n log(n). Ино<гда это лучшее, чего можно добиться.

скільки прикладів. Ось одна з трьох найпоширеніших відмовок: «мене весь час відволікали, а я на це не розраховував». Дозвольте, чиї це труднощі? Явно не мої. Не я брав на себе зобов'язання. Той, хто взяв на себе зобов'язання, повинен був або, коли це робив, врахувати, що його будуть відволікати, або не відволікатися, коли його намагалися відвернути. Очевидно, що зобов'язанням, прийнятим щодо мене, він не надав достатнього значення, якщо відволікся на інші завдання. А як же поняття «раніше даного обіцянки»?

- Почекай, Роско, - вигукнув я, - всяке трапляється в житті. Ти риєш ями під стовпи для забору, і починається дощ. Ти змушений припинити роботу. Хіба не так?

- Так, іноді буває дощ, - сказав він. - Я вважаю, що, роблячи свою оцінку, ти повинен це врахувати. Якщо 50% часу йдуть дощі, то не варто

в своїй оцінці покладатися на те, що дощу не буде. Не можна робити таке припущення, а потім скаржитися, що пішов дощ.

- Так, - подумалося мені, - здається, людям рідко приходять в голову такі речі. Багато зобов'язання виходять з того, що все буде ідеально. неже<лание признать, что обстоятельства могут сложиться неудачно – одна из причин, приводящих к беде и невыполнению обязательств.

- Добре, що йде другим у списку? - запитав я.

- Ось друга відмовка: «завдання виявилося складніше, ніж я припускав». знову<таки, чья это вина? Не я оценивал задачу, а он. Если у него не было уверенности, не надо было брать на себя обязательство. Если он недоста<точно разобрался в задаче, чтобы правильно ее оценить, не нужно было брать на себя обязательство. Неожиданное прозрение посреди работы – явный непрофессионализм. То, что ты паршиво сделал оценку, не снимает с тебя ответственности за результат. Желание<то у тебя было, а компетент<ности не хватило.

Ох, скільки разів мені доводилося це чути! Нещасний малий рас<сказывает, что трудился день и ночь, но задача оказалась намного, неизме<римо труднее, чем он предполагал. И он рассчитывает на сочувствие. Я часто обнаруживал, что мне жалко того человека, который только что ме<ня подвел. Может быть, зря?

- Гадаю, - сказав я, - що іноді люди приймають на себе обязатель<ства, потому что им кажется, что они сумеют сделать эту работу. И слиш<ком часто, как мне кажется, они начинают что<то понимать, только вник<нув в задачу глубже. Наверно, прежде чем брать на себя обязательство, они должны были попросить какое<то время, чтобы изучить задачу.

Схожі статті