私たちが何をしていたかを知らなければ、CIが何であるかを知ることはできません。3つの部分からなるシステムを想像してください。データを収集してデータベースに入れるUIがあります。データベースからレポートを作成するレポートシステムがあります。また、データベースを監視し、特定の条件が満たされた場合に電子メールアラートを送信するサーバーがあります。
昔は、これは次のように書かれていました。
- データベースのスキーマと要件に同意します-すぐに理由がわかるように完璧でなければならないため、これには数週間かかります
- 3つの開発者、または3つの独立した開発者チームを3つのピースに割り当てます
- 各開発者は自分の作品に取り組み、数週間または数か月間、独自のデータベースコピーを使用して作品をテストします。
この間、開発者はお互いのコードを実行したり、他の人のコードによって作成されたデータベースのバージョンを使用しようとはしませんでした。レポート作成者は、大量のサンプルデータを手で追加するだけです。アラートライターは、レポートイベントをシミュレートしたレコードを手で追加します。そして、GUI作成者はデータベースを見て、GUIが追加した内容を確認します。時間が経つにつれて、開発者は、インデックスを指定しない、フィールド長が短すぎるなど、何らかの方法で仕様が間違っていることに気付き、バージョンでそれを「修正」しました。彼らは他の人に伝えるかもしれません、誰がそれに基づいて行動するかもしれませんが、通常これらのことは後でリストに載るでしょう。
3つの部分すべてが完全にコーディングされ、開発者によってテストされ、場合によってはユーザー(テスト、画面、または電子メールアラートを表示)によってもテストされると、「統合」フェーズになります。これは多くの場合、数か月で予算化されましたが、それでもまだ行き渡っています。dev 1によるそのフィールドの長さの変化はここで発見され、dev 2と3が大きなコード変更とおそらくUI変更も行う必要があります。その余分なインデックスはそれ自身の大混乱をもたらすでしょう。等々。開発者の1人がユーザーからフィールドを追加するように指示された場合、他の2人もフィールドを追加する必要があります。
この段階はひどく痛みを伴い、予測することはほとんど不可能でした。そのため、人々は「もっと頻繁に統合する必要がある」と言い始めました。「最初から一緒に仕事をしなければなりません。」「私たちの1人が変更要求を提起するとき(それが私たちの話し方です)、他の人はそれについて知る必要があります。」一部のチームは、個別に作業を続けながら、以前に統合テストを開始しました。また、一部のチームは、最初からお互いのコードを使用し、常に出力し始めました。そして、それが継続的インテグレーションになりました。
あなたは私がその最初の物語を誇張していると思うかもしれません。ある会社で仕事をしたことがありますが、次の欠陥に悩まされていたコードをチェックインするために連絡先が私をかみ砕きました。
- 彼が取り組んでいない画面にはまだ何もしないボタンがありました
- 画面デザインでサインオフしたユーザーはいません(正確な色とフォント、画面の存在、その機能、300ページ仕様にあったボタン)。
それが完了するまでソース管理に物を入れないという彼の意見でした。彼は通常、1年に1つまたは2つのチェックインを行いました。少し哲学的な違いがありました:-)
また、データベースのような共有リソースの周りでチームが切断されると信じるのが難しいと感じた場合、コードに対して同じアプローチが取られたとは本当に信じられません(しかし本当です)。あなたは私が呼び出すことができる関数を書くつもりですか?それは素晴らしい、先に行って、それを行う、私はちょうど私がその間に必要なものをハードコーディングします。数ヶ月後、コードを「統合」してAPIを呼び出します。nullを渡すと爆破し、nullを返すと爆破することを発見します(そして、それは多くのことを行います)。私にとっては、うるう年や他の何千ものものを扱うことはできません。独立して作業し、その後統合フェーズを持つことは正常でした。今では狂気のように聞こえます。