実践ソフトウェアエンジニアリングを実践するためのブックリスト

Roger S. Pressman の[「実践ソフトウェアエンジニアリング」](https://amzn.to/32jKsRP) はなんと第9版も版を重ねる、その名の通りソフトウェアエンジニアリングについて書かれたベストセラーです。この12月にその第9版の日本語訳が出版されたので、早速手にとって読んでみました。

この本がどんな本かは翻訳者の方々が記事を書いてくださっているので、ぜひそちらをお読みください。
[実践ソフトウェアエンジニアリング第9版 Advent Calendar 2021](https://adventar.org/calendars/7088)

この本は現役のエンジニアのためだけでなく、教科書として利用されることも想定されており、ソフトウェアエンジニアリングに関して、体系的に幅広いトピックについて触れられているのが特徴です。

具体的には以下の内容について、実践する際の原則や推奨される手法がまとめられています。
> 第1部 ソフトウェアプロセス
第2部 モデリング
第3部 品質とセキュリティ
第4部 ソフトウェアプロジェクトのマネジメント
第5部 先端的な話題

しかしながら、守備範囲が広い上に、歴史的な経緯などにも触れられており、抽象度が高い上に現在ではあまり使われなくなった手法なども含んでいます。その思想的背景を知るにはいいのですが、そのままツールキットのように使えるものではありません。ただし、書かれている原則は、過去の経験に基づいたとても貴重なものばかりです。日頃の仕事に忙殺される中でも、常に心に置いておきたいものです。

なので、これら原則を基本にしつつ、それらを普段の開発に活かせるであろう書籍をあくまで私見でピックアップしてみました。「実践ソフトウェアエンジニアリング」の本を読み、さらにこれらの本を読むことで、「実践ソフトウェアエンジニアリング」をより具体的に実践できるのではないかと思います。

この中身の濃い本のすべての内容について紹介することは私にはとても荷が重いなので、特に個人的に特に関心が高い第2部「モデリング」の中でも要求と設計に絞って紹介してみたいと思います。

1. 要求エンジニアリングに関するブックリスト
   - [ソフトウェア要求](https://amzn.to/3FgCur6)
        - 要求開発の手順とノウハウが具体的に示されている名著です。要求エンジニアリングを実践するための手引になる書籍です。
   - [BABOKガイド](http://store.iiba-japan.org/shopdetail/000000000010/001/O/page1/order/)
        - ビジネスアナリシスの知識体系ガイドです。PMBOK同様、読みにくいですが、要求エンジニアリングを進める上でのプランニングや引き出しのテクニック、ソリューション評価など要求エンジニアリングのライフサイクル全般を考える上でとても参考になります。
   - [ユースケース駆動開発実践ガイド](https://amzn.to/3FhZi9X)
        - ユースケースとドメインモデルを関連付けて分析を行い、要求からコードまでのトレーサビリティを確保しながら開発をすすめるICONIXの手法はとても有効だと思います。ユースケースの書き方はこの本で紹介されてるくらいの粗さが個人的には好みです。
   - [ユーザーストーリーマッピング](https://amzn.to/3mpFF8u)
        - 普段はユースケースを書かずにユーザーストーリーを使うという方はこちらを。
   - [マッピングエクスペリエンス](https://amzn.to/3Eiq40z)
        - サービスブループリントを利用するときに参考にします。
   - [Introducing EventStorming](https://leanpub.com/introducing_eventstorming)
        - 最近社内でイベントストーミングのワークショップを始めました。要求からドメインモデルを導き出すには有効ではないかと感じています。
   - [UMLモデリングレッスン](https://amzn.to/3J10L6C)
        - ドメインモデルのパターン集としても利用できます。とくにベン図を使って具体的にモデルの妥当性をチェックするやり方はとても有効です。
   - [オブジェクトデザイン](https://amzn.to/3spmpLR)
        - クラスの責務を考えるときのCRCカードの使い方はこちら。
   - [RDRA2.0 ハンドブック](https://amzn.to/33OTBT1)
     - 普段RDRAをそのまま使うことは余りないのですが、それぞれのモデルの関連付けを行うときにユースケース複合図を利用すると全体像が捉えやすくなります。
  
1. アーキテクチャ設計に関するブックリスト
  - [Design it!](https://amzn.to/3pp6YBP)
        - アーキテクチャを考えていく際の具体的な手順とテクニックが詰まっています。
  - [進化的アーキテクチャ](https://amzn.to/3mnrQXW)
        - 進化可能なアーキテクチャ設計へのヒントをくれる書籍です。
  - [モノリスからマイクロサービスへ](https://amzn.to/3pcxa2d)
        - 具体的にどう進化させていくのかパターンを提示してくれます。
  - [Fundamentals of Software Architecture](https://amzn.to/3z0BJQJ)
        - どのアーキテクチャを選択すべきかのヒントを原則やパターンを通じて提供してくれます。
  - [データ指向アプリケーションデザイン](https://amzn.to/3pgNQ91)
        - 分散アプリケーションを設計する際の基本的な原理、原則を理解するための良書です。分厚いので必要なところだけを拾い読みしています。

2. ソフトウェア設計に関するブックリスト
  - [エリックエヴァンスのドメイン駆動設計](https://amzn.to/32aVh90)
        - 言わずとしれたDDDの原典です。ドメインの知識をコードにどう反映させていくのかという視点はとても大切です。
  - [実践ドメイン駆動設計](https://amzn.to/3edcr89)
        - 上記のエヴァンス本と併せて読みたい書籍です。より具体的な実装寄りの話が多いです。
  - [Domain Modeling Made Functional](https://amzn.to/3GTaHNM)
        - ドメインの理解からドメインモデリングへの流れがわかりやすく解説されています。イベントストーミングの手法でドメインイベントに注目するところが非常に参考になります。
  - [Clean Architecture](https://amzn.to/3mpL1QV)
        - ソフトウェア設計の原則をどう具体的に表現していくのかを示してくれる書籍です。
  - [アジャイルソフトウェア開発の奥義](https://amzn.to/3pgnST1)
        - SOLID原則はこの本で学びました。
  - [リファクタリング](https://amzn.to/3eb5GUv)
        - 実践ソフトウェアエンジニアリングの中でもリファクタリングの大切さは何度も触れられています。

かなり主観的な選択になってしまいました。どの書籍も名著と言われるものばかりなので、すでに目を通している方も多いと思います。
ソフトウェアエンジニアリングはアカデミックなもので、実際の開発現場にはあまり関係ないということではなく、本書のまえがきにもあるように「”長期間、欠陥なく無事に動作” し ”修正が容易” そして ”ユーザが満足” するソフトウェア」を開発するための先人たちの知恵の集結でもあります。これらのブックリストが、それらの恩恵を受けながら、常にそれらを活かすために考える一助となれば幸いです。

最後までお付き合いいただきありがとうございました。