{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом замкнутость интерфейса",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.me\/blogs\/tags\/zamknutost-interfeysa\/",
    "feed_url": "https:\/\/blogengine.me\/blogs\/tags\/zamknutost-interfeysa\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "136221",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/all\/ui-study-sponsorship\/",
            "title": "Интерфейсный этюд: распутываем спонсорство на сайте",
            "content_html": "<p>Разберём такую задачку.<\/p>\n<p>На некоем сайте рекламодатели могут купить размещение своего логотипа в профилях пользователей. Например, условная фирма «Спотифай» хочет как бы стать «спонсором» всех пользователей, которые любят музыку. Если пользователь бесплатный, то назначение такого спонсора — предмет договорённостей сайта и самих спонсоров. А вот платный пользователь может сам выбрать себе спонсора (вдруг ему кто-то напрямую заплатил за размещение своего логотипа) или запретить отображение спонсора вовсе.<\/p>\n<p>Нужно сделать интерфейс управления спонсорством в личном кабинете пользователя, заодно показав преимущества платной подписки.<\/p>\n<p>Исходный интерфейс работает так. Пока ты бесплатный, ты видишь «навязанного» спонсора и кнопку апгрейда рядом:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/sponsorship-1a@2x.png\" width=\"820\" height=\"400\" alt=\"\" \/>\n<\/div>\n<p>Если проапгрейдился, то интерфейс становится более развесистым. Можно назначить своего спонсора или удалить спонсора:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/sponsorship-1b@2x.png\" width=\"820\" height=\"420\" alt=\"\" \/>\n<\/div>\n<p>Типа назначили своего:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/sponsorship-1c@2x.png\" width=\"820\" height=\"420\" alt=\"\" \/>\n<\/div>\n<p>Чтобы убрать спонсора вообще, жмём Remove sponsor сверху. А круглая стрелочка — это вернуть как было, то есть поставить назначенного «сверху» спонсора, хоть ты и платник.<\/p>\n<p>Что здесь не так?<\/p>\n<p>Во-первых, интерфейс выглядит запутанно и неэлегантно. Зачем кнопка Remove sponsor, если я могу просто не заполнять спонсора? Или это чем-то отличается? Крутилка тоже непонятная без объяснения. Да и даже если всё понять, всё равно выходит каша из состояний, полный перечень которых неочевиден. Эти все состояния ведь надо ещё запрограммировать. Если я удалю спонсора, то видимо должна будет появиться какая-то кнопка «указать своего спонсора»? Или ремув просто очистит поля?<\/p>\n<p>Во-вторых, в интерфейсе очень легко случайно потерять данные. Нажал на крутилку или Remove из любопытства — и твой спонсор, которого ты внимательно заполнял, слетает. Никакого анду нет, а если бы было, то было бы ещё неэлегантнее: ещё больше каких-то полунамёков для переходов между вариантами.<\/p>\n<p>В-третьих, кажется, интерфейс не очень хорошо продаёт платную подписку. В исходном состоянии она ярко выделена, но внимание направлено просто на само приглашение к апгрейду, а не на пользе от него. Чтобы врубиться в пользу, нужно прочитать текст. При беглом взгляде вообще не ясно, какая связь между спотифаем и апгрейдом.<\/p>\n<p>А вот как можно было бы сделать. Впрямую обозначить доступные варианты спонсорства:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/sponsorship-2a@2x.png\" width=\"820\" height=\"510\" alt=\"\" \/>\n<\/div>\n<p>Теперь для всех пользователей и состояний конструкция одна и та же: переключатель из трёх вариантов. Вместо того, чтобы догадываться, что апгрейд тебе откроет новые возможности, ты их сразу видишь под замочком. Можно даже нажать, не жалко:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/sponsorship-2b@2x.png\" width=\"820\" height=\"340\" alt=\"\" \/>\n<\/div>\n<p>Ну а если проапгрейдился — все те же варианты доступны в тех же местах:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/sponsorship-2c@2x.png\" width=\"820\" height=\"510\" alt=\"\" \/>\n<\/div>\n<p>Можешь заполнить своего спонсора, переключиться в дефолтного или отключить, потом снова вернуться в своего — поля останутся заполненными безо всякого анду.<\/p>\n<p>Приходите на мой курс <a href=\"http:\/\/bureau.ru\/courses\/ui-online\/\" class=\"nu\">«<u>Пользовательский интерфейс и представление информации<\/u>»<\/a>, что ли.<\/p>\n",
            "date_published": "2025-06-08T13:43:59+05:00",
            "date_modified": "2025-06-09T01:53:04+05:00",
            "tags": [
                "замкнутость интерфейса",
                "пользовательский интерфейс",
                "сохранение данных",
                "студентам"
            ],
            "author": {
                "name": "Илья Бирман",
                "url": "https:\/\/ilyabirman.ru\/meanwhile\/",
                "avatar": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764"
            },
            "_date_published_rfc2822": "Sun, 08 Jun 2025 13:43:59 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "136221",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "124944",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/all\/classical-pizza-problem\/",
            "title": "Классическая проблема настройки пиццы",
            "content_html": "<p>В Школе бюро есть задание — нужно сделать интерфейс для заказа пиццы с определёнными условиями. В частности, пользователь может настраивать начинку. Половина студентов допускают одну и ту же логическую ошибку — делают настройку прямо в меню.<\/p>\n<p>Вот первая попавшаяся работа. Это главная страница, меню пицц:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/classical-pizza-problem.jpg\" width=\"948\" height=\"678\" alt=\"\" \/>\n<\/div>\n<p>Здесь сразу можно убрать мешающие ингредиенты, добавить собственные, выбрать размер и тесто. Видите ли вы проблему?<\/p>\n<p>Рассмотрим такой сценарий. Я беру пиццу с курицей, но потом вдруг замечаю, что в неё входят шампиньоны, а я их не хочу. Убираю шампиньоны, и иду оформлять заказ, ожидая пиццы без шампиньонов. Ко мне приезжает пицца с шампиньонами, ведь в заказ-то я добавил пиццу ещё с ними, а убрал я их уже потом из пиццы, которую в итоге даже не добавил в заказ. Итог — я недоволен.<\/p>\n<p>Когда я это объясняю, студенты иногда пытаются решить проблему: «мы будем учитывать изменение даже после добавления в заказ». Но так тоже нельзя. Я ведь мог убрать шампиньоны случайно или передумать их убирать, но рассчитывать, что пицца приедет с шампиньонами, ведь в заказ-то я добавил как раз с ними. Я мог как раз думать, что изменения, сделанные после добавления в заказ, ни на что не повлияют.<\/p>\n<p>То есть какую бы логику вы тут не реализовали, часть пользователей будет ожидать противоположной.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/classical-pizza-problem-2.jpg\" width=\"800\" height=\"306\" alt=\"\" \/>\n<\/div>\n<p>Иногда бывает, что в таком же контексте кнопку «Добавить в корзину» превращают в какую-то считалку типа − 1 + после добавления первой пиццы. Тут мозг окончательно взрывается. Если нажимать плюс несколько раз попеременно с изменением начинки, а потом нажать пару раз минус, невозможно даже предположить, что в итоге окажется в заказе. При этом сценарий «заказать две пиццы с курицей, но одну из них без шампиньонов» — достаточно нормальный, чтобы про него подумать.<\/p>\n<p>Эта проблема — пример незамкнутости интерфейса, то есть его логической дырявости.<\/p>\n<p>Проблема возникает из-за того, что настройка организована прямо в меню, то есть вы как бы настраиваете не вашу пиццу, а меню ресторана. Но вы не можете настраивать меню ресторана, вы же не шеф-повар! Из-за того, что эта пицца в меню не определилась, то ли она ресторана, то ли ваша, и возникают все последующие баги.<\/p>\n<p>Та же проблема встречается в недавнем интерфейсе <a href=\"https:\/\/ilyabirman.ru\/meanwhile\/all\/dont-hide-on-hover\/\">с исчезновением при наведении<\/a><\/p>\n<p>Проблема решается, если убедиться, что вы даёте настраивать только ту пиццу, которая уже или находится в заказе пользователя, или хотя бы явно «на пути» туда. Первый вариант — пицца сразу добавляется в заказ, состав которого отображается в панели сбоку; там же можно нажать «Изменить начинку» у любой пиццы. Второй вариант — при выборе пиццы она не сразу добавляется в заказ, но сначала появляется промежуточный с настройкой начинки. Кстати, если этот промежуточный экран — попап, то с ним обычно другая проблема: <a href=\"https:\/\/ilyabirman.ru\/meanwhile\/all\/tight-ui-pizza-ingredients\/\">ингредиентам тесно<\/a>.<\/p>\n",
            "date_published": "2023-12-15T12:05:31+05:00",
            "date_modified": "2023-12-15T12:09:23+05:00",
            "tags": [
                "замкнутость интерфейса",
                "интерфейс заказа пиццы",
                "пользовательский интерфейс",
                "студентам",
                "Школа бюро"
            ],
            "author": {
                "name": "Илья Бирман",
                "url": "https:\/\/ilyabirman.ru\/meanwhile\/",
                "avatar": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764"
            },
            "_date_published_rfc2822": "Fri, 15 Dec 2023 12:05:31 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124944",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "120808",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/all\/nezamknutost-interfeysa-polotencesushitelya\/",
            "title": "Незамкнутость интерфейса полотенцесушителя",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/towel-dryer-IMG_6121.jpg\" width=\"1200\" height=\"800\" alt=\"\" \/>\n<\/div>\n<p>На старом полотенцесушителе у меня был только выключатель, а на новом — целых три кнопки. Нижняя включает и выключает, средняя выбирает температуру, а верхняя — время работы. Температура последовательно выбирается из низкой, средней и высокой, а время — из ∞, 2, 4 и 6 часов. Внимание, вопрос: как работает выбор времени?<\/p>\n<p>Допустим я выбрал 4 часа. Захожу через три часа в ванную, а полотенце ещё мокрое. Думаю: «надо подольше посушить», и переключаю на 6 часов. В какой момент время пошло? Стали ли сейчас заново отсчитываться шесть часов или предыдущий таймер продлился на час? Если продлился, то что будет, если я долистаю до 2 часов?<\/p>\n<p>Незамкнутость откуда не ждали! Обычно такие интерфейсы придумывают начинающие дизайнеры, но их не берут в работу, потому что уж инженер-то понимает, что в интерфейсе нет внутренней логики.<\/p>\n<p>Кстати, нагородили целых три кнопки, но при этом режима «всегда работать на низкой температуре, но когда надо включать „буст“ на 2 или 4 часа» — нет.<\/p>\n",
            "date_published": "2023-06-21T14:21:02+05:00",
            "date_modified": "2023-06-21T14:19:57+05:00",
            "tags": [
                "замкнутость интерфейса",
                "пользовательский интерфейс"
            ],
            "author": {
                "name": "Илья Бирман",
                "url": "https:\/\/ilyabirman.ru\/meanwhile\/",
                "avatar": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764"
            },
            "_date_published_rfc2822": "Wed, 21 Jun 2023 14:21:02 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "120808",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "122363",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/all\/ui-course-frag-75\/",
            "title": "На интерфейсном курсе: точно описываем поведение интерфейса для разработчиков",
            "content_html": "<p>Участник курса отвечает на мои вопросы об интерфейсе, и я пытаюсь подытожить, как себя в итоге всё ведёт. Точное, как спецификация, описание — это часть проектирования интерфейса. 3 минутки:<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/zngun6Kw1q4?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<\/div>\n<p>Это фрагмент № 75 онлайн-курса «Пользовательский интерфейс и представление информации». Записано на курсе 11 февраля 2022 года.<\/p>\n<p>До 28 октября идёт запись на курс, который пройдёт с 29 октября по 27 ноября.<\/p>\n<p><a href=\"http:\/\/bureau.ru\/educenter\/ui-online\/\" class=\"button buy-button big-button\">Почитать о курсе<\/a><\/p>\n<p class=\"foot\">Программа, отзывы, запись<\/p>\n",
            "date_published": "2022-10-27T19:03:00+05:00",
            "date_modified": "2024-01-09T12:24:36+05:00",
            "tags": [
                "видео",
                "замкнутость интерфейса",
                "пользовательский интерфейс",
                "работа",
                "студентам",
                "фрагменты курса ПИ"
            ],
            "author": {
                "name": "Илья Бирман",
                "url": "https:\/\/ilyabirman.ru\/meanwhile\/",
                "avatar": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764"
            },
            "_date_published_rfc2822": "Thu, 27 Oct 2022 19:03:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "122363",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "125364",
            "url": "https:\/\/ilyabirman.ru\/meanwhile\/all\/autocomplete-style\/",
            "title": "Автодополнение через выделение и без него",
            "content_html": "<p>Изобретатели автодополнения ловко использовали для своей задачи текстовое выделение. Когда машина предлагает вариант окончания, она просто вставляет его в текстовое поле, сразу же делая выделенным:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/autocomplete-1@2x.png\" width=\"180\" height=\"150\" alt=\"Автодополнение через выделение\" \/>\n<\/div>\n<p>По мере ввода, окончание заменяется тем, что вводит человек, и тут же появляется новое. Если нажать Энтер, то введётся предложенный вариант. Если нажать стрелку вправо, вариант останется в поле, но можно будет дописать что-то ещё.<\/p>\n<p>Это поведение не нужно было специально программировать — текстовое выделение само собой работает так. Сейчас это кажется очевидным решением, но не уверен, что оно сразу же пришло в голову. Думаю, первые попытки усложняли текстовые поля особым видом текста — предлагаемым окончанием, пока кто-то не увидел, что можно обойтись без этого.<\/p>\n<p>Всё же, в последнее время стал популярен другой вид автодополнения, когда предлагаемое окончание пишут просто бледным цветом:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/autocomplete-2@2x.png\" width=\"180\" height=\"150\" alt=\"Автодополнение без выделения\" \/>\n<\/div>\n<p>Такой вариант выигрывает в эстетике, но теряет логическое изящество обычного. С ним непонятно: дописанный текст уже есть в поле, или его ещё нет?<\/p>\n<p>Сайт «Авито» постоянно обламывает меня своим поиском. Пишешь, например, «сно», он дописывает «уборд», ты жмёшь Энтер, а он ничего не находит по запросу «сно». Классическое автодополнение такой лажи себе бы не позволило.<\/p>\n<p>Контролам нужны годы, чтобы их поведение утряслось и стало стандартом. Пока реализации этого модного варианта отличаются. Нужно делать, чтобы такое автодополнение вело себя в точности как обычное. Подозреваю, что этого можно добиться, оставляя это выделение технически обычным, но своевременно изменяя стиль текстового выделения ЦССом.<\/p>\n<p>В недавнем обновлении <a href=\"http:\/\/ilyabirman.ru\/projects\/angstrom\/\">Ангстрема<\/a> мы перешли на такое автодополнение:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ilyabirman.ru\/meanwhile\/pictures\/autocomplete-angstrom@2x.png\" width=\"340\" height=\"80\" alt=\"Автодополнение в Ангстреме\" \/>\n<\/div>\n<p>Я бы, наверное, ещё год с этим тупил, если бы Шурик не предложил. Смысл не пострадал, а чище стало.<\/p>\n",
            "date_published": "2015-03-17T03:32:10+05:00",
            "date_modified": "2024-01-07T11:47:11+05:00",
            "tags": [
                "Ангстрем",
                "замкнутость интерфейса",
                "пользовательский интерфейс"
            ],
            "author": {
                "name": "Илья Бирман",
                "url": "https:\/\/ilyabirman.ru\/meanwhile\/",
                "avatar": "https:\/\/ilyabirman.ru\/meanwhile\/pictures\/userpic\/userpic@2x.jpg?1573933764"
            },
            "_date_published_rfc2822": "Tue, 17 Mar 2015 03:32:10 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "125364",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}