本記事の概要
プログラミングを始めるときに、おそらくすべての人が読むであろう良書「リーダブルコード」をあらためて読んでみて、今の自分のコーディングを振返ってみようと思う。
1. 良いコードの定義
かならずしも「良いコード」=「簡潔なコード」ではない。
「他の人が見たときにわかりやすいコード」が良いコードと紹介されている。
「いやいや、他の人が読める必要はないよ。どうぜ自分しか関わらないプロジェクトだし。」
と思う方もいるかもしれないが。
しかし、かくいう私も4年以上プログラミングをしていて「あれ?ここってなんでこんな風に書いたんだっけ?これって何の処理だっけ?」ということがしばしばある。
保守や改修対応で、コードを読むところからはじめなければならず、無駄に工数がかかってしまう。
「他の人」というのは「過去の自分」も包括しているので、自分が後々苦労しないようにするためにコーディングを見直そうと素直に感じた。
2. 名前に情報を込める
エンジニア業界はそこそこ英語能力が求められるが、あまり深く考えずに変数やクラス名、メソッド名を命名すると、後になって後悔するのは自分だ。
例えば、get()やsize()は目的語がなく、抽象的なので命名する際に意味を込めた方がよいと本書では紹介している(fetchPerlistPage(), imageVerticalSize()など)。
個人的には、複数のイテレータ変数が登場する場合はそれぞれのイテレータが指しているリストも含めて命名するとミスが減るし、見た目にもわかりやすくなる(jigyosyoMapList⇒jm_index, personList⇒pl_index, searchList⇒sl_indexなど)という記述が感銘を受けた。
地獄の2重3重ループ処理が発生することも少なくないので、「今のループはどこの何をしているんだっけ?」と画面をスクロールして頭がショートする経験をあなたもしたことがあるのではないだろうか。
イテレータをみるだけで何をしているのかが判断できれば、それこそ開発うや保守対応の工数が大幅に削減できると思う。
3. 見た目にも美しさを感じるか
初対面の人と会うときに見た目が9割というように、コードを見たときの第一印象が良いか悪いかは全体のコードの良さを決めるといっても過言では無いように感じる。
例えば、同じ処理を3回繰り返す時に、
- 各処理の改行は同じポイントで区切られているか
- 変数や引数の記述開始場所がそろっているか
- 処理のまとまりが一目でわかるようになっているか など
見た目でどんな処理のブロックがあり、何をしているのかがわかるような記述は読み手の負担を減らしてくれる。
モダンなフレームワークではSQLの生のクエリをわざわざ生成する場面も減ってきたとは思うが、SQL分を書くにもインデントが整っているか否かで読み手の負担も、バグの発見までの対応時間も雲泥の差である。
やはり”美しさ”はプログラミングでも重要視される要素である。
4、コメントするべきこと
私自身もよくやってしまうのだが、処理内容を説明してしまうコメントを記載することがある。コメントで補足しなければ理解するのに時間がかかるようなら、コメントで補足するのではなく、そもそもプログラムの見直しを行うべきというのは、いまさらながらハッとする気づきだった。
各プロジェクトでコーディング規約があると思うが、個人的にはコメントは目的や、課題事項、なぜそうしたのかなどの背景を説明することの方が重要かなと。
例えば、ソースレビューをしてもらう際に、理由があって手の込んだ処理を行っている箇所についてレビュワーにコメントされると、わざわざ説明する工数が発生するし、親切なレビュワーであれば修正後のプログラム記述と動作検証の工数まで発生するかもしれない。
予め、コーディングの背景、根拠、目的が記載されていれば読み手と開発者双方の負担を減らせられるので、コメントを効果的に使うことは重要だろう。
5、無関係の問題を抽出する
基本的に1つのファンクションに1つの処理を実装するべきだが、やむを得ず同時に複数の処理を行う場合、何十行にも及ぶ複雑な処理をいくつも書かれると、読む気が失せるし、保守も大変である。
処理のまとまりを抽出して、別ファンクションとして定義し、ファンクション名から処理内容がわかるように命名すれば、ファンクションの中身を追わなくても、処理の目的が明確になり、圧倒的に読み手の負担が軽減される。
まとめ
自身のエンジニアとしてのキャリアを振返ってみて、いかにあやふやな知識しか積み上げてきてないことを実感し、戒めの意味も込めて、これから投稿を継続していこうと思っての、1本目の記事である。
誰かに読んでもらうことを目的としているわけではないので、読みにくい部分もあるし、何の役にも立たない記事だと思うが、似たような背景を持つエンジニアの方々と一緒に成長していけたらうれしく思います。