Ist Code-Besitz ein Code-Geruch?

27

Darüber habe ich nachgedacht, seit ich diese Antwort im umstrittenen Thread mit Programmiermeinungen gelesen habe :

Ihre Aufgabe ist es, sich von der Arbeit zu befreien.

Wenn Sie Software für Ihren Arbeitgeber schreiben, muss jede Software, die Sie erstellen, so geschrieben werden, dass sie von jedem Entwickler mit minimalem Aufwand erfasst und verstanden werden kann. Es ist gut gestaltet, klar und konsistent geschrieben, sauber formatiert, dokumentiert, wo es benötigt wird, wird täglich wie erwartet erstellt, in das Repository eingecheckt und entsprechend versioniert.

Wenn Sie von einem Bus angefahren , entlassen, entlassen oder aus dem Job entlassen werden, sollte Ihr Arbeitgeber in der Lage sein, Sie in kürzester Zeit zu ersetzen, und der nächste könnte in Ihre Rolle eintreten, Ihren Code abrufen und aufstehen Laufen innerhalb einer Woche Tops. Wenn er oder sie das nicht kann, haben Sie kläglich versagt.

Interessanterweise habe ich festgestellt, dass dieses Ziel mich für meine Arbeitgeber wertvoller gemacht hat. Je mehr ich mich bemühe, verfügbar zu sein, desto wertvoller werde ich für sie.

Und es wurde ein bisschen in anderen Fragen diskutiert, wie zum Beispiel in dieser , aber ich wollte es noch einmal ansprechen, um aus einem genaueren Blickwinkel zu diskutieren: " Es ist ein Codegeruch !! " - was nicht wirklich behandelt wurde noch in die Tiefe.

Ich bin seit zehn Jahren ein professioneller Entwickler. Ich hatte einen Job, bei dem der Code gut genug geschrieben war, um von jedem anständigen neuen Entwickler relativ schnell aufgegriffen zu werden, aber in den meisten Fällen in der Industrie scheint es, dass ein sehr hohes Maß an Eigenverantwortung (sowohl Einzelverantwortung als auch Teamverantwortung) das ist Norm. Den meisten Codebasen fehlen anscheinend die Dokumentation, der Prozess und die "Offenheit", die es einem neuen Entwickler ermöglichen würden, sie in die Hand zu nehmen und schnell mit ihnen zu arbeiten. Es scheint immer viele ungeschriebene kleine Tricks und Hacks zu geben, über die nur jemand Bescheid wissen würde, der die Codebasis sehr gut kennt ("besitzt").

Das offensichtliche Problem dabei ist natürlich: Was ist, wenn die Person aussteigt oder "von einem Bus angefahren wird"? Oder auf Teamebene: Was passiert, wenn das gesamte Team eine Lebensmittelvergiftung bekommt, wenn sie beim Team-Lunch ausgehen und alle sterben? Wären Sie in der Lage, das Team relativ schmerzlos durch einen neuen Satz zufälliger Entwickler zu ersetzen? - In einigen meiner früheren Jobs kann ich mir das überhaupt nicht vorstellen. Die Systeme waren so voll von Tricks und Hacks, dass man " nur wissen muss ", dass jedes neue Team, das man einstellt, viel länger braucht als der profitable Geschäftszyklus (z. B. neue stabile Releases), um die Dinge wieder in Gang zu bringen. Kurz gesagt, ich wäre nicht überrascht, wenn das Produkt aufgegeben werden müsste.

Offensichtlich wäre es sehr selten, ein ganzes Team auf einmal zu verlieren. Aber ich denke, dass dies alles subtiler und finsterer ist - und genau an diesem Punkt habe ich darüber nachgedacht, diesen Thread zu beginnen, da ich noch nie zuvor gesehen habe, wie er in diesen Begriffen diskutiert wurde. Grundsätzlich: Ich denke, ein hoher Bedarf an Code-Besitz ist sehr oft ein Indikator für die technische Verschuldung . Wenn es an Prozessen, Kommunikation, gutem Design, vielen kleinen Tricks und Hacks im System mangelt, die man "nur wissen muss" usw., bedeutet dies normalerweise, dass das System immer tiefer in die technische Verschuldung gerät.

