Философия статья начинается с удивления. В данном случае я отметил для себя то, как по-разному начинающие разработчики реагируют на сложности, с которыми сталкиваются. Например, когда надо сделать выбор — какое решение взять, чтобы избежать ошибок? Кажется, все сталкиваются с такими неудобными вопросами. Давайте попробуем разобраться.
Итак, как же реагируют разработчики?
Вариант первый — все будет хорошо. Гонки, побочные эффекты, утечки памяти — если и слышал, то это все какие-то прохладные истории из скучных книжек. Где-то у кого-то когда-то было. Таймауты на запросы добавлять не буду, да и код ответа можно не проверять, работает же.
Вариант второй — все будет хорошо, надо только учесть все потенциальные проблемы. Возьмем лучшие паттерны. Перехватим все исключения, Сделаем идеально, тогда уж точно заживем. Словами классика — “но чтобы это была такая бумажка, при наличности которой ни Швондер, ни кто-либо иной не мог бы даже подойти к дверям моей квартиры”. Проблема в том, что нет такой бумажки.
Я немного приврал в начале, что речь пойдет только о начинающих разработчиках. В книге “Мифический человеко-месяц” Фредерик Брукс описывает эффект второй системы на примере весьма опытной команды. Он рассказывает о последствиях желания учесть все проблемы, с которыми они столкнулись на прошлых проектах. На мой взгляд, это самый проблемный вариант. Ведь чтобы с него переключиться, необходимо признать свою слабость, ограниченность и относительность. Это сложно.
Вариант третий — уныние. Как ни сделай, все будет плохо, ведь ошибок не избежать. Не жили богато — нечего и начинать.
Суть проблемы
Если немного обобщить, то это не про баги, а про неопределенность.
Будущее нам не известно, а прошлое нельзя изменить. Поэтому возникает страх, что неверное решение, принятое сейчас, доставит кучу проблем в будущем. И как ответ на этот страх — игнорирование, перестраховка или уныние. Но причина страха — неопределенность, от этого не исчезает.
Вопрос не в том, как избежать неопределенности, а как с ней жить
Я не вижу тут большой разницы, где мы сталкиваемся с неопределенностью — в технических вопросах или организационных. Наоборот, можно увидеть схожее и попробовать применить решения из одной области к другой.
Что применяется для проектов с большой неопределенностью? Гибкие методологии. Что они предлагают?
-
Итеративность. Начинаем итерацию с формулирования гипотез, заканчиваем их проверкой
-
Бережливость. Делаем и планируем столько, сколько нужно и когда нужно. Не раньше, не позже, не больше, не меньше
-
Реализм. Не делаем идеально, а делаем достаточно хорошо
То есть дейлики, доска, ретро, и т.д. — это просто вариант реализации. Суть же в том, как сделать работу в условиях неопределенности возможной.
Как это применить в разработке? Закладывайте метрики и логи на этапе проработки фичи. Формулируйте гипотезы и наиболее дешевые варинты проверки — прототипы. Закладывайте failure modes — что может пойти не так, как вы об этом узнате, и что будете делать дальше.
Вопрос не в том, произойдет ошибка или нет. Вопрос в том, будет ли у вас достаточно информации, чтобы найти причины.
И последнее — решение не может быть одинаково хорошим или плохим во всех ситуациях — где-то это лекарство, где-то — яд. Все зависит от контекста.
Подводя итоги
Есть вещи, которые необходимо принять, чтобы двигаться дальше. В коде, который вы пишите сегодня, обязательно будут ошибки. Причина — наше знание ограничено. Скорее всего вы чего-то не учли и ваше решение окажется неоптимальным.
Чтобы с этим справиться, закладывайте возможность ошибки. Относитесь к планированию и разработке, как набору гипотез, которые могут подтвердиться или не подтвердиться. Добавляйте метрики, дробите на итерации, проверяйте гипотезы в конце итераций.
Не живите так, будто вы бессмертны. Не пишите код, будто в нем нет багов.
ссылка на оригинал статьи https://habr.com/ru/articles/1035960/