Pull to refresh

Поздравить пользователя 00 февраля с минус семитысячелетием или Заблуждения о паспортах в базе

Reading time 6 min
Views 6.1K

TLDR:

Всё плохо.

Преамбула:

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

Все примеры, указанные в статье, вымышлены; некоторые примеры приведены на основе выдачи поисковых запросов.

Кат с философским описанием.

В жизни некоторых программистов наступает момент, когда им ставится задача «Написать модуль работы с персональными данными пользователей». Причём, по традиции, желательно «ещё вчера». Задача на вид несложная, за пару часов до дедлайна программист нажимает кнопку «Деплой» и уходит на законные выходные. Утром в субботу телефон пиликает сообщением о новом письме: техподдержка открывает тикет «Настырный пользователь не может пройти регистрацию». Грустно вздохнув и отложив в сторону билеты на хоккей, программист проверяет полученные данные и садится за ноутбук. Так в проекте появляется первый костыль…

Описанное выше, конечно же, происходит в параллельной вселенной, было 20 лет назад и вообще, сейчас полный Agile. Но вдруг какой‑то из примеров будет вам полезен.

Заметили, что и в 2263 году всё ещё используются физические документы для идентификации?
Заметили, что и в 2263 году всё ещё используются физические документы для идентификации?
  1. Документ удостоверяющий личность только паспорт.

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

    Если ваш софт планирует пересечь наземные границы и будет использоваться в других странах, дополнительно запланируйте широкий ассортимент поддерживаемых документов: ID‑карта (Узбекистан, Казахстан, Армения), водительское удостоверение (Узбекистан), удостоверение беженца (Казахстан), свидетельство на возвращение (Казахстан, Армения).

    Если в вашем софте ожидается регистрация иностранцев, сюда же добавляются загранпаспорта по стандарту ICAO. Причём, если чётко следовать букве законодательства, загранпаспорта являются документами удостоверяющими личность гражданина, находящегося за пределами родины.

    Возможный выход — определить наиболее востребованные кейсы и волевым решением ограничить круг потенциальных клиентов и их документов.

  2. Серия и номер паспорта в базе всегда уникальны.

    Первый попавшийся пример: если судить по картинкам в интернете, паспорт с серией‑номером вида «8 цифр» может быть и у гражданина Израиля, и у гражданина Чехии. Соответственно, можно ожидать коллизий в случае использования системы гражданами обеих стран.

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

  3. У документов всегда последовательный номер, если есть паспорт c номером AB1234567, где-то есть паспорт с номером AB1234568.

    Паспорта могут аннулироваться в связи с ошибкой при выдаче.

    «Красивый» номер вида «шесть семёрок» может быть сгенерирован разово по просьбе, высказанной с должным уважением и его «соседи» появятся лет через 5.

  4. Серия и номер документа всегда соответствует требованиям (шаблону).

    Паспортизация — важный элемент любого государства, поэтому с практически 100% вероятностью так и будет. «Но есть нюанс» ©: «шаблон» для серии и номера документа различен. Серия и номер паспорта Российской Федерации состоит из 10 цифр, паспорта Камеруна — из 7. В Беларуси первыми идут две латинские буквы (обозначение региона), в Узбекистане серия состоит из латинских букв, которые последовательно увеличиваются при достижении всех девяток в номере: AA, AB, AC. Сюда же добавим поддержку иных видов документов (удостоверение моряка, водительское удостоверение).

  5. Серия и номер паспорта всегда написаны правильно.

    При интеграции систем или обогащении данных могут возникнуть ошибки, когда введённые вручную «...адцать лет назад» данные некорректны. И если с ошибками вида «буквы на кириллице вместо латиницы», «лишние пробелы» ETL системы справляются достаточно хорошо, то недостающие или лишние цифры‑буквы становятся большой проблемой. Решение остаётся на получателе данных: принимать некорректные данные в надежде когда‑нибудь их исправить или игнорировать, уменьшая реальное количество записей.

    Знакомые рассказывали, что в одном кейсе интеграции систем «мусорными« были 60% данных.

  6. Дата выдачи паспорта всегда в прошлом.

    Если не рассматривать человеческий фактор и вариант «наша система работает в виртуальной машине, на которой сбилась дата», можно предположить теоретическую ситуацию «Человек получает загранпаспорт на Чукотке и сразу пересекает Берингов пролив на Аляску с паспортом, выданным Завтра».

  7. У паспорта всегда есть срок действия.

    Нет, старшее поколение обычно не нуждается в замене паспорта.

  8. Дата рождения всегда валидна.

    В зависимости от законодательства страны могут быть ситуации, разрешающие некорректную дату в паспорте. Например, если известен только год рождения, а архивные документы утрачены (актуально для старшего поколения), день и месяц могут заменяться нулями.

    Стандарт ИКАО позволяет заменять «иксами» недостающие части дат. Автор лично встречал в строке «Дата рождения» значения «00.00.1940» и «ХХ.ХХ.1965». Сумеет ли ваша программа грамотно их распарсить и записать в базу? Большой вопрос.

