Передача

Как передать кодовую базу новой команде разработки?

Механика — в том порядке, при котором никто не остаётся запертым снаружи. Бо́льшая часть этого администрирование; та часть, которая не администрирование, — неделя показа.

Короткий ответ

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

#Репозиторий

Самая простая часть — и та, которую чаще всего делают так, что тихо теряется что-то важное.

  1. Передавайте организацию, а не репозиторий

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

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

  2. Требуйте полную историю

    Не zip и не схлопнутый первый коммит. Если первый коммит в полученной истории — «initial import», спросите, куда делись предшествующие годы.

  3. Проверьте, нет ли других репозиториев

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

  4. Дайте права владельца двум своим людям

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

  5. Просмотрите историю на секреты

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

#Среды и секреты

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

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

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

Переменная окружения, описанная с пользой Вымышленный пример — не клиент
PAYMENT_PROVIDER_KEY
  Что       Аутентифицирует нас у платёжного провайдера
  Владелец  Аккаунт компании у провайдера (finance@)
  Смена     Панель провайдера → API keys → roll
  Ломает    Все платежи картой, немедленно
  Значение  Не в этом документе. Смотри хранилище компании.

Пять строк, ни одного секрета. Именно это делает переменную передаваемой: новая команда может её поменять и знает, что при этом сломается.

#Неделя показа

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

Отведите неделю, в которую принимающая команда сама делает четыре вещи, а уходящая доступна, но не ведёт за руку:

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

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

Почему важно «сама»

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

#Что находится вне репозитория

Спросите об этом явно. Именно эта категория выдаёт сюрпризы на третий месяц.

  • Задачи по расписанию на сервере. Crontab, в который никто не заглядывал с момента написания.
  • Облачные ресурсы, созданные руками. Функция, правило на бакете, очередь, триггер по расписанию — созданные в консоли и не упомянутые в коде нигде.
  • Скрипты на чьей-то машине. Месячный отчёт, правка данных, помощник для выкатки.
  • Настройки в панели провайдера. Адреса вебхуков, шаблоны писем, платёжные правила, фича-флаги.
  • Ручные процессы. Человек, который каждый понедельник что-то выгружает и отправляет партнёру письмом.

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

#Смена доступов, в правильном порядке

Делайте это в такой последовательности и ни в какой другой:

  1. Установите владение каждым аккаунтом — на чью личность он оформлен?
  2. Перенесите всё, что оформлено на человека или подрядчика. Часть этого занимает дни.
  3. Создайте и проверьте собственные админские пути входа, с восстановлением на ящики компании.
  4. И только потом меняйте каждый доступ, который уходящая команда могла видеть, и убирайте их личный доступ.

Отказ, который это предотвращает

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

#Что идёт не так

Принять zip-архив с исходниками.

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

Описывать переменные окружения через значения.

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

Заменить неделю показа презентацией.

Вместо этого Презентация передаёт ощущение, что тебе рассказали. Способность сделать передаёт только само делание.

Считать, что репозиторий и есть система.

Вместо этого Спросите явно, что работает вне его, и сами загляните в консоль облака и в crontab.

Один владелец у новой организации.

Вместо этого Минимум два, и ни один из них не подрядчик.

#Чего это не покрывает

Чего это не делает

  • Интеллектуальную собственность и лицензирование. Если какой-то компонент вам лицензирован подрядчиком, а не принадлежит, это вопрос договора, и он не переезжает вместе с репозиторием.
  • Обязанности по защите данных, когда обработку принимает новая сторона. Спросите того, кто в этом разбирается.
  • Введение новой команды в предметную область — что продукт делает и для кого.
  • Хорош ли код. Передача устанавливает, что систему можно эксплуатировать.

Узнайте, чем вы на самом деле владеете.

Без доступа к репозиторию. Без загрузки исходного кода. Без банковской карты.

Построить карту проекта — бесплатно