「マジカルナンバー4」とは、人が短期記憶で一度に保持できる情報が4±1チャンク程度だとする認知心理学上の考え方である。
この考え方はプログラミングに応用できる。 一度に把握しなければならない情報が少ないコードほど理解しやすい。 本稿では、 「一度に把握すべき情報を4個程度に抑える」 という原則を提案する。
マジカルナンバー4と認知限界
マジカルナンバーとは人間が短期記憶に保持できる情報の数だ。 マジカルナンバーは「7±2」だったり「4±1」とするような説があったらしいが、 今では「4」の方が有力らしい。
数字の形は3と4の間で変わる。 漢数字は一・二・三、現代のローマ数字はI・II・IIIと線を増やすが、4からは四・IVという別の表現になる。 アラビア数字の1・2・3も一・二・三を繋げたような形だが、4から急に趣が変わる。
このように、意外にも人間が把握できる情報量は少ない。 聞き慣れない概念や業務内容についての話が理解しづらいのも当然だ。 同様に巨大なメソッドやクラスも理解しづらい。
情報のかたまり「チャンク」
ヒトは高々4個程度の情報しか一度に扱えないらしい。 あれ?おかしくないだろうか。 それにしてはコミュニケーションが高度過ぎやしないか。 ちょっとした短文でも大量に情報がやり取りできる場合もあるし。
チャンクとは「情報のかたまり」のことで大小さまざまだ。 大きいチャンクを用いることで、少ない単位で多くの情報を扱える。
チャンクを大きくする例:電話番号
電話番号は11桁程度の数字の羅列だ。 すでにマジカルナンバーを超えてしまっているので、 ヒトが電話番号を覚えるのは容易ではない。 そこで「xxx-yyyy-zzzz」みたいに番号を3つにグルーピングする。 つまり、11個の数字をマジカルナンバー以下の3つのチャンクにまとめると把握しやすくなる。
プログラミング言語はチャンクを大きくするための仕組み
プログラムの一番低級な表現は機械語(0と1のビット列)である。 無機質なビット列はすぐにマジカルナンバー以内で扱いきれなくなる。 人間には理解困難であり、まさに機械のための表現だ。
そこで人間が理解し易い表現が要請された。 そして発明されたのが高級言語、いわゆるプログラミング言語だ。 高級言語はリーダブルに書けるようにしてくれる。
故に、高級言語(特にオブジェクト指向言語)では、大きなチャンクを扱うための抽象化機能が提供されている。
- データ型(プリミティブ型)
- 関数
- クラス(or 自作データ型)
- インターフェース(or 抽象クラス)
たとえば、32ビットの整数型は、32個のビットを一つの整数として扱えるようにしてくれる。 関数は複数の手続きを1つにまとめる。 クラスはデータと手続きを1つにまとめる。 インターフェースは個別の具象クラスを同一視する。
ただし、機能を使うだけで分かりやすいコードになるわけではない。 一度に把握する情報を減らせているか、という観点が必要だ。
例:引数の多い関数・メソッド
引数が4、5個ある関数は、使うために覚える情報が多くなりやすい。 引数の順序や意味を何度も確認するようなら、関連する値を一つの型にまとめられないか検討できる。
関数を使うときには、少なくとも次の情報を把握する。
- 関数名
- 引数の意味と型
- 返り値の型
引数が増えるほど、同時に意識するチャンクも増える。 ただし、「引数は必ず3個以下」のような機械的な規則にする必要はない。 重要なのは、利用者が一度に把握する情報量を抑え、意味のある単位にまとめることだ。
良いコードへの応用
マジカルナンバー4は、コードを数字だけで判定する規則ではない。 長い処理を関数へ分け、関連するデータを型やクラスへまとめ、適切な名前を付ける。 そうして複数の細かな情報を意味のあるチャンクへまとめることが、理解しやすいコードにつながる。