プログラマーはソースコードを書くより読むことに6割の時間を費やしている。
コードレビューをすることが多くなったので、うってつけの本でした。
認知科学に基づくアプローチとありますが、そんなに眠くなるような脳のややこしいメカニズムの話はありません。
長期記憶、短期記憶、ワーキングメモリという概念から、コメントを書くことで効率よく脳を使う手法を紹介されています
フラッシュカード
苦手な文法はフラッシュカードで覚える。
ぼくの場合。C#のLINQでindex付きでSelectする場合ですね
var a = b.Select((value,index) = new {Value=value,Index=index});
ですね。これ癖があって、index,valueではなく順番が逆ですので
using System; using System.Linq; public class Program { public static void Main() { var b = new []{ "dog","cat"}; var a = b.Select((value,index) => new {Value=value,Index=index}); foreach(var item in a) { Console.WriteLine(item.Index + " - " + item.Value); } } }
ワーキングメモリ
PythonにはPythonTutorというワーキングメモリの働きをサポートするアプリケーションがあります。
array = [45,12,85,32] for i in range(1,len(array)): for j in reversed(range(0,i+1)): if array[j] < array[j-1]: temp = array[j] array[j] = array[j-1] array[j-1] = temp for i in array: print(i)
なれない言語でソートプログラムを書いてみましたが、そこそこ使えるという感じですかね。
array[j]とかの値もみたいなとも思ってしまったので、デバッガの方が優れた点もあります。
変数の11の役割
ほぼ全てが以下の役割に分類されると言います。
- 固定値
- ステッパー ... for文のi
- フラグ
- ウォーカー ... 2分探索のように走査するのに使う
- 直近の値の保持者
- 収集者 ... 合計値などを算出するために使う
- コンテナ ... 複数の要素を内包する配列やリストなど
- フォロワー ... 前や次の値を保持して後から参照する
- オーガナイザー ... 処理をするために何らかの方法で変換するための値
- テンポラリ ... 一時変数。swap関数で二つの値を入れ替えるときなどに使う。
書いてみると、それだけかという気もしますね。
命名
命名は難しく、2人の開発者が同じ命名を行う確率は非常に低いようです。
Eclipseのソースコード200万行の中で、そのトークンのうち33%、文字にした場合は72%が識別子だそうです。
レビューの4件の1件は命名に関する指摘であった調査があります。
キャメルケースかスネークケースかみたいな機械的にできる命名規則については、さておき、命名はプログラミングの理解を助けるものであること。
単語は略した方がいいのか、略さない方がいいのかという点については、個人的には略すのは人によって解釈が違うから、strとかはダメと思って(textにする)いたのですが、略さない長い単語は短期記憶の妨げになるため、そこを踏まえて判断が必要だそうです。