<?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/documentation/feed/" rel="self" type="application/rss+xml" /><link>https://sherer.pro/blog/category/documentation/</link><description>Продюсер, аналитик, продуктовый дизайнер IT-решений</description><lastBuildDate>Sun, 07 Dec 2025 10:21:06 +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/documentation/</link><width>32</width><height>32</height></image> <item><title>Упаковка бизнеса: от диагностики до метрик и артефактов</title><link>https://sherer.pro/blog/business-packaging/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Tue, 30 Sep 2025 09:16:13 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[Управление]]></category><category><![CDATA[гайд]]></category><guid isPermaLink="false">https://sherer.pro/?p=4541</guid><description><![CDATA[<p>Упаковка бизнеса — это не сделать красивую презентацию для инвесторов, а превратить ежедневные подвиги в управляемую конструкцию, где рост объясним, повторяем и просчитываем.</p><p>Запись <a href="https://sherer.pro/blog/business-packaging/">Упаковка бизнеса: от диагностики до метрик и артефактов</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Упаковать бизнес в продукт — это собрать единую картину: цель, метрики, стратегия проверок гипотез, архитектура продукта и операций, роли и ответственность, бюджет и сроки, юридический контур, риск‑реестр, план выхода на рынок и многое другое. По итогу такой упаковки должен получиться комплект артефактов, по которым можно одинаково внятно разговаривать с клиентом, инвестором и даже соискателем. Не «красивый питч-дек», а рабочая схема, через которую проходят решения, финансы и результат.</p><p>Это способ сделать ваш бизнес понятным и проверяемым для аудиторий, которые дают вам деньги или возможности:</p><ul class="wp-block-list"><li><strong>Клиенты</strong> — им нужна ясность, чем вы полезны и почему вам можно доверять.</li><li><strong>Партнёры</strong> — им нужна предсказуемость: правила игры, процессы, уровень сервиса.</li><li><strong>Инвесторы</strong> — им нужна картина целиком: финансы, риски, права, команда.</li></ul><figure class="wp-block-pullquote"><blockquote><p>Если упаковки нет, то вы каждый раз начинаете разговор с нуля и теряете сделки там, где могли бы их не терять.</p></blockquote></figure><p><em>Дисклеймер: универсальных методологий тут быть не может. Кто-то делит упаковку на маркетинговую (рекламную) и инвестиционную (предпринимательскую). У стартапа и крупного бизнеса упаковка будет сильно отличаться. Поэтому призываю вас рассматривать этот текст не как набор правил или этапов, а как перечень рекомендаций, которые вы должны адаптировать под реалии своего бизнеса.</em></p><h2 class="wp-block-heading">Исходная точка: диагностика</h2><p>Сначала фиксируется реальность, текущее положение дел. В этот момент частенько возникает желание что-то приукрасить: ну да, сейчас у нас не очень с проектными процессами, но вот-вот выйдет проджект, и всё будет ок. Значит, можно писать, что процессы уже внедрены. Спойлер: нет, нельзя.</p><p>Что стоит фиксировать в этой самой исходной точке:</p><ul class="wp-block-list"><li>Продукт или продукты. В идеале, с минимальным функциональным описанием.</li><li>Продуктовые и другие метрики, если они есть. Потом пригодятся.</li><li>Выручка и динамика по ней. Даже если она отрицательная. Даже если за неё пока стыдно.</li><li>Базовая юнит‑экономика и всё, от чего она выстраивалась: от исследований до предположений. Сюда же финмодель.</li><li>Каналы продаж и их базовые особенности: региональность, отличия аудиторий, юридические ограничения и прочее.</li><li>Состав команды, текущие проектные процессы, их состояние с соблюдением.</li><li>Технологическая платформа. Если возможно, с указанием программных и интеграционных решений.</li><li>Юридическая форма, состав инвестиций и прочие лигал-темы.</li><li>Обязательства перед клиентами и партнёрами.</li><li>Ключевые риски: от операционных до финансовых и технологических.</li></ul><p>Кто-то скажет: «Да это уже полноценная упаковка, мало какой продукт на ранних стадиях обладает всей этой информацией». И да, и нет. Да — потому что мало кто обладает. Нет — потому что это ещё даже близко не упаковка. Если чего‑то из этого списка нет, прямо пишем «не знаю». А рядом ставим: когда и у кого узнаём. Если таких «не знаю» будет много, не пугайтесь: для стартапов на самых ранних стадиях достаточно минимального набора данных (например, описание продукта, целевая аудитория, гипотезы о каналах продаж).</p><p>Отдельно формулируется проблема роста: узкие горлышки, сильнее всего тормозящие масштабирование, целевое состояние на 6–12 месяцев с явными ограничениями по времени, бюджету и ресурсам (специалистам, технологиям, оборудованию и тп).</p><p>Если при фиксации чего-то из перечисленного были допущения или неуверенность, это тоже нужно обязательно зафиксировать.</p><h2 class="wp-block-heading">Семь слоёв упаковки</h2><p>Ниже я приведу довольно большой перечень разнообразных продуктов, систем и артефактов. Часть из них у вас наверняка окажется на этапе самодиагностики. Если же каких-то нет, то не факт, что они вам нужны. Отталкивайтесь от задач бизнеса, особенностей рынка, аудитории и других факторов. Используйте здравый смысл.</p><figure class="wp-block-pullquote"><blockquote><p>Если слепо делать всё «по учебнику», есть риск впустую сжечь ресурсы на то, что потом не пригодится.</p></blockquote></figure><p>Упаковка — это итеративный процесс, и можно начать с малого. Например, с фиксации текущего состояния и одного-двух ключевых артефактов. В стартапах так вообще по мере проверки гипотез может меняться очень многое.</p><p>Ниже представлены несколько отдельных слоёв, но они не изолированы друг от друга. Данные из одного слоя очень часто питают другой. Например, аналитика активации пользователей из продуктового слоя поможет скорректировать контент-календарь в маркетинге.</p><h3 class="wp-block-heading">Публичный слой: бренд и маркетинг</h3><p><strong>Бренд‑платформа</strong>. Это не презентация в PowerPoint, а документ, который отвечает на три простых вопроса: кто мы, зачем мы и чем отличаемся от соседей по рынку. Там же — иерархия сообщений: главный зонтик («мы решаем проблему X»), 3–4 ценностных опоры и конкретные доказательства. Добавьте тон голоса (говорим ли мы как «умный друг» или как «суровый консультант») и визуальные правила.</p><p><strong>Сайт</strong>. Это ваша витрина, и у неё должна быть структура без эзотерики: главная страница, решения/продукты, отраслевые страницы, кейсы, цены и тарифы, блог или раздел с исследованиями, страница «О нас» с командой и сертификатами, контакты, кнопка «показать демо». Всё лишнее — в корзину.</p><p><strong>Кейсы</strong>. Пишите их как короткие истории: контекст → проблема → решение → результат (с цифрами до/после) → сложности, с которыми справились → отзыв клиента. Это не реклама, а рабочая доказательная база.</p><p><strong>Социальные доказательства</strong>. Здесь всё просто: рейтинги, награды, партнёрские статусы и логотипы клиентов. Важно размещать только те, где есть официальное разрешение на публикацию.</p><p><strong>Маркетинг и дистрибуция</strong>. Рисуем карту каналов (SEO, статьи, ивенты, реферальные программы, платная реклама, партнёрские сети), считаем CAC по каждому каналу и планируем контент‑календарь на три месяца вперёд. Без этих чисел разговор про маркетинг превращается в гадание.</p><h3 class="wp-block-heading">Коммерческий слой: инструменты продаж</h3><p><strong><a href="https://vc.ru/marketing/757991-costavit-idealnyi-profil-klienta-dotyanutsya-do-nego-i-prodat-chto-takoe-icp-i-kak-ego-opredelit" rel="noreferrer noopener" target="_blank">ICP</a> и персоны</strong>. Это портреты ваших клиентов: роли, боли, критерии, по которым они квалифицируются. Красные флаги, по которым вы сразу понимаете, что это не ваш клиент (например, негативные персоны).</p><p><strong>Playbook продаж</strong>. Настольная книга менеджера: скрипт discovery (какие вопросы задать, чтобы раскрыть боль и ценность), сценарий демо (3–5 сцен, каждая закрывает конкретный риск или боль клиента), готовые ответы на 10 самых частых возражений и чек‑лист того, что должно быть закрыто в договоре.</p><p><strong>Материалы</strong>. One‑pager для быстрых рассылок, <a href="https://www.crayon.co/blog/competitive-battlecards-101" rel="noreferrer noopener" target="_blank">battlecards</a> для борьбы с возражениями/конкурентами, калькулятор <a href="https://www.indeed.com/career-advice/career-development/tco-roi" rel="noreferrer noopener" target="_blank">ROI/TCO</a>, тарифные карты, <a href="https://www.indeed.com/career-advice/career-development/ola-vs-sla" rel="noreferrer noopener" target="_blank">SLA/OLA</a>, шаблоны КП и договора. Это рабочий пакет, без которого продавец каждый раз изобретает велосипед.</p><h3 class="wp-block-heading">Продукт и операции</h3><p><strong>Product Vision или концепция</strong>. Один небольшой документ, который комплексно описывает цель продукта, для кого он создаётся, в чём его ценности и уникальность. Здесь же сценарии использования, ограничения и долгосрочные планы.</p><p><a href="https://www.productplan.com/learn/outcome-driven-roadmaps/" rel="noreferrer noopener" target="_blank"><strong>Outcome‑roadmap</strong></a>. Это дорожная карта, где вместо «сделаем фичу» записано «закроем проблему клиента и увидим рост конкретной метрики». И сразу связка с <a href="https://amplitude.com/blog/product-north-star-metric" rel="noreferrer noopener" target="_blank">North Star Metric</a> (но здесь нужно быть осторожным, можно попасть в «ловушку одной метрики», выставляйте сторожевые).</p><p><strong>Поддержка и клиентский успех</strong>. Уровни поддержки, цели по времени ответа и решения, база знаний, сценарии онбординга и регулярных обзоров ценности (<a href="https://blog.salesai.ru/the-complete-guide-of-qbr-in-2022" rel="noreferrer noopener" target="_blank">QBR</a>). Всё это должно жить и обновляться.</p><p><strong>Аналитика</strong>. Чёткая схема событий: регистрация, активация, использование ключевых функций, оплата, ошибки, производительность. На дашбордах должны висеть NSM, показатели активации, ретеншн и базовая юнит‑экономика.</p><p><strong>Карта фичей и сравнений</strong>. Зачем каждая функция существует, её текущий статус и какой эффект она даёт. И честная таблица «мы vs конкуренты» без маркетинговой воды.</p><h3 class="wp-block-heading">Финансы и риски</h3><p><strong>Финмодель</strong>. Полный комплект: <a href="https://www.indeed.com/career-advice/career-development/profit-and-loss-statement" rel="noreferrer noopener" target="_blank">P&amp;L</a>, <a href="https://www.indeed.com/career-advice/career-development/income-statement-vs-balance-sheet-vs-cash-flow" rel="noreferrer noopener" target="_blank">Cash Flow, Balance</a>. Драйверы выручки по сегментам, маржинальность и операционные расходы.</p><p><strong>Unit‑экономика</strong>. В разрезе сегментов и динамике по кварталам. Ключевые ориентиры: <a href="https://online.hbs.edu/blog/post/ltv-cac" target="_blank" rel="noreferrer noopener">LTV/CAC</a> и срок окупаемости.</p><p><strong><a href="https://noboring-finance.ru/gazeta/opex-i-capex-chto-eto-raznica-zachem-i-kak-analizirovat" rel="noreferrer noopener" target="_blank">CAPEX/OPEX</a>, <a href="https://carta.com/learn/startups/metrics/burn-rate/" rel="noreferrer noopener" target="_blank">runway и burn</a></strong>. Сценарии развития (базовый, оптимистичный, консервативный) и чёткие триггеры, когда нужно пересматривать стратегию.</p><p><strong>Риски</strong>. Стратегические, продуктовые, финансовые, юридические и операционные. Делайте матрицу Вероятность х Влияние и прописывайте план <a href="https://habr.com/ru/articles/312518/" rel="noreferrer noopener" target="_blank">BCP/DR</a> с целевыми <a href="https://habr.com/ru/companies/sberbank/articles/838226/" rel="noreferrer noopener" target="_blank">RTO/RPO</a>.</p><p><strong>Комплаенс</strong>. Всё, что связано с законами и безопасностью: GDPR/152‑ФЗ, политики ИБ и реагирования на инциденты, минимальный набор контролей (<a href="https://selectel.ru/blog/what-is-iam/" rel="noreferrer noopener" target="_blank">IAM</a>, журналирование, бэкапы, privacy notice и тд), а для зрелых — сертификация <a href="https://ru.wikipedia.org/wiki/ISO/IEC_27001" rel="noreferrer noopener" target="_blank">ISO 27001</a> или <a href="https://habr.com/ru/companies/yandex/articles/536920/" rel="noreferrer noopener" target="_blank">SOC</a>.</p><h3 class="wp-block-heading">Команда</h3><p><strong>Оргструктура</strong>. Как сейчас устроена команда и к чему хотите прийти. Кто за что отвечает.</p><p><strong>Ключевые люди</strong>. Краткие CV, реальные победы и честные ошибки. Важно показать, что команда не «безликий ресурс», а движущая сила.</p><p><strong>Консультанты и адвайзеры</strong>. Кто помогает, в какой роли и с какой частотой участвует.</p><p><strong>Культура</strong>. Ценности команды, подход к решению конфликтов и механизмы обратной связи внутри компании.</p><p><strong>Проектные процессы</strong>. Основная методология, ключевые ритуалы, механики фиксации квартального планирования, спринтов и задач.</p><h3 class="wp-block-heading">Юридический блок</h3><p><strong>IP, интеллектуальная собственность</strong>. Права на код и бренд, лицензии, патенты или заявки, товарные знаки, пользовательские соглашения.</p><p><strong>Обязательства и споры</strong>. Действующие судебные процессы, кредиторка, гарантии и прочее.</p><h3 class="wp-block-heading">Data Room</h3><p>В идеале, все эти данные и документы должны быть упорядочены и собраны в одном месте. Я часто встречал ситуации, когда, вроде, всё есть, но одни документы в ИБ, другие у продажников, третьи в репозитории на гитлабе.</p><p>Последний вариант про репозиторий, кстати, довольно неплохой (если допускается централизованный доступ ко всем документам). Обычно у меня получается подобная структура папок, но вы можете придумать свою:</p><ul class="wp-block-list"><li>0_Executive</li><li>1_Corporate</li><li>2_Financials</li><li>3_Product</li><li>4_Sales_Marketing</li><li>5_Legal</li><li>6_Team</li><li>7_Customers</li><li>8_Intellectual_Property</li><li>9_Security_Compliance</li></ul><p>Внутри — MD-файлы с перекрёстными ссылками, таблицы, презентации и прочее. Но вы можете выбрать любой другой инструмент хранения.</p><figure class="wp-block-pullquote"><blockquote><p>Важно: внимательно следите за актуальностью документов, регулярно делайте апдейт-ревью. Иначе очень быстро ваша «сборка» перестанет быть полезной.</p></blockquote></figure><h2 class="wp-block-heading">Как это сделать за 6–8 недель</h2><p>Разумеется, сроки указаны примерные, от компании к компании они могут отличаться. Ну и содержание этапов тоже приблизительное — как я уже говорил, руководствуйтесь здравым смыслом, ресурсами и реалиями бизнеса.</p><ol class="wp-block-list"><li><strong>Аудит (1 неделя)</strong>. Это момент правды: собрать все факты, вытащить цифры и документы, посмотреть на реальное состояние процессов и рисков. Здесь задача не «сделать красиво», а честно понять, где мы находимся и что мешает.</li><li><strong>Стратегия (1 неделя)</strong>. Вторая неделя про смысл и фокус. Формулируем, куда мы идём, какие сегменты важны, какие гипотезы роста проверяем в первую очередь. Определяем NSM, целевые KPI, строим картину каналов и подход к рынку.</li><li><strong>Производство (2–3 недели)</strong>. Дальше — ручная работа: собираем материалы, формулируем истории успеха, описываем процессы и считаем экономику. Это не про полировку дизайна, а про перевод стратегии в конкретные рабочие документы и инструменты.</li><li><strong>Внедрение (1-2 недели)</strong>. Здесь мы вшиваем всё собранное в реальные процессы: подключаем аналитику, налаживаем лид-менеджмент, обучаем команду, готовим пространство для инвестора или партнёра. Суть этапа в том, чтобы артефакты перестали быть файликами и стали частью работы.</li><li><strong>Замер и правки (1 неделя)</strong>. На этом этапе проверяем, работает ли новая конструкция. Прогоняем воронки, смотрим на отклики, тестируем ключевые гипотезы. И сразу же правим то, что не летает. Это не финал, а первый цикл обратной связи.</li></ol><h2 class="wp-block-heading">Фреймворки от вкусовщины</h2><p>Я не очень люблю шаблоны и слепое следование методологиям. Однако часто команда просто не знает, с какой стороны подступиться к упаковке. Вот вам несколько фреймворков, которые помогут избежать лишней самодеятельности:</p><ul class="wp-block-list"><li><strong>Value Proposition Canvas</strong>. Фиксирует соответствие «боли/выгоды» клиента и вашего предложения. Помогает сверять фичи с ценностью и доказательствами.</li><li><strong>Jobs To Be Done (JTBD)</strong>. Смотрим на «работы» клиента, контекст и триггеры выбора. Используем job stories в демо и продуктовых решениях.</li><li><strong>Opportunity Solution Tree (OST)</strong>. Дерево от цели к возможностям и экспериментам; дисциплинирует приоритизацию и формулировку исследовательских вопросов.</li><li><strong>RICE‑приоритизация</strong>. Быстрое ранжирование бэклога: Reach x Impact x Confidence / Effort.</li><li><strong>Kano‑модель</strong>. Помогает различать базовые ожидания (must‑have), характеристики, напрямую влияющие на удовлетворённость (performance), и «вау‑факторы» (delighters).</li><li><strong>AARRR (Pirate Metrics)</strong>. Скелет воронок роста: Acquisition → Activation → Retention → Revenue → Referral.</li><li><strong>OKR</strong>. Связка целей и измеримых результатов, цикл квартальной фокусировки.</li><li><strong>Wardley Maps</strong>. Карта ценностной цепочки и стадий эволюции компонентов — помогает принимать архитектурные и продуктовые решения.</li><li><strong>Business Model Canvas</strong>. Быстрый способ описать бизнес‑логику: сегменты, ценность, каналы, отношения, доходы/издержки, ресурсы и партнёры.</li></ul><h2 class="wp-block-heading">Итог</h2><p>Упаковка — это дисциплина, а не творчество. Твори в продукте, а здесь — считай, фиксируй и проверяй. Красота артефактов не спасает от отсутствия приоритета, а приоритет без экономики превращается в веру. И наоборот: простые документы, в которых все числа и слова связаны между собой, дают бизнесу то, что он любит больше всего — предсказуемость.</p><p>Запись <a href="https://sherer.pro/blog/business-packaging/">Упаковка бизнеса: от диагностики до метрик и артефактов</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Дизайн-система как тюрьма</title><link>https://sherer.pro/blog/dizain-sistema-kak-tyurma/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Tue, 02 Sep 2025 10:16:27 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[Управление]]></category><guid isPermaLink="false">https://sherer.pro/?p=4497</guid><description><![CDATA[<p>Почему иногда дизайн-система может больше вредить, чем помогать? Статья о том, как это понять и что с этим делать.</p><p>Запись <a href="https://sherer.pro/blog/dizain-sistema-kak-tyurma/">Дизайн-система как тюрьма</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Зачем вообще нужна дизайн-система? В первую очередь, для стабилизации и ускорения проектирования с разработкой. Затем — для унификации пользовательского опыта. Идея хорошая, однако иногда вместо этого мы просто получаем барьер на каждом шаге. Перекрасить кнопку? Согласование. Новый элемент или паттерн? Дизайн-комитет. А/В-тест? Сначала в ДС.&nbsp;</p><p>Команда учится делать не «лучше», а «правильнее». Развитие продукта замирает, потому что «в системе так не принято». Это и есть ДС-тюрьма: удобно сторожам, плохо заключённым.</p><h2 class="wp-block-heading">Признаки проблемы</h2><p>Если вы нашли у себя хотя бы 2-3 из указанных ниже симптомов, то эта статья для вас:</p><ol class="wp-block-list"><li>Унификация ради унификации. Понятно, почему нельзя, непонятно — зачем.</li><li>Любая, даже самая мелкая, фича сначала упирается в дизайн-систему. Маркетинговые лендинги-однодневки не создаются на скорую руку по гайдам, а вынуждены проходить полноценную верификацию.</li><li>Метрики и эксперименты застревают, потому что гипотезы ждут внедрения в ДС дольше, чем живёт бизнес-задача.</li><li>Часто звучит «в системе так не предусмотрено», и на этом обсуждение заканчивается.</li><li>Команда обходит систему втихаря, если ДС не помогает, а мешает. В итоге создаются костыли и подпольные клоны библиотек.</li><li>Медиана времени от «хочу» до «запустили» растёт месяц за месяцем. ДС начинают воспринимать не как инструмент, а как бюрократию.</li><li>Уходят лучшие практики: упор делается на контроль и одинаковость, а про доступность или производительность забывают.</li><li>Дизайнеры и разработчики начинают дублировать работу вне ДС, тратя двойные усилия.</li><li>Дизайн ради дизайна: решения принимаются для красоты системы, а не для пользы продукта.</li><li>Люди перестают воспринимать ДС как источник ценности: обновления видятся как «еще одна миграция».</li></ol><p>Конечно, бывает по-разному. Например, для маленькой команды некоторые признаки «токсичности» могут быть нормой, а не проблемой, потому что ресурсов мало. В энтерпрайзе же признаки вроде «медианы времени до изменения UI» могут быть искажены внешними факторами (такими как compliance с регуляциями). Но в целом, это десяток чётких показателей того, что с ДС есть какие-то проблемы.</p><h2 class="wp-block-heading">Корни проблемы</h2><p>Чтобы понять, почему так происходит, давайте разберём типичные причины токсичности дизайн-систем.</p><h3 class="wp-block-heading">Подмена цели</h3><p>Вместо «чтобы быстрее и надёжнее» проповедуется «чтобы всё одинаковое». Изначальная задача дизайн-системы — ускорять работу и повышать надёжность интерфейсов. Но на практике она часто превращается в инструмент одинаковости ради одинаковости. Экран выглядит «по гайду», но продукт не становится ни быстрее, ни удобнее. Ценность смещается с пользы для пользователя и команды на косметическую унификацию.</p><p>Решение: пересобрать цель ДС и зафиксировать её в понятной форме. Главный показатель — скорость и надёжность работы. Одинаковость интерфейсов должна быть лишь средством, а не самоцелью.</p><h3 class="wp-block-heading">Ошибка уровня абстракции</h3><p>Компоненты проектируются слишком высокоуровневыми и жёсткими, как будто «на все случаи жизни». В итоге реальным продуктовым задачам они не подходят: дизайнеры и разработчики вынуждены обходить ограничения, городить костыли и тратить время на адаптацию.</p><p>Решение: делать элементы от простого к сложному, предусматривать варианты настройки. Строить их на основе реальных задач, а не абстрактных идеалов.</p><h3 class="wp-block-heading">Полицейская модель управления</h3><p>Вместо поддержки Design Ops начинает работать как надзорный орган. Любое отклонение воспринимается как нарушение, решения проверяются по букве гайдлайна. Это убивает инициативу, рождает страх ошибиться и стимулирует команды обходить систему тайком.</p><p>Решение: перевести Design Ops в сервисную модель. Ввести сроки ответов, понятную поддержку и чёткую роль «помощников», а не «надзирателей».</p><h3 class="wp-block-heading">Недостаток обратной связи</h3><p>ДС-команда редко общается с продуктовой командой и разработчиками. В результате её решения оторваны от реальных задач и проблем пользователей.</p><p>Решение: наладить регулярные встречи, показывать новые компоненты до внедрения, собирать обратную связь через чаты и опросы.</p><h3 class="wp-block-heading">Замороженные токены</h3><p>Равно как и отсутствие версионности. Базовые цвета, шрифты и отступы застывают навсегда. Даже небольшое изменение превращается в длинную и болезненную миграцию, которая блокирует работу продукта. Из-за этого обновления откладываются месяцами, а интерфейсы устаревают.</p><p>Решение: ввести простую систему версий и сроков поддержки. Старые варианты объявлять «устаревающими» заранее, давать автоматические инструменты для перехода и выпускать обновления по расписанию.</p><h3 class="wp-block-heading">Отсутствует экспериментальный контур</h3><p>В системе нет «песочницы» для быстрых проб. Любая гипотеза должна пройти тот же тяжёлый процесс, что и серьёзные обновления. В результате простые идеи застревают и не доходят до пользователей.</p><p>Решение: создать отдельный слой для экспериментов, где допускаются быстрые и лёгкие проверки. В основную систему поднимать только то, что доказало ценность и устойчивость.</p><h3 class="wp-block-heading">Недостаток прозрачности</h3><p>Участники не понимают, кто и на основе каких критериев принимает решения о дизайн-системе, отклонении или принятии инициатив. Это рождает недоверие и ощущение произвола. </p><p>Решение: сделать процесс открытым. Публиковать заявки и критерии оценки, вести видимый статус инициатив.</p><h3 class="wp-block-heading">Гейткипинг без SLA</h3><p>Ревью и согласования могут тянуться неделями. Нет прозрачных сроков, непонятно, когда ждать ответа. Решения расплывчаты, инициативы остывают, а команда теряет энергию и интерес к изменениям.</p><p>Решение: ввести фиксированные сроки для рассмотрения (например, 3 дня), назначать ответственных для каждой инициативы.</p><h3 class="wp-block-heading">Отсутствие приоритизации</h3><p>В дизайн-систему пытаются внести всё подряд, не разделяя на must-have и nice-to-have. Это перегружает команду, размывает ценность и создаёт ощущение работы без реального результата.</p><p>Решение: научиться расставлять приоритеты по пользе для продукта, бизнеса и пользователей. Сначала ключевые вещи, потом второстепенные.</p><h3 class="wp-block-heading">Игнорирование локальных контекстов</h3><p>Региональные, брендовые или продуктовые особенности не учитываются. Всё загоняется в одну колею, из-за чего команды вынуждены создавать подпольные обходы.</p><p>Решение: предусматривать слой настроек под контексты. Разрешать локальные изменения через понятные механизмы, а не через подпольные костыли.</p><h3 class="wp-block-heading">Отсутствие SLA и метрик самой ДС</h3><p>Никто не замеряет, ускоряет ли система работу, снижает ли затраты и повышает ли качество. Без данных невозможно понять, приносит ли ДС пользу или только создаёт нагрузку. Всё происходит или «по ощущениям» или «по принуждению».</p><p>Решение: ввести набор простых показателей. Замерять их регулярно и менять процессы по результатам. Ниже — примеры таких показателей.</p><h2 class="wp-block-heading">Метрики токсичности дизайн-системы</h2><p>На самом деле, измерить эффективность ДС вообще не сложно. Вот вам несколько типовых метрик (важно понимать, что их нужно адаптировать и дополнять под реалии своей команды/процессов/продукта).</p><p><code>median time to ui change</code> Среднее время (желательно медиана) до изменения UI. Работает, если есть какие-то исторические данные. Просто сравните показатель до внедрения ДС и после, чтобы понять, реально ли система ускоряет работу.</p><p><code>% blocked PR</code> Процент запросов (например, product request), заблокированных аргументом «не соответствует ДС». Доля задач, которые останавливаются не по сути, а из-за формальных правил.</p><p><code>number of forks &amp; overrides</code> Количество (да и вообще наличие) форков от репозитория с ДС и локальных&nbsp;override&#8217;ов. Сколько команд вынуждены городить обходные решения вместо использования ядра.</p><p><code>adoption rate</code> Какие продукты реально подключены к ядру ДС и используют его обновления, а какие живут на клон-сборках и по сути поддерживают собственные версии.</p><p><code>number of experiments</code> Количество экспериментов по сравнению с прошлым периодом. Если гипотезы стали запускать реже — система мешает развитию. Тут могут быть и другие причины, поэтому на этот показатель нужно опираться осторожно.</p><p><code>time to review</code> Среднее время на ревью и согласование изменений в ДС. Если этот процесс занимает недели, значит система тормозит.</p><p><code>contribution success rate</code> Доля предложений в дизайн-систему, которые дошли до внедрения. Если большинство инициатив отбрасывается или зависает, то ДС становится барьером.</p><p><code>update lag</code> Задержка между выпуском новой версии ядра ДС и фактическим обновлением продуктов. Большие лаги показывают, что миграции слишком болезненны.</p><p><code>a11y &amp; performance coverage</code> Процент компонентов, проверенных на доступность и производительность. Если метрика не растёт, ДС концентрируется на унификации, а не на качестве.</p><p><code>user satisfaction</code> Удовлетворённость продуктовых команд работой с ДС (например, через регулярные опросы).</p><p>Если исторических данных нет, можно использовать альтернативы: опросы, журналы использования (например, в Figma Library Analytics можно анализировать использование компонентов за последний год).</p><p>Не доверяйте только одной метрике, делайте связки, кросс-чек. Если медиана времени растёт, но adoption высокий — проблема не в ДС, а в процессах (например, гейткипинг).</p><p>Используйте триангуляцию. Например, 3+ метрики + качество: процент заблокированных + доля форков + опросы. Если заблокированных много, но форков мало — команды просто игнорируют ДС. Если форков много — ДС недостаточно гибкая.</p><p>Один показатель (например, рост экспериментов) может быть из-за сезонного пика, а не из-за качества ДС. Комбинируйте с бизнес-метриками (ROI, time-to-market) для полной картины.</p><h2 class="wp-block-heading">Итог</h2><p>Дизайн-система должна быть хорошо понятной дорогой с разметкой и ограждениями, а не тюрьмой с решётками. Её задача — помогать быстрее и надёжнее создавать продукты, а не тормозить команды ради культа унификации. Если вы заметили признаки токсичности, это повод перестроить цели, процессы и метрики. Сделайте систему помощником, а не надзирателем — и она станет инструментом роста, а не барьером.</p><p></p><p>Запись <a href="https://sherer.pro/blog/dizain-sistema-kak-tyurma/">Дизайн-система как тюрьма</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Функциональная архитектура цифровых продуктов, часть 5</title><link>https://sherer.pro/blog/funkcionalnaya-arhitektura-cifrovyh-produktov-chast-5/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Mon, 17 Feb 2025 06:30:11 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[гайд]]></category><category><![CDATA[функциональное проектирование]]></category><guid isPermaLink="false">https://sherer.pro/?p=3930</guid><description><![CDATA[<p>Детальное функциональное проектирование и частые, но не всегда очевидные подводные камни.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaya-arhitektura-cifrovyh-produktov-chast-5/">Функциональная архитектура цифровых продуктов, часть 5</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Это — последняя часть цикла про функциональное проектирование. Здесь мы поговорим о детальном функциональном проектировании и разберём несколько подводных камней. </p><p>В целом, этого цикла должно быть достаточно, чтобы вы уверенно начали работать с функциональной архитектурой, не опасаясь заблудиться в нюансах.</p><h2 class="wp-block-heading">Детальное функциональное проектирование</h2><p>Как вы помните, в предыдущих статьях я различал высокоуровневое и детальное проектирование. И если о первом уже говорилось достаточно, то пришло время поглубже рассмотреть второе.</p><h3 class="wp-block-heading">Именование функций</h3><p>У каждой функции и каждого функционального раздела должно быть своё уникальное название. Названия должны быть максимально понятными и самодостаточными. Используйте английский язык — это обеспечит единое понимание в команде (особенно если она международная) и немного упростит работу программистов.</p><p>Удачное название функции упрощает её поддержку и снижает риск двусмысленности.</p><figure class="wp-block-table"><table><thead><tr><th>Примеры удачных названий</th><th>Примеры неудачных названий</th><th><strong>Причина &#171;неудачности&#187;</strong></th></tr></thead><tbody><tr><td><code>UserRegistration</code></td><td><code>Reg</code> </td><td>– Слишком краткое и абстрактное название, которое неясно передаёт смысл функции.<br>– Аббревиатура «Reg» может быть интерпретирована по-разному (например, &#171;регистрация&#187;, &#171;регион&#187; или даже &#171;регламент&#187;).</td></tr><tr><td><code>AddToCart</code></td><td><code>AddItem</code> </td><td>– Название «AddItem» не указывает на конкретное место назначения – куда именно добавляется элемент.<br>– В контексте онлайн-магазина важно подчеркнуть, что речь идёт о корзине (cart), а слово «Item» само по себе может использоваться в различных сценариях, не только в e-commerce.</td></tr><tr><td><code>SubmitReport</code></td><td><code>ReportSubmission</code> </td><td>– Использование существительного вместо глагола может сделать название менее динамичным и не столь интуитивно понятным.<br>– «SubmitReport» сразу сигнализирует о действии – отправке отчёта, тогда как «ReportSubmission» звучит как описание процесса или объекта, а не как команда для выполнения функции.</td></tr><tr><td><code>VerifyEmail</code></td><td><code>EmailCheck</code></td><td>– Название «EmailCheck» менее конкретно. Оно не уточняет, что именно проверяет функция: корректность или подлинность email-адреса.<br>– Глагол «Verify» в «VerifyEmail» чётко указывает на необходимость верификации (проверки) адреса, что более точно отражает суть задачи, в то время как «Check» может трактоваться как поверхностная проверка без гарантии достоверности.</td></tr></tbody></table></figure><p>Неудачные названия часто бывают слишком абстрактными или краткими, что затрудняет чтение и может привести к ошибкам при оценке и реализации. Следуйте нескольким простым правилам:</p><ul class="wp-block-list"><li><strong>Глаголы</strong>: название функции, как правило, должно отражать действие. Например, из названия <code>AddUser</code> сразу понятно, что происходит добавление пользователя.</li><li><strong>Минимум аббревиатур</strong>: если аббревиатура не общеизвестна, лучше её избежать. Если же совсем никак, заведите в проектной документации <a href="https://sherer.pro/blog/uchim-proektnuju-komandu-chitat/#3-6-slovar-terminov">словарь</a>.</li><li><strong>Ясность</strong>: человек должен понимать суть функции, даже если читает её название впервые.</li></ul><h3 class="wp-block-heading">Функциональные сценарии</h3><p>Функциональные сценарии прорабатываются итеративно: от самых простых к детализированным. К этому времени накапливается достаточное количество данных для их глубокой проработки.</p><p>Пример высокоуровневого сценария для <code>UserRegistration</code>:</p><ol start="1" class="wp-block-list"><li>Пользователь открывает страницу регистрации.</li><li>Вводит свои данные.</li><li>Нажимает кнопку &#171;Зарегистрироваться&#187;.</li><li>Валидация: система проверяет данные.<ul class="wp-block-list"><li>Если всё корректно, создаётся аккаунт, и на почту отправляется письмо для подтверждения.</li><li>Если данные некорректны, отображается ошибка.</li></ul></li><li>Подтверждение: пользователь переходит по ссылке в письме, чтобы подтвердить регистрацию.</li><li>Если почта не подтверждена в течение 24 часов, аккаунт удаляется, пользователю показывается сообщение об ошибке.</li></ol><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd1527&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd1527" class="wp-block-image size-full wp-lightbox-container"><img fetchpriority="high" decoding="async" width="2560" height="997" 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/2024/11/functional-arch-registration-scaled.jpg" alt="" class="wp-image-4341" srcset="https://sherer.pro/content/uploads/2024/11/functional-arch-registration-scaled.jpg 2560w, https://sherer.pro/content/uploads/2024/11/functional-arch-registration-1048x408.jpg 1048w, https://sherer.pro/content/uploads/2024/11/functional-arch-registration-768x299.jpg 768w" sizes="(max-width: 2560px) 100vw, 2560px" /><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>Теперь рассмотрим, как можно детализировать отдельный фрагмент такого сценария: например, <code>ConfirmEmail</code>:</p><ul class="wp-block-list"><li>Мы проработаем обмен данными и их сохранение.</li><li>Для каждой проверки будет выделена отдельная функция.</li></ul><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd186c&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd186c" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" width="2560" height="1376" 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/2024/11/functional-arch-confirm-email-scaled.jpg" alt="" class="wp-image-4344" srcset="https://sherer.pro/content/uploads/2024/11/functional-arch-confirm-email-scaled.jpg 2560w, https://sherer.pro/content/uploads/2024/11/functional-arch-confirm-email-1048x563.jpg 1048w, https://sherer.pro/content/uploads/2024/11/functional-arch-confirm-email-768x413.jpg 768w" sizes="(max-width: 2560px) 100vw, 2560px" /><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>Обратите внимание, что над некоторыми клиентскими функциями указаны названия и состояния экранов (например, <code>ConfirmEmail.check</code>) — мы к этому ещё вернёмся.</p><h3 class="wp-block-heading">Описание функций</h3><p>Однако одних сценариев зачастую оказывается не достаточно. Передать абсолютно всю информацию о функции и её работе с помощью схем не всегда возможно. С этой задачей вообще слабо справляются любые графические средства, хоть ФС, хоть диаграммы последовательностей. Да, разного рода схемы позволяют однозначно определить сценарии и потоки данных, но какие-то вещи можно отобразить только в виде текста.</p><p>Описание функции должно быть лаконичным и понятным для всех участников команды: от разработчиков до уборщиков и бизнес-специалистов. Что обычно включает в себя описание функции:</p><ul start="1" class="wp-block-list"><li><strong>Назначение</strong>: зачем нужна функция и что она делает.</li><li><strong>Входные и выходные данные</strong>: какие данные функция принимает и что возвращает (если применимо).</li><li><strong>Зависимости</strong>: с чем функция взаимодействует, без чего не будет работать (например, функциональный раздел <code>confirmPhone</code> не получится реализовать до того, как будет готов <code>sendSMS</code>).</li><li><strong>Пример использования</strong>: когда и как функция применяется.</li></ul><p>Пример упрощённого описания функции <code>AddToCart</code>:</p><ul class="wp-block-list"><li><strong>Назначение</strong>: добавить товар в корзину для оформления заказа.</li><li><strong>Входные данные</strong>: идентификатор <code>sku</code> и количество <code>count</code> товаров, идентификатор пользователя <code>guid</code>.</li><li><strong>Выходные данные</strong>: обновлённое состояние корзины, массив <code>cardState</code>.</li><li><strong>Зависимости</strong>: <code>InventoryService</code> (для проверки наличия товара).</li><li><strong>Пример использования</strong>: пользователь добавляет товар в корзину, система проверяет наличие и обновляет состояние корзины.</li></ul><p>Здесь можно добавить User Stories, Use Cases и вообще всё, что вы посчитаете нужным. Главное, чтобы описание было трактуемым однозначно.</p><p>Итеративная работа над сценариями позволяет их улучшать по мере получения новой информации и обратной связи от связанных специалистов или пользователей.</p><h2 class="wp-block-heading">Названия и состояния экранов</h2><p>Практически каждая функция системы так или иначе связана с каким-либо экраном. Кажется очевидным, что экраны и функции нужно прорабатывать совместно, однако я часто встречал ситуации, когда дизайнеры работают независимо от аналитиков и разработчиков.</p><figure class="wp-block-pullquote"><blockquote><p>Проработка экранов и их состояний не может быть отделена от функционального проектирования.</p></blockquote></figure><p>Вспомните, сколько раз вы получали (или предоставляли) макеты, где нет &#171;нулевых&#187; состояний или не предусмотрены &#171;пограничные&#187; ситуации, вроде ошибки загрузки данных.</p><h3 class="wp-block-heading">Названия экранов</h3><p>Название экрана должно ясно объяснять его назначение. Если у вас в Figma экраны будут именованы так же, как в проектной документации, это упростит работу фронтендеров и сделает эту документацию более консистентной. </p><figure class="wp-block-table"><table><tbody><tr><td>Название экрана</td><td>Описание</td></tr><tr><td><code>Registration</code></td><td>Экран для регистрации новых пользователей.</td></tr><tr><td><code>ShoppingCart</code></td><td>Экран, на котором отображаются добавленные товары.</td></tr><tr><td><code>OrderConfirmation</code></td><td>Экран подтверждения деталей заказа перед покупкой.</td></tr></tbody></table></figure><h3 class="wp-block-heading">Состояния экранов</h3><p>Каждый экран может находиться в различных состояниях, которые важно предусмотреть заранее. Пример состояний для экрана <code>ShoppingCart</code>:</p><figure class="wp-block-table"><table><tbody><tr><td>Экран и состояние</td><td>Описание</td></tr><tr><td><code>ShoppingCart.default</code></td><td>Загруженное состояние. Отображаются товары, их количество и цена; пользователь может изменить количество или удалить товар.</td></tr><tr><td><code>ShoppingCart.empty</code></td><td>Пустое состояние. Нет товаров в корзине; выводится сообщение: «Ваша корзина пуста. Начните покупки прямо сейчас!»</td></tr><tr><td><code>ShoppingCart.error</code></td><td>Состояние ошибки. Отображается сообщение об ошибке и предложение повторить попытку позже или обратиться в поддержку.</td></tr></tbody></table></figure><p>Помните, в сценарии над некоторыми клиентскими функциями указывались названия и состояния экранов? А теперь представьте, что это — ссылки на конкретные фреймы в Figma. Разработчикам не нужно больше играть в &#171;найди 10 различий&#187;, они видят взаимосвязь функций и экранов напрямую.</p><h2 class="wp-block-heading">Подводные камни</h2><p>Как и везде, при работе над функциональной архитектурой, можно порядком наломать дров. Очень не хочется, чтобы ФА постигла <a href="https://sherer.pro/blog/personazhi-po-kuperu-kak-diskreditirovat-metodologiyu/">участь</a> куперовских персон. </p><p>Ниже я перечислил самые частные ошибки и недоработки, которые допускал сам или видел у других.</p><h3 class="wp-block-heading">Недостаточная проработка</h3><p>Иногда хочется приступить к разработке пораньше. Это желание понятно, я много раз слышал обвинения в &#171;вотерфольности&#187; моего подхода. И именно &#171;аджайлами&#187; люди частенько прикрывают нежелание или неумение нормально проектировать. Ну что ж, дело хозяйское.</p><p>Я хочу только отметить, что недостаточная глубина проработки архитектуры создаёт ложное ощущение безопасности. Проблемы проявляются позже, когда проект уже зашёл слишком далеко, и исправления становятся всё более дорогими и трудоёмкими. Действуйте итерациями, никто не предлагает сначала продумать всё, и только потом садиться разрабатывать.</p><p>Пример: </p><p class="highlighted">Как-то я участвовал в доработке внутреннего портала одной компании под нужды другой (частый кейс). Руководство надавило, и в разработку была отдана сырая архитектура. Позже выяснилось, что спроектированная система не полностью поддерживает необходимое согласование отпусков и расчёт налогов. Масштабная переработка, срок сдачи сдвинулся на полтора месяца.</p><h3 class="wp-block-heading">Уровень абстракции</h3><p>Я часто об этом говорю (например, <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/?highlight=%D0%B0%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%86%D0%B8%D0%B8#3-1-uroven-abstrakcii">здесь</a>), и повторю снова.</p><p>Правильный уровень абстракции — это баланс. Слишком высокий абстрагирует архитектуру от реальности, а слишком низкий перегружает деталями, усложняя восприятие и развитие.</p><p>Пример:</p><p class="highlighted">В одном из недавних проектов аналитик проявил чудеса самостоятельности и (пока никто не видел) расписал в деталях одну из подсистем. Но его работа не учитывала огромное количество нюансов других компонентов, которые к тому времени ещё не были спроектированы. Итог: вся работа в мусорку.</p><h3 class="wp-block-heading">Технические знания</h3><p>Казалось бы, странно требовать от дизайнеров каких-либо знаний в технических областях. Но нет, не странно. </p><figure class="wp-block-pullquote"><blockquote><p>Невозможно задизайнить сложную систему, не понимая, как она будет работать</p></blockquote></figure><p>Недостаток технических знаний у дизайнеров, архитекторов или аналитиков приводит к принятию необоснованных решений. Либо наоборот, авторам архитектуры даже не приходит в голову, что существуют технологии, способные существенно упростить пользовательский опыт.</p><p>Пример: </p><p class="highlighted">При проработке внутренней части корпоративного блога, дизайнеры и аналитики не продумали возможность взаимной блокировки редактора (это когда ты не можешь править текст, который правит кто-то другой). Разработчики тоже не додумались. В итоге какое-то время, пока не внедрили <a href="https://developer.mozilla.org/ru/docs/Web/API/WebSockets_API" target="_blank" rel="noreferrer noopener">веб-сокеты</a>, контент-менеджеры перезатирали изменения друг друга. </p><h3 class="wp-block-heading">Консультации с экспертами</h3><p>Этот &#171;камень&#187; логически проистекает из предыдущего. Невозможно знать всё. Но можно не стесняться подключать к проектированию специалистов смежных областей. И речь тут не только про технологии, но и про них тоже.</p><p>Чем раньше вы &#171;обстучите&#187; свои решения об ваших коллег, тем более надёжными они станут. Игнорирование консультаций с экспертами приводит к критическим проблемам на поздних стадиях проектирования, разработки и внедрения. Привлечение специалистов позволяет выявить уязвимости проектирования в целом и функциональной архитектуры в частности ещё до начала разработки.</p><p>Пример: </p><p class="highlighted">Делали мобильное приложение. Одной из метрик эффективности продуктового дизайна была конверсия. Однако для пользователей из разных каналов необходимо было создать уникальный опыт. Пришёл с YouTube — один сценарий, с Telegram — другой. Дизайнеры тупо добавили на начальный экран вопрос &#171;откуда вы пришли&#187;. Хотя достаточно было сходить к маркетологам или разрабам, чтобы они рассказали про такое чудо инженерной мысли, как <a href="https://habr.com/ru/companies/otus/articles/688728/" target="_blank" rel="noreferrer noopener">диплинки</a>.</p><h3 class="wp-block-heading">Донесение ценности до бизнеса</h3><p>Самый больной &#171;камень&#187;. Хотя он и не подводный вовсе, а очень даже надводный. Знали бы вы, сколько раз мне приходилось доказывать клиентам, что начинать разработку ещё слишком рано. Или что влитые в проектирование деньги сохранят бюджет проекта в дальнейшем. </p><p>Один мой клиент (Алексей, привет) нашёл прекрасную аналогию: <a href="https://vector-shpunt.ru/blog/raboty-nulevogo-tsikla-stroitelstva/" target="_blank" rel="noreferrer noopener nofollow">нулевой цикл строительства</a>. Это когда в здание уже влито много-много денег, но ни одного этажа ещё не построено. Проведены геологические исследования, получены все разрешающие документы, подведены коммуникации — но внешне всё остаётся практически таким же, как было в самом начале.</p><p>Если бизнес не понимает ценность архитектурных решений, проект не получит достаточной поддержки. Важно доносить ценность функционального проектирования до всех заинтересованных сторон. </p><p>Антипример: </p><p class="highlighted">Я смог донести до клиента важность проектирования и исследований. Сам ездил со специалистами, прикидываясь стажёром. Выкопали вообще все бизнес-процессы до самых корней. С момента начала проектирования до первой строчки кода прошло 9 месяцев. Зато релиз вышел почти через год после начала разработки. Итог: от первой встречи с клиентом до релиза — один год и 11 месяцев. Ключевой конкурент потратил на это почти 5 лет с командой, в 3 раза больше нашей.</p><h3 class="wp-block-heading">Лень и возврат к общей картине</h3><p>Как я уже говорил, продумать <strong>всё</strong> невозможно. Да, вы были хороши и ваша высокоуровневая архитектура прекраснее, чем «Битва кентавров» Микеланджело. Но будьте готовы, что в процессе детальных изысканий вам придётся возвращаться на высокий уровень. И не просто возвращаться, а кое-где существенно его изменять.</p><p>Увлечение деталями иногда мешает вернуться к общей концепции. Это ведёт к потере видения конечной цели и необходимости исправлений.</p><p>Пример: </p><p class="highlighted">Я проектировал одного из своих <a href="https://sherer.pro/pets/wlist/">питомцев</a>. Вроде, предусмотрел всё, всю свою маркерную доску испещрил сценариями, был готов приступать к разработке. Осталось совсем немного: добить механики копирования пункта в собственный вишлист. А это повлекло за собой пересмотр механик регистрации (потому что теперь это нужно было делать не с отдельной страницы) и механик создания вишлиста (по той же причине). Пришлось возвращаться на высокоуровневое проектирование и изменять структуру API. Хорошо, код писать не начал, переписывал бы.</p><h2 class="wp-block-heading">Итог</h2><p>Если вы дочитали эту статью до конца, значит, у вас достаточно мотивации, чтобы начать (или продолжить) делать правильно. Если же вы просто проскроллили вниз — мои соболезнования (и ноль процентов осуждения). Всё, что я мог сделать, чтобы стабилизировать процесс проектирования и разработки, я в этом цикле сделал. </p><p>Дальше дело за вами. </p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaya-arhitektura-cifrovyh-produktov-chast-5/">Функциональная архитектура цифровых продуктов, часть 5</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Функциональная архитектура цифровых продуктов, часть 4</title><link>https://sherer.pro/blog/funkcionalnaya-arhitektura-cifrovyh-produktov-chast-4/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Wed, 28 Feb 2024 13:14:53 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[гайд]]></category><category><![CDATA[функциональное проектирование]]></category><guid isPermaLink="false">https://sherer.pro/?p=3132</guid><description><![CDATA[<p>Как доказать бизнесу необходимость функциональной архитектуры. Почему нет универсального процесса создания ФА и что с этим делать.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaya-arhitektura-cifrovyh-produktov-chast-4/">Функциональная архитектура цифровых продуктов, часть 4</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>Об этом я уже вскользь упоминал в предыдущих частях цикла, теперь же пришло время малость углубиться. И начнём мы, пожалуй, издалека.</p><h3 class="wp-block-heading">Укрепление стандартов</h3><p>Многие из вас если не работали, то хотя бы слышали о <a href="https://ru.wikipedia.org/wiki/V-Model" target="_blank" rel="noreferrer noopener">V-модели</a> разработки ПО, одной из вариаций <a href="https://aws.amazon.com/ru/what-is/sdlc/" target="_blank" rel="noreferrer noopener">SDLC</a>. Она прекрасно себя зарекомендовала, огромное количество компаний создают удивительные продукты на её основе. Однако V-модель, как многие другие, скрывает одну фундаментальную ошибку проектного процесса.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd2d5f&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd2d5f" class="wp-block-image aligncenter size-full wp-lightbox-container"><img decoding="async" width="1620" height="820" 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/2024/01/V-model.png" alt="V-модель разработки программного обеспечения" class="wp-image-3957" srcset="https://sherer.pro/content/uploads/2024/01/V-model.png 1620w, https://sherer.pro/content/uploads/2024/01/V-model-1048x530.png 1048w, https://sherer.pro/content/uploads/2024/01/V-model-768x389.png 768w" sizes="(max-width: 1620px) 100vw, 1620px" /><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>V-модель делает отдельный акцент на тестировании, это позволяет выпускать стабильные продукты с оптимальным Time to Market. Однако стабильность вовсе не означает качество. В погоне за соблюдением стандартов мы часто нарушаем баланс в проектировании.</p><p>Давайте будем честны, в V-модели (как и в большинстве других) всегда есть «главные» направления, которые задают тон всему проектированию. Как правило, такими «главными» становятся либо аналитики, либо дизайнеры. То есть обычно варианта два:</p><ul class="wp-block-list"><li>дизайнеры рисуют макеты по функциональным требованиям;</li><li>аналитики пишут требования, исходя из макетов.</li></ul><p>Ясное дело, я сейчас упростил. Не только «макеты» и не только «требования». Порой просто «лидирующие», а не всегда прям «главные». Не всегда лишь аналитики и дизайнеры, иногда ещё какие-нибудь инженеры (привет, психбольница Купера). Но суть, полагаю, ясна: кто-то всегда отталкивается от видения другой стороны.</p><p>И в этом кроется дьявол. Аналитики (простите, друзья) нифига не шарят в юиксе. Дизайнеры (сорри, гайз) почти ничего не знают о технологических особенностях продукта. Юзерфлоу произрастает из функциональных <strong>требований</strong> и превращается в монстра Франкенштейна, а требования к продукту запросто игнорируют фундаментальные <strong>потребности </strong>пользователей.</p><p>Кроме того, само понятие «функциональных требований» вызывает лично у меня крайне неоднозначные эмоции. В <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/#funkcionalnye-trebovaniya-i-opisanie-4">первой статье</a> цикла я упоминал, что функциональные «требования» и «описание» — отнюдь не одно и то же. Так вот V-модель подразумевает, что в разработку передаются именно «требования». А это значит, что «строители» начинают принимать решения за «инженеров» и даже «архитекторов». Потому что архитектурный максимум, на который способна классическая V-модель, это архитектура «системы».</p><p>Готовые модели и фреймворки часто игнорируют внутреннюю гармонию продукта. Почти всегда есть некоторый перекос в сторону дизайна, аналитики или инженерии. Причём не важно, Agile это, Incremental Model, RAD или Iterative Model.</p><figure class="wp-block-pullquote"><blockquote><p>Важный аспект: я не говорю, что все эти модели ошибочные или неверные. Я говорю лишь, что все они упускают важную часть продуктового процесса. А функциональная архитектура способна восполнять эти пробелы. Она совместима с любой из методологий и только укрепляет каждую из них.</p></blockquote></figure><p>Думаю, вывод здесь очевиден: для бизнеса такой перекос означает снижение качества продукта. Что в конечном счёте увеличивает стоимость его улучшения и развития.</p><p>Во второй части статьи я расскажу, как синхронизировать активность всех направлений, создавая единое и гармоничное представление о продукте у проектной команды.</p><h3 class="wp-block-heading">Снижение продуктовой энтропии</h3><p>Изначальный хаос — неотъемлемая часть любого проектного процесса. На старте всегда белых пятен больше, чем раскрашенных. Мы к этому привыкли, и наше «раскрашивание» чаще всего также носит хаотичный характер. Исследователи, аналитики, дизайнеры и «проектировщики» почти всегда закапываются в детали, стараясь здесь и сейчас максимально развеять неизвестность. Из-за этого они часто принимают решения без оглядки на общую картину. Не учитывая фундамент, базис продуктовых механик. Всё это ведёт не к снижению энтропии, а к её усугублению, пусть и отложенному. Иллюзия упорядоченности заставляет нас думать, что ситуация под контролем, тогда как на самом деле всё ровно наоборот.</p><p>Другими словами, мы проектируем продукты по кускам, максимально углубляясь в ту часть, которой сейчас занимаемся. Продумываем экран каталога? Надо сразу понять, что и <strong>как</strong> отображать на каждой карточке товара. Проектируем чат? Давайте тут же решим, будет ли возможность преобразовывать текст в эмодзи. И не важно, что потом принятые нами решения станут барьерами, ограничениями продукта — потому что создавались без оглядки на общую картину. Ведь общей картины-то на тот момент и не было.</p><p>Приведу пример. На заре моего аналитического опыта был у меня проект по цифровому депонированию объектов интеллектуальной собственности. Такое электронное подтверждение авторства. Основой сервиса была форма загрузки контента, и я, по неопытности, сделал именно на ней основной акцент. Мы с аналитиками и дизайнерами вылизали эту форму до блеска. Она была идеальной, но абсолютно не учитывала категории пользователей. Как потом оказалось, жизненный цикл юридических и физических лиц в продукте отличается очень и очень сильно. Нам пришлось серьёзно переработать форму депонирования и её логику, так как с юридической точки зрения заполняемые поля значительно отличались. Мы потратили время и ресурсы на проработку того, что потом поменялось более чем на 70%. Более того, разработчики к тому времени уже сформировали определённый фундамент, и им тоже пришлось многое переделывать.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd3182&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd3182" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="940" 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/functional-arch-steps.png" alt="Этапы проработки функциональной архитектуры" class="wp-image-3885" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-steps.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-steps-1048x470.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-steps-768x344.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>Работа над функциональной архитектурой подразумевает этап высокоуровневого проектирования, и именно на нём выравниваются подобные моменты. Сначала продумали базис, и уже на него наложили детальное описание функций. Это позволяет не только стабилизировать проектирование и разработку, но и повышает общее качество продукта.</p><p>И нет, это не waterfall. Проектирование может и должно осуществляться итерационно.</p><h3 class="wp-block-heading">Снижение издержек</h3><p>Как обычно происходит передача требований в разработку? Берутся макеты, UX-спецификация (если вы крутые), какие-нибудь функциональные и нефункциональные требования, всякие User Stories, Use Cases, User Flows — и отправляются разработчикам. Которые анализируют все эти (зачастую разрозненные) артефакты и решают, как именно должна работать система. Иногда в процесс встраиваются системные аналитики, которые немного упрощают процесс анализа — но даже они не проектируют функции продукта. Максимум, прорабатывают интеграционные механики и глобальную (не функциональную) архитектуру.</p><p>При этом важно понимать, что чаще всего разработчики анализируют не всю систему, а только её часть. Ту часть, которая им прилетела в рамках очередной итерации/спринта. Это значит, что единой функциональной картины нет ни у кого. Одни и те же функции могут быть написаны два раза, другие могут не учитывать особенности уже написанных. Если проект действительно сложный, то со временем это приводит к накоплению так называемого «технического долга», который тоже почему-то стал нормой индустрии.</p><figure class="wp-block-pullquote"><blockquote><p>Мы с вами привыкли, что цифровые продукты уже в процессе своего создания включают в себя устаревшие фрагменты, legacy. Такое, блин, возможно только в IT.</p></blockquote></figure><p>Круто, если на проекте есть выделенный архитектор. Но даже он обычно проектирует не функциональную модель, а облачную или программную. Сильный техлид уменьшит количество проблемных участков кода, но даже он не способен постоянно помнить о всех функциях системы. Закон Миллера вполне конкретно <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_%D1%81%D0%B5%D0%BC%D1%8C_%D0%BF%D0%BB%D1%8E%D1%81-%D0%BC%D0%B8%D0%BD%D1%83%D1%81_%D0%B4%D0%B2%D0%B0" target="_blank" rel="noreferrer noopener">определяет</a> количество элементов, которые может удержать в кратковременной памяти обычный человек: максимум 9. Даже если наш архитектор/техлид гений и может в два раза больше — это не сравнимо с количеством функций даже самой простой цифровой системы.</p><p>Разумеется, всё это приводит к усложнению поддержки и развития продукта. Дорабатывать его становится сложно, внедрение каждой новой фичи стоит всё больше и больше денег.</p><p>Функциональная архитектура — не серебряная пуля. Она не решит всех проблем. Но она, как минимум, снимет часть издержек за счёт изначальной стабилизации проектирования и разработки.</p><h2 class="wp-block-heading">Проектное взаимодействие</h2><p>Окей, с этим понятно. Но ведь бизнес — это не только про сокращение издержек и энтропии. Это ещё и про отлаженные и эффективные процессы. В том числе, про процессы проектирования, аналитики и продуктового дизайна в целом. Как же внедрить проработку функциональной архитектуры? Кто за неё отвечает и как она ложится на остальные проектные артефакты, вроде той же CJM или User Stories?</p><p>Давайте разбираться.</p><h3 class="wp-block-heading">Шаблонизация</h3><p>И начать я хочу с тезиса, который может вас немного разочаровать. Любые шаблоны в ФА — безусловное зло. Да, могут быть какие-то методологические форматы отдельных артефактов. Да, унификация документации важна (особенно, если над ней трудятся несколько человек одновременно). Но глобальных шаблонов, кочующих из проекта в проект, быть не должно.</p><figure class="wp-block-pullquote"><blockquote><p>Универсальных схем не существует, хотя вы все их и любите</p></blockquote></figure><p>Почему так? Потому что любая архитектура должна подстраиваться под продуктовые и проектные реалии. Но никак не наоборот. Когда вы начинаете выстраивать архитектуру (причём не только функциональную) с помощью жёстких шаблонов и «устоявшихся» паттернов, вы накладываете на продукт серьёзные ограничения. Причём ограничения, зачастую абсолютно ничем, кроме вашего опыта, не оправданные.</p><p>В <a href="https://sherer.pro/blog/funkcionalnaya-arxitektura-cifrovyx-produktov-chast-3/">предыдущей части</a> цикла я приводил пример того, как по-разному может проектироваться один и тот же набор общих функций. Всё зависит от особенностей проекта, начиная с его бюджета и заканчивая UX-тонкостями.</p><h3 class="wp-block-heading">Авторы функциональной архитектуры</h3><p>Кто читал <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/">вторую статью</a>, тот наверняка помнит функциональные сценарии. Это такая стероидная смесь из <a href="https://ru.wikipedia.org/wiki/BPMN">BPMN</a> и <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8" target="_blank" rel="noreferrer noopener">sequence diagram</a>:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd3605&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd3605" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1660" 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/functional-arch-login.png" alt="Функциональный сценарий логина" class="wp-image-3888" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-login.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-login-1048x830.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-login-768x608.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>Если внимательно присмотреться к ФС, то можно увидеть, что они, в числе прочего, описывают и пользовательский путь. А значит, включают в себя значительную часть UX. Но при этом здесь есть и серверная логика, и какие-то технологические особенности системы.</p><p>Типичный аналитик вряд ли способен качественно проработать навигацию и опыт пользователя. Даже хороший продуктовый дизайнер может не знать нюансы аутентификации через <a href="https://en.wikipedia.org/wiki/Identity_provider" target="_blank" rel="noreferrer noopener">IdP</a>. Но если ни дизайнер, ни аналитик не могут самостоятельно проработать функциональную архитектуру, то кто же должен ею заниматься? Вариантов несколько.</p><p>Иногда находится супердизайнер. Достаточно подкованный, чтобы решать базовые технические вопросы и достаточно опытный, чтобы отделить свои знания от незнаний — и сходить за последними к архитекторам и разработчикам.</p><p>Иногда аналитики работают с дизайнерами в такой плотной связке, что все вопросы решаются сами собой: эти два столпа проектирования решают всё в реальном времени (и даже учитывают мнение будущих разработчиков).</p><p>Оба упомянутых варианта хороши. У обоих есть определённые недостатки (вроде того же уровня абстракции), но оба в определённом контексте жизнеспособны. Однако я хочу предложить вам третий, более универсальный, подход.</p><h3 class="wp-block-heading">Перекрёстное опыление</h3><p>То, о чём я хочу рассказать, мой хороший друг Олег Будко назвал «перекрёстным опылением». Именно оно позволяет не допускать перекоса в сторону дизайна, аналитики или инженерии, а также создавать действительно <strong>консистентную</strong> проектную документацию.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd391f&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd391f" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="3676" height="732" 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/2024/02/functional-arch-workflow.png" alt="" class="wp-image-4114" srcset="https://sherer.pro/content/uploads/2024/02/functional-arch-workflow.png 3676w, https://sherer.pro/content/uploads/2024/02/functional-arch-workflow-1048x209.png 1048w, https://sherer.pro/content/uploads/2024/02/functional-arch-workflow-768x153.png 768w" sizes="auto, (max-width: 3676px) 100vw, 3676px" /><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 раз при создании каждого функционального слоя: при проработке (и доработке) концепции, функциональной модели, сценариев, <a href="https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/">информационной архитектуры</a> и сведения экранов и функций.</p><p>Давайте чуть подробнее пройдёмся по каждой вехе (за исключением IA, она вне рамок этой статьи).</p><h4 class="wp-block-heading">Концепция</h4><p>Чтобы приступить к осознанному проектированию функциональной архитектуры, нужно сперва собрать требования к продукту и провалидировать их.</p><p>Здесь дизайнеры прорабатывают базовую ролевую модель, потребности и особенности будущих пользователей системы. Аналитики вместе с ними, а также с бизнесом и технарями решают, каким образом продукт закрывает интересы всех заинтересованных сторон. В итоге у нас формируются ключевые механики, функциональные границы и (иногда) ролевая матрица создаваемой системы. Это объёмный этап, чуть подробнее я описывал его в небольшом <a href="https://sherer.pro/blog/pochemu-vashemu-proektu-nuzhna-koncepciya/">цикле</a> про концепцию.</p><h4 class="wp-block-heading">Функциональная модель</h4><p>После того, как мы решили, какими базовыми функциями должен обладать наш продукт на старте, самое время определить их иерархию и верхнеуровневую взаимосвязь. Один из способов это сделать — составить функциональную модель:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd3c66&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd3c66" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2840" height="1482" 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/2024/02/functional-model.png" alt="Пример функциональной модели" class="wp-image-4087" srcset="https://sherer.pro/content/uploads/2024/02/functional-model.png 2840w, https://sherer.pro/content/uploads/2024/02/functional-model-1048x547.png 1048w, https://sherer.pro/content/uploads/2024/02/functional-model-768x401.png 768w" sizes="auto, (max-width: 2840px) 100vw, 2840px" /><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>Здесь горизонтальные свимлайны — это компоненты, микросервисы или просто логическое разделение функций. В примере выше это «пользователь», «новости» и «кабинет». Внутри свимлайнов находятся функциональные разделы, каждый из которых может включать в себя как дочерние разделы, так и отдельные функции.</p><p>В идеале, эта модель будет неизменной, ведь мы уже очертили границы продукта. Мы понимаем, <em>каким образом будем решать задачи бизнеса и удовлетворять потребности пользователей</em>.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Однако в реальности модель может изменяться и актуализироваться — особенно если проект действительно большой</p></blockquote><p>Дизайнеры пилят (или допиливают) CJM, опираясь на функциональную модель. Аналитики изучают CJM и мапят её со своей моделью. Если в модели отсутствует какой-то функциональный раздел, который подразумевается в CJM (например, онбординг), то это очень быстро выявляется.</p><p>После того, как первая версия модели готова, мы можем приступить к итерациям высокоуровневого проектирования. Например, начинаем прорабатывать логин и регистрацию.</p><h4 class="wp-block-heading">Функциональные сценарии и описание</h4><p>Аналитики расшивают функциональную модель на более мелкие разделы, внутри которых уже описывают функциональные сценарии и описание функций. Разумеется, подглядывая в доки дизайн-команды. Дизайнеры смотрят на эти сценарии и сравнивают их со своими user/screen flow, user stories и тп. Конкретный набор артефактов со стороны дизайна не важен, у каждого проекта/команды свой набор. Важна регулярная синхронизация.</p><p>На выходе мы получаем проработанную итерацию ФА, консистентную и согласованную.</p><h4 class="wp-block-heading">Экраны, состояния и функции</h4><p>Когда сценарии и описание функций завершены, можно приступать к финалу проектирования — дизайн-макетам и UX-спецификациям. Разумеется, к этому этапу должна быть проведена колоссальная работа вне рамок функциональной архитектуры: начиная от дизайн-концепции, тьмы исследований, детальной проработки UX — и заканчивая информационной архитектурой, навигационной моделью и тп. Однако мы здесь говорим, напоминаю, исключительно о функциональном слое.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd404d&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd404d" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2224" height="804" 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/2024/02/image-1.png" alt="" class="wp-image-4130" srcset="https://sherer.pro/content/uploads/2024/02/image-1.png 2224w, https://sherer.pro/content/uploads/2024/02/image-1-1048x379.png 1048w, https://sherer.pro/content/uploads/2024/02/image-1-768x278.png 768w" sizes="auto, (max-width: 2224px) 100vw, 2224px" /><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>Обратите внимание, что над всеми системными функциями в верхней, клиентской, области есть названия и состояние экранов. Над функцией «Переход к состоянию успешной регистрации» есть надпись «Nav.Authn, ValidationSuccess». Так вот «Nav.Authn» — это название экрана, а «ValidationSuccess» — его состояние.</p><p>Такая нотация позволяет:</p><ul class="wp-block-list"><li>связывать функциональные сценарии с конкретными макетами (например, в той же Figma); </li><li>не заставлять разработчиков, аналитиков, сеошников и прочих продираться сквозь толщи документации и искать взаимосвязи там, где их нет.</li></ul><p>А теперь представьте, что текст «Nav.Authn, ValidationSuccess» может быть ссылкой, ведущей на конкретный фрейм в фигме (тот же draw.io позволяет это делать). И разработчику даже не нужно соотносить функции и экраны, за него это уже сделано! Он просто пишет код — то есть делает то, в чём реально хорош. Мы не заставляем его глубоко анализировать проектную документацию. У него есть функциональные сценарии и описание функций. Они слинкованы с конкретными макетами. Вся логика системы понятна и прозрачна.</p><h2 class="wp-block-heading">Итог</h2><p>Мы разобрали не только важность ФА для бизнеса и этапы её создания/синхронизации, но и одной ногой залезли в детальное функциональное проектирование. Это не страшно, в следующей статье я планирую ещё глубже раскрыть эту тему. </p><p>Здесь же главный посыл простой: ФА способна стабилизировать практически любую модель разработки ПО, и (при грамотном подходе) сделает это легко, изящно и с выгодой для бизнеса.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaya-arhitektura-cifrovyh-produktov-chast-4/">Функциональная архитектура цифровых продуктов, часть 4</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Функциональная архитектура цифровых продуктов, часть 3</title><link>https://sherer.pro/blog/funkcionalnaya-arxitektura-cifrovyx-produktov-chast-3/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Fri, 07 Oct 2022 08:21:00 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[гайд]]></category><category><![CDATA[функциональное проектирование]]></category><guid isPermaLink="false">https://sherer.pro/?p=2509</guid><description><![CDATA[<p>Про общие функции, разницу подходов, зависимости и клиент-серверную функциональную архитектуру.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaya-arxitektura-cifrovyx-produktov-chast-3/">Функциональная архитектура цифровых продуктов, часть 3</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Вы читаете третью статью цикла про функциональное проектирование. В <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/">первой</a> части мы говорили о задачах ФА, во <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/">второй</a> — о высокоуровневом проектировании. Если не читали их, настоятельно рекомендую. Будет проще вникнуть в текст ниже.</p><p>Для начала давайте вернёмся немного назад и ещё раз пройдёмся по терминам и проблемам, которые решает функциональная архитектура. Теперь немного с другого ракурса и чуть более глубоко.</p><h2 class="wp-block-heading">Общие функции</h2><p>Я уже писал о том, что происходит, когда разработчикам явно не указывают на <em>общие функции</em> продукта. В лучшем случае вы рискуете получить копипаст одной и той же функциональности. В худшем — один и тот же кусок ваших интерфейсов и логики будет написан два раза. Такие вещи серьёзно усложняют дальнейшую поддержку проекта, снижают динамику его развития. Рефакторинг становится неотъемлемой частью проектного процесса, на него уходит всё больше ресурсов. В итоге растут бюджеты, сдвигаются сроки. И когда вы захотите внедрить новую фичу, вдруг окажется, что этих самых ресурсов на неё уже не хватает.</p><p> В предыдущей статье я приводил в качестве примеров общих функций &#171;листинг&#187;, работу с формами, показ системных сообщений и другие. Однако подобных моментов в любом проекте намного больше. Общие функции отнюдь не всегда лежат на поверхности, зачастую выявление их становится отдельной задачей проектирования. </p><figure class="wp-block-pullquote"><blockquote><p>Научившись видеть, находить и формализовать &#171;сквозную&#187; функциональность вашего продукта, вы существенно повышаете его шансы на выживание</p></blockquote></figure><h3 class="wp-block-heading">Выявление</h3><p>Осталось всего лишь понять, как же выделять эти самые общие функции. Вам повезло, это как раз тот случай, когда правильно заданный вопрос несёт в себе значительную часть ответа.</p><p>Вы можете просто спрашивать себя, не используется ли эта конкретная функция где-то ещё — и для небольших проектов такого подхода может даже хватить. Но с увеличением сложности проекта будет расти и количество функций, их взаимосвязей. В какой-то момент окажется, что удержать в голове всю функциональность системы больше не представляется возможным.</p><p>Способов выявления общих функций множество. Можно составлять <em>матрицу функциональных свойств объектов</em>: на основе <a href="https://sherer.pro/blog/informacionnaya-arxitektura-kratkij-ekskurs/" target="_blank" rel="noreferrer noopener">информационной архитектуры</a> составить список всех сущностей и возможных манипуляций с ними. Или выстроить саму структуру документации так, чтобы она сама подсказывала вам места, где функции продукта пересекаются или повторяются.</p><p>К сожалению, этот цикл не задумывался как полноценное руководство — если вам интересно, пишите в комментариях. Может быть, сделаю отдельную статью по методологиям поиска и фиксации общей функциональности.</p><h3 class="wp-block-heading">Пример</h3><p>В любом случае, говорить об <strong>общих функциях</strong> абстрактно смысла не имеет. Нужна конкретика. Посему вот вам короткий пример таких разделов и функций, частенько встречающихся в мобильных и веб-приложениях:</p><ul class="wp-block-list"><li><strong>Показ системных сообщений.</strong> Общая функция вывода системных сообщений в интерфейс: негативных, информационных или позитивных. Может принимать параметры (статус, текст и приоритет).</li><li><strong>API.</strong> Объёмный функциональный раздел, отвечающий за обмен данными между клиентом (сайтом, мобильным приложением, голосовым помощником etc.) и сервером.<ul class="wp-block-list"><li><strong>Отправка запроса.</strong> Функция отправки запроса на сервер. Всегда включает в себя параметры (как минимум адрес и, собственно, передаваемые данные). Может совмещаться с авторизационными действиями: очень часто <em>тело </em>запроса содержит в себе данные, а <em>заголовки</em> запроса &#8212; авторизационную информацию (подробнее об этом в <a href="https://sherer.pro/blog/dizajn-dannyh-chast-3-menjaemsja/?highlight=%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B8#zagolovki">дизайне данных</a>).</li><li><strong>Обработка ответа.</strong> Вызывает другие функции, в зависимости от ответа сервера (у разработчиков это называется callback-функции). Например, может использовать функцию <strong>&#171;Показ системных сообщений&#187;</strong>.</li></ul></li><li><strong>Формы.</strong> Общий функциональный раздел для работы с формами.<ul class="wp-block-list"><li><strong>Валидация полей форм.</strong> Общая функция проверки на корректность заполнения полей форм, включает в себя дочерние функции:<ul class="wp-block-list"><li>проверка на обязательное поле,</li><li>проверка корректности email,</li><li>проверка корректности номера телефона,</li><li>проверка корректности даты и/или времени,</li><li>проверка корректности чисел,</li><li>проверка по <a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F" target="_blank" rel="noreferrer noopener">регулярному выражению</a> (сама регулярка передаётся параметром).</li></ul></li><li><strong>Показ сообщений форм.</strong> Показ сообщений о событиях форм (сообщение отправлено, поле &#171;email&#187; заполнено неверно и тп). Может использовать другую общую функцию <strong>&#171;Показ системных сообщений&#187;</strong>.</li><li><strong>Данные форм. </strong>Общая функция обмена данными форм с сервером.<ul class="wp-block-list"><li><strong>Отправка данных формы. </strong>Общая функция на клиенте (браузер, мобильное приложение), отвечающая за передачу данных формы на сервер. Может использовать функцию <strong>&#171;API → отправка запроса&#187;</strong>.</li><li><strong>Обработка ответа. </strong>В зависимости от ответа сервера, выполняет те или иные действия (показ сообщения об ошибке, перенаправление на другой экран и тп). Может использовать функцию <strong>&#171;API → обработка ответа&#187;</strong>.</li></ul></li></ul></li><li><strong>Наличие сети.</strong> Проверка наличия доступа к Интернету при загрузке экранов и отправке форм. Может включать в себя дочерние функции (например, для блокировки интерфейса мобильного приложения или <a href="https://developer.mozilla.org/ru/docs/Web/API/Service_Worker_API" target="_blank" rel="noreferrer noopener">отложенной отправки</a> данных форм, когда появится интернет).</li><li><strong>Обновление экрана. </strong>Обновление содержимого экрана мобильного приложения (например, по свайпу вниз). Всегда инициирует выполнение других функций.</li><li><strong>Аналитика.</strong> Общая функция отправки данных в аналитику.<ul class="wp-block-list"><li><strong>Переход.</strong> Отправка в аналитику перехода между экранами. Во многих SDK эта функция реализуется &#171;из коробки&#187;.</li><li><strong>Событие.</strong> Отправка в аналитику отдельного события (например, добавления товара в корзину или шэринга поста в соцсети).</li></ul></li></ul><h3 class="wp-block-heading">Разница подходов</h3><p>Внимательный читатель заметит, что общие функции в этой и предыдущей статьях формируются по несколько разным принципам. Например, в прошлой статье нет общей функции форм, всё сведено просто к данным. Зато там есть функция &#171;очередь сообщений&#187;, а здесь её нет — очередь сообщений формируется автоматически на основе параметра &#171;приоритет&#187;. </p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd5271&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd5271" class="wp-block-image aligncenter size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="3180" 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/functional-arch-commons-dif.png" alt="" class="wp-image-3903" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-commons-dif.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-commons-dif-1048x1590.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-commons-dif-768x1165.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>Это сделано не случайно, а в качестве иллюстрации к основному посылу всего цикла:</p><blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow"><p>Вы сами решаете, какими будут структура и состав вашей функциональной архитектуры. Любая шаблонизация ставит под угрозу стабильность и результат проектирования. Руководствуйтесь здравым смыслом, не стесняйтесь консультироваться у специалистов.</p></blockquote><p>Вообще, возобладание шаблонов над разумом — бич современного проектирования. Думайте, сравнивайте подходы. Выстраивайте собственный рабочий флоу под специфику каждого проекта.</p><h2 class="wp-block-heading">Зависимые функции</h2><p>Об общих функциях мы поговорили. Настало время небольшой части про взаимосвязь функций, их зависимость друг от друга.</p><p>Современные цифровые продукты не создаются сами по себе. Они всегда состоят из огромного количества внешних компонентов, фреймворков, библиотек и плагинов. Даже простой лэндинг в 90% случаев верстался с использованием <a href="https://developer.mozilla.org/ru/docs/Glossary/CSS_preprocessor" target="_blank" rel="noreferrer noopener">препроцессоров</a>, систем <a href="https://ru.wikipedia.org/wiki/Webpack" target="_blank" rel="noreferrer noopener">сборки </a>и <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F%D0%BC%D0%B8" target="_blank" rel="noreferrer noopener">контроля версий</a>, различных <a href="https://docs.npmjs.com/about-packages-and-modules" target="_blank" rel="noreferrer noopener">модулей</a>. Все эти штуки имеют собственные зависимости, без закрытия которых ваш проект просто не соберётся.</p><p>Так и в функциональной архитектуре. Функции имеют разный уровень и зависят друг от друга. Есть базовые, фундаментальные, на которых строится вся система. Есть более высокоуровневые, которые обеспечивают взаимодействие остальных.</p><p>Вот вам простой пример. Ваши разработчики не смогут написать функцию <em>подтверждения номера телефона</em>, пока не будут спроектированы и реализованы более фундаментальные функции <em>обработки запроса на сервере</em> и <em>отправки SMS</em>.</p><figure class="wp-block-pullquote"><blockquote><p>Выявить взаимосвязь функций — значит правильно расставить приоритеты реализации</p></blockquote></figure><h3 class="wp-block-heading">Иерархическая зависимость</h3><p>Вот смотрите. Допустим, функция <em>отправки SMS</em> используется нами лишь в одном месте: когда пользователь подтверждает номер телефона. Мы совершенно уверены, что больше никто и нигде не будет отправлять SMS в нашем проекте. Это значит, что <em>отправка SMS</em> — не общая функция, и приступить к её разработке можно будет, когда мы доберёмся до, собственно, подтверждения номера. </p><p>Тогда как функция <em>обработки запроса</em> является базовой, без неё не получится в принципе обеспечить обмен данными с клиентом (браузером или мобильным приложением). Следовательно, её стоит написать с самого начала, сделав её <strong>общей функцией</strong>. Однако и она, в свою очередь, тоже зависит от других: <em>валидация данных</em>, <em>очистка параметров</em> (для предотвращения <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3" target="_blank" rel="noreferrer noopener">XSS-атак</a>, например). А значит, мы сперва должны спроектировать и реализовать именно их, иначе столкнёмся с ситуациями, описанными в <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/" target="_blank" rel="noreferrer noopener">первой части</a> цикла.</p><h3 class="wp-block-heading">Линейная зависимость</h3><p>Это был пример <strong>иерархической зависимости</strong> функций, когда уровень диктует порядок проектирования и реализации. </p><p>Но есть и другой вид — <strong>линейная</strong>, или <strong>параллельная</strong> <strong>взаимосвязь</strong>. Хороший пример: регистрация. Допустим, в вашем проекте можно зарегистрироваться с помощью email и через сервисы/соцсети. Классическая ситуация. Однако поразмыслив, вы решаете в первом релизе ограничиться какой-то одной, например, через email. Вы её проектируете, даёте задание разработчикам. Разработчики разрабатывают. Вы довольны. Но довольными вы будете ровно до тех пор, пока не придёт время реализовывать вторую часть, регистрацию через внешние сервисы.</p><p>Внезапно окажется, что в базе данных нет необходимых полей для фиксации типа соцсети и ключа, который она возвращает. А сама функция заведения аккаунта жёстко завязана на механику обработки формы с email и паролем. Кроме того, ваша регистрация не умеет обрабатывать ситуацию, когда у пользователя не указан email, а такое может случиться:</p><figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="1310" height="859" src="https://sherer.pro/content/uploads/2021/08/vk_restrict.png" alt="" class="wp-image-3058" srcset="https://sherer.pro/content/uploads/2021/08/vk_restrict.png 1310w, https://sherer.pro/content/uploads/2021/08/vk_restrict-768x504.png 768w, https://sherer.pro/content/uploads/2021/08/vk_restrict-1048x687.png 1048w" sizes="auto, (max-width: 1310px) 100vw, 1310px" /><figcaption class="wp-element-caption">Пример запрета на предоставление email при регистрации через ВКонтакте</figcaption></figure><p>Конечно, это всё решаемо. Поля в БД можно добавить, регистрацию переписать. Только зачем, если можно с самого начала сделать правильно? Спроектировать сразу обе, передать разработчикам и сказать, что пока нужно делать только одну?</p><p><strong>Линейная зависимость</strong> функций самая неочевидная. Вы даже не представляете, сколько велосипедов и костылей таится в тех продуктах, которыми мы пользуемся каждый день. Костылей, появившихся из-за того, что кто-то просто поленился подумать.</p><h2 class="wp-block-heading">Серверные и клиентские функции</h2><p>Все функции большинства цифровых продуктов можно разделить на два типа: клиентские и серверные — в зависимости от того, где они выполняются (иногда бывает ещё один слой — уровень баз данных, если в БД присутствует своя логика). Но зачем вообще требуется такое разделение?</p><p>Снова приведу пример. Вот есть у вас общая <em>функция валидации</em> с переданным<em> параметром</em> «email». Что она должна уметь делать? Проверять корректность введённых или переданных данных — и всё, вроде. Но нет.</p><h3 class="wp-block-heading">Клиент</h3><p>На клиенте (например, в браузере) она должна проверять корректность введённых данных и:</p><ul class="wp-block-list"><li>Если данные не валидны:<ul class="wp-block-list"><li>визуально изменять поле (изменять цвет текста и границ на красный);</li><li>выводить сообщение «некорректный email» рядом с полем;</li><li>запрещать отправку формы.</li></ul></li><li>Если данные валидны:<ul class="wp-block-list"><li>скрывать сообщение и возвращать визуальное состояние поля (если ранее оно было заполнено неверно);</li><li>передавать управление функции отправки данных на сервер.</li></ul></li></ul><h3 class="wp-block-heading">Сервер</h3><p>В то же время, на сервере должна быть своя валидация, потому что клиентскую легко обойти (и выполнить, например, <a href="https://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0" target="_blank" rel="noreferrer noopener nofollow">SQL-инъекцию)</a>. Поэтому серверная валидация также должна проверять корректность полученных данных:</p><ul class="wp-block-list"><li>Если данные некорректны:<ul class="wp-block-list"><li>возвращать на клиент ошибку с текстом «некорректный email» и признаком поля, рядом с которым нужно показать сообщение;</li><li>прерывать выполнение.</li></ul></li><li>Если данные корректны, возвращать управление функции обработки данных форм (например, регистрации), где уже происходит <em>очистка данных </em>и их запись в БД.</li></ul><p>И это — только банальная валидация. Представьте, насколько сложно на таком уровне грамотно спроектировать даже привычную нам <a href="https://sherer.pro/blog/registracija-i-login-na-steroidah/">функцию регистрации</a>?</p><p>Проектировать и описывать необходимо не только клиентскую часть. Серверная не менее важна, а чаще всего — даже более. Именно через уязвимости в логике кода на сервере и происходят всякие неприятные вещи, которые потом могут шарахнуть по пользователям и бизнесу.</p><figure class="wp-block-pullquote is-style-default"><blockquote><p>Перекладывать проектирование клиент-серверного взаимодействия на обычных программистов — это всё равно что предоставить строителям возможность определять технические характеристики многоэтажного дома.</p></blockquote></figure><h2 class="wp-block-heading">Итог</h2><p>Функциональное проектирование — это не просто перечисление функций будущего продукта. Это громадная работа по их анализу, выявлению взаимосвязей и потенциальных дубликатов. В следующей части я немного расскажу о том, как связывать функциональное проектирование, аналитику и UI/UX, а также о парочке неочевидных решений.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaya-arxitektura-cifrovyx-produktov-chast-3/">Функциональная архитектура цифровых продуктов, часть 3</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Состав и структура концепции цифрового продукта</title><link>https://sherer.pro/blog/sostav-i-struktura-koncepcii-cifrovogo-produkta/</link><comments>https://sherer.pro/blog/sostav-i-struktura-koncepcii-cifrovogo-produkta/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Tue, 23 Mar 2021 11:07:08 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[методологии]]></category><guid isPermaLink="false">https://sherer.pro/?p=2934</guid><description><![CDATA[<p>Что должен включать в себя нулевой этап проектирования – концепция IT-продукта. Вторая статья цикла.</p><p>Запись <a href="https://sherer.pro/blog/sostav-i-struktura-koncepcii-cifrovogo-produkta/">Состав и структура концепции цифрового продукта</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Вы читаете вторую статью цикла о &#171;нулевом&#187; этапе проектирования – <strong>концепции</strong> продукта. В <a href="https://sherer.pro/blog/pochemu-vashemu-proektu-nuzhna-koncepciya/">прошлый раз</a> мы говорили о том, зачем вообще нужна концепция и какие последствия влечёт за собой её отсутствие.</p><p>Сейчас же речь пойдёт о том, что входит в состав концепции, какие артефакты нужны для того, чтобы она успешно выполняла свою роль и как я предпочитаю структурировать подобную информацию.</p><p>Состав и структура разделены специально – в моём понимании это разные вещи. Вы сначала собираете определённую информацию, а потом распихиваете её по разделам. Например, результаты исследования конкурентов могут уйти как в проектную часть (полезные кейсы, референсы), так и в бизнес (модель монетизации, риски). Каждый проект уникален, и идеальной схемы не существует – это нужно учитывать, и руководствоваться здравым смыслом.</p><h2 class="wp-block-heading">Состав концепции</h2><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd6377&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd6377" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-2-1.png" alt="" class="wp-image-2936" srcset="https://sherer.pro/content/uploads/2021/03/concept-2-1.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-2-1-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-2-1-1048x402.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><h3 class="wp-block-heading">Краткое описание проекта</h3><p>Буквально пара-тройка предложений о том, что это за проект, какую он решает задачу и в чём воплощён. Если вы не можете сформулировать идею продукта в нескольких тезисах, то это большой вопрос к идеологу. Да, иногда продукты сложные и многогранные, но даже их можно как-то коротко описать. Обычно у меня краткое описание занимает не больше, чем абзац теста, который вы читаете прямо сейчас.</p><p>Эта часть нужна для того, чтобы:</p><ul class="wp-block-list"><li>отбросить всё лишнее, сформулировать ядро проекта;</li><li>обеспечить плавное погружение читателей в вашу документацию;</li></ul><p>Почти всегда в этой части работ я ещё базово исследую конкурентов: прямых и относительных.</p><h3 class="wp-block-heading">Цели и задачи бизнеса</h3><p>Цели бизнеса (или кто там у вас вместо него на проекте) всегда про деньги, но не всегда напрямую. Даже если вы создаёте исключительно волонтёрский продукт, всё равно польза от него может быть выведена метрически (например, в количестве сэкономленных человеко-часов).</p><p>Но и у классического бизнеса цели не всегда явно материальны. Например: &#171;укрепить имидж бренда в молодежной среде&#187;, &#171;увеличить лояльность пожилых клиентов&#187;. Вот тут важно: вы должны вытащить эти цели из бизнеса, хотя он (особенно некрупный) зачастую отмахивается фразами типа &#171;да что тут непонятного, нам бы бабла заработать&#187;. Конкретизируйте.</p><p>Целей может быть несколько, но их всегда можно разложить на конкретные задачи. Очень часто такие задачи и становятся, в свою очередь, <em>целями продуктового дизайна</em>.</p><h3 class="wp-block-heading">Потребности пользователей</h3><p>И способы удовлетворения этих потребностей. Понятно, что на старте редко есть какая-то реальная пользовательская аналитика. Если бизнес принёс вам на тарелочке результаты работы с фокус-группами – вам крупно повезло. Чаще всего пользовательские потребности берутся из самой идеи сервиса. И чаще всего, они не совсем соответствуют действительности – просто потому что проистекают из представлений владельца бизнеса о своей аудитории. Иногда уже на этапе концепции приходится провести небольшое исследование – чтобы понять, а что же действительно нужно пользователям в данном контексте. И суть сервиса после этого порой немножко меняется. Особенно часто подобное встречается в стартапах.</p><h3 class="wp-block-heading">Описание основной механики</h3><p>Основная механика – это, по сути, более развёрнутый первый пункт. Здесь вы должны понять, как именно вы собираетесь достигать целей бизнеса и закрывать задачи пользователей. Какая предполагается функциональность, с помощью чего планируется привлекать и удерживать клиентов, на чём зарабатывать. Но помните, что это – лишь ядро будущего проекта. Не увлекайтесь деталями и поменьше фантазируйте.</p><p>Обычно <em>основная механика</em> – самый объёмный этап концепции, она может содержать в себе значительное количество дополнительной информации, в зависимости от сложности проекта, количества вводных и прочих факторов. Если вы смелый, можете даже попробовать набросать примерную структуру разделов. Но с оговоркой, что она именно &#171;примерная&#187;, иначе этим вы сами загоните себя в ограничения.</p><h3 class="wp-block-heading">Состав продукта и его технические особенности</h3><p>Самый технологический пункт. Здесь мы решаем, из чего будет состоять наш продукт: мобильное ли это будет приложение, или хватит качественного адаптивного сайта; чат-бот нужен нашим клиентам или полноценный голосовой помощник.</p><p>Кроме того, именно здесь прорабатывается примерный состав компонентов и интеграций (внешних и внутренних): сервер, базы данных, системы аналитики, пуш-уведомления, платёжный агрегатор и так далее. Желательно кратко описать каждый компонент – это сильно упростит дальнейшую работу аналитикам и инженерам.</p><p>Иногда при описании компонентов не хватает даже моих познаний бывшего fullstack-разработчика. Тогда я прибегаю к помощи более опытных технарей, в этом нет ничего зазорного.</p><h3 class="wp-block-heading">Ограничения</h3><p>Они есть в любом проекте. Технические, имиджевые, бизнесовые, конкурентные и ещё лютая тьма других. Поверьте, будет крайне полезно, если об этих ограничениях вся команда узнает сильно заранее, до начала работ над проектом.</p><p>Например, в сервисе категорически нельзя использовать персональные данные пользователей, так как это сервис по анонимайзингу (услуги географически распределенных VPN, например). Или наоборот: у вас в сервисе хранятся сканы личных документов пользователей – а это значит, что серверы должны находиться на территории РФ.</p><p>Один раз мне довелось работать с известной компанией, производящей прохладительные напитки. Так вот в ходе работы над концепцией представители клиента внезапно &#171;вспомнили&#187;, что в данном продукте ни в коем случае нельзя использовать синий цвет в виде акцентного.</p><p>А в другой раз мне пришлось столкнуться с сервисом для фондовой биржи – и там оказалась важна мгновенная реакция интерфейса на внешние изменения. А значит, в приоритет вышел быстрый обмен данными и ширина канала сервера.</p><h2 class="wp-block-heading">Структура концепции</h2><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd6904&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd6904" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-2-2.png" alt="" class="wp-image-2937" srcset="https://sherer.pro/content/uploads/2021/03/concept-2-2.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-2-2-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-2-2-1048x402.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>Обычно здесь у меня четыре ключевых слоя: проект, бизнес, пользователи и техническая экспертиза. Я предпочитаю вести документацию в Confluence, завожу там раздел &#171;Концепция&#187;, а в нём 4 подраздела:</p><h3 class="wp-block-heading">Проект</h3><p>Всё, что касается непосредственно самого продукта, его функций и особенностей. Как правило, это наиболее крупный раздел концепции.</p><p>Именно сюда входит б<strong>о</strong>льшая основной механики, иногда вплоть до верхнеуровневых функциональных разделов.</p><p>Здесь базово расписывается состав продукта (например, в двух словах перечисляются особенности сайта, мобильного приложения, админки и сервера).</p><h3 class="wp-block-heading">Бизнес</h3><p>Сюда ложится вся информация о бизнесе: цели и задачи, монетизация, конкуренты, масштабируемость, векторы развития, метрики эффективности и так далее.</p><p>Этот раздел прорабатывается довольно тщательно, иногда даже с привлечением внешних бизнес-аналитиков, если это позволяют сделать ресурсы. От того, правильно ли вы поймёте бизнес, зависит судьба проекта: интерфейсы можно переделать, техническую часть переписать. Изменить бизнес-реалии куда сложнее.</p><h3 class="wp-block-heading">Пользователи</h3><p>Результаты предварительной пользовательской аналитики. Описания целевой аудитории, задачи и потребности, предполагаемые способы удержания и решения задач. Частенько сюда же снова попадают конкуренты – но уже в разрезе конкретных механизмов, которыми они закрывают пользовательские потребности.</p><h3 class="wp-block-heading">Техническая экспертиза</h3><p>Это именно &#171;экспертиза&#187;, а не полноценное техническое проектирование – на этапе концепции на него обычно нет проектных ресурсов. Однако даже базовая экспертиза позволяет уберечь дальнейший процесс от неверных (и подчас довольно дорогих) шагов.</p><p>В этом разделе я обычно собираю более детальное описание компонентов, внешних и внутренних интеграций, технические ограничения и риски.</p><h1 class="wp-block-heading">В заключение</h1><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd6d0e&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd6d0e" class="wp-block-image aligncenter size-large wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-2-3.png" alt="" class="wp-image-2938" srcset="https://sherer.pro/content/uploads/2021/03/concept-2-3.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-2-3-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-2-3-1048x402.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>Концепция продукта должна быть полной, однозначной и отчуждаемой. Работать над ней должен не просто условный &#171;юиксер&#187;, а специальный аналитик + привлечённые им специалисты. Именно этот аналитик засунет в свой мозг проектные бизнес-реалии, натянет их на реалии технические, задаст огромное количество вопросов, нарисует себе чудовищные схемы, и в финале выдаст единый документ с обозначением подводных камней, средств реализации и даже иногда рекомендаций по изменению внутренних бизнес-процессов клиента.</p><p>Этот документ станет основой всего проектирования, библией вашего проекта. На его основе родятся пользовательские сценарии, детализированные схемы бизнес-процессов с привязкой к программной среде, различные диаграммы классов, программная, информационная, навигационная архитектуры &#8212; и ещё множество артефактов, без которых создание сложного продукта если и не обратится в прах, то станет значительно менее стабильным и более дорогим.</p><h1 class="wp-block-heading">Откуда это всё?</h1><p>Идея концепции в том виде, которую я здесь изложил, родилась в стенах <a href="https://d11.design/?utm_source=sherer.pro&amp;utm_medium=organic&amp;utm_campaign=self&amp;utm_content=concept_stage" target="_blank" rel="noreferrer noopener">Цифровой Артели Eleven</a>. Если интересно подробнее узнать о нашем подходе – можете полистать <a href="https://mityakin.ru/paranoid-method-book?utm_source=zen&amp;utm_medium=organic&amp;utm_campaign=self&amp;utm_content=concept_stage" target="_blank" rel="noreferrer noopener">книгу</a> моего партнёра по артели, <a href="https://mityakin.ru/?utm_source=sherer.pro&amp;utm_medium=organic&amp;utm_campaign=self&amp;utm_content=concept_stage" target="_blank" rel="noreferrer noopener">Вадима Митякина</a>, там много интересного.</p><p>Запись <a href="https://sherer.pro/blog/sostav-i-struktura-koncepcii-cifrovogo-produkta/">Состав и структура концепции цифрового продукта</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/sostav-i-struktura-koncepcii-cifrovogo-produkta/feed/</wfw:commentRss><slash:comments>1</slash:comments></item><item><title>Почему вашему проекту нужна концепция</title><link>https://sherer.pro/blog/pochemu-vashemu-proektu-nuzhna-koncepciya/</link><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Tue, 23 Mar 2021 11:07:05 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[методологии]]></category><guid isPermaLink="false">https://sherer.pro/?p=2925</guid><description><![CDATA[<p>Причины, по которым сложным IT-проектам необходим "нулевой" этап проектирования. Первая статья цикла.</p><p>Запись <a href="https://sherer.pro/blog/pochemu-vashemu-proektu-nuzhna-koncepciya/">Почему вашему проекту нужна концепция</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Времена простых продуктов и гениальных одиночек безвозвратно прошли. Сейчас с проектированием чего-то сложнее лендинга уже не справится один-единственный специалист. Более того, даже сама подготовка к полноценному проектированию может отнимать значительное количество времени и ресурсов.</p><p>Я ещё помню дни, когда после первого контакта было нормой отправлять клиенту <em>опросник</em>. Затем его место занял более подробный <em>бриф</em>, некоторые даже составляли что-то вроде <em>проектного задания</em>. Названия менялись, и каждая компания вкладывала в них разные значения, но суть оставалась одна: собрать в едином месте первоначальные требования к будущему продукту. Однако и по сей день эти требования частенько собираются кое-как. В лучшем случае это делает аналитик, чаще – вообще какой-нибудь аккаунт-менеджер. Даже в крупных компаниях, которые решают разработать собственный внутренний продукт, требования не всегда формируют действительно компетентные люди. Про грамотную обработку и систематизацию такой информации я даже не говорю. Всё это впоследствии провоцирует целый ряд проблем, иногда – довольно не очевидных на старте.</p><h2 class="wp-block-heading">Почему концепция</h2><p>Иногда я помогаю внешним проектам: уже запущенным или только разрабатываемым. И регулярно встречаюсь на них с одними и теми типовыми проблемами, которые спокойно можно было предупредить ещё до начала непосредственного проектирования – всего одним небольшим предварительным этапом.</p><p>Если говорить о терминологии, то мы в Eleven предпочитаем называть этот этап <strong>концепцией</strong>. Остальные определения, чаще всего, подразумевают банальный сбор информации без какой-либо её серьёзной обработки. Приступать к проектированию с такими вводными мне лично страшновато. <strong>Концепция</strong> же предполагает базовые исследования и аналитику уже на самом старте проектного процесса. Она включает в себя сразу несколько других документов и является, по сути, нулевым этапом проектирования.</p><p>В этой короткой серии постов мы поговорим о том, какие цели преследует концепция и что входит в её состав. И начнём с того, зачем вообще нужен этот самый &#171;нулевой&#187; этап.</p><h2 class="wp-block-heading">Единое информационное поле</h2><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd77aa&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd77aa" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-1-1.png" alt="" class="wp-image-2928" srcset="https://sherer.pro/content/uploads/2021/03/concept-1-1.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-1-1-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-1-1-1048x402.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>Говоря об информационном поле, я подразумеваю комплексное, однозначное и единое представление о будущем продукте у всех участников проектной команды: от разработчиков до клиента, CEO или владельца продукта. Почему важно, чтобы каждая деталь концепции, основа и базовые границы проекта виделись всем участникам проекта одинаково? Если этого не сделать до начала непосредственного проектирования (а уж тем более, до начала разработки), то процесс пойдет намного медленнее и болезненнее. Клиент будет вносить спонтанные, как вам кажется, правки; разработка – использовать не те инструменты, которые следовало бы; а маркетинг готовить совсем другие метрики.</p><p>Представьте себе идеальный стартап. Например, сервис по передержке домашних животных. В команде с самого начала сидят CEO, продуктовый дизайнер, аналитики, разработчики и маркетологи. И вроде идея уже сформирована и даже кое-как описана на одном листе А4. Всем кажется, что они точно знают, что нужно делать.</p><p>Вот только маркетинг думает, что основная задача сервиса с точки зрения монетизации – свести клиентов и ситтеров, тогда как CEO планирует основной доход получать не с процентов за сделку, а с партнерских программ (например, продавать клиентам корм со скидкой).Разработчики, жадные до новых технологий, хотят сделать новомодное веб-приложение на последнем React&#8217;е и уже даже начали набрасывать технический прототип – но они понятия не имеют о том, что одной из фишек сервиса будет являться опция видеонаблюдения за своими питомцами. А у асинхронных библиотек есть определённые проблемы с потоковым видео, и это нужно учитывать.</p><p>О CEO и говорить нечего. На старте он почти всегда глубоко убежден, что знает проект досконально. Хотя по факту, чаще всего, не учитывает огромное количество нюансов и деталей: вроде платы за обращение к гугл-картам, необходимости подключать онлайн-кассу или особенностей управления персональными данными клиентов.</p><p>Грамотная <strong>концепция </strong>формирует у всей команды единую картинку продукта. А это довольно сильно влияет на стабильность дальнейшей работы на ним.</p><h2 class="wp-block-heading">Определение и фиксация границ проекта</h2><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd7ad0&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd7ad0" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-1-2.png" alt="" class="wp-image-2929" srcset="https://sherer.pro/content/uploads/2021/03/concept-1-2.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-1-2-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-1-2-1048x402.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>Кроме того, проектное задание призвано свершить еще одно великое дело: очертить первоначальные <em>границы проекта</em>. Определить, что будет в проекте, а чего в нём быть не должно. Из каких частей будет состоять продукт, какие типы ресурсов потребуются для его создания, каким образом будет осуществляться коммуникация с клиентами, партнёрами и так далее.</p><p>У вас случалось когда-нибудь, что простенький с виду лендинг к релизу обрастал админкой, мобильным приложением, искусственным интеллектом, чат-ботом и собственным спутником на геостационарной орбите? Тогда вы понимаете, о чём я.</p><p>Чтобы проиллюстрировать этот момент, давайте вернёмся к нашему примеру про животных.</p><p>Итак, CEO говорит, что между пользователями возможны конфликты и споры. И что если сделка проходит через сервис, мы должны эти конфликты решать. А значит, нужен внутренний сервис тикетов – своеобразный арбитраж, через который любая сторона может подать жалобу на неисполнение условий договорённости.</p><p>Вы можете себе представить, сколько усилий уйдёт на создание внутренней арбитражной системы? При том, что она вовсе не является функциональным ядром сервиса – и стартап спокойно запустится без неё. Если дизайнер/проектировщик/аналитик умные, они кратко опишут арбитраж под грифом “следующие этапы развития” – и предложат ввести рейтинг, а спорные вопросы первое время решать через поддержку.</p><p>Зафиксируют это в концепции, и тогда в конце проектирования не придётся второпях запускать на орбиту спутник, изыскивая на это и так дефицитные ресурсы.</p><h2 class="wp-block-heading">Выявление рисков, недостатков и перспектив продукта</h2><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd7ded&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd7ded" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-1-3.png" alt="" class="wp-image-2930" srcset="https://sherer.pro/content/uploads/2021/03/concept-1-3.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-1-3-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-1-3-1048x402.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>За годы в IT мне удалось поучаствовать в создании многих проектов, включая внутренние продукты крупных компаний. И ни разу – ни на простом стартапе, ни на какой-нибудь системе налоговой отчётности – не было случая, чтобы клиент продумал всё идеально. Всегда возникали проблемы, каждая идея претерпевала множество изменений.</p><p>Концепция – не &#171;серебряная пуля&#187;, и она не защитит ваш проект от всех коллизий и мутаций. Но она способна свести их к минимуму. Попутно выявляя потенциальные недостатки и векторы развития будущего продукта. Давайте снова обратимся к нашему выдуманному примеру.</p><p>Допустим, у нас в стартапе есть гугл-карта с доступными ситтерами. Если пользователей станет много и они будут достаточно активны, то бесплатный лимит запросов к картам очень скоро закончатся. Тогда карта просто перестанет работать. И сделает это, возможно, весьма внезапно. А значит, нам нужно завести в Google Cloud Platform платёжный аккаунт и подцепить к нему банковскую карту, на которой всегда будут какие-то деньги. Да, это можно решить и не на этапе концепции, но предусмотреть подобные вещи в начале не сложно – а они могут сказаться на финансовой модели.</p><p>Или представим, что на старте бизнес не уверен, в какую сторону развивать продукт: делать упор на безопасность и вводить платные аккаунты с видеонаблюдением или везде подсовывать продукцию партнёров, получая проценты с продаж. Аналитики рекомендуют сперва изучить потребительский спрос на конкретном продукте, и только потом принимать решение. В этом случае в концепции стоит отразить оба варианта. Чтобы дизайнер построил универсальный UX, а разработчики не блокировали один из них ошибочными технологическими решениями.</p><p>Предусмотреть базовые риски несложно. Описать предполагаемые векторы развития – тоже. Можно даже примерно представить, что может воспрепятствовать развитию продукта – и подумать, как обойти или убрать такие препятствия.</p><h2 class="wp-block-heading">Первичная оценка проекта и проектирования</h2><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd80f9&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd80f9" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-1-4.png" alt="" class="wp-image-2931" srcset="https://sherer.pro/content/uploads/2021/03/concept-1-4.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-1-4-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-1-4-1048x402.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>Разумеется, на старте очень и очень редко можно дать даже примерную оценку стоимости создания проекта (если это, конечно, не какой-нибудь типовой e-commerce). Однако очертить хотя бы базовый горизонт, понять порядок объема ресурсов, которые потребуются, – можно вполне.</p><p>Кроме того, концепция за счёт предыдущих пунктов сильно стабилизирует затраты. Нам не придётся в середине проектирования столкнуться с тем, что продукт нежизнеспособен без какой-нибудь его части – а стоимость её создания сопоставима со всеми остальными работами.</p><p>Помните наш стартап? Пользователи в нём делятся на 2 типа:</p><ul class="wp-block-list"><li>те, кто отдаёт животных на передержку;</li><li>те, кто принимает питомцев в своих квартирах на обозначенный срок.</li></ul><p>Подразумевается, что вторые должны проходить какую-то предварительную проверку, чтобы первые не отдавали своих мохнатых любимцев кому попало. Однако клиент попросту упустил этот момент, когда говорил с аналитиком, а дизайнеру банально не пришло это в голову. Если нет чётко описанной концепции, этот нюанс всплывет значительно позже – скорее всего, уже на этапе создания прототипа или даже дизайн-макетов. То есть придётся перерабатывать значительную часть пользовательских сценариев. А это может довольно серьёзно повлиять на стоимость проектирования и последующей разработки.</p><h2 class="wp-block-heading">Что дальше?</h2><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd844b&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd844b" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="1200" height="460" 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/03/concept-1-5.png" alt="" class="wp-image-2932" srcset="https://sherer.pro/content/uploads/2021/03/concept-1-5.png 1200w, https://sherer.pro/content/uploads/2021/03/concept-1-5-768x294.png 768w, https://sherer.pro/content/uploads/2021/03/concept-1-5-1048x402.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>А можете проследовать ещё дальше и перейти к <a href="https://sherer.pro/blog/sostav-i-struktura-koncepcii-cifrovogo-produkta/">следующему посту</a> цикла – там я расскажу о составе этого самого &#171;нулевого&#187; этапа. О том, какая информация должна входить в концепцию и как она может быть структурирована.</p><p>Запись <a href="https://sherer.pro/blog/pochemu-vashemu-proektu-nuzhna-koncepciya/">Почему вашему проекту нужна концепция</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded></item><item><title>Функциональная архитектура цифровых продуктов, часть 2</title><link>https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/</link><comments>https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Fri, 23 Oct 2020 07:59:19 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[гайд]]></category><category><![CDATA[функциональное проектирование]]></category><guid isPermaLink="false">https://sherer.pro/?p=2525</guid><description><![CDATA[<p>Cценарии, уровень абстракции, функциональная иерархия, итерационность и взаимосвязи функций.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/">Функциональная архитектура цифровых продуктов, часть 2</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>В предыдущей статье я уже <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/">рассказывал</a>, какие задачи и проблемы решает функциональная архитектура, давал её базовое определение. Теперь же предлагаю поговорить о более конкретных вещах. О том, как эта самая архитектура создаётся и какие подводные камни ожидают её создателей.</p><h2 class="wp-block-heading">Вместо вступления</h2><p>У этого поста (как и у всего цикла) нет задачи <strong>научить </strong>читателей функциональному проектированию. Равно как и дать им в руки универсальные шаблоны проектной документации. Это невозможно сделать и десятком таких статей, но вовсе не из-за сложности предметной области. Просто все проекты разные, а продуктовые подходы могут отличаться даже в рамках одной кампании. Шаблонизировать создание функциональной архитектуры — занятие неблагодарное и неблагородное.</p><p>На самом деле, цель этого цикла проста: показать возможности ФА и привести несколько примеров её формирования. Я не покажу ни одного &#171;универсального&#187; решения. Многие схемы и таблицы будут так или иначе взяты из реальной документации, со всеми присущими ей проектными ограничениями.</p><p>Тем не менее, мы довольно подробно пройдёмся по составляющим ФА и этапам её создания. Надеюсь, это сделает цифровой мир лучше, а хотя бы несколько продуктов надёжнее, качественнее и дешевле в разработке.</p><h2 class="wp-block-heading">Этапы</h2><p>Лично я предпочитаю разбивать работу над функциональной архитектурой на два ключевых этапа: <em>высокоуровневый</em> и <em>детальный</em>. Первый закладывает &#171;скелет&#187; продукта, тогда как во время второго этот &#171;скелет&#187; обрастает &#171;мясом&#187;. Детальное функциональное проектирование, чаще всего, является итерационной частью проектного процесса.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd9075&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd9075" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="940" 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/functional-arch-steps.png" alt="" class="wp-image-3885" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-steps.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-steps-1048x470.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-steps-768x344.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>Высокоуровневое функциональное проектирование — это первое, с чего стоит начать работу над FA. Кажется, что набросать общую структуру проекта проще, чем детально расписывать каждую функцию. Однако это не так. И сейчас я расскажу, почему.</p><h3 class="wp-block-heading">Уровень абстракции</h3><p>Помните, я говорил о том, что чаще всего программисты не охватывают проект целиком, а фокусируются на конкретном разделе? Хороший разработчик выстраивает невероятно сложный хрустальный замок вокруг той узкой задачи, над которой работает прямо сейчас. У него банально не хватает ресурсов, чтобы загрузить в голову <strong>всю </strong>функциональность большого продукта. И уж тем более, правильно её проанализировать.</p><p>То же самое справедливо и для многих продуктовых аналитиков/дизайнеров/проектировщиков. Они с самого начала начинают копать сильно глубоко, детально прорабатывают каждую ветку сценария. Но, в отличии от ситуации с разработчиками, на пользу проекту это не идёт. Из-за высокой степени неопределённости на старте, функциональная архитектура рискует оказаться проработанной неравномерно. Решения, принимаемые без оглядки на общую структуру, часто скрывают в себе ошибки. В лучшем случае вам придётся возвращаться к уже проработанным разделам, и полностью их перепроектировать. В худшем — проект с ошибками будет отправлен в разработку.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Когда <strong>архитектор </strong>начинает погружаться в детали, не составив общей картины продукта, он превращается в <strong>инженера</strong>. В мире цифровой разработки эти люди выполняют совершенно разные задачи. Да, вы можете быть сперва архитектором, а потом — инженером. Но не наоборот.</p></blockquote><p>В самом начале работы над FA крайне важно поддерживать необходимый уровень абстракции. Порой это бывает сложно, хочется сразу закрыть все &#171;белые пятна&#187;. Возникает чувство, что ты оставляешь в тылу опасного врага.</p><p><em>Нам обязательно нужно выяснить, как именно будет реализована сквозная аналитика в мобильном приложении. Мы с самого начала пытаемся представить внешний вид видеоплеера на сайте.</em></p><p>При высокоуровневом проектировании нам в обоих случаях достаточно лишь понимать, что такая возможность просто имеется: <em>да, мы можем отслеживать каналы привлечения и конверсию; да, плеер на сайте будет.</em></p><h3 class="wp-block-heading">Пластичная функциональная архитектура</h3><p>Функциональная архитектура должна быть гибкой. Если ваш проект сложнее лендинга, то гарантирую, что с первого раза вы не опишете <strong>всю</strong> его функциональность. Работа над FA — это всегда довольно кропотливое занятие. Вам часто придётся возвращаться к уже описанным функциям и дополнять их.</p><p>Дублирование данных, слабая структуризация, отсутствие единой семантики описания — всё это может вызвать (и обязательно вызовет) проблемы при детальном проектировании. Одной из задач высокоуровневой проработки архитектуры как раз и является предотвращение таких моментов.</p><h3 class="wp-block-heading">Начало работ</h3><p>Вообще, начинать работать над FA стоит лишь после того, как сформированы все ключевые сценарии продукта. Однако мы живём в реальном мире, и никто вам не даст дополнительный месяц или два на проектирование. Поэтому лично я начинаю высокоуровневое функциональное проектирование уже после того, как определены основные механики продукта. Да, это вносит дополнительные риски: хотя бы за счёт того, что значительная часть сценариев ещё не определена, и придётся многое переделывать. Да, есть риск снова стать <em>инженером</em>, а не <em>архитектором</em>.</p><p>Однако ранний старт позволяет не только серьёзно сократить сроки проектирования, но и более глубоко &#171;прочувствовать&#187; саму архитектуру.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd9519&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd9519" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="784" 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/functional-arch-vectors.png" alt="" class="wp-image-3886" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-vectors.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-vectors-1048x392.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-vectors-768x287.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>Параллельная проработка пользовательских сценариев, бизнес-процессов и технологической составляющей позволяет выявлять даже самые пограничные ситуации. Например, спроектировать <a href="https://sherer.pro/blog/registracija-i-login-na-steroidah/" target="_blank" rel="noreferrer noopener">правильную регистрацию</a>.</p><h2 class="wp-block-heading">Практика</h2><p>Окей, по теории прошлись. Теперь давайте обратимся к более практичным вещам. К тому, как формируется функциональная архитектура.</p><h3 class="wp-block-heading">Функциональная иерархия</h3><p>Как и почти в любой архитектуре, здесь тоже есть свои &#171;родители&#187; и &#171;потомки&#187;. Простейшие <em>функции </em>складываются в более крупные, которые, в свою очередь, входят в <em>функциональные разделы</em>. Разделы тоже могут быть <em>вложенными</em>.</p><p>На ранних этапах проектирования <em>функциональная</em> модель часто схожа с <em>навигационной</em>. Например, список функциональных разделов классического контентного приложения может выглядеть так:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd9832&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd9832" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1298" 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/functional-arch-hierarchy.png" alt="" class="wp-image-3887" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-hierarchy.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-hierarchy-1048x649.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-hierarchy-768x476.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>Да, в навигационной модели тоже могут быть разделы &#171;регистрация&#187;, &#171;настройки&#187;, &#171;профиль&#187;, &#171;новости&#187;, но и только.</p><p>Во-первых, в навигации нет такого понятия, как <strong>общие функции</strong> (о них мы поговорим ниже) или, например, <strong>авторизация </strong>(не путать с <a href="https://habr.com/ru/company/avanpost/blog/480576/" target="_blank" rel="noreferrer noopener nofollow">аутентификацией</a>). Во-вторых, глобальные функциональные разделы первого уровня редко несут в себе конкретные интерфейсы, являясь лишь &#171;контейнером&#187; для других разделов. В-третьих, навигационные разделы не так сильно переплетены друг с другом, как функциональные (и об этом тоже будет чуть позже).</p><p>В примере выше функциональный раздел <strong>&#171;Логин и регистрация&#187;</strong> включает в себя дочерние разделы:</p><ol class="wp-block-list"><li>Регистрация.</li><li>Аутентификация (логин).</li><li>Восстановление доступа.</li><li>Авторизация (проверка прав).</li></ol><p>В свою очередь, внутри подраздела <strong>&#171;Аутентификация&#187;</strong> на клиенте могут находиться уже конкретные функции:</p><ol class="wp-block-list"><li>Отображение окна логина.</li><li>Заполнение формы.</li><li>Валидация формы.</li><li>Отправка формы на сервер.</li><li>Обработка ответа сервера.</li><li>Показ сообщений (например, об ошибках).</li></ol><p>При этом та же функция <strong>&#171;валидации формы&#187;</strong> чаще всего включает дочерние функции, вроде <strong>&#171;проверки корректности e-mail&#187;</strong>, <strong>&#171;проверки сложности пароля&#187;</strong> и <strong>&#171;проверки на обязательное поле&#187;</strong>.</p><p>Даже в простой форме логина может быть несметное количество функций (особенно если добавить вход через соцсети и двухфакторную аутентификацию). Однако на этапе высокоуровневого проектирования мы, чаще всего, описываем только <em>функциональные разделы</em> и <em>ключевые </em>функции будущего продукта. Иначе есть риск закопаться и своими руками выстроить себе заборы, которые потом придётся героически преодолевать.</p><h3 class="wp-block-heading">Действия пользовательские и системные</h3><p>Напомню, что <em>функцией </em>является <em>любое</em> событие — не важно, инициировано оно пользователем или самой системой. Функций всегда лютая тьма, их сходу даже в простой список не оформишь.</p><p>Проще всего выявлять конкретный перечень функций продукта через его функциональные сценарии. Они часто строятся на основе детального CJM, user flow или аналогов, но включают в себя отнюдь не только пользовательские маршруты. Смотрите.</p><h4 class="wp-block-heading">Компоненты</h4><p>Почти всегда у разрабатываемой системы есть как минимум три компонента: клиент (мобильное приложение или браузер), сервер и база данных (потому что она тоже может включать в себя функции-процедуры). Иногда они разрабатываются совместно, но чаще — нет, или только частично. Соответственно, функции необходимо прорабатывать так же, по отдельности.</p><h4 class="wp-block-heading">Типы функций</h4><p>Кроме того, все функции можно условно поделить на несколько типов:</p><ul class="wp-block-list"><li>пользовательские (в схеме логина ниже представлены синими блоками);</li><li>системные (белые блоки);</li><li>проверка условий (ромбы);</li><li>негативные (с красной обводкой);</li><li>позитивные (с зелёной обводкой).</li></ul><h4 class="wp-block-heading">Функциональный сценарий</h4><p>Подобные схемы позволяют наглядно представлять функциональные сценарии, сильно упрощая работу дизайнерам и программистам:</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd9cab&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd9cab" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="1660" 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/functional-arch-login.png" alt="" class="wp-image-3888" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-login.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-login-1048x830.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-login-768x608.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>Однако такая глубокая проработка уже попахивает настоящим <strong>детальным </strong>проектированием. А мы знаем, что начинать работу над архитектурой с него точно не стоит. С другой стороны, довольно сложно составить общую картину, выявить взаимосвязи и общие функции, не прорабатывая сценарии. И вот тут на сцену выходят профессионализм и тот самый уровень абстракции.</p><p>Сперва мы создаём самые базовые сценарии, углубляя их по мере появления более детальной информации о продукте. Например, в начале мы не знаем, как будет проходить обработка данных на сервере, но уверены, что он вернёт или положительный, или отрицательный ответ — и развиваем схему, исходя из этого.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bd9f55&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bd9f55" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="2764" 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/functional-arch-evolution.png" alt="" class="wp-image-3889" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-evolution.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-evolution-1048x1382.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-evolution-768x1013.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>Да, нам придётся иногда возвращаться назад и перепроектировать отдельные части функциональных сценариев. Но если мы изначально будем действовать правильно, такие переделки будут встречаться довольно редко.</p><h3 class="wp-block-heading">Взаимосвязи и общие функции</h3><p>Однако одних сценариев недостаточно. Помните, я говорил, что <em>функциональные </em>разделы куда более глубоко связаны между собой, чем <em>навигационные</em>?</p><p>Давайте вернёмся к нашему примеру с контентным приложением. У нас там есть глобальный функциональный раздел <strong>&#171;Новости&#187;</strong>, который включает в себя два схожих подраздела:</p><ul class="wp-block-list"><li><strong>&#171;Главная&#187;</strong> (список всех новостей).</li><li><strong>&#171;Категория&#187;</strong> (список новостей, относящихся к определённой тематике).</li></ul><p>В обоих случаях у нас есть список, есть пагинация (например, &#171;бесконечный&#187; скролл), есть типовой внешний вид карточки новости в таком списке. Получается, что эти два раздела во многом включают в себя одну и ту же функциональность. Более того, функциональность эта отнюдь не простая: тут и отображение списка новостей, их обновление, и подгрузка новых при скролле.</p><p>Логично вынести это в отдельный функциональный раздел (в схеме выше он назван <strong>&#171;Листинг&#187;</strong>). Тогда не придётся каждый раз отрисовывать один и тот же фрагмент, не придётся писать один и тот же код. Архитектура становится проще, продукт стабильнее.</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bda2a7&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bda2a7" class="wp-block-image aligncenter wp-lightbox-container"><img loading="lazy" decoding="async" width="2096" height="728" 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/functional-arch-commons.png" alt="" class="wp-image-3890" srcset="https://sherer.pro/content/uploads/2023/12/functional-arch-commons.png 2096w, https://sherer.pro/content/uploads/2023/12/functional-arch-commons-1048x364.png 1048w, https://sherer.pro/content/uploads/2023/12/functional-arch-commons-768x267.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>Пример с листингом очень простой. Но знали бы вы, сколько раз я встречал копипаст в даже в таких очевидных местах. А что уж говорить о более сложных и редко встречающихся функциях, вроде обрезки изображений? Отправка и обработка форм, обновление экрана по свайпу вниз, показ системных сообщений — все эти функции (и многие другие) могут и должны быть вынесены вовне, в отдельный функциональный раздел.</p><p>Кроме того, некоторые функции могут блокировать выполнение других, или быть их &#171;предвестниками&#187;, но об этом мы поговорим позже.</p><h2 class="wp-block-heading">В следующей серии</h2><p>Остались ещё две статьи цикла. Там мы более глубоко погрузимся в практическую часть, разберём несколько потенциальных проблем, подробно пройдёмся по общим и &#171;зависимым&#187; функциям, рассмотрим примеры описания конкретных функций.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/">Функциональная архитектура цифровых продуктов, часть 2</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-2/feed/</wfw:commentRss><slash:comments>3</slash:comments></item><item><title>Функциональная архитектура цифровых продуктов, часть 1</title><link>https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/</link><comments>https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Mon, 07 Sep 2020 14:59:30 +0000</pubDate><category><![CDATA[Документация]]></category><category><![CDATA[Технический дизайн]]></category><category><![CDATA[гайд]]></category><category><![CDATA[функциональное проектирование]]></category><guid isPermaLink="false">https://sherer.pro/?p=2418</guid><description><![CDATA[<p>Что такое функциональная архитектура, зачем она нужна и почему рынок привык работать плохо.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/">Функциональная архитектура цифровых продуктов, часть 1</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Вы читаете первую статью цикла, посвящённого функциональной архитектуре. Это не особенно популярная область проектирования, однако важность её сложно переценить. Мы поговорим о том, почему именно она непопулярна, что это вообще такое и зачем она нужна. Более того, из следующих статей вы узнаете, как именно выполняется функциональное проектирование. С приведением реальных примеров из проектной документации.</p><p>Этот пост (как и весь цикл) написан не только и не столько для инженеров и программистов, сколько для тех, кто проектирует цифровые продукты. Ну и для тех, разумеется, кто платит за это проектирование и последующую разработку.</p><h2 class="wp-block-heading">Определение функциональной архитектуры</h2><p>Так что же такое Functional Architecture? Если коротко, то:</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>Функциональная архитектура</strong> — это детальное описание и структура функциональности создаваемой системы, спроектированные с учётом технологических, пользовательских и бизнес-требований, а также иерархии функций, их зависимости друг от друга и использования в компонентах такой системы.</p></blockquote><p>Слишком размыто? Как и всегда, когда кто-то пытается засунуть объёмную методологию в одно короткое определение. Давайте разбираться.</p><p>Представьте, что каждое событие в системе, самостоятельное или произведённое в ответ на действие пользователя, является <em>функцией</em>. Функции могут быть <em>общими</em>, <em>родительскими </em>и <em>дочерними</em>. Они могут объединяться в глобальные <em>функциональные разделы</em>, <em>зависеть </em>друг друга и <em>блокировать </em>другие функции.</p><p>На самом деле, это не так сложно, как может показаться &#8212; и мы ещё пройдёмся по определениям. Однако давайте сперва попробуем разобраться в предпосылках. Почему вообще появилась FA и какие задачи она решает. А уже потом вернёмся к терминологии и процессу её создания.</p><h2 class="wp-block-heading">Перенос рисков</h2><p>Может быть, я сейчас кого-то оскорблю, но в привычном нам процессе создания цифровых продуктов кроется один серьёзный недостаток. Мы с вами не умеем распределять риски. А соответственно, мы не умеем ими управлять.</p><p>Мы привыкли, что разработка &#8212; это область проектного процесса с довольно высокой степенью неопределённости. Именно поэтому все агентства и production-компании работают по T&amp;M, с оплатой по часам, а не по результату. Им просто невыгодно брать на себя финансовые риски клиента. Ведь на старте они не могут быть уверены в том, что информации достаточно, а документация по проекту верная и исчерпывающая. Зачастую разработчикам вообще прилетают только функциональные <em>требования</em>, юзкейсы и дизайн-макеты (разумеется, этого мало).</p><p>И что происходит в итоге? Правильно, риски перекладываются на клиента. Сорян.</p><p>Но это если рассматривать проектный процесс с точки зрения задействованных в нём сторон. А давайте взглянем изнутри. Давайте разделим этот самый процесс на два ключевых направления: продуктовый дизайн (исследования, аналитика &#8212; проектирование, в общем) и разработку (кодинг, девопс и тестирование). Тогда получается, что проектировщики попросту перекладывают свои обязанности (а с ними и риски) на разработчиков. Да, всё просто. </p><p>Программисты вынуждены принимать решения и искать ответы на те вопросы, которые их вообще не должны касаться. Классика: <em>&#171;а что будет, если соцсеть не вернула e-mail пользователя?&#187;</em>. Или: <em>&#171;а пользователю нужно сообщать о вот этой вот ошибке?&#187;</em>.</p><p>Инженеры и строители начинают работать за архитекторов, если тем не хватает квалификации. Такое, блин, возможно только в IT.</p><p>Так вот функциональная архитектура как раз и призвана снизить риски. Стабилизировать разработку. Заранее найти ответы если не на все, то на очень значительную часть вопросов. Не заставлять обычных программистов принимать общие архитектурные или тонкие юиксовые решения.</p><h2 class="wp-block-heading">Деградация кода</h2><p>Редко, очень редко на проекте есть выделенный архитектор. Такой, который загрузит себе в голову весь проект, выделит общие части, разложит всё по полочкам. А даже если он есть, он наверняка занимается общей (а не функциональной или программной) архитектурой проекта.</p><p>Обычный разработчик же мыслит лишь в рамках той части проекта, над которой работает в текущий момент. Он не оценивает весь продукт целиком, не держит его в голове. Поверьте, ему и так хватает забот. </p><p>Скорее всего, программист в этот момент даже не помнит, что обрезка изображений, которую он сейчас пишет для аватара в профиле, используется ещё и при создании новости. А через два месяца, когда дойдёт до новостей, он может не вспомнить про то, что уже писал эту треклятую обрезку. И сделать две: одинаковых внешне, но разных в реализации. Или, что вероятнее, он просто скопипастит первую. Потому что выносить её за пределы профиля &#8212; это уже рефакторинг, а таску нужно закрыть сегодня.</p><p>А представьте, что над проектом работает два, пять разработчиков? Какова вероятность, что они синхронизируются в мелочах вроде пагинации, &#171;бесконечного&#187; скролла или валидации данных? Что каждый из них не напишет в своей части проекта собственный вариант каждого решения?</p><p>А ведь это так просто: выявить все <em>общие функции</em> ещё на этапе проектирования и явно указать на них программистам. Не надеяться на авось, и не отмазываться зоной ответственности. Никто, кроме проектировщика/аналитика/дизайнера, не знает проект настолько хорошо, чтобы это сделать. Разумеется, если нет специального человека.</p><p>Проекты, созданные без единой функциональной архитектуры, сложно поддерживать и развивать. Код в них очень быстро деградирует, обрастает велокостылями &#8212; но винят в этом обычно ни в чём не повинных разработчиков.</p><h2 class="wp-block-heading">Функциональные требования и описание</h2><p>Когда я рассказываю о функциональной архитектуре на своих лекциях, то в половине случаев слышу: &#171;а, ну это понятно, у нас на проектах тоже есть функциональные требования&#187;. Нет. Функциональные <em>требования</em> и функциональная <em>архитектура</em> &#8212; разные вещи. Когда ваш аналитик собирает функциональные требования, он формирует задачи, в редких случаях &#8212; предварительное, неструктурированное описание системы. Отдавать сырые требования разработчикам, даже хорошим &#8212; так себе идея.</p><p>Это всё равно что написать &#171;мост должен выдержать десять грузовиков, гружённых щебнем&#187; и отдать это в виде задания строителям. Вряд ли последние смогут сваять что-то путёвое по такой &#171;инструкции&#187;.</p><p>И даже если углубиться в это конкретное требование, расписать его максимально подробно (посчитав и вес одного авто, и удельный вес, и даже среднюю скорость проезда), то всё равно получится фигня. И не важно, десять таких &#171;требований&#187; будет или пять сотен. Строителям, как и разработчикам, нужны куда более полные и комплексные инструкции. Структурированные с учётом множества факторов. В противном случае строители просто залью всё армированным бетоном, чтобы уж наверняка.</p><p>Функциональная архитектура предполагает предоставление инженерам и программистам целостного и глубокого описания разрабатываемой системы. Понятных и однозначно трактуемых инструкций. FA стабилизирует и ускоряет процесс разработки.</p><p>И в следующих статьях мы поговорим об этом. </p><h2 class="wp-block-heading">Немного лирики</h2><p>Многие идеи, изложенные мной в этой и следующих статьях цикла, родились в процессе общения с моим партнёром, Вадимом Митякиным. Кстати, он пишет <a href="https://mityakin.com/redbook" target="_blank" rel="noreferrer noopener">книгу</a> &#8212; и если вы дочитали эту статью до конца, то книга вам наверняка покажется интересной.</p><p>Запись <a href="https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/">Функциональная архитектура цифровых продуктов, часть 1</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/funkcionalnaja-arhitektura-cifrovyh-produktov-chast-1/feed/</wfw:commentRss><slash:comments>4</slash:comments></item><item><title>Регистрация и логин на стероидах</title><link>https://sherer.pro/blog/registracija-i-login-na-steroidah/</link><comments>https://sherer.pro/blog/registracija-i-login-na-steroidah/#comments</comments><dc:creator><![CDATA[Павел Шерер]]></dc:creator><pubDate>Sun, 18 Aug 2019 10:20:05 +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=2099</guid><description><![CDATA[<p>Часто ли вы сталкивались с тем, что не помните, через какую соцсеть логинились на сайте? Или что разработчики не очень точно реализовали логику придуманной вами регистрации? Этим постом я начинаю выкладывать свои проектные решения в паблик - и первое будет посвящено подробной диаграмме логина, регистрации (обычной и через соцсети) и восстановления доступа.</p><p>Запись <a href="https://sherer.pro/blog/registracija-i-login-na-steroidah/">Регистрация и логин на стероидах</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></description><content:encoded><![CDATA[<p>Что может быть проще и понятнее, чем стандартная регистрация? Даже если она включает в себя вход через соцсети и восстановление доступа. Даже если нужно рассказать разработчикам о логике &#8212; что там рассказывать-то?</p><p>Кажется, любой продуктовый дизайнер легко накидает вам идеальный сценарий регистрации с закрытыми глазами &#8212; пока лифт спускается из офиса в холл.</p><p>Но не всё так просто.</p><blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Насмотренность в проектировании не менее важна, чем в остальных областях дизайна. Изучение чужих работ, помимо прочего, ещё и позволяет более критически относиться к своим. Этим постом я начинаю выкладывать собственные проектные решения в паблик &#8212; и сперва покажу вам кусок функционального проектирования.</p></blockquote><h2 class="wp-block-heading">UPD: спустя год (09.2020)</h2><p>Это материал, основанный на реальной проектной практике, он за первый год своего существования набрал приличное количество положительных реакций. Хочется верить, что кому-то он оказался полезным, сделал чей-то сервис более удобным и защищённым.</p><p>Однако как и любой кусок реальной документации, эта схема имела ряд проектных ограничений. Перепиливать её, делая универсальной, было бы не правильно — в числе прочего, это был шаг в сторону повышения насмотренности дизайнеров/проектировщиков.</p><p>Но при этом хотелось дать более гибкий инструмент, однозначно подсветить сложные и не самые очевидные технические и сценарные решения. В общем, ловите новую <a href="https://vc.ru/dev/156552-instrukciya-kak-napisat-idealnuyu-registraciyu" target="_blank" rel="noreferrer noopener">статью</a> про идеальные логин, регистрацию и восстановление доступа. Немножко лонгрид, конечно, но вам наверняка понравится.</p><h2 class="wp-block-heading">Почему регистрация</h2><p>В большинстве сервисов регистрация &#8212; это первый серьёзный шаг пользователя на тернистом пути к целевому для бизнеса действию. От того, насколько идеально будут работать логин, регистрация и восстановление доступа, зависит конверсия; это даже объяснять не нужно. </p><p>У каждого опытного дизайнера есть готовый набор стандартных схем заполучения заветных телефонов с емэйлами. Выбрать нужную, модифицировать под реалии проекта и швырнуть в разработку. Всё просто.</p><h3 class="wp-block-heading">Проблема</h3><p>Однако почему же тогда регистрация на большинстве сервисов отнюдь не идеальна?</p><p>И почему именно регистрация и сопутствующая функциональность отнимают столько сил и времени у разработчиков и тестировщиков? Неужели они настолько тупые, что не могут быстро реализовать простой сценарий? Нет, они не тупые, они умные. Просто сценарий не такой простой, каким кажется. А ещё они вынуждены решать проблемы, которые должен был до них закрыть <a rel="noreferrer noopener" aria-label="дизайнер (откроется в новой вкладке)" href="https://sherer.pro/blog/dizajn-vs-proektirovanie/" target="_blank">дизайнер</a>. Вот навскидку шесть вопросов, связанных с одной лишь регистрацией через социальные сети:</p><ol class="wp-block-list"><li><em>Что произойдёт, если Facebook, с помощью которого регистрируется пользователь, не вернул e-mail?</em></li><li><em>Что делать, если соцсеть вообще отвалилась и не работает (например, кто-то из админов поменял конфиги)?</em></li><li><em>А если соцсеть при регистрации вернула e-mail, который уже есть в базе?</em></li><li><em>Как быть, если пользователь восстанавливает доступ, но у него нет пароля, так как он создавал аккаунт через ВКонтакте?</em></li><li><em>Нужно ли при попытке регистрации или восстановления доступа напоминать пользователю, что он уже регистрировался через Twitter?</em></li><li><em>А можно как-то заранее сообщить пользователю (ещё до нажатия кнопки входа), через какую соцсеть он входил в прошлый раз?</em></li></ol><p>И ещё тьма вопросов. Все они относятся к бизнес-логике, интерфейсам и юиксу. И очень часто некоторые из них попросту обходятся дизайнерами. Разработчики тоже не боги. Они сперва делают то, что описано; потом &#8212; то что принесли тестировщики; потом &#8212; то, до чего додумались сами; а затем &#8212; чинят то, что поломали предыдущие два шага. И в части этих работ они уже не обращаются к дизайнерам, а делают &#171;по аналогии&#187;. Понимаете, что происходит в такие моменты? Да, UX валится к чертям. Потому что красное сообщение о том, что <em>&#171;пароль не подходит&#187;</em> следовало бы заменить на синенькое <em>&#171;не тупи, ты регался через фэйсбук, у тебя нет пароля&#187;</em>.</p><h3 class="wp-block-heading">Не решение</h3><p>Окей, допустим, нам попался реально умный дизайнер. Он описал все эти случаи. Все негативные сценарии, нулевые состояния, все экраны и валидации. Как он это сделал? </p><p>Учитывал ли он, кто именно будет <em><a rel="noreferrer noopener" aria-label="пользователем (откроется в новой вкладке)" href="https://sherer.pro/blog/uchim-proektnuju-komandu-chitat/" target="_blank">пользователем</a></em> этого описания? Может быть, разработчикам будет не очень удобно вычёсывать логику из тридцати листов текстовой документации? И даже если их не избежать, может, стоило сделать погружение более плавным?</p><p>А общался ли наш дизайнер с разработкой, чтобы пощупать серверную логику и выяснить, можно ли вообще сделать так, как он описал &#8212; или это космически дорого и долго?</p><p>Он не подумал, что какие-то части могут быть общими для разных сценариев? Это здорово бы упростило (читай &#171;удешевило&#187;) разработку. Хотя бы потому, что не всегда разработчик может (и будет) выходить на более высокий уровень абстракции &#8212; чаще всего он занят конкретной узкой задачей и не соотносит её с остальными. Или делает это не сильно тщательно.</p><h3 class="wp-block-heading">Решение</h3><p>Все эти проблемы разом убивает всего один-единственный документ. Вернее, одна диаграмма. Функциональная схема. </p><p>В ней можно описать:</p><ul class="wp-block-list"><li>действия пользователя (белые блоки);</li><li>действия системы на клиенте (серые блоки);</li><li>действия системы на сервере (синие блоки);</li><li>негативные события (красные блоки);</li><li>позитивные события (зелёные блоки);</li><li>условия перехода от действия к действию (жёлтые ромбы);</li></ul><p>Все переходы в рамках одного компонента (сервера или сайта/мобильного приложения) мы будем показывать простыми линиями, а переходы между компонентами (например, передачу информации на сервер) &#8212; пунктирными.</p><p>Отдельно укажем точки входа и выхода из сценариев. А мелким текстом над некоторыми блоками даже укажем названия и состояния относящихся к ним экранов!</p><p>Красота же, да?</p><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bdbcc1&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bdbcc1" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" 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/2019/08/auth-scheme.jpg" alt="" class="wp-image-2276"/><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>Пока рисовали, вспомнили про что-то ещё, дополнили. Через два дня подошли, посмотрели, увидели прореху &#8212; залатали. В итоге сделали немного сложную, плохо читаемую, но полную и наглядную функциональную диаграмму логина, регистрации и восстановления доступа.</p><p>Тут у нас и путь пользователя, и логика поведения системы, и обработка всех негативных и спорных сценариев, и общие функции (например, запись в БД данных о входе и отработка успешной аутентификации), и указание конкретных экранов и их состояний.</p><p>Посмотрите внимательно. В нашей диаграмме есть несколько простых решений, которые почти никто не использует &#8212; хотя они напрашиваются сами. Например, если у пользователя сохранились куки соцсетей, но протух ключ авторизации, мы можем показать ему его аватарку рядом с иконкой соцсети, через которую он входил. Или после попытки регистрации через e-mail подсказать, к какой соцсети этот e-mail привязан. Или сделать аккаунт пользователя безопаснее, деактивируя после использования его ключ из письма с восстановлением доступа (увы, многие разработчики просто забывают это реализовать).</p><h2 class="wp-block-heading">Сценарии</h2><p>Давайте пойдём дальше и сделаем нашу чудо-схему несколько более удобной для восприятия &#8212; ведь от того, насколько она будет читаемой, зависит качество её понимания и реализации программистами. </p><p>Для этого будет достаточно лишь подсветить конкретные сценарии &#8212; хвала богам, у нас их всего четыре:</p><ul class="wp-block-list"><li>обычная регистрация через e-mail;</li><li>регистрация через соцсети;</li><li>вход в аккаунт;</li><li> восстановление доступа.</li></ul><p>Я не стану детально описывать особенности и решения каждого сценария &#8212; они прекрасно понятны из самих диаграмм. Если у вас возникли вопросы &#8212; пишите в комментариях.</p><h3 class="wp-block-heading">Обычная регистрация</h3><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bdc07a&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bdc07a" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" 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/2019/08/auth-scheme-registration-focus.jpg" alt="" class="wp-image-2278"/><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><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bdc30d&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bdc30d" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" 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/2019/08/auth-scheme-social-focus.jpg" alt="Функциональная схема регистрации через e-mail, регистрации через соцсети, входа в аккаунт и восстановления доступа" class="wp-image-2280"/><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><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bdc57e&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bdc57e" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" 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/2019/08/auth-scheme-login-focus.jpg" alt="" class="wp-image-2277"/><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><figure data-wp-context="{&quot;imageId&quot;:&quot;69d7cf4bdc816&quot;}" data-wp-interactive="core/image" data-wp-key="69d7cf4bdc816" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" 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/2019/08/auth-scheme-restore-focus.jpg" alt="" class="wp-image-2279"/><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><h2 class="wp-block-heading">Это не идеальная регистрация</h2><p>И эту схему можно улучшать бесконечно.</p><p>Например, показывать подсказку про соцсеть ещё и при неудачном логине. Да объединить в общую функцию показ таких подсказок у всех сценариев: регистрации, логина и восстановления доступа (как и ошибок &#171;e-mail уже используется&#187; и &#171;не удалось отправить письмо&#187;). Или добавить проверку на срок действия ключа из письма с восстановлением доступа. Можно еще впилить капчу после пяти неудачных попыток входа. Вариантов тьма.</p><p>Но все продукты разные, и требования везде также отличаются. То, что я вам показал &#8212; это реальное проектное решение, со всеми присущими ему проектными ограничениями и особенностями. К примеру, здесь форма логина открывается в модальном окне &#8212; а у вас она может быть на отдельной странице. В любом случае, вы можете взять это решение и спокойно модифицировать его под себя.</p><h2 class="wp-block-heading">Исходники</h2><p>Понятно, что ценность этой статьи была бы невысока, если б я не предоставил исходников диаграммы. Собственно, вот.</p><p>В архиве:</p><ol class="wp-block-list"><li>исходник диаграммы (делал в <a aria-label="draw.io (откроется в новой вкладке)" rel="noreferrer noopener" href="https://about.draw.io/" target="_blank">draw.io</a>, так как работал в Confluence);</li><li>все диаграммы в SVG и JPG с подсветкой конкретных сценариев из этого поста.</li></ol><div class="wp-block-file"><a id="wp-block-file--media-4ff504af-2e31-4617-b5ec-552cbdfb0bfa" href="https://sherer.pro/content/uploads/2019/08/auth-scheme-all-in-one.zip" target="_blank" rel="noreferrer noopener">Функциональная схема регистрации</a><a href="https://sherer.pro/content/uploads/2019/08/auth-scheme-all-in-one.zip" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-4ff504af-2e31-4617-b5ec-552cbdfb0bfa">Скачать</a></div><p><em>Видимо, из-за специфического содержания архива хром иногда ругается, что файл скачивают редко и он может быть вредоносным. Не верьте, всё там <a href="https://www.virustotal.com/gui/url/aa2394e331a00b19eb8b0cf17ff298d11f94d1738dd920d83901692bd4db6695/detection" target="_blank" rel="noreferrer noopener">нормально</a>.</em></p><p>Запись <a href="https://sherer.pro/blog/registracija-i-login-na-steroidah/">Регистрация и логин на стероидах</a> первой появилась на <a href="https://sherer.pro">Павел Шерер</a>.</p>]]></content:encoded><wfw:commentRss>https://sherer.pro/blog/registracija-i-login-na-steroidah/feed/</wfw:commentRss><slash:comments>8</slash:comments></item></channel></rss>