Können Sie eine kontinuierliche Bereitstellung mit Junior-Programmierern durchführen?

11

Es gibt einen Moment, in dem Sie zu verstehen beginnen, dass es in der Mikrodienstarchitektur beängstigender ist, eine Woche zu warten, um alle Mikrodienste gleichzeitig bereitzustellen, um sicherzustellen, dass alles zusammenarbeitet, als die API-Versionierung strikt durchzusetzen und viel Automatik zu schreiben Tests (jeweils ein bisschen: Einheit und Erkundung, Integration) und automatische Bereitstellung in der Produktion, sobald Ihr Commit als Test auf der Bühne bestanden wurde.

Nun, es sieht nach einer großartigen Idee aus, solange Sie daran denken, Tests zu schreiben, Änderungen vor dem Festschreiben zu testen, wissen, wie die API-Versionierung verwendet wird, und keine Datenbank in Ihrem inkrementellen Datenbank-Aktualisierungsskript löschen, das bei der Bereitstellung ausgeführt wird (welche) ist kein großes Problem, da es auf der Bühne scheitern sollte).

Aber ist es möglich, dies mit Junior-Programmierern zu tun? Vielleicht muss ich ein Pull-Request-Schema implementieren. Dies würde es weniger wie eine kontinuierliche Bereitstellung machen (das ist meine Vermutung)?

Ich hoffe, dass dies nicht meinungsbasiert ist und ich kann mich darauf verlassen, dass Sie Ihre Erfahrungen teilen, danke.

Bitte beachten Sie, dass ich weder nach CI noch nach kontinuierlicher Lieferung frage. Das haben wir schon. Was wir jetzt versuchen, ist eine kontinuierliche Bereitstellung, was bedeutet, dass alles direkt nach dem Einchecken des Codes in Produktion ist.

Doker
quelle
it is more scary to wait a week to deploy all micro services at once to make sure that everything works together, than to strictly enforce api versioning, write lots of automatic tests (...), and auto deploy to production as soon as your commit passes as tests on stage- das ist meinungsbasiert;) IMHO ist es viel schwieriger, den Erfolg mit einer unabhängigen Servicebereitstellung sicherzustellen als mit einem monolithischen Ansatz: softwareengineering.stackexchange.com/a/342346/187812 . Und mit echtem CI (keine Feature- / Integrationszweige) sollten Sie nicht eine Woche warten müssen.
Dan Cornilescu
Ein gutes CI-System sollte helfen - jeder macht Fehler, nicht nur die Junioren. Und Brüche bedeuten nicht unbedingt, dass Entwickler Fehler gemacht oder ihre Arbeit nicht ordnungsgemäß ausgeführt haben. Siehe Wie können erfolgreich vorab überprüfte Änderungen zu Regressionen führen, die hätten abgefangen werden müssen?
Dan Cornilescu

Antworten:

16

Warum nicht? Alles, was Sie beschreiben, ist ein Problem, unabhängig davon, ob Sie eine kontinuierliche Bereitstellung verwenden oder nicht. Das Problem scheint zu sein, dass Sie befürchten, dass die Junioren einen katastrophalen Fehler machen werden. Und dass dieser Fehler in die Produktion eilt, bevor irgendjemand ihn fangen kann.

Aus diesem Grund führen Sie Codeüberprüfungen und Tests durch. Bevor etwas in Ihrem Hauptzweig zusammengeführt und zur Veröffentlichung vorgesehen ist, muss der Code überprüft werden, sowohl von einigen anderen Junioren (damit sie Erfahrung sammeln) als auch von erfahrenen Entwicklern (um ihr Fachwissen zu nutzen, um den Code zu verbessern). Jeder sollte nach diesen katastrophalen Fehlern suchen. Und es sollte sie aufhalten. Wenn dies nicht der Fall ist, benötigen Sie wahrscheinlich eine bessere Qualitätssicherung / Tests in einer Staging-Umgebung (und möglicherweise einige bessere Entwickler, wenn Codeüberprüfungen diese Dinge übersehen).

