В этой статье мы подробно расскажем о том, как мы трансформируем процесс разработки в наших командах. 

Trunk Based Development на пальцах

  • Все релизы в обязательном порядке выходят в ветке Trunk или Master (по-русски – главной ветке). Разработка новых фич ведется в отдельных, коротко живущих ветках, так называемых фича-бранчах (Feature Branches). Разработчик делает ответвление, пишет код в течение одного-двух дней и возвращает ветку обратно в Master. 

  • Принципиально важно всегда поддерживать работоспособность и стабильность Master-ветки. Здесь на помощь приходят Feature Toggles (FT) – специальные переключатели в коде, которые отображают/скрывают элементы решения или приложения. Они встраиваются в код во время разработки, а управление ими происходит через специальный портал. Так мы можем скрыть от пользователя нестабильные и незавершенные функции, пока идет доработка, и это не повлияет на работу приложения в целом.  

  • Автоматическое тестирование и непрерывное Code Review – еще две обязательных компонента TBD. Если все изменения в фича-бранче закончены, их нужно оперативно слить в Master, поэтому проверка кода должна быть приоритетной задачей. Что касается автотестов, то строго говоря, они подходят не для всех задач, и покрывать ими 100% кода не нужно (мы подробно рассказывали об этом в статье про наш опыт внедрения практик SDET). Для каждой конкретной задачи сценарий тестирования прописывается на этапе планирования.  Для задач, где автотесты актуальны, код сливается в Master только после их прохождения.  

Декомпозиция задач и Short-lived ветки 

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

Декомпозиция по INVEST определяет, каким должен быть пользовательский сценарий (user story): 

  • Independent — независимый 

  • Negotiable — написанный понятным языком 

  • Valuable — несущий ценность 

  • Estimable — поддающийся оценке 

  • Small — компактный, не более 40 часов разработки 

  • Testable — тестируемый в широком смысле 

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

Иерархия задач 

При уменьшении отдельных задач их общее количество возрастает многократно. Правильно расставить приоритеты и не потеряться в этом потоке нам помогает иерархия задач. 

Непрерывная поставка и TBD 

Конечная цель всех наших внутренних изменений – ускорение и оптимизация стандартных этапов создания IT-решений. 

Мы тщательно проанализировали наш процесс разработки и нашли несколько точек потери времени и качества – они могут возникать из-на недоработки на конкретном этапе или из-за проблем между разными этапами.  

  • Недостаточная аналитика и декомпозиция;

  • Сборка релизов из множества задач; 

  • Регрессионное тестирование;

  • Длительное ожидание Code Review; 

  • Потери на слияние больших изменений;

  • Отсутствие обратной связи от потребителей.

Для того, чтобы оптимизировать этот процесс, мы переходим от ручной доставки программного обеспечения к практике так называемой “непрерывной поставки” (Continuous Delivery, CD). Это надежный, контролируемый и максимально автоматизированный процесс с понятными и четко измеряемыми рисками, который: 

  • Учитывает потери на каждом этапе; 

  • Учитывает потери на переходах между этапами; 

  • Может быть собран автоматически на основе метрик трекера. 

Как мы внедряем TBD в работу команд 

Прежде всего, мы придерживаемся мнения, что внедрение методики TBD имеет смысл только в активно растущих продуктах. Если на данном этапе проекта мы выпускаем по одной правке в месяц и ведем поддержку, TBD не актуально.  

В целом, мы не рассматриваем переход на TBD как отдельную задачу, мы стараемся действовать комплексно и включаем в наши проекты несколько платформенных практик сразу – это и переход на единый трекер Azure DevOps, и добавление функций SDET в командах, и внедрение TBD, в том числе.  

Наши проекты сейчас находятся на разных стадиях перехода на TBD, от проекта к проекту текущий статус может отличаться достаточно сильно. Но, в любом случае, в каждом из них мы стараемся внедрить важные составляющие CD и TBD, например, правильную декомпозицию задач, написание автотестов и тестирование требований.

Комментарии (1)


  1. netch80
    02.11.2021 21:25

    Хм, на моей текущей работе такое TBD где-то с 2012. Хотя у некоторых задач могут делать в релизной ветке и потом переносить в транк, разница несущественна.
    В качестве основы Gerrit. На нём плодить множество персональных веток неудобно, а вот такие короткоживущие ветки у него естественно возникают в виде какого-нибудь refs/changes/41/245241/1 внутри его хранилища (ветка — когда несколько таких коммитов в цепочке). Легко подключается CI (используем Jenkins) с простановкой оценок (тесты прошли — Verified:+1, не прошли — Verified:-1, коммитить нельзя). Peer review (по умолчанию, для разрешения мержа в основную ветку нужно не менее одного +2 при отсутствии -2). Связь с тикетами через идентификаторы тикетов в commit message.
    В нашем отделе полиси разрешает мержить в самом gerrit, если fast forward не проходит, но не разрешает отправлять merge commits. Это иногда чревато поломкой по тестам, выясняется на еженощном запуске. В одном из соседних наоборот — можно постить merge commits от себя (и они проверяются через CI), но нельзя мержить в самом сервере. Но у них очень мало коммитов, а каждый сам по себе сильно сложнее — им таки так лучше.
    Есть список активных релизных веток, в которые должны попасть все исправления, которые не конфликтуют с их целями — обычно это 1-2 LTS и одна текущая не-LTS. В неё переносятся коммиты черипиками. У вас такое, если это сайт, вряд ли будет, а у нас appliances клиентов, нам важно.
    В общем, не вижу ничего нового в этом подходе. Но, подозреваю, таких как мы с подобным подходом реально мало.

    Ну и заметная часть остального есть — иерархия задач (хотя для долгоживущих в ней смысла нет, главное — задача не пересекает момент форка конкретного релиза) и time-based релизная политика (что успели — то успели, ok, всё равно в релиз попало 100500 новых фич).