Die Sache ist jedoch, dass Code-Besitz oft als eine Art "Loyalität" gegenüber einem Projekt und einem Unternehmen dargestellt wird, als eine positive Form der "Übernahme von Verantwortung" für Ihre Arbeit. Es ist daher unpopulär, dies endgültig zu verurteilen. Gleichzeitig führt die technische Verschuldungsseite der Gleichung häufig dazu, dass die Codebasis zunehmend weniger offen und schwieriger zu bearbeiten ist. Und vor allem, wenn die Leute weiterziehen und neue Entwickler ihren Platz einnehmen müssen, steigen die technischen Schulden (dh die Wartungskosten).

In gewisser Hinsicht denke ich, dass es für unseren Beruf eine gute Sache wäre, wenn ein hohes Maß an Code-Besitzbedürfnissen offen als Job-Geruch gesehen würde (in der Vorstellung der beliebten Programmierer). Anstatt als "Verantwortung und Stolz auf die Arbeit übernehmen" zu gelten, sollte es eher als "sich festigen und künstliche Arbeitsplatzsicherheit durch technische Schulden schaffen" verstanden werden.

Und ich denke, der Test (Gedankenexperiment) sollte im Grunde genommen lauten: Was wäre, wenn die Person (oder in der Tat das gesamte Team) morgen von der Erde verschwinden würde? Wäre dies eine gigantische - möglicherweise tödliche - Verletzung des Projekts, oder könnten wir neue Leute einbeziehen, sie dazu bringen, die Doccos und Hilfedateien zu lesen und ein paar Tage mit dem Code herumzuspielen - und dann wieder dabei sein Geschäft in ein paar Wochen (und zurück zur vollen Produktivität in einem Monat oder so)?

Bobby Tische
quelle
3
Was ist deine Frage? Was ist "Codegeruch"?
CamelBlues
2
@CamelBlues: " Code-Geruch ist ein Symptom im Quellcode eines Programms, das möglicherweise auf ein tieferes Problem hinweist." (Wikipedia) Durchsuchen Sie diese Suche nach einigen der vielen Fragen auf dieser Website zu Codegerüchen.
Carson63000
4
Ist Code-Besitz nicht ein Ergebnis von Code-Gerüchen, nicht ist Code-Besitz ein Code-Geruch? Ich denke, dies ist immer noch die gleiche Frage wie die anderen, einschließlich der folgenden: programmers.stackexchange.com/questions/48697/…
Rei Miyasaka
1
Für mich "Übernehmen von Verantwortung / Besitz"! = "Code-Besitz" hatte ich kürzlich ein Argument mit einem Manager, dass Code-Besitz etwas schlecht war und dass es nicht dasselbe war, als wenn man es Leuten erlaubte, die Verantwortung aufzugeben. Für diesen Manager bedeutete Code-Besitz dasselbe wie verantwortlich zu sein.
Thomas James
1
Ja, ich habe Code-Besitz nie als das verstanden, was dieser Q zu definieren scheint. Die Übernahme des Eigentums bedeutet, dass der Mann, der mich nach dem schrecklichen Bus ersetzt, meinen Code lesen kann, weil ich stolz darauf war, als wäre es mein eigenes persönliches Baby.
Erik Reppen

Antworten:

32

Ich denke, wir müssen einen Unterschied zwischen dem Besitz von Code machen:

  • aus der Sicht der Verantwortung,
  • aus der Sicht des Code-Stils / Hacks usw.

Der erste muss gefördert werden. Wenn niemand für minderwertige Codes und Fehler verantwortlich ist, werden schlimme Dinge passieren . Das bedeutet nicht, dass der Fehler, der sich auf Ihren eigenen Code bezieht, jedes Mal Ihnen zugewiesen werden muss: Wenn der Code korrekt geschrieben ist, kann jeder den Fehler in einem beliebigen Teil des Codes beheben. Aber wenn Sie kein Feedback zu den Fehlern haben, die Sie machen, werden Sie immer wieder dieselben Fehler produzieren .

