
Есть старая байка про двух разработчиков, которые решили сделать похожий продукт. Первый к делу подошел основательно. Сел продумывать архитектуру, сценарии, масштабирование. Хотелось ему, чтобы все было правильно с самого начала, чтобы без костылей и переделок. Второй выбрал другой путь. Собрал минимальную версию, местами кривую, но работающую, и как можно быстрее выкатил ее.
Пока первый допиливал систему до идеала, у второго уже появились пользователи. Они писали, где неудобно, что ломается, чего не хватает. Он быстро чинил, добавлял, переделывал, короче, постепенно улучшал продукт. В итоге у него появился живой сервис и рынок, а у первого осталось почти идеальное решение, но без пользователей. Обычно эту историю пересказывают как аргумент против перфекционизма, но она все таки не про то, что делать плохо - хорошо. Второй разработчик ведь не избежал переделок. Он на них, можно сказать, и выехал, просто делал их уже на основе реальности, а не догадок. Собственно, почему так? Почему часто нам проще сначала сделать кое-как, а потом исправлять, хотя кажется, что логичнее было бы сразу сделать нормально?
Если посмотреть на реальную работу, в общем-то, это почти базовый сценарий. Появляется задача, и вместе с ней негласное допущение: вот сейчас сделаем рабочую версию, а потом ка-ак улучшим! И вот это "потом" почти всегда существует, даже если его никто не проговаривает вслух. Оно как будто встроено в сам процесс. Причем это касается не только разработки. Тексты пишутся на черновик, потом перепишем. Дизайн собирается на коленке, потом выровняем. Даже процессы в командах часто запускаются в виде временных решений, которые живут годами. Почти везде есть этот временный слой.
Выглядит как рациональный подход. Не тратить лишнее время, не усложнять на первых порах. И нужно это, прежде всего, как способ справиться с неопределенностью. Когда задача только появляется, она расплывчатая. Даже если есть требования, в них почти всегда куча пробелов. Непонятно, какие сценарии реально важны, где будет нагрузка, что начнет ломаться первым. Делать сразу хорошо в такой ситуации сложно, потому что нет четкого критерия этого самого "хорошо". Вот и приходится угадывать.
А угадывать мы не любим. Это тяжело и рискованно. Гораздо проще начать с чего-то конкретного. Сделать базовую версию, пусть и неаккуратную, зато понятную. На этом этапе мы как будто получаем некую ясность. Появляется опора, от которой можно отталкиваться. После первой реализации задача перестает быть абстрактной. Появляются реальные ограничения, реальные баги, реальные пользователи или хотя бы реальные сценарии. И переделка в этом контексте гораздо проще, потому что это уже не поиск наощупь в темноте, а работа с конкретными проблемами.
Да и вообще, улучшать всегда легче, чем придумывать с нуля. Когда перед тобой уже есть решение, даже плохое, его можно критиковать, менять, упрощать, переписывать кусками. Это линейный процесс. А вот сразу сделать правильно - это почти всегда разветвляющееся дерево решений, где непонятно, куда двигаться. Поэтому переделки психологически комфортнее, они дают ощущение контроля.
К этому, кстати, добавляется дофаминовая составляющая задач. Быстро сделал - быстро закрыл - порадовался. Даже если это черновик, он все равно дает ощущение движения. А продумывание и аккуратная реализация такого ощущения не дает. Ты долго сидишь, обдумываешь, прикидываешь, а выглядит так, как будто ничего не происходит.
Плюс мы системно ошибаемся в оценках. Почти любая задача в начале кажется проще, чем есть на самом деле. Вот думаешь ты себе: "Сейчас немного времени потрачу и сразу аккуратно сделаю". В реальности это может занять в два, а то и в три раза больше, чем ты планировал. И в этот момент выбор в пользу черновика выглядит как разумный компромисс. Интересно, что сами переделки при этом слабо заметны. Они не происходят как одно большое событие. Они размазываются: здесь поправили, там переписали, потом вернулись еще раз. В итоге, конечно, суммарно уходит много времени, но оно не ощущается как единая потеря.
Есть, кстати, и культурный слой. Во многих командах ценится скорость реакции. Быстро починил – ай, молодец! Срочно выкатил фикс – ну вообще герой! А вот человек, который потратил время на то, чтобы изначально сделать хорошо и без багов, запросто останется в тени. Его вклад для некоторых будет не так очевиден. Вот в итоге и формируется привычка: сначала сделаем, потом разберемся. И она подкрепляется со всех сторон - психологией, процессами и даже системой поощрений.
Но, по сути, проблема (да и проблема ли?) не в самих переделках. В той же истории про двух разработчиков именно они и привели к успеху второго. Дело в том, что переделки часто происходят не как осознанный этап, а как побочный эффект спешки. В общем то, можно упростить задачу до крайности и работать под девизом "делай быстро, потом исправишь". Можно уйти в другую крайность и попытаться сразу учесть все. Оба варианта в чистом виде плохо работают.
Более живой подход появляется, когда ты начинаешь видеть разницу и расставлять приоритеты. Где-то действительно важна скорость выхода и можно позволить себе сырой старт. Где-то цена ошибки слишком высокая, и лучше потратить время заранее. Где-то имеет смысл сделать прототип, но осознанно не тащить его в продакшн. И главное - фиксировать для себя, что именно ты сейчас делаешь? Это временное решение или постоянное? Ты правда потом вернешься к этому месту или это "потом" просто способ не думать сейчас?
Когда появляется эта осознанность, работать становится проще. Переделки никуда не исчезают, да и не должны. Но они перестают быть хаотичными и начинают быть частью нормального процесса. Ты уже не просто реагируешь на проблемы, а понимаешь, зачем вообще идешь на этот шаг и какая у него будет цена. В этом, наверное, и есть главная мысль: не перестать переделывать, а просто делать это не вслепую, а осмысленно и запланированно.
Комментарии (7)