Becuzz
quelle
1
Ich mache mir Sorgen, dass die Verwendung von Feature-Zweigen und Pull-Anforderungen die kontinuierliche Bereitstellung verringert. Einer der Aspekte, die ich lösen möchte, ist die Kompatibilität zwischen Komponenten. Ich bin sicher, dass sie zusammenarbeiten, nachdem ich eine Änderung an einem der Dienste vorgenommen habe. Ich fühle mich gestresst, wenn wir nach vielen Veränderungen alles zusammenschieben müssen. Wenn ich Änderungen überprüfe, bevor sie dem Hauptzweig beitreten, kann ich die Reihenfolge der Änderungen sogar verwechseln, da sich die Komponenten in verschiedenen Repos befinden.
Doker
@doker Wenn Sie sich Sorgen machen, dass Sie viele Dienste zusammenführen müssen, dann tun Sie dies nicht. Stellen Sie sicher, dass jeder Dienst (und die daran vorgenommenen Änderungen) für sich stehen. Wenn Dienst A geändert wird, führen Sie eine kurze Codeüberprüfung durch, um sicherzustellen, dass er mit den neuen Änderungen funktioniert und selbst bereitgestellt werden kann. Wenn wichtige Änderungen vorgenommen werden, verwenden Sie die Codeüberprüfung als Ort, um die API-Versionierung zu erzwingen. Wenn Service B von Service A abhängt, führen Sie zuerst die Arbeit an A aus und holen Sie sie dann heraus. Arbeiten Sie dann an B. Wenn ein Junior, den Sie übergeben, zu A, B, C und D wechselt und alle voneinander abhängig sind, müssen sie dies dokumentieren, damit Sie es überprüfen können.
Becuzz
1
@doker Diese Art von Szenarien sind der Grund, warum Mitarbeiter mit kontinuierlicher Bereitstellung / Bereitstellung häufig sehr pro-Feature-Switches sind. Wenn sich Ihre Änderungen normalerweise hinter Funktionsschaltern befinden (nicht unbedingt jede kleine Änderung), können Sie Teile bereitstellen, wenn die Funktionen deaktiviert sind, sie aktivieren, wenn alle Teile vorhanden sind, und sie deaktivieren, wenn Sie ein erhebliches Problem feststellen.
Derek Elkins verließ SE
3

Die kontinuierliche Bereitstellung funktioniert gut, wenn Sie über eine Reihe gut automatisierter Tests verfügen.

Junior-Entwickler können sich über ihre eigene Aufgabe freuen und sehen nicht, dass sie Dinge kaputt machen. Sie können dies mit etwas Automatisierung beheben. Richten Sie einen Build-Server ein, auf dem ständig Tests ausgeführt werden, und stellen Sie ihnen ein Tool wie den CatLight-Build-Notifier zur Verfügung . Es gibt ihnen ein schnelles und klares Feedback, wenn sie Dinge kaputt machen.

CatLight-Build-Statussymbol

Sie werden kleine Probleme beheben und Ihre kontinuierliche Lieferung am Laufen halten.

Alex
quelle
3

Die einzige Möglichkeit, gute Gewohnheiten zu erlernen, besteht darin, sie zu üben. Ja, Junior-Entwickler können also auch die kontinuierliche Bereitstellung üben. Möglicherweise möchten Sie überlegen, ob Sie der Pipeline Schritte hinzufügen, um beispielsweise die Testabdeckung zu überprüfen und möglicherweise eine statische Code-Analyse durchzuführen, und den Build fehlschlagen, wenn die Testabdeckung nicht hoch genug ist. Dadurch wird sichergestellt, dass Junior-Entwickler die Erwartungen verstehen, bevor etwas als vollständig betrachtet wird.

IrishLagger
quelle
1

Dies können Sie nicht nur mit Nachwuchsentwicklern tun, sondern es wird auch von Ihnen verlangt. Erstens reduzieren Sie ansonsten Ihre Softwarequalität, und zweitens hilft dies Nachwuchsentwicklern dabei, gute Fähigkeiten in der Softwareentwicklung zu erlernen.

Als Analogie: Möchten Sie, dass Ihr Arzt nicht nach bestem Wissen Medizin praktiziert, weil er Angst vor Fehlern in der jungen Lehre hat? Wie gehen Ärzte mit möglichen Schäden um?

Belgi
quelle
1

Aus früheren Erfahrungen mit einer Big Ball Of Mud- Codebasis, die sich über viele Jahre auf natürliche Weise durch viele unbeaufsichtigte Nachwuchsentwickler entwickelt hat, möchte ich darauf hinweisen, was passiert, wenn Sie mit diesen Entwicklern kein CI üben.