Приятно познакомиться, Лилу из будущего
Приятно познакомиться, Лилу из будущего
  1. Дата рождения всегда в прошлом.

    Частный случай пункта 8 — если неизвестен даже год рождения, могут быть выставлены любые значения, стандартные для данного софта. В одной крупной программе встречал значение по умолчанию для года рождения 9999. При этом в самой программе предусмотрена обработка подобных событий. Но если данные начинают передаваться в другую систему, может возникнуть интересный казус.

  2. Пол пользователя не может измениться в процессе использования данных.

    Может.

    10.1. ОК, пол не может измениться в странах, где такое запрещено законодательством.

    Крайне редкие медицинские случаи: родился ребёнок с признаками обоих полов. При первой персонализации родители записали ребёнка девочкой (например). Ближе к половому созреванию визуально стали больше проявляться признаки мужского пола. В таких случаях пол будет изменён.

    10.2. Пол всегда определён.

    Если рождается ребёнок с признаками обоих полов и погибает до первой персонализации, в медицинском софте его пол может быть указан как «неизвестный».

  3. В официальном документе, удостоверяющем личность, всегда актуальная информация.

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

  4. Документ, удостоверяющий личность, всегда является актуальным.

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

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

    Логичный выход: проверять в центральных базах статус документа.

  5. В момент использования софта пользователь жив.

    Кто-то может воспользоваться чужой учётной записью и после смерти владельца учётки.

    Кто-то из родственников/друзей может попытаться вывести деньги с пластиковой карты усопшего через системы интернет-банкинга.

    Кто-то должен получить результаты выполнения «долгоиграющих» заявок пользователя и после его смерти.

    В центральных базах может быть ошибочно отмечено, что пользователь покинул наш бренный мир, соответственно пользователь не может получить банковские или иные услуги. Можно даже провести конкурс на самое лучшее сообщение пользователю о том, что он не может получить желаемый доступ по причине того, что мы считаем его мёртвым. Мой фаворит: «Zombies are not allowed in our system».

  6. У пользователя всегда есть валидное гражданство.

    Лица без гражданства передают большой и пламенный привет.

  7. У пользователя всегда есть валидное гражданство или отметка ЛБГ.

    После распада СССР был достаточно большой промежуток времени, в течение которого жители могли поменять свой паспорт на паспорт нового государства. То есть в тот момент это были граждане несуществующей страны.

    И даже после истечения сроков замены представители старшего поколения (особенно в отдалённых деревеньках) не спешили принять гражданство той или иной страны.
    Другой пример из современности: Республика Косово отсутствует в списке государств ISO-3166, но на практике коды KS и RKS используются.

    Дополнительно см. список частично признанных государств.

  8. Всегда есть валидное место рождения.

    В дополнение к предыдущему пункту: место рождения может быть не валидным в текущий момент: населённый пункт переименован, упразднён.

Исключительно чтобы не плодить лонгриды, на этом предлагаю остановиться.

Продолжения статьи:

Tags:
Hubs:
+27
Comments 48
Comments Comments 48

Articles