В программировании есть несколько очень сложных проблем, не имеющих однозначного решения. Как то: определение настоящих желаний заказчика; выбор хороших имен для идентификаторов; предсказание сроков реализации; объяснение подчиненному того, что ты от него хочешь получить (см.первый пункт списка)… Сегодня выдаю поток сознания на тему того, почему лично я никогда не угадываю со сроками написания программ.
В принципе, все просто – когда я озвучиваю некий срок, я озвучиваю свою надежду на то, что в этот срок я уложусь. Фактически, предсказание сроков – это вопрос веры. Вот верю я в то, что такую задачу я могу поднять за месяц, поэтому и озвучиваю месяц.
Это вопрос веры еще и потому, что невозможно представить себе точный объем предстоящей работы. Во-первых, есть семантический разрыв. На эту тему я уже писал почти год назад. Но влияние этого разрыва на точность сроков чрезвычайно велико – объем фактической работы отличается от объема предполагаемой работы в разы.
Во-вторых, далеко не всегда есть вообще четкие идеи о том, что и как будет делаться. Вот, например, я недавно обнаружил, что правила маршрутизации сообщений в нашем шлюзе достигли предела нормального восприятия. Стало понятно, что их нужно упрощать и приводить к какому-то другому виду. Но к какому? Идей нет, их еще предстоит выносить и родить. Сколько на это потребуется времени? Без понятия. Может быть день, может быть неделя, может быть месяц. Я могу исходить только из собственной самоуверенности – когда-то мне потребовалось около месяца на рождения некоего алгоритма. По сложности задачи кажутся мне равнозначными. Поэтому я верю в то, что месяц на проектирование новой формы правил маршрутизации – это реально. Но это только вера, она не подкреплена никакими выкладками.
Короче говоря, часто я не знаю, ни что именно придется делать, ни в какой объем работы это все выльется (сколько строчек кода нужно будет написать, сколько комментариев придумать, сколько тестов оформить, сколько экспериментов провести и т.д.). Посему я озвучиваю свою надежду.
Но самое плохое не столько в этом, а в том, что я оказываюсь безнадежным оптимистом даже в своих мечтах. Поскольку когда я мысленно прикидываю трудозатраты, то я почему-то совершенно не учитываю, например, следующие факторы:
- рабочих дней в неделе всего пять. Т.е. месяц – это не 30 дней, а около 20 рабочих. Почему-то я упорно не могу заставить себя разделять выходные и рабочие дни, наверное, большой опыт авральных проектов сказывается :(
- на определенных стадиях проектов эффективное рабочее время будет составлять всего 2-3, в лучшем случае 4 часа в день. Т.е., если для проектирования решения потребуется 16 часов, то это не два рабочих дня, а 5-8 рабочих дней;
- расходы времени на коммуникации с коллегами. Между тем, расходы собственного рабочего времени при этом растут просто катастрофически. Например, если ко мне обращается подчиненный с вопросом на 20 минут обсуждения, то чтобы вернуться к работе мне требуется, как минимум, раза в два больше времени. Следует добавить сюда и огромный расход энергии на то, чтобы быстро включиться в тему нового разговора;
- непредвиденные технические проблемы. Начиная тем, что ты сам неверно прочитал документацию и написал код в ошибочных предположениях, заканчивая глюками или недокументированными особенностями сторонних библиотек. Из этой же оперы и ошибки в технических предположениях: например, почему-то предполагалось, что асинхронный I/O в конкретных условиях будет выгодным, а на деле вышло наоборот;
- разнообразные личные обстоятельства и житейские форс-мажоры – сам заболел или с ребенком нужно посидеть, или за какими-нибудь справками нужно бегать в рабочее время;
- элементарное отсутствие желания работать. Да, если задача захватила тебя полностью и ты желаешь ее натянуть по самые гланды – тогда душа поет и руки сами код пишут. А если нет? Чем старше становишься, чем больше сделанного за плечами, тем меньше адреналина от новых задач. Посему из 8-ми часов рабочего времени (минус все вышесказанное) изрядный процент времени будет уходить на то, чтобы побороть свое эротическое к ней отношение. Кстати, все офисные time killer-ы вроде блогов, форумов, YouTube и пр. попадают в эту категорию. За исключением дартса и турника – это совсем другое дело.
Вот и получается, что когда я думаю, что могу сделать что-то за месяц, то это моя наивная вера в то, что в идеальных условиях я в этот срок уложусь. Но таким оптимистичным ожидания суждено разбиться о суровую действительность. Поэтому появляются коэффициенты “спокойного сна” – умножение оптимистичных сроков на два, три или Пи.
Причем, когда я называю свой срок, я уже произвожу такое умножение (на коэффициент в диапазоне от 2 до 4-х), но все равно ошибаюсь. А взять больший коэффициент не позволяет (пока?) все тоже самомнение: “Ну как же! Да не может быть, чтобы вместо одной недели потребовалось пять-шесть недель!” :)