Протокол

Как понять, что два анализа описывают один и тот же компонент?

По-настоящему трудная часть, описанная честно — вместе с той версией, которая сделала это неправильно.

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

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

#Что такое снимок

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

Важное различие: снимок — это не пакет. Пакет — то, что произвёл анализ; снимок — то, что проект знает после того, как этот пакет сведён со всем, что проекту уже было известно. Вся работа именно в сведении.

#Проблема идентичности

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

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

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

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

Чего это стоит

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

#Версия, которая сделала это неправильно

Об этом стоит сказать прямо, потому что обычно продуктовая страница такое опускает.

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

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

#Что можно назвать удалённым, решает охват

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

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

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

#Что такое смысловое различие

Это не диф исходников. Единица здесь — компонент, интерфейс, связь или утверждение, а не строка. Сравнение двух снимков порождает четыре вида фраз:

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

#Больше не подтверждается

Исход, которого нет ни в одном документе, и тот самый, который оправдывает хранение картины вместо её переписывания.

У написанной страницы про архитектуру два состояния: актуальная и тихо неверная. Между ними она переходит без всякого события, и никто об этом не узнаёт, пока кто-нибудь по ней не поступит.

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

Это и есть весь аргумент в пользу хранимой картины против произведённой, и это же ответ на вопрос «почему это подписка»: разовый анализ может произвести всё остальное, что делает 1ADK. Отозвать собственные прежние утверждения может только хранимый.

#Чего это не умеет

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

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

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

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

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