プログラミングを上達させているのは「プログラムを書く」ことではない

それは、「プログラムを動かした結果を考察する」ことである。

 

この事実はプログラミングの学習高速化にとって致命的に重要な事実であるが、驚くほど認識されていない。私自身もプログラミングを本格的に学び始めて、約2年経った今日にやっと明確に認識できた。

 

この事実は数々の指摘を含んでいる。

  • コンパイラよりもインタプリタを使ったほうが学習が早い。
    (∵結果を考察する回数が増えるから。)
    irb, python, JavaScriptコンソール, ocaml
    C++はClingのような不完全なインタプリタしか存在しない点で非常に学習に向いていない。
  • インタプリタが実質存在しない言語でも、結果が表示されるまでのインタラクトの時間を短縮すればよい。
    たとえば結果を見るまでに5個のコマンドを実行する必要があるなら、それを1つのコマンドにまとめてしまって、自分が今動かそうと思っているプログラムの結果とそのソースコードの関係以外について考える時間を0に近づける。これが「結果を考察する回数」を増やす上にその1回1回の質を高めることに繋がる。
  • 文法についてググっている瞬間は全く別の作業をしているに等しい。できる限り、ググった中で「結果を考察できそうなコード」を探して動かし、結果を出したあとに記述を読むべき。結果さえ分かれば、そこからどんな文章が書けるのか分かるはずで、それ以外の文章が書かれていたらそれは書き手の妄想に過ぎない。
  • 自分が書いていないプログラムでも、結果が考察できれば学習に役立つ。
    たとえばautoconfやconfigure(中身は単なるシェルスクリプト)、makeやsudo make installと言ったプログラムについて車輪の再発明をすることはないが、数行足して出力ファイルの違いを見て、といったことで実用可能なレベルの知識は身に付くはず。
  • ソースコードを読むという行為でプログラミングについて何か学べるとするなら、それは「1.自分が既に知っている『動かした結果』について、その結果をもたらした部分を知る」もしくは「ソースコードをわずかにいじってその前後でのアウトプットの変化を見る」ことによる。この後者は全く「プログラムを動かした結果を考察する」と同じ行為で学んでいる。この瞬間こそをインタプリタ化できないか?

 

 

「1000時間、一度もコンパイルせずにソースコードを書き続けた場合」
「1000時間、一度もソースコードを書くことはせず、インタプリタだけを使った場合」
後者のほうが身についている物は確実に多いだろう。たとえ複数行にわたる関数を定義する経験が少なくとも。

前者はセミコロンに対する感覚すら身についていないだろうと予想される。

 

「自分が認識した範囲で行った変更」(=ソースコードを書く、環境変数など設定変更を行う)の後にプログラムが何を返すか、という2つの情報の組(tuple)こそが、学習で蓄積しているデータ、学習データだろう。

 

それ以外のこと、検索結果にいいのが出てこない、実行するまでにロード時間が必要、エディタが使いづらい、ウィンドウの切り替えが煩雑、などの種々は、排除すべき夾雑物に過ぎない。