Code-Besitz mit mehreren Scrum-Teams

10

Wenn zwei Scrum-Teams dieselbe Softwarekomponente verwenden, wer ist dann dafür verantwortlich, eine klare Architekturvision dieser Komponente bereitzustellen und diese Vision beizubehalten / zu entwickeln, während sich die Codebasis weiterentwickelt? In Scrum sollten Sie einen kollektiven Code besitzen. Wie können Sie also sicherstellen, dass die von Team A durchgeführte Entwicklung die von Team B durchgeführte Entwicklung nicht beeinträchtigt?

Eugene
quelle

Antworten:

10

Ich bin kein Scrum-Experte, aber AFAIK "kollektiver Code-Besitz" soll pro Team und pro Produkt sein (und ich denke, Ihre Frage ist nicht spezifisch für Scrum, sie kann auf jeden "Shared Code" -Entwicklungsprozess angewendet werden).

Wenn Sie zwei Teams A, B, zwei Produkte A, B und eine gemeinsam genutzte Komponente C haben, gibt es verschiedene mögliche Szenarien. Möglicherweise gehört die gemeinsam genutzte Komponente hauptsächlich zu Produkt A (und wird vom Team für Produkt B nur wiederverwendet, aber nicht weiterentwickelt). In dieser Situation ist Team A eindeutig für die architektonische Vision verantwortlich. Oder umgekehrt: Es gehört eindeutig zu Produkt B - also liegt die Verantwortung da. Wenn Team A verantwortlich ist, verwendet Team B möglicherweise eine Abzweigung der Komponente, um dringende Bugfixes zuzulassen (es sollte auch eine Möglichkeit geben, sie wieder in die Hauptzeile von C zu integrieren), aber B sollte vermeiden, die Komponente weiter zu entwickeln.

Wenn jedoch beide Produkte A und B viele "Fahranforderungen" für C haben, sollten Sie C als vollständig separates Produkt verwalten, mit eigener Versionierung, Release-Verwaltung, Änderungsmanagement, Komponententests usw. und einem separaten Team, das die Verantwortung für diese Komponente. Dieses Team könnte nur ein "virtuelles Team" sein, das aus separaten Entwicklern von Team A, B oder beiden besteht. Dieses Team hat den "Shared Code Ownership" für C und die Verantwortung für die "Architectural Vision". Stellen Sie sich C als eine Komponente vor, die von einem Drittanbieter geliefert wird.

Doc Brown
quelle
"Entweder gehört die gemeinsam genutzte Komponente zu Produkt A" oder ...?
Joe Z.
6

Es gibt kein Konzept für eine "klare architektonische Vision" in Scrum oder Agile!

Ich bin seit langem Architekt und es ist mir klar, dass man eine klare Sicht auf zukünftige Anforderungen haben muss, um eine architektonische Vision zu haben. Da die Anforderungen in den meisten Fällen überhaupt nicht klar sind, ist es nicht sinnvoll, eine feste Vision zu haben.

Notwendig ist eine Architektur, die an die sich ändernden Anforderungen anpassbar ist. Mit anderen Worten, Dinge ändern sich und die Architektur ändert sich - ich befürworte keine "weiche" Architektur, die neu konfiguriert werden kann. Ich spreche davon zu akzeptieren, dass die Architektur, die man heute hat, bald veraltet sein wird und geändert werden muss, also sollte niemand damit "heiraten".

Kollektiver Codebesitz bedeutet, dass theoretisch jeder in der Lage sein sollte, etwas zu ändern. Dies ist als "Gegenteil von Silos" zu verstehen. Mit anderen Worten, es kann eine Kompetenzbarriere geben, die normal und zu erwarten ist - nicht jeder ist ein erfahrener DBA, der SQL-Abfragen fein abstimmen kann, um ein Beispiel zu nennen -, aber daraus folgt nicht, dass nur ein DBA dies kann Hand optimieren Abfragen. Es wird einen "Feature-Domain-Experten" geben, der anderen Menschen helfen kann, kompetent zu werden, aber die Aufgaben sollten immer noch bei jedem liegen.

Beispiel: Wenn ich der Domain-Experte für Feature "A" bin, erwarte ich immer noch, dass jemand anderes an Feature "A" arbeitet, aber ich werde wahrscheinlich konsultiert, wenn größere Änderungen erforderlich sind oder Personen Hilfe benötigen. Feature "A" wäre sicherlich nicht mein Feature. Es wird eine Funktion sein, die ich gut kenne. Es wird mein Interesse sein, viele weitere Funktionen zu kennen, und das Interesse anderer Leute, diese Funktion zu kennen.

In der Synthese: Architektur wird von Entwicklern mehrmals entworfen und neu gestaltet, wenn sich die Anforderungen ergeben und ändern. Von jedem wird erwartet, dass er die erforderlichen Änderungen entsprechend seinen Fähigkeiten vornimmt und weiß, wann er um Hilfe bitten muss. Es gibt keine langfristige Vision von der Architektur , weil wir den Menschen vertrauen und wir vertrauen nicht den Anforderungen .

