
Что на самом деле представляет собой релиз из 127 коммитов
GeekBye v1.7.0 — это 127 коммитов за одиннадцать дней. Снаружи это выглядит как сотня мелочей. Изнутри это были две крупные функции, сплетённые вместе, — и одну из них сначала построили не в том месте, потом вырвали и переделали посреди релиза. Вот анатомия крупного релиза.
Есть версия этого поста, которая просто перечисляет всё в GeekBye v1.7.0 — переработанный главный экран, процесс калибровки, сворачиваемую боковую панель, новые настройки и так далее. Она была бы точной и ничему бы вас не научила. Потому что честная история релиза из 127 коммитов — это не список. Это форма.
Вот форма. Сто двадцать семь коммитов звучат как сто двадцать семь мелочей. Почти никогда так не бывает. v1.7.0 — это были две крупные функции, строившиеся параллельно на долгоживущих ветках примерно одиннадцать дней и сплетённые вместе в конце. Понять крупный релиз — значит понять эти две нити, а также то единственное место, где мы построили что-то не там и вынуждены были вырвать это на лету.
Нить первая: калибровка
Первой нитью была калибровка — голосовая AI-оценка ваших коммуникативных навыков. Вы начинаете живой разговор с AI «карьерным коучем», проходите структурированный набор фаз (разминка, поведенческая, техническая коммуникация, реакция под давлением, постановка целей), а в конце получаете оценку по шести измерениям: уверенность, ясность, конкретность, вовлечённость, самообладание, релевантность. Под капотом она измеряет и конкретные метрики речи — темп говорения, частоту слов-паразитов, читаются ли ваши паузы как стратегические или как неуверенные.
Результат — это не оценка, это отправная точка. Калибровка выдаёт ваши сильные стороны, зоны роста и — что критически важно — рекомендованный уровень сложности, с которого стоит начать практиковаться. Она калибрует то, где продукт должен вас встретить. Каждый навык возвращается разворачиваемой карточкой обратной связи с резюме, конкретным предложением и реальной цитатой из вашего собственного разговора в качестве примера. Это функция, поверх которой построен весь остальной опыт практики.
Нить вторая: целое новое окно
Второй нитью был премиум-редизайн — и назвать это редизайном значит его недооценить. Это была не перекраска существующих экранов; это было по сути второе окно приложения, развёрнутое в шесть явных фаз: сворачиваемая боковая панель в стиле Notion, выпадающее меню в шапке, заменившее старый список сессий, навигация в стиле браузера с историей и хлебными крошками и премиум-переработки экранов Home, Профили, Встречи и Настройки.
Две крупные функции. Вот чем на самом деле были 127 коммитов. И самой трудной частью их выпуска было не написание любой из них — это было сплетение. Обе ветки были взаимозависимы; одну слили в другую, а ветке калибровки пришлось подтянуть основную ветку четыре отдельных раза только для того, чтобы не выйти из синхронизации, пока редизайн двигался под ней. Число коммитов — это не цена крупного релиза. Цена — это долгоживущие ветки и порядок интеграции.
Часть, ради которой стоит читать: мы построили калибровку не в том месте
Вот ошибка, и она хороша именно тем, что так распространена.
У GeekBye есть жёсткое архитектурное правило: все операции AI живут на бэкенде. Клиент — это тонкая оболочка, которая разговаривает с сервером. Все это знали.
И тем не менее калибровку сначала построили в локальной базе данных клиента. Отдельная таблица, миграция базы данных, репозиторий на 254 строки, обработчики IPC и банк оценочных вопросов на 515 строк — всё живущее на машине пользователя. Оно работало. И оно же тихо нарушало контракт, на котором построено всё приложение.
Через три дня один коммит удалил 680 строк в восьми файлах, чтобы перенести всё это на бэкенд, где данные калибровки стали полноценной серверной моделью, а логика вопросов и подсчёт баллов стали заботой сервера. Другой коммит удалил клиентский банк вопросов на 515 строк целиком. Дифф почти забавен: одна вставка, шестьсот восемьдесят удалений.
Никто не собирался писать 680 строк одноразового кода. Это произошло так, как это всегда происходит: срез угла на стороне клиента прямо тут, прототипировать локально быстрее, а «перенесём на бэкенд позже» кажется безобидным. Но когда ваша архитектура уже говорит вам, где живёт источник истины, строить это где-либо ещё — не срез угла, это переделка, которую вы заранее запланировали себе сами. Урок, который остался: положите это туда, где говорит контракт, с первого раза, даже когда локальную версию быстрее поднять.
Баг, который могла найти только интеграция
Ещё одна расписка, потому что это фирменный режим отказа крупных релизов. Как только калибровку и новую навигацию соединили вместе и они реально заработали, приложение начало срабатывать на лимит частоты запросов — HTTP 429 — без очевидной причины.
Причина была чисто интеграционной. Статус калибровки запрашивался на уровне компонента, поэтому каждая навигация запрашивала его заново — а строгий режим React, который намеренно дважды вызывает эффекты в разработке, чтобы вскрыть баги, удвоил это ещё раз. Результатом были от четырёх до восьми одинаковых запросов калибровки, выстреливавших при каждой смене экрана, — достаточно, чтобы сработал ограничитель частоты сервера. Исправление консолидировало получение данных до пары вызовов при монтировании.
Вы не смогли бы найти этот баг, тестируя калибровку в одиночку или навигацию в одиночку. Он существует только на шве — там, где встречаются две независимо корректные функции. Это налог, который взимает крупный релиз: последняя миля — это не постройка функций, это обнаружение всего, что ломается лишь тогда, когда они наконец оказываются в одной комнате.
Три вещи, которым научил крупный релиз
- Релиз из 127 коммитов — это две-три крупные темы, а не сотня мелких. Найдите нити. Работа — и риск — живут в том, как они сплетаются, а не в количестве.
- Положите источник истины туда, где говорит контракт, с первого раза. Мы удалили 680 строк, перенося калибровку с клиента на бэкенд. Локальный срез угла — это переделка, запланированная заранее; архитектура уже дала вам ответ.
- Интеграция вскрывает отказы, недоступные изоляции. Шторм 429 жил на шве между двумя корректными функциями и появился лишь тогда, когда они заработали вместе. Заложите бюджет на интеграционный проход, а не только на тестирование каждой функции по отдельности.
Это родственник эпохи v1 истории, которую мы рассказали бы снова в куда большем масштабе, — см. что на самом деле требует вторая версия: 206 коммитов честных состояний (v2.0.0), где та же истина «большое число — это на самом деле пара больших идей» разыгрывается во всём переписывании v2. За предыдущей главой истории v1 см. как транслировать отчёт в реальном времени без мерцания (v1.6.13); а за всей дугой — анатомию доведения ПО до совершенства.