The Effect of Code Obfuscation on Human Program Comprehension

この論文は、コード難読化がプログラムの出力予測タスクにおける人間の理解に与える影響を調査し、難読化が一般的に処理時間と誤答率を増加させるものの、その効果は言語(JavaScript と Python)や難読化の強度によって非単調に変化し、経験豊富なプログラマでも言語固有の親和性に強く依存することを明らかにした。

Anh H. N. Nguyen, Jack Le, Ilse Lahnstein Coronado, Tien N. Nguyen

公開日 Tue, 10 Ma
📖 1 分で読めます☕ さくっと読める

Each language version is independently generated for its own context, not a direct translation.

🕵️‍♂️ 実験の目的:「読みにくいレシピ」で料理ができるか?

研究者たちは、プログラマーに「このコード(レシピ)を実行すると、どんな結果(料理)が出るか?」を予想させるテストを行いました。

通常、プログラマーはコードを見ると、変数名(例:total_price)や構造から「あ、これは合計を計算するんだな」と**直感(システム 1)**で即座に理解します。
しかし、研究者たちはこのコードを以下のように「いじくって」みました。

  1. 名前を無意味にする(例:total_pricevar_x
  2. 名前を嘘をつく(例:total_priceuser_name と書くが、実際は合計を計算している)
  3. 手順をぐちゃぐちゃにする(例:「まず A、次に B」を「B をするかどうかは、A の結果次第で、でも A は C の後」のように複雑にする)

そして、**「正解できるか?」「どれくらい時間がかかるか?」**を Python と JavaScript という 2 つの言語で比べました。


🔍 実験で見つかった 4 つの驚きの事実

1. 「難易度アップ」は必ずしも「正解率ダウン」ではない

一般的に「コードを難読化すればするほど、人間はバカになる(正解率が下がる)」と思われています。
しかし、実験結果は**「言語によって違う」**という意外な結果でした。

  • JavaScript(料理のレシピ):
    名前を無意味にしたり手順をぐちゃぐちゃにすると、正解率はガクンと下がりました。JavaScript の人は「名前」や「手順の並び」に頼りすぎていて、それが崩れるとパニックになったようです。
  • Python(料理のレシピ):
    なんと、「名前を無意味にしたほうが、逆に正解率が上がった」ケースがありました!
    🍳 アナロジー:
    元のレシピに「美味しいカレー」と書いてあると、人は「あ、カレーを作るんだな」と
    思い込み(直感)で早とちりしてしまいます。
    しかし、名前を「変数 A」にすると、「美味しいカレー」なんていう誘惑が消えるので、人は
    「えーと、この手順は本当にカレーを作ってるのか?」と慎重に手順を追う(論理的思考)ようになります。
    つまり、
    「名前という罠」を消したおかげで、人はより慎重になり、結果として正解しやすくなった
    のです。

2. 「速い人」は間違えやすく、「適度な遅さ」が最強

実験では、回答にかかった時間を測りました。

  • 速すぎる人(0〜1 分): 直感で答えて、間違えることが多い
  • 遅すぎる人(10 分以上): 頭が混乱して、**「もうわからない」**状態になっていることが多い。
  • 適度な遅さ(2〜5 分): **「金髪(Goldilocks)ゾーン」**です。
    直感を捨てて、慎重に手順を追う(システム 2 の思考)のに最適な時間です。ここが最も正解率が高くなります。

🧠 アナロジー:

  • 速い人は「見たことあるから、きっとカレーだ!」と即答する人。
  • 遅すぎる人は「あれ?この手順、カレーだっけ?パンダだっけ?」と頭がぐるぐるして迷子になった人。
  • 適度な人は「うーん、材料と手順を一つずつ確認しよう」と冷静に調理している人。

3. 「経験者」は逆に失敗しやすい?

「プログラミング歴が長い人」は、いつも「速い直感」に頼りすぎていました。
コードが少しだけ変な名前(嘘の名前)に書き換えられると、経験者は**「あ、これはいつものパターンだ!」と直感で答えてしまい、罠にはまって間違えました。**

一方、**「初心者」**は直感が働かないので、最初から「えーと、何してるんだっけ?」と慎重に手順を追うため、逆に罠に引っかかりにくかったのです。
🎭 アナロジー:
ベテランの料理人は「これ、いつものカレーの作り方だ!」と早とちりして、塩を入れすぎたりします。
初心者は「レシピに書いてある通りに一つずつ確認する」ので、変な名前(罠)があっても、手順通りに進めば正解にたどり着けることがあります。

4. 言語によって「弱点」が違う

  • JavaScript: 「名前」や「見た目」に頼りすぎているため、名前をいじられると非常に弱くなります。
  • Python: 「名前」に頼りすぎているため、名前を消すと逆に冷静になり、強くなります。

💡 この研究から学べる教訓

  1. 「難読化」は万能ではない
    単にコードを複雑にすれば安全になるわけではありません。言語や、それを見る人の「癖」によって、逆効果になることもあります。
  2. 人間は「直感」と「論理」を使い分ける
    人間は普段は「直感(システム 1)」で動きますが、コードが読みにくくなると「論理(システム 2)」に切り替わります。しかし、切り替わるのに時間がかかりすぎると、逆に混乱して失敗します。
  3. ツール開発へのヒント
    将来のプログラミング支援ツールは、「このコードは直感で誤解しやすいから、慎重に確認しよう」と教えてくれたり、複雑な手順を整理して見せてくれたりするべきです。

📝 まとめ

この研究は、**「コードを難読化すると、人間はバカになる」という単純な話ではなく、「人間は、罠に気づくために、あえて慎重になることもある」**という、人間の頭の面白い仕組みを明らかにしました。

「速く答えること」が正解とは限らず、**「一度立ち止まって、手順を丁寧に追うこと」**が、実は一番の近道だったのです。