Der Besitz von Code kann sowohl den Managern als auch den Entwicklern, insbesondere den Entwicklern, sehr helfen. Wenn ich weiß, dass 80% der Fehler im Produkt in meinem Code waren, während wir drei Entwickler an dem Projekt arbeiteten, und dass 75% dieser Fehler mit SQL Injection zusammenhängen, würde ich beim nächsten Mal vorsichtiger Code schreiben und Bemühen Sie sich besonders, Datenbankabfragen korrekt zu schreiben.


Die zweite (Code-Besitz von der Code-Stil / Hacks, etc.) ist meistens eine schlechte Sache. Was bringt es dem Produkt? Dies erhöht nicht die Qualität des Produkts, verringert jedoch die Einheitlichkeit des Quellcodes und erschwert dessen spätere Wartung .

Bei vielen großen Projekten arbeiten die Leute nicht ein Leben lang an demselben Code. Und hier spreche ich nicht einmal von schrecklichen Dingen wie dem von einem Bus angefahrenen Entwickler: Ich denke nicht, dass der Besitz von Code das erste Problem in diesem Fall ist. Aber es gibt viele kleine Überlegungen: Menschen wandern von der Entwicklung in das Management oder in andere Berufe ab, wählen andere Projekte oder arbeiten an anderen Dingen oder verwenden eine andere Sprache (wenn in einem Projekt mehrere Sprachen verwendet werden) usw.

Ein Teil des Codes eines Projekts kann auch in einem anderen Projekt wiederverwendet werden, und der Entwickler, der an diesem anderen Projekt arbeitet, möchte einige Teile des Codes an die neuen Anforderungen anpassen, ohne den früheren Verfasser des Codes um Rat zu fragen.

Ist es ein Codegeruch? Nun, es kommt darauf an, was Sie unter Codegeruch verstehen. Für mich dreht sich alles um die Gesamtkohärenz des Projekts und das richtige Management . In einem guten Projekt,

  • Richtlinien für den Codestil werden durchgesetzt, um das spätere Verständnis des Codes zu erleichtern.
  • Erfahrene Entwickler verstoßen nicht gegen das KISS-Prinzip und helfen so den weniger erfahrenen Kollegen, den Quellcode später besser zu verstehen.

Abschließend Code Besitz muss durch Versionskontrolle verfolgt werden, aber Sie müssen nicht in der Lage sein zu sagen , dass ein Stück Code wird von Ihnen geschrieben oder jemand anderes in einem Team .

Arseni Mourzenko
quelle
9

Zuerst müssen wir definieren, was "Code-Besitz" ist.


Wenn sich ein Teil des Codes in einem frühen Entwicklungsprozess befindet, ist es häufig erforderlich, eine oder zwei Personen als "Eigentümer" zu bestimmen, weil:

  • Am Anfang gibt es keine klaren Spezifikationen oder Anforderungen, und die Entwickler müssen Informationen selbst sammeln. Zwischen der Sammlung und der Dokumentation dieser Ergebnisse besteht eine zeitliche Lücke.
  • Vermeiden Sie Bearbeitungskonflikte, wenn der Code aktiv geändert wird.
  • Die "Eigentümer" sind die Personen, die über den Fortschritt der Entwicklung des Features berichten können.

Normalerweise gibt es einen einzelnen Eigentümer für jede Aufgabe. Doppelbesitzer sind mit Pair-Programmierung möglich. Es wäre nicht praktikabel, dies ohne einen eng bezeichneten "Code-Besitz" zu tun.

Hinweis: Weitere Probleme während der Entwicklung finden
Sie in der Antwort von @ MainMa . In diesen Fällen ist "Code-Ownership" ein Symptom für größere Probleme, dh eine suboptimale Auswahl der Architektur, inkonsistente Codierungsstile und im Allgemeinen mangelnde Codequalität.


