Нет у меня никакого первого имени

c2cd78992482c0b602e7605240b4d8e8.jpg

Открываю исходники очередного 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.

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

Уот эбаут ю?

А какая терминология используется в ваших проектах? Чем она обоснована? Размышляете ли вы над тем, как правильнее назвать таблицу, или считаете это неважным? Обсуждаете ли нейминг в онлайн-конференциях, или на это как обычно не остаётся времени?

Си ю ин каментс!

© Habrahabr.ru