
Seit Anfang 2018 bin ich Teamleiter/Projektleiter/FĂŒhrender Entwickler in meinem Team â nenn es, wie du willst, aber im Grunde bin ich vollstĂ€ndig fĂŒr eines der Module und alle Entwickler, die daran arbeiten, verantwortlich. 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 Entscheidungsprozessen teilnehme. KĂŒrzlich wurde mir dank dieser beiden UmstĂ€nde bewusst, wie stark das MaĂ an VerstĂ€ndnis den Code und die Anwendung beeinflusst.
Der Gedanke, den ich ausdrĂŒcken möchte, lĂ€sst sich so zusammenfassen, dass die QualitĂ€t des Codes (und des Endprodukts) eng mit dem Zusammenhang steht, wie sehr die Menschen, die mit dem Entwerfen und Schreiben von Code beschĂ€ftigt sind, sich bewusst sind, was genau sie tun.
Vielleicht denken Sie jetzt: âDanke, KapitĂ€n. NatĂŒrlich wĂ€re es gut zu verstehen, was man ĂŒberhaupt schreibt. Andernfalls könnte man genauso gut eine Gruppe von Affen engagieren, die wahllos auf die Tasten hauen.â Und Sie haben vollkommen recht. Daher gehe ich davon aus: Sie sind sich bewusst, dass es notwendig ist, ein allgemeines VerstĂ€ndnis dafĂŒr zu haben, was man tut. Dies kann als nullter Grad des VerstĂ€ndnisses bezeichnet werden, und darĂŒber werden wir nicht im Detail sprechen. Wir werden im Detail untersuchen, was genau verstanden werden muss und wie sich das auf die Entscheidungen auswirkt, die Sie jeden Tag treffen. HĂ€tte ich diese Dinge im Voraus gekannt, hĂ€tte ich mir eine Menge wertvoller Zeit und fragwĂŒrdigen Codes gespart.
Obwohl Sie im Folgenden keinen einzigen Codezeile sehen werden, bin ich dennoch der Meinung, dass alles, was hier gesagt wurde, von groĂer Bedeutung fĂŒr das Schreiben von qualitativ hochwertigem, ausdrucksstarkem Code ist.
Erste Stufe des VerstÀndnisses: Warum funktioniert es nicht?
In der Regel erreichen Entwickler diese Stufe in den frĂŒhesten Phasen ihrer Karriere, manchmal sogar ohne jegliche UnterstĂŒtzung von auĂen â zumindest sind das meine Beobachtungen. Stellen Sie sich vor, Sie haben einen Bug-Report erhalten: Eine bestimmte Funktion in der Anwendung funktioniert nicht, sie muss repariert werden. Wie gehen Sie vor?
Das Standardverfahren sieht folgendermaĂen aus:
- Den Codeabschnitt finden, der das Problem verursacht (wie das gemacht wird, ist ein eigenes Thema, das ich in meinem Buch ĂŒber veralteten Code behandle)
- Ănderungen an diesem Abschnitt vornehmen
- Sich vergewissern, dass der Bug behoben ist und keine regressiven Fehler aufgetreten sind
Lass uns nun auf den zweiten Punkt konzentrieren â Ănderungen im Code vorzunehmen. Es gibt zwei AnsĂ€tze fĂŒr diesen Prozess. Der erste: Verstehen, was im aktuellen Code genau passiert, den Fehler identifizieren und ihn beheben. Der zweite: Auf gut GlĂŒck vorgehen â zum Beispiel +1 in eine Bedingung oder Schleife einfĂŒgen, sehen, ob die Funktion im vorgesehenen Szenario funktioniert, dann etwas anderes versuchen 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), mĂŒssen wir jedes Mal, wenn wir etwas im Code Ă€ndern, in der Lage sein, mit Zuversicht vorherzusagen, wie sich das auf die Anwendung auswirkt. Ich zitiere aus dem GedĂ€chtnis, aber wenn ein Bugfix nicht so funktioniert, wie Sie es erwartet haben, sollte Sie dies sehr beunruhigen. 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 beeintrĂ€chtigt, sowohl die gesamte Code-Struktur als auch die Quelle des spezifischen Problems verstehen muss.
Zweite VerstÀndnisstufe: Warum funktioniert es?
Diese Stufe wird viel weniger intuitiv erfasst als die vorherige. Ich, als noch unerfahrener Entwickler, habe sie durch meinen Chef gelernt und habe sie spÀter mehrfach selbst Neulingen erklÀrt.
Stellen wir uns diesmal vor, Sie erhalten gleichzeitig zwei Bugberichte: Im ersten geht es um das Szenario A, im zweiten um das Szenario B. In beiden Szenarien lĂ€uft etwas schief. Dementsprechend kĂŒmmern Sie sich zunĂ€chst um den ersten Bug. Nach den Prinzipien, die wir fĂŒr die erste VerstĂ€ndnisstufe abgeleitet haben, tauchen Sie tief in den Code ein, der mit dem Problem zu tun hat, finden heraus, warum er das Verhalten der Anwendung im Szenario A verursacht, und nehmen sinnvolle Anpassungen vor, die genau das Ergebnis liefern, das Sie erwartet haben. Alles lĂ€uft hervorragend.
Dann gehen Sie zum Szenario B ĂŒber. Sie wiederholen das Szenario, um den Fehler zu provozieren, aber â Ăberraschung! â jetzt funktioniert alles wie gewĂŒnscht. Um Ihre Vermutung zu bestĂ€tigen, setzen Sie die Ănderungen, die Sie beim Arbeiten an Fehler A gemacht haben, zurĂŒck, und der Bug B tritt erneut auf. Ihr Bugfix hat beide Probleme gelöst. GlĂŒck gehabt!
Sie hatten damit ĂŒberhaupt nicht gerechnet. Sie haben eine Möglichkeit gefunden, den Fehler im Szenario A zu beheben und haben keine Ahnung, warum dies auch fĂŒr Szenario B funktioniert hat. In dieser Phase ist die Versuchung groĂ zu glauben, dass beide Aufgaben erfolgreich gelöst wurden. Das ist durchaus logisch: Es ging schlieĂlich darum, Fehler zu beseitigen, 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? Denn möglicherweise basiert es auf falschen Prinzipien, und dann mĂŒssen Sie nach einem anderen Ausweg suchen. Hier sind ein paar Beispiele solcher FĂ€lle:
- Da die Lösung nicht gezielt fĂŒr den Fehler B unter BerĂŒcksichtigung aller Faktoren ausgearbeitet wurde, haben Sie möglicherweise unbeabsichtigt die Funktion C kaputt gemacht.
- Es ist nicht auszuschlieĂen, dass sich irgendwo auch ein dritter Fehler versteckt hat, der mit derselben Funktion zusammenhĂ€ngt, und Ihr Bugfix stellt die korrekte Funktionsweise des Systems im Szenario B darauf ab. Momentan sieht alles gut aus, aber eines Tages wird dieser dritte Fehler entdeckt und behoben. Dann wird im Szenario B wieder ein Fehler auftreten, und es ist gut, wenn es nur dort ist.
All das bringt Chaos in den Code, und eines Tages wird es Ihnen auf die FĂŒĂe fallen â wahrscheinlich genau zu dem ungĂŒnstigsten Zeitpunkt. Sie mĂŒssen Ihre Kraft zusammennehmen, um sich die Zeit zu nehmen, zu verstehen, warum alles auf den ersten Blick funktioniert, aber es lohnt sich.
Dritte VerstÀndnisstufe: Warum funktioniert es?
Meine kĂŒrzliche Erkenntnis steht genau mit dieser Stufe im Zusammenhang, und wahrscheinlich hĂ€tte sie mir die gröĂten Vorteile verschafft, wenn ich frĂŒher zu diesem Gedanken gekommen wĂ€re.
Um es klarer zu machen, lassen Sie uns ein Beispiel ansehen: Ihr Modul muss mit Funktion X kompatibel gemacht werden. 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 sich mit X integrieren, arbeiten genau damit.
Ihr Code hatte von Anfang an keinerlei BerĂŒhrungspunkte mit dem Framework F, daher wird es nicht ganz einfach sein, es zu implementieren. Dies wird ernsthafte Konsequenzen fĂŒr einige Komponenten des Moduls nach sich ziehen. Dennoch stĂŒrzen Sie sich voll in die Entwicklung: Sie schreiben wochenlang Code, testen, bringen Pilotversionen heraus, erhalten Feedback, korrigieren Regressionen, stoĂen auf unerwartete Komplikationen, halten die ursprĂŒnglich vereinbarten Fristen nicht ein, schreiben noch mehr Code, testen, erhalten RĂŒckmeldungen, korrigieren Regressionen â all dies nur, um das Framework F zu implementieren.
Und irgendwann wird Ihnen plötzlich bewusst â oder vielleicht hören Sie es von jemandem â dass das Framework F Ihnen möglicherweise keine KompatibilitĂ€t mit der Funktion X bieten wird. Vielleicht waren all diese Zeit und MĂŒhe völlig umsonst.
Ăhnliches ist einmal wĂ€hrend der Arbeit an einem Projekt passiert, fĂŒr das ich verantwortlich war. Wie konnte das passieren? Weil ich nicht gut verstand, worin die Funktion X besteht und wie sie mit dem Framework F verbunden ist. Was hĂ€tte ich tun sollen? Eine Person, die die Entwicklungsaufgabe vergibt, auffordern, verstĂ€ndlich zu erklĂ€ren, wie der vorgesehene Handlungsplan zu dem gewĂŒnschten Ergebnis fĂŒhrt, anstatt einfach das zu wiederholen, was fĂŒr andere Module gemacht wurde, oder blind zu glauben, dass es fĂŒr die Funktion X notwendig ist.
Die Erfahrung dieses Projekts hat mich gelehrt, den Entwicklungsprozess nicht zu beginnen, solange wir nicht klar verstehen, warum wir gebeten werden, bestimmte MaĂnahmen zu ergreifen. Direkt abzulehnen. Wenn man eine Aufgabe erhĂ€lt, ist der erste Impuls â sofort damit zu beginnen, um keine Zeit zu verlieren. Aber die Politik âwir stoppen das Projekt, bis wir in alle Einzelheiten eintauchenâ kann die vergeudete Zeit erheblich reduzieren.
Selbst wenn Druck auf Sie ausgeĂŒbt wird, um die Arbeit zu beginnen, wĂ€hrend Sie nicht verstehen, warum dies gerechtfertigt ist â widerstehen Sie. Zuerst sollten Sie klĂ€ren, mit welchem Ziel Ihnen diese Aufgabe gestellt wird, und entscheiden, ob dies der richtige Weg zum Ziel ist. Ich musste all dies auf die harte Tour lernen â ich hoffe, dass mein Beispiel denen, die dies lesen, das Leben erleichtert.
Vierte Ebene des VerstÀndnisses: ???
In der Programmierung gibt es immer etwas zu lernen, und ich glaube, ich habe nur die oberflÀchlichen Schichten des VerstÀndnisses angesprochen. Welche weiteren VerstÀndnistiefen haben Sie im Laufe der Jahre bei der Arbeit mit Code entdeckt? Welche Entscheidungen haben sich positiv auf die QualitÀt des Codes und der Anwendung ausgewirkt? Welche Entscheidungen erwiesen sich als fehlerhaft und haben Ihnen eine wertvolle Lektion erteilt? Teilen Sie Ihre Erfahrungen in den Kommentaren.
Quelle: habr.com