Bearbeiten / Aktualisieren : Gemäß RubberDucks Kommentar; Bei dieser Antwort wird davon ausgegangen, dass Ihr Zusammenführungsziel für die Integration eher ein Entwicklungszweig als ein Evaluierungs- oder Release-Zweig ist.

  • Offensichtlich muss der Code für die Veröffentlichung und Live-Bereitstellung wesentlich besser kontrolliert werden. Wenn es keinen separaten Produktionszweig gibt, lohnt es sich, eine Änderung Ihrer Verzweigungs- / Zusammenführungsstrategie in Betracht zu ziehen, um einen Master-Entwicklungszweig (der für Integrationstests und niemals für die Freigabe verwendet wird) neben dem Hauptversionszweig auszuführen. Dadurch bleiben alle Vorteile von CI und häufigen Zusammenführungen erhalten, ohne dass das Risiko besteht, dass der Produktionscode beschädigt wird.

1. Nachwuchsentwickler kommunizieren seltener mit ihren Mitarbeitern oder Vorgesetzten

Kontinuierliche Integration ist nicht nur eine Frage des Zusammenführens von Code, sondern ein Zeitpunkt, an dem ein Entwickler gezwungen ist, mit anderen Stakeholdern zu interagieren.

Kommunikation ist wichtig, und ohne übermäßig verallgemeinern zu wollen, handelt es sich in der Regel um eine erlernte Fähigkeit, die für unerfahrene Entwickler weniger selbstverständlich ist als für diejenigen, die es gewohnt sind, in einer Teamumgebung zu arbeiten.

Wenn Sie Nachwuchsentwicklern erlauben, wochenlang in ihrer Kabine zu sitzen und Code zu verprügeln, ohne nach häufigen Berichten / Überprüfungen gefragt zu werden, vermeiden sie mit größerer Wahrscheinlichkeit die Kommunikation insgesamt.

2. Der Code, den sie produzieren, muss wahrscheinlich strenger überprüft werden

Haben Sie jemals etwas überprüft, das so schlecht war, dass Sie sich wünschten, Sie hätten es früher aufgegriffen und verhindert, dass es jemals geschrieben wurde? Das passiert sehr oft.

Sie können nicht verhindern, dass fehlerhafter Code geschrieben wird, aber Sie können die verschwendete Zeit begrenzen. Wenn Sie sich zu häufigen Überprüfungen und Zusammenführungen verpflichten, minimieren Sie den Spielraum für Zeitverschwendung.

Das schlimmste Szenario ist, dass Sie einen Nachwuchsentwickler möglicherweise mehrere Wochen lang in seinem eigenen Miniaturprojekt alleine lassen. Wenn er endlich für die Codeüberprüfung bereit ist, bleibt ihm einfach nicht genug Zeit, um das ganze Chaos zu beseitigen weg und von vorne anfangen.

Viele Projekte werden zu einem großen Schlammball, einfach weil eine ganze Menge schlechten Codes geschrieben wurde, als niemand aufpasste, bis es zu spät war.

3. Sie sollten weniger sicher sein, dass ein Junior-Entwickler oder ein anderes neues Teammitglied die Anforderungen verstanden hat

Manchmal kann ein Entwickler die perfekte Lösung für das falsche Problem finden. Dieser ist traurig, weil es normalerweise auf einfache Missverständnisse zurückzuführen ist, die so leicht zu vermeiden wären, wenn nur jemand zuvor die richtigen Fragen gestellt hätte.

Auch dies ist ein Problem, das eher unerfahrene Entwickler betrifft, die eher "schlechte" Anforderungen zum Nennwert akzeptieren, anstatt die Weisheit der Anforderung zurückzudrängen und in Frage zu stellen.

4. Sie sind wahrscheinlich weniger vertraut mit gängigen Mustern, mit der Architektur des vorhandenen Codes und mit bekannten Tools und Lösungen

Manchmal verbringt ein Entwickler eine ganze Menge Zeit damit, das Rad unnötig neu zu erfinden, nur weil er nicht wusste, dass es überhaupt eine bessere Lösung gibt. Oder sie verbringen Tage damit, einen quadratischen Stift in ein rundes Loch zu hämmern, ohne zu merken, was sie falsch machen.

