Nie możesz wiedzieć, czym jest CI, chyba że wiesz, co robiliśmy. Wyobraź sobie system z 3 częściami. Istnieje interfejs użytkownika, który gromadzi dane i umieszcza je w bazie danych. Istnieje system raportowania, który tworzy raporty z bazy danych. Jest też jakiś serwer, który monitoruje bazę danych i wysyła powiadomienia e-mail, jeśli spełnione są określone kryteria.
Dawno temu byłoby to napisane w następujący sposób:
- Uzgodnij schemat bazy danych i wymagania - zajęłoby to tygodnie, ponieważ musiało być idealne, ponieważ wkrótce zrozumiesz, dlaczego
- Przydziel 3 deweloperów lub 3 niezależne zespoły deweloperów do 3 elementów
- Każdy deweloper pracował nad swoim utworem i testował go przy użyciu własnej kopii bazy danych przez tygodnie lub miesiące.
W tym czasie deweloperzy nie uruchamiali nawzajem kodu ani nie próbowali używać wersji bazy danych utworzonej przez kod innej osoby. Autor raportu po prostu ręcznie doda kilka przykładowych danych. Autor alertów ręcznie dodawał rekordy symulujące zdarzenia w raporcie. A pisarz GUI patrzy na bazę danych, aby zobaczyć, co dodał GUI. Z czasem deweloperzy zdają sobie sprawę, że specyfikacja jest w jakiś sposób błędna, na przykład nie określają indeksu lub mają zbyt krótką długość pola i „naprawiają” to w swojej wersji. Mogą powiedzieć innym, którzy mogą na to zareagować, ale zwykle te rzeczy trafią na listę na później.
Gdy wszystkie trzy części zostaną całkowicie zakodowane i przetestowane przez ich twórców, a czasem nawet przetestowane przez użytkowników (pokazując im raport, ekran lub powiadomienie e-mailem), wtedy nastąpi faza „integracji”. Budżet ten był często budżetowany na kilka miesięcy, ale nadal się przedłużał. Ta zmiana długości pola przez dev 1 zostałaby tutaj odkryta i wymagałaby dev 2 i 3, aby wprowadzić ogromne zmiany kodu i ewentualnie zmiany interfejsu użytkownika. Ten dodatkowy indeks siałby spustoszenie. I tak dalej. Gdyby jeden z deweloperów otrzymał od użytkownika polecenie dodania pola, i zrobiłby to, teraz nadszedłby czas, aby pozostali dwaj również musieli je dodać.
Ta faza była brutalnie bolesna i prawie niemożliwa do przewidzenia. Ludzie zaczęli mówić: „musimy częściej integrować”. „Musimy współpracować od samego początku”. „Gdy jedno z nas zgłosi prośbę o zmianę [wtedy tak rozmawialiśmy] inni muszą o tym wiedzieć”. Niektóre zespoły zaczęły wcześniej przeprowadzać testy integracyjne, nadal pracując osobno. Niektóre zespoły od samego początku zaczęły używać kodu i danych wyjściowych. I to stało się ciągłą integracją.
Możesz myśleć, że przesadzam z tą pierwszą historią. Pewnego razu pracowałem dla firmy, w której mój kontakt wydzwonił mnie za sprawdzenie kodu, który cierpiał z powodu następujących wad:
- ekran, nad którym nie pracował, miał przycisk, który jeszcze nic nie zrobił
- żaden użytkownik nie podpisał się na projekcie ekranu (dokładne kolory i czcionki; istnienie ekranu, jego możliwości i jakie przyciski miał w specyfikacji 300 stron).
Jego zdaniem nie poddajesz kontroli źródła, dopóki nie zostanie WYKONANE. Zazwyczaj robił jedno lub dwa kontrole ROK. Mieliśmy trochę filozoficznej różnicy :-)
Ponadto, jeśli trudno ci uwierzyć, że zespoły byłyby rozłączone wokół wspólnego zasobu, takiego jak baza danych, naprawdę nie uwierzysz (ale to prawda), że to samo podejście zostało zastosowane do kodu. Zamierzasz napisać funkcję, którą mogę wywołać? To świetnie, śmiało i zrób to, w międzyczasie po prostu koduję to, czego potrzebuję. Miesiące później „zintegruję” mój kod, więc wywołuje on Twój interfejs API i odkryjemy, że wysadza się, jeśli przekażę wartość null, wysadzę, jeśli zwróci wartość null (i robi to bardzo często) zwraca rzeczy, które są zbyt duże dla mnie nie jest w stanie obsłużyć lat przestępnych i tysiąca innych rzeczy. Niezależna praca, a następnie faza integracji były normalne. Teraz to brzmi jak szaleństwo.