Никогда не используйте слово «user» в своем коде

Перевод статьи Итамара Тернер-Трауринга «Never use the word “User” in your code».

Не используйте слово user в коде

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

Сегодня я хотел бы рассказать об одной распространенной ошибке, простом слове, которое может привести к бесконечным проблемам. Я говорю, конечно, о слове «user».

С этим словом связаны две основные проблемы:

  • оно практически никогда не является хорошим описанием требований;
  • его использование вредит безопасности.

Смысл слова «user» опасен своей неопределенностью и практически всегда лучшим решением будет использовать более аккуратную терминологию.

У вас нет никаких юзеров

Начнем с того, что никакая система ПО не имеет «юзеров». На первый взгляд, «user» это прекрасное определение, но если приглядеться, вы поймете, что у вас куда более сложная бизнес-логика.

Рассмотрим три примера.

В системе бронирования авиабилетов нет «юзеров»

Система бронирования авиабилетов

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

  • Путешественники могут видеть регистрацию своего заказа на сайте, если у них есть PNR локатор.
  • Покупатели могут изменять заказ на сайте, если у них есть минимум 4 последние цифры номера кредитной карты.
  • Агенты бюро путешествий могут видеть и видоизменять заказы, сделанные через их бюро.
  • Сотрудники аэропорта из отдела регистрации могут видеть и изменять заказы, касающиеся их аэропорта, в соответствии со своей должностью и получая идентификационные данные от путешественника.

И так далее. В общем, людей называют «путешественниками», «агентами» (причем сам сайт также может быть агентом), «покупателями». Такое название как «user» просто бесполезно, поэтому мы его не использовали. Вместо этого делали учетные записи как Путешественника, так и Агента.

«Юзеры» в Unix

Рассмотрим разные случаи. В Unix (сегодня известном как POSIX) есть юзеры: они могут логиниться и запускать код. Звучит хорошо, верно? Но рассмотрим это более детально.

Словом «user» называется:

  • Человек, который логинится через терминал или графический интерфейс.
  • Системные сервисы (почтовые или веб-серверы), которые также запускают «users». Например, nginx может запускать «юзера» httpd.
  • На серверах часто есть административные аккаунты, разделяемые многими людьми, которые подсоединяются по SSH с использованием этого «юзера».
  • root, который совершенно не то же самое, что все вышеперечисленное.

Это четыре совершенно разных понятия, но в POSIX все они – «users». Как мы увидим позже, объединяя все эти понятия одним словом «user», мы можем получить много проблем с безопасностью.

Но на прикладном уровне в рамках user-модели POSIX мы даже не можем сказать «только Элис и Боб могут логиниться и делить админский аккаунт».

У SaaS-провайдеров нет «юзеров»

Джереми Грин написал твит о модели пользователя в Software-as-a-Service, и именно это подвигло меня написать этот пост. Его основная мысль в том, что в SaaS-сервисах всегда есть:

  1. Человек или организация, которая платит за предоставление сервиса.
  2. Один или больше людей из этой организации, которые, собственно, используют этот сервис совместно.

Назвав и тех, и других словом «user» с самого начала, позже вы попадете в царство боли. Вы не сможете моделировать команды, не сможете моделировать систему оплаты за нескольких человек сразу. Вам придется все переделывать.

Но это лишь отдельный случай более широкой проблемы: понятие «user» слишком расплывчатое. Если вы с самого начала присмотритесь к этому слову повнимательней, вы скорее всего обнаружите, что у вас есть как минимум два понятия. Это команда (Team) – юнит, связанный с оплатой и правом собственности, и члены команды (Members), которые непосредственно пользуются сервисом.

«User» как проблема безопасности

«User» как проблема безопасности

Слово «user» это проблема не только для бизнес-логики. Его использование может также привести к печальным последствиям в плане безопасности. Оно настолько расплывчатое, что объединяет два принципиально разных понятия:

  • Человек как существо.
  • Его представление внутри программы.

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

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

Это известно как «проблема спутанных представителей» (Confused Deputy Problem). И данная проблема с большой вероятностью станет частью вашего дизайна, если вы будете использовать слово «user» для описания двух фундаментально различных понятий одновременно.

Ценность продумывания дизайна наперед

Ключ к продуктивности в программировании – выполнение работы с меньшими усилиями. Использование терминов вроде «user» при моделировании ваших программ приведет к затратам огромного количества времени и усилий на исправление ситуации.

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


[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх