本投稿は TECOTEC Advent Calendar 2024 の15日目の記事です。
決済認証システム開発事業部の増田です。普段はエンジニアとしてPHPをメインにWebアプリケーションの開発に携わっています。
ところで、みなさんは「リーダブルコード」という書籍はご存じでしょうか?
www.oreilly.co.jp
恐らく、ITエンジニアリングに関わったことのある人であれば誰でも知っている名著かと思います。
美しく読みやすいコードを書くにはどうしたらいいかが体系的に記されており、日本語訳版が発売されてから10年以上経っても読まれ続けている本書。
エンジニアとして働くのであれば読んでおいた方がいい本であるはずなのですが、私はIT業界に入ってから数年経つのにも関わらず、今まで一度もこの本に触れたことがありませんでした。
コードを記す際のお作法に関しては、日々実践を積む中で、何となく感覚で掴んでいっていたというのが正直なところです。
しかし、このままでいいのだろうか?エンジニアとして更にキャリアを積んでいくことを考えたときに、もっとコードの書き方について体系的に学ぶ必要性があるのではないだろうか?
そのように感じ、今回みんなが読んでいる「リーダブルコード」を読んでみることにしました。
要点整理
まずは本書の要点を整理していきながら、自分が特に学びになった部分を記していきます。
名前の付け方
関数や変数、クラス、メソッドであっても、名前を付ける際、「名前に情報を詰め込む」ことが大事です。
例えば、私もメソッド名を付ける時などによく使用してしまうのですが、「get」という単語があります。
PHPで記すと、下記のようなイメージです。
public static function getCustomerList(int $id){ … }
しかし、「get」という単語はどこからCustomerList(顧客リスト)の情報を取ってきているのかが曖昧になってしまいます。
こちらをもしインターネットから取ってきているのであれば、fetchCustomerList()やdownloadCustomerList()を使用した方が明確になります。
そして、名前の構成は抽象的なものより具体的なものの方が、使用用途がより伝わりやすいです。
例として、任意のTCP/IPポートをサーバーがリッスンできるかを確認するメソッドであるserverCanStart()があったとします。
でも、serverCanStart()は抽象的なので、canListenOnPort()という名前にした方が、メソッドの動作をそのまま表しているのでより具体的になります。
コードのレイアウト
コードは余白や配置、順序など、見た目の美しさも整える必要があります。
簡単なコードを例に挙げますが、下記のコードのように、インデントの位置がずれていたり、改行の仕方が行によって違うと見づらくなってしまい、コードの内容を理解するのにも時間が掛かってしまいます。
public function store (Request $request) { $id = $request->get('id'); $customer_name = $request->get('customer_name'); $post = Customer::where('id', $id) ->where('customer_name', $customer_name) ->orderby('id', 'DESC') ->first(); return $post; }
下記のPHP(Laravel)コードは、インデントや改行の仕方を揃えたものです。
このように、コードのレイアウトを揃えることで見やすくなり、コードを解読する時間も短縮することができます。
public function store (Request $request) { $id = $request->get('id'); $customer_name = $request->get('customer_name'); $post = Customer::where('id', $id) ->where('customer_name', $customer_name) ->orderby('id', 'DESC') ->first(); return $post; }
また、システム内で一貫したコードの並び順にしたり、関連するコードをブロックとしてまとめたりすることも、コードの可読性を高めることに繋がります。
制御フローの読みやすさ
名前の付け方やレイアウトの仕方のみならず、条件やループなどの制御フローを読みやすくすることも大切です。
例を挙げると、
if (length >= 10)
と
if (10 <= length)
でしたら、前者の方が読みやすいと答える人がほとんどかと思います。(私もそうです)
なぜ、前者の方が読みやすくなるのか?それは、左側に変化する「調査対象」の式、右側にあまり変化しない「比較対象」の式とした方が、「もし長さが10cm以上だったら~」となるので、英語の用法とも合って自然だからです。
それから、下記のようなif/else文の場合、
if (a == b) { // 第1のケース } else { // 第2のケース }
と
if (a != b) { // 第2のケース } else { // 第1のケース }
の処理は同じですが、読みやすさを担保するには並び順に優劣をつける必要があります。
優劣をつける条件は下記の通りです。
・条件は否定形よりも肯定の形を使う。
・単純な条件を先に書く。
・関心を引く条件や目立つ条件を先に書く。
この優劣は衝突することもありますが、特別な衝突がなければ順序を守った方がコードが整理できます。
汎用コードの分離
大きな問題を小さい問題に分割して、プロジェクト固有のコードから汎用コードを分離することで、コードが更に読みやすいものになります。
本書ではこのことを「無関係の下位問題を抽出する」と呼んでいます。
コード全体で共通化して使用できそうな機能などを、汎用コードを記載するファイル(例えばLaravelではServiceなど)にまとめておくことで、開発の手間が省けるだけではなく、見やすいコードの形成にも繋がります。
コードを説明できるようにする
何年かエンジニアをやっていると、エンジニア以外の人に開発しているシステムの説明をする機会に一度は遭遇すると思います。
その際、自分よりもシステムの知識が少ない人が理解できるような「簡単な言葉で」説明する能力が大事になってきますが、これはコードを書く時にも同じです。
コードを「簡単な言葉で」書く手順は下記の通り。
1. コードの動作を同僚にもわかるように、簡単な言葉で説明する。
2. その説明の中で使用しているキーワードやフレーズに注目する。
3. その説明に合わせてコードを書く。
「リーダブルコード」を読み進める中で考えたこと
「リーダブルコード」を読んでいく中で考えたことがいくつかあるので書き留めておきます。
日本語話者向けにわかりやすいコードを書く
本書は元々英語で書かれたものであり、どうしても英語が母語の人に向けた内容に偏っているなと感じました。
「get」という単語を一つとっても、英語話者と日本語話者ではイメージするものが違ってきますし、英語話者からしたら抽象的な単語も、日本語話者からしたら逆にわかりやすい単語として認識することもあるだろうと思います。
そう考えると、日本語を母語とする私たち向けの「リーダブルコード」を探っていく必要もありそうです。
英語・アルゴリズムを勉強する必要性
本書を読んでいく中で、明確でわかりやすいコードを書くためには、まずは英語のボキャブラリーを増やさないといけないと考えさせられるタイミングが非常に多かったです。
また、8章でド・モルガンの法則が出てくるのですが、中学生の時に受けた授業で登場し、テストでもこの法則を使った問題を解いたのにも関わらず、内容が記憶の彼方に行ってしまっていたので、この文字列を見たときに思わずドキリとしてしまいました。
プログラミングの学習をするだけではなく、英語力の向上やアルゴリズムへの理解も深めていく必要性を感じました。
プロジェクト内での認識を一致させる
開発は基本的にチームで行うので、本書を読んだ自分だけが書き方を意識しても意味がありません。
納期などもあるので時間は限られてきますが、コーディングルールをまとめるタイミングで、関数やクラス名の書き方はどうやって統一するか、この機能ではどのような単語を使用するかなど、ある程度の認識合わせはしておくべきだと思いました。
最後に
一通り「リーダブルコード」を読み終わり、最初に出てきた感想はこの本は定期的に読み直す必要がありそう、ということでした。
他の技術書に比べて手ごろな厚さではあったものの、それでも情報量が多く、綺麗なコードを書くには留意するべき点があまりにも多いという印象を受けました。
本棚の奥にはしまわず、定期的に内容の振り返りができるよう、普段から手元に置いておこうかと思っています。
テコテックの採用活動について
テコテックでは新卒採用、中途採用共に積極的に募集をしています。
採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。
ご興味を持っていただけましたら是非ご覧ください。
tecotec.co.jp