x
 
Федор Борщев
7 ноября 2019
Советы почтой каждую неделю
Пожалуйста, получите наше письмо, чтобы подтвердить свой адрес:
Вы подписаны на «Советы за неделю»:

Как следить за качеством кода? Часть третья: процессы


Качество кода

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

Качество кода

К при­меру, на запуске Где­Ма­те­ри­ала мы преду­смот­рели очень неудач­ную архи­тек­туру филь­тров в ката­логе — исполь­зо­вали PostgreSQL для фасет­ного поиска. Через несколько меся­цев задачи, свя­зан­ные с филь­тра­цией това­ров, начали зани­мать неоправ­данно долго вре­мени — на про­стей­шую дора­ботку админки вме­сто минут стали ухо­дить дни. В итоге, чтобы поль­зо­ва­тели могли филь­тро­вать товары, нам при­ш­лось уда­лять весь код филь­тров и пере­но­сить товары в базу, кото­рая умеет рабо­тать с неструк­ту­ри­ро­ван­ным дан­ными — Elasticsearch. Это потя­нуло за собой ещё кучу функ­ци­о­наль­но­сти, кото­рую при­ш­лось делать заново — под­борки това­ров, нави­га­цию, марш­ру­ти­за­цию в каталоге.

Эта модель разработки называется Гитхаб Флоу

Чтобы не допус­кать нека­че­ствен­ный код в при­ло­же­ние, выстра­и­вают спе­ци­аль­ные про­цессы, кото­рые про­ве­ряют новый код на соот­вет­ствие стан­дар­там каче­ства. Чаще всего про­ве­ряют ато­мар­ные пакеты изме­не­ний — пулрек­ве­сты. Один пулрек­вест — это несколько коми­тов, объ­еди­нён­ных общей целью: к при­меру, запу­стить новую фичу. Когда пулрек­вест готов, его сли­вают с основ­ной вет­кой («мёр­джат с масте­ром») и код попа­дает на про­дак­шен — поль­зо­ва­тели видят новую фичу.

Эта модель разработки называется Гитхаб Флоу

Про­верки пулрек­ве­стов бывают авто­ма­ти­че­скими и ручными.

Автоматические проверки в процессе непрерывной интеграции

Мет­рики, кото­рые можно снять авто­ма­ти­че­ски, нужно отсле­жи­вать посто­янно. Для этого при­ду­мана прак­тика непре­рыв­ной инте­гра­ции — для каж­дого комита внутри каж­дого пулрек­ве­ста на сер­вере запус­ка­ется про­цесс «сборки». В сборку вклю­чают всё, что нужно для запуска про­екта на про­дак­шене — сни­мают мет­рики, запус­кают лин­теры, про­ве­ряют нена­пи­сан­ные мигра­ции, про­став­ляют штампы вер­сии для Сен­три, ком­пи­ли­руют файлы с пере­во­дами, пакуют код в докер‑кон­тей­нер, выпол­няют проб­ные запуски.

Поря­док сборки при­ло­же­ния в интер­фейсе Circle CI

Если хотя бы один шаг отра­бо­тает некор­ректно, к при­меру лин­тер не про­пу­стит кусок кода, то сборка оста­но­вится, а про­грам­ми­сту уйдёт сооб­ще­ние об ошибке.

Непре­рыв­ную инте­гра­цию настра­и­вают с помо­щью Jenkins, или под­клю­чают внеш­ние сер­висы, к при­меру Circle CI или Buddy.works.

Взаимные ручные проверки: код‑ревью

Код‑ревью — это про­цесс, при кото­ром раз­ра­бот­чики про­ве­ряют пулрек­ве­сты друг‑друга. Выгля­дит при­мерно так:

Построч­ное обсуж­де­ние пулрек­ве­ста в интер­фейсе Гит­хаба

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

Код‑ревью бывает раз­ре­ши­тель­ным и запре­ти­тель­ным. Запре­ти­тель­ный код‑ревью — это когда раз­ра­бот­чик не может смёр­джить пулрек­вест, пока его не одоб­рит дру­гой раз­ра­бот­чик: к при­меру лидер команды или ответ­ствен­ный за область при­ло­же­ния, кото­рую затра­ги­вает пулрек­вест. Мы в Где­Ма­те­ри­але исполь­зуем раз­ре­ши­тель­ную прак­тику — каж­дый раз­ра­бот­чик, про­шед­ший испы­та­тель­ный срок, может смёр­джить пулрек­вест не спра­ши­вая ни у кого одоб­ре­ния — это повы­шает ответ­ствен­ность и уско­ряет работу.

Инстру­менты для код‑ревью встро­ены во все совре­мен­ные системы кон­троля вер­сий. Для команд с повы­шен­ными тре­бо­ва­ни­ями есть отдель­ные инстру­менты вроде Upsource или Reviewable.

P. S. Это был совет об управлении разработкой. Хотите больше знать о планировании спринтов, управлении продуктом или о настройке инфраструктуры? Присылайте вопросы.

Поделиться
Отправить

Комментарии

Константин Петров
11 ноября 2019

Про Постгрес и переход на Эластик: а с какой схемы переходили? EAV или JSONB + Inverted Index?

Если с первым вариантом проблемы понятны (но решаются переходом на второй без смены базы, что намного проще перехода на Эластик), то со вторым навскидку затрудняюсь представить себе описанные трудности. Расскажите поподробнее, пожалуйста: может, я и сам совершаю ошибку, полагаясь на JSONB и GIN/GIST-индексы в Постгресе?

Федор Борщев
11 ноября 2019

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

Андрей Воронин
12 ноября 2019

Фёдор, интересно узнать, почему ваша команда пришла к разрешительном код-ревью, а не осталась на запретительном?

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


Цель рубрики — обсуждение вопросов дизайна всех видов, текста в дизайне и взаимоотношений дизайнеров с клиентами.

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

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

Вот такой веб 2.0.

Как следить за качеством кода? Часть вторая: метрики Как следить за качеством кода? Часть первая: зачем Несколько месяцев назад меня повысили из обычного разработчика до «тимлида» 1 Как правильно, эффективно и уважительно ставить KPI?




Недавно всплыло

Хочу научиться сторителлингу 12 2 2 2