Ви не можете знати, що таке CI, якщо ви не знаєте, що ми раніше робили. Уявіть систему з 3-х частин. Є інтерфейс користувача, який збирає дані і заносить їх у базу даних. Існує система звітності, яка робить звіти з бази даних. І є якийсь сервер, який контролює базу даних та надсилає сповіщення електронною поштою, якщо певні критерії виконуються.
Давно це було б написано так:
- Погодьтесь із схемою для бази даних та вимогами - на це знадобиться тижнів, оскільки вона мала бути ідеальною, оскільки незабаром ви зрозумієте, чому
- Призначте 3 розробки, або 3 незалежні команди розробників, на 3 частини
- Кожен розробник працював над своїм твором і тестував свою частину, використовуючи власну копію бази даних, протягом тижнів чи місяців.
За цей час розробники не запускали код один одного, а також не намагалися використовувати версію бази даних, створену за чужим кодом. Письменник доповіді просто додасть купу зразкових даних. Письменник-попереджувач додав би записи, які імітували події звітів. І автор GUI перегляне базу даних, щоб побачити, що додав GUI. З часом розробники зрозуміли, що специфікація якимось чином помилилася, наприклад, не вказуючи індекс чи занадто коротку довжину поля та "виправляючи" це у своїй версії. Вони можуть сказати іншим, хто може на це діяти, але зазвичай ці речі будуть внесені до списку на потім.
Коли всі три частини були повністю закодовані та протестовані їх розробниками, а іноді навіть перевірені користувачами (показуючи їм звіт, екран або попередження по електронній пошті), то настане фаза "інтеграції". Цей бюджет часто формувався на кілька місяців, але все-таки продовжувався. Ця зміна довжини поля на dev 1 буде виявлена тут, і знадобиться розробки 2 та 3, щоб внести величезні зміни коду і, можливо, зміни інтерфейсу. Цей додатковий індекс спричинив би свій власний хаос. І так далі. Якщо хтось із розробників сказав користувачеві додати поле, і це зробило б, зараз би настав час і двом іншим.
Ця фаза була жорстоко болісною і майже неможливо передбачити. Тож люди почали говорити: "ми повинні частіше інтегруватися". "Ми повинні працювати разом з самого початку". "Коли хтось із нас піднімає запит на зміну (саме так ми говорили тоді], інші повинні про це знати". Деякі команди почали робити інтеграційні тести раніше, продовжуючи працювати окремо. І деякі команди почали використовувати код один одного і виводити весь час, з самого початку. І це стало постійною інтеграцією.
Ви можете подумати, що я перебільшую цю першу історію. Я колись робив роботу в компанії, де мій контакт обдурив мене, щоб перевірити код, який зазнав таких недоліків:
- на екрані, над яким він не працював, була кнопка, яка ще нічого не робила
- жоден користувач не підписувався на дизайн екрана (точні кольори та шрифти; наявність екрана, його можливості та кнопки, які вони мали у специфікації на 300 сторінок)
Його думка вважала, що ви не ставите речі під контроль джерел, поки це не буде зроблено. Зазвичай він робив одну-дві перевірки РОКІВ. У нас було трохи різниці у філософії :-)
Крім того, якщо вам важко повірити, що команди будуть відключені навколо спільного ресурсу, як-от база даних, ви дійсно не повірите (але це правда), що той самий підхід був застосований до кодування. Ви збираєтесь написати функцію, яку я можу зателефонувати? Це чудово, продовжуй і роби це, я просто жорстко кодую те, що мені потрібно тим часом. Через кілька місяців я "інтегрую" свій код, щоб він закликав ваш API, і ми виявимо, що він підірветься, якщо я пропущу нуль, я підірву, якщо він поверне null (і це робиться дуже багато), він поверне занадто великі речі для мене він не справляється з високосними роками та тисячею інших речей. Працювати незалежно, а потім мати фазу інтеграції було нормально. Зараз це звучить як божевілля.