Вы никогда не сократите Тime Тo Мarket, если будете тестировать все фичи на одном сервере

Привет, это Максим Павлов из KTS. Мы создаём IT-продукты для бизнеса.

Все твердят про важность Time To Market — времени от появлении идеи фичи до её релиза для пользователей. При этом почему-то тестируют все фичи на одном сервере. В статье рассказываю, как ускорить Time To Market одним простым способом.

Небольшой Time To Market позволяет бизнесу опережать конкурентов и быстрее получать прибыль от продуктов. Даже Греф еще в 2016 году говорил, что главное для IT-компаний — выводить продукт на рынок быстрее.

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

Почему один рабочий сервер на всю команду — не ок

Новые фичи не соприкасаются и все вместе отправляются в продакшн после тестирования.

Когда все разработчики команды тестируют свои задачи на одном сервере, сначала все работает нормально. Фичи затрагивают разные части проекта и не противоречат друг другу.

Фичей становится больше, они начинают наслаиваться друг на друга. Прежде чем показать свою доработку менеджерам и тестировщикам, нужно расчистить место от мешающих фичей.

Однако со временем таски разработчиков наслаиваются и начинают мешать тестированию друг друга — особенно когда у одного разработчика одновременно несколько незавершённых задач в работе. Проблема обостряется, когда часть задач встали на холд, а новые таски с ними пересекаются.

Упрощенный пример: в компании было решено перекрасить сайт в желтый и протестировать нововведение на общем сервере. Редизайн всего сайта — серьезное изменение, поэтому согласование затянулось. Вместо этого была поставлена новая задача: перекрасить в желтый цвет только одну кнопку сайта.

Разработчик, ответственный за эту задачу, столкнется с проблемой — на общем сервере весь сайт желтый, из-за чего тестирование новой желтой кнопки невозможно.

Для решения этой ситуации разработчику придется искать часть кода, которая пересекается с его задачей. Затем согласовывать с теми, кто эту фичу делал и тестировал, что её можно удалить из тестового сервера. А затем тратить время на вычищение этого участка кода с тестового сервера.

Получается, что помимо самой задачи разработчику придется разбираться еще и с тем, кто и что делал, какие фичи актуальны, а какие — нет. В результате, драгоценное время разработчиков тратится не на новые фичи, а на бессмысленную суету, и TTM растёт.

Проектов на сервере становится так много, что сервер может «сломаться».

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

Итог: новые фичи не доставляются до пользователя.

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

Решение в лоб #1. Очередь на тест

Разработчикам приходится ждать своей очереди, чтобы воспользоваться сервером.

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

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

Решение в лоб #2. Не хватает одного сервера — сделаем несколько

У каждого разработчика есть собственный сервер под свои задачи, но несколько фичей одного сотрудника наслаиваются друг на друга.

Кто-то решает проблему конфликтов изменений, создавая несколько серверов: по одному на каждого разработчика. Этот вариант кажется более логичным. Разработчики работают независимо друг от друга, а значит не пересекаются друг с другом.

Однако разработчики редко работают одновременно только над одной задачей. Как правило, разработчики по одной задаче пишут код. По другой ждут фидбека от менеджера, по третьей — фидбека от тестировщика по исправленному багу, а по четвёртой — фидбека по код-ревью от коллеги.

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

Как решить проблему по-человечески: динамические окружения

Каждая фича тестируется на отдельном сервере. У каждого разработчика столько серверов, сколько фичей сейчас в работе.

Динамические окружения — это подход, при котором для тестирования каждой фичи автоматически разворачивается полная копия сервиса, который сейчас доступен пользователям. Но к этой копии применены изменения, касающиеся только одной новой фичи.

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

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

Чем динамические окружения хороши

Можно выделить несколько преимуществ динамических окружений:

— Экономия времени. Динамические окружения создаются и удаляются автоматически, поэтому разработчики не тратят время на то, чтобы положить изменения на сервер.

— Изолированные задачи. Динамические окружения предотвращают конфликты изменений — если один разработчик что-то сломал на одном из своих тестовых серверов, это не повлияет на работу других своих задач и задач других разработчиков.

— Доступность в любой момент. Благодаря динамическим окружениям разработчики могут использовать сервер в любой момент. Им не нужно ждать своей очереди для тестирования рабочих фичей.

А как настроить динамические окружения?

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

Мы же можем настроить динамические окружения за 2 недели.

Проконсультируем и быстро настроим динамические окружений. Пишите в телеграм: ссылка

0
38 комментариев
Написать комментарий...
Вдумчиво о продажах

Картинки — огонь!)

Ответить
Развернуть ветку
Максим Павлов
Автор

Спасибо! Очень старались:)

Ответить
Развернуть ветку
Борис Латкин

