この記事はスターフェスティバル Advent Calendar 2023 9 日目の記事です。
最近社内で可読性について会話をするタイミングがあり、可読性について思っていることを言語化してみるか〜と思ったので書いてみます。 可読性って難しいしよくわからないよね〜
この記事では、可読性という単語をコードの把握しやすさといった認知負荷的な意味だったり誤読しにくさみたいな意味で使っています。
メンタルモデルに起因するものなのか、そうではないのかを意識する
メンタルモデル?
メンタルモデルというものは「XXとはこういうもの」や「こうしたらこうなるはず」のような人それぞれが持つ思い込みみたいなものだと理解しています。
コードを読んで理解するときのメンタルモデルは、これまでのプログラミングに関する経験や知識、そのロジックが解こうとしている問題についての理解、自然言語自体の理解などの積み重ねで作られていくものかと思います。
たとえば、僕は getName
というメソッドを見たときに
- 状態の更新は起こらないだろうな
- I/Oは発生しないだろうな
- 計算コストは低いだろうな
みたいに思ったりしますが、僕とは違うメンタルモデルを構築している人であれば「小さなロジックとかもなく、インスタンスプロパティをそのまま返しているだけだろうな」といったことまで期待するかもしれません。
メンタルモデルに起因する指摘は難しい
読み手のメンタルモデルと実際にコードに乖離があると読み手は読みにくいなとか理解しにくいなとか思い始めますが、 残念ながらメンタルモデルは人によって異なり、ある人にとって可読性が上がる修正が別の人にとっては可読性を下げる修正になることがあります。
例えば関数指向になれている人は map
や filter
を使って配列を処理することは簡潔で読みやすく感じると思いますが、そうではない人にとっては for 文を使ってループ処理している方が読みやすく感じたりします。
そのため、自分にとって可読性が低いから変えてほしいという視点だけだと自分しか得をしない指摘になってしまったり、 たいして実利を得ることができない議論のために時間を消費してしまったりするため、 この可読性の低下はメンタルモデルに起因するものなのか、ロジックの複雑性に起因するものなのかなどを自覚することは大事だと思っています。
とはいえ、綺麗に区切れるものでもないと思うので難しいんですが
普通の範囲に収まっていそうであれば許容する
多くのエンジニアのメンタルモデルに概ね合致するようなコードを書くことは重要なため、 getName
というメソッドで状態の更新を行うようなコードを指摘するのは有益だと思いますが、
特別変なことをやっているわけではないコードに対してレビュアーとレビュイーが細かい点を主張しあうといった、お互いの普通あるいは常識をぶつけ合うだけで実利に結びつかないような議論は微妙だなと感じます。
(幸い自分の会社でそういった光景を見たことはないです
何を普通とするかは難しいためあくまで感覚的な話にはなってしまいますが、ある程度普通なコードに対しては nits くらいの温度感で意見を共有するに留めて、 プロダクトのコード規約のアップデートなどに時間を使った方が有意義かなと思っています。
コメントの不備による可読性の低下は指摘する
A Philosophy of Software Design という書籍の中では、コードだけでは必要な情報を全ては表現しきれないためコードコメントを残さないと情報の欠落が発生するというようなことが書かれています。たしか。
言葉足らずな文章が理解しにくいのと同じように、コードから読み取れない重要な情報はコメントとして残されていないとロジックの意図が捉えられず、ほとんどの人にとって可読性が低下してしまうため、こういったところは進んで指摘をするようにしています。
複雑度に起因する可読性の低下は指摘する
先日 fukabori.fm の認知負荷回を聞いてとにかく最高だったのですが、 fukabori.fm で語られていたように人の認知リソースは限られており、認知リソースを多く必要とするコードは全ての人にとって可読性がよくないため可能な限り複雑度が低くなるよう努力した方がいいです。
条件分岐を無理なく減らせたり、責務が分割されすぎているクラス群をある程度まとめるような修正は循環性複雑度などの数値の改善につながり、 大体の場合は認知リソースの節約になると思うので極力指摘をするようにしています。
とはいえこちらも、デザインパターンに慣れている人とそうでない人で複雑に感じる度合いが異なるなどメンタルモデルに左右される部分もあるので難しいのですが...
可読性という単語をあまり使わない
最後に、可読性という単語はあまり使わないようにしています。 というのも可読性という単語は便利なのですが抽象度が若干高いため、可読性という単語だけで説明した気になってしまうと意図が伝わらずにレビュイーを困惑させてしまったり手戻りが発生したりといったことに繋がるように思うからです。
可読性を低下させている原因は可読性という単語を使わずに説明可能なことが多いので、より具体的な単語を使って説明する方がコミュニケーションしやすいかなと思います。
おわりに
なんか書いてる間、テンションずっと変だった〜〜〜〜〜〜〜〜〜〜〜
可読性〜〜〜〜〜〜〜〜〜〜〜嫌!