SE(たぶん)の雑感記

一応SEやっている筆者の思ったことを書き連ねます。会計学もやってたので、両方を生かした記事を書きたいと考えています。 でもテーマが定まってない感がすごい。

『Adaptive Code』所感(おすすめ理由を述べてみる)

本書ですが、以下のイベントに申し込み、監訳者の長沢様より本をいただきました。
まずお礼を申し上げたいです。ありがとうございました。

connpass.com

本を受け取ったのが2018年3月10日。読み終わりましたので、所感を書きます。

なお、本書の第一版『C#実践開発手法』についても所感を書いております。そちらも見ていただけると、より良いかと思います。
(当記事中、『C#実践開発手法』を「第一版」と呼称)

hiroronn.hatenablog.jp

並べてみた

第一版は、電子書籍で購入しています。

f:id:hiroronn:20180319084532j:plain

付箋が少ないのは、第一版と同じ部分には貼っていないためです。

本書の対象読者と、読むための要求前提条件

対象読者

本書前書きには、

デザインパターン、SOLID原則、ユニットテストリファクタリングなどの実用的な例を求めている経験豊富なプログラマー

と書いています。

監訳者あとがきの中には、

初学者からベテランまでのC#開発者すべて

と書いています。

前提条件

  • JavaC++等、構文がC#に似ている言語のプログラミング経験
  • 条件分岐、ループ、式などの、プログラミングの基礎的な概念をしっかり理解している
  • クラスは使い慣れている

本書は、あらゆるところでインターフェイスを多用しますが、本文で解説されます。

対象別おすすめ理由

私の独断と偏見により、こういう人におすすめ!という内容と理由を書いてみます。

クソコードに苦しんだことがある人

本書の前編通してのテーマは、適応力のあるコードを記述するです。
クソコードの修正を乗り越えて、このクソを何とかしたい、と思ったことがある方なら、本書のどこを読んでも得るものがあると思います。
特に

は、得るものが多いです。

業務で見る大抵のクソコードは、一か所で多くのことをやりすぎているパターンなのですが、そういうのにうんざりしている方は、第7章も楽しく読めると思います。

インターフェイスが分からない人、苦手意識がある人

オブジェクト指向言語は使っているけど、インターフェイスについて理解できない、という方は多いのではないでしょうか?
というか、周りがそういう人ばっかりです。インターフェイスにアレルギーでもあるのか、というぐらい、拒否反応を示す人もいます。

初心者向けの記事を見ても、継承については詳細に書かれるものの、インターフェイスをいつ使うのか、なぜ使ったほうが良いのか、説明されている記事はあまり見かけません。*1
また、クラスは使わないとコードが書けないため、理解必須ですが、インターフェイス使わなくてもコードは書けるという点も、理解が進みにくい要因としてあるのかもしれません。

個人的な感覚では、インターフェイスを使いこなすと、世界が変わる*2ぐらい、強力な機構です。
本書は、インターフェイスの利用について、これでもかというぐらい説明してくれます。

インターフェイスの基礎は、

で、現実的にどう利用するとよいのかは

  • 第7章 単一責務の原則(Single Responsibility Principle
  • 第10章 インターフェイス分離の原則(Interface Segmentation Principle

で、懇切丁寧に記述してくれています。

「理論はいいからソース見せてよ」と思っている人

本書、サンプルが非常に充実しています。

定義や言葉が先行しそうなSOLID原則についても、スタート、途中経過、ゴールを、コードで明確に示してくれます。*3

ソース見ないと分からない、という方にもお勧めします。
自分で書くと、なお良いと思います。

C#以外のオブジェクト指向言語経験者

本書のサンプルソースや利用ツールは、C#を前提にしたものですが、C#に特化して書かれた部分はあまり多くないです。

  • NuGet*4
  • Moq*5
  • Code Contracts*6
  • Unity*7

等が出てきますが、ほとんどが他の言語でも同じ機能を持つ何かが存在するため、それに置き換えて考えれば済みます。

C#以外のオブジェクト指向言語を利用されている方でも、良いソースを書きたい、SOLID原則について学びたい、といった目的があるのであれば、本書をお勧めします。

C#の勉強としても使えます。基本構文だけは自習が必要になりますが、それが終わった後であれば不自由なく読めると思います。

アジャイル開発の解説でソースコードに触れない点に違和感を感じる方

本書の「第Ⅰ部 アジャイル開発のフレームワーク」の扉では、アジャイルソースコードの関係について、述べています。
ネタバレは避ける方針ですので、要約すると、

アジャイルフレームワークは、変更を前提とする。それを補完するようなコードを記述するにはどうするのか。

と書いてあります。*8

アジャイルは、開発者はある程度のコーディングができることを前提としているように、私は感じます。
もちろん、それを補完するためにペアプログラミング等があるのは承知しています。

しかし、そもそもアジャイルを採用し、変更を前提にするなら、コードの書き方も考える必要があるということを述べたアジャイルの本を、私は見たことがありませんでした。

アジャイル開発でC#オブジェクト指向言語を使うかどうかは、プロジェクトの判断で違いますが、変化を前提としたソースは何なのか、気になる方は読んでみると学ぶものがあるかもしれません。

第一版と違うところ

第一版所感記事で、目次の違いについて書いています。
もうちょっと細かい視点で、ここ変わったなぁ、という部分について箇条書きします。

  • アジャイル開発について大幅追加
  • 「依存関係と階層化」から、「依存性の注入」の話が移動(第12章へ移動)
    この変更により、本書を読むハードルが大幅に下がったように思います。
    第一版では、Stairwayパターンが理解できず、躓きました。ここだけ見て、実際にコードを書いてみましたが、うまく書けませんでした。
  • やりすぎは良くないよ、という記述(意訳)が随所に追加
  • テストとリファクタリングを、それぞれ独立(テスト駆動とテストファーストの対比、リファクタリングは現実的な話が追加)
  • 「依存性反転の原則」は、完全新規章*9
  • 追加部分は、筆者の口が悪くなっていて、皮肉が多い*10

様々な要素を集めた良書

本書は、アジャイル開発、インターフェイス解説、テスト、リファクタリング、SOLID原則等、様々な内容が書かれている本です。
これについてはこれまで述べた通りです。

そういう性質上、個々の要素の解説は、実践的な内容を集めたものであり、全てを説明しきっているわけではありません。
個々の要素に関しては、詳しく書いてある本がありますので、本書を読んで興味が出た分野は、参考文献等を読むことを強くお勧めします。

例えば、

アジャイルサムライ 達人開発者への道の通販/Jonathan Rasmusson/西村 直人 - 紙の本:honto本の通販ストア

カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまでの電子書籍 - honto電子書籍ストア

  • C#そのもの

インターフェイス (C# プログラミング ガイド) | Microsoft Docs

独習C# 新版の電子書籍 - honto電子書籍ストア

More Effective C# 6.0/7.0の電子書籍|新刊 - honto電子書籍ストア

  • テスト

テスト駆動開発の通販/Kent Beck/和田 卓人 - 紙の本:honto本の通販ストア

レガシーコード改善ガイドの電子書籍 - honto電子書籍ストア

レガシーソフトウェア改善ガイドの電子書籍 - honto電子書籍ストア

  • 設計関連

現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法の電子書籍 - honto電子書籍ストア

エリック・エヴァンスのドメイン駆動設計の電子書籍 - honto電子書籍ストア

実践ドメイン駆動設計の電子書籍 - honto電子書籍ストア

等です。

上に挙げた本は、私の独断で書いたもので、本書での参考文献になっているものもあれば、そうでないものもあります。

リンク

honto.jp

良い本なので、興味があればぜひ。
(ここから購入しても、私には何も入ってこないので、安心してください)

おわりに

第一版は読みましたが、改めて本書を読みました。
違うところを探すような読み方でしたが、細かいところで変わっています。
「やりすぎは良くない」とか、「抽象化には、理解しにくくなるというコストもかかる」というような内容も追加されており、改めていろいろ気付かされる内容でした。

あと、「第7章 単一責務の原則」のソース例は、何度見てもすごいです。
Decoratorパターンを、インターフェイスでこれでもかと使い倒す様は、読んでいて心が躍ります。
こんなことまでできるのか、と改めて読んでも思いました。

興味ある方は、ぜひ手に取ってください。コーディングが楽しくなること間違いなしです。


*1:継承は現実に則した説明がなされやすいが、インターフェイスは現実に当てはめてもよく分からないから?

*2:コードを書く上での選択肢が広がる、という意味

*3:開放/閉鎖の原則に関しては、ソース例なし。クラス図と言葉で説明される

*4:パッケージ管理ユーティリティ。Visual Studioに組み込まれている

*5:テスト用のモックを作成するライブラリ

*6:事前条件、事後条件、不変条件をチェックできるライブラリ

*7:ゲームエンジンではない。依存性の注入コンテナ

*8:この部分は、第一版と記述が変わっている。第一版は、アジャイルを「現代のソフトウェア開発のプロセスとプラクティス」と紹介しており、コードの品質とは別、という書き方に感じるが、本書では「アジャイルがある」ことを前提にしている、という点で異なる

*9:依存性反転と、依存性の注入は、そもそも無関係。依存性の注入は、コード上の手段でしかない

*10:相手に刺さるような、皮肉を帯びた言い回し。「第5章 テスト」後半あたりとか。唐突に「将来、あなたのコードを読むはめになる気の毒な人々」という記述が出てくる