Мало того, что статья классная, так и картинки прикольные, за это точно лайк

Ответить
Развернуть ветку
Максим Павлов
Автор

Спасибо!!!

Ответить
Развернуть ветку
Leha Shum

Актуальная проблема крутое решение

Ответить
Развернуть ветку
Максим Павлов
Автор

Спасибо!

Ответить
Развернуть ветку
user368e2

У вас прям отдельные сервера? Сейчас же с приходом Kubernetes + CI/CD эта проблема решается достаточно легко, даже сам тестировщик сможет развернуть, а потом потушить окружение из нужной ему ветки. Контейнеры в 21 веке маст хев в любой разработке

Ответить
Развернуть ветку
Продавец Шаурмы

Их ЦА слов таких не знает, это компании с ИТ каменного века, для которых автодеплой и СИ/СД - волшебные слова какие то. Им как раз и можно продать "это занимает среднем 4-6 человеко-месяцев, мы же можем настроить динамические окружения за 2 недели".

Ну и в последней строке статьи - как раз кубер и указан. То, что во многих случаях кубер - оверкилл для мелкой компании с сайтиком, там конечно не написано :)

Ответить
Развернуть ветку
Максим Павлов
Автор

Кубер не оверкилл, если компания сталкивается с проблемами, описанными в статье.

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

Так что "оверкилл для мелкой компании с сайтиком" довольно неоднозначное заявление:) Есть проблема с параллельным тестированием - не оверкилл, нет проблемы - не надо использовать (и читать эту статью)

Ответить
Развернуть ветку
Продавец Шаурмы

Конечно оверкилл, так как на сапорт нужен куда более дорогой девопс с кубером, знаниями облачных кубернет движков и прочего. То есть клиент к вам привязывается на саппорт.Тогда как для деплоя традиционной связки "вебсайтик" без хайлоада достаточно докера из 4х компонентов(нжинкс, веб, апи, бд) из готовых образов, который даже разраб без особых знаний девопс осилит саппортить (ладно, и развернуть тоже).

Ладно, там даже ансиблом с супервизорд можно это без проблем развернуть и хотдеплоить, но это уже олдскул и не модно. :)

З.Ы. И отдельно - про неиспользование в проде. Заносить кубер скрипты только для деплоя тестовых стейджингов - это уже слишком смешно. Конфигурационные тестирование, не? :)

Ответить
Развернуть ветку
Максим Павлов
Автор

Ну для такой ситуации мы скорее посоветуем клиенту Kubernetes IaaS от Яндекс облака или других облаков, чтобы Яндексные админы заботились о доступности этого кубера

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

Конечно, разработчики могут сказать что-то типа "как же так, у нас будет кубер в тесте, но не будет в проде", но по факту объективных аргументов тут не будет

А насчет конфигурационного тестирования — какая доля продуктов, у которых одна и та же фича в одном и том же докер контейнере не будет работать чисто из-за того, что в проде нет кубера?

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

Ответить
Развернуть ветку
Продавец Шаурмы

Какая доля продуктов? Да почти все. Особенно для компаний без штатной девопс экспертизы (ведь они к вам обратились). Обычный косяк - на тестовые задеплоилось, на прод нет, так как весь деплоймент разный. В одном месте я помню чуть ли не каждый третий деплой в прод летал по этой причине. Поэтому и придумано оное конфигурационное тестирование- когда тестовые среды используют все тоже самое, что и прод (с отличием ввиде секреток, хостов/роутов и автоскейлинга) - такие косяки минимальны, так как выкладка уже проверена на тестовом стенде

Ответить
Развернуть ветку

Комментарий удален автором поста

Развернуть ветку
Максим Павлов
Автор

Вся статья как раз про настройку всего этого добра — мы тоже думали, что Kubernetes и развертывание нужных образов по отдельным урлам это мастхев, но оказалось что есть много компаний, которые продолжают тестировать все фичи на одном тестовом сервере

А насчет контейнеров — они действительно мастхев, но например если в качестве оркестратора используется Docker swarm, то автоматом разворачивать окружения под ветки не получится. Так что одной контейнеризацией не обойтись, нужен еще правильный оркестратор

Ну и финально — чтобы сам тестировщик развернул и потушил окружение нужной ему ветки как раз и нужно настроить всю эту среду

Ответить
Развернуть ветку

Комментарий удален автором поста

Развернуть ветку
Vladloiq

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

Ответить
Развернуть ветку
Максим Павлов
Автор

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

- на след день взялся за небольшой баг, который надо побыстрее докатить до продакшна, быстро пофиксил и опять надо показать тестировщику

- дальше взялся за следующую крупную задачу, параллельно тестировщик выкатил фидбек по той первой задаче

