Код один, доступ разный
Открытый инструментарий и закрытая платформа, работающая с личными данными, живут по разной логике, и я долго считал, что из этого следует одно: код роли, которая касается персональных данных, придётся писать дважды. Один раз для открытого комплекта, где любой может форкнуть и посмотреть исходники. Второй раз для платформы, где эта же роль подключена к базе с настоящими людьми. Оказалось, я ошибался, и разбираться пришлось на конкретном коде, а не на общих рассуждениях.
Повод разобраться дал у нас конвейер ролей, который собирает персональное руководство участнику: там есть роль, которая приоритизирует, чему учиться дальше, и она уже реализована в открытом комплекте на GitHub. Встал вопрос о второй роли, которая ставит диагноз ступени мастерства, и вот здесь дрейф уже случился на практике: коды этой роли в каталоге принципов платформы оказались рассинхронизированы с тем, что реально живёт в открытом репозитории, потому что кто-то правил одну копию и забыл про другую. Живой симптом болезни статус-кво, а не гипотетический риск.
Принцип, который мы в итоге приняли, звучит просто: один канонический код роли живёт в открытом комплекте, а платформа импортирует его напрямую, не держит параллельную копию. Разница между открытым и закрытым режимом переносится не в код самой роли, а в отдельный слой, который отвечает только за доступ к данным. Роль, которая приоритизирует развитие, не знает и не должна знать, откуда пришли данные, с которыми она работает, из открытого демо-набора или из настоящей базы участника. Это тот же принцип, на котором стоит любая зрелая архитектура доступа: бизнес-логика не смешивается с логикой авторизации, потому что смешение этих двух вещей и есть частый источник дыр в безопасности.
Перед тем как принять такое решение, мы прогнали его через сравнительную оценку по семи характеристикам архитектурного качества, а не поверили ему на слово. Эволюционируемость оценилась хорошо, потому что мы уже видели это на первой роли: единый код устраняет как раз тот класс дрейфа, который перед этим сам нашёлся в каталоге принципов. Масштабируемость тоже хорошо. А вот безопасность получила осторожную оценку, и я хочу сказать честно, в чём тут подвох: сам по себе принцип «один код, разные адаптеры» ничего не гарантирует. Безопасность зависит от того, как именно спроектирован конкретный адаптер данных для конкретной роли, а для второй роли, которая ставит диагноз, такой адаптер ещё только предстоит спроектировать.
Поэтому решение вышло не безусловным, а с условием: прежде чем переносить роль, которая касается личных данных, в открытый комплект, отдельная проверка безопасности должна явно подтвердить, что классификация данных в её адаптере сделана правильно. Роль, которая ничего личного не хранит, переносится сразу, без дополнительных условий. Роль, которая хранит, ждёт этой проверки. Мы сознательно не выдаём принцип за уже реализованный факт: перенос кода в открытый доступ ещё не начат, решение только принято, и пересмотреть сам принцип мы договорились сразу после первой реальной реализации, а не оставлять его декларацией навсегда.
Вопрос не в том, можно ли открыть код роли, которая работает с людьми. Вопрос в том, где именно проходит граница между кодом, который можно смотреть всем, и данными, до которых нельзя дотянуться никому, кроме их владельца.