Мой ответ будет с точки зрения реального бизнеса и задач, с которыми сталкивается каждая команда разработчиков. То, что я вижу в этом вопросе и во многих ответах, действительно касается контроля дефектов.
Код может быть без ошибок. Возьмите любой из примеров кода «Hello World» для любого языка программирования и запустите его на той платформе, для которой он предназначен, и он будет работать согласованно и давать желаемые результаты. Там заканчивается любая теория о невозможности кода без ошибок.
Потенциальные ошибки появляются, когда логика становится более сложной. Простой пример Hello World не имеет логики и каждый раз делает одну и ту же статическую вещь. Как только вы добавляете динамическое поведение на основе логики, возникает сложность, которая приводит к ошибкам. Сама логика может быть ошибочной, или данные, которые вводятся в логику, могут отличаться от способа, которым логика не обрабатывает.
Современное приложение также зависит от библиотек времени выполнения, уровней CLR, промежуточного программного обеспечения, баз данных и т. Д., Которые, в то же время, экономят время разработки в целом, также являются слоями, в которых могут существовать ошибки в этих слоях, которые остаются незамеченными при разработке и тестировании UAT и в производстве.
Наконец, цепочка приложений / систем, в которых приложение использует данные, которые питают его логику, являются источниками потенциальных ошибок либо в их логике, либо в программном стеке, на котором движется логика, или в вышестоящих системах, в которых оно потребляет данные.
Разработчики не на 100% контролируют каждую движущуюся часть, поддерживающую логику их приложения. На самом деле, мы не контролируем многое. Вот почему модульное тестирование важно, а управление конфигурацией и изменениями являются важными процессами, которые мы не должны игнорировать или быть ленивыми / небрежными.
Кроме того, документированные соглашения между вашим приложением, которое использует данные из источника вне вашего контроля, который определяет конкретный формат и спецификации для передаваемых данных, а также любые ограничения или ограничения, которые ваша система предполагает, что исходная система отвечает за обеспечение выхода в пределах эти границы.
В реальных приложениях разработки программного обеспечения вы не сможете заставить их летать, объяснив бизнесу, почему теоретически приложения не могут быть безошибочными. Дискуссии такого рода между технологиями и бизнесом никогда не произойдут, за исключением тех случаев, когда произошла технологическая неисправность, которая повлияла на способность бизнеса зарабатывать деньги, предотвращать потерю денег и / или поддерживать жизнь людей. Ответ на вопрос «как это может произойти» не может быть «позвольте мне объяснить эту теорию, чтобы вы поняли».
С точки зрения масштабных вычислений, которые теоретически могут потребовать вечности, чтобы выполнить вычисление и получить результат, приложение, которое не может завершиться и вернуться с результатом - это ошибка. Если характер вычислений таков, что он очень трудоемкий и требует значительных вычислений, вы берете этот запрос и предоставляете пользователю обратную связь о том, как / когда он может получить результат, и запускаете параллельные потоки для его обработки. Если это должно произойти быстрее, чем это может быть сделано на одном сервере, и это достаточно важно для бизнеса, тогда вы масштабируете его на столько систем, сколько необходимо. Вот почему облако очень привлекательно, и способность раскручивать узлы, чтобы взять на себя работу, и раскручивать их, когда закончите.
Если существует возможность получить запрос, который не может выполнить никакое количество вычислительной мощности, он не должен зависать там до бесконечности с бизнес-процессом, ожидающим ответа на то, что бизнес считает конечной проблемой.
print "Hello, World!"
... Вы можете быть немного более ясным?