Найти в Дзене
Ryadom Tech

Вся правда про "задел под оптимизацию"

Оглавление
Мечтаете об эффективном коде?
Мечтаете об эффективном коде?

Если вам знакомо выражение "задел под оптимизацию", то скорее всего, вы напрямую или косвенно сталкивались с ним в разработке и знаете некоторую подоплёку, о которой и хочется поговорить в этой статье.

В наших командах разработки мы называем это выражение феноменом.

Фено́мен — необычное явление, редкий факт; то, что трудно постичь.

И действительно, когда речь заходит о заделе под оптимизацию, команды и их участники понимают требования по своему. Что требуется заделать? Под какую оптимизацию? Какой скоуп и сроки? Какие приоритеты? На все эти вопросы бывает очень сложно однозначно ответить.

Обычно у команды существует несколько паттернов реагирования на этот феномен: отрицание, торг, прокрастинация, принятие и зависимость.

Отрицание

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

Оно и не удивительно: заказчик не видит потенциального осязаемого результата, за который он платит. В свою очередь команда не хочет делать бесплатно дополнительную работу. Это губительное поведение, ведь разработчики привыкают к стилю написания такого кода, а заказчик получает целый ряд минусов в долгосрочной перспективе:

  • Много легаси кода, который трудно поддерживать;
  • Приложение или сервис работает медленнее, откуда кстати вытекают доп. затраты на сервера и хостинги. Я лично знаю продуктовую команду, которой проще было докупить плашку оперативной памяти, чем провести рефакторинг алгоритмов;
  • Разработчики деградируют, перестают писать код "эффективно".

Торг

Здравомыслящие менеджеры или лиды закладывают оптимизацию и рефакторинг в стоимость проекта или пытаются упросить заказчика выделить средства на оптимизацию и рефакторинг отдельно. Здесь начинается целое испытание: как доказать заказчику, что ему это нужно, и что команда не виновата?

Так вот торг значит, что лучше уж что-нибудь, чем ничего. Если есть возможность получить даже самый ограниченный бюджет на рефакторинг и оптимизацию — это уже отличная новость.

Так вот, почему же заказчику это нужно?

  • Банально сокращаются затраты на хостинг или сервера, ведь система работает быстрее;
  • Меньше шансов, что какое-нибудь легаси отстрелит в ногу в будущем;
  • Меньше срок на онбординг новых разработчиков.

А почему команда не виновата?

  • Потому что команда в моменте делает всё правильно, рефакторинг и оптимизация чаще всего нужны по прошедствии определенного времени, когда появляется более быстрое решение или образовывается легаси;
  • Потому что команда также находится под влиянием человеческого фактора: разработчик, особенно начинающий, может банально не знать эффективное решение, в то время как более опытный разработчик во время оптимизации потенциально заметит плохой код и сможет его оптимизировать;
  • Проект быстро растет и меняется, и иногда где-то может появится возможность на чем-то сэкономить ресурсы.

Прокрастинация

Самый популярный подход, который по сути является иллюзией безопасности. Бюджет на оптимизацию и рефакторинг есть, но сам процесс постоянно переносится на конец проекта в угоду новых фич или ЗНИ.

В этом случае "оставить задел под оптимизацию" означает "быстрее сделать фичу как-нибудь, показать, защититься и забыть, потом другие разберутся".

Это весьма безответственный подход, ведь плохой и неэффективный код рано или поздно снежным комом собьет с ног всю команду.

Принятие

Так как же следует выстроить процесс рефакторинга и оптимизации кода в команде? Что делать, чтобы он не мешал выпускать фичи и заниматься приоритетными задачами, но при это уделять ему достаточно времени?

Разумеется, в приоритете — сделать функционал и выпустить его. Но есть пара правил, которым следует придерживаться:

  • Не экономить на код-ревью. Всегда включать трудозатраты на этот процесс в оценку задачи. А еще код-ревью нужно проводить по определенным правилам, о которых рассказываем тут;
  • Объяснить заказчику о необходимости этого процесса. Убедиться, что он точно понял и осознал, что будет происходить, в какие сроки и каком объёме;
  • Выделить период времени, раз в который нужно обязательно обращать внимание на оптимизацию и рефакторинг. У нас в Ryadom Tech этот период равен примерно 10 месяцам на клиентах и 6 месяцам на бекенде;
  • Обязательно проводить самые очевидные оптимизиации в течение недели после релиза проекта;
  • Привить разработчикам желание писать код "эффективно", рефакторить по ходу то, что бросается в глаза, если это не требует существенных трудозатрат, оставлять метки TODO там, где потенциально можно придумать решение получше;
  • Если задача выполнена быстрее, чем указано в оценке, из оставшегося времени выделить часть на рефакторинг и оптимизацию написанного кода.
Действительно ли это даёт эффект? Абсолютно точно. Недавно мы провели масштабный рефакторинг БД в проекте. Там за два года очень темповой разработки ужас что творилось. Оптимизировали всё, от столбцов таблиц до индексов и запросов. В итоге за две недели пару раз уронили стейдж, но получили в среднем 25% ускорение сложных и тяжелых запросов и 2-3% остальных. Поиски стали работать на 10% быстрее, а сама БД весить чуть меньше.
Итого: крутая оптимизация по денежным затратам несоразмерная с оплатой апгрейда серверов.
В планах: найти пару дней повыкидывать из джсончиков неиспользуемые на клиентах данные.

Зависимость

Существует также ситуация, когда код "прихорашивают" и оптимизируют слишком часто и долго. Это характерно для стартапов или инди-студий с разработчиками-перфекционистами.

Это плохой перфекционизм. Во всём нужно знать меру, ведь вовремя написанная неплохая книга уже лучше ненаписанной. Можно же выпустить новое улучшенное издание.

Здоровый же перфекционизм в этом случае, когда разработчики просят больше времени на оптимизацию. Если сроки не горят, лид с радостью поднимет оценку задачи на 2-4 часа на "хорошее дело", в противном случае оставьте "TODO", ведь можно вернуться к этому позже.

Ведь так?.. Вы куда?.. (©) 2004 catch (Exception e) {
// TODO who cares?
}