『良いコード/悪いコードで学ぶ設計入門』を読んで
良いコード/悪いコードで学ぶ設計入門という書籍を読んだので、感じたことを書いていきます。
良いコード、悪いコードとはなにか
正義とは何かという問いに対して、答えは無数にあります。
同じように良し悪しとは何かについても、人によって良いこと、悪いことの答えは変わってくるでしょう。
本書が指す悪いコードとは、「変更しづらいコード」 です。容易に変更しづらく、変更しようとしてもバグが発生しやすいコード、成長できないコードのことです。
反対に、「変更しやすいコード」 が良いコードです。
新機能の追加や既存機能のリニューアル、利用しているライブラリのバージョンアップへの対応など、システムは、日々変化することが求められる傾向にあります。
そんな日々改善を行う必要のあるシステムが、変更を行う度にバグが発生したり、変更箇所が特定できず変更までに多大な工数が必要だったりするとどうでしょうか?
他のサービスにユーザーが離れていく場合もありますし、変更費用>変更による収益なんてことになれば、サービスが終了する場合もあります。
常に変化し続けることが求められる現代において、「変更しづらいコード」は悪である、という主張は間違っていないでしょう。ただし、「変更しづらいコード」は悪ですが、そのコードのおかげで今のサービスが成り立っているというのも事実です。どんなに悪いコードであれ、それが価値を生み出してきたのであれば、変更しづらいという特徴はあるものの、素晴らしいコードであることは間違いありません。価値を生み出していなのであれば、基本的には消えていくだけです。
- 価値を生み出すコード
- 変更しやすいコード
コードに求められるのは、良いコードではなく、まず第一に「何かを生み出すコード」であるべきだと考えます。
「何かを生み出してきた」素晴らしいコードのこれまでに感謝しながら、変更しやすいものにグレードアップして上げよう。そんな気持ちでリファクタリングを進めるのが良さそうです。
良いコード=人にとって読みやすいコード
良いコードには、いくつかのポイントがあるように思いました。
先ほど書いたように良いコードとは、変更がしやすいコードを指します。
「変更しやすい」というのは、「システムのどこを変更すればいいのかがわかりやすい」と言い換えても良さそうです。つまり「人にとって読みやすいコード」こそ良いコードということです。
本書では、人が読みやすいコードを生み出すためのポイントが非常に多く挙げられています。
- クラスの設計方法
- クラスのデータとメソッドとの関係
- 変数などの命名
- 条件分岐
- コレクション
- 結合度と責務
- etc…
など、数多くの内容に触れられています。
あなたにとって読みやすくても、他の人にとっては読みやすいか
1つ考慮すべきことがあるとすれば、人によって読みやすいコードは異なるということです。
プログラムは、ハードウェアの発達により、より人間に寄り添った開発ができるようになってきました。(詳しくはコーディングを支える技術という書籍がおもしろいです。)
人間に寄り添った開発の一つにプログラミング言語の発達があります。その一つがオブジェクト指向プログラミングであり、今回取り上げている書籍が活用しているメインの技術です。
オブジェクト指向プログラミングは、非常に強力な武器になりますが、その使い方を知らないと全く価値のないものになってしまいます。加えて、その人にとっては読みにくいコードとなってしまうのも現実です。
良いコードであり続けるためには、チームの知識の共有、向上も必要不可欠ということなのかもしれません。
モデリング
私が本書の中で最も集中して読んだのが13章の「モデリング」です。
これまで設計経験が少なく、どうすれば良いコードが書けるのかを何度も考えています。しかしその度に「わからない」という結論が出ていました。
「実現したいことをどうコードで表現すれば良いコードになるのかわからない」
そう感じていました。今でもこの感覚は残っていますが、「モデリング」の章を読んで少し解決の糸口がつかめたように感じています。
- 実現したいことの要件を詰める
- 実現したいことの目的ごとにモデル化を行う
- モデル同士の関係を確認する
- モデルをコードで表現する
ざっくりとですが、上記の2番目の作業が自分にはなかったように思います。実現したいことのそれぞれの機能がどのように組み合わさっていたのかが認識できていなかったのです。この書籍を読んでから、「要件=>モデル化(クラス作成)=>コードで表現」を意識して開発を行っていますが、以前よりはスムーズにコードを書けていますし、後で読み返しやすくなっているように感じます。
今後は、モデル化とコードで表現の間に、「テスト作成」をはさみTDDを行うようにしていくつもりです。それにより、速さ+修正容易であることをより両立させられるようにしたいと考えています。
まとめ
ツイッター、Amazonのコメント欄で賛否両論でているこちらの書籍ですが、自分的には非常に良い書籍だと感じました。賛否両論出ているのは、読者層が広く、状況が読者によって大きく異なるため仕方がないことかと思います。
読みやすいコードとは何なのだろう?どうすれば、バグが発生しづらいシステムにできるのか?そういった疑問を持つ人にとっては、至高の一冊になっているかと思います。