§3.05 Дрейф: расхождение пака и производных
Время: 45 мин чтение + 30 мин
В одном предложении: Человек думает, что если Pack написан правильно, он остаётся верным, а на самом деле Pack описывает идеал, а реальность отклоняется от идеала каждый день, и вопрос не в том, как предотвратить дрейф, а в том, как быстро его обнаружить, пока расхождение не стало пропастью.
Мем, который снимается. «Я написал Pack полгода назад. Он отражает мои лучшие практики. Если я отклоняюсь от Pack, значит, я делаю что-то не так. Нужно вернуться к Pack.» На самом деле отклонение от Pack не всегда означает ошибку. Иногда контекст меняется, и Pack устаревает. Иногда вы находите лучший способ, но не обновили Pack. Дрейф — это не моральная проблема. Это физическая реальность: два объекта, движущиеся с разной скоростью, неизбежно удаляются друг от друга. Pack и практика выступают двумя такими объектами. Pack движется медленно, обновляется осознанно. Практика движется быстро, адаптируется к задачам. Дрейф неизбежен. Вопрос в скорости обнаружения.
Понятия. Дрейф Pack представляет собой расхождение между тем, что написано в Pack, и тем, что происходит в практике. Типы дрейфа: методологический, когда практика изменилась, а Pack не обновлён; онтологический, когда понятия в Pack устарели, но продолжают использоваться; структурный, когда DS перестал соответствовать Pack по форме; референтный, когда ссылки в Pack ведут на устаревшие источники. Drift-detection обозначает процесс обнаружения дрейфа: скрипты проверяют ссылки, консистентность, актуальность форм; ручная проверка сверяет Pack с текущей практикой. SoT выступает принципом разрешения: при обнаружении дрейфа пилот решает, что обновлять, Pack, практику или оба. Если практика лучше, Pack обновляется. Если Pack верен, практика корректируется. Решение должно быть осознанным, не автоматическим.
Объяснение. Дрейф Pack имеет две опасные формы: когда Pack отстаёт от практики, и когда практика отстаёт от Pack. Первая форма: вы нашли лучший способ, но Pack хранит старый. Результатом становятся новые члены команды, которые учатся устаревшему методу, а вы сами постепенно забываете новый, потому что не зафиксировали. Вторая форма: Pack обновился, но практика осталась прежней. Результатом становится ситуация, когда вы «нарушаете собственные правила», не понимая почему. Оба случая требуют drift-detection. Автоматический drift-detection проверяет то, что можно проверить машинно: битые ссылки, устаревшие формы, несоответствие структуры. Ручной drift-detection проверяет то, что машина не видит: соответствует ли метод текущей задаче, актуальны ли примеры, верны ли предположения. Минимальный ритм: еженедельный автоматический и ежемесячный ручной drift-detection. Без него дрейф накапливается экспоненциально: сначала одно расхождение, потом десять, потом Pack и практика живут разными жизнями, и вы перестаёте понимать, какая из них «правильная».
На практике. Практика «Два расхождения» (30 мин):
- Выберите один метод из Pack, который вы используете регулярно. Спросите: применяю ли я его точно как написано? Если нет, в чём различие? Запишите. (10 мин)
- Выберите один рабочий продукт из DS. Сверьте с Pack: соответствует ли структура шаблону? Содержит ли все обязательные элементы? Если нет, в чём расхождение? Запишите. (10 мин)
- Примите решение: какое расхождение требует обновления Pack, а какое корректировки практики? Зафиксируйте решение и план действий. (10 мин)
Типичный кейс. Дизайнер тридцати пяти лет поддерживал Pack с принципами дизайна. Один из принципов гласил: «Все интерфейсы должны быть доступны с клавиатуры». Через год дизайнер начал проект для мобильных устройств, где клавиатура не главный инструмент ввода. Он проигнорировал принцип, но не обновил Pack. Через полгода новый дизайнер прочитал Pack и стал проектировать клавиатурную навигацию для мобильного приложения. Результатом стали неудобный интерфейс, переделки и недовольные пользователи. Дрейф был обнаружен слишком поздно. Если бы дизайнер обновил Pack: «Принцип применим к десктопным интерфейсам; для мобильных действует другой критерий доступности», конфликта бы не возникло.
Типичная ошибка. «Я помню, что изменилось, мне не нужно обновлять Pack.» Помните сейчас. Через месяц забудете. Через год будете уверены, что Pack актуален, потому что «вы бы помнили, если бы что-то изменилось». Другая ошибка: «Если практика расходится с Pack, значит Pack прав, и я должен вернуться к нему.» Не всегда. Pack не есть догма. Если практика показала лучший способ, обновите Pack. Иначе вы превращаете Pack в музей, а себя в его охранника.
Степени мастерства:
- Объяснение. Могу назвать четыре типа дрейфа Pack. Критерий перехода: нашёл одно расхождение в своей практике.
- Умение. Раз в месяц провожу drift-detection: нахожу расхождение и принимаю решение, обновить Pack или практику. Критерий перехода: три месяца подряд без пропусков.
- Навык. Системно использую автоматические скрипты drift-detection и корректирую Pack до того, как расхождение станет проблемой. Критерий перехода: коллега заметила, что мой Pack «всегда актуален».
- Мастерство. Проектирую Pack с учётом неизбежного дрейфа: резервные формулировки, явные контексты, механизмы обновления. Критерий перехода: другой человек обновил ваш Pack на основе своей практики без вашего участия.
Проверка себя.
- Могу назвать четыре типа дрейфа и привести пример каждого из своей практики
- Запускал drift-detection за последний месяц, ручной или автоматический
- Нашёл и разрешил хотя бы одно расхождение между Pack и практикой за последние три месяца
- Могу объяснить, почему конкретное расхождение требует обновления Pack, а не практики
- Мой Pack содержит дату последнего обновления, и она не старше трёх месяцев
На практике. Откройте Pack. Найдите один метод, который вы использовали сегодня. Спросите: «Делаю ли я точно так, как написано?» Если нет, перед вами дрейф. Решите: обновить Pack или вернуться к написанному. Любое решение лучше, чем игнорирование.
См. also: Дрейф Машины (PD.GUIDE.3.S2.SS6), Дрейф-контроль (PD.GUIDE.3.S2.SS7).
Что дальше. Следующий подраздел посвящён семействам документов: как группировать родственные артефакты и предотвращать размножение форматов.