Форум программистов, компьютерный форум, киберфорум
Jin X
Войти
Регистрация
Восстановить пароль

Как писать ТЗ (техническое задание) для разработчиков ПО?

Запись от Jin X размещена 27.11.2021 в 00:54
Показов 4618 Комментарии 13

Как писать ТЗ (техническое задание) для разработчиков программного обеспечения?

Зачем? Давайте я напишу в чате!

Есть такая поговорка: "без нормального ТЗ результат будет х/з".
И заказчик, и разработчик заинтересованы в том, чтобы всё было сделано так, как задумывалось. Но к сожалению, даром телепатии разработчики обычно не обладают, и читать мысли заказчика не могут (по крайней мере, я – точно). Если заказчик что-то не описал, значит либо это неважно (т.е. делать этого не нужно, а если нужно, то делай как хочешь), либо важно, но сказать забыл (тогда за это потом придётся доплачивать отдельно, т.к. не было оговорено при согласовании задания).

Часто бывает так, что заказчик описывает задачу "в общих чертах", не вдаваясь в детали. Это происходит потому, что либо он не хочет тратить на это время (а разработчик если и хочет, то уж точно не бесплатно), либо не совсем чётко представляет, что ему нужно (не пытался углубляться в детали). И то, и другое нехорошо, потому что в первом случае время потратить всё равно придётся, т.к. нормальный разработчик будет задавать 100500 вопросов о деталях, либо отправит писать ТЗ. Другой же просто сделает всё на своё усмотрение, и потом уже, извините, без претензий, вы не говорили, что надо делать вот так, а не эдак. Во втором случае в процессе работы может всплыть столько нюансов, что либо вас попросят доплатить за то, что вы забыли о них упомянуть, либо вы поймёте, что вам нужно совсем не то, что вы заказали. Написание подробного ТЗ заставит вас углубиться в детали, более чётко понять, что вам нужно, и сэкономит время разработчика и ваши финансы.

Что касается "описания задачи чате", то это годится только для совсем простых заданий (с бюджетом, как правило, до 2000-3000 рублей). Если задача более или менее объёмная, то длинные описания в чатах, во-первых, неудобно читать (плохое форматирование, нет иллюстраций, нельзя распечатать). Во-вторых, в чате помимо описания задания будет много лишних сообщений, а собирать по всему чату крупицы ТЗ – занятие не самое весёлое, да и так можно чего-то упустить. Особенно, если ТЗ записано голосом или тем более рассказано по телефону (без записи). Всё должно быть зафиксировано в тексте! И в-третьих, как показывает практика, задание в чате описывается не слишком подробно. Поверьте, очень сильно напрягает долгое выяснение нюансов, и очень хочется заложить в бюджет этот час (два, три, пять) диалога с выяснением деталей задания.

Ок. Как же нужно?

Создайте документ MS Word, OpenOffice или т.п. А ещё лучше – документ Google Docs, доступ на редактирование которого нужно дать разработчику, чтобы вы вместе могли вносить туда правки (разработчик, например, сможет записать детали, выяснившиеся в процессе общения в чате).

