Es gibt einen neuen Entwickler in unserem Team. In unserem Unternehmen wird eine agile Methodik angewendet. Der Entwickler hat jedoch eine andere Erfahrung: Er ist der Ansicht, dass bestimmte Teile des Codes bestimmten Entwicklern zugewiesen werden müssen. Wenn also ein Entwickler eine Programmprozedur oder ein Modul erstellt hätte, würde es als normal angesehen, dass alle Änderungen an der Prozedur / dem Modul nur von ihm vorgenommen würden.
Positiv zu vermerken ist, dass wir mit dem vorgeschlagenen Ansatz gemeinsame Entwicklungszeit sparen, da jeder Entwickler seinen Teil des Codes gut kennt und Korrekturen schnell vornimmt. Der Nachteil ist, dass Entwickler das System nicht vollständig kennen.
Glauben Sie, dass der Ansatz für ein mittelgroßes System gut funktioniert (Entwicklung einer Site für soziale Netzwerke)?
quelle
Antworten:
Wie so viele dieser Fragen, denke ich, lautet die Antwort:
Es hängt davon ab, ob
Es gibt Grund zu der Annahme, dass es falsch ist, die Position einzunehmen, dass jeder Programmierer jede Codezeile kennen sollte.
Wenn wir für einen Moment davon ausgehen, dass jemand mit einem tiefen Verständnis eines Codeteils Änderungen fünfmal schneller vornimmt als jemand, der dies überhaupt nicht weiß (nach meiner Erfahrung kein riesiger Vertrauenssprung), und das dauert ungefähr einen Monat Um ein wirklich gutes Verständnis für ein Modul von beträchtlicher Größe zu erhalten (auch nicht unangemessen), können wir einige (völlig falsche und fiktive) Zahlen ausführen:
Nehmen wir an, Programmierer A erledigt 1 Arbeitseinheit pro Tag. In 4 Wochen an 5 Arbeitstagen kann er / sie 20 Arbeitseinheiten erledigen.
Programmierer B, der mit 0,2 Arbeitseinheiten pro Tag beginnt und mit 0,96 Arbeitseinheiten an seinem / ihrem 20. Tag endet (am 21. Tag sind sie so gut wie Programmierer A), wird 11,6 Arbeitseinheiten in demselben erledigen Zeitraum von 20 Tagen. In diesem Monat erzielte Programmierer B einen Wirkungsgrad von 58% im Vergleich zu Programmierer A. Jetzt haben Sie jedoch einen anderen Programmierer, der dieses Modul sowie das erste Modul kennt.
Natürlich könnten Sie in einem Projekt mit angemessener Größe ... 50 Module haben? Das bedeutet, dass der lernende Programmierer im Durchschnitt mit einer Effizienz von 58% im Vergleich zu Programmierer A ... hmmm arbeitet.
Stellen Sie sich also folgendes Szenario vor: Dieselben Programmierer, dasselbe Projekt (A weiß alles und B weiß nichts davon.) Nehmen wir an, das Jahr hat 250 Arbeitstage. Nehmen wir an, dass die Arbeitslast zufällig auf die 50 Module verteilt wird. Wenn wir beide Programmierer gleichmäßig aufteilen, erhalten A und B jeweils 5 Arbeitstage für jedes Modul. A kann 5 Arbeitseinheiten für jedes Modul ausführen, aber B erhält meiner kleinen Excel-Simulation zufolge nur 1,4 Arbeitseinheiten für jedes Modul. Insgesamt (A + B) sind 6,4 Arbeitseinheiten pro Modul. Das liegt daran, dass B die meiste Zeit ohne Vorkenntnisse mit dem Modul verbringt, an dem sie arbeiten.
In dieser Situation ist es optimaler, B auf eine kleinere Teilmenge von Modulen zu konzentrieren. Wenn sich B auf nur 25 Module konzentriert, erhalten sie jeweils 10 Tage mit insgesamt 3,8 Arbeitseinheiten. Programmierer A könnte dann jeweils 7 Tage mit den 25 Modulen verbringen, an denen B nicht arbeitet, und jeweils 3 Tage mit den gleichen Modulen wie B. Die Gesamtproduktivität liegt zwischen 6,8 und 7 Einheiten pro Modul, durchschnittlich 6,9, und das ist bedeutend höher als die 6,4 Einheiten pro Modul, die wir gemacht haben, als A und B die Arbeit gleichmäßig verteilten.
Wenn wir den Umfang der Module, an denen B arbeitet, einschränken, erhalten wir (bis zu einem gewissen Punkt) noch mehr Effizienz.
Ausbildung
Ich würde auch argumentieren, dass jemand, der nicht so viel über ein Modul weiß, die Person unterbricht, die viel mehr macht als jemand mit mehr Erfahrung. Die oben genannten Zahlen berücksichtigen nicht, dass A umso mehr Zeit benötigt, um Fragen zu stellen, je mehr Zeit B für den Code aufgewendet hat, den sie nicht verstehen. Manchmal muss A dabei helfen, die Probleme von B zu beheben oder zu beheben. Jemanden zu trainieren ist eine zeitaufwändige Tätigkeit.
Optimale Lösung
Aus diesem Grund denke ich, dass die optimale Lösung auf folgenden Fragen beruhen muss:
Deshalb denke ich "es kommt darauf an". Sie möchten nicht 20 Module genau in der Mitte auf zwei Programmierer aufteilen (jeweils 10), da Sie dann keine Flexibilität haben. Sie möchten jedoch nicht 10 Programmierer auf allen 50 Modulen überqueren, da Sie viel davon verlieren Effizienz und Sie brauchen nicht so viel Redundanz.
quelle
Das ist eine schreckliche Idee . Kurzfristig mag es schneller gehen, aber es fördert schlecht dokumentierten, schwer verständlichen Code, da nur der Codierer, der es geschrieben hat, für die Pflege verantwortlich ist. Wenn jemand das Unternehmen verlässt oder in den Urlaub fährt, ist der gesamte Plan durcheinander. Außerdem ist es sehr schwierig, Arbeitslasten zuzuweisen. Was passiert, wenn zwei dringende Fehler mit dem Code auftauchen, den ein Codierer "besitzt"?
Sie sollten als Team programmieren . Den Menschen werden natürlich Aufgaben zugewiesen, und sie konzentrieren sich auf bestimmte Bereiche. Die Aufteilung der Arbeitsbelastung und die Zusammenarbeit sollten jedoch gefördert und nicht entmutigt werden.
quelle
Es kommt darauf an, in welcher Domäne das Problem liegt.
Wenn es sich um allgemeine Dinge handelt (z. B. einfache CRUD-Aktionen usw.), stimme ich Tom Squires zu (jeder sollte in der Lage sein, daran zu arbeiten und es zu bearbeiten).
Wie auch immer ...
Wenn für die betreffende Lösung Fachwissen erforderlich ist (entweder wurde in der Vergangenheit viel Zeit investiert, oder es muss vor der Implementierung viel Forschung betrieben werden, da dies in einer Stellenanforderung als Fachwissen aufgeführt wird, das nicht jeder am Projekt hat), dann sollte ein Eigentümer auf jeden Fall diesem Teil des Codes zugewiesen werden. Trotzdem sollte jeder in der Lage sein, nach Bedarf Änderungen daran vorzunehmen, sie sollten jedoch immer von der Person überprüft werden, die den betreffenden Bereich des Projekts besitzt.
Sie möchten nicht, dass Ihr gesamtes Team (oder mehrere Personen im Team) dasselbe Thema erforscht und lernt (verschwendete Zyklen). Weisen Sie einen Eigentümer zu, lassen Sie ihn jedoch seine Erkenntnisse und Entwürfe dokumentieren, und lassen Sie ihn möglicherweise informelle (oder formelle, nicht wirklich wichtige) Schulungen zur Technologie durchführen.
quelle
Das ist eine schreckliche Idee . Ich habe in einer Firma gearbeitet, die diesen Ansatz verwendet hat und es ist so ziemlich ein Rezept für jede Menge technischer Schulden . Unter dem Strich sind zwei Köpfe fast immer besser als einer. Warum? Denn wenn Sie kein Idiot sind, wissen Sie, dass Sie kein perfekter Programmierer sind und Sie werden nicht jeden Fehler bemerken, den Sie machen. Deshalb brauchen Sie ein Team - mehr Augen, die denselben Code aus verschiedenen Perspektiven betrachten.
Es läuft auf eines hinaus: Disziplin . Wie viele Einzelprogrammierer kennen Sie, die in ihrem Codierungsstil wirklich diszipliniert sind? Wenn Sie nicht diszipliniert programmieren, verwenden Sie Verknüpfungen (da Sie diese später korrigieren), und die Wartbarkeit des Codes leidet. Wir alle wissen, dass "später" niemals kommt. Fakt ist : Es ist schwieriger, Verknüpfungen zu verwenden, wenn Sie Ihren Kollegen in einem Team gegenüber sofort rechenschaftspflichtig sind. Warum? Weil Ihre Entscheidungen in Frage gestellt werden und es immer schwieriger ist, Verknüpfungen zu rechtfertigen. Endresultat? Sie produzieren besseren, besser wartbaren Code, der auch robuster ist.
quelle
Der Vorteil ist, dass nicht jeder alles erforschen und verstehen muss. Der Nachteil ist, dass dies jede Person für ihren eigenen Code-Bereich benötigt und niemand sonst weiß, wie er zu pflegen ist.
Ein Kompromiss wäre, mindestens zwei Eigentümer für jeden Codebereich zu haben. Dann kann jemand in den Urlaub fahren, einen neuen Job annehmen oder in den Ruhestand gehen, und es gibt immer noch jemanden, der den Code kennt (und die neue zweite Person trainieren kann). Nicht jeder muss alles lernen, was ein bisschen effizienter ist.
Es müssen nicht immer die gleichen 2 (oder 3) Personen zusammenarbeiten. Vertauschen Sie Paare für verschiedene Bereiche, damit das Wissen auch versehentlich geteilt wird, wenn Sie mit einer anderen Person in einem verwandten Programmbereich arbeiten.
quelle
Ja, es ist kurzfristig etwas effizienter. Und hier endet der Nutzen. Das übersteigt nicht einmal die Kosten.
Was passiert, wenn er im Urlaub ist oder unerwartet krank ist oder geht oder vom sprichwörtlichen Bus angefahren wird? Was passiert, wenn Sie Ressourcen einsetzen möchten, um einen Job schneller als einen anderen zu erledigen? Wie effektiv können Code-Reviews sein? Wie kann ein Manager, insbesondere einer, der nicht in der Codebasis ist, wissen, ob der Entwickler hart arbeitet oder die Wolle über seine Augen zieht? Wer wird es bemerken, wenn die technischen Schulden anfangen zu laufen?
Nach meiner Erfahrung sind Leute, die gerne auf diese Weise arbeiten, bestenfalls Ruhmesjäger, im schlimmsten Fall Faulenzer. Sie möchten die einzige Person sein, mit der Sie bei einem bestimmten Problem Kontakt aufnehmen können, und sie möchten, dass ihr Code privat bleibt. Und sie schreiben oft schnell, ohne auf die Lesbarkeit zu achten.
Das heißt nicht, dass in einem Team von 50 Entwicklern jeder den gesamten Code kennen sollte, aber ein Team von 5-7 sollte ein Modul besitzen, das groß genug ist, um diese Leute am Arbeiten zu halten. Niemand sollte etwas besitzen.
quelle
Es gibt mindestens drei Punkte, auf die die anderen Antworten hinweisen. aber ich möchte versuchen, beide zusammen zu behandeln. Die beiden Probleme sind:
Wenn es sich nur um ein Fachthema handelt, hängt der Erfolg des Projekts möglicherweise von einem hohen Kenntnisstand über den Bereich ab. Dies hängt jedoch nicht vom Fachwissen eines bestimmten Experten in diesem Bereich ab. Die Experten sind zwar selten und wertvoll, aber im Wesentlichen austauschbar. Ein erfahrener Steuerberater ist für ein Steuerplanungs-Softwareprojekt vom Standpunkt seines Fachwissens aus genauso nützlich wie ein anderer. Es geht darum, wie gut die Expertin ihr Wissen auf das Projekt übertragen kann.
Wenn es sich nur um ein Führungsthema handelt, hängt der Erfolg des Projekts hauptsächlich von der Konsistenz und Einsicht der vom Projektleiter getroffenen Entscheidungen ab. Obwohl wir dazu neigen, Projektleiter zu bevorzugen, die Erfahrung auf diesem Gebiet haben oder als Projektleiter nachgewiesen sind, ist dies manchmal zweitrangig. Der "Anführer" könnte von Tag zu Tag wechseln, wenn die getroffenen Entscheidungen von Fall zu Fall konsistent sind und jede Entscheidung vom Team schnell ausgeführt wird. Wenn das richtig funktioniert; Viele Entscheidungen müssen nicht vom Projektleiter "getroffen" werden, da das Team bereits versteht, welche Entscheidungen getroffen werden.
Ich glaube nicht, dass es sich bei der Frage wirklich um egolosen Code handelte, aber es ist schwierig, über den Besitz von Code zu sprechen, ohne auch zu diskutieren, wie wichtig dieses Problem ist. Die Pflege eines Projekts ist wahrscheinlich der größte Teil des Entwicklungszyklus. Um dieses Problem zu verstehen, muss man sich fragen, was passieren würde, wenn einige Entwickler es sofort verlassen müssten. Was würde passieren, wenn das gesamte Team ersetzt werden müsste ? Wenn das Projekt in Zweifel gezogen wird, weil es von einigen Hauptakteuren abhängt, besteht ein hohes Ausfallrisiko. Selbst wenn Sie nie ein einzelnes Teammitglied verlieren, bedeutet die einfache Tatsache, dass ein oder mehrere Entwickler erforderlich sind, um das Projekt voranzutreiben, dass Sie möglicherweise nicht so effizient arbeiten, wie Sie es könnten, wenn mehr Entwickler eingeschätzt würden.
quelle
Code-Inhaberschaft kann Refactoring verhindern, Entwicklungsengpässe verursachen und Ego-Probleme verursachen, wenn Code Probleme aufweist, die behoben werden sollten.
Ich empfehle, sich vor einer Änderung mit den Code-Autoren zu beraten, auch wenn Code mit hohem Standard gut genug dokumentiert, Unit-getestet, Integration-getestet und System-getestet sein sollte, um diese Redundanz zu gewährleisten, kann es immer noch nicht schaden, eine andere Meinung einzuholen.
quelle
Das ist aus vielen Gründen schlimm. Ich habe in einem Geschäft gearbeitet, in dem versucht wurde, dies durch etwas Vernünftigeres zu ersetzen, und es war hässlich.
Die Gründe, warum dies schlecht ist:
Die größten sind wirklich die Personalfragen und die Dokumentation. Diese Person wird eines Tages gehen, und Junge, Sie werden den Zeitplan für ein paar Wochen nach links verschieben.
Der bessere Ansatz ist, dass jeder mit jedem Teil der Codebasis vertraut ist (oder mit einem halben Dutzend Teilen, wenn sie wirklich groß und vielfältig sind), bis sie es können
Jeder weiß ein bisschen mehr über einige Dinge als andere, sodass sich zwei oder drei für die schwierigen Probleme zusammenschließen können oder der Defacto-Experte es übernehmen kann. Ich habe in Gruppen gearbeitet, in denen dies der Fall war und es hat sehr gut geklappt. Es gab nicht nur keine der oben aufgeführten Nachteile, die Besetzung war auch vorhersehbarer, da wir nicht nach Experten suchten.
Der Vorteil der alleinigen Code-Inhaberschaft besteht darin, dass der "Code-Besitzer" die Dinge wahrscheinlich schneller erledigen kann als andere. Dies gilt jedoch nur, wenn jeder in nicht überlappenden Projekten ein "Code-Besitzer" ist. Mit anderen Worten, wenn sich die Leute um den Vorteil des "alleinigen Code-Besitzers" drehen, verschwindet dieser.
quelle
Siehe Truck Nummer aka Bus Factor
quelle
Wie bei vielen Dingen ist es ein großes "hängt". Wenn es ein striktes "niemand anderes kann an dem Code arbeiten" ist, ist es wahrscheinlich schlecht. Wenn es sich um "Der Eigentümer muss eine Codeüberprüfung durchführen, bevor er eine Änderung akzeptiert" handelt, ist dies zu gut, je nachdem, wie bereit der Eigentümer ist, externe Änderungen zu akzeptieren.
quelle
Der Nachteil ist schwerwiegend; Die "LKW-Nummer" Ihres Teams wird so ziemlich zu 1.
Zur Überprüfung wird die "LKW-Nummer" einfach definiert als "wie viele Mitglieder des Teams, im schlimmsten Fall, von einem LKW getroffen werden könnten, bevor das für die Ausführung einer kritischen Aufgabe erforderliche Wissen an das Team verloren geht."
Es ist eine Selbstverständlichkeit und ein wenig zu empfehlen, dass sich Entwickler auf Unterdisziplinen konzentrieren. Wenn jeder alles wissen müsste, was mit dem Projekt zu tun hat, würde nichts getan, weil jeder lernen würde, was alle anderen getan haben, warum es funktioniert und wie es geändert werden kann, ohne es zu zerstören. Darüber hinaus ist es weniger wahrscheinlich, dass Änderungen kollidieren, wenn Entwickler in verschiedenen Bereichen unterschiedliche Aufgaben ausführen. Daher ist es im Allgemeinen gut, zwei oder drei Entwickler oder Entwicklerpaare zu haben, die hauptsächlich in einem bestimmten Subsystem des Projekts arbeiten und es gut kennen.
Wenn jedoch nur eine Person eine bestimmte Codezeile berühren soll, wird diese Codezeile als Ursache für einen Fehler angezeigt, wenn dieser Typ kündigt, gefeuert wird, in den Urlaub geht oder im Krankenhaus landet das muss behoben werden, jemand anderes muss den Code verstehen. Wenn niemand anderes als derjenige, der es geschrieben hat, es jemals gesehen hat, wird es einige Zeit dauern, bis ein Verständnis erreicht ist, das es dem Entwickler ermöglicht, die Änderung vorzunehmen, die den Fehler behebt, ohne weitere Änderungen vorzunehmen. TDD kann helfen, aber nur, indem es dem Entwickler mitteilt, dass er die "falsche" Änderung vorgenommen hat. Auch hier muss der Entwickler verstehen, welche Tests welchen Code ausüben, um sicherzustellen, dass bei fehlgeschlagenen Tests nicht versucht wird, die falschen Aussagen zu treffen.
quelle
Ich nehme es nicht so extrem, aber ich bevorzuge die Verantwortung für den Code . Wenn Sie fehlerhaften Code schreiben, sollten Sie ihn beheben. Dies kann auf Einzel-, Paar- oder Teamebene erfolgen. Es verhindert, dass Sie Ihr Chaos an eine andere Person weitergeben, um aufzuräumen. Dies gilt auch für Änderungen.
Arbeitslast- und Planungsprobleme werden dies überschreiben. Es wäre dumm, die Behebung eines größeren Fehlers zu unterbrechen, da der Schuldige zwei Wochen Urlaub hat.
Das Ziel ist nicht, dass Ihre Mannschaft "das Spiel der Schuld" spielt oder die Anzahl der Fehler zu weit geht (sie sind sowieso nicht alle gleich). Beruhen Sie darauf, wer den Code zuletzt eingecheckt hat oder ob ein Vorgesetzter die Entscheidung trifft und ihn jemandem zuweist, anstatt jeden Teil jeder Codezeile durchzugehen.
Bessere Programmierer reparieren wahrscheinlich viel Code anderer Leute, egal wie Sie ihn zuweisen.
quelle