Stimmen Sie nicht zu, etwas zu entwickeln, das Sie nicht verstehen.

Stimmen Sie nicht zu, etwas zu entwickeln, das Sie nicht verstehen.

Seit Anfang 2018 bin ich als Teamleiter / Chefentwickler / leitender Entwickler tĂ€tig – nennen Sie es, wie Sie möchten, aber der Kern der Sache ist, dass ich die volle Verantwortung fĂŒr eines der Module und alle Entwickler, die daran arbeiten, trage. Diese Position eröffnet mir eine neue Perspektive auf den Entwicklungsprozess, da ich an einer grĂ¶ĂŸeren Anzahl von Projekten beteiligt bin und aktiver an Entscheidungen teilnehme. KĂŒrzlich habe ich, dank dieser beiden UmstĂ€nde, unerwartet erkannt, wie stark das Maß an VerstĂ€ndnis den Code und die Anwendung beeinflusst.

Der Gedanke, den ich ausdrĂŒcken möchte, ist, dass die QualitĂ€t des Codes (und des Endprodukts) eng damit verbunden ist, wie gut die Menschen, die das Design ĂŒbernehmen und den Code schreiben, sich bewusst sind, was sie tatsĂ€chlich tun.

Vielleicht denken Sie jetzt: "Danke, KapitĂ€n. NatĂŒrlich wĂ€re es gut zu verstehen, was man da eigentlich schreibt. Sonst könnte man genauso gut eine Gruppe Affen engagieren, die zufĂ€llig auf die Tasten haut, und sich damit zufrieden geben." Und Sie haben vollkommen recht. Daher gehe ich davon aus, dass Sie sich dessen bewusst sind, dass es unerlĂ€sslich ist, eine grundlegende Vorstellung davon zu haben, was man tut. Dies könnte man als BasisverstĂ€ndnis bezeichnen, und wir werden es nicht im Detail erörtern. Stattdessen werden wir uns damit beschĂ€ftigen, was genau verstanden werden muss und wie es sich auf die Entscheidungen auswirkt, die Sie tĂ€glich treffen. HĂ€tte ich diese Dinge im Voraus gewusst, hĂ€tte ich mir viel Zeit und fragwĂŒrdigen Code erspart.

Obwohl Sie hier unten keinen einzigen Code-Zeilen sehen werden, halte ich dennoch alles, was hier gesagt wird, fĂŒr sehr wichtig, um qualitativ hochwertigen, ausdrucksstarken Code zu schreiben.

Erste Stufe des VerstÀndnisses: Warum funktioniert es nicht?

Entwickler erreichen dieses Niveau oft sehr frĂŒh in ihrer Karriere, manchmal sogar ohne jegliche UnterstĂŒtzung von außen – zumindest ist das meine Beobachtung. Stellen Sie sich vor, Sie erhalten einen Bug-Report: Eine Funktion in der Anwendung funktioniert nicht, sie muss repariert werden. Wie wĂŒrden Sie vorgehen?

Das Standardverfahren sieht folgendermaßen aus:

  1. Finden Sie den Codeausschnitt, der das Problem verursacht (wie das geschieht, ist ein separates Thema, das ich in meinem Buch ĂŒber veralteten Code behandle)
  2. Änderungen in diesen Codeausschnitt vornehmen
  3. Sicherstellen, dass der Bug behoben ist und keine regressiven Fehler aufgetreten sind

Jetzt konzentrieren wir uns auf den zweiten Punkt – die Änderungen im Code vorzunehmen. Es gibt zwei AnsĂ€tze fĂŒr diesen Prozess. Der erste: Verstehen, was genau im aktuellen Code passiert, den Fehler identifizieren und beheben. Der zweite: Auf gut GlĂŒck vorgehen – zum Beispiel +1 in eine Bedingung oder Schleife einfĂŒgen, prĂŒfen, ob die Funktion im gewĂŒnschten Szenario nun funktioniert, dann noch etwas ausprobieren und so weiter bis in alle Ewigkeit.