В документе должно быть:
  • Описание назначения приложения/скрипта: для чего и для кого это нужно, какие функции выполняет и т.п. Будет ли продукт коммерческим (это важно, т.к. он может содержать элементы, например, библиотеки, которые могут быть запрещены для использования в коммерческих продуктах), либо для личного использования, либо это курсовая для учебного заведения.

  • Сроки выполнения задания. Можно указать максимальный и идеальный (желательный) срок. Почему-то многие забывают указывать сроки, даже когда их спрашиваешь об этом. Если сроки не имеют особого значения, так и напишите.

  • Рамки бюджета, если у вас есть понимание или какие-то ограничения, за которые нельзя выходить.

  • Напишите, требуется ли поддержка приложения после завершения работы (исправление багов, добавление новых функций). В течение какого времени и что должна включать в себя эта поддержка. Далее вы сможете обсудить с разработчиком условия такой поддержки (в рамках текущего бюджета, с абонентской платой или с отдельной оплатой каждого внесённого изменения). По умолчанию подразумевается, что в рамках текущего бюджета поддержка и исправление багов, обнаруженных через какое-то более или менее продолжительное время, не требуется (конечно, вы можете задать несколько вопросов или попросить о мелкой доработке, но не более).

  • Какой язык, библиотеки, технологии должны/могут быть использованы, если это важно. Под какую платформу (операционную систему) приложение должно работать.

  • Описание и иллюстрация пользовательского интерфейса (фото рисунков от руки, либо созданный в специализированных программах/сервисах скетч, например, в moqups.com – там есть большинство необходимых элементов интерфейса, которые удобно создавать, двигать и изменять). Не поленитесь, это поможет многое прояснить. Если приложение консольное, должны быть прописаны тексты, которые пользователь должен/может увидеть.

  • Если приложение достаточно сложное, опишите сценарий его использования сначала крупными блоками (без излишней детализации), а в следующем разделе уже начните описывать детали отдельных его частей (см. далее).

  • Максимально подробно и понятным, грамотным языком (с запятыми) опишите всё, что нужно сделать:
    • Для чего нужна каждая кнопочка, каждая галочка, каждое поле для ввода. Как должно реагировать приложение на ввод и нажатие на эти элементы.
    • Откуда берутся исходные данные (это константы, прописанные в коде; генерируются случайным образом; вводятся пользователем; задаются в командной строке; читаются из файла, имя которого вводится пользователем или указывается в командной строке; загружаются из сети, по какому адресу и т.д.).
    • Какой тип данных используется (числа – целые или вещественные, знаковые/беззнаковые, какого типа/размера; строка – в каком формате; может, данные хранятся в файле в UTF-8, JSON и т.д.).
    • Что и куда пользователь вводит, как приложение должно реагировать на ввод разных данных.
    • Как должна происходить обработка ошибок (пользователь ввёл неверную команду или слишком большое/отрицательное число; файл отсутствует или имеет неверный формат; в таблице имеется несколько значений вместо одного, либо оно отсутствует вовсе; два однотипных значения имеют разный размер или тип и т.д.)?
    Всё это должно сопровождаться иллюстрациями/скриншотами, текстами, ссылками и т.д.!!!
    Конечно, совсем очевидные вещи описывать не нужно, но если есть хоть малейшее сомнение, лучше опишите, потому что то, что очевидно вам (как человеку, погружённому в проект), может быть совершенно неочевидно другому.

  • Опишите примеры нормальных сценариев использования приложения (если вариантов несколько, то и примеров пусть будет несколько). "Крупными блоками" вы дали описания ранее. Теперь нужно сделать это детализировано и последовательно, по шагам, пункт за пунктом!

  • Опишите примеры нетипичного использования (неверный ввод, отсутствие нужных файлов и т.д.).

  • Если у вас есть примеры входных параметров и ожидаемого результата (например, когда приложение вычисляет какое-то значение или обрабатывает текст), добавьте их в ТЗ для контроля правильности работы приложения. Особенно ценны результаты для нетипичных входных параметров, которые могут привести к неожиданным ошибкам и сбоям.

  • Примечания, пожелания, приложения... Если вам нужны подробные комментарии по коду, напишите об этом. Если задание содержит работу с API, подразумевает использование математических методов, каких-то стандартов и т.д., приложите документацию/описание или ссылку, если это у вас есть. Чем больше работы (в т.ч. по поиску материала) вы перекладываете на плечи разработчика, тем выше стоимость.

  • Если у вас есть какие-то дополнительные материалы (файлы данных, готовые модули и пр.), обязательно прикрепите их и опишите в ТЗ.
Крайне важно писать понятно и уделить внимание деталям (очень странно, когда заказчик при первом контакте пишет так, будто они уже неделю обсуждают этот проект с разработчиком).
Если вы не указали, что приложение должно использовать какой-то конкретный метод решения, библиотеку или версию библиотеки и пр., подразумевается, что можно использовать любой метод/библиотеку/версию.
Если вы не указали, что приложение должно быть кроссплатформенным (работать под Windows, Linux, macOS, да ещё и на ARM), обычно подразумевается, что оно должно работать только под Windows на процессорах x86 (если это, конечно, не веб-разработка).
Если вы не указали, что приложение должно быть многопоточным, подразумевается, что оно должно быть однопоточным.
Если вы не описали какие-то функции (например, что некий список можно пополнять, удалять, сортировать), подразумевается, что такие функции реализовывать не требуется.
И т.д.
Я, конечно, задаю вопросы, чтобы прояснить вышеобозначенные моменты, но бывают ситуации, когда что-то действительно кажется очевидным, однако по факту нужно совершенно другое. Например, если заказчик говорит: "Пользователь вводит с клавиатуры число N, а программа должна вывести кол-во простых чисел, не превышающих N", – то вопрос о многопоточности может даже и в голову не прийти.

