Open10

プログラマー脳 ~優れたプログラマーになるための認知科学に基づくアプローチを読んで

GOD-oda(t.oda)GOD-oda(t.oda)
  • コードはさまざまな種類の混乱を起こすことがある
    1. 知識不足
    2. 情報不足
    3. 処理能力不足
  • それぞれには原因がある
    1. 知識不足→長期記憶に起因
      • そもそも知らんってやつ
    2. 情報不足→短期記憶に起因
      • 知ってはいるけどなんだっけってやつ
    3. 処理能力不足→ワーキングメモリに起因
      • コメントとか入れながらじゃないと進めないってやつ(要するに脳内だけで理解するのが難しくなってる状態)
GOD-oda(t.oda)GOD-oda(t.oda)

人は長期記憶、短期記憶、ワーキングメモリは認知プロセスの種類で、この3つが相互作用することで目の前のコードが何をしているかを理解する

GOD-oda(t.oda)GOD-oda(t.oda)

認知するプロセスは次のようになる

  1. どんなプログラミング言語で書かれているかなどは長期記憶から引っ張り出し
  2. 例えばJavaで書かれたコードで.toBinaryString()が何をするのかや今見ている変数nは何を意味しているかは短期記憶から引っ張り出し
  3. ループ処理などコードが何をやっているかはワーキングメモリで処理する
GOD-oda(t.oda)GOD-oda(t.oda)
  • 長期記憶はHDDのようなもの
  • 短期記憶はRAMのようなもの
  • ワーキングメモリはプロセッサのようなもの
GOD-oda(t.oda)GOD-oda(t.oda)

プログラマーの費やす時間のうち60%は理解すること(書くことではない)

実感している

GOD-oda(t.oda)GOD-oda(t.oda)
  • 短期記憶は30秒ほどしか保持されない
    • 30秒を過ぎたら長期記憶に移動されるか永久に消滅するか
    • 時間だけでなくその容量もごく僅か
    • これはほとんどの人間に当てはまる

電話越しに言われた電話番号を覚えておけないと思うと確かにそうだな(大抵紙にメモるし)

GOD-oda(t.oda)GOD-oda(t.oda)

短期記憶に関する実験が面白い

実験した人

デ・フロート

実験

  • チェスの平均的プレイヤーグループと熟練プレイヤーグループに対して、ある時点の盤面を数秒間見せた後に再現したもらう(1回目)
  • 2回目に非現実的なランダムに配置された盤面で再現してもらう

結果

再現率を見ると、1回目は熟練プレイヤーの方が高く、2回目はどちらも低いという結果になった

熟練プレイヤー 平均的プレイヤー
現実的な盤面の再現率 高い 低い
非現実的な盤面の再現率 低い 低い

考察

  • この実験をしたデ・フロートは情報の組み合わせを「チャンク」と呼んだ
  • 短期記憶は容量も少ないし時間も短いのにどうしてか
    • 平均的プレイヤーは1つ1つを覚えようとしていたが、熟練プレイヤーはシシリアンディフェンスのオープニング(将棋でいう定石)までを長期記憶から利用し、それ以外の駒は短期記憶から利用した
    • 駒1つの配置を1チャンクとする平均的プレイヤーとシシリアンディフェンスのオープニングを1チャンクとする熟練プレイヤー
    • このチャンクの幅を広げるには長期記憶に情報があることが前提
  • チャンクは多くても6つが限界
  • プログラマーでも同じような実験が行われた
    • 同様な結果となり、これから得られる知見は初心者は熟練者よりもはるかに少ないコードしか処理できないということ
GOD-oda(t.oda)GOD-oda(t.oda)

アイコニックメモリの実験も面白い

実験

  • 3x4のランダムに配置したローマ字を一瞬だけ見せて、どれくらい思い出せるか

結果

75%の確率で指定された行や列のローマ字を思い出せた

指定の例:1列目にあったローマ字は何?

考察

  • アイコニックメモリとは感覚記憶のことで、情報が短期記憶に到達する前の記憶領域
  • 場所も全て覚えていたのはチャンクの限界である6を超えている
  • ではどこで覚えていたのか?→それが感覚記憶
  • 感覚記憶は短期記憶によって処理されるわけではない
  • 理論上、短期記憶で処理される以上の情報を記憶できる
GOD-oda(t.oda)GOD-oda(t.oda)

「覚えてチャンク化」する練習を繰り返せばチャンク化するのに適したコードが直感的にわかる

チャンク化しやすいコードを書きたいならデザインパターンを活用する

P53
デザインパターンとチャンク化の実験