Нет у меня никакого первого имени
Открываю исходники очередного enterprise-проекта: о да-а-а, вот они, старые знакомые, лучшие друзья разработчика — first name и last name.
Уот зэ хек?
Регулярно такое встречаю. Забыл ещё про middle name, sorry. В эти три поля разработчики ничтоже сумняшеся складывают имя, фамилию и отчество. Сразу уточню: речь идёт не о legacy 20-летней давности, не о проектах с заказчиками из США, а о новых продуктах, создаваемых российскими разработчиками для российской же зачастую аудитории.
Но ведь first name, last name — это термины из другой культуры, и я не припомню номер стандарта ISO, где они были признаны в качестве международных.
Однажды я не выдержал и поделился своими сомнениями с коллегами в рабочем чате, но, наверное, не смог донести идею до коллег. Вместо конструктивной критики всё большей частью свелось к шуточкам.
Что ж, попробую ещё раз сформулировать свою мысль и представить её широкой аудитории. Начнём!
Скоуп
В этой статье вполне серьёзно (хотя и в шутливой манере) я предлагаю обсудить правильность именования машинно-читаемых идентификаторов, таких как названия столбцов в БД или полей данных в API. Это то, с чем дело имеют, как правило, одни только разработчики.
Я не буду рассматривать термины для пользовательского интерфейса хотя бы потому, что там названия элементов управления зачастую переведены на родной язык пользователя и проблема не так остра.
Я буду оставаться в рамках технического английского, этого lingua franca в мире информационных технологий. Хотя у меня нет идиосинкразии к использованию, например, русского в каких-нибудь DSL. Но в таких вещах, как API, особенно предполагающих международную аудиторию, лучше по понятным причинам использовать английский.
Зэ праблем
Мне не нравится бездумное использование терминов, в частности first name и last name, для хранения компонентов персонального имени. First name не является корректным универсальным термином для имени человека, персоны, так же как last name — для фамилии.
Например, в русской традиции фамилия, имя и отчество не имеют фиксированной позиции: Илья Ильич Обломов и Обломов Илья Ильич — оба варианта правильные и используются в определённых случаях. Хранить имя и фамилию в полях first_name
и last_name
так же неправильно, как название области — в поле state
.
Да, все привыкли, включая пользователей. Но это не повод тиражировать ошибку и дальше.
Бай зэ вэй
Разработчики не всегда задумываются, а точно ли им нужно хранить компоненты имени? Какова цель? Будут ли эти компоненты использоваться по отдельности?
Если в вашем проекте не предполагается заполнение официальных документов или почтовых адресов, не проще ли хранить имя пользователя в виде одной opaque-строки? Вместо отдельных полей для имени и фамилии не лучше ли предусмотреть поля для краткого и полного вариантов имени, а также для обращения, должности или титула (при необходимости)?
Kakie vashi dokazatel«stva?
Как же правильно назвать эти поля по-английски? Конечно, идеальным было бы иметь официально рекомендованную терминологию, разработанную государственными органами или авторитетными игроками рынка ИТ. Возможно она даже есть. Если кто-нибудь поделится ссылкой, буду благодарен.
Но пока (в отсутствие таких рекомендаций) можно заглянуть в собственный заграничный паспорт:
Заграничный паспорт гражданина Российской федерации
Как видим, никаких first или last. Фамилия — это surname, а имя — given names (отчество также относят к имени или же предполагается возможность наличия нескольких имён).
Аналогичные термины используются, например, в британском или индийском удостоверениях личности. Я наугад потыкал в паспорта ещё нескольких стран и везде нашёл только surname и given name. Кроме КНР, там вообще одно только поле name.
Можно обратиться к англоязычной Википедии. В статье Personal name найдутся следующие термины:
given name, forename, Christian name для имени;
family name, surname для фамилии;
patronymic, matronymic для отчества и аналогичного производного от имени матери.
К слову, тема человеческого имени очень широка. Например, в этой весёлой статье собраны десятки неожиданных и порой забавных фактов о человеческих именах (спойлер: бывают даже люди без имени). О сложностях с именами не понаслышке знают разработчики программ по работе с генеалогическими данными. Но всё же давайте в этой статье оставаться в рамках типичного современного enterprise-проекта.
Ху, а ю ту лекчэ ми?
Может быть я борюсь с ветряными мельницами, а весь остальной мир уже смирился с этой терминологией и принял её в качестве универсальной?
Но вот я смотрю в стандарт OpenID, который повсеместно используется в настоящее время, и вижу там следующие рекомендованные имена для claims:
given_name
family_name
middle_name
nickname
На мой взгляд, отлично, за исключением middle_name
, которое выглядит чужеродным. Ощущение, что его добавили в стандарт впопыхах.
Или вот Google. Не ISO, конечно, но некоторые тренды в ИТ-индустрии они задают. В их Identity Platform я вообще не вижу компонентов имени, зато есть displayName
и screenName
. Не самые очевидные термины, на мой взгляд, но принцип понятен: не хранить компоненты по отдельности там, где в этом нет нужды.
На очереди Meta Graph API. Ой, нет, этих не будем, там типовая тройка.
Лучше возьмём Apple, известных своим вниманием к деталям, и их первое попавшееся мне на глаза API. Что мы видим в документации? Сперва идёт введение, в одном абзаце раскрывающее всю сложность человеческих имён (респект!), а затем — поля с именами givenName
, middleName
и familyName
(плюс поля для обращений и титулов). Мне нравится, хотя глаз опять задёргался на middleName
.
Неожиданных союзников я нашёл в лице W3C, у которых так прямо и написано: «try to avoid using the labels «first name» and «last name» in non-localized forms». Правда, это говорится о пользовательском интерфейсе, а не о внутренних идентификаторах программных систем. Но всё равно приятно узнать, что не я один такой перфекционист.
Наверное, достаточно примеров. Уже то, что найдено, говорит о том, что не всё так однозначно с этими терминами, далеко не все блуждают в трёх соснах first, middle и last.
И, повторюсь, универсальным образом разбить имя человека на компоненты — нетривиальная задача. Есть даже организации, пытающиеся выработать соответствующие стандарты с неясной пока перспективой. Поэтому в каждом конкретном случае желательно трезво оценить аудиторию проекта.
Уот эбаут ю?
А какая терминология используется в ваших проектах? Чем она обоснована? Размышляете ли вы над тем, как правильнее назвать таблицу, или считаете это неважным? Обсуждаете ли нейминг в онлайн-конференциях, или на это как обычно не остаётся времени?
Си ю ин каментс!