Хочу ещё раз сакцентировать внимание на том, что проект в представлении заказчика и разработчика может выглядеть совершенно по-разному, если задание к нему описано недостаточно подробно. И если добросовестный разработчик сделал не совсем то, что ожидал заказчик, скорее всего это будет по причине того, что заказчик предоставил недостаточно подробное ТЗ. Если в задании что-то не указано, значит это несущественно. А как же иначе? Это важно понимать, во избежание конфликтов и лишних расходов!

Финальный вариант документа отправляется в чат (или на почту) при окончательном утверждении заказа.

И напоследок...

Будьте добры, перед тем, как отправить ТЗ, прочтите его. Нет ли ошибок? А может, что-то уже перестало быть актуальным? Всё ли понятно (по возможности, дайте почитать кому-то ещё, чтобы выяснить это)?
Что откуда берётся и куда отправляется? Достаточно ли подробно описаны различные сценарии работы? Если сказано, что нужно прочитать файл – понятно ли какой файл (с каким именем)? Что в нём хранится и в какой формате? Приведён ли конкретный пример содержимого этого файла? Если что-то нужно удалить, понятно ли что делать с данными, зависимыми от удаляемых? Если изображение должно вписаться в какую-то область, указано ли – с сохранением пропорций или без? Если мы работаем со звуковыми/графическими/видео файлами, то какие форматы должны поддерживаться (например, wav и mp3, png и jpg, avi и mp4)? И т.д.

Избегайте фраз вроде "берётся некоторый файл" (какой именно?), "можно сделать такую функцию" (решите уж – нужно или нет... если же вы хотите уточнить бюджет с этой функцией и без неё, так и напишите) и т.п. Помните, что если вас можно понять неправильно – вас скорее всего поймут неправильно.

Если вы не программист, вам может быть сложно учесть все детали или понять, как лучше сделать что-то – это нормально. Так и напишите: "сделайте это на своё усмотрение" или "я не знаю, как лучше это сделать, посоветуйте что-нибудь".
Как бы хорошо и подробно вы не составили ТЗ, у разработчика, скорее всего, всё равно возникнут некоторые вопросы и потребуется уточнение какие-то нюансов. Однако, их будет значительно меньше, чем при описании задания в чате "в общих чертах"

Разумеется, углубляясь в детали, не нужно доводить всё до абсурда. Т.е. описывая программу деления двух целых чисел, необязательно детализировать всё настолько подробно:
Нажмите сюда, чтобы посмотреть...
1. Вывести приглашение на числа "Введите целый числитель: ".
Если введена пустая строка, завершить работу приложения.
Если введено неверное число (буквы, знаки препинания), вывести ошибку "Введено неверное значение." и завершить работу.
Если введено дробное число, усечь его до целого.
Если введено число в 16-ричной системе счисления с префиксом "0x", преобразовать его в десятичное.
Если введённое число начинается с цифры 0, считать его восьмеричным и преобразовать в десятичное.
Если после числа указаны неверные символы, для распознавания числа использовать цифры до этих символов.
Если введённое число не помещается в тип int, вывести сообщение "Введено слишком большое число." и завершить работу.
В случае успешного ввода записать число в переменную A.

2. Вывести приглашение на числа "Введите целый знаменатель: ".
Если введена пустая строка, завершить работу приложения.
Если введено неверное число (буквы, знаки препинания), вывести ошибку "Введено неверное значение." и завершить работу.
Если введено дробное число, усечь его до целого.
Если введено число в 16-ричной системе счисления с префиксом "0x", преобразовать его в десятичное.
Если введённое число начинается с цифры 0, считать его восьмеричным и преобразовать в десятичное.
Если после числа указаны неверные символы, для распознавания числа использовать цифры до этих символов.
Если введённое число не помещается в тип int, вывести сообщение "Введено слишком большое число." и завершить работу.
Если введён ноль, вывести ошибку "Деление на ноль невозможно." и завершить работу.
В случае успешного ввода записать число в переменную B.

