AlexMorozov
New member
Всю свою сознательную жизнь в разработке я объясняю нетехническим коллегам одну простую вещь: технический долг — это не метафора, это буквально кредит. Вы берёте его, когда скорость важнее качества, и платите проценты каждый день до самого закрытия. Именно так я и рассказываю про рефакторинг, потому что аналогия с банком работает безотказно. Никто не спорит с тем, что кредит бывает выгоден — вопрос только в ставке и в том, куда вы вложили деньги.
Свой первый настоящий долг я взял на стартапе, где надо было выкатить продукт к выставке. Мы тогда сознательно скопировали половину модуля, оставили захардкоженные конфиги и отключили часть тестов, потому что иначе не успевали. Через полгода проценты по этому кредиту стали чудовищными: одна и та же правка требовалась в четырёх местах, а любое изменение схемы данных превращалось в двухдневный квест. Я помню ночь, когда мы ловили баг, который существовал только потому, что копия копии разошлась с оригиналом на одну строчку. Вот тогда я и понял, что выплата по кредиту наконец стала дороже самого займа.
И мы сели за рефакторинг. Страшно было всем: менеджеры видели ноль новых фич в отчёте, разработчики боялись сломать то, что худо-бедно работало. Спасли нас две привычки. Первая — мы никогда не переписывали больше, чем могли покрыть тестами за тот же спринт. Вторая — каждое улучшение шло вместе с бизнес-задачей, а не отдельным эпиком на три месяца. За квартал мы не переписали систему, но убрали дублирование и вынесли конфиги наружу. Скорость выпуска версий выросла примерно вдвое, и это оказалось единственным аргументом, который убедил руководство.
Но я честно скажу и о том, что рефакторинг окупается далеко не всегда. Однажды я потратил три недели на то, чтобы перевести живой, но некрасивый код на модный тогда фреймворк. Через полгода продукт закрыли, и эта работа не принесла никому ни рубля. С тех пор у меня есть жёсткое правило: я не трогаю код, который не планируется менять в ближайшие полгода, и не переписываю то, что вот-вот выбросят. Рефакторинг — это инвестиция, а инвестировать в умирающий актив бессмысленно, каким бы красивым он ни был.
За годы я выработал для себя три простых признака того, что кредит пора гасить. Первый: вы тратите больше времени на обходные пути, чем на саму задачу. Второй: новые люди в команде не могут внести правку быстрее чем за неделю. Третий: количество багов растёт не потому, что код сложный, а потому что он запутанный. Если совпали хотя бы два пункта, я начинаю считать. Считаю я обычно в часах, а не в красоте: сколько времени мы сэкономим на ближайших десяти задачах, если приведём этот участок в порядок. Если экономия перекрывает затраты — берусь, если нет — иду делать фичи.
Читателям я советую относиться к техническому долгу так же, как к финансовому: вести его учёт, а не делать вид, что его нет. Заведите место, где честно записано, где именно вы срезали углы, почему и сколько это стоит вам каждый месяц. Это может быть обычная страница в вики или заметка в трекере, неважно. Когда такой список лежит на виду, разговор с продуктом перестаёт быть спором о вкусах и превращается в обсуждение бюджета. И ещё: не пытайтесь выплатить весь долг сразу, это почти всегда заканчивается провалом. Лучше маленькими платежами, вместе с реальными задачами, чем героическим рывком в никуда.
За годы я убедился, что рефакторинг окупается ровно в тот момент, когда он перестаёт быть самоцелью и становится инструментом. Пока вы чистите код ради чистоты, это хобби. Как только вы уменьшаете проценты по кредиту и выпускаете продукт быстрее — это бизнес. А теперь вопрос к вам, форумчане: какой технический долг вы уже закрыли и с какой скоростью он вернулся к вам в виде сэкономленного времени? Буду рад почитать ваши истории и цифры в комментариях.
Свой первый настоящий долг я взял на стартапе, где надо было выкатить продукт к выставке. Мы тогда сознательно скопировали половину модуля, оставили захардкоженные конфиги и отключили часть тестов, потому что иначе не успевали. Через полгода проценты по этому кредиту стали чудовищными: одна и та же правка требовалась в четырёх местах, а любое изменение схемы данных превращалось в двухдневный квест. Я помню ночь, когда мы ловили баг, который существовал только потому, что копия копии разошлась с оригиналом на одну строчку. Вот тогда я и понял, что выплата по кредиту наконец стала дороже самого займа.
И мы сели за рефакторинг. Страшно было всем: менеджеры видели ноль новых фич в отчёте, разработчики боялись сломать то, что худо-бедно работало. Спасли нас две привычки. Первая — мы никогда не переписывали больше, чем могли покрыть тестами за тот же спринт. Вторая — каждое улучшение шло вместе с бизнес-задачей, а не отдельным эпиком на три месяца. За квартал мы не переписали систему, но убрали дублирование и вынесли конфиги наружу. Скорость выпуска версий выросла примерно вдвое, и это оказалось единственным аргументом, который убедил руководство.
Но я честно скажу и о том, что рефакторинг окупается далеко не всегда. Однажды я потратил три недели на то, чтобы перевести живой, но некрасивый код на модный тогда фреймворк. Через полгода продукт закрыли, и эта работа не принесла никому ни рубля. С тех пор у меня есть жёсткое правило: я не трогаю код, который не планируется менять в ближайшие полгода, и не переписываю то, что вот-вот выбросят. Рефакторинг — это инвестиция, а инвестировать в умирающий актив бессмысленно, каким бы красивым он ни был.
За годы я выработал для себя три простых признака того, что кредит пора гасить. Первый: вы тратите больше времени на обходные пути, чем на саму задачу. Второй: новые люди в команде не могут внести правку быстрее чем за неделю. Третий: количество багов растёт не потому, что код сложный, а потому что он запутанный. Если совпали хотя бы два пункта, я начинаю считать. Считаю я обычно в часах, а не в красоте: сколько времени мы сэкономим на ближайших десяти задачах, если приведём этот участок в порядок. Если экономия перекрывает затраты — берусь, если нет — иду делать фичи.
Читателям я советую относиться к техническому долгу так же, как к финансовому: вести его учёт, а не делать вид, что его нет. Заведите место, где честно записано, где именно вы срезали углы, почему и сколько это стоит вам каждый месяц. Это может быть обычная страница в вики или заметка в трекере, неважно. Когда такой список лежит на виду, разговор с продуктом перестаёт быть спором о вкусах и превращается в обсуждение бюджета. И ещё: не пытайтесь выплатить весь долг сразу, это почти всегда заканчивается провалом. Лучше маленькими платежами, вместе с реальными задачами, чем героическим рывком в никуда.
За годы я убедился, что рефакторинг окупается ровно в тот момент, когда он перестаёт быть самоцелью и становится инструментом. Пока вы чистите код ради чистоты, это хобби. Как только вы уменьшаете проценты по кредиту и выпускаете продукт быстрее — это бизнес. А теперь вопрос к вам, форумчане: какой технический долг вы уже закрыли и с какой скоростью он вернулся к вам в виде сэкономленного времени? Буду рад почитать ваши истории и цифры в комментариях.