Wiederum ist es wahrscheinlicher, dass solche Dinge unerfahrenen Entwicklern passieren, und der beste Weg, um das Problem zu beheben, besteht darin, regelmäßige Überprüfungen sicherzustellen.

5. Lange Zeiträume zwischen Code-Commits / Merges erschweren die Identifizierung und Behebung von Fehlern

Wenn ein Fehler unmittelbar nach dem Zusammenführen von Codeänderungen im Wert von vielen Wochen in den Hauptzweig auftritt, wird die Herausforderung, festzustellen, welche Änderung den Fehler verursacht haben könnte, schwieriger.

Natürlich kommt auch hier Ihre allgemeine Verzweigungsstrategie ins Spiel. Im Idealfall arbeiten alle Ihre Entwickler entweder in ihren eigenen Zweigen oder in Feature-Zweigen (oder in beiden) und arbeiten niemals direkt vom Master / Trunk aus.

Ich habe Situationen gesehen, in denen ganze Teams gleichzeitig direkt in den Master / Trunk arbeiten, und dies ist eine schreckliche Umgebung für CI, aber zum Glück bietet die Lösung, alle vom Master / Trunk wegzuziehen, im Allgemeinen genügend Stabilität für die individuelle Arbeit Artikel / Tickets / etc.

Es sollte für jeden Entwickler immer "OK" sein , den Master / Trunk-Zweig zu unterbrechen, mit dem Verständnis, dass das Zusammenführen so regelmäßig erfolgen sollte, dass das Aufbrechen von Änderungen und Fehlern schneller erkannt und daher auch schneller behoben werden sollte. Die schlimmsten Mängel sind typischerweise solche, die monatelang oder sogar jahrelang unentdeckt bleiben.


In Summe; Die Hauptvorteile der kontinuierlichen Integration / Bereitstellung sind:

  • Die Kommunikation zwischen Ihrem Team verbessert sich
  • Die Codequalität wird im Allgemeinen auf einem höheren Standard gehalten
  • Es ist weniger wahrscheinlich, dass Anforderungen übersehen oder falsch interpretiert werden
  • Architektur- und Designprobleme sollten schneller erkannt werden.
  • Es ist wahrscheinlicher, dass Fehler früher erkannt und behoben werden

Wenn Sie also nicht mit Ihren Nachwuchsentwicklern CI üben, gehen Sie ein erhebliches unnötiges Risiko ein, da dies die Mitglieder Ihres Teams sind, die es mehr als die anderen benötigen.

Ben Cottrell
quelle
OP spricht von einem Modell, bei dem Commits zum Master eine tatsächliche Bereitstellung in der Produktion auslösen . Also nein. Es ist nicht in Ordnung, den Hauptzweig in diesem Modell zu unterbrechen.
RubberDuck
@RubberDuck guter Punkt, fügte einen Kommentar hinzu, um zu verdeutlichen, dass dieser Ansatz für Integrationstests und nicht zum direkten Übertragen neuer Codeänderungen an einen Produktionszweig dient.
Ben Cottrell
0

Ja, Sie können CI mit Junior-Entwicklern üben. Es wäre dumm, dies im aktuellen Entwicklungsklima nicht zu tun. Es ist wahnsinnig nützlich, in der Lage zu sein, auf Repo zu pushen und diesen dann automatisch in Staging-Code zusammenzuführen - und alles in Echtzeit in Travis (oder Bamboo, Pipelines usw.) zu sehen!

Nehmen Sie Ihren DevOps-Typen mit und lassen Sie ihn den Prozess mit ihnen durchlaufen, sowie einen erfahrenen Entwickler im Standby-Modus, um die Dinge zu überwachen und sie mit ihren Code-Überprüfungen zu verknüpfen (Sie tun dies, richtig?)

Wenn Sie befürchten, dass Shite-Code durchkommt, liegt das nicht am CI und nicht an den Junioren, sondern an Ihnen .

Helfen Sie ihnen also, besser zu werden und sich daran zu gewöhnen, Stage / Prod-Code schneller bereitzustellen. Sie werden sich langfristig bedanken.

PrometheanVigil
quelle
1
OP spricht Continuous Deployment nicht Continuous Integration / Lieferung
Rubberduck