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

Возьмём калькулятор, который будет выполнять базовые арифметические операции (+, -, *, /).

Работу можно построить в 2 этапа:

  1. Поиск позитивных фактов о том, что именно мы хотим от калькулятора;

  2. Поиск негативных фактов, что может пойти не так (в широком смысле слова) при работе как с программой, так и с ТЗ — и формулирование требований, им препятствующим.

Используя наше понимание предметной области, можно сформулировать такие позитивные факты:

Калькулятор должен выполнять арифметические операции.

По большому счёту, позитивные факты на этом кончаются, так как дальше почти все относится к сфере «очевидно, что… — да? а мне не совсем очевидно».

Уровень сложности: I'm too young to die

Что может пойти не так:

Как насчёт тетрации?

Подстрахуемся и проверим, что правильно понимаем себе количество арифметических операций. Ан нет, их не 4 штуки, а минимум 10. Суперкорень нам вряд ли завтра пригодится, да и логарифм с простыми корнями, если мы про простую программу, тоже. Так что давайте явно укажем, о каких 4-х операциях речь:

Калькулятор должен выполнять 4 базовые арифметические операции: сложение, вычитание, умножение, деление.

(с точки зрения классики инженерии требований тут 4 требования в одном, но на данном этапе это не так важно)

Мы не указали интерфейс пользователя

Как мы понимаем сейчас, интерфейс вполне может быть как минимум голосовым, если не тактильным по Брайлю.

Поскольку мы пишем ТЗ на простую (и для разработки, и для пользователя) программу, то выберем именно графический интерфейс.

Калькулятор должен демонстрировать числа, с которыми происходят вычисления, в графическом пользовательском интерфейсе.

Сколько будет MCMXII + VII?

Далее, если копнуть чуть глубже — римские цифры по-своему хороши, но нам точно будет проще с привычными.

Калькулятор должен оперировать в пользовательском интерфейсе арабскими цифрами.

Направление чтения чисел

Как ни странно, но в современном мире есть люди, которые читают слова не только слева направо, но и в других направлениях. Числа обычно читают слева направо, но поскольку затевать этнографическое исследование по каждому вопросу мы не готовы, лучше подстраховаться:

Калькулятор должен оперировать в пользовательском интерфейсе числами, которые читаются слева направо.

Польская нотация

Те, кто учился на программиста, могут знать, что есть разные формы записей арифметических и логических выражений, и привычная нам школьно-вузовская математическая инфиксная форма не единственная.

Калькулятор должен позволять вводить и обрабатывать арифметические выражения в инфиксной записи.

So far, so good

Что у нас пока  получилось:

Калькулятор должен выполнять 4 базовые арифметические операции: сложение, вычитание, умножение, деление.

Калькулятор должен демонстрировать числа, с которыми происходят вычисления, в графическом пользовательском интерфейсе.

Калькулятор должен оперировать в графическом пользовательском интерфейсе арабскими числами.

Калькулятор должен оперировать в графическом пользовательском интерфейсе числами, которые читаются слева направо.

Калькулятор должен позволять вводить и обрабатывать арифметические выражения в инфиксной записи.

Классифицируйте это немедленно

У любого хоть немного системного — … аналитика, … программиста или … администратора наверняка возникнет желание классифицировать этот перечень для удобства анализа и работы с ним. Как минимум мы чётко видим подмножество требований про пользовательский интерфейс:

Функциональные требования

Калькулятор должен выполнять 4 базовые арифметические операции: сложение, вычитание, умножение, деление.

Требования к интерфейсам

Калькулятор должен демонстрировать числа, с которыми происходят вычисления, в графическом пользовательском интерфейсе.

Калькулятор должен оперировать в пользовательском интерфейсе арабскими числами.

Калькулятор должен оперировать в пользовательском интерфейсе числами, которые читаются слева направо.

Калькулятор должен позволять вводить и обрабатывать арифметические выражения в инфиксной записи.

Хм, последнее требование содержит в себе и функции тоже, что вроде как делает его и функциональным требованием, так и требованием к интерфейсу. И это называется ТЗ на простую программу? Запутались в 3-х соснах, то бишь в 5 требованиях — захотели упростить себе дальнейшую жизнь классификацией, но стало только хуже — ну, типичное горе от ума! :)

Ладно, давайте вернёмся на классический вид структуры, который мы проскочили — иерархический, в духе функциональной декомпозиции. В нём можно под каждую функцию запихнуть как функциональное подтребование, так и любое другое. Любое другое можно для удобства и обобщения назвать «ограничение» (constraint), т.к. они только и делают, что ограничивают поведение функции и ничего более!

Заодно можно поправить порядок записи требований на более хронологический, похожий на сеанс работы с программой, если не её тестирование:

Калькулятор должен позволять вводить арифметические выражения.

> Калькулятор должен позволять вводить арифметические выражения в инфиксной записи.

Калькулятор должен демонстрировать числа, с которыми происходят вычисления, в графическом пользовательском интерфейсе.

> Калькулятор должен оперировать в пользовательском интерфейсе арабскими числами.

> Калькулятор должен оперировать в пользовательском интерфейсе числами, которые читаются слева направо.

Калькулятор должен выполнять 4 базовые арифметические операции: сложение, вычитание, умножение, деление.

> Калькулятор должен выполнять арифметические выражения в инфиксной записи.

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

А вот это уже сценарий!

Поскольку у нас получился практически сценарий, а не просто иерархия, уже можно проверить его на замкнутость-полноту — позволит ли такой набор операций, выраженный функциями, получать нужный нам результат?

Как будто бы да, но человек со взглядом тестировщика легко подскажет, что позволять вводить, демонстрировать вводимое и вычислять результаты операций — это ещё не значит показывать результаты вычислений!

Поэтому давайте добавим последнюю явную функцию:

Калькулятор должен показывать результаты вычисления арифметических операций.

Отдельно заметим, как у нас тут плавает лексика. То мы пишем книжное «демонстрировать», то переходим на более неформальное «показывать». То «выполнять арифметические выражения» (м, а так можно вообще? выполняют вроде команды и запросы, а выражения, наверное, можно только обрабатывать), то «вычисления». В ходе разработки ТЗ такое полностью допустимо, т.к. мы хотим выражать смысл кратко, ясно и однозначно и для этого ищем и пробуем разные слова. Но при финализации требований будет полезно утрясти словарь и сделать его более однородным.

Фактически у нас получился типичный минимальный прото-юскейс из 4-х шагов:

  1. Программа предоставляет возможности ввода исходных данных и выдачи команды

  2. Пользователь вводит исходные данные и даёт команду

  3. Программа выполняет запрошенную команду над данными

  4. Программа сообщает пользователю результат выполнения команды

А интерфейс ввода?

Так, кажется мы что-то забыли. Пользователький графический интерфейс показывает цифры и операции, это ок. Но ведь для ввода чисел и команд тоже нужен интерфейс. И тоже не голосовой, но есть как минимум 2 варианта:

  1. Клавиатурный ввод

  2. Ввод мышью….

Можно затребовать оба интерфейса сразу, по крайней мере такой вариант мы видим в типичном десктопном калькуляторе. Стоп, а почему мы решили, что у нас десктоп, а не мобилка? Неужели для простейшей программы надо учитывать контекст применения? Получается, да. Или нет?

Калькулятор должен позволять вводить арифметические выражения посредством графического интерфейса.

Можно ли 7 шапок?

И вот так из вопроса про интерфейс ввода мы возвращаемся к более общему вопросу — а для какой категории устройств нужен калькулятор? И кстати, что насчёт планшетов? (Слона-то мы и не заметили)

Кажется, тут можно схитрить и потребовать, чтобы программа была кроссплатформенной и адаптивной. Фух, гора с плеч…

Но стоп, постойте, на каких именно категориях устройств разработчик будет демонстрировать и сдавать программу? У Андроид-устройств, например, есть множество версий устройств, да ещё на разных поколениях ОС.

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

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

