Diese Frage enthält wirklich zwei Fragen, die separat behandelt werden müssen:
Warum haben einige Teams einen strengen Entwicklungsprozess?
Die einfache Antwort lautet: Wenn nicht, passieren Fehler. Kostspielige Fehler. Dies gilt sowohl für die Entwicklung als auch für den Rest des IT-Bereichs (Sysadmins, DBAs usw.).
Dies ist für viele Entwickler und IT-Mitarbeiter sehr schwer zu verstehen, da die meisten von uns bisher nur an einem der "Extreme" gearbeitet haben - entweder großen Unternehmen im Fortune-Stil mit mindestens einem Dutzend Entwicklern und strengen Prozessen, die befolgt werden müssen, oder kleine, Mikro-ISVs oder sogar freiberufliche Arbeiten, bei denen die Leute einfach nicht schlecht duschen oder die Kosten für eine Drecksau sind gering.
Wenn Sie jedoch jemals ein Unternehmen zwischen diesen Phasen gesehen haben - sogar ein Unternehmen mit hochqualifizierten und talentierten IT-Mitarbeitern -, werden Sie die Gefahren eines fehlenden oder halbherzigen Prozesses verstehen. Sie sehen, die Kommunikation zwischen den Mitarbeitern leidet unter einem kombinatorischen Explosionsproblem . Sobald Sie das Niveau von 6 bis 10 Entwicklern in einem Team erreicht haben, ist die Hauptursache für schwerwiegende oder kritische Mängel nicht ein Mangel an Talent oder Know-how, sondern ein Mangel an Kommunikation.
Alice erkundigt sich am Montagmorgen und beschließt, dass es in Ordnung ist, eine rekonstruktive Operation im Kofferraum durchzuführen, da sonst niemand an diesem Teil arbeitet. Bob kommt eine Stunde später, zurück aus dem Urlaub und voller Energie, und beschließt, eine neue Hauptfunktion in genau demselben Bereich zu implementieren. Warum sollte er sich mit einer Filiale beschäftigen, weil sowieso niemand diesen Code berührt? Also zahlt Alice diese "technische Schuld" aus, Bob implementiert seine Killer-Funktion, die seit 6 Monaten auf dem Spiel steht, und als beide endlich ihren Code einchecken (natürlich kurz vor Ladenschluss am Freitag!), Das Ganze Das Team muss zurückbleiben und versuchen, die albtraumhafte Hölle der Konflikte zu meistern, die in den nächsten Wochen als Bugs und Regressionen weiterleben.
Alice und Bob haben beide großartige Arbeit bei den Codierungsaufgaben geleistet, aber sie haben beide mit einer schlechten Entscheidung begonnen ("Was ist das Schlimmste, was passieren könnte?"). Der Teamleiter oder Projektmanager führt sie post mortem durch und erstellt eine Checkliste, um dies zu verhindern:
- Check-ins müssen täglich erfolgen, um die Auswirkungen von Konflikten zu minimieren.
- Änderungen, die deutlich länger als 1 Tag dauern, müssen in Zweigstellen vorgenommen werden.
- Alle wichtigen Aufgaben (einschließlich nicht funktionsbezogener Arbeiten wie Refactoring) müssen ordnungsgemäß nachverfolgt und im Bug-Tracker zugewiesen werden.
Ich wette, für viele von uns scheint dieser "Prozess" nur ein gesunder Menschenverstand zu sein. Es ist ein alter Hut. Aber wussten Sie, dass viele kleinere Teams dies nicht tun? Ein Zwei-Mann-Team kümmert sich möglicherweise überhaupt nicht um die Quellcodeverwaltung. Wen interessiert das? Es ist ehrlich gesagt nicht notwendig. Die Probleme treten erst auf, wenn das Team wächst, der Prozess jedoch nicht.
Prozessoptimierung ist natürlich wie Leistungsoptimierung; es folgt einer inversen Exponentialkurve. Die obige Checkliste beseitigt möglicherweise 80% der Fehler, aber nachdem Sie sie implementiert haben, stellen Sie fest, dass die verbleibenden 80% der Fehler auf etwas anderes zurückzuführen sind . In unserem fiktiven, aber vertrauten Beispiel handelt es sich möglicherweise um Erstellungsfehler aufgrund unterschiedlicher Erstellungsumgebungen, was wiederum darauf zurückzuführen ist, dass es keine Standardhardware gibt und Entwickler Open-Source-Bibliotheken verwenden, die alle zwei Wochen aktualisiert werden.
Sie haben also drei Möglichkeiten: Entweder (a) die Hardware standardisieren und die Bibliotheksnutzung von Drittanbietern stark einschränken, was kostspielig ist und die Produktivität erheblich beeinträchtigen kann, oder (b) einen Build-Server einrichten, für den die Sysadmin-Gruppe und a zusammenarbeiten müssen Vollzeit-Entwickler, um es zu warten, oder (c) lassen Sie Entwickler dies selbst tun, indem Sie eine standardmäßige virtuelle Maschine verteilen und die Entwickler auffordern, darauf aufzubauen. Es ist klar, dass (b) die beste langfristige Lösung ist, aber (c) kurzfristig ein besseres Gleichgewicht zwischen Zuverlässigkeit und Zweckmäßigkeit aufweist.
Der Zyklus geht weiter und weiter. Jede "Politik", die Sie sehen, wurde im Allgemeinen eingeführt, um ein echtes Problem zu lösen. Wie Joel Spolsky bereits im Jahr 2000 schrieb (zu einem ganz anderen Thema wohlgemerkt , aber dennoch relevant):
Wenn Sie in ein Restaurant gehen und ein Schild mit der Aufschrift "No Dogs Allowed" (Keine Hunde erlaubt) sehen, denken Sie vielleicht, dass dieses Schild rein kritikwürdig ist: Mr. Restaurant mag keine Hunde, also hat er dieses Schild aufgestellt, als er das Restaurant gebaut hat.
Wenn das alles wäre, würde es auch ein "No Snakes" -Schild geben. Schliesslich mag niemand Schlangen. Und ein "No Elephants" -Schild, weil sie die Stühle zerbrechen, wenn sie sich setzen.
Der wahre Grund, warum das Schild dort ist, ist historisch: Es ist ein historischer Marker, der darauf hinweist, dass die Menschen früher versuchten, ihre Hunde in das Restaurant zu bringen.
In den meisten Softwareteams (ich werde nicht alles sagen) ist es das Gleiche: Richtlinien wie "Sie müssen für jede Fehlerbehebung einen Testfall hinzufügen" weisen fast immer darauf hin, dass das Team in der Vergangenheit Probleme mit Regressionen hatte. Regressionen sind ein weiteres Problem, das eher auf Kommunikationsstörungen als auf Inkompetenz zurückzuführen ist. Solange Sie die Richtlinie verstehen, können Sie möglicherweise legitime Verknüpfungen verwenden (z. B. musste ich 6 kleine Fehler beheben, aber sie waren alle in derselben Funktion, sodass ich nur einen Testfall für alle 9 von ihnen schreiben kann).
Das erklärt, warum die Prozesse dort sind, aber es ist nicht die ganze Geschichte. Die andere Hälfte ist:
Warum ist der Prozess so schwer zu verfolgen?
Dies ist eigentlich die einfachere Frage: Das Team (oder sein Management) konzentriert sich auf wiederholbare Ergebnisse und die Minimierung von Fehlern (wie oben), hat jedoch der Optimierung und Automatisierung dieses Prozesses nicht genügend Aufmerksamkeit geschenkt .
In der ursprünglichen Frage sehe ich beispielsweise mehrere Probleme:
Das Revisionskontrollsystem (CVS) ist nach heutigen Maßstäben ein Erbe. Bei neuen Projekten wurde es fast vollständig von Subversion (SVN) abgelöst, die selbst von verteilten Systemen wie Mercurial (Hg) schnell in den Schatten gestellt wird. Der Wechsel zu Hg würde Branching und Merging weit einfacher und sogar in meinem hypothetischen Beispiel oben, die täglich begeht Anforderung würde viel weniger schmerzhaft. Der Code muss nicht einmal kompiliert werden, da das Repository lokal ist. - Die faulen Entwickler könnten diesen Schritt sogar automatisieren, wenn sie dies wünschen, und ein Abmeldeskript einrichten, um Änderungen automatisch in das lokale Repository zu übernehmen.
Es wurde keine Zeit für die Automatisierung des Prozesses der virtuellen Maschine aufgewendet. Der gesamte Vorgang zum Abrufen, Konfigurieren und Herunterladen von Quellen / Bibliotheken auf eine virtuelle Maschine kann zu 100% automatisiert werden. Dies kann ein unbeaufsichtigter Prozess sein, den Sie irgendwo auf einem zentralen Server ausführen, während Sie an der Fehlerbehebung auf Ihrem lokalen Computer arbeiten (und die VM nur verwenden, um einen sauberen Build sicherzustellen).
Auf der anderen Seite wird die VM-per-Developer-Lösung ab einer bestimmten Größe langsam albern und Sie sollten nur einen Continuous Integration-Server haben. Hier kommen die eigentlichen Produktivitätsvorteile zum Tragen, da einzelne Entwickler sich (meistens) keine Gedanken mehr über die Builds machen müssen. Sie müssen sich keine Gedanken über das Einrichten sauberer virtueller Maschinen machen, da der Build-Server immer sauber ist.
Der Wortlaut der Frage ("Testfall mit allen Schritten") impliziert, dass einige manuelle Tests durchgeführt werden. Dies mag wiederum für kleine Teams mit einer relativ geringen Arbeitsbelastung funktionieren, macht aber in größerem Maßstab überhaupt keinen Sinn. Regressionstests können und sollten automatisiert werden. Es gibt keine "Schritte", nur eine Klasse oder Methode, die der Unit / Integration-Testsuite hinzugefügt wurde.
Es erübrigt sich zu erwähnen, dass ein Wechsel von Bugzilla zu einem neueren (besseren) Bug-Tracking-System diesen Teil der Erfahrung weniger schmerzhaft machen würde.
Unternehmen sind nicht unbedingt billig oder dumm, nur weil sie diese Probleme nicht gelöst haben. Sie wissen nur, dass der derzeitige Prozess funktioniert , und in einigen Fällen sind sie risikoavers und zögern, etwas daran zu ändern. Aber sie müssen wirklich nur von den Vorteilen überzeugt sein .
Wenn Entwickler eine Woche damit verbracht haben, ihre Zeit für alle nicht-codierenden Aufgaben zu erfassen, können Sie dem Management auf einfache Weise zeigen, dass (zum Beispiel) eine Investition von 100 Mannstunden in ein Upgrade auf Mercurial ohne Kapital erforderlich ist Eliminieren Sie bis zu 10 Mannstunden pro Woche bei der Lösung von Zusammenführungskonflikten, dann ist dies eine 10-wöchige Auszahlung und sie werden dem mit ziemlicher Sicherheit zustimmen. Gleiche Idee mit Build-Servern (CI) oder besserer Fehlerverfolgung.
Um es noch einmal zusammenzufassen: Die Teams haben diese Dinge noch nicht getan, weil niemand die Geschäftsführung davon überzeugt hat, dass es wichtig genug ist, dies heute zu tun . Ergreifen Sie also die Initiative und verwandeln Sie sie in eine Kosten-Nutzen-Gleichung. Finden Sie heraus, wie viel Zeit für Aufgaben aufgewendet wird, die mit minimalem Risiko vereinfacht / automatisiert werden könnten, und berechnen Sie den Break-Even-Punkt und die eventuelle Auszahlung eines neuen Werkzeugs oder einer neuen Technik. Wenn sie immer noch nicht zuhören, wissen Sie bereits, welche Optionen Ihnen noch zur Verfügung stehen.
Wenn Entwickler eine Woche damit verbracht haben, ihre Zeit für alle nicht-codierenden Aufgaben zu erfassen, können Sie sie einfach addieren, dem Management anzeigen ... und sie in eine Kosten-Nutzen-Gleichung umwandeln usw.
Der obige Teil ist es wert, weiter ausgebaut zu werden.
Ich kann bestätigen, dass es funktioniert. Programmierer haben es einige Male in einem der Projekte verwendet, an denen ich gearbeitet habe, und jedes Mal hat es zu gewünschten Änderungen geführt.
Mein Gesamteindruck war, dass dieser Trick, wenn er richtig gemacht wird, ziemlich große Mengen an Management-Ignoranz und Trägheit außer Kraft setzen kann .
Ich möchte jedoch darauf hinweisen, dass das Unternehmen, in dem wir (Entwickler) auf diesen DIY- Ansatz zurückgreifen mussten, in Bezug auf die IT sehr unausgereift war. Bei erfahreneren Softwareanbietern sah ich, dass solche Dinge meistens von Managern selbst erledigt wurden. Und in der Regel waren sie dabei produktiver als wir Programmierer. Viel produktiver.