Насколько избыточно/надежно должно быть реализовано сложное программное обеспечение?

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/19549

Вопрос

Фокус этого вопроса: Некоторое программное обеспечение выполняет «дополнительную работу», чтобы увеличить вероятность «в конечном итоге успешного/удовлетворительного» результата, несмотря на одну или несколько внутренних ошибок в программном обеспечении, что требует более длительного времени выполнения в случае возникновения этих ошибок.Все это происходит без ведома пользователя, если результат был успешным.

Определение сложного программного обеспечения:

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

Отредактировано: Что такое сложный?Пожалуйста, посмотри Есть большая разница между сложным и сложным.. (Прямая ссылка)

Определение избыточности/устойчивости в рамках этого вопроса:
(Добавлена ​​надежность на основе комментариев)

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

Пример такого ПО:

  • Миграция базы данных
    • Бизнес-база данных
    • База данных системы контроля версий и т. д.
  • Пакетное преобразование между документом Word и документом OpenOffice, PowerPoint и OpenOffice Draw и т. д.
  • Автоматический перевод всего сайта
  • Автоматический анализ пакета программного обеспечения, такого как Doxygen, но там, где анализ должен быть более надежным (т.е.не просто инструмент документации)
  • Сетевая связь, при которой пакеты могут быть потеряны и ожидается несколько повторных попыток.

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

Возможно связано:

Это было полезно?

Решение

Это деловой вопрос, а не технический.

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

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

Обычно я начинаю грубо, а затем со временем добавляю прочности.Я часто задаю подобные вопросы в рамках обычного процесса планирования.Обычно я работаю в стиле экстремального программирования, когда мы составляем длинный список желаемых функций, и я также добавляю туда функции надежности.Например, «Система переживает сбой любого отдельного коробки», смешается с такими вещами, как «Пользователь может присоединиться к учетным данным Facebook». Какой бы ни появился в первую очередь, я строю в первую очередь.

Другие советы

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

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

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

Редактировать:В свете перефразировки вопроса добавлю немного о надежности.По моему мнению, проверку параметров следует выполнять только в том случае, если а) вы принимаете очень специфический формат, такой как значение даты в виде строки, или б) различные параметры потенциально могут конфликтовать друг с другом или являются взаимоисключающими.

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

Что касается B), взаимоисключающие параметры представляют собой плохую структуру.Должно быть два класса: один обрабатывает один случай, а другой обрабатывает его другим способом.Все общие операции могут выполняться в одном базовом классе, чтобы избежать избыточности.

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

Программное обеспечение должно прощать ошибки пользователей и совершенно нетерпимо к ошибкам программистов.

Это означает, что программное обеспечение должно быть очень надежным и обеспечивать плавное восстановление таких вещей, как ошибки пользовательского ввода и ошибки конфигурации системы.По крайней мере, понятное сообщение об ошибке, указывающее, где произошла ошибка (поле ввода, файл конфигурации, аргумент командной строки и т. д.) и какое ограничение было нарушено («должно быть меньше X символов», «допустимые параметры: [X ,Y,Z]" и т. д...) Для дополнительной надежности программное обеспечение может предложить альтернативу или использовать разумное значение по умолчанию (но оно всегда должно указывать, что оно не использует именно то, что указал пользователь).

Я не могу вспомнить множество ситуаций, в которых оправдана автоматическая повторная попытка с другими значениями по умолчанию, но некоторые из них есть (автоматическая повторная попытка установить канал связи кажется разумной).Я согласен с @William, что этот уровень «избыточности» является бизнес-решением.

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

 int A(int x)
 {
   if (x==0) return -1
   ...
 }
 int B(int x)
 {
   if (x==0) return -1
   err = A(x)
   if (err) return err;
   ...
 }
 // and so on and so on....

Это просто дополнительная ненужная сложность.Вам не следует тратить время на то, чтобы выяснить, как одна функция должна обрабатывать ошибку, возникшую из-за неправильного использования другой.Если вы имеете в виду именно тот тип «надежности», то он вам не нужен.Замените его утверждениями и тщательным интеграционным тестированием.

Это требования.

Есть ли требования к прочности?

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

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

Предоставление программистам возможности изобретать надежность по ходу дела (если необходимо) приводит к созданию «волшебных» систем.

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

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

Лицензировано под: CC-BY-SA с атрибуция
scroll top