Der erste Ansatz ist der richtige. Wie Steve McConnell in seinem Buch Code Complete erklĂ€rt (ĂŒbrigens kann ich es sehr empfehlen), sollten wir jedes Mal, wenn wir etwas im Code Ă€ndern, in der Lage sein, zuverlĂ€ssig vorherzusagen, wie sich dies auf die Anwendung auswirkt. Ich zitiere aus dem GedĂ€chtnis, aber wenn ein Bugfix nicht wie erwartet funktioniert, sollte Sie das ernsthaft alarmieren und Sie sollten Ihren gesamten Handlungsplan in Frage stellen.

Zusammenfassend lĂ€sst sich sagen, dass man, um einen soliden Bugfix durchzufĂŒhren, der die CodequalitĂ€t nicht verschlechtert, sowohl die gesamte Struktur des Codes als auch die Quelle des spezifischen Problems verstehen muss.

Die zweite Ebene des VerstÀndnisses: Warum funktioniert es?

Diese Ebene wird viel weniger intuitiv erfasst als die vorherige. Ich habe sie als noch unerfahrener Entwickler von meinem Chef gelernt und habe sie anschließend oft selbst Neulingen erklĂ€rt.

Stellen Sie sich vor, Sie erhalten gleichzeitig zwei Fehlerberichte: Der erste betrifft Szenario A, der zweite Szenario B. In beiden Szenarien lĂ€uft etwas schief. Daher kĂŒmmern Sie sich zuerst um den ersten Fehler. In Anlehnung an die Prinzipien, die wir fĂŒr das erste VerstĂ€ndnislevel aufgestellt haben, vertiefen Sie sich grĂŒndlich in den Code, der mit dem Problem zusammenhĂ€ngt, und klĂ€ren, warum er das Verhalten der Anwendung in Szenario A beeinflusst. Schließlich nehmen Sie sinnvolle Anpassungen vor, die genau das gewĂŒnschte Ergebnis liefern. Alles lĂ€uft bestens.

Dann wechseln Sie zum Szenario B. Sie wiederholen das Szenario, um den Fehler auszulösen, aber — Überraschung! — jetzt funktioniert alles wie geplant. Um Ihre Vermutung zu bestĂ€tigen, setzen Sie die Änderungen zurĂŒck, die Sie bei der Fehlerbearbeitung von A vorgenommen haben, und Fehler B tritt wieder auf. Ihr Bugfix hat beide Probleme gelöst. Wie praktisch!

Darauf haben Sie noch nie gerechnet. Sie haben einen Weg gefunden, um den Fehler im Szenario A zu beheben, und haben keine Ahnung, warum das auch im Szenario B funktioniert hat. An diesem Punkt liegt die Versuchung nahe zu denken, dass beide Probleme erfolgreich gelöst sind. Das erscheint logisch, denn das Ziel war schließlich, die Fehler zu beheben, oder? Aber die Arbeit ist noch nicht abgeschlossen: Sie mĂŒssen noch herausfinden, warum Ihre Maßnahmen den Fehler im Szenario B behoben haben. Warum? Weil es sein könnte, dass es auf falschen Prinzipien basiert, und dann mĂŒssen Sie nach einer anderen Lösung suchen. Hier sind einige Beispiele dafĂŒr:

  • Da die Lösung nicht gezielt fĂŒr den Fehler B unter BerĂŒcksichtigung aller Faktoren entwickelt wurde, haben Sie möglicherweise unbewusst die Funktion C beschĂ€digt.
  • Es besteht die Möglichkeit, dass sich irgendwo noch ein dritter Fehler versteckt, der mit derselben Funktion zusammenhĂ€ngt, und Ihr Bugfix hĂ€ngt die korrekte Funktion des Systems im Szenario B daran. Momentan sieht alles gut aus, aber eines Tages wird dieser dritte Fehler entdeckt und behoben. Dann tritt im Szenario B wieder ein Fehler auf, und gut, wenn es nur dort ist.

All das bringt Chaos in den Code, und irgendwann wird es Ihnen wahrscheinlich auf den Kopf fallen – wahrscheinlich genau im ungĂŒnstigsten Moment. Sie mĂŒssen Ihren Willen zusammennehmen, um sich die Zeit zu nehmen, zu verstehen, warum alles auf den ersten Blick funktioniert, aber es lohnt sich.

Dritte Ebene des VerstÀndnisses: Warum funktioniert es?