Sobald ein Stück geschrieben und in die Codebasis aufgenommen wurde ("erledigt"), erscheint die allgemeinere Frage "Code-Besitz".

  • Wer ist der Experte, der alle Fragen zu diesem Code / diesem Teil der Funktionalität beantworten kann?
  • Wurde dieses Wissen in greifbaren Artefakten wie Anforderungsdokumenten, Komponententests, Abnahmetests, Änderungsprotokollen, Projekt-Wiki usw. festgehalten?

Es wird immer einen Teil des Domänenwissens geben (stillschweigendes Verständnis der Kundenanforderungen, Kompatibilitätsprobleme mit arkanen Systemen usw.), der sich nur schwer in schriftliche Spezifikationen umsetzen lässt. Daher muss bei einem Katastrophenereignis mit einem Verlust des Domänenwissens gerechnet werden.

Mit dem Verlust des Domänenwissens gehen auch die Experten verloren, die die Details des Systems erläutern können. In dieser Hinsicht ist der Verlust des Experten eine allgemein schlechte Sache. Das Wissen sollte früher erfasst worden sein.

Dies bedeutet nicht, dass die Existenz von "Experten" schlecht ist: Betrachten Sie Experten als einen "Cache" des geschriebenen Wissens. Experten können Fragen oft schneller beantworten, als das geschriebene Wissen nachschlagen und verdauen zu müssen.


Manchmal bezieht sich "Code-Besitz" jedoch auf Barrieren, die von den aktiven Entwicklern eines Projekts eingerichtet wurden, um zu verhindern, dass Außenstehende den Code ändern.

  • Wer kann Änderungen an diesem Code vornehmen?
    • Um offensichtliche Fehler zu beheben?
    • Damit der Code einige andere Anforderungen erfüllt?
    • Den Code komplett nach Belieben umschreiben?

Es gibt gute und schlechte Barrieren:

  • Gute Barrieren
    • Domänenwissen - wie gut verstehen Sie die Anforderungen und die Architektur / den Codierungsstil?
    • Programmier- und Designfähigkeiten - Verfügen Sie über die Fähigkeiten, um das Design und die Codequalität des Projekts zu verbessern?
  • Schlechte Barrieren
    • Sie waren nicht im ursprünglichen Entwicklerteam, daher dürfen Sie keine Änderungen vornehmen.
    • Nur Bugfixes sind willkommen. Funktionserweiterungen sind nicht erwünscht.

In diesem Fall sollte die Berechtigung zum Bearbeiten des Quellcodes eines anderen Projekts nicht auf der Eigentümerschaft des Codes beruhen, sondern auf der Leistung.


Schließlich verweist die Antwort von @Graham Lee auf die Fragmentierung von Wissen und Architektur, die durch die Aufteilung der Abteilungen verursacht wird.

In diesem Fall ist "Code Ownership" eines der Symptome der Abteilungsbildung. Ein zweites Symptom ist das "mangelnde Interesse an Projekten anderer Teams". Als Organisation müssen die Manager Maßnahmen ergreifen, um den Wissenstransfer und die Zusammenarbeit zwischen Teams und Abteilungen zu fördern.

rwong
quelle
7

Noch heimtückischer ist, dass einige Unternehmen (bei denen ich schon gearbeitet habe) ihre Verwaltungsstruktur nach Funktionsteams organisieren: Sie verwalten die Windows-Cliententwickler, sie verwalten das Installer-Team, er verwaltet die Back-End-Entwickler und so weiter. Dies führt nicht nur zu dem von Ihnen beschriebenen starken Code-Besitz, sondern verankert ihn auch in der Art und Weise, wie das Geschäft funktioniert. Es verwandelt die Software-Architektur in einen politischen Konflikt.

Ist das ein Problem? Es ist, wenn die Architektur suboptimal ist oder wird. Es ist zum Beispiel unmöglich zu sagen, dass der Installateur besser arbeiten oder billiger zu entwickeln wäre, wenn es nur ein Anwendungsfall des Kunden wäre, da dies die Kontrolle von einem Team und seinem Manager verliert. Die Unterteilungen zwischen Funktionsmodulen sind zu Tatsachen über die Art und Weise geworden, in der die Konstruktionsabteilung geführt wird, und es bedarf großer Umwälzungen, um diese Tatsachen zu ändern.

