Files
progcode/editorial/agent-rewrites/091.json
T
huncode 2d914b543f
Build and deploy / deploy (push) Failing after 15s
Publish rewritten technical article archive
2026-08-02 22:19:34 +03:00

8 lines
18 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"index": 91,
"slug": "editorial-2025-06-field-developer-experience",
"title": "Когда внутренний инструмент заставляет разработчика ждать",
"excerpt": "Задержка между отправкой заявки и результатом часто выглядит как проблема скорости. Разбираем, как отделить время ожидания от неясного маршрута, проверить гипотезу и не объявить улучшение без сопоставимых данных.",
"contentHtml": "<p>Заявка отправилась, ошибок нет, но разработчик не знает, что будет дальше. Он ждёт подтверждения, ищет владельца в чате и повторяет запрос. Через сорок минут результат появляется. Формально инструмент сработал. Практически он оставил человека без следующего шага.</p>\n<p>Цена такой ошибки складывается из нескольких частей. Разработчик теряет время. Support повторно объясняет маршрут. Владелец получает сообщения, которые нельзя связать с конкретным этапом. Команда видит среднее время ответа, но не видит, где именно возникло ожидание. Если сразу менять интерфейс или добавлять автоматические повторы, можно ускорить не тот участок.</p>\n<p><strong>Тезис.</strong> Удобство внутреннего инструмента нельзя вывести из одного времени ожидания. Сначала нужно разделить четыре факта: событие в системе, то, что понял человек, сигнал поддержки и действие владельца. Только после сопоставимой проверки можно говорить об изменении пути. Один учебный пример ниже показывает этот принцип; его данные не описывают реальный сервис.</p>\n<h2>Механизм задержки</h2>\n<p>Любой путь состоит из этапов. Для заявки на доступ это могут быть открытие задачи, отправка запроса, начало ожидания согласования, получение подтверждения и появление результата. События фиксируют порядок и время. Они не объясняют причину задержки.</p>\n<p>Причина может находиться в очереди согласований, в правах, в другой системе или в тексте интерфейса. В последнем случае человек ждёт не потому, что операция медленная. Он не понимает, кому адресован следующий шаг. Разница важна: таймаут лечит медленную операцию, но не лечит неясного владельца.</p>\n<p>Поэтому время полезно использовать как адрес проверки. Корзина <code>30m–1h</code> сообщает, что между двумя событиями есть заметный промежуток. Она не сообщает, сколько людей столкнулись с ним, почему он возник и помогло ли изменение.</p>\n<figure><img src=\"/assets/editorial/2025/developer-experience-2025-task-journey.svg\" alt=\"Схема учебного пути заявки: отправка, ожидание согласования, подтверждение, сигнал поддержки и проверка изменения\"><figcaption>Учебный путь заявки. Событие, наблюдение человека и решение владельца отвечают на разные вопросы.</figcaption></figure>\n<h2>Учебный пример</h2>\n<p>Ниже — фиксированная модель без реальных пользователей, заявок, сетевых запросов и production-данных. Роль <code>platform-engineer</code> отправляет запрос на учебный доступ к sandbox. В 09:03 задача открыта. В 09:04 запрос отправлен. В 09:05 начинается ожидание согласования. В 09:41 приходит подтверждение. В 09:45 появляется учебный результат.</p>\n<p>В модели есть ещё два поля. UX-наблюдение: «после отправки неясно, кто отвечает за следующий шаг». Сигнал поддержки: <code>routing-unclear</code>. Эти записи не доказывают, что каждый пользователь испытывает то же самое. Они только формулируют две проверяемые гипотезы: задержка связана с очередью или с маршрутом; подсказка с владельцем может уменьшить число неопределённых обращений.</p>\n<pre><code>const journey = {\n stages: [\n ['request.submitted', '09:04'],\n ['approval.wait.started', '09:05'],\n ['approval.received', '09:41'],\n ['result.confirmed', '09:45']\n ],\n waitBucket: '30m–1h',\n observation: 'owner-unclear',\n supportSignal: 'routing-unclear',\n claim: 'not-established'\n};</code></pre>\n<p>Поле <code>claim</code> намеренно не говорит «инструмент улучшен» или «инструмент плох». Учебная запись содержит один путь и не содержит группы сравнения. Она не показывает частоту, распределение, стоимость ожидания и причинность. Её роль — не доказать эффект, а не дать перепутать разные виды данных.</p>\n<h2>Симптом → причина → проверка → действие</h2>\n<table><thead><tr><th>Симптом</th><th>Возможная причина</th><th>Проверка</th><th>Действие</th></tr></thead><tbody><tr><td>После отправки человек спрашивает «кто отвечает?»</td><td>Владелец этапа не виден</td><td>Проверить путь до отправки и текст статуса</td><td>Показать владельца и следующий шаг</td></tr><tr><td>Долгий интервал между двумя событиями</td><td>Очередь, право или внешний процесс</td><td>Сопоставить этап, роль и источник времени</td><td>Исправить узкое место или объяснить ожидание</td></tr><tr><td>Растёт число ручных обходов</td><td>Неясный маршрут либо срочная задача</td><td>Разделить причины обращений поддержки</td><td>Изменять только подтверждённую часть пути</td></tr><tr><td>После изменения среднее время ниже</td><td>Изменились роль, задача или состав данных</td><td>Сравнить одинаковые границы и период</td><td>Оставить вывод открытым при несопоставимости</td></tr><tr><td>Один яркий отзыв требует срочного решения</td><td>Сигнал приняли за масштаб проблемы</td><td>Проверить частоту и альтернативные объяснения</td><td>Назначить узкую проверку без общего обещания</td></tr></tbody></table>\n<h2>Почему нельзя смешивать сигналы</h2>\n<p>Системное событие отвечает на вопрос «что произошло и когда». Оно может показать, что ожидание началось в 09:05 и закончилось в 09:41. Оно не отвечает на вопрос «почему».</p>\n<p>Наблюдение отвечает на вопрос «что человек понял или не понял». Формулировка «не вижу владельца» полезна для интерфейса. Но она не показывает число таких случаев и не доказывает, что новая подпись решит проблему.</p>\n<p>Сигнал поддержки показывает тему обращения. Категория <code>routing-unclear</code> помогает найти направление, но не заменяет подсчёт обращений и не доказывает, что маршрут вызвал ожидание. Решение владельца описывает выбранное изменение. Оно ещё не является результатом изменения.</p>\n<p>Эта граница защищает от отрицательного пути. Если после добавления владельца среднее время стало меньше, но вместе с этим изменилась задача или источник данных, сравнение нельзя считать честным. Если обращений стало меньше, но пользователи начали бросать заявки, снижение поддержки не равно улучшению. Если нет сопоставимых данных, вывод остаётся <code>not-established</code>.</p>\n<h2>Как построить проверяемое сравнение</h2>\n<p>Сравнение требует одинаковой задачи, роли, порядка этапов и набора свидетельств. Иначе изменение может появиться из-за другой нагрузки, другой очереди или другого способа считать время. Сравнительная граница не создаёт причинность сама по себе. Она только убирает очевидные подмены.</p>\n<p>Нужно заранее назвать ожидаемое свидетельство. Например: в той же роли человек видит владельца до отправки, проходит тот же этап и реже создаёт обращение с категорией <code>routing-unclear</code>. Даже такое свидетельство требует осторожности. Оно не доказывает, что исчезла вся cognitive cost. Оно проверяет одну часть маршрута.</p>\n<p>Ограниченное окно проверки тоже не означает статистический результат. Оно задаёт срок, в который владелец возвращается к вопросу. Если источник данных не определён, окно сравнения не спасает ситуацию. Правильное действие — остановить утверждение и уточнить, что именно можно проверить.</p>\n<figure><img src=\"/assets/editorial/2025/developer-experience-2025-wait-time-histogram.svg\" alt=\"Учебная гистограмма корзин ожидания с предупреждением, что время не объясняет причину неудобства\"><figcaption>Корзина времени показывает участок пути. Она не измеряет удобство и не объясняет причину.</figcaption></figure>\n<h2>Порядок действий</h2>\n<ol><li>Назвать одну задачу и её ожидаемый результат. Не объединять весь onboarding в один показатель.</li><li>Записать роль, этапы, источники событий и границы времени.</li><li>Отделить наблюдение человека от системного события и сигнала поддержки.</li><li>Проверить владельца этапа, права, очередь и внешний процесс до изменения интерфейса.</li><li>Выбрать одну небольшую правку и заранее назвать свидетельство, которое её подтвердит или опровергнет.</li><li>Сравнить тот же путь с той же ролью и тем же набором полей.</li><li>Если сравнение нарушено или данных не хватает, оставить статус <code>not-established</code> и не приписывать эффект.</li></ol>\n<h2>Ограничения</h2>\n<p>Учебная модель не содержит реального workflow, telemetry, тикетов, пользователей, сетевых ответов и production-результатов. Время 09:03–09:45, роль и категории — искусственные значения. Их нельзя использовать как бенчмарк, KPI или прогноз. Иллюстрации также показывают учебную схему, а не состояние конкретного инструмента.</p>\n<p>Даже реальные данные имеют пределы. Событие может потерять контекст. Support-сигнал может отражать только тех, кто решил написать. Среднее время скрывает длинный хвост ожидания. Изменение интерфейса может перевести вопрос в другой канал. Поэтому один показатель нельзя объявлять ответом за весь путь.</p>\n<p>Есть и отрицательный вариант: команда не может законно или технически получить сопоставимые данные. Тогда не нужно заменять их впечатлением, красивой диаграммой или единичным отзывом. Можно исправить очевидную ошибку текста, уточнить владельца или записать вопрос для будущей проверки. Но эффект такого действия не следует объявлять установленным.</p>\n<h2>Проверяемый критерий готовности</h2>\n<p>Разбор готов, когда для одной задачи можно показать упорядоченные события, источник каждого сигнала, роль, владельца, ограничение сравнения и условие остановки. После изменения есть повторная запись с той же задачей и ролью. Она содержит заранее названное свидетельство. Если хотя бы одного элемента нет, готово только описание проблемы, а не вывод об улучшении.</p>\n<figure><img src=\"/assets/editorial/2025/developer-experience-2025-feedback-loop.svg\" alt=\"Петля от наблюдаемого сигнала к ограниченному изменению, повторной проверке и остановке вывода при нехватке данных\"><figcaption>Петля проверки: сигнал ведёт к узкому действию, а не сразу к заявлению об эффекте.</figcaption></figure>\n<h2>Проверяемые источники</h2>\n<ul><li><a href=\"https://www.w3.org/TR/2025/CRD-performance-timeline-20250521/\" target=\"_blank\" rel=\"noopener noreferrer\">W3C Performance Timeline</a> — описывает временные записи PerformanceEntry и поля для наблюдения длительности. Источник относится к Web Performance API и не доказывает эффект этой учебной модели.</li><li><a href=\"https://www.gov.uk/service-manual/measuring-success/measuring-the-success-of-your-service\" target=\"_blank\" rel=\"noopener noreferrer\">GOV.UK Service Manual: Measuring the success of your service</a> — рекомендует сочетать performance metrics с исследованием пользователей и смотреть на completion и время выполнения задачи. Это методическая рекомендация, а не универсальный KPI.</li><li><a href=\"https://www.gov.uk/service-manual/helping-people-to-use-your-service/set-up-and-manage-user-support\" target=\"_blank\" rel=\"noopener noreferrer\">GOV.UK Service Manual: Set up and manage user support</a> — объясняет, как использовать обратную связь поддержки для улучшения сервиса. Сигнал поддержки указывает направление проверки, но не доказывает причинность.</li></ul>"
}