Вот сидишь на груминге, всё выглядит максимально безобидно:
👉 взять данные из соседней системы👉 другая команда даст апишку👉 мы вызовем метод👉 и нужные данные отобразятся
Звучит как задача на пару дней)
За несколько лет работы мы заметили, что большинство проблем возникает вокруг одних и тех же вещей
Никто не договорился, кто за что отвечает
одна команда считает, что поле должно заполнять другая команда,
вторая команда считает ровно наоборот.
Итог? Поле пустое, сроки уже горят,
а на созвоне человек десять судорожно пытается понять, чья же это, в конце концов, головная боль.
Поэтому на этапе проектирования полезно задавать скучные вопросы:👉 кто владелец данных?👉 кто отвечает за их хранение?👉 а за актуальность кто?👉 кто исправляет ошибки?
Чем раньше мы расставим все точки над "и", тем меньше потом будет сюрпризов.
Интеграцию проектируют по счастливому сценарию
запрос отправился
👉 что если сервис вдруг недоступен?
👉 или ответ придёт не сразу, а через полминуты?
👉 а если вдруг статус вернётся совсем не тот, что мы ждали?
👉 что, если пришла пустая структура, хотя должна быть?
👉 или данные вроде есть, но заполнены как-то не полностью?
Именно поэтому один из самых полезных вопросов на обсуждении интеграции:
"а что будет, если всё пойдёт не по плану?"
Документация не совпадает с реальностью
видел поле string, а потом получал в него целый массив объектов...
Все считают, что данные всегда будут идеальными
👉 ИНН без ИНН
👉 дата без даты
👉 пустые строки вместо значений
👉 лишние пробелы
👉 неожиданные спецсимволы
👉 дубликаты
Если данные приходят из внешней системы, рано или поздно кто-нибудь обязательно пришлёт что-нибудь интересное.
Вопрос лишь в том, когда это случится)
Забыли про версионирование
Но пройдёт год, появится новая версия метода, а потом ещё одна.
Кто-то решит изменить структуру ответа.
"Ээ, а какой контракт сейчас используется в проде?"
иначе однажды можно узнать о новой версии метода прямо из упавших логов,
которые внезапно покраснели.
Они появляются на этапе, когда команды что-то не договорили, не уточнили или решили проверить потом.
а с кучи, порой неудобных, вопросов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👏3🔥2❤1
"разберись, как он работает" - тут-то и начинается совсем другая игра.
Ведь пользователи редко говорят все как есть.
А бывает, что и вовсе рассказывают не то, чем занимаются на самом деле.
а в ответ: "почти каждый день!"
Откроешь потом статистику, а там последний раз человек заходил три месяца назад...
и такие штуки происходят постоянно.
Это, по сути, попытка вытянуть наружу, как человек реально себя ведет, что делает.
✖️ Плохой вопрос: "Вам удобно работать с системой?"👌 Хороший вопрос: "Покажите, как вы выполняли эту задачу в последний раз."
В первом случае человек начнет рассуждать, давать оценку.
Во втором – покажет, что происходит на практике.
А практика, как правило, намного интереснее, чем любые рассуждения..
⭐ Пример диалога:
- Вам было сложно найти эту кнопку?
- Наверное, да.
- А если бы мы перенесли её наверх, стало бы удобнее?
- Наверное, да.
Через пять минут такое интервью превращается в игру, где надо угадать правильный ответ, который ждет аналитик.
Чем меньше подсказок в вопросе, тем лучше.👀
Парадоксально, но иногда аналитик занимает процентов восемьдесят времени интервью.
Объясняет, уточняет, рассказывает про будущие доработки, делится идеями.
А потом встреча заканчивается, и оказывается, что про пользователя почти ничего нового не узнали.👊
😋 Это вообще любимая ловушка.
Аналитик уже придумал решение и теперь задает вопросы так, чтобы услышать именно нужный ему ответ.
После такого интервью можно получить подтверждение буквально любой идеи,
вот только толку от этого немного...
Самые полезные фразы на интервью:
"Покажите, пожалуйста"/"А можете продемонстрировать?"/"Как это выглядит в системе?"😔 Потому что между словами пользователя и его реальными действиями иногда лежит целая пропасть.
Любой аналитик хотя бы раз слышал фразу "да тут всё просто".
После чего открывался экран с двадцатью вкладками, тремя Excel-файлами и инструкцией на сорок страниц.
Они нужны, чтобы понять, как человек работает на самом деле,
а это далеко не всегда одно и то же.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1❤🔥1💯1
Кажется, что весь айти мир
и слышит от коллег:
Значит так, раз в пятнадцать минут мы забираем XML-ку с того FTP-сервера, а после обработки кладем ответ в папку рядом.
И тут наступает легкий шок...
в банках, крупных корпорациях и госсекторах.
Эта схема настолько элементарна, что может стабильно работать десятилетиями.
Одной стороне нужно просто создать файл, другой его забрать и прочитать.
Не нужно поддерживать постоянное соединение, не нужно переживать, доступна ли вторая система прямо в эту секунду.
так как за ней скрывается серьезная техническая логика.
🪵 как система должна реагировать на дубликаты файлов?🪵 можно ли обработать документ, если из нескольких тысяч записей в нем некорректна только одна?🪵 каким образом подтверждать успешное получение данных или сообщать об ошибках?
Если в REST можно открыть Swagger, быстро дернуть запрос и посмотреть ответ, то здесь весь контракт зашит в структуру файла.
Лишний атрибут, не тот формат даты или какой-то странный символ в строке - и процесс встанет.
В нем нет хайпа или сложной событийной архитектуры, но есть стабильность.
Пока мы рассуждаем о технологиях будущего,
какой-нибудь старый добрый XML-файл прямо сейчас спокойно делает свою работу, даже не зная, что его уже десять лет пытаются отправить на пенсию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2💯2
Расследование любой проблемы в интеграциях обычно начинается одинаково:
кто-то пишет: "не работает" и всё...
Нет подробностей, ошибок, нет картинок с экрана. Просто не работает.
Через полчаса обсуждения уже виноваты все системы в компании, кроме той, где и началась ошибка.
Вначале все думают, что всё можно решить разговорами, письмами или вопросами.
чем больше людей говорит, тем больше идей, но меньше понятно, что случилось на самом деле.
Хорошо запоминаются случаи, когда уже нашли, кто, кажется, виноват.
и в голове готово объяснение, почему проблема у соседей.
Становится неловко, но зато время сэкономлено.
Для аналитика - это один из самых быстрых путей найти, что случилось:
когда пришёл запрос, что было внутри, куда всё ушло, что вернулось назад
и где именно всё пошло не так.
когда перестаёт говорить: "кажется, интеграция сломалась",
а начинает: "дайте пять минут, я посмотрю логи".
И это, что удивительно, почти всегда помогает быстрее, чем любое обсуждение.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥2
я просто хотел понять, почему система не даёт выполнить действие, которое по требованиям вообще-то должна давать выполнить.
Потом открывается метод..в методе вызывается другой метод, в другом методе ещё один..
какой-то
Helper, потом AbstractManager, потом ProviderFactory, потом ManagerProviderFactoryExecutor.Уже начинает казаться, что разработчики соревнуются между собой, кто придумает название класса страшнее.
теперь нужно срочно учить Java, писать микросервисы и спорить в комментариях про архитектуру.
Никто не ждёт, что ты будешь переписывать бэк по вечерам вместо просмотра сериала))
Но вот понимать, что происходит внутри системы, иногда бывает очень полезно.
Потому что:
А код тем временем:
Самая интересная штука часто вообще не код.
Самая интересная штука это юнит-тесты.
вроде полезно, но добровольно не полезу))
Иногда один тест рассказывает о системе больше,
чем документ, который последний раз обновляли во времена,
когда Internet Explorer ещё считался браузером.
Более того,
именно в тестах часто находишь всякие приколы, например:
И документации про него ни слова, и на демо его никто не показал.
Зато в тесте гордо лежит проверка на этот кейс.
И ты сидишь такой:
- ах вот где ты прятался, маленький засранец))
Поэтому мой хот-тейк такой:
аналитику не обязательно уметь писать код.
Но умение открыть метод, не испугаться, немного покопаться и посмотреть тесты - это натуральный чит-код к профессии.
Потому что ты перестаёшь гадать, как работает система и начинаешь это знать.
А это, между прочим, две очень разные лиги
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤3👍3
Например, ситуация
Все мысленно уже вышли из звонка.
🤔 А что будет, если пользователь откроет сразу две вкладки?
Братик, ну зачем..мы же почти закончили..
в этот момент его хочется прибить, но он не унимается.
Там, где все видят просто новую фичу, аналитик видит потенциальное место катастрофы.
Пока команда радуется, как все круто получилось,
этот хомяк в голове аналитика носится в колесе и паникует:
😱 А ЕСЛИ ПОЛЬЗОВАТЕЛЬ СДЕЛАЕТ КАКУЮ-ТО ДИЧЬ???
И ведь пользователь эту дичь обязательно сделает)) причем в первый же день после релиза.
где они договариваются проверять самые дебильные сценарии, которые нормальному человеку в голову не придут.
Именно это часто спасает команду от очень неприятных разборок, потому что
баг на тестовом стенде
баг на проде
🚨🚨 КОЛЛЕГИ, У КОГО ЕСТЬ ИНФОРМАЦИЯ? 🚨🚨
Ну и по итогу, тот самый раздражающий вопрос про две вкладки был очень даже уместным))
Возможно, прямо сейчас он предотвращает ваш будущий созвон в 8 утра с темой:
"Разбираем последствия вчерашнего релиза"
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3😁3🔥2
когда утром открываешь ноутбук с полной уверенностью,
что сегодня точно получится спокойно сесть за требования?
И вот ты уже полдня честно работаешь,
но документ, который открыл утром, всё ещё грустно смотрит на тебя с первой строчки.
Ну не может же человек четыре часа работать и за это время написать...примерно ничего.
Чаще это не тишина и глубокая концентрация, а наоборот...
постоянные попытки собрать мысли в кучу, пока тебя дёргают с "есть 5 минуток?".
И ведь никто ведь не врёт, у всех реально "на пять минут",
просто существует закон айти, по которому пять минут автоматически конвертируются в сорок))
в котором открыто вкладок...ну штук сто.
где-то играет музыка, где-то висит запрос к базе,
где-то черновик требований,
а на какой-то вкладке ты уже минут двадцать пытаешься вспомнить, зачем вообще ее открыл.
перестал отвечать на каждое сообщение сразу.
Да, да)) дал себе правило сначала закончить текущую фразу или мысль, а уже потом лезть в чаты.
но знаете, что на самом деле произошло? Да ничего))
Никто не уволился, процессы не встали, разработчики не начали писать код на салфетках в ожидании моего ответа.
потому что меня дёрнули ровно в тот момент, когда я наконец-то понял, как его сформулировать.
выгорание часто берется не от самого объема работы, а от этого бесконечного переключения между контекстами.
Поэтому иногда самая полезная задача на день - это... дать себе спокойно закончить хотя бы одну мысль.
Звучит как читерство, но работает.
Please open Telegram to view this post
VIEW IN TELEGRAM
👌3❤2👍2
интервью, воркшопы, анкетирование, наблюдение.
но на первой же реальной задаче все эти знания часто рассыпаются.
и ты стоишь с этим набором инструментов, не понимая, какой из них сейчас достать.
Первая реакция
Но бывает, что самый важный разговор уже случился, просто про него забыли.
Порой проект знает о себе больше, чем люди, которые над ним работают,
стоит сначала поискать ответы внутри системы, а не бежать сразу к людям.
И вуаля, через пять минут наблюдения понимаешь больше, чем за час интервью.
Спустя время оказывается, что общего понимания нет ни у кого.
В таких дискуссиях требования выкристаллизовываются гораздо быстрее, чем в серии одиночных бесед за неделю.
Никто же не режет хлеб отвёрткой. Хотя...наверняка кто-то и так делает.
он понимает, когда стоит открыть документацию,
а когда лучше поговорить с пользователем,
а когда собрать всех на один воркшоп,
а когда вообще ничего не спрашивать, а просто пять минут молча понаблюдать.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2💯1
почему фраза "Как пользователь, я хочу..." ещё ничего не значит
Когда впервые слышишь про User Story, думаешь, что это элементарная штука:
Как <роль>, я хочу <действие>, чтобы <ценность>
Кажется, что работа сделана.
Но потом приходит разработчик, читает это предложение и спрашивает: "а делать-то что конкретно?"
Проблема здесь в том, что User Story порой путают с техническими требованиями.
На самом деле она их не заменяет, её задача
Как пользователь, я хочу скачать отчёт, чтобы работать с ним офлайн.
Класс, но...
Какой формат? Кто может скачать? Есть ограничения по размеру? Что делать, если отчёт ещё не сформировался?
вы понимаете, о чем пойдет речь, но самого сюжета еще не видели.
Именно они превращают красивую хотелку в понятную задачу.
Как пользователь, я хочу восстановить пароль, чтобы снова попасть в аккаунт.
то разработчик понимает логику, а тестировщик знает, что именно проверять.
Это избавляет от споров о том, кто и как что-то "не так понял".
Вообще есть очень простой способ проверить свою User Story.
⬇️ ⬇️ ⬇️ ➡️ Закройте всё, кроме одного предложения, и задайте себе вопрос:
"Если убрать все остальные требования, разработчик сможет реализовать фичу?"✅ Если ответ "да" - скорее всего, вы случайно написали не User Story, а полноценное ТЗ))✅ Если ответ "нет" - всё нормально, значит, User Story выполняет свою работу)
потому что User Story перестаёт быть формальностью ради Скрама
и становится нормальной отправной точкой для обсуждения фичи.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3❤🔥1
либо пишут вообще на всё подряд
Аналитики могут проходить через стадию, когда Use Case кажется универсальным инструментом.
Стоит только разобраться, как он работает, и рука сама тянется описывать через него всё подряд:.
и вообще на всё, что шевелится.
Чаще всего путаница возникает потому, что Use Case путают с обычными требованиями.
Именно зарегистрироваться
А дальше сценарий:
💙 открыл страницу регистрации💙 заполнил поля💙 нажал кнопку💙 получил письмо💙 подтвердил почту💙 вошёл в систему
Вот и всё. Никаких требований вроде "поле должно быть обязательным", "длина пароля от 8 символов" и "ошибка 400" здесь быть не должно,
потому что это уже требования, а не Use Case.
Задайте себе вопрос:
пользователь идёт к цели или просто нажимает кнопку?
добавить чекбокс/переименовать поле/поменять цвет кнопки,
То писать ради этого Use Case примерно так же логично, как вызывать пожарных, чтобы зажечь свечку))
Основной сценарий, куча альтернативных веток и исключений
превращают документ в бесконечный сериал, как будто пишешь сценарий к новому сезону Игры престолов))
На самом деле вполне достаточно описать главный путь и пару важных нюансов.
В ней есть герой, есть его цель и чёткая последовательность действий.
Если после прочтения и разработчик, и тестировщик, и заказчик понимают,
что будет происходить в системе, значит, документ сделали как надо.
Если же у каждого своё представление, то стоит готовиться к долгим и бесплодным созвонам)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥2
📊 CRUD-матрица:
табличка, которая задаёт вопросы лучше некоторых аналитиков
Есть очень простой способ понять, нужна ли проекту CRUD-матрица:
😔 если на вопрос "кто может удалить договор?"
в комнате прозвучало хотя бы два разных ответа..поздравляю, она вам уже нужна🌟
Вообще CRUD выглядит максимально скучно. Обычная табличка:
сверху роли, слева сущности, а внутри четыре буквы:
C, R, U, D.
⬇️ Может показаться, что это очередной рутинный инструмент, чтобы аналитикам было чем заняться в пятницу вечером))
⬇️ Но стоит заполнять её на практике и всё меняется:
😔 И вот одна буква U превращается в целый список условий, в этом и весь прикол ⭐️ CRUD-матрицы⭐️
💥 Если будете составлять её впервые,
не пытайтесь сразу нарисовать огромную таблицу на сто ролей и пятьдесят сущностей.
💥 Начните с простого:
🔖 Ещё совет:
Если в вашей CRUD-матрице почти везде стоят одинаковые буквы➡️ не спешите радоваться)
Скорее всего, вы просто ещё недостаточно глубоко покопались,
потому что реальные системы очень любят фразы вроде:
"можно, но.."➡️ эти самые "но" потом становятся требованиями, тест-кейсами и багами.
🔖 По сути, CRUD - это инструмент,
который помогает вытащить на свет скрытые ограничения и разобраться, где система прячет свои нюансы.
табличка, которая задаёт вопросы лучше некоторых аналитиков
Есть очень простой способ понять, нужна ли проекту CRUD-матрица:
в комнате прозвучало хотя бы два разных ответа..поздравляю, она вам уже нужна
Вообще CRUD выглядит максимально скучно. Обычная табличка:
сверху роли, слева сущности, а внутри четыре буквы:
C, R, U, D.
Берёшь, например, сущность "Заявка" и видишь, что оператор может делать Update.
Тут думаешь: "а он случайно не может править любую заявку?".
Оказывается нет, может только свою, да и то если она в статусе "Черновик" и ещё на согласовании не была.
Она нужна не для того, чтобы аккуратно заполнить таблицу эксель, а для того, чтобы заставить всех задуматься над деталями.
не пытайтесь сразу нарисовать огромную таблицу на сто ролей и пятьдесят сущностей.
1️⃣ Выпишите основные сущности.
именно те, с которыми работает система: заявки/договоры/пользователи/документы,
а не экраны или кнопки2️⃣ Затем добавьте роли, только реальные.
Очень хочется написать "Администратор", "Пользователь", "Менеджер" и закончить,
но лучше потратить две минуты и проверить, не забыли ли вы ещё какого-нибудь оператора или модератора.3️⃣ И главное - не ставьте CRUD-операции на автомате как шаблон.
Каждую букву лучше мысленно заменить вопросом.😔 Не просто "Update", а "когда именно он может изменить?"😔 Не просто "Delete", а "точно удалить, а не архивировать?"😔 и не "Read", а "просмотр всех записей или только своих?"
Вот на этих вопросах обычно и всплывают ограничения, про которые никто не вспомнил на обсуждении.
Если в вашей CRUD-матрице почти везде стоят одинаковые буквы
Скорее всего, вы просто ещё недостаточно глубоко покопались,
потому что реальные системы очень любят фразы вроде:
"можно, но.."
который помогает вытащить на свет скрытые ограничения и разобраться, где система прячет свои нюансы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🔥1💯1
который отвечает на вопрос: "а что мы вообще строим?"
Но представьте ситуацию: команда начинает новый проект.
Кажется, что рановато думать о документации,
но именно сейчас Vision Document приносит больше всего пользы.
По сути, это документ, который описывает проект с высоты птичьего полёта,
никаких деталей, бизнес-правил или технических моментов.
Он нужен, чтобы любой человек, открыв документ, за пять минут понял:
и недооценивают именно последнее
Набор разделов может отличаться от компании к компании, но чаще всего встречаются:
📌 цель проекта📌 описание проблемы📌 целевая аудитория📌 бизнес-цели📌 ключевые возможности продукта📌 ограничения📌 границы проекта (Scope/Out of Scope)📌 критерии успеха
Например,
в Vision может быть написано, что пользователь должен быстро восстановить доступ к аккаунту,
а в требованиях уже опишут, что ссылка для восстановления действует 24 часа, её нельзя использовать повторно и после смены пароля токен становится недействительным.
Разница очевидна.
тем ценнее становится единое понимание того, что вообще строится.
Потому что плохие проекты редко разваливаются из-за неправильно написанного требования
и гораздо чаще проблема начинается раньше - когда команда с самого начала представляла конечный результат по-разному.
И вот здесь Vision Document становится не просто документом, а отправной точкой для всех дальнейших решений.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2❤🔥1🔥1
📑 SRS: шпаргалка, которую стоит сохранить каждому аналитику
➖ Когда впервые слышишь аббревиатуру SRS (Software Requirements Specification),
в голове могут возникнуть две крайности:
😑 либо думаешь, что это какой-то сверхсекретный документ из NASA,
😳 либо просто обычное техническое задание с модным названием))
Но на самом деле ни то, ни другое.
➖ SRS - это подробный документ, который описывает все требования к системе так,
чтобы и разработчики, и тестировщики, и аналитики, и заказчик смотрели в одну сторону.
Если простыми словами, то
➡️ Vision отвечает на вопрос "что мы строим?",
➡️ а SRS на "как это должно работать?".
В нем собирают все ключевые моменты в одном месте:
🫡 ФТ и НФТ
🫡 ограничения
🫡 бизнес-правила
🫡 сценарии использования
🫡 диаграммы
🫡 API (если нужно)
🫡 словарь терминов
всё, что поможет разработать систему без гадания.
🤩 Но тут есть одна ловушка,
многие считают, что SRS должен быть гигантским документом на сотни страниц, который нужно заполнять строго по шаблону.
🤩 Но на практике всё проще и зависит от проекта.
➡️ для маленькой задачи SRS может быть всего на 10-15 страниц,
➡️ а для крупной банковской системы или маркетплейса легко перевалит за сотню.
Главное не в объёме, а в том, сможет ли человек, впервые открывший этот документ,
понять, как работает система, без бесконечных дополнительных вопросов и звонков.
Вот что на самом деле делает SRS хорошим.
в голове могут возникнуть две крайности:
Но на самом деле ни то, ни другое.
чтобы и разработчики, и тестировщики, и аналитики, и заказчик смотрели в одну сторону.
Если простыми словами, то
В нем собирают все ключевые моменты в одном месте:
всё, что поможет разработать систему без гадания.
многие считают, что SRS должен быть гигантским документом на сотни страниц, который нужно заполнять строго по шаблону.
Главное не в объёме, а в том, сможет ли человек, впервые открывший этот документ,
понять, как работает система, без бесконечных дополнительных вопросов и звонков.
Вот что на самом деле делает SRS хорошим.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1❤🔥1💯1
Казалось бы, осталось открыть результат, потыкать пару кнопок и написать заветное "принято".
Здесь проверяется другое:
команда реализовала именно то, что было задумано?
или где-то по дороге требования слегка мутировали и начали жить своей жизнью?...
Пройдитесь по каждому функциональному требованию и критерию приёмки.
Не по памяти, а прямо буквально рядом с документом:
пункт требования🌼 действие в системе🌼 фактический результат.
Особое внимание стоит уделить формулировкам вроде "только", "обязательно", "не должен", "при условии".
Именно в таких словах обычно сидят ограничения, которые легко потерять при реализации.
Попробуйте пройти путь целиком глазами пользователя: от входа в функцию до ожидаемого результата.
Прям весь сценарий, а не отдельную кнопку или один запрос.
Например, недостаточно проверить, что заявка сохраняется.
Нужно убедиться, что после сохранения она получает правильный статус, отображается в нужном разделе, доступна нужной роли и дальше с ней можно выполнить следующее действие.
Иногда каждый кусочек работает идеально, а вместе они собираются в очень странного Франкенштейна.
Что произойдёт, если поле не заполнено, данные некорректны, запись уже изменилась, у пользователя нет прав или внешний сервис не ответил?
Необязательно самостоятельно прогонять сотню негативных тестов,
но ключевые ограничения из требований аналитик должен увидеть своими глазами.
Особенно если на обсуждениях вокруг них было двадцать комментариев и лёгкая производственная драма))
Кто видит функцию?
Кто может создать, изменить, удалить или только посмотреть данные?
Что увидит пользователь без необходимых прав?
Очень обидно обнаружить после релиза, что кнопку "Удалит"» аккуратно выдали вообще всем.
Получился не доступ, а щедрый подарок от системы.
Проверьте названия полей, кнопок, подсказки, сообщения об ошибках, статусы и состав отображаемых данных.
Особенно если они были согласованы с заказчиком или завязаны на бизнес-терминологию.
Функция может работать правильно, но надпись "Ошибка выполнения операции" вместо понятного объяснения способна превратить пользователя в участника квеста без карты.
Если задача затрагивает апи, другую систему или несколько разделов продукта,
убедитесь, что изменения состыковались между собой.
Метод отдаёт нужные параметры, фронт их использует, данные сохраняются корректно, старые сценарии не отвалились.
Любимый жанр интеграций: бэк уже передаёт новое поле, фронт пока смотрит в другую сторону, а все по отдельности уверены, что задача готова.
Если есть дизайн, прототипы, переписка или решения из комментариев, их тоже нужно поднять.
За время разработки требования могли уточняться, а последняя версия иногда живёт не в документе,
а где-нибудь в сообщении "давайте всё-таки оставим как было".
Именно поэтому перед приёмкой полезно собрать финальные договорённости в одном месте, иначе начинается археология рабочего чата.
Если реализация отличается от первоначального описания по согласованной причине,
то требования нужно обновить.
Документ должен рассказывать о том, как система работает сейчас, а не хранить альтернативный сюжет проекта.
Потому что "я нажал - оно открылось" ещё не приёмка,
это просто очень короткое знакомство с функционалом.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2❤🔥1🔥1
🧼 Валидация данных: система тоже имеет право сказать
"не принимаю"
➖ Сегодня выясним, какие данные система должна принимать, какие разворачивать у входа и как всё это описать в требованиях.
🤩 Допустим, пользователь заполняет форму доставки и в поле "количество квартир" уверенно пишет "Котик".
Человек, возможно, просто устал...😴
Но система теперь должна решить, что делать с этой информацией:
💙 сохранить как есть,
💙 попытаться посчитать котика ,
💙 или всё-таки вежливо попросить число.
Вот за такие моменты и отвечает✨ валидация ✨
📌 Что вообще проверяем
Она нужна, чтобы в базу не улетали даты рождения из будущего, телефоны из трёх цифр и пароли формата "пароль123"
💥 Обычно проверяют:
📌 Где должна работать валидация
На фронте она помогает пользователю быстро исправить ошибку:
подсвечивает поле и пишет, что именно пошло не так.
😔 Это удобно, но фронту нельзя доверять как единственному охраннику,
т.к. запрос можно отправить напрямую, обойдя интерфейс.
😔 Поэтому бэкенд проверяет данные повторно и принимает окончательное решение.
📌 Как описывать валидацию в требованиях
✖ Фразы вроде "проверить корректность значения" лучше сразу отправлять в мусорку.
Непонятно, что считается корректным и какой результат ожидается при ошибке.
👌 Нормальное требование выглядит конкретно:
То есть для каждого поля полезно зафиксировать:
➖ что разрешено передавать
➖ что запрещено
➖ можно ли передать
➖ применяется ли значение по умолчанию
➖ какая ошибка возвращается
➖ какое сообщение увидит пользователь
📌 Хорошая валидация не просто блокирует плохие данные,
она объясняет пользователю, что именно нужно исправить,
а систему избавляет от записей вроде "стоимость заказа: сырный соус".
Потому что данные должны быть свободными, но не настолько. 😌
"не принимаю"
Человек, возможно, просто устал...
Но система теперь должна решить, что делать с этой информацией:
Вот за такие моменты и отвечает
Она нужна, чтобы в базу не улетали даты рождения из будущего, телефоны из трёх цифр и пароли формата "пароль123"
➡️ Обязательность - поле нельзя оставить пустым.➡️ Тип данных - в количестве ожидается число, а не «много».➡️ Формат - почта содержит @, дата выглядит как дата.➡️ Длину и диапазон - пароль не короче восьми символов, количество товаров больше нуля.➡️ Допустимые значения - статус только new, paid или cancelled.➡️ Связь между полями - дата окончания не может быть раньше даты начала.
На фронте она помогает пользователю быстро исправить ошибку:
подсвечивает поле и пишет, что именно пошло не так.
т.к. запрос можно отправить напрямую, обойдя интерфейс.
Фронт как бы говорит: "похоже, тут ошибка",
а бэк: "Да, и в базу это точно не поедет".
Непонятно, что считается корректным и какой результат ожидается при ошибке.
➖ поле quantity обязательно.➖ допускаются только целые числа от 1 до 99.➖ при пустом значении возвращается ошибка REQUIRED_FIELD,➖ при значении вне диапазона ошибка INVALID_QUANTITY.
То есть для каждого поля полезно зафиксировать:
null или пустую строкуона объясняет пользователю, что именно нужно исправить,
а систему избавляет от записей вроде "стоимость заказа: сырный соус".
Потому что данные должны быть свободными, но не настолько. 😌
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🧠 Как объяснить разработчику бизнес-логику
😎 Сегодня поговорим о том, как донести логику задачи так, чтобы разработчик понял не только что сделать,
но и зачем система должна вести себя именно так.
😏 Есть коварная штучка в работе аналитика:
тебе задача уже понятна настолько, что кажется - ну тут вообще всё очевидно:
😐 Что тут объяснять-то? А потом разработчик задаёт один вопрос,
и ты такой: "а кстаааати…"
💙 Потому что половина логики всё это время спокойно лежала у тебя в голове
и в требования почему-то не переехала.
А додумывать за другого человека💙 дело неблагодарное, догадки имеют неприятную привычку быть неверными.
💙 Начинай не с кнопки, а со смысла
🙅♂️ Плохое объяснение:
Разработчик такое реализует.
Вопрос только: на какой статус, при каких условиях и почему вообще его меняем?
👍 Лучше сначала дать контекст:
И вот теперь дальнейшая логика уже не выглядит набором случайных
💙 Рассказывай сценарий целиком
Не "вот тут проверка, тут запрос, тут статус", а нормальной последовательностью:
😎 😎 Всё. Уже видно начало, конец и что происходит по дороге.
А не классика:
💙 Обязательно проговаривай "почему"
Вот это сильно упрощает жизнь. Например:
Теперь разработчик понимает, что это не случайное ограничение, которое можно "немножко упростить", а часть бизнес-процесса.
🤩 Когда понятна причина, гораздо проще принимать технические решения и замечать противоречия.
💙 Не забывай про всякие "а если.."
Именно здесь обычно живёт весь сок.
Основной сценарий почти всегда простой, веселье начинается дальше:
🤩 Очень полезный вопрос перед передачей задачи:
Потому что если этого нет в требованиях, разработчик либо придёт спрашивать, либо выберет поведение сам.
И оба варианта могут привести совсем не туда, куда хотелось..😏
💙 Мини-шпаргалка
Перед тем как отдавать задачу разработчику, проверь:
💡 Хорошо объяснённая бизнес-логика - это когда после прочтения разработчик не должен угадывать, что имел в виду аналитик.
Потому что "ну я думал, это и так понятно" - это не совсем требование,
а маленькая производственная ловушка с очень милым лицом))
но и зачем система должна вести себя именно так.
тебе задача уже понятна настолько, что кажется - ну тут вообще всё очевидно:
➡️ пользователь нажимает кнопку➡️ система делает проверку:
потом🌱 сохраняет данные
либо🌱 показывает ошибку
и ты такой: "а кстаааати…"
и в требования почему-то не переехала.
А додумывать за другого человека
При нажатии на "Подтвердить" отправляем запрос и меняем статус.
Разработчик такое реализует.
Вопрос только: на какой статус, при каких условиях и почему вообще его меняем?
Пользователь подтверждает заказ.
После подтверждения он больше не может менять состав заказа, потому что данные уходят в ресторан.
И вот теперь дальнейшая логика уже не выглядит набором случайных
if.Не "вот тут проверка, тут запрос, тут статус", а нормальной последовательностью:
➡️ пользователь нажимает "Подтвердить"➡️ проверяем, что в заказе есть хотя бы один товар➡️ проверяем, что выбран адрес доставки➡️ если всё ок - фиксируем заказ и меняем статус на confirmed➡️ после этого редактирование недоступно➡️ если проверка не пройдена - заказ остаётся в прежнем статусе, пользователь получает понятную ошибку.
А не классика:
🪵 а если адреса нет?
🪵 ой...
🪵 а заказ тогда сохраняем?
🪵 ой...
🪵 а статус какой?
🪵 щааас😭
Вот это сильно упрощает жизнь. Например:
повторно подтвердить заказ нельзя, потому что после первого подтверждения он уже передаётся в ресторан.
Теперь разработчик понимает, что это не случайное ограничение, которое можно "немножко упростить", а часть бизнес-процесса.
Именно здесь обычно живёт весь сок.
Основной сценарий почти всегда простой, веселье начинается дальше:
➡️ а если пользователь нажал кнопку два раза➡️ а если данные уже изменились➡️ а если внешний сервис недоступен➡️ а если поле пустое➡️ а если у пользователя нет прав➡️ а если запись вообще уже удалили
что может пойти не по основному сценарию?
Потому что если этого нет в требованиях, разработчик либо придёт спрашивать, либо выберет поведение сам.
И оба варианта могут привести совсем не туда, куда хотелось..
Перед тем как отдавать задачу разработчику, проверь:
💙 понятна цель изменения💙 описан основной сценарий от начала до конца💙 объяснены ключевые бизнес-правила💙 есть негативные и пограничные сценарии💙 понятно, что происходит с данными и статусами💙 нет важных решений, которые существуют только у тебя в голове
Потому что "ну я думал, это и так понятно" - это не совсем требование,
а маленькая производственная ловушка с очень милым лицом))
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
🖥 Как собрать требования к UI,
чтобы форма не жила своей лучшей жизнью отдельно от требований
✨ Сегодня препарируем обычную форму регистрации
и смотрим, сколько вопросов аналитик способен найти там, где нормальный человек видит три поля и синюю кнопку.
🎨 Представим макет:
😔 поле Имя,
😔 поле Телефон,
😔 поле Дата рождения,
😔 чекбокс ☑️ Согласен с правилами,
😔 кнопка [Зарегистрироваться]
Ну всё вроде? Можно отдавать в разработку?
☺️ хе-хе.
👤 Поле "Имя"
С виду буквально прямоугольник.
Но аналитик смотрит на него и начинает свой допрос:
И вот у бедного поля "Имя" появляется целая биография:
То есть вместо:
получаем что-то полезное:
Теперь поле хотя бы знает, кем хочет стать, когда вырастет))
📱 Поле "Телефон"
Тут отдельная вечеринка:
И очень важный вопрос: когда показываем ошибку?
Потому что интерфейс, который после первой введённой цифры
начинает орать красным "НЕКОРРЕКТНЫЙ НОМЕР", немного тревожный товарищ.
🎂 Дата рождения
Здесь можно дать календарик и успокоиться.
А можно вспомнить, что пользователь способен выбрать:
09.08.2037
🤡 Поздравляем, зарегистрирован человек из будущего.
Значит, нужно определить допустимый диапазон, формат даты и, возможно, возрастные ограничения.
А ещё решить, разрешён ручной ввод или только календарь.
Такие мелочи на макете почти не заметны, зато потом именно из них состоит половина вопросов фронтенда.
☑️ Чекбокс "Согласен с правилами"
Один маленький квадратик, а уже требует собственного менеджера.
🔵 И наконец - кнопка
Вот она стоит красивая:
⏭ Зарегистрироваться⏮
Но в каком состоянии?
Кнопка на макете одна. Состояний у неё - маленький сериал.
🫠 А теперь главный прикол
Требования к UI - это в основном описание не того, что нарисовано, а того, чего на статичном макете вообще не видно.
Как выглядит пустая форма - видно.
А вот:
💙 что доступно разным пользователям
💙 что происходит при вводе
💙 когда элементы активируются
💙 какие есть ограничения
💙 что показываем при ошибке
💙 что происходит во время загрузки
💙 куда пользователь попадает после действия
это уже должен принести аналитик
😋 Иначе разработчик всё равно ответит на эти вопросы. Просто сам.
А потом на приёмке случится:
И знаешь что…справедливо😭
💡 Так что, когда смотришь на макет,
полезно мысленно не спрашивать "что здесь есть?", а мучить каждый элемент вопросами:
"Когда? Для кого? Что можно сделать? Что нельзя? Что будет, если всё пойдёт не по плану?"
После этого макет перестаёт быть красивой картинкой и наконец становится интерфейсом)
чтобы форма не жила своей лучшей жизнью отдельно от требований
и смотрим, сколько вопросов аналитик способен найти там, где нормальный человек видит три поля и синюю кнопку.
Ну всё вроде? Можно отдавать в разработку?
👤 Поле "Имя"
С виду буквально прямоугольник.
Но аналитик смотрит на него и начинает свой допрос:
Можно написать Аня? Конечно.
а Анна-Мария?
а Ёжик?
а А?
а ?
а Анна228!!!?
А если вставить 400 символов?
И вот у бедного поля "Имя" появляется целая биография:
🤩 обязательность,🤩 допустимые символы,🤩 минимальная и максимальная длина,🤩 обработка пробелов,🤩 текст ошибки
То есть вместо:
Поле для ввода имени.
получаем что-то полезное:
Обязательное поле, от 2 до 50 символов.
Допускаются буквы, пробел и дефис.
Пробелы в начале и конце удаляются.
Теперь поле хотя бы знает, кем хочет стать, когда вырастет))
📱 Поле "Телефон"
Тут отдельная вечеринка:
➡️ Какой формат показываем?➡️ Есть маска?➡️ Пользователь вводит 8 или +7?➡️ Можно вставить номер из буфера?➡️ Что произойдёт с буквами?➡️ А иностранный номер можно?
И очень важный вопрос: когда показываем ошибку?
🤩 Пока человек ещё печатает номер?🤩 После ухода из поля?🤩 После нажатия кнопки?
Потому что интерфейс, который после первой введённой цифры
начинает орать красным "НЕКОРРЕКТНЫЙ НОМЕР", немного тревожный товарищ.
🎂 Дата рождения
Здесь можно дать календарик и успокоиться.
А можно вспомнить, что пользователь способен выбрать:
09.08.2037
Значит, нужно определить допустимый диапазон, формат даты и, возможно, возрастные ограничения.
А ещё решить, разрешён ручной ввод или только календарь.
Такие мелочи на макете почти не заметны, зато потом именно из них состоит половина вопросов фронтенда.
☑️ Чекбокс "Согласен с правилами"
➡️ По умолчанию отмечен? Надеюсь, нет😭 ➡️ Текст кликабельный?➡️ Слово "правила"" ведёт куда-то?➡️ Ссылка открывается в новой вкладке?➡️ Без согласия кнопку блокируем или позволяем нажать и показываем ошибку?
Один маленький квадратик, а уже требует собственного менеджера.
🔵 И наконец - кнопка
Вот она стоит красивая:
Но в каком состоянии?
➡️ Активна сразу?➡️ Или только когда обязательные поля заполнены?➡️ Что происходит после нажатия?➡️ Показываем лоадер?➡️ Можно нажать пять раз подряд и зарегистрировать пятерых одинаковых Анн?➡️ При успехе куда отправляем пользователя?➡️ А если сервер ответил ошибкой?➡️ А если интернет умер ровно в момент отправки?
Кнопка на макете одна. Состояний у неё - маленький сериал.
🫠 А теперь главный прикол
Требования к UI - это в основном описание не того, что нарисовано, а того, чего на статичном макете вообще не видно.
Как выглядит пустая форма - видно.
А вот:
это уже должен принести аналитик
А потом на приёмке случится:
- А почему кнопка активна?
- Ну а где написано, что она должна быть неактивна?
И знаешь что…справедливо
полезно мысленно не спрашивать "что здесь есть?", а мучить каждый элемент вопросами:
"Когда? Для кого? Что можно сделать? Что нельзя? Что будет, если всё пойдёт не по плану?"
После этого макет перестаёт быть красивой картинкой и наконец становится интерфейсом)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
🧹 Что делает аналитик на груминге
🤔 Сегодня разбираемся, зачем аналитик приходит на груминг задачи
и почему после хорошего груминга задача должна стать скучной (в хорошем смысле )
➖ Груминг выглядит примерно так:
открывается задача, команда читает описание, и через тридцать секунд начинается прекрасное:
И аналитик понимает, что задача, которая утром казалась "ну тут всё готово", обзавелась лором на три сезона...😱
🧠 Перед встречей - перечитать задачу как чужую
Главная ловушка➡️ аналитик сам собирал требования
и поэтому автоматически достраивает недостающие куски в голове.
Перед грумингом полезно открыть задачу с настроением человека, который видит её первый раз:
🤩 Если для понимания пункта надо вспомнить созвон двухнедельной давности ➡️ пункт ещё не готов.
🗣 На груминге не зачитывать ТЗ вслух
Разработчики умеют читать) Задача аналитика➡️ быстро дать контекст:
какая проблема, что меняется и где самые важные места.
А дальше уже обсуждать вопросы команды. Особенно полезно ловить формулировки типа:
🤩 Вот после "просто" иногда начинается новая бизнес-логика,
о существовании которой никто пять минут назад не подозревал.😱
🔍 Ловить дырки, а не защищать требования до последней капли крови
Если разработчик спрашивает "А что делать, если запись уже удалена?"
и ответа нет➡️ это не нападение на честь аналитика, а отличный вопрос, который почему-то не пришёл в голову раньше.
📌 Груминг как раз и нужен, чтобы разработка не начиналась с десятком таких неизвестных.
Поэтому нормальный исход встречи иногда звучит как:
🤩 И это намного полезнее, чем уверенно придумать правило на месте,
а вечером обнаружить, что бизнес хотел ровно наоборот.
📝 Следить за границами задачи
Очень легко начать с "добавим фильтр"
и через сорок минут обсуждать новый справочник, три метода API и переделку половины страницы.
🤩 В таком случае полезно спросить:
Если изменение отдельное➡️ фиксируем и выносим.
Иначе маленькая задачка постепенно превращается в чемодан, который уже не закрывается, но команда продолжает сверху садиться...
✍️ После груминга - самое важное
Все договорённости должны переехать обратно в требования,
а не оставаться в формате "Ну мы же на груминге решили"
🤩 Через месяц никто не вспомнит, что именно решили,
а разработчик, тестировщик и аналитик будут помнить три немного разные версии одного разговора.
🤩 После нормального груминга задача должна выглядеть так,
чтобы её можно было отдать человеку, которого на встрече вообще не было.
Потому что задача аналитика на груминге➡️ не ответить вообще на каждый вопрос Вселенной,
а сделать так, чтобы к моменту разработки команда одинаково понимала,
что строим, как это должно вести себя и где заканчивается задача.
А если после встречи вопросов стало чуть больше, чем до неё - ничего страшного.
Иногда это буквально признак того, что вы наконец начали смотреть на задачу внимательно.🙂
и почему после хорошего груминга задача должна стать скучной (
открывается задача, команда читает описание, и через тридцать секунд начинается прекрасное:
- А если пользователь уже сделал это раньше?
- А откуда берём данные?
- А если сервис не ответил?
- Это точно входит в эту задачу?
- А дизайн вообще знает об этом?
И аналитик понимает, что задача, которая утром казалась "ну тут всё готово", обзавелась лором на три сезона...
Главная ловушка
и поэтому автоматически достраивает недостающие куски в голове.
Перед грумингом полезно открыть задачу с настроением человека, который видит её первый раз:
🤩 понятно ли, зачем это делаем?🤩 понятен ли сценарий?🤩 есть ли все условия и ограничения?🤩 описаны ли ошибки?🤩 приложены ли макеты и нужные ссылки?
Разработчики умеют читать) Задача аналитика
какая проблема, что меняется и где самые важные места.
А дальше уже обсуждать вопросы команды. Особенно полезно ловить формулировки типа:
Я бы тогда просто…
о существовании которой никто пять минут назад не подозревал.
Если разработчик спрашивает "А что делать, если запись уже удалена?"
и ответа нет
Поэтому нормальный исход встречи иногда звучит как:
Так, вот это уточню и вернусь
а вечером обнаружить, что бизнес хотел ровно наоборот.
Очень легко начать с "добавим фильтр"
и через сорок минут обсуждать новый справочник, три метода API и переделку половины страницы.
Это точно часть текущей задачи или мы сейчас случайно родили ещё одну?
Если изменение отдельное
Иначе маленькая задачка постепенно превращается в чемодан, который уже не закрывается, но команда продолжает сверху садиться...
Все договорённости должны переехать обратно в требования,
а не оставаться в формате "Ну мы же на груминге решили"
а разработчик, тестировщик и аналитик будут помнить три немного разные версии одного разговора.
чтобы её можно было отдать человеку, которого на встрече вообще не было.
Потому что задача аналитика на груминге
а сделать так, чтобы к моменту разработки команда одинаково понимала,
что строим, как это должно вести себя и где заканчивается задача.
А если после встречи вопросов стало чуть больше, чем до неё - ничего страшного.
Иногда это буквально признак того, что вы наконец начали смотреть на задачу внимательно.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1