Чего мы ждём от ФЗ
Документирование возможностей продукта в виде функционального задания призвано дать команде ясное представление о нём. Для разработчика задачи точно сформулированы и подчинены порядку, что оптимизирует процесс разработки. Тестировщик с помощью ФЗ может составить чек-лист — детализированный список функций, которые необходимо протестировать и либо убедиться, что они работают так, как написано в документе, либо обнаружить ошибки. В дальнейшем при разработке и поддержке продукта тестировщик добавляет все изменения в ФЗ, актуализируя документ.
Если клиент вдруг решил обратиться в другую студию, то передать проект новой команде будет проще и быстрее, когда есть ФЗ.
Так как общепринятых стандартов нет, требования к ФЗ диктуются здравым смыслом. Оно должно быть ёмким, ведь никто не захочет читать огромную простыню. При этом у команды не должно быть вопросов к документу, описание должно быть понятным и однозначным.
И конечно же, ФЗ должно приносить пользу команде, иначе зачем создавать документ, который никому не нужен.
Что такое ФЗ
Чтобы подобных ситуаций не происходило, все члены команды должны понимать, какого результата необходимо достичь. Для этого в компании Лайв Тайпинг, где я работаю аналитиком, формируется функциональное задание (ФЗ) — документ, который описывает все возможности продукта. ФЗ нужно для:
- формирования технической документации (ТЗ);
- понимания, как всё работает;
- оценки и планирования разработки;
- тестирования;
- документирования соглашений заказчика и команды о том, как будет работать готовый продукт;
- передачи проекта новой команде.
На этапе проектирования за составление ФЗ отвечают аналитик и менеджер. Оно может быть написано как ими обоими, так и только менеджером, а после дополнено деталями от аналитика. Параллельно с доработкой ФЗ создаётся дизайн, поэтому одна из задач специалистов — проследить, чтобы дизайн и ФЗ не расходились, а дополняли друг друга.
Определения
Что такое функциональность программы или сайта? В общем смысле функциональность — это:
В первом и втором случае определение функциональности обозначает количественное понятие: у человека, предмета или приложения есть одна или более возможностей, и их совокупность называется функциональностью. В третьем и четвёртом случае о функциональности говорится с качественной точки зрения: человек, предмет или приложение способны решать определённую задачу, и чем лучше они это делают, тем они функциональнее.
Смартфон унаследовал от классического телефона только одну функцию: обеспечивать телефонную связь между абонентами. Кроме этого он умеет выходить в интернет, будить, быть записной книжкой, снимать фото и видео, проигрывать музыку, оплачивать покупки в магазине и много чего ещё. Всё это складывается в функциональность телефона в количественном смысле слова.
Unité d’habitation («Жилая единица», или «Марсельский блок») Ле Корбюзье — пример функциональной архитектуры, возникшей в первой половине XX века в Европе и США. Этот стиль был призван решить задачу создания практически полезных и удобных построек для работы и жизни. Архитектурный функционализм отразился на советских «хрущёвках», ставших результатом проведения в жизнь постановления ЦК КПСС «Об устранении излишеств в планировании и строительстве». Поскольку к функциональной архитектуре вообще и к Unité d’habitation в частности предъявляется одно ясно сформулированное требование, это позволяет говорить об их функциональности как о качественном понятии.
Слово «функционал» имеет несколько значений. Функционал — это:
Простое сопоставление определений «функционал» и «функциональность» показывает, что синонимами они не являются. Кроме того, словосочетания «функционал сайта» или «функционал приложения» — это примеры некорректного использования данного понятия. Спорить с этим тем более сложно, если читаешь самые гневные публикации на эту тему. В 2015 году в одном из популярнейших постов в своём блоге об этом ругался Павел Фёдоров. Ровно о том же за шесть лет до Фёдорова желчно, а потому очень остроумно, ругался автор украинского журнала «Компьютерное обозрение» Андрей Зубинский. Цитату последнего мы, ввиду её остроумности, возьмём за правило (орфография сохранена):
Итак, семантически функционал и функциональность — это разные вещи.
А как выглядит документ, который никому не нужен?
Обычно в ФЗ возможности продукта расписываются по экранам в свободном стиле. Такой подход чреват тем, что в итоге все будут иметь дело с громадным документом, который получился таким из-за желания описать всё до мелких подробностей. Тот же свободный стиль делает каждое новое ФЗ непохожим на предыдущее. Единой структуры — нет, как вообще начинать писать такой документ и на что опираться — непонятно.
Дел с таким документом команда иметь не хочет: специалистам проще пообщаться с аналитиком или менеджером, а тестировщики пишут свои чек-листы с нуля, потому что время тестирования по ФЗ увеличивается в разы.
Продукт с течением времени развивается и обрастает новыми функциями. Соответственно, документацию к продукту нужно обновлять. Но желание обновлять окончательно пропадает после понимания, что документом всё равно никто не пользуется. Процесс написания ФЗ превращается в ненужную трату времени. Документ покрывается мхом и вскоре забывается.

