Ma réponse sera du point de vue des affaires du monde réel et des défis auxquels chaque équipe de développement est confrontée. Ce que je vois dans cette question et dans beaucoup de réponses concerne vraiment le contrôle des défauts.
Le code peut être exempt de bogues. Prenez n'importe lequel des exemples de code "Hello World" pour n'importe quel langage de programmation, et exécutez-le sur la plate-forme à laquelle il est destiné et il fonctionnera de manière cohérente et produira les résultats souhaités. Là se termine toute théorie sur l'impossibilité d'un code sans bogue.
Les bogues potentiels apparaissent à mesure que la logique devient plus complexe. Le simple exemple Hello World n'a pas de logique et fait la même chose statique à chaque fois. Dès que vous ajoutez un comportement dynamique piloté par la logique, c'est ce qui introduit la complexité qui mène aux bogues. La logique elle-même peut être défectueuse, ou les données entrées dans la logique peuvent varier d'une manière que la logique ne gère pas.
Une application moderne dépend également des bibliothèques d'exécution, CLR, middleware, base de données, etc. qui, tout en économisant du temps de développement, sont également des couches où des bogues dans ces couches peuvent exister et ne sont pas détectés lors du développement et des tests UAT et en production.
Enfin, la chaîne d'applications / systèmes que l'application consomme des données qui alimentent sa logique sont toutes des sources de bugs potentiels soit dans leur logique, soit dans les piles logicielles que la logique chevauche, ou les systèmes en amont dont elle consomme les données.
Les développeurs ne contrôlent pas à 100% chaque pièce mobile prenant en charge la logique de leur application. En fait, nous ne contrôlons pas grand-chose. C'est pourquoi les tests unitaires sont importants, et la configuration et la gestion des changements sont des processus importants que nous ne devons pas ignorer ou être paresseux / bâclés.
En outre, des accords documentés entre votre application qui consomme des données provenant d'une source hors de votre contrôle, qui définit le format et les spécifications spécifiques pour les données transférées, ainsi que toute limite ou contrainte que votre système suppose que le système source est responsable de s'assurer que la sortie est à l'intérieur ces limites.
Dans l'application réelle du génie logiciel, vous ne pourrez pas le faire voler en expliquant à l'entreprise pourquoi les applications ne peuvent théoriquement pas être exemptes de bogues. Des discussions de cette nature entre la technologie et l'entreprise n'auront jamais lieu, sauf à la suite d'un dysfonctionnement technologique qui a affecté la capacité de l'entreprise à gagner de l'argent, à éviter de perdre de l'argent et / ou à maintenir les gens en vie. La réponse à "comment cela peut-il arriver" ne peut pas être "laissez-moi expliquer cette théorie pour que vous compreniez."
En termes de calculs massifs qui pourraient théoriquement prendre une éternité pour effectuer le calcul et obtenir un résultat, une application qui ne peut pas terminer et retourner avec un résultat - c'est un bug. Si la nature du calcul est telle qu'elle prend beaucoup de temps et demande beaucoup de calcul, vous prenez cette demande et fournissez des informations à l'utilisateur sur la façon / quand il peut récupérer le résultat, et lancez les threads parallèles pour y revenir. Si cela doit se produire plus rapidement que ce qui peut être fait sur un seul serveur et est suffisamment important pour l'entreprise, vous devez le faire évoluer sur autant de systèmes que nécessaire. C'est pourquoi le cloud est très attrayant, et la possibilité de faire tourner les nœuds pour prendre le travail et les faire tourner une fois terminé.
S'il existe la possibilité d'obtenir une demande qu'aucune quantité de puissance de calcul ne peut terminer, elle ne devrait pas traîner à l'infini avec un processus métier attendant la réponse à ce que l'entreprise pense être un problème fini.
print "Hello, World!"
... pouvez-vous être un peu plus clair?