Учитывая, что у настольного компьютера практически всегда минимум 2 интерфейса ввода (клавиатура и мышь), а на смартфоне всё-таки доминирует тачскрин, решаем делать программу именно для смартфона.

Итого, можно взять самое популярное устройство по итогам продаж за последний год в нашем регионе, например, Redmi 9A (32 ГБ).

Как будет выглядеть требование-ограничение для этого случая:

Калькулятор должен работать на устройствах Redmi 9A (32 Гб).

Шеф, всё сломалось

Вещи ломаются, софт тоже может сломаться или не сработать. Ожидать 100%-ной надёжности не приходится, важно выбрать какой-то разумный компромисс. В общем случае полезно делать надёжность, соответствующей ожиданиям пользователей. В случае сложной и дорогой программы стоит изучить показатели конкурентов и сделать расчёты стоимости отказа для пользователей и бизнеса.

В нашем же случае хватит простой прикидки — в скольки случаев из 100 программа может позволить себе сбой? У нас нет никакой дополнительной информации о контексте использования, поэтому можно заложить 1-2 сбоя на 100 команд.

Калькулятор должен выполнять вычисления над выражениями с надёжностью не меньше, чем 98%.

Поговорим о габаритах…

В физическом мире габариты и форм-фактор продукта, устройства сильно влияют на его потребительские качества.

В цифровом мире аналогом габаритов можно с некоторой натяжкой считать размер программы в памяти и на диске.

Представьте себе, что наша программа при скачивании весит 1 Гб. Допустимо ли такое? Вряд ли.

Тут можно опираться на benchmarking, т.е. измерение характеристик типичных программ такого класса на рынке. Или учитывать, в какой стране, с каким интернетом и на каких телефонах она будет применяться.

Однако например у Google Play есть собственные рекомендации и ограничения, которые можно напрямую использовать:

Калькулятор должен поставляться в виде дистрибутива размером не более 200 Мб.

… и эффективности

Следующий вопрос — нормально ли, что программа занимает 2 Гб оперативной памяти в телефоне в ходе применения? Для нашей программки тоже выглядит чересчур.

Если поискать информацию о лучших практиках, можно выйти на рекомендации, чтобы программа занимала в памяти не более 50 Мб. На этом и остановимся:

Калькулятор должен использовать не более 50 Мб оперативной памяти телефона.

Не тормози!

Рассмотрим ещё один не совсем очевидный, но вполне возможный случай негативного события — представим, что вводим в калькулятор 2 + 2 и калькулятор думает 14 часов. Ну или хотя бы 7 минут. Ладно, пусть будет 15 секунд. Что вы скажете о таком калькуляторе? Нужно ограничить это безумие!

И в вопросах скорости вычислений нам на помощь может прийти не только вездесущий бенчмаркинг, но и когнитивные эвристики Якоба Нильсена — например, про то, что реакция менее 0,1 секунды воспринимается большинством людей как мгновенная. Ну что же, так и запишем:

Калькулятор должен проводить вычисление арифметического выражения не более чем за 0,1 секунду.

Сколько вешать в граммах?

Если вернуться к вопросу вычислений, то можно вспомнить, что они проводятся с определённой точностью, не всегда абсолютной.

Опять-таки ищем лучшие практики для бытовых калькуляторов и выходим на уровень:

Калькулятор должен производить вычисления с точностью не хуже 8 знаков после запятой.

Знак бесконечности

С другой стороны, можно пытаться оперировать в вычислениях очень большими или очень маленькими числами. Сделать универсальное устройство не очень просто и скорей всего не нужно. Надо выбрать разумный диапазон пределов расчётов.

Поиск говорит, что типичный диапазон большинства бытовых калькуляторов составляет от 10^-99 до 10^99, однако для ввода чисел со степенью нужна возможность указывать степень отдельной командой, чего для простого калькулятора хочется избежать.

