Was Sie beschreiben, ist - zumindest nach meiner Erfahrung - ein weit verbreitetes Emergenzmuster von Teams, die versuchen, "agil zu sein". Es ist offen für Diskussionen, wenn dies tatsächlich Teil von Agile selbst ist oder eine häufige Fehlimplementierung desselben ist, gegen das agile Manifest / die agilen Prinzipien oder eine inhärente Folge davon verstößt und so weiter. Nur aus empirischer Sicht und basierend auf meiner eigenen kleinen Auswahl an Erfahrungen (und den Personen, mit denen ich spreche) scheint ein agiles Team eine überdurchschnittliche Chance zu haben, auf dieses Muster zu stoßen. Lassen wir es dabei und konzentrieren uns auf Ihr konkretes Beispiel.
Bei Ihrer Beschreibung gibt es zwei verschiedene Aspekte :
- Fehlendes gemeinsames Verständnis / Vision und daher nicht effizient
- Wie man Erfolg / Fortschritt und Gesamtkosten misst
Den falschen Weg gehen oder im Kreis laufen
Meiner Erfahrung nach ist der Hauptgrund dafür, dass Teams bei dem Versuch, Code schnell zu erstellen, Anwendungsfälle oder Anforderungen, die sie bereits kennen oder die sie leicht herausfinden können, aktiv beiseite schieben . Stellen Sie sich das so vor: Vor 10 bis 20 Jahren versuchten die Leute, riesige Spezifikationen zu schreiben und über alles im Voraus nachzudenken, und scheiterten oft. Sie haben entweder zu lange gebraucht oder etwas übersehen. Eine der Erkenntnisse der Vergangenheit ist, dass es in der Softwareentwicklung Dinge gibt, die man nicht wissen kann und die sich stark ändern. Daher die Idee, schnell zu iterieren und eine vernünftige Ausgabe schnell zu erstellen. Welches ist ein sehr gutes Prinzip. Aber heute sind wir beim anderen Extrem: "Das interessiert mich nicht, weil es Teil des nächsten Sprints ist" oder "Ich reiche diesen Fehler nicht ein, ich kümmere mich darum, wenn er wieder auftaucht".
- Sammeln Sie alle Anwendungsfälle , Anforderungen, Abhängigkeiten und Einschränkungen auf hoher Ebene , die Sie finden können. Stellen Sie es in ein Wiki, damit alle Beteiligten und Entwickler sie sehen können. Fügen Sie sie hinzu, wenn etwas Neues auftaucht. Sprechen Sie mit Ihren Aktionären und Nutzern. Verwenden Sie diese Liste als Checkliste während der Entwicklung , um zu verhindern, dass Dinge implementiert werden, die nicht zum Endprodukt beitragen oder Workaround / Hacks sind, die ein Problem lösen, aber drei neue Probleme verursachen.
- Formulieren Sie ein übergeordnetes Konzept . Ich spreche nicht vom Entwerfen von Interfaces oder Klassen, sondern skizziere grob die Problemdomäne. Was sind die Hauptelemente, Mechanismen und Wechselwirkungen in der endgültigen Lösung? In Ihrem Fall sollte dies offensichtlich sein, wenn Sie die jquery-Workaround-Hilfe als Zwischenschritt verwenden und nur zusätzlichen Arbeitsaufwand verursachen.
- Bestätigen Sie Ihr Konzept anhand der Liste, die Sie gesammelt haben. Gibt es offensichtliche Probleme? Macht das Sinn? Gibt es effizientere Möglichkeiten, um den gleichen Nutzwert zu erzielen, ohne langjährige technische Schulden zu verursachen?
Übertreib es nicht. Sie brauchen nur etwas, damit jeder im Team (auch Nicht-Entwickler) versteht, wie der beste Weg zu Ihrem MVP aussieht. Jeder sollte zustimmen, dass es keine offensichtlichen Versehen gibt und es tatsächlich funktionieren könnte. Dies hilft im Allgemeinen zu verhindern, dass Sie Sackgassen schließen oder dass Sie dasselbe mehrmals wiederholen müssen. Agile kann Ihnen helfen, besser mit dem Unerwarteten umzugehen. Es ist kein Argument, das Bekannte zu ignorieren.
Seien Sie sich des Kostensenkungsfehlers bewusst : Wenn Sie mit einer Architektur oder einem Datenbanktyp beginnen, zögern die meisten Leute, diesen während des Projekts zu ändern. Es ist also eine gute Idee, etwas Zeit in eine "fundierte Best-Rate" zu investieren, bevor Sie mit der Implementierung beginnen. Entwickler tendieren dazu, schnell Code zu schreiben. Wenn Sie jedoch häufig ein paar Verspottungen, Live-Prototypen, Screenshots, Drahtmodelle usw. haben, können Sie die Iteration sogar noch schneller als beim Schreiben von Code durchführen. Beachten Sie jedoch, dass jede geschriebene Codezeile oder sogar Unit-Tests eine erneute Änderung Ihres Gesamtkonzepts erschweren.
Erfolg messen
Ein völlig separater Aspekt ist, wie Sie den Fortschritt messen. Nehmen wir an, das Ziel Ihres Projekts ist es, einen 1 m hohen Turm aus herumliegenden Dingen zu bauen. Der Bau eines Kartenhauses kann eine durchaus gültige Lösung sein, wenn beispielsweise die Markteinführungszeit wichtiger ist als die Stabilität. Wenn es Ihr Ziel ist, etwas zu bauen, das lange hält, wäre Lego besser gewesen. Der Punkt ist: Was als Hack betrachtet wird und welche elegante Lösung davon abhängt, wie der Erfolg des Projekts gemessen wird .
Ihr Beispiel für das "Laden" ist ziemlich gut. Ich hatte solche Dinge in der Vergangenheit, in denen sich alle (einschließlich Verkauf, Bestellung, Benutzer) einig waren, dass es ärgerlich ist. Dies hatte jedoch keine Auswirkungen auf den Erfolg des Produkts und verursachte keine langfristigen Schulden. Also ließen wir es fallen, weil es wertvollere Dinge gab, die mit den Entwicklungsressourcen zu tun hatten.
Mein Rat hier ist:
- Behalten Sie alles, auch kleine Fehler, als Tickets in Ihrem Ticketsystem . Treffen Sie eine aktive Entscheidung, was zum Projektumfang gehört und was nicht. Erstellen Sie Meilensteine oder filtern Sie Ihren Rückstand auf andere Weise, damit Sie immer eine "vollständige" Liste aller noch zu erledigenden Aufgaben haben.
- Habe eine strikte Reihenfolge der Wichtigkeit und einen klaren Punkt, an dem das Projekt als Erfolg gewertet werden könnte. Welches Maß an Stabilität / Codequalität / Dokumentation benötigt das Endprodukt tatsächlich? Versuchen Sie, jeden Arbeitstag so gut wie möglich zu verbringen, indem Sie von oben auswählen. Wenn Sie an einem Ticket arbeiten, versuchen Sie, es vollständig zu lösen, ohne neue Tickets einzuführen (es sei denn, es ist sinnvoll, Dinge aufgrund einer niedrigeren Priorität zu verschieben). Jedes Commit sollte Sie vorwärts zu Ihrem Endziel bringen, nicht seitwärts oder rückwärts. Aber um es noch einmal zu betonen: Manchmal kann ein Hack, der später zusätzliche Arbeit hervorbringt, immer noch ein Nettopositiv für das Projekt sein!
- Verwenden Sie Ihre Bestellung / Benutzer, um den Benutzerwert herauszufinden, aber lassen Sie auch Ihre Entwickler die technischen Kosten herausfinden . Nicht-Entwickler können in der Regel nicht beurteilen, wie hoch die tatsächlichen langfristigen Kosten (nicht nur die Implementierungskosten!) Sind. Helfen Sie ihnen also. Seien Sie sich des Problems des kochenden Frosches bewusst: Viele kleine, irrelevante Probleme können mit der Zeit ein Team zum Halten bringen. Versuchen Sie zu quantifizieren, wie effizient Ihr Team arbeiten kann.
- Behalten Sie das Gesamtziel / die Gesamtkosten im Auge. Anstatt von Sprint zu Sprint zu überlegen, sollten Sie lieber die Einstellung "Können wir als Team alles tun, was bis zum Ende des Projekts benötigt wird" beibehalten . Sprints sind nur ein Weg, um Dinge aufzuschlüsseln und Check-Points zu haben.
- Anstatt frühzeitig etwas zu zeigen, planen Sie Ihren Kurs auf dem schnellsten Weg zu einem minimalen Produkt , das dem Benutzer zur Verfügung gestellt werden kann. Dennoch sollte Ihre Gesamtstrategie zwischenzeitlich überprüfbare Ergebnisse ermöglichen.
Wenn also jemand etwas unternimmt, das nicht zu Ihrem endgültigen Implementierungsziel passt, sollten Sie die Geschichte im Idealfall nicht berücksichtigen. Wenn es nützlich ist, die Story zu schließen (z. B. um Feedback von Kunden zu erhalten), öffnen Sie sofort eine neue Story / einen neuen Bug, um die Mängel zu beheben. Machen Sie transparent, dass das Einnehmen von Verknüpfungen die Kosten nicht reduziert, sondern nur verbirgt oder verzögert!
Der Trick dabei ist, sich mit den Gesamtkosten des Projekts zu streiten: Wenn beispielsweise eine PO darauf drängt, Verknüpfungen zu verwenden, um einen Termin festzulegen, quantifizieren Sie den Arbeitsaufwand, der anschließend erforderlich ist, um das abgeschlossene Projekt in Betracht zu ziehen!
Achten Sie auch auf eine kriterienbasierte Optimierung : Wenn Ihr Team an der Anzahl der Storys gemessen wird, die bei einem Sprint-Review angezeigt werden können, ist es am besten, jede Story in zehn winzige Teile zu zerlegen. Wenn es an der Anzahl der geschriebenen Komponententests gemessen wird, werden in der Regel viele unnötige Tests geschrieben. Zählen Sie keine Storys, sondern messen Sie, wie viel der benötigten Benutzerfunktionalität funktioniert, wie hoch die Kosten für die im Rahmen des Projekts zu lösenden technischen Schulden sind usw.
Zusammenfassung
Um es auf den Punkt zu bringen: Schnell und minimal zu fahren, ist ein guter Ansatz. Das Problem liegt in der Interpretation von "schnell" und "minimal". Man sollte immer die langfristigen Kosten berücksichtigen (es sei denn, Sie haben ein Projekt, bei dem dies irrelevant ist). Wenn Sie eine Verknüpfung verwenden, die nur 1 Tag dauert, aber eine technische Verschuldung von 1 Monat nach dem Versanddatum erzeugt, kostet dies Ihr Unternehmen mehr als eine Lösung, die 1 Woche gedauert hat. Sofort mit dem Schreiben von Tests zu beginnen scheint schnell zu sein, aber nicht, wenn Ihr Konzept fehlerhaft ist und sie einen falschen Ansatz zementieren.
Und denken Sie daran, was "langfristig" in Ihrem Fall bedeutet: Ich kenne mehr als eine Firma, die beim Versuch, tollen Code zu schreiben, pleite ging und daher zu spät ausgeliefert wurde. Eine gute Architektur oder ein sauberer Code - aus Unternehmenssicht - sind nur dann wertvoll, wenn die Kosten für die Erreichung geringer sind als die Kosten für das Nichtvorhandensein.
Hoffentlich hilft das!