Meine Antwort wird aus der Perspektive des realen Geschäfts und der Herausforderungen sein, denen sich jedes Entwicklungsteam gegenübersieht. Was ich in dieser Frage und in vielen Antworten sehe, ist wirklich die Kontrolle von Fehlern.
Code kann fehlerfrei sein. Nehmen Sie eines der "Hello World" -Codebeispiele für eine beliebige Programmiersprache und führen Sie es auf der Plattform aus, die dafür vorgesehen ist, und es wird konsistent funktionieren und die gewünschten Ergebnisse liefern. Es endet jede Theorie über die Unmöglichkeit, dass Code fehlerfrei ist.
Die potenziellen Fehler treten auf, wenn die Logik komplexer wird. Das einfache Hello World-Beispiel hat keine Logik und führt jedes Mal dieselbe statische Operation aus. Sobald Sie logikgesteuertes dynamisches Verhalten hinzufügen, führt dies zu der Komplexität, die zu den Fehlern führt. Die Logik selbst kann fehlerhaft sein, oder die Daten, die in die Logik eingegeben werden, können auf eine Weise variieren, die die Logik nicht handhabt.
Eine moderne Anwendung hängt auch von Laufzeitbibliotheken, CLR-, Middleware-, Datenbank- usw. Schichten ab, die zwar insgesamt Entwicklungszeit sparen, aber auch Fehler in diesen Schichten enthalten können, die durch Entwicklungs- und UAT-Tests und in der Produktion unentdeckt bleiben.
Schließlich ist die Kette von Apps / Systemen, die die Anwendung mit Daten versorgt, die ihre Logik speisen, eine Quelle für potenzielle Fehler, entweder innerhalb ihrer Logik oder innerhalb der Software, auf denen die Logik aufbaut, oder in den vorgelagerten Systemen, auf denen sie Daten verbraucht.
Entwickler haben nicht 100% Kontrolle über jedes bewegliche Teil, was die Logik ihrer Anwendung unterstützt. Tatsächlich haben wir nicht viel unter Kontrolle. Aus diesem Grund sind Unit-Tests wichtig, und Konfigurations- und Änderungsmanagement sind wichtige Prozesse, die wir nicht ignorieren dürfen und die nicht träge sind.
Dokumentierte Vereinbarungen zwischen Ihrer Anwendung, in denen Daten aus einer Quelle verwendet werden, die sich Ihrer Kontrolle entziehen, in denen das spezifische Format und die Spezifikationen für die übertragenen Daten festgelegt sind, sowie alle Beschränkungen oder Einschränkungen, von denen Ihr System annimmt, dass das Quellsystem für die Sicherstellung der Ausgabe verantwortlich ist diese Grenzen.
In der realen Welt der Softwareentwicklung werden Sie nicht in der Lage sein, sie zum Fliegen zu bringen, indem Sie dem Unternehmen erklären, warum Anwendungen theoretisch nicht fehlerfrei sein können. Diskussionen dieser Art zwischen Technologie und Unternehmen werden nur nach einer technologischen Störung stattfinden, die die Fähigkeit des Unternehmens, Geld zu verdienen, Geld zu verlieren und / oder Menschen am Leben zu erhalten, beeinträchtigt. Die Antwort auf "Wie kann das passieren?" Lautet nicht "Lassen Sie mich diese Theorie erklären, damit Sie sie verstehen."
In Bezug auf massive Berechnungen, die theoretisch ewig dauern könnten, um die Berechnung durchzuführen und ein Ergebnis zu erhalten, ist eine Anwendung, die nicht beendet werden kann und mit einem Ergebnis zurückkehrt, ein Fehler. Wenn die Art der Berechnung sehr zeitaufwendig und rechenintensiv ist, nehmen Sie diese Anforderung an und geben dem Benutzer eine Rückmeldung, wie / wann er das Ergebnis abrufen kann, und starten Sie die parallelen Threads, um daran zu arbeiten. Wenn dies schneller erfolgen muss als auf einem Server und wenn das Geschäft wichtig genug ist, können Sie es auf so viele Systeme skalieren, wie erforderlich. Aus diesem Grund ist die Cloud sehr attraktiv und bietet die Möglichkeit, Knoten hochzufahren, um die Arbeit aufzunehmen und sie anschließend herunterzufahren.
Wenn die Möglichkeit besteht, eine Anforderung zu erhalten, die nicht vollständig ausgeführt werden kann, sollte sie nicht unbegrenzt mit einem Geschäftsprozess abhängen, der auf die Antwort auf das wartet, was das Unternehmen für ein endliches Problem hält.
print "Hello, World!"
... können Sie ein bisschen klarer sein?