📚

西暦2023年、オブジェクト指向に興味を持った入門者にお勧めする日本語書籍を考える

2023/09/23に公開

先日某所で「最近プログラミングを始めた入門者(だったかな?)に勧められるオブジェクト指向の本を教えてほしい」みたいな質問をいただいたのですが(うろ覚えなのでちょっと違っているかも)、その場で即答できず考え込んでしまいました。ですが、遅ればせながら選書してみたので、その内容をここに書いておきます。

とはいえ、改めて考えてみても、2023年に入門者向けのオブジェクト指向の本を探すのはなかなか難しいですよね…。もちろんオブジェクト指向じゃなければ簡単かと言われるとそういう訳でもないですが。とりわけオブジェクト指向に関する書籍の場合、海外のよく知られている書籍は少し前に翻訳されたものが多くて、最近はこれというのがなかなか思いつきません。また日本でも良書がばんばん出てるわけでもなさそうです。
この辺りは、オブジェクト指向に関する技術はもはや当たり前のものとなってしまっていて、今さら旬のトピックでもない一方、一定以上の複雑さは避けられない上に過去の経緯もいろいろあり、入門者に簡単に説明するのが容易になったわけでもない、という事情がありそうです。また使用するプログラミング言語によって少しずつ使われ方・使い方が異なっているのではないかという気もします。

そんなわけで、ベストなラインナップというわけでもないですが、個人的におすすめできる書籍のリストとしていくつか並べてみました。
10年以上前の書籍で手放しには勧められないけれど今でも読むに値する本はたくさんありますが、そこはぐっとこらえて(?)、比較的新し目の書籍に限定してみています。ご了承ください。

入門編

どの程度プログラミングの練度があるかよく分からない(というか実際あんまりない)人向けの本です。

平澤 章『オブジェクト指向でなぜつくるのか 第3版 知っておきたいOOP、設計、アジャイル開発の基礎知識』

https://bookplus.nikkei.com/atcl/catalog/21/S00180/

https://www.amazon.co.jp/オブジェクト指向でなぜつくるのか-第3版-知っておきたいOOP、設計、アジャイル開発の基礎知識-平澤-章/dp/4296000187/

いきなりあまりポジティブでないことを言うと、本書は良い本ではあるのですが、正直ちょっと古いかな…という懸念もなくはないです。もちろんこの本は版を重ねていて、本書は2021年に刊行されている本なのですが、具体的に言うとGoやRustが当たり前に使われている2023年の「オブジェクト指向」を知るにあたっては若干物足りないところもあるのでは? という気がします。

もちろん、その辺りは本書でもまったく無視しているというわけでもなく、いちおう第2版あたりから「補章 関数型言語でなぜつくるのか」が追加されています。とはいえ、読んでみた限りでは、別々の技術を紹介しているにとどまっていて、対比としては弱く、関数的な技術も含めた最近のオブジェクト指向を理解するには難しいところもあるのでは…というのが私の率直な感想です。

とはいえ、(必ずしも最新の技術全般を網羅する概念ではないにしても)2023年にも当たり前の技術として使われている「オブジェクト指向」を予備知識なしに紹介するにあたっては、今でも非常に役に立つんではないかと思います。
とりわけ第3章から第5章では、オブジェクト指向以前からの経緯を含めて「なぜオブジェクト指向なのか」を紹介しているのは、もはや現代ではなかなか教わる機会もない情報かと思います。その意味でも、やっぱり一度は本書を読んでおいてもらうといいかなあ、ということで本書を挙げてみました。

実践編

ある程度の練度はあるというか、プログラミングの入門は済ませて最低限のコードは書けるようになった上で、でもオブジェクト指向って良く出てきたけど何なのかよく分からなければどうやって勉強すればいいのかも検討つかないしオブジェクト指向を使わないソフトウェア設計も特に分かってない、という人向けの本です。

田中ひさてる『ちょうぜつソフトウェア設計入門――PHPで理解するオブジェクト指向の活用』

https://gihyo.jp/book/2022/978-4-297-13234-7

https://www.amazon.co.jp/ちょうぜつソフトウェア設計入門――PHPで理解するオブジェクト指向の活用-田中-ひさてる-ebook/dp/B0BNH1J2W2/

買ったときには最初のカラーページを読んで「ぜんぜんPHPじゃないじゃん! だまされた!」とそっ閉じしてしまったのですが(すみません)、改めて読み直したら(モノクロページにはPHP出てくるし)いまどきはこんな感じの解説がいいのかなあ…という気がしてきたので挙げてみます。

