はじめに
「わたしは新卒エンジニアだから設計のことがよくわからなくて、“よい設計を知る”ために旅をしているんだ。」
「その途中で“オブジェクト指向設計”を知ったんだよ。」
というわけで、書籍「オブジェクト指向設計実践ガイド」を読んで設計の勉強をしようと試みたのですが、当時の自分では途中で挫折してしまいました。それか設計の基礎からやり直し、ようやくオブジェクト指向設計の気持ちがわかるようになってきたので、何が原因で躓いたのかを改めて考えてみました。
この記事では、そんなオブジェクト指向設計の学習に苦戦したエンジニアがつまずきポイントを紹介する記事です。僕と同様にオブジェクト指向設計に立ち向かおうとしているエンジニアの助けになれば幸いです。
つまずいたポイント
つまずいた原因はいくつかありました。主に以下が原因でした。
- オブジェクト指向言語を用いた開発経験が浅かった
- 大規模アプリケーションを開発する経験が不足していた
- 本が書かれた時代と現代の差を考慮していなかった
- 本を読むのが苦手だった
それぞれについて、紹介していきます。
オブジェクト指向言語を用いた開発経験が浅かった
当然ですが、オブジェクト指向設計はオブジェクト指向のプログラミング言語で役に立つ設計思想です。僕のプログラミング言語の経歴としては純粋関数型言語の Haskell が一番長く、オブジェクト指向言語は Java を大学の授業で習ったことがある程度でした。
知識としてオブジェクト指向のカプセル化や継承などは知っていましたが、実際にその恩恵をちゃんと受けた経験がありませんでした。そんな状態でオブジェクト指向設計を学ぼうとしても、どんなメリットがあるのか理解しづらく、本を読んでも身につきませんでした。
大規模アプリケーションを開発する経験が不足していた
もう一つ足りなかった経験として、大規模アプリケーションの開発経験が少なかったのも原因の一つだったと思います。
個人開発など、小さなアプリケーションを作る場合、雑に実装してもそこまで読みにくくならないですが、大規模なアプリケーションは設計を注意しないと読みづらくなることが多いと思います。当時の僕はまだ経験が浅く、設計を気をつけないと問題が発生するような場面にあまり遭遇してこなかったため、そもそも設計の必要性を十分に理解できていなかったのだと思います。
その結果、本を読んでSOLID原則を知っても、それがどんな場面で役に立つのかを想像することができず、身に付かなかったのだと思います。その後、大規模アプリケーションの開発をしていくうちに、レビューで「これは読みにくくなるから、このパターンで実装するといいよ」などの指摘を何度も受け、ようやくオブジェクト指向設計の必要性を身を持って感じることができるようになってきました。
本が書かれた時代と現代の差
「オブジェクト指向設計実践ガイド」 は 「Practical Object-Oriented Design in Ruby」 を日本語訳した本です。「Practical Object-Oriented Design in Ruby」 は今から10年以上前に初版が発行された本です。10年も経てばプログラミング言語のトレンドも変化しますし、研究も進んでいきます。
「オブジェクト指向設計実践ガイド」 では、静的型付けでも結局予期せぬエラーは防げないから動的型付けでダックタイピングした方がマシ、みたいな記述がありました。(若干僕が曲解しているかもしれないです)先述の通り、僕はこれまで強い静的型付け言語である Haskell を使うことが多かったのですが、型システムがしっかりしている Haskell でそんなエラーに遭遇したことはなかったので、「何を言っているんだこいつは 」 とこの本に対して懐疑的になってしまい、それ以降この本から離れてしまいました。
ですが、改めて考えてみると、この本は10年以上前に初版が発行された本です。当時の静的型付けと比較すると、現代の TypeScript や Haskell などの型システムは明らかに進化していると思います。なので、本に書かれている全ての内容が現在も正しいとは限らないので、それを理解した上で読む必要がありました。
本を読むのが苦手だった
これは僕自身の完全な個人的な要因ですが、本を読むのが苦手なのも、学習に苦戦した要因の一つだと思います。
本を読むとすぐ眠くなってしまうので、睡魔と戦いながらの学習になるのですが、先述の通りオブジェクト指向の開発経験も浅く、これまで Haskell ばかり書いてきた自分がいきなりこの本でオブジェクト指向設計を学ぶのは少し早かったと今では感じています。
おわりに
新卒エンジニアの挫折から1年後。
その後、オブジェクト指向言語を用いた大規模なアプリケーションの開発経験を積み、また、設計の基礎を学んだ結果、ようやくオブジェクト指向設計実践ガイドをまともに読めるようになってきました。まだ本を読むのは苦手ですが、久しぶりに本を開いて軽くよんでみたのですが、書かれている内容がスーッと頭に入ってきて驚きました。
まだ「オブジェクト指向設計実践ガイド」すらちゃんと読み切れていないですが、それを読み終わったらその先の「ドメイン駆動設計」や「クリーンアーキテクチャ」も学んでいき、最強の設計使いになりたいと思います。