В итоге процессы нормальные, а всё равно нужно 3 сервера — под первую задачу, где надо что-то пофиксить, под вторую, которую нужно срочно посмотреть и под третью, которую еще никто не видел

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

И если из-за этого приходится еще прикладывать усилия чтобы "оторвать" задачу с тестового сервера, то это вдвойне грустно

Так что система в процессах с частой сменой приоритетов поможет прям ОЧЕНЬ сильно, а в стандартных, нормальных поможет тоже сильно. Потому что как ни крути разработчик не будет ждать, пока тестер протестит задачу, он возьмет новую

Ответить
Развернуть ветку
Vladloiq

У разрабов так получается, когда не налажены процессы в разработке. Когда процессы налажены - такого нахлёста нет.
Баг не надо показывать тестировщику конечно же, когда вы делаете хот фикс. Если это хот фикс, то он скорее всего пойдёт прямо на стейджинг. Если это фикс, то он должен оказаться на интеграционном стенде, а не показанным тестировщику. В большом кол-ве проектов правильным является локальный стенд на машине разработчика, если проект маленький - как раз для ведения разработки фичи. А в больших проектах есть разные способы обеспечить фича неймспейсы. В целом, не хочется устраивать лекцию из комментария моего. Безусловно инфраструктура с тестированием должна быть. Вопрос в том, что к проблемам надо правильные решения подбирать. Иначе затыкая одну проблему не её решением, а затычкой - проблема остаётся и фактически продолжает отъедать время. Та же поддержка зависших бранчей продолжит поедать время разработчиков, как минимум на восстановление сборки и интеграции спустя время (зависимости внешние и внутренние соответственно).

Ответить
Развернуть ветку
Продавец Шаурмы

Люди продают девопс услуги. Какой смогли пример придумать, такой и написали.

Ответить
Развернуть ветку
Vladloiq

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

Ответить
Развернуть ветку
Максим Павлов
Автор

Ну изначально мы всё-таки разработчики, DevOps у нас появился позже. Поэтому пример взят не из головы, а из типовой разработки у нас в компании и в компаниях-клиентах

Расскажете своё видение, как у разработчика может быть не больше одной фичи в работе? В работе то есть не доведено до продакшна в разных стадиях

Ответить
Развернуть ветку
Vladloiq

Это когда фича закончена, бранч влит в дев и тот в стенде
А разработчик занят другой фичей.
Да, я в одной замечательной компании приходил в ситуацию, которую запустили. Там было 40 зависших бранчей, которые подвесили за год. И это не говоря, о том, что завесили за 8 лет истории.
Не поверите - решилось всего 1 переговорами с оунером. Просто показав стоимость поддержки такого зависания.
Дропнули все в итоге. Внимательно согласовали механизм приоритезации и не меняли больше, перестав перекидываться на фичу до окончания разработки приоритезированной, оцененной, взятой в работу. Компания работает и ей пользуется в РФ ну процентов 5 населения, наверное.

Ответить
Развернуть ветку
Максим Павлов
Автор

То есть вашим решением было не брать разработчику другие задачи в работу, пока тестировщик не протестирует?

Ответить
Развернуть ветку
Vladloiq

решение очевидно в повышении качества решений разработчика и налаживании процессов разработки на уровне модулей, которые делаются без тестировщика
И да, завершённая задача в модуле, прошедшая ревью, зарытая модульными тестами и пр составляющими нормальный dod - да, такая задача вполне закончена и может не ждать никакого тестировщика. Дальше при баге на уровне интеграции вы делаете в dev-у фикс. Это позволяет вам не вешать бранчи, не возвращаться к бранчам и пр. И на чамом деле позволяет снизить проблемы в интеграции - ведь у вас ещё несколько разработчиков рядом пишут свои задачки и им надо их тоже вливать в dev и тоже гнать на интеграцию. В целом мероприятия для снижения проблем на интеграции в виде бекмерджей раз в пару дней максимум - это не простая, но обязательная культура.

Ответить
Развернуть ветку
Максим Павлов
Автор

Это всё абсолютно справедливо для задач на бэкенд, где модульные тесты и код ревью срезают абсолютное большинство багов

Но вот с фронтендом ситуация другая. Фронтенд меняется очень часто, поэтому модульные тесты на него обычно занимают больше времени чем приносят пользы. Мы обычно пишем автотесты на часто переиспользуемые компоненты и там эффект ощутим, но в большинстве ситуаций это лишняя нагрузка

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

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

Именно поэтому в статье пример про желтые кнопки и перекраску интерфейса — динамические окружения приносят больше всего пользы именно в работе с фронтендом

Ответить
Развернуть ветку

Комментарий удален автором поста

Развернуть ветку

Комментарий удален автором поста

Развернуть ветку
Продавец Шаурмы