Кроме того, тут мы возвращаемся к вопросу про интерфейс — а сколько цифр мы хотим одновременно видеть на экране? У обычного карманного калькулятора 8-10 цифр на экране. Тогда можно ограничиться диапазоном в 10 цифр — т.е. 10 млрд как максимальное число. Но этого не хватит даже, чтобы показать годовой бюджет России (18 трлн в 2024-м году).

Однако программный калькулятор отличается от физического тем, что он может управлять размером отображаемых чисел и вообще делать перенос строк. После некоторых экспериментов можно установить, что достаточно читаемыми могут быть числа, представленные в виде 5 строк по x 3 разряда  x 7 троек нулей, те ~= 100 разрядов.

Таким образом, можно вернуться к диапазону типового калькулятора парой абзацев выше:

Калькулятор должен производить вычисления с числами от 10^-99 до 10^99.

Наши пальчики устали

Так, что у нас ещё осталось, какие риски, что может пойти не так?

Представим, что мы вводим выражение в виде длинной цепочки с большим количеством различных операций. Какое количество операций имеет смысл поддерживать?

Для компьютерной программы можно сказать, что всё равно — пока человек не устал вводить цифры и знаки, программа всё может обработать. Но значит ли это, что длина выражения может быть бесконечной? С практической точки зрения смысла в этом мало, поэтому и тут стоит договориться о точке, когда ваша программа наконец скажет ERROR….

Ой, кстати, а что насчёт ошибок, которые не являются сбоем? Например, деление на 0? Надо же как-то реагировать на это:

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

Вот так добавление одной только операции «разделить» нам усложняет поведение программы.

Ну и заодно давайте опишем, что же делать со сбоями:

Калькулятор должен сообщать о сбое в ходе выполнения операции.

И так до самого конца сплошные черепахи

Я предполагаю, что прочитав до этого места, вы как минимум ужаснулись количеству вещей и аспектов, о которых стоит подумать при создании, казалось бы, простейшего программного калькулятора. И это мы ещё не касались вопросов:

— графического дизайна,

— какие кнопки будут у калькулятора, кроме цифровых и операций,

— скорости реакции калькулятора на нажатие кнопок :)

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

Кроме того, по мере накопления опыта вы можете сами себе сделать «калькуляторы» различных перечисленных выше характеристик программы, т.к. математика таких расчётов такая же элементарная, как и у нашего калькулятора тут.

Смотрим итоговую сборку требований

Давайте соберём и посмотрим, что же у нас в итоге получилось:

Функции и их микро-ограничения

Калькулятор должен позволять вводить арифметические выражения.

Калькулятор должен позволять вводить арифметические выражения посредством графического интерфейса.

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

Калькулятор должен демонстрировать числа, с которыми происходят вычисления, в графическом пользовательском интерфейсе.

Калькулятор должен оперировать в пользовательском интерфейсе арабскими числами.

Калькулятор должен оперировать в пользовательском интерфейсе числами, которые читаются слева направо.

Калькулятор должен выполнять 4 базовые арифметические операции: сложение, вычитание, умножение, деление.

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

Калькулятор должен показывать результаты вычисления арифметических операций.

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

Калькулятор должен сообщать о сбое в ходе выполнения операции.

Макро-ограничения

Совместимость

Калькулятор должен работать на устройствах Redmi 9A (32 Гб).

Надёжность

Калькулятор должен выполнять вычисления над выражениями с надёжностью не меньше, чем 98%.

Эффективность

Калькулятор должен поставляться в виде дистрибутива размером не более 200 Мб.

Калькулятор должен использовать не более 50 Мб оперативной памяти телефона.

Производительность

Калькулятор должен проводить вычисление выражения не более чем за 0,1 секунду.

Точность

Калькулятор должен производить вычисления с точностью не хуже 8 знаков после запятой.

Границы вычислений

Калькулятор должен производить вычисления с числами от 10^-99 до 10^99.


Какие ещё дыры вы видите в такой спецификации требований? :)

За картинки спасибо нейрохудожнику Алине Богачёвой.