Sklivvz
quelle
Dies beantwortet meine Frage jedoch nicht direkt. Was tun mit Komponenten, die mehrere Teams verwenden? Wer stellt sicher, dass die aktuelle Architektur geeignet ist? Auch wenn die architektonische "Vision" für den nächsten Sprint oder zwei ist, muss es immer noch eine Vision geben. Sie möchten nicht, dass Entwickler aus verschiedenen Scrum-Teams die Komponente ändern, ohne die Auswirkungen der Änderung auf alle Teams und die Gesamtarchitektur zu verstehen.
Eugene
1
Es beantwortet Ihre Frage ... wenn ich "alle" sage, meine ich "teamübergreifend". Ich bin nicht der Meinung, dass das Ändern einer gemeinsam genutzten Komponente durch alle Personen zu einer Beeinträchtigung führen kann. Entwickler sollten sich des Risikos bewusst werden und darauf vertrauen, dass sie es richtig machen.
Sklivvz
Ich gehe daher davon aus, dass die Person, die eine gemeinsam genutzte Komponente ändern möchte, ein Meeting mit Entwicklern zusammenstellt, die mit dieser Komponente am besten vertraut sind, und gemeinsam das Design der Komponente an die neuen Anforderungen anpassen wird. Arbeiten Sie so in Ihrer Organisation?
Eugene
@Eugene das habe ich nicht gesagt: Jeder kann ohne Erlaubnis eines Komitees etwas ändern. Wir vertrauen darauf, dass die Leute um Hilfe bitten, wenn sie sie brauchen, und Dinge reparieren, wenn sie es vermasseln.
Sklivvz
Ich verstehe. Ich sage nicht, dass dies ein formeller und obligatorischer Prozess ist. Ich bin mir nur ziemlich sicher, dass in vielen Fällen die Person, die eine Änderung vornehmen möchte, ein Meeting planen möchte, um die möglichen Auswirkungen ihrer Änderungen zu verstehen.
Eugene
4

Spotify verwendet beispielsweise eine Rolle mit dem Namen "System Owner", um das Problem direkt aus dem Dokument zu lösen:

Technisch gesehen kann jeder jedes System bearbeiten. Da es sich bei den Trupps effektiv um Feature-Teams handelt, müssen sie normalerweise mehrere Systeme aktualisieren, um ein neues Feature in die Produktion zu bringen. Das Risiko bei diesem Modell besteht darin, dass die Architektur eines Systems durcheinander gerät, wenn sich niemand auf die Integrität des gesamten Systems konzentriert.

Um dieses Risiko zu minimieren, haben wir eine Rolle namens "System Owner". Alle Systeme haben einen Systembesitzer oder ein Paar Systembesitzer (wir empfehlen das Pairing). Bei betriebskritischen Systemen ist der Systembesitzer ein Dev-Ops-Paar, dh eine Person mit Entwicklerperspektive und eine Person mit Betriebsperspektive.

Der Systembesitzer ist der Ansprechpartner für alle technischen oder architektonischen Probleme im Zusammenhang mit diesem System. Er ist ein Koordinator und führt Leute, die in diesem System codieren, um sicherzustellen, dass sie nicht über einander stolpern. Er konzentriert sich auf Dinge wie Qualität, Dokumentation, technische Verschuldung, Stabilität, Skalierbarkeit und Freigabeprozess.

Der Systembesitzer ist kein Engpass- oder Elfenbeinturmarchitekt. Er muss nicht persönlich alle Entscheidungen treffen, den gesamten Code schreiben oder alle Veröffentlichungen durchführen. Er ist in der Regel ein Gruppenmitglied oder Kapitelleiter, der neben dem Systembesitz auch andere alltägliche Aufgaben hat. Von Zeit zu Zeit nimmt er sich jedoch einen „Tag des Systembesitzers“ und erledigt die Hausarbeit an diesem System. Normalerweise versuchen wir, dieses System auf weniger als ein Zehntel der Zeit einer Person zu beschränken, aber es variiert natürlich stark zwischen den Systemen.

Ich mag diese Idee wirklich, da sie die Vorteile oder kollektiven Code-Besitzverhältnisse auf Unternehmensebene (nicht nur auf Teamebene) hat, sondern mit diesen Systembesitzern versucht, eine gewisse architektonische Integrität sicherzustellen.

Ein Link zum vollständigen Dokument: https://dl.dropboxusercontent.com/u/1018963/Articles/SpotifyScaling.pdf , ein kurzes, aber sehr, sehr interessantes Dokument, das auf realen Erfahrungen mit der Skalierung von Agilität basiert.