AlexGorky
15.09.2026 08:55Пффф. Вы забыли самый главный аргумент в корпоративной культуре. Если сразу сделать хорошо (и потом не переделывать), то все будут думать, что вы лентяи. А если сделать плохо, а потом постоянно переделывать, то все будут говорить "какие молодцы, всегда работают" - отдел всегда будут премировать, вешать на доску почёта как самых усердных работников и т.п. И список задач на доделку будет на годы планирования вперёд.
А тех, кто сразу сделал хорошо, за что премировать?

ky0
15.09.2026 08:55Ода вайбкодингу. Но продумывание архитектуры до начала работ - это не столбняк идеализма, оно занимает пренебрежимо малое время по сравнению с имплементацией.
Делать "quick and dirty" допустимо ровно в одном случае - проверка гипотезы. Если взлетает - переделываем по-нормальному. Для уже работающего продукта не подходит.

Dhwtj
15.09.2026 08:55Делать "quick and dirty" допустимо ровно в одном случае - проверка гипотезы
Да, но в США толпы богатых кастомеров на большом рынке одержимы FOMO. Поэтому, выпустить черновик на рынок и быстро захватить его, получив миллиарды прибыли - это выигрышная стратегия. В России это пожалуй даже вызовет непонимание на уровне идеи, это просто невозможно: рынок мал, у кастомеров денег нет, деньги в корпоративном секторе и госах.

ky0
15.09.2026 08:55Кривое-косое костыльное решение не сможет захватить рынок - поскольку оно создаётся без оглядки на производительность под нагрузкой и возможность масштабирования, как только становится понятно, что сервис "взлетел" - надо срочно переписывать, иначе всё захлебнётся, как сайт с хостингом на телефоне под хабраэффектом :)

ThJudge
15.09.2026 08:55Вообще правильный подход для новчика или вообще нового типа проекта за который вы взялись в первый раз в жизни.
Ибо проработать в деталя такой проект как правило невозможно. Это будет на 80% впустую потраченное время, так как в любом случае найдутся те или иный глюки и несовместимости с теми или иными библиотеками которые вы планировали использовать, а они (вдруг) не заработали по совершенно тупой и не зависящей от вас причине о которых в (пока) не в курсе.
Поэтому иттеративное развитие проекта - удобно в этом плане. Причем на каждом этапе нужно оставлять отдельно возможность "быстро и криво накодить фишку" чтобы проверять те или иные возможности уже по ходу дела. Однако план разработки в целом быть конечно должен. Но это не "вот я тут так класс назову, а тут вот такие параметры будут в функцию передаваться" а именно список фич. Лучше плясать от фич, а структуру потихоньку подгонять под них. Ибо распланировать все фичи наперед очень сложно, почти нерально даже независимо от опыта, особенно если проект это не фиксированное ТЗ, а проект "на вырост" с неопределенным в конце функционалом.
Однако, чем отличается опытный разраб от новичка - он сразу примерно представляет что будет дальше, и поэтому для него очевидно проще делать сразу хорошо, потому-что он примерно знает что и как, и ведет поиск решений по довольно узкому пространству вариантов. В силу опыта. И архитектура и структура в его голове обычно выстраивается сразу нужным образом а код и частные решения просто "приписываются" сбоку, о них даже не думаешь, оно само получается, подсознательно и сильно над ним не задумываешься.
Второй момент - размер проекта. Если проект условно мелкий, то конечно проще его переписывать. Если в проекте модулей сто двадцать, то лишний раз переписывать - надорвешься. И тут важно как вы этот момент все-же порезали на части. Потому-что переписать какой-нибудь серьезный компонент если вы изменили всю обвязку в проекте и у вас перестало стыковаться - та ще работка.
Так что да, имеет смысл, но не всегда и не для всех )
Fedyaration
Хорошо подмечено: черновик полезен не как оправдание спешки, а как способ быстрее получить обратную связь и понять, что действительно нужно доводить до идеала.