一言まとめ
認知プロセスの観点から読み方を学ぼう。
注意事項
この記事はiOSDC 2023でshizさんが発表された「複雑さに立ち向かうためのコードリーディング入門」の一部を松本が自分なりの理解を含めてテキスト化したものです。
こちらの記事の公開を許諾をしていただいたshizさんに感謝します。
発表スライド
shizさんが共同著者(翻訳)の本
Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考
3つの認知プロセス
物事を理解する際、3つの認知プロセスが連携する。
短期記憶
・長期記憶
・ワーキングメモリ
-
短期記憶
に新しく取得した情報をキャッシュする。 -
長期記憶
から関連する情報を検索する。 -
ワーキングメモリ
*は短期記憶のキャッシュと長期記憶の検索結果を紐付けるといった作業をする。
*(メモリとついているが記憶ではなく処理を担当する機能。)
3つの困難さの原因
コードを理解する際の困難は3つの不足から生じる。
キャッシュした情報の不足
・長期記憶の検索結果の不足
・処理能力の不足
キャッシュした情報の不足
キャッシュした情報が不足する原因
は短期記憶は4〜7項目を30秒程度しか保持できずキャッシュに限界があるため。
キャッシュした情報の不足を解消する
には、情報を細切れの状態ではなく一つのまとまり(チャンク)として捉えることでキャッシュを容易にすると良い。
例:
- c, a, t, s, l, i, k, e, f, i, s, h という12字を覚えるのは困難だがcats like fishという3単語は容易。
- ViewModelと言う概念を知っていたら、あるクラスがViewModelのとき、それのおおよその役割がわかる。
なお情報をチャンク化して認知するにはそのパターンが長期記憶に保存され、それに慣れている状態である必要がある。
長期記憶の検索結果の不足
長期記憶の検索結果が不足する原因
はそもそも記憶されていないか、検索に時間がかかりすぎているから。
長期記憶の検索結果の不足を解消する
には長期記憶の保存強度
と検索強度
を高めると良い。
保存強度
はどれだけ長く記憶できるか。
検索強度
はどれだけ速く検索できるか。
上記2点を意識しつつ以下4点をすると良い。
- 定期的に情報に触れる
- 複数の感覚で学ぶ(視・聴・嗅・味・触)
- チャンク化して認識する
- 深掘りし関連情報も記憶することで
スキーマ
*を強化する
*スキーマとは類似する記憶同士の結びつきのネットワーク構造のこと。
処理能力の不足
処理能力が不足する原因
は処理能力に対して負荷が大きすぎるから。
処理能力の不足を解消する
には処理の負荷を減らすと良い。
処理の負荷(認知負荷)は3つに分類できる。
学習関連負荷
・課題内在性負荷
・課題外在性負荷
-
学習関連負荷
は長期記憶する際の負荷。 (軽減は困難) -
課題内在性負荷
は問題本来の難しさによる負荷。 (軽減できる。例:複雑な数学的処理) -
課題外在性負荷
は問題と無関係な負荷。 (軽減できる。例:特定の実装の複雑さ)課題内在性負荷を削減するには
例えば「状態遷移図を書き、場合分けすることで一度に考慮すべき事象を削減する」といったように、問題そのものの複雑さを分散する。
課題外在性負荷を削減するには
、例えば「自分の読みやすいコードに変える(例:map -> for in)」といったように、問題を取り巻く複雑さを軽減する。
上記の認知プロセス及びその負担の軽減方法を踏まえて、コードの意図が掴めない時
は以下を心がけると良い。
コードの意図を掴む手法
- コードの全体的な雰囲気を掴む(例:全体を流し読みして直後に思い出すよう試みることでチャンク化して認知できたか確認する)
- 重要な点を列挙する(着目すべき点を制限することで問題を取り巻く複雑さを排除する。)
- 点から理解を拡げる(例:変数の役割という一点から考えることで問題を取り巻く複雑さを排除する)
- 視覚化する(例:依存関係図や状態遷移図など)
- 内容を要約する(例:ソースドキュメントを書く)
- …
認知プロセス全体に有効な施策
- 余計な情報を遮断する。(例:机上は整理する。静かな環境を作る。作業中に𝕏しない。)
- 割り込みを低減する。(例:集中タイムを作る。一人で作業する。通知を一定時間切る。)
- 割り込みからの復帰を容易にする。(例:コンパイルエラーにしておく。メモを残す。問題を分割することで思い出すべき量を低減する。)