メンタルモデルがプログラミング言語の学習に与える影響
はじめに
- 本記事では JavaScript のプリミティブ型を例として使用しており、動作方式は他のプログラミング言語と異なる場合がある。
- プリミティブ型の動作方式はオブジェクトや配列の動作方式とは異なり、ここではプリミティブ型のみを例として扱う。
メンタルモデル(Mental Model)とは何か
メンタルモデルとは、物事がどのように進展するか、あるいは物事がどのように動くのかを予測する認知プロセスのことだ。
少し学術的に聞こえるかもしれないが、例えば画面上にボタンの UI を見たとき、僕たちはこの UI がクリック可能で、クリックしたら一連のイベントが起こると予想する。そのため、ユーザーはこの UI が期待通りに動かないと困惑する。
しかし、なぜ僕たちはこのような UI をボタンだと認識するのだろうか? 一つには僕たちが置かれている環境によるものであり、もう一つは経験によるものだ。ユーザーはウェブに触れ始めてからずっとこのようなルールに従ってボタンを判断しており、そのため自然と他のウェブページにもそれが適用される。
例えばこのノブ(つまみ)を見て、なぜ僕たちは最初に押すことではなく回すことを思いつくのだろうか? 日常生活において、円形の機構を持つものの多くは通常、回転させることで調整を行うため、僕たちはそのルールを他の場所にも当てはめているのだ。

あるいはドアのレバーハンドルもそうだ。なぜ僕たちは回して開けようとせず、ハンドルを押し下げようとするのだろうか? これもハンドルの仕組みに対して一定の認識を持っているため、押し下げればドアが開くと予測するからだ。

プログラミング言語を学ぶ際にも、学習が進むにつれて言語の動作に対してメンタルモデルが形成され、頭の中でコードをコンパイルし、どのように実行されるかを予測するようになる。
メンタルモデルの重要性
ここでは JavaScript のコードを例に挙げる。
let a = 3;
let b = a + 3;
a += 1;
console.log(b); // b
これは非常に基本的な JavaScript コードだ。経験のある人なら答えが何であり、どこに罠があるかをすでに知っているだろう。仮に今日、誤ったメンタルモデルでこのコードを描き出すと、次のような結果になるかもしれない。
1. a+=1 が実行される前:

2. a+=1 が実行された後

自然な流れとして、a+1 されたため、円の中の 3 を 4 に書き換える。
b = a + 3 なので、a が変化した以上、b が指し示す円も 7 になるはずだ。そのため、正しく理解していない人からすると、ごく自然に「7」と答えてしまう。
強調しておきたいのは、答えは間違っているものの、僕がこれが完全に学習者のせいだとは思わないということだ。通常の思考パターンからすれば、b = a + 3 を数式のように捉えていれば、その後に a+=1 となれば、当然 b も一緒に変化するはずだと考えるからだ。
一度学習者にこうした思考パターンが定着してしまうと、その後の学習でそれを修正するのが極めて難しくなり、自分では説明のつかないバグに遭遇しやすくなる。
どこに問題があったのか?
JavaScript においてプリミティブの値を変更することはできない。この言葉は一見短いが、初学者にとってそれが本質的に何を意味しているのかを理解するのは至難の業だ。
正しい動作方式は次のようになる:

いかなるプリミティブ型も値を変更することはできないため、円の中の 3 を直接 4(3 + 1)に書き換えることはできず、新たに 4 という数値を生成して、a の矢印をそちらに向ける必要がある。元の 3 は変更されない(青い円)ため、a の値がどう変化しようと、b の結果には何の影響も及ばない。
教科書的な「JavaScript におけるプリミティブ値は不変(immutable)である」という記述を引用するよりも、僕はむしろこのような形で説明することを好む。そのほうが理解の助けになり、実際に JavaScript コードが動作する仕組みそのものだからだ。よく見てみると、2つのモデルは非常に似通っているが、決定的な違いは学習者が JavaScript のプリミティブ値の特徴と動作原理を理解しているかどうかにある。
様々なケースに応用できるかどうかはメンタルモデルにかかっている。もし学習者が最初のメンタルモデルを使い続けていると、学習の過程で「primitive type は immutable である」という言葉を目にしたことがあったとしても、やはり誤った結論に至りやすくなってしまうのだ。
関連記事
- 測定が目標になるとき:窓税からPull Request数まで かつて僕は小さなツールを自作し、四半期で自分がどれだけPRに貢献したか、レビューコメントをどれだけ残したか、チケットをどれだけ消化したかを集計して、上司にアウトプットを証明しようとしたことがある。上司は淡々と、評価はアウトプットだけで見るものではないと言った。数年後、僕はようやく理解した――測定が目標になるとき、それはもはや良い測定ではなくなるのだ。英国の窓税、ハノイのネズミ駆除の報奨金から、現代のPR数による開発者評価に至るまで、そのメカニズムはまったく同じだ。
- Cloudflare Images を画像ストレージ・変換ソリューションとして使う ウェブページに画像を1枚置くのはフロントエンドにとって最も簡単なことだが、リサイズや各種フォーマットの生成、さらにはトラフィックの負荷に耐えることまで完璧にやろうとすると、実際には一つの包括的なソリューションが必要になる。僕はその後、すべて Cloudflare Images に任せるようになり、オリジナル画像1枚だけを渡すようにしている。
- もう AWS Access Key を使うのはやめよう Access Key は AWS において見落とされがちなセキュリティリスクだ。OIDC と IAM Role を組み合わせることで、GitHub Actions にシークレットを一切保持させることなく、安全に AWS リソースを操作できるようにする。
- データベース主キー:AUTO_INCREMENT、UUID、そしてUUIDv7 バックエンド開発で度々直面する主キーの決定。auto incrementを使うべきか、それともUUIDか?衝突への懸念は?UUIDv7とcreated_at + インデックスの性能差はどれほどか?実際に2,000万件のデータで検証したベンチマークと設計上の意思決定を解説する。