Молча. Если больше одной таски в работе, и вторая не емерженси хотфикс - значит с процессом/пайплайном разработки проблемы. Впрочем если у конторы нет автодеплоя, то там общая квалификация очевидна, и процессы врядли будут кардинально лучше, чем общий технический уровень

Ответить
Развернуть ветку
Максим Павлов
Автор

А что делать, когда задачу доделал и ждешь результата тестирования от тестировщика? Сидеть и ждать?

Ответить
Развернуть ветку
Продавец Шаурмы

Юнт тесты на нее писать вестимо. Для этого стенд не нужен.

Стенды нужны в первую очередь тестированию (юниты к нему тоже относятся), а не разработке, так как оная вполне может локально поднимать в докере компоненты с использованием какой то общей дев базы и тп. А вот тестированию надо, чтобы среда была стейбл + новая фича, а не ввиде месива из фичей. У вас же в статье основной упор на разработку, что не верно.

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

Ответить
Развернуть ветку
Максим Павлов
Автор

С юнит тестами не всё так просто:)

На бэкенде мы обычно делаем как вы говорите — всё покрываем тестами и довольно редко используем динамические окружения и тестировщики если тестят методы API, то уже на общем деве

А вот с фронтендом не всё так просто — автотесты имеет смысл писать либо на очень стабильный функционал, либо на какие-то часто переиспользуемые компоненты. Автотесты на верстку в большинстве случаев пустая трата времени

И вот тут и возникает типовой кейс — фичу на фронтенде должны проверить тестировщики и пока они ее проверяют разработчик должен взять следующую задачу или просто сидеть без дела. А у тестировщиков может быть в какие-то моменты очередь на тестирование, так что разработчику сидеть без дела ну просто неприлично

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

А насчет того, кому проще продать — деньги крутятся у бизнеса и с ним надо говорить на языке бизнеса. У тестировщиков может быть много потребностей, но если на чем-то бизнес теряет деньги, то лучше ему напрямую об этом сказать, что я и сделал в статье:)

Ответить
Развернуть ветку
Максим Павлов
Автор

"так получается, когда не налажены процессы в разработке"
То есть если процессы налажены, то разработчик сидит и ждет пока протестируют его фичу, а не берет следующую?

Насчет багов: насчет хотфикса согласен, а насчет "если это фикс, то он должен оказаться на интеграционном стенде" не согласен — если на этот интеграционный стенд выкатили еще несколько фичей, то они могут повлиять на тестирование этого фикса, на выходе та же проблема, которую я описывал в статье

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

Но если вы говорите про то, что нормально иметь тестовый сервер прям на компьютере разработчика, то это совсем странно — отключился от интернета / выключил комп - тестировщик не может тестить

А насчет затыкания проблем — так вся статья как раз про то, что люди пытаются менять процессы, не сделав абсолютно гигиенической истории с фича стендами

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

Ответить
Развернуть ветку

Комментарий удален автором поста

Развернуть ветку
Roman

В идеальном мире у разраба в работе в данный момент одна фича. Хотел бы я в такой мир. Но реальность более жестока

Ответить
Развернуть ветку
Максим Павлов
Автор

На то он и идеальный мир:) но к этому можно и нужно стремиться, хотя бы не в плане незавершенной работы в целом.

Когда одну фичу тестят тестировщики, по другой код смотрит ревьюер, по третьей пришли баги, но вот именно в разработке одна фича

У нас в целом такая схема сохраняется если нет каких-то из ряда вон выходящих событий

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Максим Павлов
Автор

Разворачивать продукты с платной лицензией типа сапа и динамикса под каждую фичу действительно либо не получится, либо слишком дорого, но при классической разработке получается довольно эффективно:)

Ответить
Развернуть ветку
Evgeny Yudin

База данных тоже отдельная на каждый пулл реквест разворачивается?

Ответить
Развернуть ветку
Максим Павлов
Автор

Развертывание бд под фичу выходит за гигиенический минимум, который нужен прям всем и о котором я пишу в статье, но такое мы тоже делали

Ответить
Развернуть ветку
Максим Федоров

можно просто схему под ветку разворачивать в той же БД

Ответить
Развернуть ветку
Evgeny Yudin

Да разные способы есть, интересно как это у автора реализовано

Ответить
Развернуть ветку
Roman

У нас в конторе это уже реализовано, могу подтвердить - очень хорошая штука, особенно в связке с интеграционными тестами, которые можно запускать в конфигурации "Реальный сервис и набор стабов других сервисов"

Ответить
Развернуть ветку
Максим Павлов
Автор

Вот у нас тоже давно реализовано, но недавно поняли что есть много компаний, для которых это всё ещё не является стандартом

Ответить
Развернуть ветку
35 комментариев
Раскрывать всегда