Когда твоё ФЗ никто не читает
Трудности перевода
Как вообще слово «функционал» стало описывать набор чьих-либо возможностей?
Виталий Филатов полагает, что под видом функционала в русском языке освоилось английское слово functional. Его перевели как «функциональный», простодушно сократили до «функционала» и столь же простодушно стали использовать как и где захочется — например, в качестве синонима функциональности.
Только переводчики или исполняющие их обязанности не учли, что в словообразовании английского языка есть такой приём, как конверсия. Это способность слова быть и существительным, и прилагательным, и глаголом, не меняя при этом внешнего вида.
Примеры:
love — любовь, to love — любить
hate — ненависть, to hate — ненавидеть
face — лицо, to face — столкнуться лицом к лицу
water — вода, to water — полить водой
brave — смелый, the brave — смельчак
functional — функциональный, functional — функционал
В английском языке слово functional может быть и прилагательным, и существительным, но в последнем случае — только как математический или it термин.
Пренебречь привычным определением слова «функционал» в русском языке удалось только в случае функционала как гомосексуала-полигама. Но если в английском языке это прилагательное, то у нас — существительное. Теперь правило Андрея Зубинского расширяется:
если вы не математик и не говорите о личной жизни гомосексуала — не употребляйте слово «функционал».
В следующих публикациях я покажу, как разделены качественная и количественная функциональность в английском языке, подумаю, можно ли подобрать для функциональности достойный синоним, чтобы не попадать в эту ловушку, определюсь, как себя вести в формальной письменной, неформальной письменной и устной речи и загляну в блоги коллег по отрасли.
Arity (арность)
Количество аргументов функции. От слов унарный, бинарный, тернарный (unary, binary, ternary) и так далее. Это необычное слово, потому что состоит из двух суффиксов: «-ary» и «-ity.». Сложение, к примеру, принимает два аргумента, поэтому это бинарная функция, или функция, у которой арность равна двум. Иногда используют термин «диадный» (dyadic), если предпочитают греческие корни вместо латинских. Функция, которая принимает произвольное количество аргументов называется, соответственно, вариативной (variadic). Но бинарная функция может принимать два и только два аргумента, без учета каррирования или частичного применения.
Monoid (моноид)
Объект с функцией, которая «комбинирует» объект с другим объектом того же типа. Простой пример моноида это сложение чисел:
В этом случае число — это объект, а это функция.
Должен существовать нейтральный элемент (identity), так, чтобы комбинирование значения с ним не изменяло значение. В случае сложения таким элементом является .
Также необходимо, чтобы группировка операций не влияла на результат (ассоциативность):
Конкатенация массивов — это тоже моноид:
Нейтральный элемент — это пустой массив
Если существуют функции нейтрального элемента и композиции, то функции в целом формируют моноид:
— это любая функция с одним аргументом.
Что такое функция
Функция — это мини-программа внутри вашей основной программы, которая делает какую-то одну понятную вещь. Вы однажды описываете, что это за вещь, а потом ссылаетесь на это описание.
Например, вы пишете игру. Каждый раз, когда игрок попадает в цель, убивает врага, делает комбо, заканчивает уровень или падает в лаву, вам нужно добавить или убавить ему очков. Это делается двумя действиями: к старым очкам добавляются новые, на экран выводится новая сумма очков. Допустим, эти действия занимают 8 строк кода.
Допустим, в игре есть 100 ситуаций, когда нужно добавить или убавить очки — для каждого типа врага, преграды, уровня и т. д. Чтобы в каждой из ста ситуаций не писать одни и те же восемь строк кода, вы упаковываете эти восемь строк в функцию. И теперь в ста местах вы пишете одну строку: например, changeScore(10) — число очков повысится на 10.
Если теперь изменить, что происходит в функции changeScore(), то изменения отразятся как бы во всех ста местах, где эта функция вызывается.
1.1. Понятие функционала и оператора
В
курсе высшей математики вводилось
понятие функции. Если некоторому
числу x из
области D ставится в соответствие по
определенному правилу или закону
число y,
то говорят, что задана функция y
= f(x).
Область D называют
областью определения функцииf(x).
Если
же функции y(x) ставится
в соответствие по определенному правилу
или закону числоJ,
то говорят, что задан функционал J
= J(y).
Примером функционала может быть
определенный интеграл от функции y(x) или
от некоторого выражения, зависящего
от y(x),
Если
теперь функции y(x) ставится
в соответствие по определенному правилу
или закону вновь функция z(x),
то говорят, что задан оператор z
= L(y) или z
= Ly.
Примерами
дифференциальных операторов могут
служить:
Дадим
более строгое определение функционала.
Пусть A –
множество элементов произвольной
природы, и пусть каждому элементу u
є A приведено
в соответствие одно и только одно
число J(u).
В этом случае говорят, что на
множестве A задан
функционал J.
Множество A называется
областью определения функционала J и
обозначается черезD(J);
число J(u) называется
значением функционала J на
элементе u.
Функционал Jназывается
вещественным, если все его значения
вещественны. Функционал J называется
линейным, если его область определения
есть линейное множество и если
Разбор на примере ФЗ к проекту MyTech
Один из проектов, на котором мы реализовали новый формат ФЗ — MyTech, индонезийское приложение, предоставляющее возможность жителям страны быстро и удобно найти квалифицированного исполнителя для ремонтных работ по дому, начиная от покраски стен и заканчивая ремонтом смесителей, а исполнителям — найти новых заказчиков, предложив им свои услуги по ремонту.
Пользователи приложения разбиты на три группы: клиенты, техникаи и администраторы.
Клиент — создаёт заявки и выбирает исполнителей для них.
Техник — предлагает себя в качестве исполнителя заявки и может согласиться или отказаться от выполнения работы.
Детали касаемо заявки клиент и техник обсуждают в чате. Клиент может отслеживать местоположение назначенного техника по карте.
Административная панель MyTech
Мы выделили главные разделы приложения, которые и стали в дальнейшем эпиками: это доступ в приложение, работа с профилем, работа с заявками, которые относятся непосредственно к приложению. Маркетинговые инструменты, модерация, настройки, просмотр информации в админ-панели — эти эпики появились для панели администратора.
Далее мы описали, какие пользовательские истории относятся к нашим эпикам. Для доступа в приложение это были выбор роли при входе, регистрация и авторизация, восстановление пароля, причём регистрации техника и клиента отличались, поэтому мы разделили их на две разные истории. В работе с профилем появились такие истории, как редактирование профиля, работа с квалификационными документами, просмотр отзывов, смена локализации и др. Для модерации — блокировка и разблокировка пользователей, подтверждение и отклонение техников, просмотр заявок.
В этом документе вы увидите, как выглядит .
Определения
Область определения функционала может быть любым множеством. Если область определения является топологическим пространством, можно определить непрерывный функционал; если область определения является линейным пространством над R{\displaystyle \mathbb {R} } или над C{\displaystyle \mathbb {C} }, можно определить линейный функционал; если область определения является упорядоченным множеством, можно определить монотонный функционал.
Функционал, заданный на топологическом пространстве X{\displaystyle X}, называется непрерывным, если он непрерывен как отображение в топологическое пространство R{\displaystyle \mathbb {R} } или C{\displaystyle \mathbb {C} }.
Функционал, заданный на топологическом пространстве X{\displaystyle X}, называется непрерывным в точке x∈X{\displaystyle x\in X}, если он непрерывен в этой точке как отображение в топологическое пространство R{\displaystyle \mathbb {R} } или C{\displaystyle \mathbb {C} }.
Функционал, заданный на линейном пространстве, и сохраняющий сложение и умножение на константу, называется линейным функционалом. (Отображение линейного пространства в линейное пространство называют оператором).
Один из простейших функционалов — проекция (сопоставление вектору одной из его компонент или координат).
Довольно часто в роли линейного пространства выступает то или иное пространство функций (непрерывные функции на отрезке, интегрируемые функции на плоскости и т. д.).
Поэтому в прикладных областях под функционалом часто понимают функцию от функций, отображение, переводящее функцию в число (действительное или комплексное).
Функционал на линейном пространстве называется положительно определённым, если его значение неотрицательно и равно нулю только в нуле.
Отображение, переводящее вектор в его норму, является выпуклым положительно определённым функционалом, это один из самых распространённых функционалов. В физике часто используется действие — тоже функционал.
Задачи оптимизации формулируются на языке функционалов: найти решение (уравнения, системы уравнений, системы ограничений, системы неравенств, системы включений и тому подобного), доставляющее экстремум (минимум или максимум) заданному функционалу. Функционалы также рассматриваются в вариационном анализе.
Как нужно: эпики, пользовательские истории и критерии приёмки
Для решения проблемы мы попробовали изменить формат ФЗ, расписав возможности не поэкранно, а отталкиваясь от функциональной структуры приложения с помощью epic, user story и acceptance criteria.
Вначале мы определяемся с главными составляющими нашего проекта — эпик (epic). Это большая пользовательская история, которую можно разделить на группу идейно объединённых историй поменьше. Отличительная особенность эпика в том, что он показывает главные цели конечного пользователя.
Если же это мобильное приложение для оплаты услуг ЖКХ, то для такого проекта можно выделить такие эпики как доступ в приложение, профиль пользователя, счётчики, оплата услуг.
Эпик задаёт самые общие границы разделов приложения, поэтому следующим шагом будет разделение эпика на более мелкие части — пользовательские истории (user story).
Пользовательские истории — это короткие предложения, описывающие функциональность с точки зрения пользователя. Они включают в себя пользователя, функциональность, которую он применяет, и его цели.
Обычно для написания историй предлагается воспользоваться шаблоном:
«Как <роль пользователя>, я <что-то хочу получить> <с такой-то целью>»
При этом цель указывать необязательно, если она понимается однозначно.
- «Как клиент я могу воспользоваться поиском по каталогу, чтобы быстро найти нужный мне товар»;
- «Как клиент я могу добавить товар в вишлист, так что я смогу быстро вернуться к понравившимся товарам».
Ниже представлены примеры историй для услуг ЖКХ без указания цели:
- «Как клиент я могу авторизоваться в приложении»;
- «Как клиент я могу передать показания счётчика»;
- «Как клиент я могу перейти к архиву квитанций».
Эпики и пользовательские истории составляют «скелет» ФЗ, и на ранней стадии проекта такой структуры вполне достаточно. А на этапе дизайна документ дописывается полностью и появляются критерии приёмки (acceptance criteria) — короткие инструкции к пользовательским историям, описывающие функциональность более детально. Критерии приёмки — это шаги пользователя для достижения какой-то цели.
Вот несколько критериев приёмки к пользовательским историям:
- как клиент я могу воспользоваться поиском по каталогу, чтобы быстро найти нужный мне товар:
- я могу найти товар по названию;
- я могу найти товар по штрихкоду;
- я могу видеть экран-заглушку, если искомого товара нет в каталоге.
-
как клиент я могу передавать показания счётчика:
- я могу видеть номер счётчика и его тип (счётчик электроэнергии, горячей воды и т. п.);
- я могу ввести показания счётчика;
- я могу видеть показания счётчика и расход за предыдущий месяц;
- я могу сохранить/не сохранять введенные показания.
-
как клиент я могу посмотреть историю показаний счетчиков:
- я могу видеть список счётчиков и их номера;
- я могу открыть историю показаний по конкретному счётчику;
- я могу открыть историю показаний по конкретному счётчику;
- я могу видеть отправленные показания и расход за каждый месяц по конкретному счётчику.
При составлении критериев важно, что пользователь достигает цели, а способы и конкретные действия роли не играют. Поэтому критерии приёмки не учитывает количество экранов, расположение кнопок, их цвет и другие особенности дизайна
Такое ФЗ очень просто и быстро писать, ведь оно пишется по шаблону. Команде легко понять требования из-за отсутствия расплывчатости — краткие, простые предложения легче воспринимаются людьми. Работа тестировщиков по новому ФЗ упрощается: добавив обработку ошибок, они получат основу для тестирования продукта. Клиенты же, в свою очередь, экономят время и деньги на составлении простого для понимания ФЗ.
Слева: тестировщик пишет чек-лист без использования ФЗ. Справа: тестировщик пишет чек-лист, используя ФЗ