Refactoring for Novices in Java: An Eye Tracking Study on the Extract vs. Inline Methods

本論文は、32 人の Java 初心者を対象としたアイトラッキング実験を通じて、メソッド抽出が単純なタスクではかえってパフォーマンスを低下させる一方、複雑なタスクでは理解を助けることを示し、教育において初心者の段階での過度なモジュール化に注意を促すとともに、静的指標を補完するアイトラッキングの有用性を提言しています。

José Aldo Silva da Costa, Rohit Gheyi, José Júnior Silva da Costa, Márcio Ribeiro, Rodrigo Bonifácio, Hyggo Almeida, Ana Carla Bibiano, Alessandro Garcia

公開日 2026-03-06
📖 1 分で読めます☕ さくっと読める

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

🧐 研究のテーマ:「包丁で切る」か「そのまま使う」か?

プログラミングの世界には、コードを整理する「リファクタリング(リファクタリング)」という作業があります。
特に有名な 2 つの方法があります。

  1. Extract Method(抽出メソッド):

    • 例え: 長い料理レシピの中で、「卵を割って混ぜる」という手順が 5 行も続いているとします。これを**「卵の準備」という見出し付きの小さなカード**に切り取って、別の場所に置きます。メインのレシピには「卵の準備をする」とだけ書かれます。
    • メリット: 全体が見やすくなり、同じ手順を他の料理でも使えます。
    • デメリット: 手順を知りたい時、メインのレシピと「卵の準備カード」を行き来しないといけません。
  2. Inline Method(インライン化):

    • 例え: 逆に、あえてカードを捨てて、メインのレシピの中に「卵を割って混ぜる」という手順をそのまま書き足します。
    • メリット: 一箇所に全てがまとまっていて、行ったり来たりする必要がありません。
    • デメリット: レシピが長くなり、どこに何があるか探すのが大変になるかもしれません。

これまでの常識: 「整理したほうが(Extract Method)いいに決まっている!」というのが一般的な考えでした。名前がつけば、何をするかが一目でわかるからです。

しかし、この研究はこう問いかけました:
「でも、初心者にとって、その『整理』は本当に頭を楽にするのでしょうか?それとも、カードを往復する手間が逆に疲れさせるのでしょうか?」


🔍 実験:目の動きをカメラで追跡する

研究者たちは、32 人のプログラミング初心者に、8 つの簡単なタスク(例:「正方形の面積を計算する」「階乗を計算する」など)を解かせました。

  • A 組: コードが「整理された(Extract)」バージョン。
  • B 組: コードが「そのまま(Inline)」バージョン。

そして、彼らの目の動きを特殊なカメラ(アイトラッカー)で記録しました。

  • 視線が止まる時間(Fixation): 何かを理解しようとして必死に考えている時間。
  • 視線が戻る回数(Regression): 「あ、さっきの行に戻って確認しなきゃ」という、**「あ、間違えた?」「ここ何だっけ?」**という混乱のサインです。

🎭 驚きの発見:状況によって「正解」が変わる!

実験結果は、「タスクの複雑さ」によって真逆の結果になりました。

1️⃣ 複雑なタスクの場合(例:階乗の計算、リストから最大値を探す)

  • 結果: 「整理された(Extract)」バージョンの方が圧倒的に速く、楽でした。
  • 理由: 複雑な計算は、そのまま書くと「何をしているのか」がわかりにくいです。ここで「計算する」という名前付きのカードがあると、初心者は「あ、ここは計算の場所なんだ」と見出しだけで全体像を把握できます。
  • 目の動き: 視線が落ち着き、行ったり来たりする回数が減りました。

2️⃣ 単純なタスクの場合(例:正方形の面積、偶数かどうかのチェック)

  • 結果: 「そのまま(Inline)」バージョンの方が圧倒的に速く、楽でした。
  • 理由: 「面積 = 辺 × 辺」という単純な計算をわざわざ「面積を計算する」というカードに切り出す必要はありません。
  • 目の動き: 整理されたバージョンでは、初心者は**「メインの行」→「カード」→「メインの行」**と、無駄に往復して確認していました。
    • 比喩: 「リンゴを 1 個食べる」という簡単な動作を、「リンゴを洗う」「皮をむく」「食べる」という 3 つのカードに分けて、一つずつ確認しているようなものです。これでは逆に疲れてしまいます。
    • データ: 単純なタスクでは、整理したバージョンの方が完了時間が 166% も長くなり、視線が戻る回数(混乱)が200% も増えました

💡 重要な教訓:「名前」は万能ではない

これまでの研究では、「意味のある名前(Beacon/ビーコン)」があれば、初心者はそれを頼りにコードを理解できると考えられていました。
しかし、この研究は**「初心者にとって、名前は万能ではない」**ことを示しました。

  • 初心者の特徴: 彼らは「名前」を見て「あ、これは計算だ」と推測するよりも、**「中身を全部読んで確認する」**という慎重なアプローチを取ります。
  • 結果: 単純なコードをわざわざ別に分けると、その「確認作業」のために、「メインの行」と「別ファイル(カード)」を行き来するコストがかさんでしまい、逆に頭が疲れてしまうのです。

🎓 教育者や開発者へのメッセージ

この研究から得られる教訓は以下の通りです。

  1. 「整理」は魔法ではない: 初心者に対して、すぐにコードを細かく分割(モジュール化)して教えるのは、単純なタスクでは逆効果かもしれません。
  2. タスクに合わせる:
    • 複雑なロジックなら → 名前をつけて整理する(Extract)のが良い。
    • 単純なロジックなら → そのまま一箇所にまとめる(Inline)のが良い。
  3. 教育への応用: 初心者向けのプログラミング教育では、「コードを綺麗にすること」よりも、「まずは一貫して読みやすくすること」を優先すべき場面があるかもしれません。

🌟 まとめ

この論文は、「整理整頓は良いことだ」という常識が、初心者にとっては「過剰な整理」になって、逆に頭を混乱させている可能性を、目の動きという「証拠」で突き止めました。

**「料理のレシピ」で言えば、「複雑な料理なら手順をカードに分けるのが親切だが、卵を割るだけの作業なら、そのままレシピに書いておいたほうが、初心者は楽に作れる」**という、とても人間らしい発見だったのです。