Sie können nicht wissen, was CI ist, wenn Sie nicht wissen, was wir früher getan haben. Stellen Sie sich ein System mit 3 Teilen vor. Es gibt eine Benutzeroberfläche, die Daten sammelt und in die Datenbank stellt. Es gibt ein Berichtssystem, das Berichte aus der Datenbank erstellt. Und es gibt eine Art Server, der die Datenbank überwacht und E-Mail-Benachrichtigungen sendet, wenn bestimmte Kriterien erfüllt sind.
Vor langer Zeit würde dies wie folgt geschrieben werden:
- Vereinbaren Sie das Schema für die Datenbank und die Anforderungen - dies würde Wochen dauern, da es perfekt sein musste, da Sie bald sehen werden, warum
- Weisen Sie den 3 Teilen 3 Entwickler oder 3 unabhängige Entwicklerteams zu
- Jeder Entwickler arbeitete an seinem Stück und testete es über Wochen oder Monate mit seiner eigenen Datenbankkopie.
Während dieser Zeit führten die Entwickler weder den Code der jeweils anderen aus, noch versuchten sie, eine Version der Datenbank zu verwenden, die mit dem Code einer anderen Person erstellt wurde. Der Verfasser des Berichts fügte lediglich eine Reihe von Beispieldaten hinzu. Der Benachrichtigungsschreiber fügte manuell Datensätze hinzu, die Berichtsereignisse simulierten. Und der GUI-Schreiber würde in der Datenbank nachsehen, was die GUI hinzugefügt hatte. Mit der Zeit bemerkten die Entwickler, dass die Spezifikation in irgendeiner Weise falsch war, z. B. ohne Angabe eines Index oder mit zu kurzer Feldlänge, und "korrigierten" dies in ihrer Version. Sie könnten den anderen sagen, wer darauf reagieren könnte, aber normalerweise werden diese Dinge für später auf eine Liste gesetzt.
Wenn alle drei Teile vollständig codiert und von ihren Entwicklern und manchmal sogar von den Benutzern getestet wurden (indem ihnen ein Bericht, ein Bildschirm oder eine E-Mail-Warnung angezeigt wurde), kam die "Integrations" -Phase. Dies wurde oft mit mehreren Monaten budgetiert, ging aber immer noch über. Diese Feldlängenänderung durch dev 1 wird hier entdeckt und erfordert dev 2 und 3, um große Codeänderungen und möglicherweise auch Änderungen an der Benutzeroberfläche vorzunehmen. Dieser zusätzliche Index würde sein eigenes Chaos anrichten. Und so weiter. Wenn einer der Entwickler von einem Benutzer angewiesen wurde, ein Feld hinzuzufügen, und dies tat, wäre jetzt der Zeitpunkt, an dem die anderen beiden es ebenfalls hinzufügen müssten.
Diese Phase war äußerst schmerzhaft und kaum vorhersehbar. Also sagten die Leute: "Wir müssen uns häufiger integrieren." "Wir müssen von Anfang an zusammenarbeiten." "Wenn einer von uns eine Änderungsanfrage stellt [so haben wir damals geredet], müssen die anderen davon wissen." Einige Teams haben früher mit Integrationstests begonnen, während sie weiterhin separat arbeiteten. Und einige Teams begannen von Anfang an, den Code des anderen zu verwenden und die ganze Zeit auszugeben. Und das wurde zu Continuous Integration.
Sie denken vielleicht, ich übertreibe diese erste Geschichte. Ich habe einmal für ein Unternehmen gearbeitet, bei dem mein Kontakt mich für das Einchecken von Code gekaut hat, der unter den folgenden Fehlern litt:
- Ein Bildschirm, an dem er nicht arbeitete, hatte einen Knopf, der noch nichts tat
- Kein Benutzer hatte sich für das Bildschirmdesign abgemeldet (genaue Farben und Schriftarten; das Vorhandensein des Bildschirms, seine Funktionen und die in der 300-Seiten-Spezifikation enthaltenen Schaltflächen).
Es war seine Meinung, dass man Sachen erst dann in die Quellcodeverwaltung bringt, wenn sie fertig sind. Normalerweise hat er ein oder zwei Check-ins pro Jahr durchgeführt. Wir hatten ein bisschen einen philosophischen Unterschied :-)
Wenn Sie es schwierig finden zu glauben, dass Teams um eine gemeinsam genutzte Ressource wie eine Datenbank getrennt werden, werden Sie wirklich nicht glauben (aber es ist wahr), dass derselbe Ansatz für Code gewählt wurde. Sie werden eine Funktion schreiben, die ich aufrufen kann? Das ist großartig, mach weiter so, ich werde in der Zwischenzeit einfach fest programmieren, was ich brauche. Monate später "integriere" ich meinen Code so, dass er Ihre API aufruft und herausfindet, dass er explodiert, wenn ich null übergebe. Wenn er null zurückgibt (und dies oft tut), gibt er zu große Dinge zurück Für mich ist es nicht in der Lage, Schaltjahre und tausend andere Dinge zu bewältigen. Es war normal, unabhängig zu arbeiten und dann eine Integrationsphase zu haben. Jetzt klingt es nach Wahnsinn.