Можете ли вы сделать непрерывное развертывание с младшими программистами?


11

Есть момент, когда вы начинаете понимать, что в архитектуре микросервисов более страшно ждать неделю, чтобы развернуть все микросервисы одновременно, чтобы убедиться, что все работает вместе, чем строго соблюдать принудительное управление версиями API, писать много автоматических тесты (по частям: юнит и исследование, интеграция) и автоматическое развертывание в производство, как только ваш коммит пройдет тесты на сцене.

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

Но возможно ли это сделать с младшими программистами? Возможно, мне придется реализовать схему pull-запроса. Это сделало бы его менее похожим на непрерывное развертывание (это мое предположение)?

Я надеюсь, что это не основано на мнении, и я могу рассчитывать на то, что вы поделитесь своим опытом, спасибо.

Обратите внимание, я не спрашиваю ни о КИ, ни о непрерывной доставке. У нас это уже есть. То, что мы сейчас пытаемся сделать, это сделать его непрерывным развертыванием, что означает, что все это будет запущено в производство сразу после регистрации кода.


it is more scary to wait a week to deploy all micro services at once to make sure that everything works together, than to strictly enforce api versioning, write lots of automatic tests (...), and auto deploy to production as soon as your commit passes as tests on stage- это основано на мнении;) ИМХО, гораздо сложнее добиться успеха при независимом развертывании службы, чем при монолитном подходе: softwareengineering.stackexchange.com/a/342346/187812 . А с истинным CI (без функций / веток интеграции) вам не придется ждать неделю.
Дан

Хорошая система CI должна помочь - все делают ошибки, а не только юниоры. А поломки не обязательно означают, что разработчики допустили ошибки или не выполнили свою работу должным образом, см. Как успешно предварительно проверенные изменения могут вызвать регрессии, которые должны были быть обнаружены?
Дан

Ответы:


16

Почему бы и нет? Любая из вещей, которые вы опишите, будет проблемой, используете ли вы непрерывное развертывание или нет. Проблема, кажется, в том, что вы беспокоитесь, что юниоры совершат катастрофическую ошибку. И эта ошибка будет срочно отправлена ​​в производство, прежде чем кто-нибудь сможет ее поймать.

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


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

@doker Если вы беспокоитесь о необходимости объединить множество сервисов, не делайте этого. Убедитесь, что каждый сервис (и внесенные в него изменения) стоят самостоятельно. Если служба A изменилась, сделайте быстрый анализ кода, чтобы убедиться, что он будет работать с новыми изменениями и может быть развернут самостоятельно. Если внесены критические изменения, используйте обзор кода как место для обеспечения контроля версий API. Если служба B зависит от службы A, сначала выполните работу с A, а затем получите ее. Затем поработайте с B. Если младшие руки переходят на A, B, C и D, и все они взаимозависимы, они должны документально подтвердить это, чтобы вы могли просмотреть.
Becuzz

1
@doker В таких сценариях люди, занимающиеся непрерывным развертыванием / доставкой, часто очень склонны к переключению функций. Если ваши изменения обычно находятся за переключателями функций (не обязательно при каждом небольшом изменении), то вы можете развертывать элементы всякий раз, когда функции отключены, включать их, когда все элементы установлены, и выключать их, если вы обнаружите существенную проблему.
Дерек Элкинс покинул SE

3

Непрерывное развертывание будет хорошо работать, если у вас есть хороший набор автоматических тестов.

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

Значок состояния сборки CatLight

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


3

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


1

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

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


1

Из прошлого опыта работы с кодовой базой Big Ball Of Mud, которая развивалась естественным образом на протяжении многих лет в руках многих неконтролируемых начинающих разработчиков, я хотел бы указать, что происходит, когда вы не практикуете CI с этими разработчиками.