3. Вывести сообщение "Частное от деления = " и частное от деления числа A на B.

4. Вывести сообщение "Для завершения нажмите Enter.".
Ожидать нажатия на клавишу Enter.
В данном случае это будет чрезмерным усложнением и только увеличит стоимость, т.к. разработчику придётся обрабатывать все описанные вами случаи именно так, как вы указали.
Не нужно описывать уж совсем очевидные вещи (если они действительно очевидные и способы решения этих вопросов для вас особо не важны). В данном примере достаточно просто написать так: "Предусмотреть обработку ввода неверных данных и деления на ноль с выводом соответствующих сообщений".

И, пожалуйста, проявите уважение к читателю и потратьте время на форматирование документа: заголовки, отступы, выделения и пр. Не помешает и проверка на ошибки правописания (клавиша F7 в MS Word). Возможно, вам придётся показать его не одному человеку. Поверьте, хорошее ТЗ вызывает уважение и даже немного удивление, т.к. к сожалению, встречается не так часто, как хотелось бы
Размещено в Фриланс
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 13
Комментарии
  1. Старый комментарий
    Но к сожалению, даром телепатии исполнители обычно не обладают, и читать мыслей заказчика не могут (по крайней мере, я – точно).
    Почему к сожалению? К счастью! Только представьте, что кто-то может читать мысли другого человека. Это значит он может прочитать информацию ему не предназначенную.
    Запись от wer1 размещена 27.11.2021 в 09:23 wer1 вне форума
  2. Старый комментарий
    Аватар для Croessmah
    Цитата Сообщение от wer1
    Почему к сожалению? К счастью! Только представьте, что кто-то может читать мысли другого человека. Это значит он может прочитать информацию ему не предназначенную.
    Достаточно установить Brain Defender
    Запись от Croessmah размещена 27.11.2021 в 17:33 Croessmah вне форума
  3. Старый комментарий
    ИМХО, сроки, бюджет и поддержка нужна/нет это не из ТЗ. Это должно быть "рядом". Точнее это "характеристика" уже именно заказа. В задаче уже на одном уровне: желаемое ТЗ, некое описание бюжета... В техническом задании только технические моменты. Вот уже на основании ТЗ можно говорить о сроках и бюджетах.

    Все равно написание ТЗ процесс с итерациями. На него и ограничения по бюджету будут влиять и по времени... Но тем не менее.

    Кроме того уж коли речь об универсальных рекомендациях по составлению тз.
    Если ПО должно что то считать но не только входные данные, но и,при возможности, выходные данные по которым можно контролировать корректность расчета.

    Если что то ГОСТИруется, регулируется внутренними и внешними документами - ссылки на них или, что еще лучше, в приложении.
    Запись от voral размещена 27.11.2021 в 17:44 voral на форуме
  4. Старый комментарий
    Хорошо подогревает более ответственный подход заказчика к написанию ТЗ - фраза в договоре "все что не указано в ТЗ явно, разрабатывается на усмотрение Исполнителя"
    Запись от voral размещена 27.11.2021 в 17:46 voral на форуме
  5. Старый комментарий
    Аватар для vantfiles
    Но к сожалению, даром телепатии для разработчики обычно не обладают, и читать мыслей заказчика не могут (по крайней мере, я – точно).
    Будьте добры, перед тем, как отправить ТЗ, прочтите его.
    В том числе и для того, чтобы проверить на грамотность, а еще лучше в спеллчекер его засунуть.

    Поверьте, хорошее ТЗ вызывает уважение и даже немного удивление,
    ТЗ без грамматических и стилистических ошибок в наше время вообще вызывает шоковое состояние.
    Запись от vantfiles размещена 27.11.2021 в 20:50 vantfiles вне форума
  6. Старый комментарий
    Аватар для Jin X
    Цитата Сообщение от voral
    ИМХО, сроки, бюджет и поддержка нужна/нет это не из ТЗ. Это должно быть "рядом".
    Возможно, это, конечно, логичнее по структуре. Но лично мне было бы удобнее видеть всё в одном документе.

    Цитата Сообщение от voral
    Кроме того уж коли речь об универсальных рекомендациях по составлению тз.
    Если ПО должно что то считать но не только входные данные, но и,при возможности, выходные данные по которым можно контролировать корректность расчета.
    Пардон, перечитал несколько раз, но смысла фразы так и не понял
    Запись от Jin X размещена 28.11.2021 в 23:05 Jin X вне форума
  7. Старый комментарий
    Аватар для Jin X
    Цитата Сообщение от vantfiles
    В том числе и для того, чтобы проверить на грамотность, а еще лучше в спеллчекер его засунуть
    Добавил
    Запись от Jin X размещена 28.11.2021 в 23:13 Jin X вне форума
  8. Старый комментарий
    Аватар для vantfiles
    Но к сожалению, даром телепатии для разработчики обычно не обладают, и читать мыслей заказчика не могут (по крайней мере, я – точно).

    Cлово "для" - лишнее, в правильном падеже "мысли", а не мыслей.
    Запись от vantfiles размещена 29.11.2021 в 05:35 vantfiles вне форума
  9. Старый комментарий
    Аватар для Jin X
    Цитата Сообщение от vantfiles
    Cлово "для" - лишнее, в правильном падеже "мысли", а не мыслей.
    Thanks, fixed (вероятно, в начале первого слова должна была быть другая буква, ну да ладно )
    Запись от Jin X размещена 29.11.2021 в 12:13 Jin X вне форума
  10. Старый комментарий
    Цитата Сообщение от Jin X
    Пардон, перечитал несколько раз, но смысла фразы так и не понял
    Если есть возможность и вообще имеет какой то смысл в рамках конкретной задачи, то предоставлять эталонные результаты для различных входных значений... Т.е. если делаем калькулятор. то приложить:
    2+2 = 4
    2+3 = 5
    и т.п. особенно если этот калькулятор с "поправкой на ветер"
    Правда тут тоже бывает подвох. Как правило если и предоставляют, то "типовые" случаи. А гораздо интереснее когда входные параметры "редко встречающиеся".

    Сразу пример из опыта (правда его утрирую, чтоб лишними деталями не перегружать). В ходе разработки пришли что выходной параметр будет считаться по определенной формуле, и при всех предоставленных данных получилось все красиво и правильно. При этом один из входных параметров был например в диапазоне от 50 - 100... И так бывает в 99% случаев. И вот прилетает случай из оставшегося процента. и входной параметр 120. а формула, почти как "экспонента" ну и все улетело в космос.

    И вот такие ситуации когда клиент на этапе ТЗ вообще ни как не обозначает такие ситуации - обычное дело.... Причем вообще не зависит от сферы проекта... Уже с опытом начинаешь сразу такие места выявлять, и все равно когда говоришь, в ответ "да ну нафиг, не может быть" (хотя если поднажмешь) "теоретически может быть".... в общем "не делаем", а потом уже в боевом режиме "караул у нас все пропало"

    Но, опять же, написание ТЗ штука итерационная, по этому некую долю способностей предсказывать программист должен иметь
    Запись от voral размещена 30.11.2021 в 12:50 voral на форуме
  11. Старый комментарий
    Аватар для Jin X
    Цитата Сообщение от voral
    Если есть возможность и вообще имеет какой то смысл в рамках конкретной задачи, то предоставлять эталонные результаты для различных входных значений...
    Кстати, хорошее дополнение. Добавил.
    Запись от Jin X размещена 01.12.2021 в 11:13 Jin X вне форума
  12. Старый комментарий
    Писать ТЗ на ПО строго по ГОСТам ЕСПД! ГОСТ на ТЗ определяет чёткие разделы и их содержание! Читаем и пишем. Начальство и согласующие службы редактируют, исправляем, утверждаем и вперёд!
    Запись от ngturey размещена 01.12.2021 в 12:15 ngturey вне форума
  13. Старый комментарий
    Аватар для Jin X
    Цитата Сообщение от ngturey
    Писать ТЗ на ПО строго по ГОСТам ЕСПД!
    Зачем? Может быть, это и полезно, когда нужно показать начальству, представить комиссии или какой-то гос. структуре. Но лично мне, к примеру, нужно для собственного удобства и понимания задачи.
    Кто в здравом уме будет штудировать ГОСТ, чтобы заказать программу, скажем, за 10 т.р.? Ну или за 50 т.р.
    Или это сарказм?
    Запись от Jin X размещена 02.12.2021 в 20:31 Jin X вне форума
 
Новые блоги и статьи
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru