2015/11/14(土)に開催されたJavaOne2015報告会で話をしてきました。資料は以下。
この資料を作る中で気づいたというか、思ったことは、この20年でソフトウェア開発におけるデザインの視点が変化しているな、ということです。
ユニットテストとDIコンテナが変えたもの
ユニットテストは衝撃的なものでした(はい、僕も@t_wadaの薫陶を受けたのです)。
ユニットテストを端的に説明するなら「自分で書いたコードを、自分のコードで確認する」ということですが、いわゆる「テスト」というよりは「実装技法」であると考えたほうがよいと思っています。
(それはTDDの事だとか、UATとしてのテストコードは別の意味があるとか、そういう話を含めたとしても、僕はユニットテストを実装技法だと理解しています。話がややこしいですが、「単体テスト」はテストでしょうね)
もちろん、DIコンテナも大きな変化でした。「依存性を注入する(Dependency Injection)」とは、ランタイムで依存するインスタンスを(APIは同じままで)切り替えることを意味します。DIコンテナは「アプリケーションがコードによって動作変更できるようにしておく」ことを保証するための強力なツールでした。
僕にとってユニットテストやDIコンテナがもたらした変化は、ソフトウェアデザインの視点が「クラス」から「インスタンス」になったことです。
ユニットテストやDIコンテナに慣れ始めた時期、UMLで詳細なクラス図を書くことに苦労したのを覚えています。なぜならユニットテストやインジェクションを書きやすくするためのクラス構造というのが、ビジネスロジックとして適するクラス分割の美しさとは別物だったからです。だから、ビジネスロジック観点の概要クラス図しか書く意味が無くなりました(実装差異が出る代表的な要素はインターフェースクラス、Privateスコープメソッド、設定の分離、フォルダ構成などでしょうか)。
つまり、ソフトウェアをデザインする上での美しさが「インスタンス化し動作された状態において、いかにシンプルさを保てるのか」に変化したということなのです。結果として静的な構造としての複雑さを招いたとしても、インスタンス化された構造を優先させるべきでした。
クラウド(プラットフォーム)が変えたもの
そして、現在においてはソフトウェアデザインの視点が「インスタンス(アプリケーション)」から「サービス」に変化しています。
「サービスがコードによって動作変更できるようにしておく」あるいは「サービス化し動作された状態において、いかにシンプルさを保てるのか」と書いてもよいでしょう。それはクラウドのことであり、SDx(Software-Defined anything)のことであり、CI/CDのことであり、DevOpsのことです。
資料で紹介しているカナリアリリースやダークカナリアリリース、あるいはChaos Monkeyのような仕組みはサービスがコーディング可能であることから生まれています。
現時点では「クラウド・デザインパターン」と呼ばれていますが、プラットフォームの能力を最大限に引き出すようなデザインが重要になっています。マイクロサービスはアプリケーションを複雑に分割しますが、それがサービスとしてのシンプルさを維持するのです(かと言って、過度は複雑さは崩壊を招きますが...)。
僕にとって「サービス品質がコーディング可能である」というのは、ユニットテストやDIコンテナの時に感じた「アプリケーション動作品質がコーディング可能である」という衝撃と似ています。
ソフトウェア開発におけるデザイン視点の変化
もう少し詳しく、下の絵を見てください。これはソフトウェア品質モデルを図示した物です。
ソフトウェアの品質は右から「利用時の品質」「外部品質」「内部品質」「プロセス品質」に類別されると考えられます。これを「ITサービスの品質」「アプリケーション動作の品質」「クラス構造の品質」「プロセスの品質」と置き換えてみましょう。
その昔、エンジニアがコードで管理できるのが「クラス構造」だけであったものが、ユニットテストやDIコンテナによって「アプリケーション動作」も管理可能になり、さらにクラウドの現在では「サービス」も管理可能になった。様々な技術や手法の発達が前後しながら、これを促進したのです。
何度か書いていますが、エンジニアの主戦場は「ソフトウェア開発(プログラミング)」から「サービス運営」に移ってきています。
とはいえ、まだまだ「サービスをコードで管理する」ことは未成熟な状況です。一部の先進的な企業やエンジニアの取組みを行い、その結果がOSSや事例紹介という形で広まりつつあります。なので、今が学ぶ良い機会でしょうね。興味を持たれた方は、ぜひ、触れてみてください。
たとえばJJUG CCC 2015 Fallとかでね(ステマ)!