Всем привет, это я, Орландо. Я фанат Apple и инженер-программист в arconsis. Время от времени я публикую статью из серии «Орландо думает», в которой освещаю конкретную тему, которую считаю важной или волнующей. Иногда это могут быть просто отдельные аспекты повседневной жизни, а иногда это могут быть подсказки, намеки, размышления или призывы — но не исключена и бессмыслица.

Хочу написать о сроках сборки. О долгом времени сборки. И о разочаровании, которое здесь может возникнуть. Но сначала я хочу поблагодарить Майка Хэя, чей твит вдохновил меня на написание этой статьи в блоге.

Ссылка на Twitter (Подсказка: это тред)

Майк Хэй приводит 5 баллов на тему "Почему разработчики жалуются на длительное время сборки?".

  1. Автоматизированным системам тестирования нужны полные сборки для запуска тестов.
  2. Медленное наращивание убийственного импульса.
  3. Когда инструменты настолько медленные, что кажется, что они не работают, они становятся новой проблемой, которую нужно решить.
  4. Инструменты иногда вызывают полную сборку — это неизбежно
  5. Разработчикам приходится строить десятки раз в день

Особенно пункт 3 мне очень понравился, и я хотел бы подробно рассмотреть его.

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

«Забытый» технический долг

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

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

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

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

Функционально сломан

Проблема в том, что то, что работает очень медленно, кажется сломанным.

Мы все знаем этот эффект, когда пытаемся загрузить веб-сайт с медленным интернет-соединением. Когда я вижу индикатор загрузки в течение длительного времени, я замечаю, что рефлекс хочет перезагрузить напрямую — он выражает «слишком долго, кажется сломанным, попробуйте еще раз». В настоящее время это также моя проблема с интернет-провайдерами в Германии, которые ограничивают мою скорость до «пограничного века» после того, как мой объем данных заканчивается. Да, на самом деле, у меня еще есть связь. Но на самом деле он функционально сломан. Это именно тот эффект, который вы испытываете как разработчик с длительным временем сборки.

И то, что вы считаете сломанным, вы хотите починить.

Вы пытаетесь решить проблему

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

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

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

Фокус теряется

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

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

Остерегайтесь этих симптомов на ранней стадии — это сигнал тревоги!

Иметь дело с этим?

Сама установка в порядке; вы понимаете код, вы думаете, что кодовая база достаточно модульная, и пока нет реальных причин для беспокойства? Тогда почему бы нам просто не смириться с тем, что сборка иногда занимает 30–40 минут?

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

Разработчики, которые смотрят только на индикаторы загрузки и постоянно ждут сборки своего кода, становятся недовольными. Вы никогда не войдете в состояние естественного «потока». Даже самые незначительные изменения, такие как скрытие метки в пользовательском интерфейсе, настройка соответствующего модульного теста, отправка, а затем ожидание в CI, пока сборка не станет зеленой, становятся делом 1–2 часов. Это не то, что разработчики видят в эффективной работе.

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

Решение?

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

Просто важно понимать: со временем сборки он ведет себя как с любым другим техническим долгом — откладывание проблем никогда не делает его лучше.
Регулярно и как можно раньше устраняйте проблемы!

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

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

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

Однако долгие сроки сборки здесь, к сожалению, не помогают 😊

Убедитесь, что ваши владельцы продукта/менеджеры/кто-то еще знает об этом! Время сборки — это рабочее время. А рабочее время — это время жизни. И мы не любим тратить время жизни на бессмысленное ожидание.

Ура 🍻
Орландо