Речь пойдет не о программировании, а о том, как делать постановки (технические задания) для программистов.
Хотя, если Вы программист и посчитаете информацию полезной, то конечно можете подсказать своему аналитику пару интересных идей. :-)
Итак, представьте, что Вам нужно написать техническое задание на программное обеспечение.
Как бы Вы это сделали? Наверняка начали бы описывать внутреннее устройство и функции системы, верно?
Да, в целом так. Но дьявол, как известно, скрывается в деталях…
Обычно ТЗ — это перечисление функций: система должна выполнять то…, система должна делать это…, должны быть обеспечены такие-то и такие-то характеристики…
Однако, давайте разберемся в сути. Что же такое Техническое задание на самом деле?..
Побыв немного аналитиком, представьте себя на минуту программистом, которому нужно запрограммировать очень простую вещь: открыть пустое окно по нажатию кнопки на экране:
Давайте зададимся вопросом: что именно здесь программирует программист?
Ответ очевиден: он программирует действие по открытию окна, т.е. реакцию системы на нажатие кнопки пользователем.
Это основной принцип. Что бы ни программировал программист, все его задачи можно свести к программированию реакции системы на действия пользователя.
Это могут быть не только нажатия на кнопки, но и ввод данных в текстовые поля, нажатия мышкой, выборы из списка и т.п.
Более того, к такой форме можно свести вообще любые задачи программиста, даже если речь идёт о программировании какого-то внутреннего модуля, например, запуск чего-либо роботом или обмен информацией с другими системами.
Т.е. получается, что если нужно дать задание программисту, то в техническом задании лучше всего перечислить:
- все возможные действия пользователя с создаваемым интерфейсом и
- реакцию системы не действия пользователя.
Как-то так.
Получается, что на самом деле программисты программируют интерфейс системы. И техническое задание по сути должно представлять из себя в первую очередь описание интерфейса.
Метод составления ТЗ на основе описания интерфейсов является основной сценариев использования (use cases), речь о которых обязательно пойдёт в других статьях.
Такой подход предложили в своё время классики теории Use Cases — Крэг Ларман и Алистер Коберн, труды которых стоят того, чтобы с ними ознакомиться.
Описывайте интерфейсы в своих ТЗ и делайте такие документы, за которые программисты будут Вам благодарны!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (20)
Grox
11.09.2015 10:33+2Получается, что на самом деле программисты программируют интерфейс системы. И техническое задание по сути должно представлять из себя в первую очередь описание интерфейса.
Вы взяли какой-то узкий класс программистов. Есть ещё много тех, которые программируют участки, которые никак не связаны с интерфейсом системы или связаны весьма опосредовано. Это системные функции, библиотеки, драйвера и множество другого.Mrrl
11.09.2015 10:49+1И библиотеки и драйверы тоже прекрасно вписываются в схему «все возможные действия пользователя с создаваемым интерфейсом и
реакция системы на действия пользователя.» Только в роли пользователя там выступают другие части программы или даже железа. Но в целом — то же самое: запрос — ответ/реакция/встречный запрос.
kosmos89
11.09.2015 13:27Интерфейсы бывают не только пользовательскими (*UI), но и программными (API).
lair
11.09.2015 15:40И какой, по-вашему, API у задачи, которая на верхнем уровне (а это именно то, что пишется в ТЗ) звучит как «каждый час должны экспортироваться данные туда-то»?
kosmos89
11.09.2015 16:06Это точно мне вопрос? Потому что я не понял, что в моем комментарии имеет отношение к тому, что вы спрашиваете.
lair
11.09.2015 16:12+1Да, вам. Из вашей фразы, что интерфейсы бывают не только пользовательскими, но и программными, я сделал вывод, что вы считаете, что программист всегда программирует интерфейс системы. Вот я и поинтересовался, какой интерфейс у описанной мной системы.
Если я вас неправильно понял, то извините.
varenich
11.09.2015 16:18Это вопрос мне, наверное.
Действующее лицо: робот
Событие: срабатывание раз в час
Основной сценарий:
1.Робот запускает процедуру экспорта данных
2.Система производит экспорт.
Всё.
Далее в разделе «Алгоритмы» можно уже более подробно описать алгоритм экспортаlair
11.09.2015 18:07+2Наглядная демонстрация того, что это требование вырождено, в нем нет смысла. Намного проще написать функциональное требование «экспорт должен проводиться раз в час».
varenich
11.09.2015 18:15никакой вырожденности нет. всё по правилам
И смысл есть, т.к. такая форма представления чётко указывает на операцию, которую программист должен запрограммировать, а именно — экспорт.
ТЗ, в принципе, и пишутся для того, чтобы перечислить все операции, которые программистам нужно сделать, верно?lair
11.09.2015 18:16+2И смысл есть, т.к. такая форма представления чётко указывает на операцию, которую программист должен запрограммировать, а именно — экспорт.
А кто будет программировать «робота», который запускает этот экспорт раз в час?
ТЗ, в принципе, и пишутся для того, чтобы перечислить все операции, которые программистам нужно сделать, верно?
Нет. ТЗ пишется для того, чтобы описать желаемую функциональность (и нефукциональные характеристики) системы.
lair
11.09.2015 10:36+4Что бы ни программировал программист, все его задачи можно свести к программированию реакции системы на действия пользователя.
Либо вы бесконечно широко трактуете понятие «пользователь», либо это обобщение неверно. В частности, большую часть интеграционных задач так описывать неудобно.
Да, несомненно, ощутимую часть требований можно (и нужно) выразить в сценариях использования, но есть требования, для которых это неоправданно.
Greesha
11.09.2015 12:42+2Usecase — это требования более высокого уровня, чем описание пользовательского интерфейса.
Все руководства по разработке usecase рекомендуют избегать каких-либо предположений о реализации пользовательского интерфейса при описании сценариев. Хорошо написанный usecase может быть без реализован при выборе любого UI — например, и оконного, и консольного.Greesha
11.09.2015 12:53Собственно Коберн пишет об этом совершенно недвусмысленно:
<<Памятка 7. Не допускайте деталей графического интерфейса пользователя в варианте использования.
…
Описывать движения пользователя при манипулировании интерфейсом в документе о требованиях не следует, так как:
— Документ становится излишне длинным
— Требования становятся неустойчивыми в том смысле, что небольшие изменения в проекте интерфейса вызывают изменения в «требованиях» (которые не были в чистом виде требованиями)
— Это задача разработчика интерфейса пользователя, которому вы должны доверять как специалисту.>>varenich
11.09.2015 13:38ну ок, давайте по-другому
Что для вас является описанием интерфейса, а что нет?
Это описание интерфейса?
1.Система выводит список документов, каждый из которых представлен своим названием, номером, примечанием и датой регистрации.
2.Пользователь ввод поисковую фразу
3.Система отбирает подходящие документы и обновляет список
4.Пользователь выбирает нужный документ
…Greesha
11.09.2015 14:14Нет, это нормальный сценарий. Но пример в статье приведен совершенно противоположный (с кнопкой и окном).
varenich
11.09.2015 14:23-2Согласен, но суть-то в том, что как его не описывай, всё равно описывается действия пользователя с интерфейсом системы.
Да, может уровнем чуток по-выше, без привязки к конкретным элементам экрана, но всё равно это интерфейс.
richtrr
12.09.2015 02:31Это основной принцип. Что бы ни программировал программист, все его задачи можно свести к программированию реакции системы на действия пользователя.
Согласен. Но стоит заменить «пользователя» на внешнюю систему. И получится, что создается система, реагирующая на внешние события.
А на её события тоже кто-то реагирует… Хм, программа не одинока в этом мрачном мире!
mird
Набор UseCase это несомненно важная часть тз, но далеко не единственная. Не менее важной частью (как минимум) является E-R диаграмма (диаграмма сущности-связи).А кроме того, в тз должны быть нефункциональные требования (например требования на отзывчивость системы), скетчи интерфейса, и т.п.