<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Аналитика | Павел Шерер</title><atom:link href="https://sherer.pro/blog/category/analytics/feed/" rel="self" type="application/rss+xml" /><link>https://sherer.pro/blog/category/analytics/</link><description>Продюсер, аналитик, продуктовый дизайнер IT-решений</description><lastBuildDate>Wed, 10 Dec 2025 13:39:50 +0000</lastBuildDate><language>ru-RU</language><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><generator>https://wordpress.org/?v=6.9.4</generator><image><url>https://sherer.pro/content/uploads/2018/01/cropped-favicon-60x60.jpg</url><title>Аналитика | Павел Шерер</title><link>https://sherer.pro/blog/category/analytics/</link><width>32</width><height>32</height></image> <item><title>Информационная архитектура: сущности (практика, vol.2)</title><link>https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-3/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Thu, 30 Oct 2025 12:35:32 +0000</pubDate><category><![CDATA[UX/UI]]></category><category><![CDATA[Аналитика]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[гайд]]></category><category><![CDATA[информационная архитектура]]></category><guid isPermaLink="false">https://sherer.pro/?p=4735</guid><description><![CDATA[<p>Третья часть про сущности в ИА: фиксация свойств, паттерны их моделирования и схематизация итогового результата.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-3/">Информационная архитектура: сущности (практика, vol.2)</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>В прошлой статье мы разобрали первые пять этапов проработки информационных сущностей. Теперь давайте поговорим об оставшихся двух: фиксации свойств и итоговой схематизации.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Если эта первая статья, с которой вы знакомитесь с информационной архитектурой, примите мои соболезнования: вам может быть непонятно. Рекомендую идти в начало цикла.</p></blockquote><p>В одной из предыдущих статей у нас был простенький <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-1/#3-2-primer-opisaniya-svoystv">пример</a> фиксации свойств. Теперь мы его расширим. Но сначала давайте выясним, каким образом вообще моделируются свойства информационных сущностей.</p><h2 class="wp-block-heading">Паттерны моделирования свойств</h2><p>Как мы уже знаем, все свойства можно поделить на несколько типов: базовые, ссылочные, составные, вычисляемые, технические и ограничительные. И если с базовыми всё плюс-минус понятно, то что делать с остальными — отнюдь не всегда ясно. </p><p>Да и с базовыми, если честно, порой могут возникнуть проблемы. Например, у нас есть свойство «Цвет». Оно простое: ни на кого не ссылается, это не таксономия — это, скорее, словарь, сквозное свойство. Как с ним быть? Или с полем «Описание» — оно тоже простое, но активно участвует в индексации и поиске, об этом тоже нужно подумать.</p><p>Давайте разбираться.</p><h3 class="wp-block-heading">Нормализованные словари</h3><p>Их ещё называют «справочниками», а разработчики — ENUM, перечислением. Мы их уже касались вскользь. Поля такого типа могут принимать только значения из конкретного, определённого перечня.</p><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>Значения — всегда конечные и контролируемые, добавление новых происходит только по процессу ревью.</li><li>Поддерживают алиасы/синонимы для поиска, но в БД хранится нормализованное значение (ключ).</li><li>Если значения словаря локализуются (переводятся на другие языки), то внутренний ключ остаётся неизменным.</li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>У товара есть поле <code>brand</code>, которое ссылается на запись из справочника брендов. В справочнике брендов есть конечный перечень записей обо всех брендах, представленных в системе.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f61cf2&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f61cf2" class="wp-block-image aligncenter size-full wp-lightbox-container"><img fetchpriority="high" decoding="async" width="1446" height="560" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/11/ia-entities-7.png" alt="" class="wp-image-4833" style="object-fit:cover" srcset="https://sherer.pro/content/uploads/2025/11/ia-entities-7.png 1446w, https://sherer.pro/content/uploads/2025/11/ia-entities-7-1048x406.png 1048w, https://sherer.pro/content/uploads/2025/11/ia-entities-7-768x297.png 768w" sizes="(max-width: 1446px) 100vw, 1446px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure></div><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>Фильтр «Бренд» в каталоге работает по полю <code>brand</code> товара. В текстовом поиске же мы учитываем не только прямое название бренда, но и алиасы/синонимы. </p><p>Например, при вводе в поле поиска «Nike», «nike» и «Найк» система понимает, что это одно и то же — и выдаёт одинаковый результат.</p><p>Справочник брендов:</p><figure class="wp-block-table"><table><thead><tr><th>Ключ</th><th>Алиасы (в нижнем регистре)</th></tr></thead><tbody><tr><td>adidas</td><td>adidas, адидас, addidas, adiddas, adidac, adibas</td></tr><tr><td>nike</td><td>nike, найк, наик, nake, niks, nikee</td></tr><tr><td>reebok</td><td>reebok, рибок, reeboc, reebokk, rebok, ribok</td></tr></tbody></table></figure></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>Избыточная детализация (когда в словаре много синонимов или значений) может привести к «шуму» в фасетах. Например, когда в словаре «Цвет» появляются сотни почти одинаковых значений: алый, бордо, вишнёвый, винный и тп.</li><li>Из-за отсутствия владельца, ответственного за словарь, повышается риск появления дублей и рассинхронизации.</li><li>Использование ENUM в БД для часто меняющихся списков почти всегда усложняет разработку и деплой.</li></ul><h3 class="wp-block-heading">Ссылочные поля</h3><p>Поля, указывающие на другие сущности через внешние ключи. Главное их отличие от <strong>нормализованных словарей</strong> в том, что <strong>ссылочные поля</strong> связывают сущности между собой и с другими объектами (например, с терминами таксономий). Тогда как значения ENUM из предыдущего примера не являются отдельными объектами, они просто строчка в фиксированном списке.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Ссылочные поля — это «мостики» между сущностями: товар связан с категорией, тегами, продавцом, заказами. Благодаря им карточка не живёт в вакууме, а встраивается в общую систему.</p></blockquote><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>Для «один‑ко‑многим» 1:N (категория → товары) у товара хранится ссылка на свою категорию. </li><li>Для «многие‑ко‑многим» M:N (товар ↔ тег) связи хранятся отдельно. </li><li>Важно продумать, что происходит при удалениях: кого переносим, кого архивируем, а где просто убираем связь.</li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>У товара есть одна «Категория», но множество «Тегов». </p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f62334&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f62334" class="wp-block-image aligncenter size-full wp-lightbox-container"><img decoding="async" width="1446" height="1310" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/11/ia-entities-8.png" alt="" class="wp-image-4841" srcset="https://sherer.pro/content/uploads/2025/11/ia-entities-8.png 1446w, https://sherer.pro/content/uploads/2025/11/ia-entities-8-1048x949.png 1048w, https://sherer.pro/content/uploads/2025/11/ia-entities-8-768x696.png 768w" sizes="(max-width: 1446px) 100vw, 1446px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Если удалить тег — товар останется. Если удалить категорию — нужно заранее решить, куда товар переедет.</p></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>Непродуманные правила удаления ведут к потере данных или поломке логики. Я видел случаи, когда при удалении рубрики в CMS, из базы данных удалялись десятки статьей и сотни комментариев. </li><li>Когда связи между сущностями организованы неэффективно, системе приходится делать много лишних запросов, фильтровать данные или пересчитывать агрегаты на лету. Это замедляет скорость работы продукта.</li><li>Если связи построены небрежно, при массовых обновлениях могут случиться зависания или сбои. Например, любое изменение категории или продавца может вызвать ошибки в отображении связанных с ними карточках.</li></ul><h3 class="wp-block-heading">Вычисляемые поля</h3><p>Это свойства, которые не вводятся вручную, а считаются системой на основе других данных: средний рейтинг, количество просмотров, популярность, конверсия. Они помогают понять, насколько «живой» или успешный объект, не требуя ручного обновления.</p><p>Вычисляться такие поля могут «на лету», либо храниться в БД или кэше. </p><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>Нужно договориться, откуда берутся исходные данные и как часто обновляется результат — в реальном времени или каждый час, день, неделю. </li><li>Исходные данные и вычисленные результаты хранятся отдельно, чтобы не потерять возможность пересчёта. </li><li>Важно фиксировать формулы расчётов и их владельца — того, кто отвечает, если метрика «поплыла». </li><li>Полезно также указывать время последнего обновления, чтобы понимать, насколько данные свежие.</li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>В карточке показываем «4.6 из 5» и «124 отзыва». Эти значения не вводятся вручную — они считаются из всех отзывов с округлением до одной десятичной. Популярность товара рассчитывается как комбинация просмотров и добавлений в корзину за последние 7 дней.</p></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>«Расползание» цифр: в карточке одно, в отчёте другое. На момент написания статьи такое можно увидеть на Хабре, там два разных счётчика просмотров: один доступный всем, другой — только авторам.</li><li>Неочевидные формулы, спрятанные в глубинах кода. Показатели меняются, команда не понимает причин.</li><li>Слишком частые пересчёты. Система вычисляет показатели слишком часто, нагружая серверы без нужды. Или наоборот — слишком редкие обновления, из‑за которых пользователи видят устаревшие данные.</li></ul><h3 class="wp-block-heading">Диапазоны и интервальные фасеты</h3><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Кто-то считает <strong>интервальные фасеты</strong> лишь подмножеством <strong>вычисляемых полей</strong>, но я решил выделить их отдельно. Они чаще всего встречаются и имеют несколько специфичных свойств.</p></blockquote><p>Фильтры по числам и датам помогают пользователю быстрее находить подходящие товары. Мы редко ищем вещь за точно 2&nbsp;570 рублей — обычно хотим что-то «в районе двух‑трёх тысяч». Поэтому интерфейс должен позволять задавать диапазон значений: цену «от-до», вес или рейтинг. Пользователь мыслит не конкретными числами, а удобными «вилками» — например, «до 1000 рублей» или «от 4 звёзд и выше».</p><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>В системе хранится точное значение, а пользователю показываются готовые «умные» интервалы (например, на основе реального распределения цен). Если меняем цену, то принадлежность к интервальным полям изменяется автоматически.</li><li>Правила границ (включительно/исключительно) и округления задаются явно. Чтобы не было непонятно, входит «1000» в «до 1000» или в «1000-5&nbsp;000».</li><li>Должны быть продуманы правила обработки пустых/нулевых значений. Например, «цена не указана» — это отдельная группа, она не попадает в интервалы.</li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>Фильтр «Цена» может выглядеть так: готовые варианты «до 999&nbsp;рублей», «1000–4999&nbsp;рублей», «5000+», плюс ручной ввод. </p><p>Для сортировки и страниц используется точная цена из карточки. При этом явно указано, что «до 999&nbsp;рублей» — верхняя граница включительно, «1000–4999&nbsp;рублей» — обе границы включительно, а товары без цены попадают в отдельный блок «цена не указана».</p></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>Для денег и размеров нужно быть аккуратными с единицами и валютами. Если смешать сумму и валюту, это может плохо кончиться: фильтр по цене может стать бесполезен. </li><li>Непродуманные интервалы дают пустые результаты и раздражают пользователей. </li></ul><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Важный момент: некоторые фреймворки и базы данных умеют совершать очень быстрые арифметические операции, включая поиск по диапазону. Поэтому зачастую диапазоны и интервальные фасеты могут оказаться излишними. Уточняйте у разработчиков и архитекторов.</p></blockquote><h3 class="wp-block-heading">Составные и полуструктурированные поля</h3><p>Когда у сущности много разнородных характеристик (например, у товара есть изображения, материалы, дополнительные свойства) — удобнее собрать их в «пакеты». То есть не разбивать свойство на десятки отдельных полей, а объединить в один структурированный набор. Это помогает избежать перегруженности данных и сделать архитектуру более гибкой.</p><p>Во <a href="https://sherer.pro/blog/informacionnaya-arxitektura-primer-i-tipizaciya/">второй статье</a> цикла я писал о <em>сильной и слабой типизации</em>. Так вот составные поля — отличных пример признака слабой типизации.</p><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>Те свойства, которые часто используются для фильтрации, сравнения или сортировки (ширина, вес, цена), лучше выделить в отдельные простые поля. Остальное можно хранить в составе набора.</li><li>Важно сразу договориться о едином формате (например, JSON или таблица), чтобы не получилось сотни уникальных схем в разных объектах.</li><li>Также стоит помнить об ограничении глубины вложенности — чем проще структура, тем меньше ошибок при обновлениях.</li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>Для товара может быть важно хранить габариты в отдельных свойствах, так как по ним может осуществляться фильтрация. А вот данные изображения можно хранить в <strong>составном свойстве</strong>, потому что по отдельности их запрашивать не станут.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f62c4c&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f62c4c" class="wp-block-image aligncenter size-full wp-lightbox-container"><img decoding="async" width="1446" height="982" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/11/ia-entities-9.png" alt="" class="wp-image-4855" srcset="https://sherer.pro/content/uploads/2025/11/ia-entities-9.png 1446w, https://sherer.pro/content/uploads/2025/11/ia-entities-9-1048x712.png 1048w, https://sherer.pro/content/uploads/2025/11/ia-entities-9-768x522.png 768w" sizes="(max-width: 1446px) 100vw, 1446px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Таким образом, мы не делаем отдельные поля для тех свойств, которые используются только вместе.</p></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>Перестарались с «пакетами» — становится проблематично искать или менять параметры. </li><li>Если структура слишком сложная или неоднородная, новые данные перестают помещаться в общую логику, а интерфейс не справляется с отображением. </li><li>Есть риск дублирования свойств: если одно и то же поле хранится и внутри набора, и отдельно, это будет сбивать аналитику и создаст противоречия.</li></ul><h3 class="wp-block-heading">Поисковые поля</h3><p>Это поля, которые напрямую влияют на то, как пользователи находят нужный элемент через поиск. Именно они определяют качество и релевантность результатов. Обычно сюда входят: название, краткое описание, артикул и так далее. </p><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>Поиск должен «думать как человек»: учитывать разные формы слов («купить» и «покупка»), синонимы («ноутбук» и «laptop») и популярные опечатки. Именно поисковые поля должны лучше всего индексироваться.</li><li>Полезно задавать разный «вес» полям — название важнее описания, а описание важнее технических характеристик. </li><li>Важно поддерживать актуальный словарь синонимов и опечаток: он должен пополняться на основе статистики реальных поисковых запросов.</li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>Покупатель вводит «кеды», и поиск показывает ему как «кеды», так и «sneakers», даже если запрашиваемое слово вообще на другом языке.</p><p>Название и категория влияют сильнее, чем описание, поэтому карточки с точным совпадением появляются первыми. </p><p>Словарь запросов обновляется по статистике — если пользователи всё чаще ищут «скайшуз» или «кроссовки на платформе», система быстро учится понимать эти слова.</p></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>Сложные запросы без ограничений по размеру выдачи запросто могут «положить» поиск, перегрузив систему. </li><li>Если переусердствовать с синонимами, поиск начинает показывать нерелевантные результаты, будет слишком много «шума». </li><li>Несвоевременно обновляемый словарь приводит к тому, что люди начнут искать новые термины, которых в базе нет — и, не получив результатов, посчитают, что товара нет вовсе.</li></ul><h3 class="wp-block-heading">Технические поля</h3><p>Это служебные поля, которые фиксируют то, что пользователям знать не обязательно. Например: когда и кем запись создана/изменена, какой у неё статус, флаги индексации. Такие данные помогают поддерживать порядок, находить ошибки и понимать, как объект живёт во времени. Без них часто невозможно разобраться, кто и что сделал, особенно если с системой работает большая команда.</p><p>Очень часто при проработке информационной архитектуры про служебные поля забывают. Это приводит к тому, что в процессе реализации появляются самые разнообразные костыли, которые сильно мешают развитию системы.</p><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>Типовые значения указываются в едином формате: например, время — только в UTC+0. Это позволяет потом не путаться при реализации и анализе.</li><li>Важно заранее договориться о понятных статусах сущностей и допустимых переходах между ними, фиксировать автора, источник и причину изменений. </li><li>Желательно хранить историю правок хотя бы ключевых сущностей, чтобы при спорных ситуациях можно было восстановить ход событий. </li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>У сущности «Товар» есть поле «Статус» в виде нормализованного словаря, ENUM: «черновик → на проверке → опубликован → в архиве». </p><p>Система показывает, кто и когда вносил правки, а также из какой системы пришли изменения. Например, если товар был обновлён автоматически из ERP, это видно в истории. А комментарий «обновлены фотографии по новому каталогу» помогает понять контекст изменения.</p></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>«Прыгающие» даты из‑за разных часовых поясов, непонятные или дублирующие статусы, невозможность определить автора изменений. </li><li>Потеря истории при импорте или миграции: если данные перезаписать без сохранения временных меток, аналитика и отчёты станут недостоверными. </li></ul><h3 class="wp-block-heading">Ограничительные поля</h3><p>Это поля, которые определяют рамки доступности сущности: кто может её видеть, с ней взаимодействовать, где и при каких условиях. Они регулируют поведение системы и помогают избегать нарушений — например, продаж алкоголя несовершеннолетним или показ товаров, запрещённых к экспорту в конкретной стране. Также <strong>ограничительные поля</strong> фиксируют бизнес‑ограничения и ролевую модель вроде «только для админов» или «данные предоставляются по запросу».</p><p><strong>Правила</strong>:</p><ul class="wp-block-list"><li>Разделяйте «бизнес‑ограничения» (что показываем и кому) и «технические» (что разрешает система). Должно быть прозрачно, почему сущность или операция скрыта или недоступна. </li><li>Желательно сопровождать такие поля пояснениями — что именно ограничивает доступ и где отображается уведомление пользователю. </li><li>Все ограничения должны иметь понятные статусы (например, «активно», «ожидает проверки», «временно снято с продажи») и быть управляемыми, а не жёстко зашитыми в код.</li></ul><p><strong>Пример</strong>:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>В e-com для разных товаров могут быть установлены разные ограничения: «показывать только B2B», «не продавать в определённых странах», «ограничение по возрасту 18+».</p><p>В CRM доступ ко всем сделкам может быть доступен только пользователям с отмеченным полем «Полный доступ».</p></div><p><strong>Риски</strong>:</p><ul class="wp-block-list"><li>Скрытые ограничения ломают пользовательский опыт. Если это не предусмотрено специально, всегда сообщайте об ограничениях тем, кого они касаются. </li><li>Разные правила на фронте и бэкенде почти всегда приводят к несоответствиям. Лучше делать основную логику на сервере, а клиенту (браузеру или приложению) доверять только визуальное отображение.</li><li>При массовых изменениях может возникнуть путаница. Например, когда правила блокировок не синхронизированы между странами или каналами продаж.</li></ul><h2 class="wp-block-heading">Собственно, фиксация</h2><p>Теперь, когда с паттернами стало немного понятнее, давайте попробуем всё это зафиксировать. </p><p>Для каждого свойства сущности я советую создавать структурированный паспорт, чтобы команда чётко и однозначно понимала его назначение, формат и роль в продукте. Такой подход помогает избежать путаницы, ускоряет разработку и облегчает коммуникацию между дизайнерами, аналитиками и разработчиками.</p><p>Ниже я буду рассказывать про каждый аспект фиксации свойств и приводить пример в виде таблицы. Но так как формат блога не способствует созданию больших (и читаемых) таблиц, то я буду приводить только тот фрагмент, который относится к разделу. В конце статьи вы найдёте полные примеры в виде файлов.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Местами кое-что может показаться вам избыточным — и, скорее всего, так оно и есть. То, что может быть полезным в крупных продуктах с множеством ролей и подсистем, в небольших проектах порой только разводит бюрократию.</p><p></p></blockquote><h3 class="wp-block-heading">Основная информация</h3><p>Опишите, как поле называется в системе (код), какой у него тип данных (текст, число, дата и тп), обязательно ли оно для заполнения, приведите примеры. Добавьте пояснение, зачем это поле нужно, какую задачу решает.</p><p>Пример основной информации о сущности «Товар»:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Название</th><th>Код</th><th>Тип данных</th><th>Обяз.</th><th>Пример</th><th>Описание</th></tr></thead><tbody><tr><td>ID</td><td><code>id</code></td><td><code>int</code></td><td>Да</td><td>10245</td><td>Уникальный идентификатор записи, обязательное поле, помогает системе отличать товары друг от друга</td></tr><tr><td>Название</td><td><code>title</code></td><td><code>text</code></td><td>Да</td><td>Кроссовки Nike Air Zoom</td><td>Отображает название товара в каталоге, поиске и карточке товара</td></tr><tr><td>Цена</td><td><code>price</code></td><td><code>float</code></td><td>Да</td><td>1499</td><td>Хранит цену товара для отображения, сортировки и операций</td></tr><tr><td>Категория</td><td><code>category</code></td><td><code>ref</code></td><td>Да</td><td>Обувь</td><td>Определяет, к какому разделу относится товар</td></tr><tr><td>Цвет</td><td><code>color</code></td><td><code>enum</code></td><td>Нет</td><td>чёрный</td><td>Хранит название цвета, используется для фильтрации и отображения вариаций</td></tr></tbody></table></figure></div><p>Обратите внимание на тип данных: в различных системах типы данных могут обозначаться по-разному, при работе с IA желательно придерживаться какого-то единого, понятного всем, формата. Конкретно здесь:</p><ul class="wp-block-list"><li><code>int</code> — простое целое число;</li><li><code>text</code> — текст без явных ограничений в типе данных (не <a href="https://en.wikipedia.org/wiki/Varchar">varchar</a>, например);</li><li><code>float</code> — число с плавающей точкой (3.23);</li><li><code>ref</code> — ссылка на другую сущность, reference;</li><li><code>enum</code> — его вы уже знаете, нормализованный словарь.</li></ul><h3 class="wp-block-heading">Источник и валидация</h3><p>Откуда берётся значение и как проверяется. Укажите, поступает ли значение от пользователя, из импорта, внешней системы или вычисляется автоматически. Опишите правила проверки (валидации): допустимые диапазоны, форматы, обязательные символы. Также стоит указать, что происходит, если значение не проходит проверку (ошибка, предупреждение, автозамена).</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Название</th><th>Источник</th><th>Валидация</th></tr></thead><tbody><tr><td>ID</td><td>Генерируется автоматически системой</td><td>Проверяется на уникальность</td></tr><tr><td>Название</td><td>Вводится контент-менеджером</td><td>Проверяется на длину (не более 120 символов) и отсутствие запрещённых слов</td></tr><tr><td>Цена</td><td>Берётся из каталога поставщика</td><td>Проверяется на диапазон 1-999999, если меньше или больше — система выдаёт ошибку</td></tr><tr><td>Категория</td><td>Выбирается из справочника категорий</td><td>Если категория не найдена, выводится предупреждение, товар не заводится в систему</td></tr><tr><td>Цвет</td><td>Выбирается из списка доступных цветов</td><td>Проверяется по справочнику цветов и допустимым синонимам</td></tr></tbody></table></figure></div><h3 class="wp-block-heading">Индексация и поиск</h3><p>Как используется в поиске, фильтрах и аналитике. Опишите, участвует ли поле в поиске или фасетах, влияет ли оно на фильтрацию, сортировку и аналитику. Укажите, какие сценарии зависят от него (поиск по названию, сортировка по цене, фильтр по цвету). Добавьте, нужна ли регулярная переиндексация и как часто.</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Название</th><th>Индексация и поиск</th></tr></thead><tbody><tr><td>ID</td><td>Не участвует в поиске, используется для связи записей и аналитики</td></tr><tr><td>Название</td><td>Основное поисковое поле, влияет на релевантность результатов</td></tr><tr><td>Цена</td><td>Фасетное поле, используется для сортировки и фильтров «от‑до»</td></tr><tr><td>Категория</td><td>Участвует в навигации и фасетах; влияет на группировку и хлебные крошки</td></tr><tr><td>Цвет</td><td>Фасетное поле, помогает пользователям фильтровать товары по цвету</td></tr></tbody></table></figure></div><h3 class="wp-block-heading">Владение и контекст</h3><p>Кто отвечает за поле и где оно используется. Назначьте владельца поля — человека или роль, которая следит за его актуальностью (категорийный менеджер, контент-редактор, разработчик). Опишите, в каких интерфейсах поле отображается и кто взаимодействует с ним.</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Название</th><th>Ответственный</th><th>Где используется</th></tr></thead><tbody><tr><td>ID</td><td>Ответственность разработки</td><td>Используется системой, не отображается пользователям</td></tr><tr><td>Название</td><td>Контент-редактор</td><td>Отображается в каталоге, на карточке товара и в результатах поиска</td></tr><tr><td>Цена</td><td>Категорийный менеджер</td><td>Отображается в каталоге, корзине, аналитических отчётах</td></tr><tr><td>Категория</td><td>Маркетолог или контент-менеджер</td><td>Влияет на навигацию и структуру сайта, отображается в каталоге и карточке товара</td></tr><tr><td>Цвет</td><td>Контент-менеджер</td><td>Отображается в фильтрах и карточках товаров</td></tr></tbody></table></figure></div><h3 class="wp-block-heading">Жизненный цикл и обновление</h3><p>Как часто меняется поле. Разделите поля по типу обновления: редактируемые пользователем, автоматически пересчитываемые системой, импортируемые из внешних источников. Укажите частоту проверки актуальности и правила пересмотра.</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Название</th><th>Кем и как часто обновляется</th></tr></thead><tbody><tr><td>ID</td><td>Не меняется после создания</td></tr><tr><td>Название</td><td>Может редактироваться контент-редактором при обновлении ассортимента</td></tr><tr><td>Цена</td><td>Обновляется автоматически при изменении прайса, раз в сутки</td></tr><tr><td>Категория</td><td>Изменяется редко, при реструктуризации каталога</td></tr><tr><td>Цвет</td><td>Обновляется при появлении новых вариаций</td></tr></tbody></table></figure></div><h3 class="wp-block-heading">Нормализация и перевод значений</h3><p>Как поддерживается единообразие. Опишите, как поле очищается и приводится к общему формату: регистр, язык, синонимы, стандарты записи. Если данные многоязычные — уточните правила перевода. Добавьте примеры типичных ошибок и корректного вида.</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Название</th><th>Форматирование</th></tr></thead><tbody><tr><td>ID</td><td>Форматируется как число без ведущих нулей</td></tr><tr><td>Название</td><td>Очищается от лишних пробелов и специальных символов</td></tr><tr><td>Цена</td><td>Хранится как число в одной валюте (например, в рублях)</td></tr><tr><td>Категория</td><td>Нормализуется по справочнику категорий</td></tr><tr><td>Цвет</td><td>Приводится к единому значению («чёрный» = «black» = «черный»)</td></tr></tbody></table></figure></div><h3 class="wp-block-heading">Таблица свойств (Entity Attribute Matrix)</h3><p>В итоге для каждой сущности у вас появится единая таблица, где перечислены все поля с их типом, источником, обязательностью, правилами и владельцем. Она должна стать единым источником правды для всей проектной команды: от дизайнеров с аналитиками до разработчиков с архитекторами. Такая таблица поможет поддерживать актуальность архитектуры данных и синхронизировать работу API, интерфейсов и аналитики.</p><p>Обязательно ведите версионирование: когда и кем изменялась таблица, что именно было изменено. Это позволит, при необходимости, провести трассировку изменений (например, при расхождении информационной архитектуры с программной реализацией). </p><p>Ну и напоследок, как и обещал, полная таблица свойств из этой статьи:</p><div class="wp-block-file"><a id="wp-block-file--media-0fe6a47b-97b1-48ce-92ce-d15ae38b29d1" href="https://sherer.pro/content/uploads/2025/11/Primer-opisaniya-informacionnoy-sushchnosti-Tovar.xlsx">Пример описания информационной сущности Товар</a><a href="https://sherer.pro/content/uploads/2025/11/Primer-opisaniya-informacionnoy-sushchnosti-Tovar.xlsx" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-0fe6a47b-97b1-48ce-92ce-d15ae38b29d1">Скачать</a></div><p>Не переключайтесь, в цикле будет ещё как минимум две статьи.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-3/">Информационная архитектура: сущности (практика, vol.2)</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Информационная архитектура: сущности (практика, vol.1)</title><link>https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-2/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Tue, 28 Oct 2025 14:18:44 +0000</pubDate><category><![CDATA[UX/UI]]></category><category><![CDATA[Аналитика]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[гайд]]></category><category><![CDATA[информационная архитектура]]></category><guid isPermaLink="false">https://sherer.pro/?p=4601</guid><description><![CDATA[<p>Вторая часть про сущности в ИА, теперь с упором на практику: от сбора данных до выявления связей и таксономий.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-2/">Информационная архитектура: сущности (практика, vol.1)</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>В предыдущей <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-1/">статье</a> цикла мы разобрались, что такое информационные сущности, какие бывают типы свойств и базовые связи, прошлись по таксономиям и классификациям. Теперь давайте приступим к более практической части. </p><h2 class="wp-block-heading">Небольшое вступление</h2><p>На самом деле, работу над информационной архитектурой не всегда можно унифицировать, загнать в стандарты и фиксированные этапы. Иногда вы будете что-то упускать и потом возвращаться, это нормально. А часто, напротив, какие-то ответы уже есть в проектной документации — и тогда нужно просто собрать всё в одном месте и раскрасить оставшиеся «белые пятна».</p><p>Рассматривайте шаги, описанные ниже, исключительно как советы опытного архитектора, и ни в коем случае не как чёткие инструкции, которым надо слепо следовать. Более того, в реальных продуктах я сам не всегда всё это делаю — просто потому что не всегда в этом есть необходимость.</p><h2 class="wp-block-heading">Подготовка: контекст и границы</h2><p>Многие советы из этого раздела так или иначе перекликаются с обычной работой над продуктом (формирование границ, фиксация метрик и прочее). Если у вас уже есть эти данные, прекрасно, переиспользуйте их. Если же нет, то это может стать неплохим поводом подсветить слабые места продуктового подхода.</p><h3 class="wp-block-heading">Цель продукта</h3><p>Начните с формулировки основной пользовательской ценности и трёх–пяти задач, ради которых продукт вообще существует. Например: «заказать доставку еды за 3 клика», «найти нужную деталь по артикулу», «сравнить тарифы по параметрам».</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>В сложных продуктах может быть сильно больше 3-5 ключевых задач. В этом случае рекомендую декомпозировать его на логические или функциональные компоненты — и в каждом из них уже выводить свои цели и задачи.</p></blockquote><p>Для каждой задачи задайте измеримые KPI: «среднее время до результата (time‑to‑task)», «конверсия в целевое действие», «доля успешных сценариев» и подобные.</p><h3 class="wp-block-heading">Границы домена</h3><p>Составьте карту предметной области: какие объекты и операции в неё входят, а какие находятся за её пределами. Например, для маркетплейса внутрь попадают товары, продавцы, категории и заказы, а расчёт комиссий или логистика могут быть вынесены в соседние сервисы. Это защитит команду от размывания фокуса и неконтролируемого расширения требований.</p><h3 class="wp-block-heading">Источник истины</h3><p>Определите, где хранятся все артефакты ИА: таблицы сущностей, словари терминов, фасеты, схемы связей и тд. Лучше всего, если это будет ваша внутренняя вики, типа <a href="https://www.atlassian.com/software/confluence" target="_blank" rel="noreferrer noopener nofollow">Confluence</a>. Для диаграмм и визуальных схем можете использовать <a href="https://www.drawio.com" target="_blank" rel="noreferrer noopener nofollow">draw.io</a> (благо, он встраивается почти куда угодно) или <a href="https://www.figma.com/figjam/" target="_blank" rel="noreferrer noopener nofollow">FigJam</a>.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Важно, чтобы был один актуальный источник, а не десяток несвязанных и противоречивых документов.</p></blockquote><p>Назначьте владельцев этих артефактов и регламент обновления: кто, как часто и по какому триггеру правит данные, кому сообщается об изменениях. </p><h3 class="wp-block-heading">Согласование терминологии</h3><p>Создайте единый глоссарий терминов, где каждое понятие имеет согласованное определение. Например: в интерфейсе, в аналитике и в БД термин «пользователь» должен значить одно и то же, а не три разных понятия: аккаунт, клиент и автор. Я встречал системы, где одна и та же информационная сущность в одном месте называлась «пользователь», в другом «клиент», а в третьем «посетитель». Не надо так.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Хорошо организованный глоссарий устраняет двусмысленности и предотвращает непонимание между аналитиками, дизайнерами и разработчиками. </p></blockquote><h2 class="wp-block-heading">Декомпозиция: перечень сущностей</h2><p>После того как определены контекст и границы продукта, наступает этап декомпозиции — разбиения системы на отдельные сущности. На этом шаге мы превращаем абстрактные понятия («контент», «пользователи», «данные») в конкретные элементы модели, с которыми можно работать, описывать их свойства и связи. </p><p>Цель здесь простая: увидеть полную картину того, из чего состоит продукт и как эти части взаимодействуют между собой.</p><h3 class="wp-block-heading">Определение типов</h3><p>Пройдитесь по всем сценариям вашего продукта и выпишите <strong>устойчивые типы информации</strong>: «товар», «категория», «метка/тег», «пользователь», «заказ», «корзина», «страница» и тп. Добавьте сюда <strong>вспомогательные</strong> и <strong>производные </strong>сущности, которые не видны пользователю напрямую, но обеспечивают работу системы — например, «транзакция», «сессия», «ревизия».</p><p>Скорее всего, на этом этапе вы упустите какие-то объекты, ничего страшного. Как я уже говорил, работа над IA — не всегда строго последовательный процесс. Вернётесь, как найдёте ошибку.</p><h3 class="wp-block-heading">Описание сущности</h3><p>Для каждой сущности кратко опишите: </p><ul class="wp-block-list"><li><strong>роль</strong> (что делает эта сущность, зачем она нужна);</li><li><strong>жизненный цикл</strong> (от создания до удаления или архивации);</li><li><strong>точки появления в интерфейсе</strong> (можно прям названия экранов);</li><li><strong>обязательные операции</strong> (создать/редактировать/найти/связать). </li></ul><p>Тут важно не уходить в дебри и не погружаться в детальное проектирование. Вот вам пара простых примеров: </p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p><strong>Товар</strong></p><p><strong>Роль:</strong> бизнес-сущность, описывает продаваемую единицу ассортимента и используется в каталоге, карточке товара и отчётности.</p><p><strong>Жизненный цикл:</strong> создаётся продавцом или контент-менеджером, редактируется при обновлении данных, архивируется при снятии с продажи.</p><p><strong>Точки появления:</strong> каталог, результаты поиска, карточка товара, блоки рекомендаций.</p><p><strong>Операции:</strong> создать, редактировать, связать с категорией и тегами, добавить в акцию или архивировать.</p></div><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p><strong>Пользователь</strong></p><p><strong>Роль:</strong> системная сущность, представляет зарегистрированного клиента или участника системы.</p><p><strong>Жизненный цикл:</strong> создаётся автоматически при регистрации или импорте из CRM, обновляется при изменении профиля, может быть деактивирован или удалён.</p><p><strong>Точки появления:</strong> личный кабинет, заказы, отзывы, админ-панель.</p><p><strong>Операции:</strong> регистрация, авторизация, редактирование профиля, привязка к заказам или организациям.</p></div><h3 class="wp-block-heading">Проверка на дубликаты</h3><p>Проверьте, нет ли <strong>дублирующих или пересекающихся сущностей</strong>: если у вас есть и «автор», и «пользователь», возможно, это одно и то же с разными контекстами. Тогда их лучше объединить в одну сущность и добавить поле «роль» или «тип».</p><h3 class="wp-block-heading">Закрепление ответственных</h3><p>Для сложных систем составьте <strong>матрицу принадлежности</strong>: кто владелец данных по каждой сущности (продукт, контент, аналитика), где они хранятся и как обновляются. Опять же, не уходите в детали, здесь важно оставаться на высоком уровне абстракции.</p><p>Вот простенький пример такой матрицы для e-com:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Сущность</th><th>Владелец</th><th>Хранилище</th><th>Канал обновления</th><th>Комментарий</th></tr></thead><tbody><tr><td>Товар</td><td>Продакт-менеджер,<br>Контент-отдел</td><td>CMS</td><td>Импорт из ERP, ручное редактирование</td><td>Данные синхронизируются ежедневно</td></tr><tr><td>Категория</td><td>Контент-отдел</td><td>CMS</td><td>Ручное обновление, ревью раз в квартал</td><td>Согласование с SEO и маркетингом</td></tr><tr><td>Пользователь</td><td>Аналитика</td><td>CRM</td><td>Регистрация, API</td><td>Обновление при каждом входе</td></tr><tr><td>Заказ</td><td>Финансы</td><td>ERP</td><td>Автоматическая синхронизация</td><td>Источник для отчётности</td></tr><tr><td>Тег</td><td>Контент-отдел</td><td>CMS</td><td>Ручное добавление, периодическая чистка</td><td>Проверка дубликатов перед публикацией</td></tr></tbody></table></figure></div><p>Такая таблица помогает выстроить процессы и избежать ситуаций, когда разные отделы изменяют одни и те же сущности без синхронизации.</p><h3 class="wp-block-heading">Выработка метрик</h3><p>Дополнительно укажите <strong>метрики для каждой сущности</strong> — показатели того, что она используется и актуальна. Вот несколько примеров:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p><strong>Доля заполненных полей</strong> — процент карточек, где заполнены все обязательные атрибуты (например, описание, фото, цена, категория).</p><p><strong>Частота обращений</strong> — сколько раз сущность запрашивается пользователями или системами в сутки/неделю (например, просмотры карточек товаров или загрузка профилей).</p><p><strong>Связность</strong> — среднее количество связей с другими сущностями (например, число тегов на статью, товаров в категории).</p><p><strong>Актуальность данных</strong> — доля сущностей, обновлённых за последние N дней.</p><p><strong>Ошибки и дубли</strong> — количество некорректных или дублирующих записей в системе.</p><p><strong>Использование в сценариях</strong> — сколько продуктовых сценариев или отчётов опираются на эту сущность.</p></div><p>Эти показатели помогут оценивать зрелость и здоровье информационной архитектуры, выявлять запущенные участки и планировать развитие модели данных.</p><h2 class="wp-block-heading">Классификация: таксономии, уровни и операции</h2><p>После того как сущности выделены и описаны, важно понять, как они группируются и взаимодействуют в структуре продукта. Этот этап превращает «список объектов» в осмысленную систему: мы определяем, какие сущности являются базовыми разделами, какие служат фильтрами или связками, и как пользователь перемещается между ними. </p><p>Классификация помогает превратить набор данных в удобную навигацию, а архитектуру — в понятную карту продукта.</p><h3 class="wp-block-heading">Типы таксономий</h3><p>Разведите <strong>иерархические</strong> (категории, разделы, рубрики) и <strong>плоские</strong> (теги, темы, ключевые слова) таксономии. Определите, какие сущности формируют структуру навигации, а какие служат только для связей или фильтрации. </p><p>Пример, по традиции, из e-com:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>Категории формируют иерархическое дерево меню, которое задаёт маршрутизацию и навигацию: «Одежда» → «Женская» → «Блузки».</p><p>Теги «скидка», «новинка», «распродажа» или «эксклюзив» применяются как плоские фильтры — независимые признаки, не влияющие на структуру меню, но позволяющие пользователю собирать нужные срезы данных.</p><p>В результате одна и та же карточка товара может одновременно находиться в нескольких категориях и иметь множество тегов, отражающих её свойства или состояние.</p></div><h3 class="wp-block-heading">Уровни сущностей</h3><p>Назначьте <strong>уровень сущности</strong> — высокий, средний или низкий:</p><ul class="wp-block-list"><li>Высокие уровни — это корневые разделы и хабы, которые формируют скелет навигации и точку входа в систему. </li><li>Средние уровни — это страницы‑коллекции, объединяющие однотипные объекты. </li><li>Низкие уровни — карточки конкретных объектов, где реализуются операции и принимаются решения. </li></ul><p>Пример распределения сущностей по уровням:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Уровень</th><th>Сущность</th><th>Тип задач пользователя</th><th>Тип контента</th></tr></thead><tbody><tr><td>Высокий</td><td>Каталог, Блог, Документация</td><td>Обзор, переход к разделу</td><td>Навигационный</td></tr><tr><td>Средний</td><td>Категория, Раздел, Проект</td><td>Сравнение, поиск</td><td>Коллекционный</td></tr><tr><td>Низкий</td><td>Товар, Статья, Пользователь</td><td>Изучение, действие, покупка</td><td>Объектный</td></tr></tbody></table></figure></div><p>Такое разделение помогает проектировать маршрут от главной страницы к объекту и обратно, управлять глубиной дерева и оптимизировать путь пользователя.</p><h3 class="wp-block-heading">Группы, фасеты и фильтры</h3><p>Сформируйте <strong>операционные группы</strong>, в которых будет понятно, где живёт каждая сущность (в каком разделе, хабе или подсистеме), какие фасеты с фильтрами к ней применимы и какие действия доступны. Это создаёт связь между информационной архитектурой и интерфейсом.</p><p>Пример разницы между статьёй и товаром:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Сущность</th><th>Раздел</th><th>Фасеты и фильтры</th><th>Основные операции</th></tr></thead><tbody><tr><td>Товар</td><td>Каталог</td><td>Бренд, Цена, Размер, Цвет</td><td>Купить, Сравнить, Добавить в избранное</td></tr><tr><td>Статья</td><td>Медиа</td><td>Рубрика, Теги, Дата</td><td>Читать, Поделиться, Добавить в подборку</td></tr></tbody></table></figure></div><h3 class="wp-block-heading">Приоритеты и наследование</h3><p>Добавьте <strong>описание приоритетов и наследования таксономий</strong>: что отображается в интерфейсе, что используется для аналитики и SEO, а что служит внутренней классификацией. </p><p>Например:</p><div class="wp-block-group highlighted is-layout-constrained wp-block-group-is-layout-constrained"><p>Для корпоративного портала «Тип документа» может быть фасетом (для фильтрации и аналитики), а «Отдел» — иерархической категорией (для навигации и прав доступа).</p><p>В коммерции «Категория» и «Подкатегория» определяют URL и хлебные крошки, но не отображаются в фасетах, где остаются только фильтры «Бренд», «Цена», «Материал».</p></div><p>Обязательно фиксируйте ещё и правила наследования: категория → подкатегория → объект. В интерфейсе это проявляется как автоматическое применение фильтров при переходе на нижний уровень.</p><h3 class="wp-block-heading">Управление обновлениями</h3><p>Зафиксируйте <strong>методы актуализации</strong> таксономий: кто отвечает за создание новых терминов, их перевод, синхронизацию и архивирование. Опишите процессы ревизии, чтобы не допустить появления дубликатов или устаревших меток. </p><p>Например, контент‑отдел добавляет новые категории раз в квартал, SEO‑отдел проводит сверку алиасов, а аналитика проверяет наличие связанных данных. </p><p>Для крупных продуктов полезно ввести аудит изменений с фиксированием автора, даты пересмотра и краткого описания причины (например, «слияние категорий», «переименование фасета»).</p><h2 class="wp-block-heading">Выявление связей: кардинальности и контексты</h2><p>В теоретической части цикла мы <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-1/#4-svyazi-mezhdu-sushchnostyami">говорили</a> о кардинальностях, хранении, сценариях и индексах. Теперь давайте взглянем на то, как к этом прийти. </p><h3 class="wp-block-heading">Кардинальности</h3><p>Определение кардинальности было в прошлой статье, подробно на термине останавливаться не стану. Добавлю только, что для каждой связи крайне желательно описать:</p><ul class="wp-block-list"><li>с чем осуществляется связь,</li><li>тип связи, </li><li>глубину вложенности и </li><li>пример (при необходимости).</li></ul><p>Вот как это может выглядеть для сущности «товар»:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Связан с</th><th>Кардин.</th><th>Глубина вложенности</th><th>Описание связи и кардинальности</th></tr></thead><tbody><tr><td>Категория</td><td>1:N</td><td>2-3 уровня</td><td>Иерархическая таксономия. Один товар принадлежит одной конечной категории, но категория содержит множество товаров. В родительской категории находятся все товары дочерних.</td></tr><tr><td>Тег</td><td>M:N</td><td>1 уровень</td><td>Плоская таксономия. Один товар может иметь несколько тегов, каждый тег применяется к нескольким товарам.</td></tr><tr><td>Заказ</td><td>M:N</td><td>1 уровень</td><td>Связанная сущность. Один товар может входить во множество заказов. В одном заказе может быть несколько товаров.</td></tr><tr><td>Отзыв</td><td>1:N</td><td>1 уровень</td><td>Связанная (дочерняя) сущность. У одного товара может быть множество отзывов.</td></tr><tr><td>Пользователь</td><td>M:N</td><td>1 уровень</td><td>Связанная сущность. Пользователь может взаимодействовать с несколькими товарами (просмотры, избранное, история покупок). С одним товаром могут взаимодействовать множество пользователей.</td></tr></tbody></table></figure></div><p>Такая таблица может стать отличным началом для дальнейшей проработки связей.</p><h3 class="wp-block-heading">Контекстные связи</h3><p>Речь о связях вроде «похожие», «часто вместе», «варианты», «альтернативы» и так далее. Они используются в карточках, рекомендациях и аналитике пользовательских сценариев. Например, в e-commerce это может быть «с этим товаром часто покупают», а в медиа — «похожие статьи» или «продолжение серии».</p><p>Важно разделять логические связи (на уровне ИА) и вычисляемые (на уровне аналитики и рекомендательных алгоритмов).</p><p>Вот тот же пример, но с добавленными контекстными связями. Здесь и дальше я буду удалять лишние столбцы для читаемости, но в реальной таблице их лучше бы оставлять (или делать перекрёстные таблицы):</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Связан с</th><th>Контекст</th><th>Тип контекста</th></tr></thead><tbody><tr><td>Категория</td><td>«Товары в этой категории» — аналогичные товары из категории.</td><td>Логический</td></tr><tr><td>Тег</td><td>«Похожие товары» — товары с пересекающимися тегами.</td><td>Логический</td></tr><tr><td>Заказ</td><td>&#8212;</td><td>&#8212;</td></tr><tr><td>Отзыв</td><td>&#8212;</td><td>&#8212;</td></tr><tr><td>Пользователь</td><td>«Вам понравится» — на основе поведенческих данных и предыдущих заказов.</td><td>Вычисляемый</td></tr></tbody></table></figure></div><p>Разумеется, эта табличка сильно упрощает реальность. Даже в простеньком интернет-магазине контекстная связь «Похожие товары» будет, скорее, <em>вычисляемой</em> на основе многих факторов, а не только тегов.</p><h3 class="wp-block-heading">Ключевые и вариативные связи</h3><p>Выделите два типа связей: </p><ul class="wp-block-list"><li><strong>ключевые (частые) связи</strong> — они должны быть быстрыми, индексируемыми, проверяемыми на целостность; </li><li><strong>вариативные</strong> — их можно хранить гибко, например, в JSON или агрегированных таблицах.</li></ul><p>Вот тот же пример:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Связан с</th><th>Тип связи</th><th>Комментарий к типу связи</th></tr></thead><tbody><tr><td>Категория</td><td>Ключевая</td><td>Основная связь для навигации и фасетной фильтрации, требует строгой целостности и индексации.</td></tr><tr><td>Тег</td><td>Вариативная</td><td>Может меняться часто, используется для быстрых выборок и контекстных срезов, хранится гибко.</td></tr><tr><td>Заказ</td><td>Ключевая</td><td>Одна из бизнес‑критичных связей, формирует аналитику продаж и отчётность, требует транзакционной целостности.</td></tr><tr><td>Отзыв</td><td>Вариативная</td><td>Данные обновляются динамически пользователями; важно для контентных сервисов, но не влияет на бизнес‑логику.</td></tr><tr><td>Пользователь</td><td>Вариативная</td><td>Основана на поведенческих данных (просмотры, избранное, покупки), часто хранится в отдельных логах или кэше.</td></tr></tbody></table></figure></div><h3 class="wp-block-heading">Направление и зависимости связей</h3><p>Направления связей и зависимость объектов часто определяет их поведение. Заказ зависит от пользователя, а не наоборот. Комментарий зависит от поста, а не пост от комментария. Такие зависимости влияют на каскадное удаление и миграции, это очень важная часть ИА и дальнейшего проектирования баз данных.</p><p>Вот как это может выглядеть:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Связан с</th><th>Направление связи</th><th>Зависимость</th><th>Описание</th></tr></thead><tbody><tr><td>Категория</td><td>Категория → Товар</td><td>Товар зависит от категории</td><td>При удалении категории товары должны быть перемещены, переназначены или архивированы.</td></tr><tr><td>Тег</td><td>Двусторонняя (M:N)</td><td>Независимая</td><td>При удалении тега удаляются только связи, товары остаются без изменений.</td></tr><tr><td>Заказ</td><td>Товар → Заказ</td><td>Заказ зависит от товара</td><td>Заказ хранит ссылки на товары. При удалении товара заказы сохраняют данные о позиции, помечая их как архивные или недоступные.</td></tr><tr><td>Отзыв</td><td>Товар → Отзыв</td><td>Отзыв зависит от товара</td><td>При удалении товара отзывы удаляются или помечаются как «осиротевшие».</td></tr><tr><td>Пользователь</td><td>Двусторонняя (поведение)</td><td>Частично</td><td>Поведенческие связи с товаром (просмотры, избранное) можно анонимизировать или обнулить при удалении пользователя.</td></tr></tbody></table></figure></div><p>На этом, пожалуй, можно завершить историю про выявление связей между сущностями. Мы и так одной ногой ступили на зыбкую почву <strong>дизайна баз данных</strong>. Дальше пусть взрослые разбираются.</p><h2 class="wp-block-heading">Итог</h2><p>Мы ещё не успели пройтись по самому интересному — выявлению и фиксации свойств сущностей, схематизации всего этого добра. Но статья и так вышла объёмной, об этом будет в следующей части серии.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-2/">Информационная архитектура: сущности (практика, vol.1)</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Информационная архитектура: сущности (теория)</title><link>https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-1/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Sat, 18 Oct 2025 15:02:24 +0000</pubDate><category><![CDATA[UX/UI]]></category><category><![CDATA[Аналитика]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[гайд]]></category><category><![CDATA[информационная архитектура]]></category><guid isPermaLink="false">https://sherer.pro/?p=2411</guid><description><![CDATA[<p>Что такое информационные сущности, зачем они нужны и из чего состоят.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-1/">Информационная архитектура: сущности (теория)</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Сущности — это «кирпичи» информационной архитектуры. Правильно выделенные сущности, их свойства и связи задают масштабируемость продукта, качество поиска и фильтрации, логику навигации и эволюцию данных. В этой статье мы поговорим о том, как выявлять сущности, описывать их свойства, моделировать связи и таксономии (не запутывая при этом команду и пользователей).</p><h2 class="wp-block-heading">Вокабуляр</h2><p>Для начала давайте вспомним некоторые определения, которые помогут вам ориентироваться в этой статье:</p><p><strong>Информационная сущность</strong> — устойчивый тип информации в домене продукта (товар, пользователь, заказ, пост, коллекция, организация и тп), обладающий набором свойств и связей.</p><p><strong>Свойство сущности</strong> — характеристика, описывающая сущность количественно или качественно (название, цена, цвет, дата создания и тп). Свойства могут быть разных типов, заполняться и проверяться по разным правилам, быть «зависимыми» или нет.</p><p><strong>Таксономия</strong> — управляемая схема классификации, объединяющая сущности по общим признакам (категории, метки и прочие). Она создаёт структуру смысловых связей между сущностями, помогает группировать объекты, облегчает поиск и делает навигацию предсказуемой.</p><p><strong>Термин таксономии</strong> — конкретная единица этой классификации (например, категория «Кроссовки» в таксономии «Обувь»).</p><p><strong>Фасет</strong> — нормализованный атрибут, используемый для фильтрации и уточнения поиска (бренд, цвет, размер и тп).</p><h2 class="wp-block-heading">Что такое «сущность» и чем она не является</h2><p>Сущность всегда:</p><ul class="wp-block-list"><li>имеет <strong>роль</strong> в домене (зачем она нужна, какую задачу выполняет);</li><li>несёт <strong>набор свойств</strong> (атрибутов);</li><li>находится в <strong>связях</strong> с другими сущностями или таксономиями;</li><li>проходит <strong>жизненный цикл</strong> (например: создание, модерация, публикация, удаление).</li></ul><p>Из-за того, что терминология, как обычно, размыта, сущности легко можно спутать с чем-то, что ими не является, например:</p><ul class="wp-block-list"><li>со страницей/экраном (это <strong>представление</strong> сущности в одном из контекстов);</li><li>с UI‑компонентом (это <strong>способ отображения</strong> свойства или связи);</li><li>с таблицей БД (это <strong>реализация хранения</strong>, одна сущность может жить в нескольких таблицах и наоборот);</li><li>с бизнес‑процессом (это <strong>поведение</strong> вокруг данных: процесс «оформить заказ» использует сущности «корзина», «заказ», «платёж»).</li></ul><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Небольшая оговорка: иногда название <strong>сущности </strong>совпадает с названием <strong>представления</strong>, это абсолютно нормально. В контент‑ориентированных продуктах (CMS, документация, лендинги) тип «Страница» может быть <strong>полноценной контент‑сущностью</strong> с собственными свойствами (название, ярлык, текст, автор и тп) и жизненным циклом. Тезис «страница — не сущность» касается только путаницы между <strong>сущностью домена</strong> и <strong>экраном интерфейса</strong> (UI‑представлением).</p></blockquote><p>Сложно? На самом деле нет. Вот вам простой тест. Объект — это сущность, если содержит хотя бы 3 из следующих признаков:</p><ul class="wp-block-list"><li>имеет собственные свойства;</li><li>имеет связи с другими объектами;</li><li>повторяется во множестве экземпляров;</li><li>нужен в отчётности/поиске;</li><li>имеет собственные правила валидации/жизненный цикл.</li></ul><h2 class="wp-block-heading">Свойства сущности</h2><p>Как мы уже выяснили, у сущностей есть свойства. Это, пожалуй, самое важное, что отличает их от остальных объектов цифрового продукта. Давайте поговорим об этом чуть подробнее.</p><h3 class="wp-block-heading">Типы свойств</h3><p>Свойства могут быть нескольких типов:</p><ul class="wp-block-list"><li><strong>Базовые:</strong> идентификатор, название, описания и прочие. Это простые поля, которые содержат типовую информацию. Базовые свойства не ссылаются на другие объекты и, как правило, представлены в виде простых <em>типов</em> данных (строка, число, дата и тп).</li><li><strong>Ссылочные:</strong> внешние ключи на другие сущности (например, «идентификатор пользователя» в сущности «заказ»), а также термины таксономий (категория, метка, группа). Ссылочные свойства нужны для того, чтобы гарантированно связать сущности между собой и с терминами таксономий.</li><li><strong>Составные:</strong> свойства, которые включают в себя сразу несколько значений, объединённых одной логикой. Составные свойства могут быть однородными и неоднородными:<ul class="wp-block-list"><li><strong>однородные </strong>списки (например, изображения: <code>{url, alt},...</code>);</li><li><strong>неоднородные </strong>комплекты (например, габариты: <code>{weight, width, height, depth}</code>).</li></ul></li><li><strong>Вычисляемые:</strong> свойства, для фиксации (сохранения, отображения и тп) которых нужно сначала произвести какие-то операции. Например, это могут быть: цена со скидкой, количество на складе, агрегированный рейтинг.</li><li><strong>Технические:</strong> SKU/артикул, временные отметки, статусы модерации/публикации, флаги индексации. Технические свойства редко используются в визуальном представлении (например, в карточке товара из десятка технических свойств будет выводиться только артикул).</li><li><strong>Ограничительные:</strong> права доступа (ACL), владельцы, видимость. Их очень легко спутать с техническими, так как они тоже используются больше в логике, чем в представлении. Если сомневаетесь, задайте себе вопрос: «это свойство влияет на возможности пользователей?» — если да, то перед вами именно ограничительное свойство.</li></ul><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><em>И снова небольшое уточнение, чтобы избежать путаницы: типы&nbsp;<strong>свойств&nbsp;</strong>сущностей — не то же самое, что типы&nbsp;<strong>данных</strong>, которые эти свойства содержат. Например, если у нашей сущности «товар» есть свойство&nbsp;</em><code>title</code><em>&nbsp;(название), то тип&nbsp;свойства&nbsp;здесь —&nbsp;<strong>базовый</strong>, тогда как тип&nbsp;данных&nbsp;—&nbsp;<strong>строка</strong>. Подробнее о типах данных я писал&nbsp;</em><a href="https://sherer.pro/blog/dizajn-dannyh-chast-4-matchast-osnovy/#3-tipy-dannyh">здесь</a><em>.</em></p></blockquote><h3 class="wp-block-heading">Пример описания свойств</h3><p>Минимальный набор информации, которую желательно фиксировать при описании каждого свойства сущности:</p><ol class="wp-block-list"><li><strong>название</strong> — короткое имя свойства, одно-два слова;</li><li><strong>код</strong> — как это свойство будет называться в коде и базе данных;</li><li><strong>тип данных</strong> — строка, число, массив, объект, ссылка и тп;</li><li><strong>обязательность</strong> — обязано ли свойство быть заполненным, если отметка «да», то значение свойства не может быть пустым;</li><li><strong>пример</strong> — короткий пример заполнения свойства (если пример слишком длинный, он может быть обрезан);</li><li><strong>описание/комментарий</strong> — если требуется вносить какую-то дополнительную информацию.</li></ol><p>При желании, этот перечень можно дополнить дополнительными параметрами:</p><ol class="wp-block-list"><li><strong>источник </strong>— откуда берётся значение свойства (логика, подсистемы, интеграции и тп);</li><li><strong>валидации </strong>— базовое правило проверки значения свойства;</li><li><strong>индексация/поиск</strong> — участвует ли свойство в поиске и индексации, если да, то как;</li><li><strong>политика i18n</strong> — для локализуемых свойств: какие переводятся, какие нет;</li><li><strong>политикой заполнения</strong> — кто и когда обязан заполнить.</li></ol><p>Вот пример того, как могут фиксироваться свойства сущности «товар» (табличка получилась внушительная, скрольте влево):</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Название</th><th>Код</th><th>Тип данных</th><th>Обяза-тельно</th><th>Пример</th><th><strong>Описание/комментарий</strong></th><th>Источник</th><th>Валидация</th><th>И<strong>ндексация/поиск</strong></th></tr></thead><tbody><tr><td>Внутренний идентификатор</td><td><code>id</code></td><td><code>int</code></td><td>да</td><td><code>12345</code></td><td>Используется на бэкенде, на клиент не передаётся.</td><td>БД</td><td>уникальность</td><td>нет</td></tr><tr><td>Внешний идентификатор</td><td><code>sku</code></td><td><code>string</code></td><td>да</td><td><code>X-2025-01</code></td><td>Артикул, идентифицирует товар в URL.</td><td>БД</td><td>уникальность</td><td>точный</td></tr><tr><td>Название</td><td><code>title</code></td><td><code>string</code></td><td>да</td><td><code>Кроссовки X</code></td><td>&#8212;</td><td>ERP</td><td>5–120 символов</td><td>полнотекстовый</td></tr><tr><td>Описание</td><td><code>description</code></td><td><code>string</code></td><td>да</td><td><code>Летние кроссовки для самых...</code></td><td>&#8212;</td><td>ERP</td><td>200–2400 символов</td><td>полнотекстовый</td></tr><tr><td>Категория</td><td><code>category_id</code></td><td><code>ref</code></td><td>да</td><td><code>17</code></td><td>Идентификатор термина ключевой таксономии</td><td>Таксономия</td><td>существует</td><td>фасет</td></tr><tr><td>Габариты</td><td><code>dimensions</code></td><td><code>object</code></td><td>нет</td><td><code>{w:10,h:20,d:5}</code></td><td><code>w</code> &#8212; ширина,<br><code>h</code> &#8212; высота,<br><code>d</code> &#8212; глубина</td><td>ERP</td><td>диапазоны</td><td>фильтр</td></tr><tr><td>Изображения</td><td><code>images</code></td><td><code>list</code></td><td>да</td><td><code>['/upload/img1.jpg']</code></td><td>Список изображений товара, первое в списке — основное.</td><td>CDN</td><td>не пусто</td><td>нет</td></tr><tr><td>Цена</td><td><code>price</code></td><td><code>int</code></td><td>да</td><td><code>4990</code></td><td>Стоимость в рублях.</td><td>ERP</td><td>≥0</td><td>сортировка и фильтр</td></tr><tr><td>Скидка</td><td><code>discount</code></td><td><code>int</code></td><td>нет</td><td><code>20</code></td><td>Процент, на который снижается <code>price</code></td><td>ERP</td><td>целое число</td><td>нет</td></tr></tbody></table></figure></div><p>Такая фиксация свойств экономит кучу времени на разработке, интеграциях и отчётности. Дизайнеры и аналитики получают чёткий перечень с примерами, а разработчики намного более уверенно проектируют БД и жизненный цикл данных в продукте.</p><h3 class="wp-block-heading">Примеры по доменам</h3><p>Из-за того, что все продукты разные, домены в них тоже могут отличаться. В одном e-com сущность «товар» будет обладать одним набором свойств, в другом — совершенно иным. Порой очень хочется просто взять наработки с прошлого места работы и запихнуть их в текущую архитектуру «как есть». Призываю вас этого не делать, а всегда проектировать сущности, исходя из реалий продукта, процессов, потребностей пользователей и бизнес-задач.</p><p>Чтобы показать, насколько всё может отличаться от продукта к продукту, вот вам несколько примеров сущностей со свойствами из разных доменов:</p><div class="wp-block-group highlighted content-wide is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table"><table><thead><tr><th>Сущность</th><th>Свойства</th></tr></thead><tbody><tr><td>Пользователь</td><td><code>id</code>, <code>guid</code>, <code>email</code>, <code>login</code>, <code>password_hash</code>, <code>avatar</code>, <code>roles[]</code>, <code>org_id</code>, <code>created_at</code>, <code>last_seen_at</code></td></tr><tr><td>Каталог</td><td><code>id</code>, <code>type</code>, <code>parent_id</code>, <code>slug</code>, <code>default_facets[]</code>, <code>synonyms[]</code></td></tr><tr><td>Товар</td><td><code>id</code>, <code>sku</code>, <code>title</code>, <code>slug</code>, <code>description</code>, <code>images[]</code>, <code>price</code>, <code>currency</code>, <code>dimensions{}</code>, <code>weight</code>, <code>category_id</code>, <code>tags[]</code>, <code>stock_qty</code>, <code>rating</code>, <code>seller_id</code></td></tr><tr><td>Корзина</td><td><code>id</code>, <code>user_id</code>, <code>items[]</code>, <code>coupon</code>, <code>total_amount</code>, <code>currency</code>, <code>updated_at</code></td></tr><tr><td>Категория</td><td><code>id</code>, <code>parent_id</code>, <code>name</code>, <code>slug</code>, <code>synonyms[]</code>, <code>default_filters[]</code></td></tr><tr><td>Пост (медиа)</td><td><code>id</code>, <code>title</code>, <code>excerpt</code>, <code>body</code>, <code>author_id</code>, <code>category_id</code>, <code>tags[]</code>, <code>published_at</code>, <code>status</code></td></tr><tr><td>Организация (SaaS)</td><td><code>id</code>, <code>name</code>, <code>inn</code>, <code>slug</code>, <code>plan</code>, <code>seats</code>, <code>billing_account_id</code>, <code>status</code>, <code>created_at</code></td></tr></tbody></table></figure></div><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Обратите внимание, что категория здесь — информационная сущность, хотя она же — и термин таксономии. У терминов всегда есть собственные свойства, жизненный цикл и связи. Фиксировать ли их как сущности или описывать отдельно — решать вам.</p></blockquote><h2 class="wp-block-heading">Связи между сущностями</h2><p>Как я уже говорил, сущности почти всегда связаны как между собой, так и с терминами таксономии. Давайте теперь копнём поглубже.</p><h3 class="wp-block-heading">Кардинальности</h3><p>Кардинальность — это характеристика связи между двумя сущностями (таблицами, объектами, классами и т.д.), показывающая, сколько экземпляров одной сущности может быть связано с экземпляром другой. Проще говоря, это способ ответить на вопрос: «Сколько А может быть связано с одним B?» и наоборот.</p><p>Она лежит в основе информационной и логической архитектуры: без понимания кардинальностей невозможно правильно спроектировать базу данных, API, доменную модель или даже интерфейс.</p><p>Подробнее про кардинальности я <a href="https://sherer.pro/blog/dizajn-dannyh-chast-5-matchast-bazy-dannyh/#2-2-svyazi">писал</a> в цикле про дизайн данных, здесь пройдёмся коротко:</p><ul class="wp-block-list"><li><strong>Один-ко-одному, 1:1</strong> — связь, когда каждой записи одной сущности соответствует не более одной записи другой (аккаунт ↔ профиль). Используется для разделения личных и технических данных или выделения редко используемых атрибутов.</li><li><strong>Один-ко-многим, 1:N</strong> — наиболее частая связь: один объект верхнего уровня связан с множеством подчинённых (категория → товары; организация → проекты). Применяется для иерархий, коллекций и агрегатов.</li><li><strong>Многие-ко-многим, M:N</strong> — объект может быть связан с несколькими другими (товар ↔ теги; пост ↔ автор). Реализуется через промежуточные таблицы/сущности, содержащие идентификаторы обеих сторон и метаданные связи.</li></ul><h3 class="wp-block-heading">Хранение и производительность</h3><p>Выбор способа хранения связей напрямую влияет на скорость работы системы, гибкость изменений и устойчивость к росту данных. Здесь важно найти баланс между строгими структурированными связями и гибкими форматами, чтобы обеспечить масштабируемость, простоту поддержки и корректную работу поиска и аналитики.</p><p>Это ещё не дизайн баз данных, но первый шаг к нему.</p><h4 class="wp-block-heading">Ключевые, частые связи</h4><p>Реализуются как явными внешними ключами (Foreign Key, FK — ссылка из одной таблицы БД на запись другой таблицы), так и отдельными таблицами. Индексируются для быстрого поиска и каскадных операций (например, при удалении пользователя каскадом удаляются его профиль, способы оплаты и тп). Ключевые связи хорошо подходят для данных, которые часто запрашиваются и требуют согласованности.</p><p>Например, ключевой связью является связь пользователя и его профиля (1:1) или заказа и товара (1:N).</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f67606&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f67606" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1168" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/11/ia-entities-1.png" alt="Ключевая связь между сущностями в информационной архитектуре" class="wp-image-4639" srcset="https://sherer.pro/content/uploads/2025/11/ia-entities-1.png 2096w, https://sherer.pro/content/uploads/2025/11/ia-entities-1-1048x584.png 1048w, https://sherer.pro/content/uploads/2025/11/ia-entities-1-768x428.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><h4 class="wp-block-heading">Вариативные, редкие связи</h4><p>Удобнее хранить в агрегированных структурах (JSON, массивы, ключ-значение) или связующих таблицах без строгих FK. Такой подход облегчает эволюцию схемы и интеграции с внешними источниками.</p><p>Пример вариативной связи: товар и теги (M:N через JSON или связующую таблицу) или пост и связанные материалы (список ссылок в массиве).</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f678ec&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f678ec" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1168" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/11/ia-entities-2.png" alt="Вариативная связь между сущностями в информационной архитектуре" class="wp-image-4640" srcset="https://sherer.pro/content/uploads/2025/11/ia-entities-2.png 2096w, https://sherer.pro/content/uploads/2025/11/ia-entities-2-1048x584.png 1048w, https://sherer.pro/content/uploads/2025/11/ia-entities-2-768x428.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><h4 class="wp-block-heading">Комбинированный подход</h4><p>Сочетает строго типизированные связи для критичных сценариев (например, FK для заказов и пользователей) и гибкие структуры для второстепенных (например, свойства товара в JSON). Это компромисс между скоростью, расширяемостью и затратами на сопровождение.</p><p>Пример комбинированного подхода: заказ и пользователь (жёсткий FK) + история изменений в JSON, товар и его характеристики (основные поля + гибкое поле параметров).</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f67bc6&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f67bc6" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="736" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/11/ia-entities-3.png" alt="Комбинированный подход к связям между сущностями в информационной архитектуре" class="wp-image-4641" srcset="https://sherer.pro/content/uploads/2025/11/ia-entities-3.png 2096w, https://sherer.pro/content/uploads/2025/11/ia-entities-3-1048x368.png 1048w, https://sherer.pro/content/uploads/2025/11/ia-entities-3-768x270.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><h3 class="wp-block-heading">Поисковые сценарии и индексы</h3><p>Вот вы открыли свой любимый маркетплейс. Вбили в поле поиска нужный товар, отфильтровали по бренду и отсортировали результат по цене. Поздравляю, вы только что покрыли практически все поисковые сценарии.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Поисковые сценарии — это практические случаи, когда пользователь взаимодействует с данными через поиск, фильтрацию и сортировку.</p></blockquote><p>Чтобы такие операции выполнялись быстро и точно, информационная модель должна поддерживать разные типы <em>индексов</em>. Индексы обеспечивают мгновенное обращение к нужным сущностям и позволяют формировать результаты без полного перебора данных.</p><p>Индексировать можно разные типы полей:</p><h4 class="wp-block-heading">Фасетные поля</h4><p>Категория, бренд, размер, цвет, материал и прочее. Хранятся в нормализованных словарях или связаны с терминами таксономий, индексируются отдельно. Это даёт возможность строить фильтры и считать количество элементов в каждой группе (это ещё называется «фасетные агрегации»). Чтобы ускорить отклик системы, важно хранить <em>предвычисленные частоты </em>— но это уже совсем мрак, оставим его архитекторам БД.</p><h4 class="wp-block-heading">Поисковые поля</h4><p>Используют полнотекстовые индексы и префиксные деревья для автодополнения и предложений. Помните, как вы вбиваете что-то в строку поиска, а вам показывают подсказки? Вот это оно. Здесь же добавляются морфологический анализ, поддержка синонимов, транслитерации и нечёткий поиск (<a href="https://habr.com/ru/articles/354032/">fuzzy search</a>).</p><h4 class="wp-block-heading">Сортировочные поля</h4><p>Числовые и временные индексы (цена, рейтинг, дата создания, популярность), обеспечивающие быстрые операции сортировки и пагинацию без нагрузки на базу данных.</p><h4 class="wp-block-heading">Сложно? Подождите, это ещё не всё</h4><p>Существует тьма технических приёмов, нацеленных на оптимизацию индексирования: применение комбинированных индексов по частым связкам <code>category_id + price</code>, денормализация популярных связей <code>product → category_name</code>, кэширование фасетных частот для снижения нагрузки и прочее. Но это вам так, если захочется погрузиться.</p><h2 class="wp-block-heading">Таксономии и «сквозные» свойства</h2><p>Правильная таксономия обеспечивает единый язык между пользователями, системой и бизнесом. Таксономии бывают нескольких типов, и каждая решает свою задачу:</p><h3 class="wp-block-heading">Иерархическая таксономия</h3><p>Древовидная структура терминов, где каждый элемент подчинён родительскому (например, дерево категорий или разделов). В таких таксономиях «родительство» обычно обеспечивается отдельным свойством, вроде <code>parent_id</code>.</p><p>Такая модель хорошо подходит для каталогов товаров, корпоративных порталов и CMS, где пользователи ожидают логичную последовательность разделов и вложенных подразделов.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f680c5&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f680c5" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1446" height="680" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/10/ia-entities-4.png" alt="Пример иерархической таксономии" class="wp-image-4676" srcset="https://sherer.pro/content/uploads/2025/10/ia-entities-4.png 1446w, https://sherer.pro/content/uploads/2025/10/ia-entities-4-1048x493.png 1048w, https://sherer.pro/content/uploads/2025/10/ia-entities-4-768x361.png 768w" sizes="auto, (max-width: 1446px) 100vw, 1446px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p><strong>Преимущество:</strong> высокая предсказуемость навигации и простота в управлении.</p><p><strong>Недостаток:</strong> ограниченная гибкость и риск «похоронить» информацию слишком глубоко.</p><h3 class="wp-block-heading">Плоская таксономия</h3><p>Сеть меток, тем или ключевых слов, связанных с сущностями по принципу многие‑ко‑многим. Она добавляет горизонтальные связи и позволяет связывать контент по контексту: статьи с похожими тегами, продукты с общими характеристиками, документы одной темы.</p><p>Чаще всего плоские таксономии используется в медиа, блогах и SaaS‑платформах для тегирования и сквозных переходов между материалами.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f683eb&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f683eb" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1446" height="360" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/10/ia-entities-5.png" alt="Пример плоской таксономии" class="wp-image-4693" srcset="https://sherer.pro/content/uploads/2025/10/ia-entities-5.png 1446w, https://sherer.pro/content/uploads/2025/10/ia-entities-5-1048x261.png 1048w, https://sherer.pro/content/uploads/2025/10/ia-entities-5-768x191.png 768w" sizes="auto, (max-width: 1446px) 100vw, 1446px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p><strong>Преимущество</strong>: простота расширения и гибкость.</p><p><strong>Недостаток:</strong> если не контролировать список терминов, со временем возможна потеря структурности и даже полная поломка логики (например, когда у вас есть 2 разных метки «UX» и «ux»).</p><h3 class="wp-block-heading">Фасетная таксономия</h3><p>Объединяет независимые классификации, например: категория, бренд, размер, цена, материал. Пользователь может фильтровать данные сразу по нескольким измерениям.</p><p>Такая модель характерна для маркетплейсов и аналитических панелей, где каждый фасет — это отдельная ось с набором значений.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f686c6&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f686c6" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1446" height="680" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/10/ia-entities-6.png" alt="Пример фасетной таксономии" class="wp-image-4678" srcset="https://sherer.pro/content/uploads/2025/10/ia-entities-6.png 1446w, https://sherer.pro/content/uploads/2025/10/ia-entities-6-1048x493.png 1048w, https://sherer.pro/content/uploads/2025/10/ia-entities-6-768x361.png 768w" sizes="auto, (max-width: 1446px) 100vw, 1446px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p><strong>Преимущество</strong>: высокая управляемость фильтрацией и быстрый поиск.</p><p><strong>Недостаток:</strong> сложность проектирования и ухудшение управляемости при росте числа комбинаций.</p><h3 class="wp-block-heading">Сквозные свойства</h3><p>Например: материал, бренд, разрешение экрана. Сквозные свойства выполняют роль фасетов и служат мостом между таксономиями и данными:</p><ul class="wp-block-list"><li>живут в <strong>единых словарях</strong>, которые поддерживаются централизованно;</li><li>используются как <strong>фасеты</strong> и <strong>правила мерчендайзинга/рекомендаций</strong>;</li><li>имеют <strong>политику синонимов</strong>, нормализации значений и правила локализации;</li><li>могут быть <strong>жёстко типизированы</strong> (enum — о них чуть ниже) или <strong>гибкими</strong> (текстовые значения, появляющиеся из данных);</li></ul><p>Однако у сквозных свойств есть и обратная сторона. Давайте разберём на примере свойства товара «материал».</p><p>«Материал» — фасет <strong>только</strong> при наличии нормализованного словаря (ограниченный справочник материалов). Если материал хранится как произвольный текст (например, «металлический с пластиковыми вставками»), он <strong>не</strong> является фасетом и остаётся обычным полем: участвует в полнотекстовом поиске, но не в фасетной фильтрации.</p><h2 class="wp-block-heading">Противоречивые классификации</h2><p>Иногда классифицировать сущности оказывается сложно. Хороший пример такой противоречивой классификации — вопрос «где разместить арбуз»? Это <em>ягода </em>(что правильнее с точки зрения ботаники), <em>тыквина </em>(что ещё более правильно) или <em>фрукт </em>(ведь именно там его ищут пользователи)?</p><p>Когда один и тот же объект может относиться сразу к нескольким категориям, архитектору важно не выбрать «правильный» ответ, а установить управляемую логику принятия решений. Задача таксономии — не отражать условную «истину», а обеспечивать предсказуемость и согласованность между системами.</p><p>И для этого существует несколько правил:</p><ol class="wp-block-list"><li>Вводим <strong>приоритеты классификаций</strong> (биология < повседневные ожидания < бизнес‑цели каталога). Эти приоритеты задают уровень, на котором принимается решение — например, витрина каталога ориентируется на пользовательскую логику, а не на научную.</li><li>Формируем <strong>правила визуализации и информационные связи</strong>: как объект отображается в меню, поиске, фильтрах и фасетах, чтобы не было дублирования или рассинхронизации. В карточке сущности могут быть указаны обе принадлежности, но навигация использует только основную.</li><li>Фиксируем <strong>конфликты и владельцев решения</strong>: кто принимает решение, когда пересматривается структура, где фиксируются комментарии и примечания.</li><li>Документируем<strong> принципы разрешения конфликтов</strong> и <strong>исключения</strong>, чтобы разные подсистемы (поиск, рекомендации, SEO) пользовались единым источником правды.</li></ol><h2 class="wp-block-heading">Пример визуализации базы данных</h2><p>По итогу работы над информационной архитектурой обычно создаются спецификации API и дизайн БД. Про API здесь говорить пока рано, а вот про БД уже пора.</p><p>Ловите пример того, как может выглядеть простенькая база данных в виде ER-диаграммы:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f68bba&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f68bba" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1095" height="526" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2025/11/er-diagram-example.png" alt="" class="wp-image-4653" srcset="https://sherer.pro/content/uploads/2025/11/er-diagram-example.png 1095w, https://sherer.pro/content/uploads/2025/11/er-diagram-example-1048x503.png 1048w, https://sherer.pro/content/uploads/2025/11/er-diagram-example-768x369.png 768w" sizes="auto, (max-width: 1095px) 100vw, 1095px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Здесь учитывается почти всё:</p><ul class="wp-block-list"><li>По типу соединения можно понять тип связей. Например, от <code>users.id</code> к <code>orders.user_id</code> соединение начинается одной линией, а заканчивается несколькими, разветвлением — это связь однин-ко-многим (1:N).</li><li>Иконка «ключика» возле названия поля обозначает первичный ключ (primary key), который уникально идентифицирует каждую запись. А иконка «заметки» говорит о том, что у поля есть дефолтное значение.</li><li>Если возле названия есть иконка «ссылки», то это внешний ключ (foreign key), и от него почти всегда будет связь 1:N к источнику. Например, от того же <code>orders.user_id</code> к <code>users.id</code>.</li><li>Две буквы «NN» в конце каждой строки — это «NOT NULL», поле не может быть пустым. Та самая <em>обязательность</em> из таблички, помните?</li><li>Буква «Е» в <code>orders.status</code> означает «ENUM» — набор именованных констант. Значение этого поля может быть заполнено только значениями из определённого словаря. В нашем случае статус заказа может быть только <code>pending</code>, <code>paid</code>, <code>shipped</code>, <code>delivered</code> или <code>canceled</code>.</li><li>Ну а всякие <code>varchar</code>, <code>int</code>, <code>decimal</code>, <code>datetime</code> и другие — всего лишь типы данных, которые хранятся в этом поле.</li></ul><p>Так нафига вообще тогда информационная архитектура, если можно сразу пилить ER-диаграммы и не париться? Да потому что они описывают только один слой IA — слой <strong>реализации хранения </strong>данных (в самом начале статьи мы об этом говорили). Огромный пласт информации, накопленной грамотным подходом к IA, здесь не учитывается. Примеры, политики заполнения и мультиязычности, правила валидации, источники данных и куча всего остального.</p><p>Так что не ER-диаграммами едиными.</p><h2 class="wp-block-heading">Что дальше</h2><p>А дальше мы поговорим о практической работе с сущностями: как их искать, формализовать и поддерживать, немного поговорим о частых ошибках и анти-паттернах. Отдельно я расскажу о том, как из сущностей и их связей формировать навигацию и поиск. Ну и бонусом, в следующих статьях будет несколько шаблонов, чек-листов и даже мини‑RFC для решения по сущностям.</p><p>Подписывайтесь на <a href="https://t.me/shererpro" target="_blank" rel="noreferrer noopener">канал</a>, там будут все новости.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arhitektura-sushchnosti-vol-1/">Информационная архитектура: сущности (теория)</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Антропология старта</title><link>https://sherer.pro/blog/antropologiya-starta/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Mon, 11 Mar 2024 14:13:33 +0000</pubDate><category><![CDATA[Аналитика]]></category><category><![CDATA[Исследования]]></category><category><![CDATA[антропология]]></category><category><![CDATA[лексика]]></category><category><![CDATA[насмотренность]]></category><guid isPermaLink="false">https://sherer.pro/?p=4015</guid><description><![CDATA[<p>Кто из нас не сталкивался с изначальной проектной энтропией? Когда на старте не понимаешь, в какую сторону копать — и в итоге не хочется копать вообще.</p><p>Запись <a href="https://sherer.pro/blog/antropologiya-starta/">Антропология старта</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<h2 class="wp-block-heading">Мы все это делали</h2><p>Каждый, кто хоть раз стоял у истоков нового проекта, помнит это незабываемое чувство. Когда нет ни одной чёткой детали, всё погружено во тьму неопределенности. Когда звено за звеном собираешь все требования и ограничения, а в итоге понимаешь, что звенья собрались не в цепь, а в паутину. Которую ещё только предстоит распутать.</p><p>Ты начинаешь оценивать эти предстоящие объёмы и ужасаешься (ибо первый шаг всегда самый сложный). Ты понимаешь, что вообще ни черта не знаешь о самом проекте, что всё еще только предстоит выяснить — и эта неизвестность пугает ещё больше.</p><p>Одновременно с этим со всех сторон тебя начинают атаковать внешние факторы: стейкхолдеры добавляют коммуникационных проблем и посылают двойные сигналы, команды аналитики и разработки норовят подсунуть свинью в виде необдуманных решений, потенциальная ЦА вдруг оказывается высосанной из пальца (и это ещё не самый плохой расклад), а на рынок внезапно выползает новый прямой конкурент. Список бесконечен и зависит от конкретного проекта и твоего личного везения.</p><p>И вот в этот момент происходит выбор.</p><p>Если проект интересный, то врубается азарт исследователя, и тогда всё хорошо. Коммуникационные проблемы решаются за несколько встреч, двойные сигналы оказываются и не двойными вовсе, команды забирают подсунутых свиней и ждут первичных итогов проектирования, а конкурент становится стимулом для создания новых киллер-фич продукта. И даже неопределённость превращается просто в набор белых пятен, которые надо раскрасить.</p><p>Но бывает и так, что проект как-то не заходит. Ты сомневаешься в его успехе, сама его плоскость тебя не увлекает&#8230; И тогда все описанные выше факторы потихоньку начинают превращаться в поводы и вовсе не браться за работу. Иногда это является действительно верным решением. Работать без мотивации — тухлое дело, 10 упущенных лет из 10.</p><p>Однако частенько есть и другая, крайне неочевидная, причина. Банальная подтасовка фактов. При этом самое обидное, что подобные штуки порой выкидывает не кто-то внешний, типа стейкхолдеров или непрофессиональных коллег — а мы сами, наше подсознание. Как так происходит? Чаще всего виновата именно неизвестность, которой тьма тьмущая на старте любого проекта. Мы можем обладать развитым самосознанием, отдавать себе отчёт в мотивации мельчайших поступков, но инстинкты побороть в состоянии далеко не всегда.</p><h2 class="wp-block-heading">Антропология страха</h2><p>Кроманьонцы боялись неандертальцев, и оттого жестоко их уничтожали. Они были физически слабее, но развитый мозг позволял им создавать орудия, получать больше пищи, использовать зачатки тактики. Их было тупо больше. Неандертальцы в течение тысяч лет яростно сопротивлялись, пачками выкашивая соперников по пищевой цепочке. Обе эволюционные ветки были очень разные, но даже после получения даров Прометея больше, чем друг друга, они боялись только одного — темноты. Отголоски этого страха живы и в нас, причём порой в очень причудливой форме.</p><p>Тьма — это всегда неизвестность. Вылезти ночью из пещеры, отойти далеко от драгоценного костра, или просто допустить неподготовленную ночёвку в глухом лесу — всё это было практически равноценно смерти. Если при свете дня наши предки могли хоть как-то противостоять хищникам (особенно в этом преуспели именно кроманьонцы), то ночью враг мог явиться из-за каждого утеса, дерева, пня.</p><p>Мы генетически боимся неопределенности, в этом нет ничего постыдного. И вполне естественно, что мы всячески стараемся её избегать, бороться с ней всеми доступными способами. Для этого у нас есть сразу несколько механизмов, и один из них — уже упомянутый мною азарт исследователя.</p><h2 class="wp-block-heading">Механизмы</h2><p>В начале проекта неопределенности значительно больше, чем определенности. Наш мозг, обожающий экономить джоули, всегда только рад подсунуть нам самое простое решение. Зачем драться со зверем, если можно убежать? Зачем освещать темноту снаружи, если проще вернуться в пещеру, к ярким языкам костра?</p><p>Единственная достойная причина — это выгода, выживание. Выживет то племя, которое максимально себя обезопасит. А чем больше темноты — тем больше опасность. Если у тебя есть мотивация победить тьму, ты это сделаешь, у тебя врубится на полную мощность тот самый механизм. Если же с мотивацией проблемы, то тебе значительно проще найти причины отказаться от проекта (или пустить его на самотёк), чем бороться с инстинктами. И тут услужливое подсознание с радостью подсунет тебе целый ворох причин: от резко заниженных прелестей новой работы, до усугубления недостатков клиента.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Кто хочет, тот ищет возможности,&nbsp;кто не хочет — ищет причины</p><p><cite>Сократ</cite></p></blockquote><p>Но вся соль в том, что мотивация зависит не только от самого проекта, но и от огромного количества не связанных с ним историй. Даже банальная усталость может легко запустить процесс демотивации — которая затем уже накрутит всё остальное.</p><h2 class="wp-block-heading">Абстракция и её уровни</h2><p>Когда нам приходится рассеивать неопределённость, мы, как правило, делаем это очень точечно. Мы начинаем сразу проектировать детали продукта, мыслим картинками и сценариями.</p><p>Вместо того, чтобы осветить (пусть и тускло) большое пространство возле нашей пещеры, мы предпочитаем прокладывать узкие, но ярко освещённые тропинки к наиболее интересным нам местам. В результате такого подхода мы создаём только иллюзию безопасности. Потому что тьма за пределами наших тропинок никуда не делась, а яркий свет только мешает видеть всё, что не освещено.</p><p>Действуйте поэтапно. Сначала определитесь с фундаментом продукта, очертите его границы, механики и риски. И уже потом начинайте копать вглубь, выявляя мелкие детали и особенности. Свет — это хорошо только в том случае, если он направлен от вас, а не наоборот.</p><h2 class="wp-block-heading">При чём здесь геймификация</h2><p>В свое время Ричард Алан Бартл описал модель сегментации игроков по психотипам, и отдельную роль выделил Исследователям (Explorers), которые тщательно исследуют игровой мир, его механики и тайны. В основе их поведения лежит тот же инстинкт «рассеивания тьмы». Не удивительно, что большинство тех, кто занимается аналитикой и проектированием, имеет существенный перекос в сторону именно этого психотипа. Хороший проектировщик не обретёт покоя, пока в проекте есть белые пятна.</p><p>Но чтобы начать, нужно сделать пресловутый первый шаг, побороть страх темноты азартом исследователя. При этом важно не пытаться обмануть себя (и проектную команду), освещая только те части проекта, которые освещать просто и интересно.</p><p>Запись <a href="https://sherer.pro/blog/antropologiya-starta/">Антропология старта</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>User Story Mapping и функциональная архитектура</title><link>https://sherer.pro/blog/user-story-mapping-i-funkcionalnaya-arxitektura/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Fri, 09 Jul 2021 08:49:47 +0000</pubDate><category><![CDATA[UX/UI]]></category><category><![CDATA[Аналитика]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[гайд]]></category><category><![CDATA[методологии]]></category><category><![CDATA[функциональное проектирование]]></category><guid isPermaLink="false">https://sherer.pro/?p=2985</guid><description><![CDATA[<p>Что общего у функциональной архитектуры и персонажей Купера? Как User Story Mapping решает проблемы со структуризацией требований, стратегией разработки и границами проекта.</p><p>Запись <a href="https://sherer.pro/blog/user-story-mapping-i-funkcionalnaya-arxitektura/">User Story Mapping и функциональная архитектура</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Каждый, кто запускал IT-проекты или участвовал в продуктовых исследованиях, наверняка слышал про метод <a href="https://onezero.medium.com/in-1983-i-created-secret-weapons-for-interactive-design-d154eb8cfd58" target="_blank" rel="noreferrer noopener"><strong>персон Алана Купера</strong></a> и <strong>User Story</strong>. И пусть некоторые считают персон нерабочей и устаревшей методологией — я убеждён, что это всего лишь результат многолетней <a href="https://sherer.pro/blog/personazhi-po-kuperu-kak-diskreditirovat-metodologiyu/" target="_blank" rel="noreferrer noopener">вандализации метода</a>.</p><p>В этой статье я хочу рассказать о том, как «продолжение» User Story может не только улучшить UX продуктов, но и решить кое-какие фундаментальные проблемы их разработки.</p><p>Цифровые продукты редко запускаются гладко. Правки к сценариям, функциональности и макетам зачастую возникают прямо в процессе реализации. Никто никогда не в курсе, куда несётся поезд продуктовой разработки — а обратное чувство, чаще всего, обманчиво.</p><p><strong>Персоны </strong>и <strong>User Story</strong> — это такая прикольная штуковина для того, чтобы погрузить всех участников в проектный процесс, выявить и подсветить истинные задачи пользователей. Однако сами по себе персоны практически не влияют на процесс создания продуктов, лишь на их функциональность. Чего нельзя сказать о следующем этапе развития пользовательских историй — о <strong>User Story Mapping</strong>.</p><p>Об этом подходе написано уже немало, в том числе и на русском языке. Но большинство таких статей (на мой субъективный взгляд) либо весьма поверхностны, либо имеют серьёзный перекос в сторону именно UX, практически игнорируя аспект управления и развития продукта. Однако я искренне благодарен авторам таких статей, ибо понахватал оттуда приличное количество тезисов и умозаключений.</p><h2 class="wp-block-heading">Проблемы</h2><p>Для начала давайте разберём некоторые глобальные трудности и барьеры, возникающие при создании цифровых продуктов.</p><h3 class="wp-block-heading">Требования к продукту плохо структурированы по отношению друг к другу</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6a88e&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6a88e" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="400" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/usm-1.png" alt="" class="wp-image-3010" srcset="https://sherer.pro/content/uploads/2021/07/usm-1.png 1200w, https://sherer.pro/content/uploads/2021/07/usm-1-768x256.png 768w, https://sherer.pro/content/uploads/2021/07/usm-1-1048x349.png 1048w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Нет иерархии и последовательности требований. Не всегда понятно, какая задача какую блокирует и от какой зависит. Чаще всего зависимость задачи проставляется исключительно командой разработчиков или тимлидом — но они не владеют общим видением продукта, руководствуясь только своими представлениями о локальном участке архитектуры. То есть они не видят всю связь, весь flow бизнеса и пользователя целиком. Не тот уровень абстракции.</p><p>Это, разумеется, влияет на глобальную архитектуру, на качество кода и самого продукта, на динамику разработки. Что, в свою очередь, приводит к многократному увеличению стоимости поддержки и развития. </p><p>Каждое требование — это определённая функция или функциональный раздел продукта. Если команда разработки не понимает взаимосвязи между функциями в создаваемой ими системе, то такие проекты гарантированно обречены на «историческое» развитие. Так рождаются огромные «монолиты», которые очень и очень быстро переходят в разряд с трудом поддерживаемых «<a href="https://en.wikipedia.org/wiki/Legacy_code" target="_blank" rel="noreferrer noopener">legacy</a>».</p><h3 class="wp-block-heading">Требования к продукту не приоритизированы с точки зрения ценности для пользователей</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6abb8&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6abb8" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="400" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/usm-2.png" alt="" class="wp-image-3011" srcset="https://sherer.pro/content/uploads/2021/07/usm-2.png 1200w, https://sherer.pro/content/uploads/2021/07/usm-2-768x256.png 768w, https://sherer.pro/content/uploads/2021/07/usm-2-1048x349.png 1048w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Порядок реализации задач формируется по наитию, по сложности разработки, по желанию клиента, по чему угодно — но только не по важности для пользователей. В итоге разработка и выпуск новых версий затягиваются.</p><p>Ядро функциональности, пресловутый MVP, собирается, исходя из представлений команды о продукте. Даже если команда думает, что полагается на результаты исследований — на сложных проектах эти результаты ещё необходимо как-то структурировать и визуализировать. Иначе высока вероятность «рассинхрона», отсутствия единого информационного поля внутри команды. </p><p>Последствия в этом случае весьма печальны, вплоть до полной невостребованности продукта аудиторией.</p><h3 class="wp-block-heading">Отсутствует единое понимание стратегии разработки, последовательности и состава релизов</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6aea8&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6aea8" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="400" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/usm-3.png" alt="" class="wp-image-3012" srcset="https://sherer.pro/content/uploads/2021/07/usm-3.png 1200w, https://sherer.pro/content/uploads/2021/07/usm-3-768x256.png 768w, https://sherer.pro/content/uploads/2021/07/usm-3-1048x349.png 1048w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Отсутствие стратегического подхода влечёт за собой не только архитектурные ошибки (опять), но и заставляет нервничать стейкхолдеров и владельцев продукта. Прогнозы в такой ситуации строить крайне сложно.</p><p>Как это решается в большинстве случаев? Продуктовая команда либо строит лишь краткосрочные планы, либо составляет план релизов буквально «наугад». Однако инвесторы не любят неопределенности. Если вы не можете предоставить им хотя бы примерный таймлайн или просто последовательность и функциональный состав релизов, то у меня для вас плохие новости. Ваш проект рискует остаться без финансирования.</p><p>Кто-то мне скажет, что это не всегда возможно. Часто исследования идут бок о бок с разработкой. Те же гибкие методологии, в конце концов. Однако даже здесь нужно опираться на определённый фундамент, базис. Ну и кроме того, гибкие методологии имеют весьма ограниченный ореол применения.</p><h3 class="wp-block-heading">Функциональные границы проекта очерчены слишком высокоуровнево или даже вовсе отсутствуют</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6b168&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6b168" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="400" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/usm-4.png" alt="" class="wp-image-3013" srcset="https://sherer.pro/content/uploads/2021/07/usm-4.png 1200w, https://sherer.pro/content/uploads/2021/07/usm-4-768x256.png 768w, https://sherer.pro/content/uploads/2021/07/usm-4-1048x349.png 1048w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Бизнес требует внедрения всё новых фич, разработка затягивается, бэклог растёт, команда выгорает. Продукт получается, мягко говоря, странным.</p><p>Случалось ли у вас, что клиент/начальник/инвестор начинал каждую неделю приносить новые функции в проект? И обычный вначале лендинг в итоге превращался в космолёт-монстр, с админкой, функцией телепортации и собственным мобильным приложением?</p><p>Фичи должны добавляться последовательно и обоснованно (см. предыдущие проблемы). Функция не может жить «сама по себе», в отрыве от остальных частей продукта. И вот конечный порядок и взаимосвязь функций системы, состав её компонентов — это и есть границы проекта.</p><h2 class="wp-block-heading">User Story Mapping</h2><p>Как я уже сказал, все эти проблемы (и не только) решают карты историй. Вот вам хорошее определение USM:</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Карта историй работает сразу в двух измерениях: показывает не только приоритет историй, но и то, как они связаны между собой и с более крупными задачами пользователей. Карта помогает команде понять, как можно скомпоновать истории, чтобы получить продукт, готовый к релизу.</p><cite><strong>Крис Симс</strong> (в переводе <em>Ольги Жолудовой</em> и <em>Рината Шайхутдинова</em>)</cite></blockquote><p>По факту, карта историй — это набор <em>упрощённых </em><strong>User Stories</strong>: собранные, отсортированные и приоритизированные. Сама методология простая, на высоком уровне с ней справится даже новичок. Но если копнуть глубже, то там окажется целое поле работы для исследователей, продактов и архитекторов.</p><p>В этой статье в качестве иллюстрации для составления USM мы будем использовать небольшую браузерную игру с программой лояльности какого-нибудь банка. В ней есть регистрация, игровой персонаж, его убежище, сражения и баллы лояльности.</p><p><em>Следующие ниже изображения-схемы могут быть не очень хорошо читаемы на небольших экранах мобильных устройств. В этом случае рекомендую посмотреть их на десктопе или перевернуть смартфон в &#171;ландшафт&#187;.</em></p><h3 class="wp-block-heading">Шаг 1. Выявляем активности</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6b53a&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6b53a" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1201" height="211" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/user-story-mapping-1-activities.jpg" alt="User Story Mapping - активности пользователей" class="wp-image-3017" srcset="https://sherer.pro/content/uploads/2021/07/user-story-mapping-1-activities.jpg 1201w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-1-activities-768x135.jpg 768w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-1-activities-1048x184.jpg 1048w" sizes="auto, (max-width: 1201px) 100vw, 1201px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Активности пользователей</figcaption></figure><p>Сначала нужно собрать список основных <strong>активностей </strong>пользователей. В нашем примере игры их пять:</p><ol class="wp-block-list"><li>Регистрация и логин;</li><li>Работа над аватаром;</li><li>Работа над убежищем;</li><li>Участие в сражении;</li><li>Работа с баллами лояльности.</li></ol><p>Это — ключевые, главные «категории» действий пользователя в игре. Они включают в себя всю остальную деятельность. Если использовать терминологию <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/" target="_blank" rel="noreferrer noopener">функциональной архитектуры</a>, то здесь мы создаём <em>глобальные функциональные разделы</em>.</p><h3 class="wp-block-heading">Шаг 2. Разворачиваем активности в задачи</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6b8a4&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6b8a4" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2449" height="316" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/user-story-mapping-2-tasks.jpg" alt="User Story Mapping - задачи" class="wp-image-3018" srcset="https://sherer.pro/content/uploads/2021/07/user-story-mapping-2-tasks.jpg 2449w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-2-tasks-768x99.jpg 768w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-2-tasks-1048x135.jpg 1048w" sizes="auto, (max-width: 2449px) 100vw, 2449px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Разбивка активностей на задачи</figcaption></figure><p>Теперь мы раскладываем их (активности) на <strong>задачи</strong>. Например, <em>активность</em> «Регистрация и логин» превращается в три <em>задачи</em>:</p><ol class="wp-block-list"><li>Регистрация и логин через соцсети;</li><li>Регистрация и логин через e-mail;</li><li>Восстановление доступа.</li></ol><p>Заметьте, здесь нет отдельно «логина» или «регистрации». Это более глубокий уровень, задачи же — это такие «категории» пользовательских историй. В функциональной архитектуре это тоже <em>функциональные разделы</em>, но уже не глобальные, а обычные.</p><h3 class="wp-block-heading">Шаг 3. Задачи детализируем до конкретных историй</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6bbfe&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6bbfe" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2449" height="871" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/user-story-mapping-3-stories.jpg" alt="User Story Mapping - истории" class="wp-image-3020" srcset="https://sherer.pro/content/uploads/2021/07/user-story-mapping-3-stories.jpg 2449w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-3-stories-768x273.jpg 768w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-3-stories-1048x373.jpg 1048w" sizes="auto, (max-width: 2449px) 100vw, 2449px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Детализация задач историями</figcaption></figure><p>И, наконец, <strong>истории </strong>(жёлтые карточки) — они расположены в порядке приоритета &#8212; сверху критичные, внизу наименее важные. Приоритет обычно выстраивается, исходя из нескольких условий:</p><ul class="wp-block-list"><li>ценность для пользователей;</li><li>ценность для бизнеса;</li><li>сложность реализации.</li></ul><p>Именно в таком порядке: сначала пользователи, потом бизнес, потом технологии. Понятно, что зачастую бизнес-задачи оказываются важнее пользовательских, и в этом случае карточки немножко двигаются. Иногда реалии рынка действительно сильнее влияют на продукт, чем желания пользователей. Аккуратнее с этим, руководствуйтесь здравым смыслом.</p><p>В случае нашего примера, <em>задача </em>&#171;Регистрация и логин через e-mail&#187; разложилась на 2 <em>истории</em>:</p><ol class="wp-block-list"><li>Регистрация с помощью e-mail;</li><li>Логин через e-mail;</li></ol><p>Истории — это <em>функции</em> будущей системы. У них есть взаимосвязи и порядок. Например, мы не можем реализовать функцию <em>&#171;Выбор навыков аватара для улучшения&#187; по результатам сражения</em> до того, как, собственно, реализуем сам <em>&#171;Подбор параметров аватара&#187;</em> в момент создания персонажа.</p><p>В результате этапа мы понимаем, какая задача из каких историй состоит и к какой она относится активности. Мы понимаем, какие истории нужно сделать в первую очередь. Мы можем планировать спринты и релизы.</p><h3 class="wp-block-heading">Шаг 4. Делаем из приоритетов схему релизов</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6bfe7&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6bfe7" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2449" height="1081" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/user-story-mapping-4-releases.jpg" alt="User Story Mapping - релизы" class="wp-image-3021" srcset="https://sherer.pro/content/uploads/2021/07/user-story-mapping-4-releases.jpg 2449w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-4-releases-768x339.jpg 768w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-4-releases-1048x463.jpg 1048w" sizes="auto, (max-width: 2449px) 100vw, 2449px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Разделение задач на релизы</figcaption></figure><p>Напомню, что истории — это всего лишь функции будущей системы. Понимая это, мы просто переносим те истории, которые не критичны или требуют на этом этапе слишком много ресурсов, в следующий релиз. Точно так же можно выделить MVP.</p><p>Например, нам проще сделать логин и регистрацию через соцсети — и регистрацию через e-mail мы отодвигаем на второй релиз. Пользователям не так важна покупка амуниции — и она тоже вылетает из MVP.</p><h3 class="wp-block-heading">Дополнительно: цветовая индикация и структура</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6c2a6&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6c2a6" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2449" height="1081" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2021/07/user-story-mapping-5-structure.jpg" alt="User Story Mapping - структура" class="wp-image-3022" srcset="https://sherer.pro/content/uploads/2021/07/user-story-mapping-5-structure.jpg 2449w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-5-structure-768x339.jpg 768w, https://sherer.pro/content/uploads/2021/07/user-story-mapping-5-structure-1048x463.jpg 1048w" sizes="auto, (max-width: 2449px) 100vw, 2449px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Структура User Story Mapping</figcaption></figure><p>Принято разделять USM на две структурных части:</p><ol class="wp-block-list"><li>Верхняя часть, с активностями и задачами, называется «backbone» (хребет), но я предпочитаю слово «скелет».</li><li>Нижняя часть, истории, называется «тело».</li></ol><p>И да, цветом стикеров можно помечать отдельные категории событий/действий, дополнительную важность (например, для бизнеса), типы пользователей и так далее. Всё, что посчитаете важным.</p><h2 class="wp-block-heading">Итог</h2><p>С помощью User Story Mapping можно не только планировать новые продукты, но и улучшать уже существующие &#8212; например, приоритизировать бэклог.</p><p>USM позволяет на очень простом визуальном языке донести до всех участников команды не только функциональный состав продукта, но и порядок проектирования и реализации. Если вы хотите выполнить глубокое функциональное проектирование будущего продукта, то User Story Mapping — отличное начало для этого.</p><p>Помните только, что слепое следование методологиями убивает профессионализм. Комбинируйте, не бойтесь отойти от канонов, если уверены в своих действиях.</p><p>Запись <a href="https://sherer.pro/blog/user-story-mapping-i-funkcionalnaya-arxitektura/">User Story Mapping и функциональная архитектура</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Разгоняем аналитику через систему триггеров</title><link>https://sherer.pro/blog/razgonyaem-analitiku-cherez-sistemu-triggerov/</link><comments>https://sherer.pro/blog/razgonyaem-analitiku-cherez-sistemu-triggerov/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Sat, 13 Feb 2021 12:46:19 +0000</pubDate><category><![CDATA[Аналитика]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[гайд]]></category><guid isPermaLink="false">https://sherer.pro/?p=2893</guid><description><![CDATA[<p>Все мы знаем, что данные лучше гипотез, а успех любого проекта строится на грамотной аналитике. Что начинать собирать информацию о том, как реальные люди используют ваш продукт, следует сразу после его запуска.</p><p>Запись <a href="https://sherer.pro/blog/razgonyaem-analitiku-cherez-sistemu-triggerov/">Разгоняем аналитику через систему триггеров</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Все мы знаем, что данные лучше гипотез, а успех любого проекта строится на грамотной аналитике. Что начинать собирать информацию о том, как реальные люди используют ваш продукт, следует сразу после его запуска. Однако в реальности мало кто начинает работать над аналитической стратегией на ранних этапах проектирования. Чаще всего решения о том, какие данные и события отправлять в эту самую аналитику, принимаются сильно позже. О развитии аналитической стратегии, к сожалению, редко задумываются вообще.</p><p>В этой статье мы поговорим о том, какие последствия это за собой влечёт и что можно сделать, чтобы упростить себе жизнь, улучшить архитектуру и ускорить развитие продукта.</p><p>Вот только сперва я хотел бы быстренько синхронизировать с вами определения.</p><h2 class="wp-block-heading">Аналитическая стратегия</h2><p>Одна из серьёзнейших проблем в IT – это терминология. Бешеная скорость развития технологий и методик заставляет термины изменяться и вырастать из своих прежних определений. Так было с UX, с персонами, с API и даже с названием множества IT-профессий.</p><p>Говоря об&nbsp;<em><a href="https://sherer.pro/blog/analiticheskaya-strategiya-cifrovyx-produktov/">аналитической стратегии</a></em>, я подразумеваю совокупность подходов и решений, направленных на сбор и анализ данных о пользователях, включая данные с клиентских устройств. Сюда входит не только отправка переходов, событий, рекламных идентификаторов и прочего во внешние системы аналитики, но и работа с системами внутренними.</p><p>Например, с помощью связки <a href="https://amplitude.com/" target="_blank" rel="noreferrer noopener nofollow">Amplitude</a> и <a href="https://branch.io/" target="_blank" rel="noreferrer noopener nofollow">Branch</a> мы собираем сквозную аналитику в мобильном приложении, оцениваем конечную эффективность каналов привлечения, косвенно выясняем удобство нашего интерфейса и определяем качество конверсии. Тогда как с помощью внутренней аналитики мы можем выяснить, к примеру, процент регулярно платящих клиентов и скорректировать прогнозы окупаемости. Или определить средний уровень заполняемости профиля пользователя и принять меры по его улучшению.</p><p>Работа над аналитической стратегией заслуживает отдельной статьи. Если это кажется вам интересным, пишите в комментариях. Может быть, имеет смысл сделать на эту тему отдельный лонгрид.</p><p>Итак, если с этой частью терминологии мы определились, идём дальше.</p><h2 class="wp-block-heading">Проблема обновлений</h2><p>Представим себе условного дизайнера/проектировщика/аналитика. Он работает над крупным проектом уже не первый месяц. Знает все ключевые точки сценариев, он понимает, что и когда нужно отправлять в мобильную и веб-аналитику. Он умный и опытный, и поэтому с лёгкостью составляет список таких переходов и событий, уже заранее простраивая многосоставные цели в метриках.</p><p>Приходит время, и он передаёт документацию в разработку. Представим даже, что он осуществляет авторский надзор, и все требования к продукту, включая аналитические, выполняются неукоснительно.</p><p>Что происходит дальше? Продукт запускается, начинают появляться первые клиенты. Некоторое время данных из аналитики хватает, но потом возникает необходимость расширить или вовсе поменять список отправляемых эвентов. Например, в одной из веток ключевого сценария вдруг начинает падать конверсия – и нужно срочно выяснить, почему. Аналитик приходит к разработчикам и просит добавить к отправке пару событий на странице профиля.</p><p>И вот тут начинается самое интересное. Добавить события не сложно, сложнее заставить всех пользователей обновить приложение, чтобы эти события там появились.</p><p>И если вы думаете, что это касается только мобайла, то зря: скрипты веб-приложений кэшируются в браузерах пользователей, и не всегда изменения появляются у них мгновенно. Иногда реально проходят недели, прежде чем кэш устареет. Конечно, можно изменить настройки заголовков сервера или добавить версионность скриптам, но это в итоге сказывается на скорости загрузки страниц и, как следствие, на оценке поисковыми системами, типа Google или Яндекса.</p><p>С мобильными приложениями вообще мрак. Допустим, наши разработчики внесли нужные изменения. Они отправляют новую версию на ревью, и она благополучно оседает там на несколько дней, а то и недель. Пока AppStore и Google Play проводят проверку приложения, данные, разумеется, не собираются. И даже после этого пользователи скачивают обновление не сразу, процесс может затянуться надолго. За это время появляются новые требования к сбору, и цикл повторяется.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6d417&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6d417" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1644" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/mobile-update-sheme.png" alt="" class="wp-image-3897" srcset="https://sherer.pro/content/uploads/2023/12/mobile-update-sheme.png 2096w, https://sherer.pro/content/uploads/2023/12/mobile-update-sheme-1048x822.png 1048w, https://sherer.pro/content/uploads/2023/12/mobile-update-sheme-768x602.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p>Такой подход заставляет аналитиков, маркетологов и владельцев продукта находиться в перманентном состоянии ожидания.</p><p>Ну и что, скажете вы. Все уже привыкли к такому раскладу, в нём нет ничего необычного или плохого. А вот и есть. Мало того, что при этом падает условная эффективность специалистов, так ещё и существенно замедляется скорость развития продукта – что в динамичных условиях рынка чаще всего лупит по конкурентоспособности.</p><h2 class="wp-block-heading">Ошибочное решение</h2><p>Самый простой способ, который сразу приходит на ум – это заранее заложить в отправку&nbsp;<strong>все&nbsp;</strong>события, даже самые незначительные. Авось, понадобятся. Разумеется, так делать нельзя.</p><p>Во-первых, отправка событий, чаще всего, стоит каких-то денег: например, тот же Amplitude позволяет бесплатно отправлять только 10 миллионов эвентов в месяц. Это только кажется много: если у вас даже 2 тысячи ежедневных пользователей, вы исчерпаете этот лимит, отправив с каждого всего по 170 событий в сутки, включая переходы между экранами.</p><p>Во-вторых, частая отправка данных повышает нагрузку на сеть (зачастую мобильную), в разы увеличивает сложность обработки ошибок и в целом ухудшает архитектуру продукта.</p><p>Ну и в-третьих, излишняя информация будет мешать грамотной аналитике. Данные – не деньги, их вполне может быть&nbsp;<em>слишком много</em>. &#171;Мусор&#187; в аналитических отчётах мешает принимать взвешенные решения, на обработку большого объёма уходит больше ресурсов.</p><p>В итоге получается, что даже плотное &#171;усеивание&#187; интерфейса событиями не приводит к желаемому результату.</p><h2 class="wp-block-heading">Система триггеров</h2><p>А теперь представьте, что изменять список отправляемых в аналитику событий можно в реальном времени. То есть действительно в реальном: как только пользователь открывает ваш сайт или приложение, система сама подтягивает актуальный список эвентов.</p><p>Вот как должна выглядеть идеальная схема:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6d7bc&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6d7bc" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="768" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/good-mobile-update-sheme.png" alt="" class="wp-image-3898" srcset="https://sherer.pro/content/uploads/2023/12/good-mobile-update-sheme.png 2096w, https://sherer.pro/content/uploads/2023/12/good-mobile-update-sheme-1048x384.png 1048w, https://sherer.pro/content/uploads/2023/12/good-mobile-update-sheme-768x281.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Сбор новых данных доступен почти сразу после выявления потребности в них</figcaption></figure><p>На самом деле, сделать это просто, понадобится всего 5 этапов, 3 из которых и так осуществляется большинством аналитиков.</p><h3 class="wp-block-heading">Формирование списка претендентов</h3><p>В самом начале мы формируем полный список событий, которые нам когда-либо могут понадобиться. Сюда можно включать даже совсем мелкие эвенты, вроде ошибок заполнения полей профиля.</p><p>Заметьте, мы не отправляем их сразу в аналитику, а просто составляем перечень. Это можно сделать где-нибудь в Google Sheets или любой другом табличном редакторе.</p><h3 class="wp-block-heading">Присваивание идентификаторов</h3><p>Затем мы присваиваем каждому событию внутренний идентификатор. Важно, чтобы такие идентификаторы были действительно уникальными для каждого эвента. Желательно также, чтобы они собирались по некоторой схеме – так будет проще потом с ними работать.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Опытным аналитикам эта работа во многом уже знакома, но я всё равно о ней расскажу.</p></blockquote><p>Вы можете придумать собственные правила создания таких айдишников, или воспользоваться моими, сформированными на базе событий из Google Analytics:</p><ul class="wp-block-list"><li>Первым указывается инициатор события. Это могут быть, например: &#171;посетитель&#187;, &#171;покупатель&#187; или система.</li><li>Далее указывается название самого действия (например, &#171;шэринг через соцсети&#187; или просмотр).</li><li>После этого можно добавить&nbsp;ярлык&nbsp;– какую-то особенность события, если оно, к примеру, может быть выполнено несколькими способами или касаться разных типовых объектов.</li><li>Иногда в конце нужно установить&nbsp;значение. Это числовой параметр, как правило – динамический. Например:&nbsp;&#171;id поста&#187;&nbsp;или&nbsp;&#171;время загрузки видео&#187;.</li><li>Все идентификаторы пишутся на английском языке в нижнем регистре;</li><li>Метки разделяются нижним подчёркиванием, а слова внутри самих меток – с помощью тире.</li></ul><p>Пример составленного таким образом идентификатора:</p><p><code>user_post_social-share_facebook_235</code></p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6dc26&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6dc26" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="708" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/id-structure.png" alt="" class="wp-image-3899" srcset="https://sherer.pro/content/uploads/2023/12/id-structure.png 2096w, https://sherer.pro/content/uploads/2023/12/id-structure-1048x354.png 1048w, https://sherer.pro/content/uploads/2023/12/id-structure-768x259.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption"><em>Структура идентификатора события шэринга в Facebook статьи с ID 235</em></figcaption></figure><h3 class="wp-block-heading">Приоритизация списка</h3><p>Следующим этапом мы выясняем, какие события точно будут нам нужны сразу после запуска продукта. Как правило, это все переходы между экранами и какие-то ключевые действия пользователя, вроде добавления товара в корзину.</p><p>Эти события и переходы мы станем собирать в первую очередь – но это вовсе не значит, что такой список является окончательным. Если нам понадобится, то уже через несколько дней после релиза мы сможем изменить перечень эвентов.</p><p>Пока что всё знакомо и понятно, да? Первые три шага в той или иной мере выполняет каждый аналитик. Интересное начинается на шаге четвёртом.</p><h3 class="wp-block-heading">Работа с кодом и конфигами</h3><p>Итак, у нас есть на руках отсортированная по важности таблица со списком&nbsp;<strong>событий-триггеров</strong>. Мы понимаем, в какой момент мы шлём каждое, у всех уникальные и логично сформированные идентификаторы. Самое время обратиться к разработчикам.</p><p>Наши программисты делают простое упражнение: они пишут отдельную функцию, которая может быть вызвана из любого места приложения. Эта&nbsp;<em>триггерная</em>&nbsp;функция принимает в себя только один параметр – идентификатор события. Когда она вызывается, то проверяет наличие идентификатора в списке необходимых к отправке – и, если он там присутствует, отправляет данные в аналитику. Конкретные параметры для отправки она может брать прямо из айдишника или из связанного с ним массива (для тех, кто любит заморачиваться).</p><p>Разработчикам остаётся повесить эту функцию на все указанные в таблице триггеры, а рядышком положить файлик конфигурации со списком&nbsp;<em>&#171;активных&#187;</em>&nbsp;событий, на которые нужно реагировать – именно к нему будет обращаться функция, когда потребуется проверить, надо ли отправлять эвент.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6df8e&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6df8e" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1472" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/trigger-start.png" alt="" class="wp-image-3900" srcset="https://sherer.pro/content/uploads/2023/12/trigger-start.png 2096w, https://sherer.pro/content/uploads/2023/12/trigger-start-1048x736.png 1048w, https://sherer.pro/content/uploads/2023/12/trigger-start-768x539.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><h3 class="wp-block-heading">Добавление механизма обновления</h3><p>Теперь нам остаётся просто сделать так, чтобы этот файлик, в котором указан текущий перечень событий для отправки, получался с сервера сразу после инициализации нашего приложения. Разумеется, этот процесс выполняется в фоновом режиме и не должен влиять на скорость запуска.</p><p>Мы можем пойти дальше и сперва просто запрашивать с сервера версию этого файла – и если она отличается от сохранённой локально, то уже тогда получать весь обновлённый массив событий. В ряде случаев мы можем вообще объединить этот файл с остальной конфигурацией приложения.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6e26b&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6e26b" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1472" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/trigger-start-update.png" alt="" class="wp-image-3901" srcset="https://sherer.pro/content/uploads/2023/12/trigger-start-update.png 2096w, https://sherer.pro/content/uploads/2023/12/trigger-start-update-1048x736.png 1048w, https://sherer.pro/content/uploads/2023/12/trigger-start-update-768x539.png 768w" sizes="auto, (max-width: 2096px) 100vw, 2096px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption"><em>Схема обновления списка событий, которые надо отслеживать</em></figcaption></figure><p>Всё. Теперь, если нам нужно поменять события для отправки, мы просто заменяем/правим конфиги на сервере – и приложение само понимает, что теперь в аналитику нужно слать новые данные. Profit.</p><h2 class="wp-block-heading">Вместо эпилога</h2><p>Я знаю, что некоторые компании и даже отдельные аналитики уже применяют такой или подобный подход. Это неудивительно, я сам его использую уже больше пяти лет подряд. Однако по роду деятельности мне приходилось и приходится работать с большим количеством проектов и команд, а система триггеров или её аналоги встречаются крайне, крайне редко. Хотя реализация её не стоит каких-то колоссальных или даже просто всерьёз значимых ресурсов.</p><p>Надеюсь, что теперь ситуация хотя бы немножко изменится. Кому-то станет проще обновлять аналитические данные, а некоторые проекты будут развиваться чуть более динамично.</p><p>Запись <a href="https://sherer.pro/blog/razgonyaem-analitiku-cherez-sistemu-triggerov/">Разгоняем аналитику через систему триггеров</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/razgonyaem-analitiku-cherez-sistemu-triggerov/feed/</wfw:commentRss><slash:comments>2</slash:comments></item><item><title>Аналитическая стратегия цифровых продуктов</title><link>https://sherer.pro/blog/analiticheskaya-strategiya-cifrovyx-produktov/</link><comments>https://sherer.pro/blog/analiticheskaya-strategiya-cifrovyx-produktov/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Sat, 13 Feb 2021 12:45:12 +0000</pubDate><category><![CDATA[Аналитика]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[гайд]]></category><guid isPermaLink="false">https://sherer.pro/?p=2883</guid><description><![CDATA[<p>Пост-инструкция о том, как грамотно составить аналитическую стратегию продукта. И что вообще это такое — аналитическая стратегия.</p><p>Запись <a href="https://sherer.pro/blog/analiticheskaya-strategiya-cifrovyx-produktov/">Аналитическая стратегия цифровых продуктов</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Это будет пост-инструкция. Вы можете распечатать его и повесить на стенку в аналитическом отделе (если он у вас есть) или дома над кроватью (если весь аналитический отдел – только вы). В любом случае, этот текст может оказаться полезен всем, кто так или иначе сталкивается с аналитикой: и не важно, мобильных, десктопных или веб-приложений.</p><p>Дело в том, что моё недавнее мини-исследование показало, что на самом деле аналитикой на начальном уровне развития проекта заморачивается относительно небольшой процент компаний. Даже крупные игроки зачастую сперва релизят сервис, и только потом начинают думать о том, какую же информацию им нужно собирать. Думаю, не стоит объяснять, чем чреват недостаток реальных данных на старте продукта: от снижения динамики развития до полного провала пользовательских сценариев.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>В любом IT-проекте <em><strong>рано или поздно</strong></em> наступает этап формирования <strong>аналитической стратегии</strong>. Даже если вы так её и не называете.</p></blockquote><p>В какой-то момент принимается ответственное решение: какие данные скармливать прожорливому богу аналитики, а какие пусть остаются несобранными (опытные ребята знают, что переизбыток информации почти так же вреден, как и её отсутствие).</p><p>Главная проблема здесь в том, что чаще всего это происходит именно&nbsp;<em>поздно</em>, а не рано.</p><h2 class="wp-block-heading">Что такое аналитическая стратегия</h2><p>Как и большинство терминов в IT, этот тоже сильно размыт. Кто-то под АС будет подразумевать аналитику рынка, кто-то – отслеживание нагрузки на серверные мощности и её балансировку.</p><p>То, о чём я хочу рассказать в этой статье, ещё называют <em>аналитическим планом, деревом метрик</em> и тп. Суть одна: <strong>аналитическая стратегия</strong> – это <strong>набор переходов, событий и метрик, автоматически фиксируемых в вашем продукте</strong>. Набор, составленный с учётом технологических возможностей, бизнес-целей и задач пользователей; разделённый на внешнюю и внутреннюю части; задокументированный, администрируемый и развиваемый.</p><p>Немного непонятно, да? Давайте расскажу чуть подробнее.</p><h2 class="wp-block-heading">Зачем нужна стратегия</h2><p>Причина здесь, на самом деле, простая: затем же, зачем вообще нужны стратегии. Чтобы развивать продукт. Чтобы иметь возможность принимать взвешенные решения, основываясь на реальных данных, а не на гипотезах.</p><p>Чтобы составлять цели (в той же Яндекс.Метрике, например), исходя из реальных задач бизнеса и пользовательских потребностей. А не просто отслеживать &#171;конверсию в покупку&#187;. Без чёткого понимания, что и на каком этапе следует фиксировать, аналитика зачастую превращается в &#171;собираем из того, что есть&#187;.</p><p>Порой оказывается, что вносить изменения в список фиксируемых событий сложно и дорого. Что для проверки простой гипотезы проще сделать поверхностные выводы из одних только переходов между страницами. Это грустно и мне не нравится такой подход. Я надеюсь, что этот текст поможет хоть кому-то избежать популярных аналитических ошибок.</p><h2 class="wp-block-heading">Шесть стратегических этапов</h2><p>Для построения грамотной стратегии чаще всего достаточно выполнить лишь шесть базовых действий, о которых я и расскажу ниже. Иногда шести недостаточно – все проекты разные, и где-то необходимо, например, ещё собирать аналитику с партнёров. Но вы люди неглупые, сами разберётесь.</p><p>Модернизируйте схему, руководствуясь здравым смыслом и логикой.</p><h3 class="wp-block-heading">Определяем конечную цель</h3><p>У каждого проекта есть конкретные задачи. Бизнесу необходимо достигать своих целей, пользователям – решать конкретные потребности. Аналитику достаточно лишь собрать цели бизнеса, разложить их на более мелкие задачи (последовательные и/или параллельные), выяснить промежуточные и финальные задачи клиента/пользователя.</p><p>Чаще всего, эти данные можно взять готовыми – у бизнес-аналитиков, юиксеров и иже с ними. По факту, это и есть <strong>ключевые метрики</strong> вашего продукта. На них мы и будем концентрироваться в дальнейшей работе.</p><h3 class="wp-block-heading">Составляем аналитическую карту</h3><p>В определённый момент на проекте формируются более или менее окончательные пользовательские сценарии. Сценарии эти, помимо прочего, включают в себя ключевые точки взаимодействия (например, поиск в каталоге, добавление в корзину). Вот эти ключевые точки и станут для нас <strong>основными пользовательскими метриками</strong>.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Если у вас есть под рукой подробный CJM или UJM вашего продукта, то задача упрощается в разы.</p></blockquote><p>Теперь нам достаточно провести между всеми такими метриками взаимосвязи и иерархию. Определить, какие метрики являются родительскими, а какие дочерними; какие могут быть вызваны в любом месте интерфейса, а для каких необходим ряд дополнительных действий.</p><p>Важно приоритизировать события, и собирать только те, которые действительно будут нужны на старте. Остальные не выбрасывайте, они нам ещё пригодятся.</p><p>И да, здесь же прорабатываем сквозную аналитику (например, эффективность каналов привлечения).</p><h3 class="wp-block-heading">Разделяем внешнюю и внутреннюю аналитики</h3><p>Однако пользовательская аналитика – это ещё не всё. Есть ещё маркетинг и банальное финансовое прогнозирование. Зачастую нужно понимать, достигаются или нет конкретные бизнес-показатели.</p><p>Например, процент пользователей, подключивших рекуррентные (регулярно повторяющиеся) платежи может быть выше среди тех, кто посмотрел обучающее видео в личном кабинете – и бизнесу однозначно следует это знать. Однако слать во внешнюю аналитику финансовую информацию точно не стоит, такие данные должны храниться внутри системы. Вообще, все чувствительные или не-обезличенные данные нужно хранить внутри своей системы – это, думаю, очевидно.</p><p>Таким образом, на этом шаге мы не только разделяем внешнюю и внутреннюю аналитики, но и придумываем, как их подружить. Это может стать нетривиальной задачей, на самом деле.</p><h3 class="wp-block-heading">Формируем систему триггеров</h3><p>Продукты развиваются, аналитика развивается вместе с ними. Вчера нас не интересовали действия пользователя в настройках профиля, а завтра нам нужно улучшить конверсию в рассылку – и критически важно становится собирать клики на чекбоксы.</p><p>Я уже писал о системе триггеров, не стану подробно её расписывать снова, ссылка будет в конце статьи. Если сильно упростить, то здесь мы совершаем набор действий, направленный на ускорение последующего внесения изменений в список собираемых данных. Присваиваем идентификаторы, отмечаем важные, ставим задачу разработчикам, не забываем про внешние факторы и внутренние системы.</p><h3 class="wp-block-heading">Определяемся с инструментарием</h3><p>Крайне важный момент, который многие упускают. Аналитика просто так не собирается. Хорошо, если у вас простой интернет-магазин, и вам достаточно одной только Google Analytics. С мобильными приложениями, например, сложнее. Или с финтехом, в котором вообще подключение внешних аналитических систем крайне не рекомендуется (здесь нужно использовать self-hosted системы, которые собирают и хранят все данные непосредственно на ваших серверах).</p><p>Помимо вездесущих Google Analytics и Яндекс.Метрики есть ещё огромное количество других инструментов. Например, <a href="https://amplitude.com/" target="_blank" rel="noreferrer noopener">Amplitude</a> и <a href="https://branch.io/" target="_blank" rel="noreferrer noopener">Branch</a> для сквозной мобильной аналитики, <a href="https://matomo.org/" target="_blank" rel="noreferrer noopener">Matomo</a> для self-hosted решений.</p><h3 class="wp-block-heading">Документируем, администрируем</h3><p>Без грамотной и полной документации уже через месяц после запуска вы сами не вспомните, что и куда слали. А учитывая высокую динамику развития большинства продуктов, ваши таблицы могут устареть ещё быстрее. Документация по аналитической карте, системе триггеров и способах управления этим должна быть всегда актуальной – это должно стать одним из признаков качества работы проектного аналитика.</p><p>Будут ошибки, несостыковки в сценариях. Данные станут пропадать из-за программных недоработок и невнимательности. Графики начнут врать, бизнес принимать неверные решения. Это реальность, к сожалению. Ни один аналитический проект не рождается сразу идеальным – и чем он сложнее, тем больше поначалу будет подобных ошибок. Аналитику нужно администрировать. Исправлять ошибки, модернизировать отчёты и графики.</p><h2 class="wp-block-heading">Вместо итогов</h2><p>Я старался быть кратким, ибо эта статья впервые публиковалась на Дзене, а формат Дзена не особо поощряет лонгриды. Да и вы, читатели, их тоже не сильно жалуете. Если у вас остались вопросы, если вы хотите примеров, если вдруг с чем-то не согласны – велкам в комменты. Они всё стерпят, а мне важна ваша обратная связь.</p><p>Запись <a href="https://sherer.pro/blog/analiticheskaya-strategiya-cifrovyx-produktov/">Аналитическая стратегия цифровых продуктов</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/analiticheskaya-strategiya-cifrovyx-produktov/feed/</wfw:commentRss><slash:comments>2</slash:comments></item><item><title>Информационная архитектура: пример и типизация</title><link>https://sherer.pro/blog/informacionnaya-arxitektura-primer-i-tipizaciya/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Fri, 08 Jan 2021 11:47:09 +0000</pubDate><category><![CDATA[UX/UI]]></category><category><![CDATA[Аналитика]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[гайд]]></category><category><![CDATA[информационная архитектура]]></category><guid isPermaLink="false">https://sherer.pro/?p=2863</guid><description><![CDATA[<p>На примере реального некоммерческого проекта разбираем проблему типизации данных в информационной архитектуре. </p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arxitektura-primer-i-tipizaciya/">Информационная архитектура: пример и типизация</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p><strong><em>Дисклеймер</em></strong><em>: если вы не знаете, что такое </em><strong><em>информационная архитектура</em></strong><em>, то крайне рекомендую сперва прочитать <a href="https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/">вот этот</a> мой пост, а потом уже вернуться сюда. Иначе крайне высока вероятность того, что изложенный ниже текст не принесёт вам особенной пользы.</em></p><h2 class="wp-block-heading">О чём статья</h2><p>В первую очередь, речь пойдёт о проблеме информационной типизации в IT-проектах. В частности &#8212; о типизации конкретных свойств информационных сущностей. Однако рассказать об этом в отрыве от конкретики вряд ли получится, а если и получится, то выйдет долго и скучно. Поэтому в этой статье мы сперва разберём конкретный пример реального проекта, а уже затем сделаем кое-какие выводы.</p><h2 class="wp-block-heading">Типизация</h2><p><em>В языках программирования есть понятия &#171;сильной&#187; и &#171;слабой&#187;, &#171;статической&#187; и &#171;динамической&#187; типизаций. Если несколько упростить, то &#171;типизация&#187; диктует, как именно заполняются переменные в коде: можно ли одну и ту же переменную в разные периоды времени наполнить то текстом, то числом, то датой и тд.</em></p><p>Если с языками программирования всё более или менее ясно, то при работе с информационной архитектурой продукта типизацией мало кто заморачивается. Хотя именно она часто определяет часть возможностей к развитию продукта.</p><p>Информационные архитекторы, чаще всего, выполняют свою работу &#171;по наитию&#187; (разумеется, называя это &#171;логикой&#187; и &#171;опытом&#187;). Наверное, в этом нет ничего плохого или критичного &#8212; так делают все, и даже сложные продукты как-то создаются, живут и развиваются. Однако мы же хотим сделать мир лучше и совершеннее, не правда ли?</p><h2 class="wp-block-heading">Пример проекта</h2><p>У нас есть реальный проект, работа над которым ведётся прямо сейчас, пока пишется эта статья. Проект некоммерческий, никаких NDA. Плюс, он попутно выполняет некоторые образовательные цели &#8212; на нём обкатывает навыки информационного и функционального проектирования талантливая Евгения Шамрай.</p><h2 class="wp-block-heading">Информационная структура</h2><p>В проекте есть несколько информационных сущностей, у каждой есть некоторые свойства. Все сущности связаны между собой: какие-то напрямую, какие-то опосредованно.</p><p>Если попробовать изобразить иерархию сущностей графически, то получится что-то вроде этого:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6fa8c&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6fa8c" class="wp-block-image aligncenter size-large size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1048" height="636" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/ia-example-sheme-1048x636.png" alt="" class="wp-image-3893" srcset="https://sherer.pro/content/uploads/2023/12/ia-example-sheme-1048x636.png 1048w, https://sherer.pro/content/uploads/2023/12/ia-example-sheme-768x466.png 768w" sizes="auto, (max-width: 1048px) 100vw, 1048px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button></figure><p></p><ol class="wp-block-list"><li><strong>Инфоблок</strong> &#8212; самая низкоуровневая сущность, &#171;молекула&#187; информационной архитектуры, содержащая произвольную информацию (например, текст, цитату, изображение и тп). Из инфоблоков, собственно, и строится почти вся контентная часть продукта.</li><li><strong>Год</strong> &#8212; статическая среднеуровневая сущность, которая объединяет <em>инфоблоки </em>в разрезе определённых лет. Они единые для всех <em>композиторов</em>, но конкретные <em>годы </em>у конкретных <em>композиторов</em> могут не совпадать.</li><li><strong>Период</strong> &#8212; уникальная для каждого композитора среднеуровневая сущность, проходящая через все <em>слои</em> и объединяющая <em>годы</em> в определённый этап жизни <em>композитора</em>.</li><li><strong>Слой </strong>&#8212; статическая информационная сущность, объединяющая разные <em>периоды </em>в некий тематический срез творчества композитора. Слоёв ограниченное количество, они обязательны и одинаковы для всех <em>композиторов</em>.</li><li><strong>Композитор </strong>&#8212; высокоуровневая, главная сущность проекта.</li></ol><p>Если рассматривать эту модель как плоскую, то получается, что внутри одного <em>композитора </em>находится произвольное количество <em>инфоблоков</em>, которые объединяются в <em>годы</em>, которые объединяются в <em>периоды</em>, которые объединяются в <em>слои</em>.</p><p>У каждой сущности есть свои свойства. Мы не будем детально перечислять и описывать все такие свойства, так как это выходит за рамки темы статьи. Но мы помним, что у каждой сущности в проекте всегда есть как минимум одно свойство: внутренний <em>идентификатор</em> (уникальный для каждого <em>экземпляра </em>этой сущности).</p><h2 class="wp-block-heading">Навигационная модель</h2><p>Схема навигации в примере максимально простая:</p><ul class="wp-block-list"><li>Есть главная страница, на ней перечислены <em>композиторы</em>.</li><li>Внутри раздела каждого композитора есть список <em>слоёв</em>.</li><li>Каждый <em>слой </em>представлен отдельной страницей, на которой в иерархическом порядке расположены <em>периоды</em>, а в них &#8212; <em>годы</em>.</li></ul><p>Внутри каждого <em>года </em>может находится произвольное количество <em>инфоблоков</em> &#8212; я не стал их отображать на схеме, чтобы не усложнять восприятие:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f6feb5&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f6feb5" class="wp-block-image aligncenter size-large size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1048" height="691" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/ia-example-navigation-1048x691.png" alt="" class="wp-image-3894" srcset="https://sherer.pro/content/uploads/2023/12/ia-example-navigation-1048x691.png 1048w, https://sherer.pro/content/uploads/2023/12/ia-example-navigation-768x506.png 768w" sizes="auto, (max-width: 1048px) 100vw, 1048px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Визуализированная навигационная модель</figcaption></figure><h2 class="wp-block-heading">Под капотом</h2><p>Важно понимать, как именно будет работать наша система &#8212; без этого зачастую невозможно выяснить все свойства и связи сущностей. Здесь мы уже одной ногой ступаем на зыбкую почву <a href="https://sherer.pro/blog/dizajn-dannyh-chast-3-menjaemsja/">дизайна данных</a>, но без этого никак. Мы должны построить схему обмена и формирования информации в нашем продукте.</p><figure class="wp-block-pullquote"><blockquote><p><strong>Информационная модель</strong> фиксирует сущности/свойства/связи (что есть), тогда как <strong>дата-модель</strong> — физическое хранение и индексы (как реализуем). В примере мы сознательно показываем оба слоя, чтобы не терять контекст.</p></blockquote></figure><p><strong>В нашем случае логика такова:</strong></p><ol class="wp-block-list"><li>пользователь загружает страницу конкретного <em>слоя</em> на сайте;</li><li>браузер делает запрос к серверу, в котором указывает идентификатор этого <em>слоя </em>и идентификатор <em>композитора;</em></li><li>сервер принимает эти параметры и делает соответствующий запрос в базу данных;</li><li>в результате у него появляется массив <em>инфоблоков</em>, которые ему теперь нужно отсортировать.</li></ol><p><strong>Как же происходит сортировка?</strong> Здесь тоже всё просто:</p><ol class="wp-block-list"><li>все <em>инфоблоки </em>разделяются на <em>периоды</em>;</li><li><em>периоды </em>сортируются по порядку;</li><li>внутри <em>периодов </em>происходит объединение <em>инфоблоков</em> по <em>годам</em>;</li><li><em>годы </em>также сортируются по порядку внутри <em>периодов</em>;</li><li>внутри каждого <em>года</em> по порядку сортируются сами <em>инфоблоки</em>.</li></ol><p>В результате в браузер пользователя прилетает <strong>многомерный массив</strong>, который потом просто разбирается на странице.</p><h2 class="wp-block-heading">Связи сущностей</h2><p>Как я уже говорил, все сущности связаны. Но связь эта не всегда прямолинейна.</p><p>Чтобы связать информационные элементы, к одной сущности нужно прикрепить ссылку на другую. В нашем случае &#8212; к &#171;дочерней&#187; нужно прикрепить ссылку на &#171;родительскую&#187;. Делать это правильнее (и проще) всего как раз с помощью идентификаторов.</p><ul class="wp-block-list"><li><strong>Композитор </strong>&#8212; главная и независимая сущность.</li><li><strong>Слои </strong>единые для всех <em>композиторов</em> и вообще &#8212; для всего проекта, они ни от чего не зависят.</li><li><strong>Период </strong>у нас уникален для каждого <em>композитора</em>, а значит, ссылается на него (имеет в своих свойствах идентификатор того <em>композитора</em>, которому принадлежит).</li><li><strong>Годы </strong>тоже едины для всего проекта, независимы от остальных сущностей.</li><li>И только <strong>инфоблоки</strong>, как низшая сущность, зависят от всех остальных информационных элементов системы. У них в свойствах прописаны идентификаторы всех остальных сущностей.</li></ul><p>Вот так выглядит схема зависимостей в нашем примере:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d8be2f703e4&quot;}" data-wp-interactive="core/image" data-wp-key="69d8be2f703e4" class="wp-block-image aligncenter size-large size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="1048" height="181" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://sherer.pro/content/uploads/2023/12/ia-example-relations-1048x181.png" alt="" class="wp-image-3895" srcset="https://sherer.pro/content/uploads/2023/12/ia-example-relations-1048x181.png 1048w, https://sherer.pro/content/uploads/2023/12/ia-example-relations-768x133.png 768w" sizes="auto, (max-width: 1048px) 100vw, 1048px" /><button
class="lightbox-trigger"
type="button"
aria-haspopup="dialog"
aria-label="Увеличить"
data-wp-init="callbacks.initTriggerButton"
data-wp-on--click="actions.showLightbox"
data-wp-style--right="state.imageButtonRight"
data-wp-style--top="state.imageButtonTop"
><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12"><path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" /></svg></button><figcaption class="wp-element-caption">Связь информационных сущностей</figcaption></figure><p>Больше всего свойств со связями в нашем случае будет именно у <em>инфоблоков</em>. Очевидно, что каждый раз, когда нам понадобится связать <em>инфоблок </em>с <em>композитором</em>, <em>слоем</em>, <em>периодом </em>или <em>годом</em>, мы просто прописываем ему соответствующий <strong>идентификатор </strong>в соответствующее поле.</p><h2 class="wp-block-heading">Проблема</h2><p>Мы понимаем, что самая &#171;насыщенная&#187; связями сущность &#8212; это <em>инфоблок</em>. Мы также понимаем, что продукт будет развиваться. В нём появятся дополнительные сущности, вроде <em>треков</em>, <em>плейлистов </em>или <em>событий</em>. И каждый <em>инфоблок </em>потенциально может оказаться связанным с этими новыми сущностями.</p><p>Какая здесь появляется проблема? Мы должны спроектировать <strong>хранение</strong> связей в <em>инфоблоке </em>таким образом, чтобы добавление новых сущностей и связывание их с <em>инфоблоками</em> (как минимум с ними) не вызывало особенных проблем.</p><p>Как такое проектирование происходит обычно? А никак. Когда добавится новый тип сущности, к <em>инфоблоку </em>в базе данных просто будет добавлено новое поле. У каких-то инфоблоков оно будет заполнено, у каких-то &#8212; нет. Где-то в интерфейсе будет обрабатываться его отсутствие, где-то &#8212; не будет. Где-то на странице вывалится ошибка, где-то пользователь обматерит очередное обновление, где-то тестировщик обольётся кровавыми слезами.</p><p>А что, если это связь нелинейная? Не &#171;один ко одному&#187;, а &#171;один ко многим&#187;? Если конкретный <em>инфоблок</em> может содержать в себе связь с несколькими <em>треками</em>? Сможем мы в одном свойстве <em>инфоблока </em>сохранить несколько идентификаторов <em>треков</em>? А если можем, то почему вообще все связи не хранить в одном свойстве?</p><h2 class="wp-block-heading">Решение</h2><p>А решения нет. По крайней мере, однозначного.</p><p>Да, мы можем в одном свойстве хранить сразу несколько (сколько угодно) связей. Но упростит ли нам это задачу? Не будет ли слишком &#171;дорогим&#187; с точки зрения программных ресурсов разбор такого &#171;комплексного&#187; свойства? А если наших инфоблоков несколько миллионов? Справится ли сервер с необходимостью получить их все, выяснить, какие из них относятся к конкретному композитору и конкретному слою?</p><p>Боюсь, я вас запутал. Давайте немножко упрощу.</p><p>У нас, казалось бы, два варианта:</p><ol class="wp-block-list"><li>Хранить каждую связь в конкретном свойстве инфоблока. Это в IA &#8212; признак <strong>&#171;строгой&#187;</strong> или, по другому, <strong>&#171;сильной&#187;</strong> типизации.</li><li>Хранить все связи в одном свойстве, массивом. Обычно это отличает <strong>&#171;слабую&#187;</strong> типизацию.</li></ol><p>&#171;Слабая&#187; типизация подразумевает больше свободы, &#171;строгая&#187; &#8212; больше стабильности. Но при этом каждая из них, возведённая в абсолют, может уничтожить все плоды ваших усилий.</p><p>Слишком слабая типизация приведёт ваш продукт к тому, что простая операция по извлечению и сортировке нужных инфоблоков будет занимать непозволительно много времени. Сайт будет грузиться медленнее, конверсия будет снижаться, бизнес (или кто там у вас вместо него) окажется недоволен.</p><p>Излишне сильная типизация в разы увеличит стоимость поддержки и развития продукта. Разработчики будут ещё сильнее, чем обычно, материть проектировщика/архитектора. Время внедрения и отладки даже маленькой новой фичи станет сопоставимо с операцией Барбаросса в 1941-ом (и, вероятно, закончится так же, &#8212; провалом).</p><h2 class="wp-block-heading">Настоящее решение</h2><p>Грамотный и осознанный баланс &#8212; вот залог действительно качественного продукта. Это в полной мере касается и информационной архитектуры.</p><p>В нашем случае я выберу комбинированный подход:</p><p>Для связей, которые могут понадобиться при &#171;выборке&#187; <em>инфоблоков</em> из базы данных, я выберу отдельные свойства. В нашем случае это будут уже упомянутые <em>композитор</em>, <em>слой</em>, <em>период </em>и <em>год</em>. Остальные, существующие или потенциально возможные, я запихну в отдельное свойство массивом.</p><figure class="wp-block-pullquote"><blockquote><p>Правило простое: частые и ключевые связи мы прописываем как явные поля, а редкие и вариативные — в агрегате или отдельной связующей таблице. Так мы держим и производительность, и гибкость.</p></blockquote></figure><p>В следующей статье разберём подробно, что же такое информационная сущность и из чего она состоит.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arxitektura-primer-i-tipizaciya/">Информационная архитектура: пример и типизация</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Информационная архитектура: краткий экскурс</title><link>https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/</link><comments>https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Fri, 08 Jan 2021 11:44:32 +0000</pubDate><category><![CDATA[UX/UI]]></category><category><![CDATA[Аналитика]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[гайд]]></category><category><![CDATA[информационная архитектура]]></category><guid isPermaLink="false">https://sherer.pro/?p=2850</guid><description><![CDATA[<p>Короткая статья про основы информационной архитектуры: трамплин для погружения в область.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/">Информационная архитектура: краткий экскурс</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p><em>Это короткая статья не претендует на полное раскрытие термина, ибо он настолько глубок, что даже для базового его изложения потребуется не одна статья. Здесь я опишу только самые фундаментальные принципы, остальное будет в других частях цикла.</em></p><h2 class="wp-block-heading">Что такое IA</h2><p>Очень ёмко об информационной архитектуре высказался Алексей Бородкин, основатель Гильдии Вольных Проектировщиков:</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Это описание связи всего со всем!</p></blockquote><p>И во многом он прав. Во время этапа проработки IA формируется информационная структура продукта, выявляются взаимосвязи между всеми его частями, определяется их важность и содержимое.</p><p>Грамотная информационная архитектура упрощает поддержку и развитие продукта, улучшает UX:</p><ul class="wp-block-list"><li>программисты не матерят своих предшественников (или себя) за неудобные для масштабирования роутинг и базы данных;</li><li>контент-менеджеры и администраторы больше не льют кровавые слёзы при работе с внутренней частью продукта;</li><li>пользователи легко и непринуждённо находят то, что им нужно и попадают именно туда, куда хотели;</li><li>сеошники и поисковые системы влюбляются в ваш сайт и не хотят оттуда никуда уходить.</li></ul><p>Притом, как это часто случается в IT, каждый специалист вкладывает немного собственного смысла в этот термин, поэтому любая формулировка рискует оказаться недостаточно точной. И всё же я постарался сформулировать максимально общее определение информационной архитектуре:</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Это совокупность данных об информационной структуре цифрового продукта, способствующая его правильной работе, выполнению задач и интуитивному доступу к содержимому.</p></blockquote><p>Стало не сильно понятней, да? Вот так, сходу, всё это может показаться немного запутанным или сложным. Поэтому давайте на каком-нибудь очень простом и понятном примере пройдёмся по базовым этапам создания IA. Пусть это будет абстрактный интернет-магазин одежды.</p><h2 class="wp-block-heading">Этапы создания IA</h2><p>Важно понимать, что каждый опытный архитектор выполняет эту работу немного по-своему. В формате этой &#171;вводной&#187; статьи я смогу рассказать только о ключевых моментах, основных вехах.</p><h3 class="wp-block-heading">Подготовка</h3><p>Работа над информационной архитектурой начинается сильно позже старта проектирования. Сперва определяется концепция, суть продукта. Нам нужен базис, от которого мы уже начнём выстраивать IA.</p><p>Мы должны как минимум очертить высокоуровневые границы проекта, сформировать базовое понимание его функциональности. И только на этом этапе приступать к информационному проектированию.</p><p>В нашем случае базис относительно простой: есть интернет-магазин, есть товары, категории и пользователи. Углубляться не станем, а то всё-таки скатимся к лонгриду.</p><h3 class="wp-block-heading">Декомпозиция</h3><p>На этом шаге мы разбираем проект на отдельные <em>информационные сущности</em>. Каждая такая сущность обладает определёнными <em>свойствами</em>. Некоторые сущности могут быть <em>вложенными </em>(каталог и товар, например), некоторые &#8212; <em>независимыми</em>.</p><p>Итак, пусть в нашем примере будет только 5 сущностей:</p><ol class="wp-block-list"><li><strong>Страница </strong>(статические сущности, содержащие какую-то информацию; например, страницы &#171;О компании&#187;, &#171;Доставка и оплата&#187;).</li><li><strong>Товар </strong>(да, обычный товар с описанием, фоточками, ценой и тп).</li><li><strong>Каталог </strong>(внезапно, но каталог &#8212; это тоже сущность; у него есть свои свойства, вроде параметров поиска или уровня вложенности).</li><li><strong>Корзина </strong>(которая обладает <em>динамическими</em> свойствами: вложенные товары и их количество, скидки, даже связь с конкретным пользователем).</li><li><strong>Пользователь </strong>(тут всё понятно: как минимум, у пользователя есть регистрационные данные, адрес доставки и платёжные реквизиты).</li></ol><p>Конечно, даже в самом простом e-commerce этих сущностей больше, а их свойства разнообразнее. Однако мы помним, что это пример, да? Для простоты мы в дальнейшем даже не будем детально разбирать почти ничего, кроме самих &#171;товаров&#187;.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Важная оговорка: в контент-проектах «Страница» — полноценная <strong>контент-сущность</strong>, но в UX-лексике «страница/экран» — это <strong>UI-представление</strong>, и она не равна сущности домена. Подробнее об этом будет в третьей статье цикла.</p></blockquote><p><em>На этом и последующих этапах присутствуют некоторые пересечения с <a href="https://sherer.pro/blog/dizajn-dannyh-chast-1-chto-i-zachem/" target="_blank" rel="noreferrer noopener">дизайном данных</a>, это не страшно и не противоречит концепции информационной архитектуры. Если проектировщик/архитектор хороший, он совмещает оба направления, экономя ресурсы компании</em>.</p><h3 class="wp-block-heading">Классификация</h3><p>Теперь надо классифицировать получившиеся сущности, но не только их. Для грамотного составления архитектуры, нам потребуется классифицировать ещё и возможные операции с этими сущностями.</p><p><strong>A. Классификация пользовательских потребностей</strong> (задач) в разрезе информационной архитектуры опирается, как правило, на результаты пользовательских же исследований. Мы должны понимать, что <em>действительно</em> нужно нашим потенциальным покупателям. Исходя из этой информации, мы выясним, как именно следует связать наши сущности как они будут друг к другу относиться.</p><p>Для нашего примера классификация задач пользователя будет очень простой:</p><ol class="wp-block-list"><li><strong>Найти товары</strong> (с помощью поиска, фильтрации и сортировки).</li><li><strong>Сравнить товары</strong> (выбрать наиболее подходящий вариант).</li><li><strong>Почитать про товары</strong> (ознакомиться с характеристиками).</li><li><strong>Купить товары</strong> (положить в корзину, оплатить и ждать доставку).</li></ol><p>Как видите, все действия напрямую связаны с товарами, и опосредованно &#8212; с остальными сущностями (например, <em>поиск товара</em> осуществляется в <em>каталоге</em>, а покупка &#8212; в <em>корзине</em>).</p><p>На этом шаге мы также определяем все возможные варианты и способы манипуляции с нашими сущностями: определяем, как будет осуществляться поиск, по каким параметрам мы будем сортировать товары и так далее.</p><p><strong>B. Классификация информационных сущностей</strong> &#8212; ещё один обязательный этап. Вся информация, которую видит пользователь, должна быть структурирована. Страницы должны объединяться в разделы, товары &#8212; в категории. И те, и другие должны быть доступны для поиска, а последние &#8212; ещё и для сортировки. У товаров могут быть общие свойства, вроде скрытых от глаз пользователя &#171;тегов/меток&#187; или доступных для просмотра &#171;размеров&#187;.</p><p>На этапе классификации сущностей мы решаем, по какому принципу они будут объединяться и как пользователю будет удобнее с ними обращаться. Попутно не забываем и про администраторов, которым тоже нужно упростить работу.</p><p>Но для начала немного терминологии:</p><ul class="wp-block-list"><li><strong>таксономия </strong>— это управляемая схема классификации;</li><li><strong>термины</strong> — атомы таксономии.</li></ul><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Например, таксономия &#171;Размер&#187; может содержать несколько терминов: &#171;XXL&#187;, &#171;XL&#187;, &#171;L&#187;, &#171;M&#187;, &#171;S&#187;, &#171;XS&#187;.</p></blockquote><p>В реальных продуктах часть терминов обрастает свойствами и становится «почти сущностями» — это нормально, фиксируем это явно.</p><p>В нашем примере добавляем три <em>таксономии</em> и одно общее <em>свойство</em>:</p><ol class="wp-block-list"><li><strong>Категория </strong>(иерархическая таксономия сущности &#171;товар&#187;).</li><li><strong>Метка </strong>(не-иерархическая таксономия сущности &#171;товар&#187;).</li><li><strong>Размер</strong> (не-иерархическая таксономия сущности &#171;товар&#187;).</li><li><strong>Цвет </strong>(общее свойство для всех экземпляров сущности &#171;товар&#187;).</li></ol><p>Иерархические таксономии могут быть вложенными: например, категория может иметь подкатегорию (зимняя одежда -&gt; пуховики). А вот у метки, например, родительского термина быть не может.</p><p><em>Некоторые архитекторы считают таксономии за отдельные сущности, однако мне такой подход не нравится, я предпочитаю отделять одно от другого. Вот &#171;термин&#187; таксономии вполне можно иногда посчитать за сущность, ибо порой термины обрастают таким количеством свойств, что сами по себе начинают претендовать на роль серьёзной информационной составляющей.</em></p><h3 class="wp-block-heading">Выявление связей</h3><p><em>На самом деле, этот этап (и следующий тоже) часто параллелятся с предыдущим, но излагать и воспринимать их удобнее именно так. Просто имейте в виду, что это не всегда прям последовательные шаги.</em></p><p>Итак, мы разобрались, что у нас за сущности и таксономии. Теперь нужно понять, как они будут между собой связаны. Связи сущностей могут быть совершенно разными. Если копнуть глубоко, то неподготовленный читатель слегка ошалеет от всех этих <em>&#171;от одного ко многим&#187;</em>, <em>&#171;от многих ко многим&#187;</em> и тп. Мы рассмотрим только простые варианты, когда связи являются либо <em>&#171;плоскими&#187;, либо &#171;иерархическими&#187;</em>.</p><p><strong>Плоские связи </strong>в нашем случае &#8212; это связь терминов таксономии &#171;метки&#187; между собой. У них нет родителей, они &#171;равны&#187;. Или связь товаров с одинаковыми &#171;метками&#187; &#8212; она тоже плоская. Кстати, связь самого товара с меткой &#8212; тоже плоская.</p><p><strong>Иерархическая связь</strong>, например, у терминов таксономии &#171;категории&#187; &#8212; они почти всегда вложенные. Также иерархическая связь будет между сущностями &#171;каталог&#187; и &#171;товар&#187;, так как первый всегда включает в себя несколько товаров. Если пойти дальше, то в игру вступают термины таксономии и у нас получается целая цепочка связей: <em>каталог </em>-&gt; <em>категория </em>-&gt; <em>товар</em>.</p><p>Иерархия сущностей &#8212; вообще отдельная песня. У хорошего архитектора почти все сущности в проекте делится на высоко-, средне- и низкоуровневые.</p><h3 class="wp-block-heading">Фиксация свойств</h3><p>Во время всей работы над информационной архитектурой мы всё время попутно выясняли, какие именно свойства будут у наших сущностей. Пришло время их зафиксировать.</p><p>Мы знаем, что у <strong>товаров </strong>есть как минимум 10 свойств:</p><ol class="wp-block-list"><li><strong>Идентификатор </strong>(внутренний, в базе данных, он есть у каждой сущности и термина таксономии).</li><li><strong>Артикул</strong> (внешний, для обмена данными, например, с системой складского учёта).</li><li><strong>Название</strong>.</li><li><strong>Описание</strong>.</li><li><strong>Основное изображение</strong> (используется в карточке товара в каталоге).</li><li><strong>Дополнительные изображения</strong> (используются в галерее изображений на странице товара).</li><li><strong>Цвет </strong>(общее свойство для всех товаров: оно не &#171;сквозное&#187;, как метки и категории, а может быть уникальным для каждого товара &#8212; например, «синий с белым узором»).</li><li><strong>Размер </strong>(прикреплённый термин таксономии).</li><li><strong>Категория</strong> (прикреплённый термин таксономии).</li><li><strong>Метки </strong>(несколько терминов таксономии, на основе которых будут показываться &#171;похожие&#187; товары).</li></ol><p>При этом мы знаем, что свойства 8 и 9 являются &#171;ссылками&#187; на конкретный термин таксономии, а десятое свойство &#8212; даже на несколько таких терминов.</p><p>Таким образом, мы составили информационную модельку нашего товара. Мы молодцы.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>На самом деле, конечно, не всё так просто. И в третьей статье цикла мы немного углубимся в тему свойств сущностей. Например, добавим понятие «контролируемый словарь», «<a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D1%81%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F" target="_blank" rel="noreferrer noopener">фасет</a>» и другие.</p></blockquote><h3 class="wp-block-heading">Схематизация</h3><p>Составление предметных и навигационных схем продукта. Самый последний и самый сложный этап. Причём его сложность чаще не в каких-то особенных нотациях или технических трудностях. Его главная сложность &#8212; в психологическом факторе. Я видел, как талантливые информационные архитекторы сводили на нет результаты всей своей работы из-за небрежного финального оформления.</p><p>Причина тут простая: в голове у архитектора картинка уже сложилась. Переносить её на бумагу (пусть и цифровую) кажется второстепенной задачей. Гештальт закрыт, мозг получил свою дозу дофамина.</p><p>Вот только без грамотного отчуждения практически любые знания бесполезны. Всё, что получилось выяснить, сопоставить и придумать во время работы над информационной архитектурой, должно быть зафиксировано в документации. В случае с IA эта документация состоит, по большей части из разного рода схем. Здесь и перечень/описание сущностей и их свойств, здесь взаимосвязи, задачи, операции и так далее. Самые крутые даже описывают предполагаемую программную реализацию, миксуя информационную архитектуру с дизайном данных.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Важно: информационная архитектура описывает «что и как связано» (сущности, свойства, таксономии), а навигация — «как по этому двигаться» (меню, крошки, фасеты, поиск).</p></blockquote><p>Об артефактах информационного проектирования можно написать не одну статью. И, возможно, я это ещё сделаю.</p><h2 class="wp-block-heading">Напоследок</h2><p>О сущностях, типах свойств и связей можно рассказывать очень долго. Как и об информационных моделях, например. Но об этом в следующих статьях.</p><p>Запись <a href="https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/">Информационная архитектура: краткий экскурс</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/feed/</wfw:commentRss><slash:comments>1</slash:comments></item><item><title>Светлая сторона (пере)проектирования</title><link>https://sherer.pro/blog/svetlaya-storona-pereproektirovaniya/</link><comments>https://sherer.pro/blog/svetlaya-storona-pereproektirovaniya/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Mon, 14 May 2018 15:39:14 +0000</pubDate><category><![CDATA[UX/UI]]></category><category><![CDATA[Аналитика]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[гайд]]></category><category><![CDATA[стартапы]]></category><guid isPermaLink="false">https://sherer.pro/?p=343</guid><description><![CDATA[<p>Любое перепроектирование предполагает меньше неопределенности — а значит, оно безопаснее, проще. Но почему-то многие берутся за него со старым подходом: обычным, привычным и унылым. А там же нюансов — миллион. Не учтешь какие-то, и работать придется больше, а результат будет не таким стабильным.</p><p>Запись <a href="https://sherer.pro/blog/svetlaya-storona-pereproektirovaniya/">Светлая сторона (пере)проектирования</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>В свое время мне пришлось иметь дело с большим количеством стартапов разного уровня сложности и финансирования. У стартапов, конечно, есть <a href="https://sherer.pro/blog/osobennosti-texnicheskogo-proektirovaniya-startapov/">своя специфика</a>, но проектирование в них кардинально не отличается от того, которое проводится в студиях и компаниях. Сейчас я уже работаю с проектами другого класса, но иногда стартаперский шлейф умудряется меня догонять. Так, по сарафану порой прилетают довольно интересные заказы на перепроектирование &#8212; переосмысление, переработку, редизайн сервиса. И почти всегда это реально клёво. Ниже я расскажу, почему.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>То, что вы сейчас читаете, родилось из миддлрида в моем <a href="https://www.facebook.com/sherer.pro" target="_blank" rel="noopener noreferrer">фэйсбуке</a>, поэтому некоторые мысли здесь повторяются практически дословно. Однако есть и много чего новенького. Не переключайтесь.</p></blockquote><p>Заранее извиняюсь за некоторую грубость повествования: в выборе выражений я не силен.</p><h2 class="wp-block-heading">Почему перепроектирование &#8212; это клёво</h2><p>Вообще, по понятным причинам любое перепроектирование (не только стартапов) предполагает меньше неопределенности &#8212; а значит, оно безопаснее, проще. И это так. Но почему-то многие берутся за него со старым подходом: обычным, привычным и унылым. Тупо проектируют. А там же нюансов &#8212; миллион. Не учтешь какие-то, и работать придется больше, а результат будет не таким стабильным. Ты наверняка сделаешь лучше, чем было, но дольше, дороже и хуже, чем могло быть.</p><h3 class="wp-block-heading">Бабло</h3><p>Оно на первом месте,&nbsp;разумеется.&nbsp;Если проект готов к глобальной перестройке &#8212; значит, он &#171;выстрелил&#187;. В той или иной мере, конечно, но у него есть деньги. А значит, работа будет оплачена. Не будет вымораживающих &#171;давай на проценте войдешь&#187;, &#171;мы такие крутые, не хочешь нас в портфолио?&#187; или &#171;у нас есть два килобакса, давай ты все придумаешь за нас&#187;. Все эти истории хороши в начале карьеры, когда ты еще не испытал собственной жопой жесткие камни бизнес-реалий. Работать бесплатно можно только на себя, и то &#171;условно&#187; (если ты не волонтер, но это совсем другая история).</p><p>Кроме того, если у бизнеса есть хоть какие-то деньги, то тебе, скорее всего, не придется вымаливать копейку на банальное А/В тестирование или привлечение внешнего <a href="https://sherer.pro/blog/texnicheskoe-proektirovanie-v-massy/">технического специалиста</a>. Значит, ты реально сможешь поработать с гипотезами &#8212; а это всегда доставляет.</p><h3 class="wp-block-heading">Аналитика</h3><p>Первое, что я спрашиваю у клиента перед перепроектированием &#8212; это доступ к GTM, Яндекс.Метрике, Branch/Amplitude и тп. И только потом называю финальную оценку своей работы. Если аналитика на старте была настроена грамотно, то 90% гипотез могут быть проверены за несколько минут (пусть иногда и косвенно). И это по-настоящему круто. Вот прям круто-круто.</p><p>Реальный случай, из недавнего: клиент заявляет, что пользователи жалуются на сложную форму заказа и это &#8212; главная проблема сервиса. Начинаю копать аналитику и понимаю, что с формы заказа отваливается примерно половина пользователей, тогда как со страницы поиска услуг &#8212; около 80%. То есть вглубь воронки проходит только 20%, из которых половина валится на заказе. Если даже не делать ничего с заказом, а добиться удвоения прохождения поиска (с 80% до 60%) &#8212; это будет равносильно идеальной форме заказа, со стопроцентной конверсией. Конечно, это не значит, что заказ не надо трогать. Это говорит только о том, что мнение клиента попало под влияние <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B6%D0%B8%D0%B2%D1%88%D0%B5%D0%B3%D0%BE" target="_blank" rel="noopener nofollow noreferrer">&#171;систематической ошибки выжившего&#187;</a>: до заказа доходили только самые упорные клиенты, и они же потом не ленились писать про сложность формы. Они не говорили о траблах с поиском,&nbsp; просто потому что заказ был их крайней проблемой, а мозг, ленивая скотина, склонен экономить джоули.</p><h3 class="wp-block-heading">Пользователи</h3><p>Живые, реальные, плоть от плоти сервиса. Их можно палочкой потыкать, или за ништяки какие-то привлечь к беседе. Такой возможности не будет при классическом проектировании &#8212; и очень странно, что некоторые мои коллеги тупо забивают на это болт. Нет, они, конечно, учитывают наличие пользователей, но для них это скорее какой-то ограничивающий фактор. Хотя, казалось бы, все просто: выбейте из клиента скидку для участников вашего опроса, и у вас появится железная доказательная база выстоявших под этим натиском гипотез.</p><p>А еще у фаундеров всегда имеется тьма тьмущая настоящих отзывов: хотелок, недовольств, восхищений. С ними надо быть аккуратнее, слепо доверять не стоит (вон выше пример), но само по себе это довольно мощный инструмент сужения домыслов. Если уметь обработать, можно массу скрытых грабель выкопать.</p><h3 class="wp-block-heading">Бизнес-процессы</h3><p>Тут, скорее, банальная лень. Но все же знают, чей именно она двигатель, да?</p><p>Чаще всего внутренняя часть БП уже настроена, так или иначе обкатана, вычислены узкие места. Не нужно много думать, предполагать, строить монструозные BPML&#8217;ки. Чаще всего достаточно взять готовое и оптимизнуть. И это прекрасно, ибо для меня лично бизнес-процессы &#8212; самая унылая часть проектирования. Да, она, вероятно, самая важная, но как же выбешивает опрашивать менеджеров колл-центра или по крупицам собирать ценные факты из потока пожеланий какого-нибудь руководителя отдела.</p><h3 class="wp-block-heading">Грабли</h3><p>То, что вы можете с любопытством рассматривать шишки на лбу прежних продуктологов, создававших этот сервис до вас &#8212; уже само по себе приятно. Если вам доступна проектная документация, отчеты или хроника факапов сервиса, то ваш собственный лоб будет значительно целее.</p><p>К граблям, на которые можно наступать неоднократно, относятся:</p><ul class="wp-block-list"><li>неверное определение целевой аудитории, их микропотребностей;</li><li>самонадеянная проработка UX, слабо соотносящаяся с реальностью;</li><li>нюансы финмодели, &#171;просаживающие&#187; прибыль сервиса;</li><li>еще миллион явлений, решений и событий.</li></ul><p>Поспрашивайте у клиента, что они меняли в сервисе и почему. Как он развивался, какие дыры залатывали разработчики. Учится надо по возможности на чужих ошибках. Если можно проанализировать факапы предшественников &#8212; только идиот этого не сделает.</p><h3 class="wp-block-heading">Техническая составляющая</h3><p>Здесь, вроде, вы как раз ограничены. Инфраструктура сервиса определена, архитектура выстроена и все работает, особенно не развернешься. Но это, на самом деле, тоже плюс. За один-два разговора с техническим директором или ведущим разработчиком вы сможете выяснить все недочеты существующей системы. Все ее ограничения, особенности. Если где-то есть слабое место, вы сможете его усилить или &#171;обойти&#187; интерфейсно.</p><p>Поясню на примере. Делал перепроектирование одного маркетплейса. Намечался глобальный редизайн, вплоть до упразднения ролей пользователей и разнесения сущностей. Архитектура базы данных позволяла вытворять всякое, а разработчики планировали полностью переписать сервис &#8212; радость, да и только. Но при первом же общении с техдиром выяснилось, что при всей внутренней свободе, завязка на внешних сервисах, вроде <a href="https://aws.amazon.com/ru/elasticsearch-service/" target="_blank" rel="noopener nofollow noreferrer">Amazon Elasticsearch</a>, накладывала ряд не самых очевидных ограничений (которые наверняка бы были упущены, не изучай разрабы эти сервисы уже год).</p><h3 class="wp-block-heading">Масштабируемость и развитие</h3><p>Особенно это касается стартапов, которые на старте еще только щупают рынок и определяются с бизнес-моделью. При перепроектировании вектор развития, как правило, уже определен &#8212; и вам не нужно планировать &#171;во всех направлениях&#187;. Вместо этого вы можете сконцентрироваться на конкретных задачах и вылизать их до зеркального блеска.</p><p>В упомянутом ранее примере такой задачей стало усиление так называемых &#171;клубов совместных закупок&#187;, хотя изначально это была лишь небольшая фича сервиса, малозаметная и, как казалось, незначительная. Но за пару лет существования сервиса именно она стала приносить больше всего прибыли компании.</p><p>И таких историй &#8212; тьма. Круто, когда понимание того, как должен развиваться и расти проект, приходит не из туманных&nbsp;гипотез, а из сухих и холодных финансовых отчетов.</p><h3 class="wp-block-heading">Контент</h3><p>Чаще всего контент &#8212; это серьезный геморрой при проектировании. Я уже неоднократно <a href="https://fish-text.ru/advice" target="_blank" rel="noopener noreferrer">заявлял</a>, почему в макетах не должно быть <a href="https://fish-text.ru" target="_blank" rel="noopener noreferrer">текста-рыбы</a>. Но иногда реальный контент взять неоткуда. Иногда &#8212; но не в случае с перепроектированием. Это же рай: ваш прототип/макет может содержать только реальные данные. Вам не нужно копать в Интернете, подсматривать у конкурентов или что-то выдумывать (увеличивая вероятность &#171;просачивания&#187; левого текста в продакшн). Более того, вы можете составить текстовый кит проекта (!) и требования к контенту. Если не это счастье &#8212; то что?</p><h3 class="wp-block-heading">Черные лебеди</h3><p>Пожалуй, самый неочевидный и неоднозначный момент, который стоит учитывать при переосмыслении продукта. Если вкратце: практически любой сервис рано или поздно сталкивается с событиями, которые невозможно спрогнозировать и учесть &#8212; ввиду их теоретически ничтожной вероятности. Но такие события случаются. И, случившись, они оказывают серьезнейшее влияние на продукт &#8212; и отнюдь не всегда это влияние положительное. Анализировать таких &#171;черных лебедей&#187; по отдельности &#8212; занятие, чаще всего, попросту бесполезное. А вот копнуть первопричины этих событий, да наложить их на вероятные последствия&#8230; Это как кунг-фу, только в голове и круче.</p><p>Если в сервисе, который вам надо перепроектировать, случались такие истории, то глупо их не учесть. Нет, вы не сможете предугадать &#171;лебедей&#187; &#8212; потому они и &#171;черные&#187;. Более того, вам вовсе не нужно этим заниматься. Попробуйте найти причины их возникновения, корневые, глубинные предпосылки, постройте карту вероятностей &#8212; и закрывайте те места, куда могут ударить такие события. Или наоборот, придумайте, как сделать их максимально выгодными для компании.</p><p>На самом деле, эта тема очень обширная, и в рамках одного раздела я не смогу ее раскрыть даже теоретически. Наверное, напишу отдельную статью, с реальными кейсами. А если вы до сих пор не читали книгу Нассима Талеба <a href="https://www.ozon.ru/context/detail/id/31856341/" target="_blank" rel="noopener nofollow noreferrer">&#171;Черный Лебедь. Под знаком непредсказуемости&#187;</a> &#8212; то сделайте это обязательно, прямо сейчас.</p><h2 class="wp-block-heading">Риски перепроектирования</h2><p>Конечно, я не могу отказать себе в ложке дегтя. Как и везде, в переработке продукта тоже есть свои сложности. И иногда они могут обернуться реальной катастрофой для бизнеса.&nbsp;Подробно останавливаться на этом я не буду, благо статей на тему &#171;как не завалить редизайн&#187; предостаточно.</p><h3 class="wp-block-heading">Красная кнопка</h3><p>Круто работать в большущей корпорации, которая с легкостью поглотит все вибрации от твоего фэйла. Когда у тебя оклад, а между работой и пофигизмом &#8212; только совесть. Куда сложнее, если твои решения могут банально похоронить сервис. Если ты проектировщик или продуктовый дизайнер в небольшой компании, то на тебе лежит серьезная ответственность. Зафэйлить апдейт просто. Сложно потом объяснить пользователям и начальству, почему это ты обосрался.</p><h3 class="wp-block-heading">Все считается</h3><p>Буквально недавно я опубликовал странный пост о том, <a href="https://sherer.pro/blog/fejl-eto-prekrasno/">почему важно считать фэйлы</a> и рассказывать о них миру. При грамотном руководстве все ваши провалы обязательно будут замечены, посчитаны и предъявлены. Хотя бы потому, что это очевидно и не сложно: посмотреть конверсию &#171;до&#187; и &#171;после&#187;, умножить на количество посетителей и средний чек.</p><p>Просто думайте об этом, когда выдумываете заново свой продукт. Старайтесь сделать так, чтобы результаты вышеизложенных вычислений были положительными, а не отрицательными.</p><h3 class="wp-block-heading">Снова пользователи</h3><p>Эти ребята, снующие туда-сюда по вашему сервису, не всегда &#8212; благо. Да, их можно допросить, помогая себе яркой лампой и скидками. Да, они &#8212; единственный источник реальной обратной связи. Источник, который можно пощупать. И который обязательно обгадит вас и ваши решения, как только вы выложите первый вариант редизайна. Просто смиритесь, что так оно и будет. Причины просты: никто не любит учиться. А тем более &#8212; переучиваться. Максимум, что вы можете сделать &#8212; свести период недовольства к минимуму.</p><p>Чем больше у сервиса пользователей, тем более аккуратно нужно выкладывать обновления. Если они привыкли к определенному сценарию, надо менять его плавно. Представьте, что вы кормите льва с руки: одно резкое движение может отминусовать вам кисть, а то и голову.</p><h2 class="wp-block-heading">Итог</h2><p>Правила постописания обязывают меня сделать какой-нибудь эффектный завершающий финт. Типа &#171;резюмируя все вышеизложенное&#8230;&#187;. Нафиг. По статистике, до этой части статьи добирается три-пять процентов посетителей. Если вы в их числе &#8212; вот вам моё &#171;спасибо&#187;. Переключайтесь.</p><p>Запись <a href="https://sherer.pro/blog/svetlaya-storona-pereproektirovaniya/">Светлая сторона (пере)проектирования</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/svetlaya-storona-pereproektirovaniya/feed/</wfw:commentRss><slash:comments>4</slash:comments></item></channel></rss>