AlfredoCasado
quelle
Ziemlich coole Organisation und interessante Idee über Systembesitzer
Eugene
Anstatt diesen Textblock fett und kursiv zu schreiben, um zu signalisieren, dass es sich um ein Zitat handelt, bietet der Editor eine Funktion / einen Stil für "zitierten Text". Sie wählen einfach einen Textblock aus und verwenden das Symbol in doppelten Anführungszeichen oben im Editor. Wenn Sie dies verwenden, bleibt der zitierte Text auf der gesamten Website einheitlich erkennbar.
Marjan Venema
2

Es ist ein schwer zu lösendes Problem, und es wird sicherlich nicht von Scrum gelöst, einer Projektmanagementmethode, keine Entwicklungsmethode.

Die effektivste Lösung, die ich gefunden habe, ist eine gute Paketverwaltung (nuget / gem / etc) und Versionierung. Erzwingen Sie niemals Änderungen an einem anderen Team, bis diese bereit sind, sie zu konsumieren. Lassen Sie sie weiterhin den alten Build verwenden, während Sie zum neuen wechseln.

Stellen Sie sicher, dass Sie über eine Versionsstrategie verfügen, die deutlich macht, welche Änderungen fehlerhaft sind und welche Erweiterungen.

Wenn Sie eine Änderung vornehmen, senden Sie eine Codeüberprüfung an JEDES TEAM. Lassen Sie sie sehen, wie sich dies wahrscheinlich auf sie auswirkt, lange bevor sie gezwungen sind, es zu konsumieren, damit sie ihre eigenen Änderungen zusätzlich implementieren können.

Und wenn die Dinge wirklich chaotisch werden; Wenn ein Team eine Änderung vornehmen muss und eine weitere Änderung nicht einfach durchführen kann (dies sollte ein sehr seltener Fall sein), verzweigen Sie den Code, machen Sie es zu einem völlig anderen Paket, aber machen Sie es zu einer Priorität, sobald wie möglich wieder auf den allgemeinen Code zurückzugreifen erlaubt.

pdr
quelle
1

Die Antwort, die nicht immer so offensichtlich ist, wie sie sein könnte, besteht darin, die Teams entscheiden zu lassen, wie sie eine bestimmte Komponente teilen.

Zum Beispiel hat mein Team kürzlich begonnen, eine neue Produktlinie zu entwickeln, die viel Code gemeinsam mit zwei anderen Teams hat, die seit langer Zeit ähnliche Produkte entwickeln. Unser Produkt unterscheidet sich in einigen Punkten, daher müssen wir gelegentlich Wege finden, um dem allgemeinen Code Anpassungspunkte hinzuzufügen.

Wir hatten einige Konflikte mit diesem Code und haben verschiedene Ad-hoc-Methoden ausprobiert, um mit dem gemeinsamen Eigentum umzugehen. Mit einer großen neuen Funktion haben wir beschlossen, alle Teams zusammenzubringen, um auf die gleiche Seite zu gelangen. Dies führte zu einer kleineren Gruppe, die sich aus ein paar Mitgliedern jedes Teams zusammensetzte, die die Details ausarbeiten.

Die Lösung, die unsere Teams gefunden haben, funktioniert in einer anderen Situation möglicherweise nicht. Möglicherweise benötigen Sie etwas Einfacheres oder etwas viel Formaleres. Der Punkt ist, Sie übernehmen kollektives Eigentum und finden heraus, was für Sie funktioniert.

Karl Bielefeldt
quelle
Wenn Sie "wir haben uns entschieden" sagen, meinen Sie damit eine Konsensentscheidung? Oder liegt die endgültige Entscheidung in diesen Fällen bei einem Architekten / Techniker?
Eugene
Eine Konsensentscheidung, die etwas getrieben, aber nicht von den Scrum-Meistern diktiert wurde.
Karl Bielefeldt
1

Ich werde mir erlauben anzunehmen:

  • Abnahmetests werden automatisiert.
  • Komponente verwendet gute OOP-Prinzipien: niedrige Kopplung und hohe Kohäsion.

Wenn die obigen Annahmen richtig sind, sollte es nur gelegentlich Zeiten geben, in denen sich zwei Teams gegenseitig stören. Sie können es auf folgende Weise lösen:

  • Sobald der Abnahmetest des anderen Teams fehlgeschlagen ist, sprechen Sie mit ihm, um zu verstehen, ob die Verwendung der gemeinsam genutzten Komponente korrekt ist oder Ihre. Wenn beide Verwendungen in Ordnung sind, prüfen Sie, ob ein gemeinsamer Teil dieser Verwendung auf eine gemeinsame Basiskomponente verschoben (umgestaltet) wird und die Abweichung in der Verwendung mithilfe untergeordneter Klassen oder über die Komposition verwaltet wird.
  • Machen Sie eine Person für die Komponente verantwortlich, während sie sich in der aktiven Entwicklung befindet. Er sollte als gemeinsame Ressource zwischen den Teams fungieren.
Asim Ghaffar
quelle