Редактирование / обновление : согласно комментарию RubberDuck; в этом ответе предполагается, что целью объединения для интеграции является ветвь разработки, а не ветвь оценки или выпуска.

  • Очевидно, что должен быть намного больший контроль над кодом для выпуска и оперативного развертывания; если нет отдельной производственной ветви, то стоит рассмотреть изменение вашей стратегии ветвления / слияния, чтобы запустить основную ветку разработки (которая используется для интеграционного тестирования, а не для выпуска) вместе с основной веткой выпуска. Это сохраняет все преимущества CI и частых слияний, не рискуя нарушить производственный код.

1. Младшие разработчики реже общаются со своими коллегами или руководителем

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

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

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

2. Код, который они создают, вероятно, нуждается в более тщательном рассмотрении.

Вы когда-нибудь просматривали что-то настолько плохое, что хотели, чтобы вы взяли его раньше и не писали? Это часто случается.

Вы не можете предотвратить написание плохого кода, но вы можете ограничить потерянное время. Если вы совершаете частые проверки и слияния, вы сводите к минимуму потерянное время.

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

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

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

Иногда разработчик может найти идеальное решение для неправильной проблемы; Это грустно, потому что обычно это простые недоразумения, которых было бы так легко избежать, если бы только кто-то задал правильный вопрос (ы) ранее в процессе.

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

4. Вероятно, они менее знакомы с общими шаблонами, архитектурой существующего кода, а также с хорошо известными инструментами и решениями.

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

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

5. Длительные периоды между фиксацией / слиянием кода затрудняют выявление и устранение дефектов

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

Очевидно, что ваша общая стратегия ветвления также вступает в игру здесь; в идеале все ваши разработчики будут либо работать в своих собственных ветвях, либо в функциональных ветвях (или в обеих), и никогда не будут работать напрямую от master / trunk.

Я видел ситуации, когда целые команды работали одновременно непосредственно с мастером / стволом, и это ужасная среда для КИ, но, к счастью, решение отвлечь всех от мастера / ствола обычно обеспечивает достаточную стабильность для индивидуальной работы. пункты / билеты / и т.д..

Любой разработчик должен всегда быть в порядке, чтобы разорвать ветку master / trunk, понимая, что объединение должно происходить на такой регулярной основе, что разрывные изменения и дефекты должны быть выявлены быстрее и, следовательно, устранены быстрее. Худшие дефекты, как правило, те, которые остаются незамеченными в течение нескольких месяцев или даже лет.


В итоге; Основными преимуществами непрерывной интеграции / непрерывного развертывания являются:

  • Улучшается связь между вашей командой
  • Качество кода обычно поддерживается на более высоком уровне
  • Требования с меньшей вероятностью будут пропущены или неверно истолкованы
  • Проблемы архитектуры и дизайна должны обнаруживаться быстрее,
  • Дефекты с большей вероятностью будут обнаружены и устранены на более ранней стадии

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


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

@RubberDuck хорошая мысль, добавил комментарий, чтобы прояснить, что этот подход предназначен для интеграционного тестирования, а не для передачи новых изменений кода непосредственно в производственную ветку.
Бен Коттрелл

0

Да, вы можете практиковать CI с младшими разработчиками. Было бы глупо не в нынешних условиях развития. Безумно полезно иметь возможность нажать на репо, а затем автоматически объединить его с промежуточным кодом - и смотреть все это в режиме реального времени в Travis (или Bamboo, Pipelines и т. Д.)!

Возьмите своего парня из DevOps и попросите его пройти с ними процесс, а также старшего разработчика в режиме ожидания, чтобы просто следить за вещами и связывать их с их обзорами кода (вы делаете это, верно?)

Если вы обеспокоены тем, что код дерьма будет проходить, это не на CI и не на младших: это на вас .

Помогите им стать лучше и привыкли быстрее развертывать код stage / prod. Вы будете благодарить себя в долгосрочной перспективе.


1
ОП говорит о непрерывном развертывании, а не о непрерывной интеграции / доставке
RubberDuck
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.