Ich arbeite für eine Softwareproduktfirma. Wir haben große Unternehmenskunden, die unser Produkt implementieren und die wir unterstützen. Wenn zum Beispiel ein Fehler vorliegt, stellen wir Patches usw. zur Verfügung. Mit anderen Worten, es handelt sich um eine recht typische Konfiguration.
Kürzlich wurde mir ein Ticket ausgestellt und zugewiesen, das sich auf eine von einem Kunden in einer Protokolldatei festgestellte Ausnahme bezieht, die mit dem gleichzeitigen Datenbankzugriff in einer Clusterimplementierung unseres Produkts zu tun hat. Die spezifische Konfiguration dieses Kunden kann daher für das Auftreten dieses Fehlers von entscheidender Bedeutung sein. Alles, was wir vom Kunden bekamen, war die Protokolldatei.
Der Ansatz, den ich meinem Team vorgeschlagen hatte, bestand darin, zu versuchen, den Fehler in einer Konfiguration zu reproduzieren, die der des Kunden ähnelt, und ein vergleichbares Protokoll zu erhalten. Sie stimmen jedoch nicht mit meinem Ansatz überein, dass ich den Fehler nicht reproduzieren muss, da er zu zeitaufwändig ist und die Simulation eines Serverclusters auf VMs erforderlich macht. Mein Team schlägt vor, einfach "dem Code zu folgen", um festzustellen, wo sich der Thread- und / oder Transaktions-unsichere Code befindet, und die Änderung einer einfachen lokalen Entwicklung vorzunehmen, bei der es sich nicht um eine Cluster-Implementierung handelt, wie in der Umgebung, in der das Ereignis auftritt des Fehlers entsteht.
Für mich scheint es schwierig zu sein, einen abstrakten Entwurf (Programmcode) anstelle einer sichtbaren Manifestation (Laufzeitreproduktion) zu verwenden. Deshalb wollte ich eine allgemeine Frage stellen:
Ist es sinnvoll, darauf zu bestehen, dass jeder Fehler reproduziert und behoben wird, bevor er diagnostiziert und behoben wird?
Oder:
Wenn ich ein erfahrener Entwickler bin, sollte ich in der Lage sein, Multithread-Code zu lesen und ein mentales Bild davon zu erstellen, was er in allen Anwendungsszenarien tut, anstatt die Anwendung auszuführen, verschiedene Anwendungsszenarien zu testen und die Schritte durchzuarbeiten Code Zeile für Zeile? Oder bin ich ein schlechter Entwickler, weil ich so ein Arbeitsumfeld fordere?
Debuggen für Weichlinge?
Meiner Meinung nach sollte jeder Fix, der als Antwort auf ein Incident-Ticket eingereicht wird, in einer Umgebung getestet werden, die simuliert wurde, um der ursprünglichen Umgebung so nahe wie möglich zu sein. Woher können Sie sonst wissen, dass das Problem wirklich behoben wird? Es ist, als würde man ein neues Fahrzeugmodell veröffentlichen, ohne es mit einem Dummy einem Crashtest zu unterziehen, um zu demonstrieren, dass die Airbags tatsächlich funktionieren.
Zu guter Letzt, wenn Sie mir zustimmen:
Wie soll ich mit meinem Team sprechen, um sie davon zu überzeugen, dass mein Ansatz vernünftig, konservativ und kugelsicherer ist?
new
. Und es ist nicht garantiert, dass diese Fehler zuverlässig reproduzierbar sind, gemäß der Java Memory Model-Spezifikation