『ソフトウェアアーキテクチャの基礎――エンジニアリングに基づく体系的アプローチ』

翻訳を担当した書籍『ソフトウェアアーキテクチャの基礎――エンジニアリングに基づく体系的アプローチ』(オライリー・ジャパン)が3月8日に発売されます。本書は、2020年1月に出版されたMark Richards, Neal Ford著『Fundamentals of Software Architecture』(O'Reilly Media)を全訳したものです。

www.oreilly.co.jp

ソフトウェアアーキテクチャとは、ソフトウェアシステムの成功に欠かせない重要な土台です。そのためソフトウェア開発者には、効果的なアーキテクチャを実現するスキルが求められます。本書は、そうした効果的なアーキテクチャを設計、構築、維持するアーキテクトになるために必要なスキルや知識を、現代的な視点から整理して包括的に解説する書籍です。 ソフトウェアアーキテクチャの定義から、アーキテクトの役割、モジュールや結合、アーキテクチャスタイルといったアーキテクチャ設計の基礎、チームやステークホルダーと効果的にコラボレーションしていくために必要なソフトスキルまで、さまざまなトピックについて実践的な例とともに説明します。

本書は、ソフトウェアアーキテクチャという分野が持つ多様な側面を現代的な視点から整理し、その基礎を詳述した書籍です。

今の時代を反映したソフトウェアアーキテクチャの書籍として

なぜ、ソフトウェアアーキテクチャの書籍を今新たに書く必要があったかについて、著者らは本書に関するインタビュー1で、今の時代を反映したソフトウェアアーキテクチャの書籍を書きたかったと、その動機を語っています。

たとえば、ソフトウェアアーキテクチャをデザインするときの重要な要素の一つに、アーキテクチャ特性 があります。アーキテクチャ特性とは、品質特性やイリティ(-ility)などとも呼ばれる、可用性(availability)や信頼性(reliability)、弾力性(elasticity)といった、システムがサポートしなければならない性質を指します。

ソフトウェアアーキテクチャを扱った多くの書籍では、システムレベルでこのアーキテクチャ特性を考えるのが、暗黙的な前提となっています。

しかし、マイクロサービスアーキテクチャ登場以降、アーキテクチャ特性はシステムレベルで考えるものではもはやなくなっていると著者らは主張します。そうでなく、共通のアーキテクチャ特性を備えなければならない範囲・境界をアーキテクチャ要素(たとえばマイクロサービスにおけるサービス)として設計していくことこそが、現代のソフトウェアアーキテクチャで重要なプロセスなのだと、著者らは語ります。

本書は、こうした、ソフトウェアアーキテクチャの分野で暗黙的に前提となっていた事柄を現代的な視点で見直し、今の時代に沿った形でソフトウェアアーキテクチャという分野を改めて包括的にまとめた書籍となっています。

開発者がアーキテクトとなるためのガイドとして

また、開発者がアーキテクトとなるための丁度良いガイドが存在していなかったことも、本書を執筆した動機であったと著者らは語っています。

このことが大きく反映されているのが、「1章 イントロダクション」「2章 アーキテクチャ思考」、そして第3部の「テクニックとソフトスキル」でしょう。これらの章では、ソフトウェアアーキテクトはどのような期待を満たすロールであるか、そのためにどのような考え方をしていく必要があるか(開発者というロールから、どのように考え方を変える必要があるか)、有効なアーキテクトであり続けるためにどのようにチームやステークホルダーとコラボレーションしていく必要があるかといった、アーキテクトというロール、キャリアを開いていくにあたっての実践的なヒントが詰め込まれています。

全体を通してメッセージとして語られる、「選択によるトレードオフを分析し、最善ではないかもしれないが少なくとも最悪ではないソリューションを選んでいく」ことも、これからのアーキテクトに向けた重要なアドバイスだと感じます。

新しい技術やプラットフォーム、製品を広めたい人たちによる「正解」が、世の中にはどうしても溢れています。ですが、現実世界のアーキテクトの仕事に「正解」はありません。少しずつ変化していく現実の状況に応じて、イテレーティブにアーキテクチャレベルの改善を重ねていくことが重要です。

訳者として、本書がそうしたアーキテクチャ感が広まる一助になればと良いなと考えます。400ページ弱とボリュームのある一冊となりますが、ぜひ手に取っていただけると幸いです。

目次

本書への推薦の言葉
はじめに:公理を疑う

1章 イントロダクション
    1.1 ソフトウェアアーキテクチャの定義
    1.2 アーキテクトへの期待
        1.2.1 アーキテクチャ決定を下す
        1.2.2 アーキテクチャを継続的に分析する
        1.2.3 最新のトレンドを把握し続ける
        1.2.4 決定の順守を徹底する
        1.2.5 さまざまなものに触れ、経験している
        1.2.6 事業ドメインの知識を持っている
        1.2.7 対人スキルを持ち合わせている
        1.2.8 政治を理解し、かじ取りをする
    1.3 アーキテクチャと交わるもの
        1.3.1 エンジニアリングプラクティス
        1.3.2 運用とDevOps
        1.3.3 プロセス
        1.3.4 データ
    1.4 ソフトウェアアーキテクチャの法則

第I部 基礎

2章 アーキテクチャ思考
    2.1 アーキテクチャと設計
    2.2 技術的な幅
    2.3 トレードオフを分析する
    2.4 ビジネスドライバーを理解する
    2.5 アーキテクティングとコーディングのバランスを取る

3章 モジュール性
    3.1 定義
    3.2 モジュール性の計測
        3.2.1 凝集度
        3.2.2 結合度
        3.2.3 抽象度、不安定度、主系列からの距離
        3.2.4 主系列からの距離
        3.2.5 コナーセンス
        3.2.6 結合度とコナーセンスのメトリクスを統合する
    3.3 モジュールからコンポーネントへ

4章 アーキテクチャ特性
    4.1 アーキテクチャ特性の(部分的な)リスト
        4.1.1 アーキテクチャの運用特性
        4.1.2 アーキテクチャの構造特性
        4.1.3 アーキテクチャの横断的特性
    4.2 トレードオフと少なくとも最悪でないアーキテクチャ

5章 アーキテクチャ特性を明らかにする
    5.1 アーキテクチャ特性をドメインの関心事から捉える
    5.2 要件からアーキテクチャ特性を抽出する
    5.3 事例:シリコンサンドイッチ
        5.3.1 明示的な特性
        5.3.2 暗黙的な特性

6章 アーキテクチャ特性の計測と統制
    6.1 アーキテクチャ特性の計測
        6.1.1 運用面の計測
        6.1.2 構造面の計測
        6.1.3 プロセス面の計測
    6.2 統制と適応度関数
        6.2.1 アーキテクチャ特性の統制
        6.2.2 適応度関数

7章 アーキテクチャ特性のスコープ
    7.1 結合とコナーセンス
    7.2 アーキテクチャ量子と粒度
        7.2.1 事例:Going、Going、Gone

8章 コンポーネントベース思考
    8.1 コンポーネントの分類
    8.2 アーキテクトの役割
        8.2.1 アーキテクチャの分割
        8.2.2 事例:シリコンサンドイッチにおける分割
    8.3 開発者の役割
    8.4 コンポーネントを識別する流れ
        8.4.1 初期コンポーネントを識別する
        8.4.2 コンポーネントに要件を割り当てる
        8.4.3 ロールや責務を分析する
        8.4.4 アーキテクチャ特性を分析する
        8.4.5 コンポーネントを再構成する
    8.5 コンポーネントの粒度
    8.6 コンポーネント設計
        8.6.1 コンポーネントの発見
    8.7 事例:「Going、Going、Gone」におけるコンポーネントの発見
    8.8 アーキテクチャ量子再び:モノリシックアーキテクチャと分散アーキテクチャの選択

第II部 アーキテクチャスタイル

9章 基礎
    9.1 基礎的なパターン
        9.1.1 巨大な泥団子
        9.1.2 ユニタリーアーキテクチャ
        9.1.3 クライアント/サーバー
    9.2 モノリシックアーキテクチャと分散アーキテクチャ
        9.2.1 誤信1:ネットワークは信頼できる
        9.2.2 誤信2:レイテンシーがゼロ
        9.2.3 誤信3:帯域幅は無限
        9.2.4 誤信4:ネットワークは安全
        9.2.5 誤信5:トポロジーは決して変化しない
        9.2.6 誤信6:管理者は一人だけ
        9.2.7 誤信7:転送コストはゼロ
        9.2.8 誤信8:ネットワークは均一
        9.2.9 分散コンピューティングにおけるその他の考慮事項

10章 レイヤードアーキテクチャ
    10.1 トポロジー
    10.2 層の分離
    10.3 レイヤーの追加
    10.4 その他の考慮事項
    10.5 このアーキテクチャスタイルを採用する理由
    10.6 アーキテクチャ特性の評価

11章 パイプラインアーキテクチャ
    11.1 トポロジー
        11.1.1 パイプ
        11.1.2 フィルター
    11.2 事例
    11.3 アーキテクチャ特性の評価

12章 マイクロカーネルアーキテクチャ
    12.1 トポロジー
        12.1.1 コアシステム
        12.1.2 プラグインコンポーネント
    12.2 レジストリ
    12.3 コントラクト
    12.4 事例とユースケース
    12.5 アーキテクチャ特性の評価

13章 サービスベースアーキテクチャ
    13.1 トポロジー
    13.2 トポロジーの種類
    13.3 サービスの設計と粒度
    13.4 データベース分割
    13.5 アーキテクチャ例
    13.6 アーキテクチャ特性の評価
    13.7 このアーキテクチャスタイルがふさわしいとき

14章 イベント駆動アーキテクチャ
    14.1 トポロジー
    14.2 ブローカー
    14.3 メディエーター
    14.4 非同期の能力
    14.5 エラー処理
    14.6 データロスの防止
    14.7 ブロードキャスト能力
    14.8 リクエスト・リプライ
    14.9 リクエストベースとイベントベースの間を取る
    14.10 ハイブリッドなイベント駆動アーキテクチャ
    14.11 アーキテクチャ特性の評価

15章 スペースベースアーキテクチャ
    15.1 一般的なトポロジー
        15.1.1 処理ユニット
        15.1.2 仮想ミドルウェア
        15.1.3 データポンプ
        15.1.4 データライター
        15.1.5 データリーダー
    15.2 データ衝突
    15.3 クラウドとオンプレミス
    15.4 レプリケーションキャッシュと分散キャッシュ
    15.5 ニアキャッシュの考慮
    15.6 実装例
        15.6.1 コンサートチケット販売システム
        15.6.2 オンラインオークションシステム
    15.7 アーキテクチャ特性の評価

16章 オーケストレーション駆動サービス指向アーキテクチャ
    16.1 歴史と哲学
    16.2 トポロジー
    16.3 分類
        16.3.1 ビジネスサービス
        16.3.2 エンタープライズサービス
        16.3.3 アプリケーションサービス
        16.3.4 インフラストラクチャサービス
        16.3.5 オーケストレーションエンジン
        16.3.6 メッセージフロー
    16.4 再利用...と結合
    16.5 アーキテクチャ特性の評価

17章 マイクロサービスアーキテクチャ
    17.1 歴史
    17.2 トポロジー
    17.3 分散
    17.4 境界づけられたコンテキスト
        17.4.1 粒度
        17.4.2 データ分離
    17.5 API層
    17.6 運用面での再利用
    17.7 フロントエンド
    17.8 通信
        17.8.1 コレオグラフィとオーケストレーション
        17.8.2 トランザクションとサーガ
    17.9 アーキテクチャ特性の評価
    17.10 参考文献

18章 適切なアーキテクチャスタイルを選ぶ
    18.1 アーキテクチャにおけるトレンドの変遷
    18.2 判断基準
    18.3 モノリスの事例:シリコンサンドイッチ
        18.3.1 モジュラーモノリス
        18.3.2 マイクロカーネル
    18.4 分散型のケーススタディ:Going、Going、Gone

第III部 テクニックとソフトスキル

19章 アーキテクチャ決定
    19.1 アーキテクチャ決定に関するアンチパターン
        19.1.1 資産防御アンチパターン
        19.1.2 グラウンドホッグデーアンチパターン
        19.1.3 メール駆動アーキテクチャアンチパターン
    19.2 アーキテクチャ上重要なもの
    19.3 アーキテクチャデシジョンレコード
        19.3.1 基本構造
        19.3.2 ADRを保存する
        19.3.3 ドキュメントとしてのADR
        19.3.4 標準のためにADRを用いる
        19.3.5 事例

20章 アーキテクチャ上のリスクを分析する
    20.1 リスクマトリックス
    20.2 リスクアセスメント
    20.3 リスクストーミング
        20.3.1 特定
        20.3.2 合意
        20.3.3 軽減
    20.4 ユーザーストーリーリスク分析
    20.5 リスクストーミング例
        20.5.1 可用性
        20.5.2 弾力性
        20.5.3 セキュリティ

21章 アーキテクチャの図解やプレゼンテーション
    21.1 図解
        21.1.1 ツール
        21.1.2 標準ダイアグラム:UML、C4、ArchiMate
        21.1.3 図解ガイドライン
    21.2 プレゼンテーション
        21.2.1 時間を操る
        21.2.2 段階的な構築
        21.2.3 インフォデッキとプレゼンテーション
        21.2.4 スライドは物語の半分
        21.2.5 不可視化

22章 効果的なチームにする
    22.1 チーム境界
    22.2 アーキテクトのパーソナリティ
        22.2.1 コントロールフリーク
        22.2.2 アームチェアアーキテクト
        22.2.3 効果的なアーキテクト
    22.3 どうやって管理する?
    22.4 チームの警告サイン
    22.5 チェックリストの活用
        22.5.1 開発者のコード完成チェックリスト
        22.5.2 ユニットテストと機能テストのためのチェックリスト
        22.5.3 ソフトウェアリリースのためのチェックリスト
    22.6 ガイダンスの提供
    22.7 まとめ

23章 交渉とリーダーシップのスキル
    23.1 交渉とファシリテーション
        23.1.1 ビジネスステークホルダーとの交渉
        23.1.2 他のアーキテクトとの交渉
        23.1.3 開発者との交渉
    23.2 リーダーとしてのソフトウェアアーキテクト
        23.2.1 アーキテクチャの4つのC
        23.2.2 プラグマティックでありながらもビジョナリーであること
        23.2.3 手本を示してチームをリードする
    23.3 開発チームに溶け込む
    23.4 まとめ

24章 キャリアパスを開く
    24.1 20分ルール
    24.2 パーソナルレーダーの開発
        24.2.1 ThoughtWorksテクノロジーレーダー
        24.2.2 オープンソースのビジュアライゼーションビット
    24.3 ソーシャルメディアの使用
    24.4 別れの挨拶