未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

継続的インテグレーション(CI)と継続的デリバリー(CD)について知りたかったら、闘うプログラマを読め

継続的インテグレーション(CI - Continuous Integration)と継続的デリバリー(CD - Continuous Delivery)について知りたかったら、闘うプログラマー[新装版]を読もう。

これはWindows NTの開発物語だ。大規模基盤ソフトウェアの現場の葛藤を生々しく描いていて、ソフトウェア開発に従事しているものには必読書といっても過言ではない。

デスマーチ、ドッグフードを食う、ビルド、業界人なら誰でも聞いたことがあるジャーゴン(業界用語)がちりばめられている。本書によって、それらの用語を覚えた人も少なくないと思う。

「カトラー(開発の総責任者、伝説のプログラマー)は、オペレーティング・システムを開発するときは、機能を増やすより、スケジュールを短縮するべきだと考えている。最初のバージョンは、機能を減らしても、早くリリースしたほうがいい。最初は機能を最小限にして、つぎから増やせばよい」183ページ、ドッグフード

これはリーンソフトウェア開発でよく言われるMVP(minimum viable product)の考え方だ。先にMVPの考え方があったのではなくて、様々なソフトウェア開発プロジェクトがあって、それでうまくいったもの行かなかったもののパターンを抽出して、言語化したものがMVPだ。

CI(継続的インテグレーション)のコンテキストを理解するときに、歴史に立ち返ってみるのは無駄ではない。様々な大規模プロジェクトでの成功や失敗のエッセンスがそこにあるからだ。

Windows NT開発プロジェクトでは日々ビルドを行う。毎日毎日ビルドを行う。CIそのものである。バグがあってもなくても毎日動くものが存在する。それを自分たちで利用する。それを毎日行う。そのリズムがCIである。

大規模ソフトウェアプロジェクトではビルドしたものが正義である。ビルドに失敗するようなチェックインは許されない。バグがあろうがなかろうがビルドが、動くものが正義である。そのような価値観をメンバー全員が共有している。

SIでの開発的な要求を出す人と作る人が分かれているソフトウェア開発のコンテキストと、ソフトウェア製品を自分たちで利用するという文化でのソフトウェア開発とのコンテキストの違いである。

Windows NT時代はソフトウェア製品はインストールするものだったので、それをMT、フロッピー、CDROM、DVDなどの媒体に記録して配布していたがインターネットの時代はそれをインターネット経由で配布するようになった。

さらにウェブサービスだと、媒体で配布する必要もなく、サービスを公開すればそれが配布になって、CD(継続的デリバリー)になった。

今や死語になったWeb 2.0オライリーの定義にあたってみると、delivering software as a continually-updated service that gets better the more people use it *1 とあるように継続的に更新されているサービスとして配布されるサービスである。

Salesforceが No Software というコピー(スローガン)で提供している価値は、そのようなものである。

CDを語るときに、自分の開発しているソフトウェアがインストールするタイプであったならば、デリバリーのコストがかかるので、ネットを前提とした配布コストがゼロのものとの差分を意識した方がいい。

昨今のアジャイルやDevOpsの流れの中でウェブ業界での適用がすすんだのもビルドして計測して学ぶというサイクルを高速に回せるのが、配布コストゼロのソフトウェア開発だったからである。

あなたが作っているソフトウェアがそのようなタイプのものでなかったなら(組み込みだったり、インストールするタイプのもの)、CIはすぐにでも導入できるが、DevOpsのプラクティスの導入には若干時間がかかると思う。(不可能ではないけど)

世界はソフトウェアでできている。エンタープライズと呼ばれる分野も、遅から少なかれそのような価値観に収斂していくと考えている。