Комментарии (23)


  1. Spelling
    29.09.2024 07:56
    +4

    Самая большая дыра - это отсутствие описания целевой аудитории, которая будет использовать калькулятор. И в каких условиях они будут это делать. В результате половина требований может измениться, а половина быть нерелевантной. Возможно, что мы делаем калькулятор для детей, а может быть мы делаем калькулятор для прорабов на стройку. Я бы предпочла тут аджайл подход - можно сделать за минимальное количество человекодней прототип, проверить на фокус-группе, и вносить новые требования по результатам реальной обратной связи


    1. beskov Автор
      29.09.2024 07:56

      аудитория не является требованием к калькулятору)


      1. Spelling
        29.09.2024 07:56
        +2

        Без аудитории или хотя бы предполагаемой ценности это всё сферические требования в вакууме. Можно придумать ещё пару десятков. Только зачем?


        1. beskov Автор
          29.09.2024 07:56

          чтобы показать, как много аспектов есть у казалось бы простой программы, чтобы её можно было разрабатывать и сдавать

          допустим, вы определились с аудиторией

          вспомните ли вы обо всём том, что написано в статье?

          вспомните ли про то, какой символ использовать для отделения дробной части от целой?

          вспомните ли про то, какой символ использовать для разделения разрядов?

          подумаете ли о том, как должен вести себя калькулятор при удержании пальца на кнопке?


          1. Spelling
            29.09.2024 07:56

            Тогда я бы назвала это не требованиями, а гипотезами.

            "Мы предполагаем, что нашему пользователю важно явно различать целое число и дробь

            Мы предполагаем, что пользователям нужно различать разряды чисел

            и т.д."

            Во время исследования гипотеза либо подтвердится, либо не подтвердится. Либо будут получены более значимые инсайты, на которые следует сделать акцент в дальнейшем проектировании


            1. beskov Автор
              29.09.2024 07:56

              я исхожу из контекста, что разработчику даётся задание на разработку через требования

              если это не требование к поставке, а что-то другое — значит ли, что он может этого не делать?


        1. beskov Автор
          29.09.2024 07:56

          я больше скажу — на самом деле для разработки требований к ПО нужно не просто уточнить контекст и аудиторию, а ещё спроектировать использование, а если точнее — спроектировать надсистему, а для этого например сначала разработать требования к человеку, который будет применять калькулятор — в каком процессе, для чего, с какими ограничениями

          если вам просто сказать «строитель», у вас же автоматически требований к ПО не появится, тк вы в общем случае не знаете того, что описано выше


      1. vadimr
        29.09.2024 07:56

        По госту это называется "область применения" и относится к основным требованиям.


    1. beskov Автор
      29.09.2024 07:56

      Расскажите пожалуйста, какая аудитория у встроенного калькулятора Андроида


      1. beskov Автор
        29.09.2024 07:56

        и какие конкретно требования вы определите исходя из этой аудитории


      1. vadimr
        29.09.2024 07:56

        Допустим, для меня это большая загадка (ну, про айфон), и в том числе именно поэтому я не пользуюсь встроенным калькулятором.

        Ребята в Apple в 18-й версии iOS наконец, подумали над этим вопросом и реализовали нормальный калькулятор в Заметках, почти как это было в редакторе Слово и Дело 30 лет назад.


  1. rukhi7
    29.09.2024 07:56

    Какие ещё дыры вы видите в такой спецификации требований? :)

    у меня противоричивые чуства: с одной стороны к выводу о том что написать калькулятор на четыре действия невозможно, можно прийти гораздо быстрее,

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


    1. beskov Автор
      29.09.2024 07:56
      +1

      почему невозможно? можно написать калькулятор вообще без требований


  1. GospodinKolhoznik
    29.09.2024 07:56

    С чего это вдруг калькулятор стал простой программой? Арифметические действия изучаются в школе на протяжении 4 лет! Никак нельзя назвать простым то, что выполняет действия, на освоение которых надо потратить аж 4 года.


  1. OlegZH
    29.09.2024 07:56

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

    О_о! Очень хорошее начинание! Чрезвычайно интересно посмотреть, можно ли раскрутить эту тему до конца. Будет ли этот конец достигнут. За какие сроки. И т. д. И т. п.

    Калькулятор должен демонстрировать числа, с которыми происходят вычисления, в графическом пользовательском интерфейсе.

    А почему не рассматривается такая возможность, как реализация некоторого внутреннего для ОС компонента и организации соответствующего пользовательского интерфейса?

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

    Таким образом, первейший вопрос создания калькулятора — это вопрос о том, что именно делается: приложение или компонент. Понятное дело, что создаётся и то, и другое. Но ТЗ на приложение и ТЗ на компонент будут, очевидно, различаться.


  1. unbalanced
    29.09.2024 07:56

    Итак, это воскресенье и это время пофлудить, потому что никто не читает воскресный хабр.

    Во-первых, не дыры, а отверстия.

    Я все листал и все ждал, что в какой-то момент автор напишет - "видите, если все делать задом наперед - то будет трэш и угар, давайте уже сделаем передом назад". Но так и не дождался. В конце я увидел только "Микро-ограничения функций" и "Макро-ограничения". Предполагаю, что в данном случае "ограничения среднего размера" не понадобились. И я ведь так весь день ерничать могу.

    Все описанное ниже - строго на основании текста статьи ТОЛЬКО.

    Автор говорит как бы правильно, но потому что он старается и вертит головой во все стороны, чтоб не упустить ничего. А не потому, что он знает, что делает. И это не ремесло получается, а искусство, а так жыть нельзя. И автору об этом в первом же комменте указали кстати.

    Передом назад - это вот так, как я дальше пишу.

    АБСОЛЮТНО ЛЮБАЯ система - это костыль, который помогает сделать что-то. И если не понять, чему этот костыль помогает, то его все еще можно имплементировать. Просто им не будут пользоваться, потому что "а зачем мне эта штука"? А если понять, зачем он делается, то вот мы и получили бизнес-требования (ака БТ) - ответы на вопросы "что", "зачем" и "сколько". И только из них становится ясно, кто по итогу будет пользоваться этим костылем. И узнать у этих людей (порой (но очень редко) это будут не люди, кстати) случаи, в которых этот костыль поможет - и зафиксировать их. В б-гомерзких сторях или в православных юз-кейсах или еще как-то. И назвать их "пользовательские требования" (ПТ). И они всегда и это вообще неочевидно - следствие БП. И только поняв, сценарии юзания этого костыля (это все те же ПТ) - писать уже крнкретно требования к способу воплощения костыля в жизнь так, чтоб он под эти сценарии по итогу подпал. И это называется "требования к решению" (ТР). И они - прямое следствие ПЕ, которые сами - следствие БТ. А ТР могут быть про то, а) что костыль должен уметь (функциональные требования, ФТ) и б) как он должен это уметь (нефункциональные требования, НФТ). ФТ + НФТ = ТР.

    Т.е., в сути своей предыдущий абзац звучит так:

    1. БТ -> ПТ -> ТР. И это без шуток часто открытие для юниоров и неосведомленных

    2. ТР = ФТ + НФТ. Это, в принципе, минимальный набор, формирующий ТЗ. Но это ТЗ без возможости доработки. Потому что доработка потребует ПТ, а их тут нет, как видно. И вот так - правильно. И этот подход всегда один и тот же. И это именно то самое ремесленничество. Новый проект? Пришел на дискавери, вызнал БТ, сформировал пул будущих юзеров, узнал у них ПТ, сочинил ФТ. Потом у всех поспрашивал и сформировал НФТ. Конец. Все всегда одинаково.

    Ну и с высоты сказанного, о чем написал автор. По всему тексту размазаны ПТ, причем пользователь - это автор ("Суперкорень нам вряд ли завтра пригодится", "Как мы понимаем сейчас, интерфейс вполне может быть как минимум голосовым, если не тактильным по Брайлю" и т.п.) и НФТ, и у них то как раз нормальный источник - все подряд ("Калькулятор должен работать на устройствах Redmi 9A (32 Гб)", "Калькулятор должен выполнять вычисления над выражениями с надёжностью не меньше, чем 98%", "у Google Play есть собственные рекомендации и ограничения"). А в резюмирующей главе - ФТ (это которые функции с микро-ограничениями) и НФТ (которые макроограничения). БТ в статье нет. По итогу автор выдал-таки ТЗ, но потому что старался, а не потому знал как надо.

    И я бы написал, почему автор тут ни в чем не виноват, но этот коммент и так уже больше страницы высотой. Но если кто захочет - говорите, напишу)


    1. beskov Автор
      29.09.2024 07:56

      По итогу автор выдал-таки ТЗ, но потому что старался, а не потому знал как надо.

      Обожаю догадки. Я практикую разработку требований с 2004-го года, применяю сценарии использования с 2006-го, подход с разделением бизнес-требований, пользовательских требований и требования к ПО где-то с того же года. С 2013 года мы с коллегами обучили пару тысяч человек такому подходу.

      Кмк статья хорошо показывает ограниченность подхода к разработке требований как к заполнению шаблона SRS, как любят делать в некоторых госпроектах и ее только.


      1. unbalanced
        29.09.2024 07:56

        Обожаю догадки.

        Рад, что сумел доставить Вам удовольствие)

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


  1. OlegZH
    29.09.2024 07:56

    Фактически у нас получился типичный минимальный прото-юскейс из 4-х шагов:

    1. Программа предоставляет возможности ввода исходных данных и выдачи команды

    2. Пользователь вводит исходные данные и даёт команду

    3. Программа выполняет запрошенную команду над данными

    4. Программа сообщает пользователю результат выполнения команды

    Любопытно, что, при таком неожиданном обобщении, мы получили описание, под которое подпадает практически любое приложение.

    Например, я захожу и интернет-магазин, выбираю нужные мне товары и нажимаю кнопочку "Заказать", а программа на выходе сообщила мне (на выбор из трёх вариантов):

    1. Заказ оформлен и оплачен.

    2. Заказ не может быть оформлен, потому что кончились такие-то товары.

    3. Заказ не был оплачен, потому что на Вашей карте не имеется достаточно средств.


  1. OlegZH
    29.09.2024 07:56

    Можно затребовать оба интерфейса сразу, по крайней мере такой вариант мы видим в типичном десктопном калькуляторе. Стоп, а почему мы решили, что у нас десктоп, а не мобилка? Неужели для простейшей программы надо учитывать контекст применения? Получается, да. Или нет?

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

    (Здесь, о сути, происходит разделение на front-end и back-end.)

    А уже другие разработчики, руководствуясь Вашим протоколом будут отдельно делать конечное приложение для каждой платформы.


  1. vadimr
    29.09.2024 07:56

    Я бы поспорил с тем, что ваш калькулятор позволяет ВВОДИТЬ АРИФМЕТИЧЕСКИЕ ВЫРАЖЕНИЯ. Он вводит отдельные числа и операции, а с такой сущностью, как арифметическое выражение, вообще не работает. Программа не соответствует ТЗ.


  1. OlegZH
    29.09.2024 07:56

    Калькулятор должен производить вычисления с точностью не хуже 8 знаков после запятой.

    Следует напомнить, что у каждого вида вычислений своя точность. Чтобы обеспечить определённую точность результата, нужно требовать соответствующую точность у операндов. Не всегда точность можно гарантировать. Не всегда высокая точность имеет смысл.


  1. OlegZH
    29.09.2024 07:56

    Калькулятор должен производить вычисления с числами от 10^-99 до 10^99.

    Не думаю, что выбор некоторого фиксированного предела на все случаи жизни полезен. Всё-таки, калькулятор используется в конкретных обстоятельствах. Иногда нужно включать и "научный режим". (Конечно, если у пользователя есть GPU, то можно будет просто здорово извернуться.)))