Es scheint eine seltene, aber weit verbreitete Erfahrung zu sein, dass man manchmal an einem Projekt arbeitet und plötzlich etwas unerwartet auftaucht, einen riesigen Schraubenschlüssel in die Werke wirft und die Komplexität erheblich steigert.
Ich habe zum Beispiel an einer Anwendung gearbeitet, die mit SOAP-Diensten auf verschiedenen anderen Computern gesprochen hat. Ich entwarf einen Prototyp, der gut funktionierte, und entwickelte dann ein reguläres Frontend, um alles auf eine nette, recht einfache und leicht zu verfolgende Weise zum Laufen zu bringen. Es hat großartig funktioniert, bis wir angefangen haben, Tests in einem breiteren Netzwerk durchzuführen, und plötzlich begann das Zeitlimit für Seiten zu laufen, da die Latenz der Verbindungen und die für die Durchführung von Berechnungen auf Remote-Computern erforderliche Zeit zu Zeitlimit-Anforderungen an die Soap-Dienste führte. Es stellte sich heraus, dass wir die Architektur ändern mussten, um Anforderungen in ihre eigenen Threads auszulagern und die zurückgegebenen Daten zwischenzuspeichern, damit sie schrittweise im Hintergrund aktualisiert werden konnten, anstatt Berechnungen auf Anforderungsbasis durchzuführen.
Die Details dieses Szenarios sind nicht allzu wichtig - in der Tat ist es kein gutes Beispiel, da es durchaus vorhersehbar war und Leute, die viele Apps dieses Typs für diese Art von Umgebung geschrieben haben, es möglicherweise vorweggenommen haben - mit der Ausnahme, dass dies einen Weg darstellt man kann mit einer einfachen Prämisse und einem einfachen Modell beginnen und plötzlich eine Eskalation der Komplexität bis in die Entwicklung des Projekts hinein erleben.
Welche Strategien haben Sie, um mit solchen funktionalen Änderungen umzugehen, deren Bedarf sich - oft aufgrund von Umweltfaktoren und nicht aufgrund von Spezifikationsänderungen - später im Entwicklungsprozess oder aufgrund von Tests ergibt? Wie lassen sich die vorzeitigen Optimierungs- / YAGNI- / Overerengineering-Risiken vermeiden, wenn eine Lösung entwickelt wird, die mögliche, aber nicht unbedingt wahrscheinliche Probleme abschwächt , anstatt eine einfachere und einfachere Lösung zu entwickeln, die wahrscheinlich genauso effektiv ist, aber keine Bereitschaft für diese beinhaltet? jede mögliche Möglichkeit?
Bearbeiten: Crazy Eddies Antwort beinhaltet "Sie saugen es auf und finden den kostengünstigsten Weg, um die neue Komplexität zu implementieren." Das ließ mich an etwas denken, das in der Frage enthalten war, das ich aber nicht speziell angesprochen habe.
Sobald Sie diese Beule getroffen haben, übernehmen Sie die notwendigen Änderungen. Tun Sie das, was das Projekt so nah wie möglich am Zeitplan hält, aber die Wartbarkeit beeinträchtigt, oder kehren Sie zu Ihrer Architektur zurück und überarbeiten es auf einer detaillierteren Ebene, die möglicherweise wartbarer ist, aber alles während der Entwicklung zurückdrängt?