Mein jĂŒngstes Aha-Erlebnis hĂ€ngt genau mit dieser Ebene zusammen, und vermutlich hĂ€tte mir dieser Gedanke die grĂ¶ĂŸten Vorteile verschafft, wenn ich frĂŒher darauf gekommen wĂ€re.

Um es klarer zu machen, betrachten wir ein Beispiel: Ihr Modul muss mit Funktion X kompatibel sein. Sie sind nicht besonders gut mit Funktion X vertraut, aber man hat Ihnen gesagt, dass Sie fĂŒr die KompatibilitĂ€t das Framework F verwenden mĂŒssen. Andere Module, die mit X integriert werden, funktionieren genau damit.

Ihr Code hat von Anfang an ĂŒberhaupt nicht mit dem Framework F zusammengearbeitet, daher wird dessen Implementierung alles andere als einfach sein. Das wird ernsthafte Folgen fĂŒr einige Teile des Moduls haben. Dennoch stĂŒrzen Sie sich voller Elan in die Entwicklung: Wochenlang schreiben Sie Code, testen, bringen Testversionen heraus, erhalten Feedback, beheben Regressionen, entdecken unvorhergesehene Komplikationen, ĂŒberschreiten die ursprĂŒnglich festgelegten Fristen, schreiben noch mehr Code, testen erneut, erhalten RĂŒckmeldungen, korrigieren Regressionen – all das, um das Framework F zu implementieren.

Und irgendwann wird Ihnen plötzlich klar – oder vielleicht hören Sie es von jemandem –, dass das Framework F Ihnen möglicherweise keine KompatibilitĂ€t mit Funktion X bieten wird. Vielleicht waren all diese Zeit und MĂŒhe vollkommen umsonst.

Ähnliches ist mir einmal wĂ€hrend eines Projekts passiert, fĂŒr das ich verantwortlich war. Warum ist das passiert? Weil ich nicht gut verstanden habe, worum es bei Funktion X geht und wie sie mit dem Framework F zusammenhĂ€ngt. Was hĂ€tte ich tun sollen? Ich hĂ€tte die Person, die die Entwicklungsaufgabe stellt, bitten sollen, mir klar zu erklĂ€ren, wie der geplante Ablauf zu dem gewĂŒnschten Ergebnis fĂŒhrt, anstatt einfach das zu wiederholen, was fĂŒr andere Module gemacht wurde, oder blind zu glauben, dass das fĂŒr die Funktion X nötig ist.

Die Erfahrung dieses Projekts hat mich gelehrt, den Entwicklungsprozess abzulehnen, solange wir kein klares VerstĂ€ndnis dafĂŒr haben, warum uns bestimmte Aufgaben ĂŒbertragen werden. Klar und direkt ablehnen. Wenn man eine Aufgabe erhĂ€lt, ist der erste Impuls, sofort damit zu beginnen, um keine Zeit zu verlieren. Aber die Politik „Projekt anhalten, bis wir alle Details verstehen“ kann die verschwendete Zeit erheblich reduzieren.

Lassen Sie sich nicht unter Druck setzen, um zu beginnen, bevor Sie verstehen, warum das geschieht — widerstehen Sie dem. Zuerst sollten Sie klĂ€ren, welche Ziele mit dieser Aufgabe verfolgt werden, und entscheiden, ob dieser Weg zu den Zielen fĂŒhrt. Ich habe das alles auf die harte Tour gelernt — ich hoffe, mein Beispiel erleichtert das Leben denen, die das hier lesen.

Vierte Ebene des VerstÀndnisses: ???

In der Programmierung gibt es immer etwas zu lernen, und ich glaube, ich habe nur die OberflĂ€che des Themas VerstĂ€ndnis berĂŒhrt. Welche weiteren Ebenen des VerstĂ€ndnisses haben Sie im Laufe Ihrer Jahre mit Code entdeckt? Welche Entscheidungen haben Ihre Code- und AnwendungsqualitĂ€t positiv beeinflusst? Welche Entscheidungen waren falsch und haben Ihnen eine wertvolle Lektion erteilt? Teilen Sie Ihre Erfahrungen in den Kommentaren.

Quelle: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster