孤独にそっくり

開いている窓の前で立ち止まるな

「プログラミングする」人々

端的に言って、「プログラミング」って言葉をやめたほうがいいと思う。
「プログラミング」を勉強したいなと思って、何をしたらいいのかわからない理由は、「プログラミング」が難しいからじゃなくて、この言葉自体があいまいすぎるからだと思う。
現に自分がそう。

「プログラミング」ってほぼ「国語」だとおもう。
ひとまず、「国語」について

国語、特に現代文の時間に扱われる内容というのは以下のように分類できるだろう。

  1. 日本語の文法、語彙
  2. 修辞技法(レトリック)
  3. 論理的な読解能力(ロジック)
  4. 作文
  5. 名文の観賞

レトリックとロジック、またはどうしてみんな国語が嫌いなのか - 電波塔

この記事は、レトリックとロジックの問題を扱っているけど、今回自分が言いたいことに問題の構造は似ている。

プログラミング的に言えば、

  1. 文法、語彙(=プログラミング言語の仕様、関数名等の知識)
  2. 修辞技法・レトリック(=もう少し抽象的なイメージ。例えば値の代入やオブジェクト指向、条件分岐などの基礎的な概念の理解)
  3. 論理的な読解能力・ロジック(=問題解決の手順。アルゴリズム含む)

結局この三つが曖昧なまま問題を「プログラム」しようとするとひどい目にあう。
あと、特定の言語を勉強しようとするときの「プログラミング入門」に対する違和感の元凶はここにある。

例えば、「"Hello world!"と10回表示してください」という課題が与えられたとする。
よくわからないけど、たぶん二通り書ける。

#ふつうのループ
for j in range(10):
     print "Hello world!"

#再帰関数
def h(i):
     if i == 0:
        return
     print "Hello world!"
     return h(i-1)

この時、本当なら順序として
ロジック:「10回表示する」→10回繰り返せばいいんだ
レトリック:10回繰り返すに繰り返しの構文や再帰関数を使えばいいんだ
文法、語彙:Pythonならfor文(foreachやdo-whileではなく)を使えばいいんだ。もしくは、再帰関数をこうやって書けばいいんだ
みたいに思考するはず。
きっと、難しいプログラムを組むときはそう考えるはず。
けれど、「プログラミング」を勉強しようとすると、ロジックやレトリックをすっ飛ばして
「for文を使って書けばいい」みたいな結果だけ示す場合が多くて、腑に落ちないし意味も分からない。

ロジックに関しては、アルゴリズムの勉強が必要だなと思ったりする際に勉強するかもしれないが
レトリックに関しては、無意識化で意思決定をしているんだろう。
プログラミングをする際に「真似」する必要があるのは、そのためだ。

つまり、大量にコードを書いて「何となく」レトリックを学習していかないと、プログラミングが出来ないことになり、すごく面倒くさい。
というか自分はそれがやりたくない。
もっと体系化された何かがないのかって思ってる。

「プログラミング入門」みたいなものは、結局文法書でしかなくて、それ自体をどう組み合わせるかは教えてくれない。
それぞれ、ライブラリにパッケージ化する試みはロジックの面倒くさい部分は吸収してくれるけれど、レトリックが抜けているから
初心者からしたら結局ちんぷんかんぷん。
どう使っていいのかわからない。

プログラミングできるようにならない人(自分とか)にノウハウがなかなかたまらない問題は、そこらへんの学習環境の悪さを改善すればどうにかなるんじゃないかな。
プログラミングが得意な人って決してめちゃくちゃ頭がいいわけじゃなくて、
プログラミングが楽しくてコードをたくさん書き、そこらへんの充て勘が蓄積されていくから得意になるんだと思う。

要は、「プログラミング」したいけど、出来ないという独白。
非ロジカルで非レトリカルな文章で、書いていて嫌になったからひとまず終わり。
「国語」すらもできないのでやっぱり口をつぐんで何もしないほうがいいのかもしれない。
頭の悪い自分にイライラしてしまうより、何も考えないほうが楽なのだから。