[Übrigens, falls die obige Diskussion es nicht klar macht, ist meine Antwort auf Ihre Frage ja. Code-Besitz ist ein Code-Geruch, weil er kluge Leute mit guten Ideen davon abhält, an dem Code zu arbeiten - oder sogar nur Leute, die verfügbar sind, wenn Sie sie brauchen. Natürlich ist es eine gute Sache, Kontrollen zu haben, um launische Änderungen zu stoppen. Wenn Sie jedoch einen Techniker haben, der einen Fehler beheben kann und die Zeit dazu hat, sollten Sie diesen Techniker nicht blockieren, nur weil jemand anderes den fehlerhaften Code geschrieben hat. ]


quelle
6

Wenn Sie Ihre Frage aus einem etwas anderen Blickwinkel angehen, ist der Besitz von Code KEIN Codegeruch. Es ist stattdessen ein Geruch nach Management und Ressourcen .

Überlegen Sie, was ein Codegeruch bedeutet. Es ist eine Metapher, die Ihnen sagt, wenn Sie sich Ihren Code ansehen, dass etwas mit dem Code und / oder dem Design der Software nicht stimmt, aber das Problem ist möglicherweise nicht so offensichtlich, dass Sie mit dem Finger darauf zeigen können, woran es liegt Das genaue Problem mag sein, aber Sie haben wahrscheinlich trotzdem eine gute Idee. Wenn bei Ihnen zu Hause etwas schlecht riecht, folgen Sie Ihrer Nase, bis Sie die Ursache des Problems gefunden haben, und unternehmen dann etwas dagegen. Wenn der Code ein Problem hat, untersuchen Sie es und ändern es, bis es kein Problem mehr gibt oder, wie manche sagen, schön oder gut ausgearbeitet ist .

Andererseits kann der Besitz von Code ein ernstes Problem sein. Dies weist auf einen Mangel an Kontrolle und das Risiko hin, dass das Wissen über den Code und die spezifischen Probleme, die er löst, dem Unternehmen nicht mehr zur Verfügung steht, wenn der Codebesitzer das Unternehmen verlässt. Dies hat nichts mit dem eigentlichen Code zu tun. Es kommt im Grunde genommen auf die gleiche Weise auf eine Risikomanagementsituation an, die dazu führt, dass wir Backups unserer Daten erstellen. Dies gilt auch für das Eigentum an Aufgaben oder Dokumenten in anderen Bereichen des Unternehmens.

Ich denke, dass es in Ordnung ist, andere Geschäftsprobleme als Gerüche zu bezeichnen , dies aber nicht zu implizieren, nur weil es einen Geruch gibt, der speziell mit Code zu tun hat.

S.Robins
quelle
1

Ich definiere Code Ownership als persönliche Verantwortung für den Code, den Sie schreiben, mit dem Verständnis, dass andere in Zukunft in Ihrem Code arbeiten werden . Wenn Sie die Dinge auf diese Weise betrachten, ist es weniger wahrscheinlich, dass Sie einen Hack schreiben, da a) Fehler in diesem Modul auf Sie zurückgeführt werden können und b) Teammitglieder es wahrscheinlich schwer haben, den Code in Zukunft zu ändern .

Ich schrieb vor einigen Monaten einen Blog-Beitrag darüber, in dem ich argumentierte, dass ohne Code-Besitz, wie ich ihn definiere, eine Codebasis oft der Tragödie der Commons zum Opfer fällt .

Nach Ihrer Definition von Code-Besitz stimme ich zu, dass es schlecht ist, Code zu haben, mit dem nur der Autor arbeiten kann.

jhewlett
quelle
Klingt eher nach "Code-Tending" oder "Code-Sitting (a la Baby-Sitting)". Ich bin mit Ihrer Antwort einverstanden.
Mawg