Es gibt eine Reihe von Definitionen für das Wort Wissenschaft, aber es hört sich so an, als würden Sie sich möglicherweise auf das beziehen, was man genauer als " wissenschaftliche Methode " bezeichnen könnte. Die wissenschaftliche Methode kann zusammengefasst werden, indem einige Phänomene beobachtet werden (vermutlich ein Fehler oder ein unerwartetes Programmverhalten), eine Hypothese oder Hypothesen formuliert werden, um das Verhalten zu erklären, und am wahrscheinlichsten experimentiert wird, um es zu beweisen (Schreiben eines Tests, der das Problem zuverlässig reproduziert).
Die Arten von Fehlern (Phänomenen), die auftreten können, sind praktisch endlos und einige erfordern nicht unbedingt einen genau definierten Prozess. Zum Beispiel beobachten Sie manchmal einen Fehler und wissen sofort, was ihn verursacht hat, einfach weil Sie mit dem Code sehr vertraut sind. In anderen Fällen wissen Sie, dass bei bestimmten Eingaben (Aktionen, Abfolgen von Schritten usw.) ein falsches Ergebnis auftritt (Absturz, schlechte Ausgabe usw.). In diesen Fällen erfordert es oft nicht viel "wissenschaftliches" Denken. Einige Überlegungen können helfen, den Suchraum zu verkleinern. Eine übliche Methode besteht jedoch darin, den Code in einem Debugger schrittweise durchzugehen und festzustellen, wo Fehler aufgetreten sind.
Die für mich interessantesten und möglicherweise eines wissenschaftlichen Prozesses würdigen Situationen sind jedoch die, in denen Ihnen ein Endergebnis ausgehändigt und Sie gebeten werden, zu erklären, wie es passiert ist. Ein offensichtliches Beispiel hierfür ist ein Crash-Dump. Sie können den Crash-Dump laden und den Status des Systems beobachten. Ihre Aufgabe besteht darin, zu erklären, wie es in diesen Status gelangt ist. Der Absturz- (oder Kern-) Speicherauszug kann eine Ausnahme, einen Deadlock, einen internen Fehler oder einen vom Benutzer definierten "unerwünschten" Zustand (z. B. Trägheit) anzeigen. In diesen Situationen folge ich im Allgemeinen den folgenden Schritten:
Eingeschränkte Beobachtung : Studieninformationen, die sich direkt auf das spezifische Problem beziehen, falls zutreffend. Die offensichtlichen Dinge hier sind der Aufrufstapel, die lokalen Variablen, wenn Sie sie sehen können, die Codezeilen, die das Problem umgeben. Diese Art der spezifischen Standortstudie ist nicht immer anwendbar. Zum Beispiel hat das Studium eines "langsamen" Systems möglicherweise keinen offensichtlichen Startort wie diesen, aber eine Absturz- oder interne Fehlersituation wird wahrscheinlich einen unmittelbaren und offensichtlichen Punkt von Interesse haben. Ein konkreter Schritt könnte darin bestehen, Tools wie windbg zu verwenden (führen Sie! Analyse -v auf einem geladenen Crash-Dump aus und sehen Sie sich an, was es Ihnen sagt).
Breite Beobachtung : Studieren Sie andere Teile des Systems. Überprüfen Sie den Status aller Threads im System, und überprüfen Sie alle globalen Informationen (Anzahl der Benutzer / Vorgänge / Elemente, aktive Transaktionen / Prozesse / Widgets usw.), Systeminformationen (Betriebssystem) usw. Wenn der Benutzer externe Details angegeben hat Denken Sie über die Zusammenhänge nach, die Sie beobachtet haben. Wenn Ihnen beispielsweise mitgeteilt wird, dass das Problem jeden Dienstagnachmittag auftritt, fragen Sie sich, was dies bedeuten könnte.
Hypothese: Dies ist der wirklich lustige Teil (und ich bin nicht scherzhaft darüber, dass es Spaß macht). Es erfordert oft viel logisches Umdenken. Es kann sehr unterhaltsam sein, darüber nachzudenken, wie das System in den aktuellen Zustand gelangt ist. Ich vermute, dass dies der Teil ist, den viele Leute für eine Kunst halten. Und ich nehme an, es könnte sein, dass der Programmierer nur zufällig Dinge darauf wirft, um zu sehen, was steckt. Aber mit der Erfahrung kann dies ein ziemlich gut definierter Prozess sein. Wenn Sie an dieser Stelle sehr logisch denken, ist es oft möglich, mögliche Sätze von Pfaden zu definieren, die zu dem gegebenen Zustand führten. Ich weiß, dass wir uns im Zustand S5 befinden. Damit dies geschehen konnte, musste S4a oder S4b auftreten und möglicherweise S3 vor S4a usw. Oftmals kann es mehrere Elemente geben, die zu einem bestimmten Zustand führen könnten. Manchmal kann es hilfreich sein, ein einfaches Ablauf- oder Zustandsdiagramm oder eine Reihe von zeitbezogenen Schritten auf ein Notizbuch zu schreiben. Die tatsächlichen Abläufe variieren in Abhängigkeit von der jeweiligen Situation erheblich, aber ernsthafte Überlegungen (und eine erneute Prüfung in den vorherigen Schritten) zu diesem Zeitpunkt liefern häufig eine oder mehrere plausible Antworten. Beachten Sie auch, dass ein äußerst wichtiger Teil dieses Schritts darin besteht, Dinge zu beseitigen, die unmöglich sind. Das Entfernen des Unmöglichen kann dazu beitragen, den Lösungsraum zu verkleinern (denken Sie daran, was Sherlock Holmes über die Überreste gesagt hat, nachdem Sie das Unmögliche beseitigt haben). Beachten Sie auch, dass ein äußerst wichtiger Teil dieses Schritts darin besteht, Dinge zu beseitigen, die unmöglich sind. Das Entfernen des Unmöglichen kann dazu beitragen, den Lösungsraum zu verkleinern (denken Sie daran, was Sherlock Holmes über die Überreste gesagt hat, nachdem Sie das Unmögliche beseitigt haben). Beachten Sie auch, dass ein äußerst wichtiger Teil dieses Schritts darin besteht, Dinge zu beseitigen, die unmöglich sind. Das Entfernen des Unmöglichen kann dazu beitragen, den Lösungsraum zu verkleinern (denken Sie daran, was Sherlock Holmes über die Überreste gesagt hat, nachdem Sie das Unmögliche beseitigt haben).
Experiment : Versuchen Sie in dieser Phase, das Problem auf der Grundlage der im vorherigen Schritt abgeleiteten Hypothesen zu reproduzieren. Wenn Sie im vorherigen Schritt ernsthaft darüber nachgedacht haben, sollte dies sehr einfach sein. Manchmal "betrüge" ich und ändere die Codebasis, um einen gegebenen Test zu unterstützen. Ich habe zum Beispiel kürzlich einen Sturz untersucht, von dem ich schlussfolgerte, dass er von einem Rennzustand herrührt. Um dies zu verifizieren, setze ich einfach einen Sleep (500) zwischen ein paar Codezeilen, damit ein anderer Thread zur "richtigen" Zeit seine schlechten Sachen erledigen kann. Ich weiß nicht, ob dies in der "echten" Wissenschaft erlaubt ist, aber es ist in Code, den Sie besitzen, durchaus vernünftig.
Wenn es Ihnen gelingt, es zu reproduzieren, sind Sie wahrscheinlich fast fertig (alles, was noch übrig ist, ist der einfache Schritt, es zu reparieren ... aber das ist für einen anderen Tag). Stellen Sie sicher, dass der neue Test in das Regressionstestsystem eingegeben wird. Und ich sollte darauf hinweisen, dass ich diese frühere Aussage darüber beabsichtigt habe, wie man es einfach macht, humorvoll zu sein. Das Finden und Implementieren einer Lösung kann umfangreiche Arbeiten erfordern. Ich bin der Meinung, dass das Beheben eines Fehlers nicht Teil des Debugging-Prozesses ist, sondern vielmehr eine Weiterentwicklung. Und wenn das Update überhaupt beteiligt ist, sollte es einige Design- und Überprüfungsarbeiten erfordern.