本書はなんといっても章立てが良いです。なんか今どきの「基礎教養としてのオブジェクト指向」というのはこのあたりが大事なのかな、というのが伝わってきます。粒度もそろってなければ網羅的でもないのですが、なんとなく分かる気がするんですよね。

ちなみに最後の章の「アジャイル開発」は『オブジェクト指向でなぜつくるのか 第3版 』でも出てくるんですが、正直「ソフトウェア設計」とも「オブジェクト指向」ともあんまり関係ないんでは…と思っています(DDDもアジャイル開発とはまたちょっと違う話かと思いますし)。2023年ではわざわざオブジェクト指向と合わせて紹介しなくてもいいんではないかと思うんですが、どうでしょうか?

きしだ なおき『オブジェクト指向神話からの脱却』(WEB+DB PRESS Vol.132)

https://gihyo.jp/magazine/wdpress/archive/2023/vol132

https://www.amazon.co.jp/WEB-PRESS-Vol-132-きしだ-なおき/dp/4297132451/

これは単行本というか書籍ではなくて、惜しくも休刊してしまった隔月刊誌「WEB+DB PRESS」のVol.132に掲載された第1特集の記事です。

タイトルをちらっと見るとアンチオブジェクト指向の記事では?! と思われるかもしれませんが、実際にはその辺のオブジェクト指向について本よりもずっとオブジェクト指向についてしっかり考察されていて、〈神話〉のように持ち上げられがちな「オブジェクト指向」の経緯と現状・実際を紹介する記事になっています。もっともTwitterやブログでのきしださんのスタンスよりはもうちょっとマイルドになっているかもしれません(※個人の感想です)。

本書の特徴的なところはいろいろありますが、オブジェクト指向開発技術の紹介にあたってロバストネス分析を出してくるところが興味深かったです。
まあ実際のところ2023年に入手可能なオブジェクト指向開発方法論って(ロバストネス分析を含んだ)ICONIXくらいしか生き残ってない[1]ですよね…(「DDDは?」と思う人もいるかもしれませんが、DDDは開発方法論とはまたちょっと違った立ち位置な気がするんですよね。例えばエンタープライズアプリケーションアーキテクチャパターン(PoEAA)が開発方法論じゃないのと同様というか。あくまで設計に関する技法・考え方の一つということで)。

また、オブジェクト指向技術として分散オブジェクトとオブジェクト指向データベースが(実際には広まらなかった技術として)紹介されているのも渋くて良いです。
もちろん渋いだけではなくて、〈神話〉としてのオブジェクト指向の大統一理論・技術的な側面について、なぜ〈神話〉になってしまったかを壮大な理想と実際の現実との合わせ技で紹介しているところが、2023年にオブジェクト指向を知る上で参考になると思うのでした。

Ruby編

(私に聞くくらいなので)なんとなくRubyが前提だったのかな? と思うので挙げてみます[2]

Sandi Metz『オブジェクト指向設計実践ガイド』

https://gihyo.jp/dp/ebook/2016/978-4-7741-8415-9

https://www.amazon.co.jp/オブジェクト指向設計実践ガイド-~Rubyでわかる-進化しつづける柔軟なアプリケーションの育て方-Sandi-Metz-ebook/dp/B01L8SEVYI/

正直ちょっと古いんですが、まあでもこの辺はそんなに変わらないか…ということでこの本を挙げておきます。

Rubyの設計のうち、オブジェクト指向の設計まわりのことが詳しく書かれているのはやっぱり本書かなという気がします。もちろん、他の言語を使ってる人にもある程度の参考にはなるかと思います。

もうちょっと新しいのがいい、という人には本書の2nd edition(2018年刊行)が英語で出てるのでそちらをどうぞ。

https://www.poodr.com/

まとめ

いろいろ挙げてみましたが、この辺りを読めばもうオブジェクト指向はばっちり! というほどのリストにはぜんぜんなっていません。あくまでオブジェクト指向の周辺を眺めるだけでしかないと言っていいでしょう。

そこからさらにオブジェクト指向に関連するそれぞれの技術を深く知るには、「オブジェクト指向」というざっくりした言葉の本ではなく、各要素技術の本を読んでいくのがいいかと思います。頑張ってください。

脚注
  1. 『ユースケース駆動開発実践ガイド』が絶賛販売中です https://www.shoeisha.co.jp/book/detail/9784798114453 ↩︎

  2. 他の言語、例えばTypeScriptやGoやSwiftなどでは思いつかなかった、というのもあります。Pythonだったら(あれだけ本が出てるので)何かあるかもしれませんが。 ↩︎

Discussion