初級プログラマ最短作成方法

shiroさんの日記から、もう一個。

プログラミングを基礎から、しかも手っ取り早く身につけるにはどんなコースが良いだろう。

まずは、Unix環境でOSの概念とCの基礎を身につける。低レベルのインタフェースまでブラックボックスになってしまっているのは、学習環境として好ましく無いからだ。本を一冊、私が思い当たるのは、ちょっと古いが Kernighan&Pikeの"Unix Programming Environment" かな。これは大して分厚く無いくせに、一冊でUnixの基礎からシェルプログラミング、システムプログラミングのさわりやら構文解析やらまでカバーして、おまけにUnixの基本思想がわかるというお得な内容だと思う。最近のunixに慣れた目には古くさく映るかもしれないが(emacsperlも無し。ネットワーク関係も弱い)、基礎を学ぶにはこのくらいシンプルな方が良いのではないか。 (同じくらいの範囲をカバーして、最近の技術にも触れた本って出ていないのでしょうか。ご存知の方いましたら教えて頂ければ幸いです)。

これに、リファレンスとしてKernighan&Ritchieの "The C Progamming Language" を揃えて、Unix boxを一つ見付けて一ヵ月も遊んでいればだいたいの仕組みはわかる。もうsedawkで住所録を作り、Cで電卓プログラムを作るくらいは出来るようになってるはずだ。 yaccとlexで簡単なインタプリタトランスレータも作れるはず。オープンソースのコードを拾って来て読んで参考にしよう。emacsは同時進行で覚えておく。

次にPerlとHTML (今なら、sed, awkをすっ飛ばしてperlに行ってしまっても良いのかもしれない)。テキスト形式のデータから様々なWebpageを自動作成できるようになるだろう。こまごまとしたコマンドラインツールをPerlで作ってみよう。正規表現で寝言が言えるようになろう。動的データ構造を使ったアルゴリズムをいろいろ試してみよう。 CPANからコードを落して、ソースを読んでみよう。一ヵ月。

それからネットワークだ。スクリプティング言語で手軽にネットワークアプリが作れる時代だが、一応低レベルのソケットインタフェースはCでやっとかないと却って分かりづらい。いきなり高レベルのから始めてしまうと、トラブルの際にどうしたら良いのかわからなくなる。簡単なクライアントとサーバを作る。サーバ側ではdaemonにするためのテクニックやinetdの仕組みなんかも学べる。一ヵ月。

ここでCGIとHTTP。もうプロセスの概念はわかっているだろうから、パーミッション関係のトラブルなんかは見当が着くだろう。RFCの読み方もわかっているだろうから、何で最初にContent-Type:が来て、何で空行が必要かもわかるだろう。要するに、これまでの知識の上にちょいと積み重ねるだけである。Webの世界は他にもいろいろ目新しいテクニックが溢れているが、基礎が分かってればすぐに追い付けるので、あまりそっちを追っかけない方が良い。最近はオープンソースのデータベースサーバなんかがあるので、CGI内からSQLサーバにソケットで繋いでデータをやりとりしてみても面白い。 HTTPを学んで検索ロボットを作ってみても良い。一ヵ月。

そろそろ見た目カッコ良いGUIが作りたくなってきたか。ネットワークとは逆に、GUIは高レベルのスクリプティング言語で始めることを薦める。イベントドリブンの概念は高レベルの言語でも変わらないし、低レベルでは余分な約束事が多すぎて学習効率が悪い。せっかくPerlをやったんだからPerl/Tkを始めてみても良し。色んな言語を知りたければPython/Tkを始めてみるとか、カッコつけたければ Scheme+TkであるSTkをやってみても良い。見た目を追求したければGtkだ。 Unixの世界でもインターフェースビルダがいくつか出て来ているが、最初は全部コードで書いた方が良いだろう。インタフェースビルダを使うと、ジオメトリの管理なんかがわかりづらい。既にUnix的思考法に慣れているはずなので、簡単なインタフェース記述からソースコードを自動生成してみるなんてことももう自然に出来るはずだ。オブジェクト指向の考え方も身につけよう。一ヵ月。

これまでで、ひととおりのことはわかるようになったと思う。ここまで来たら、今までちょっとづつかじって来たものの背後にある一般的な理屈に目を向けても良いかもしれない。言語処理系の原理だとか、OSの基礎概念、様々なネットワークプロトコル。具体例を知っているから、分かりやすいはずだ。そして、一度一般化出来れば、新しいシステムを学ぶのはうんと楽なはずだ。例えば、新しい言語を学ぶ必要が出て来たら、ちゃんとした本 (普通はその言語の開発者が書いたものが良い) を一冊買って来て斜め読みしながらいくつかプログラムを書いてみれば、すぐにそこそこ使えるようになるだろう。オープンソースのプロジェクトに参加して、良質のコードをたくさん読み、大きなシステムの設計法を覚えよう。共同作業を円滑にするためのコーディング慣習やドキュメントの書き方も学べるだろう。一ヵ月。

以上半年で初級プログラマの出来上がり。

こうやって見てみると、shiroさんは[id:emeitch:20050503]でいう、「2.システムのノウハウ」から始めるのを重視している気がする。

さきほどの、ボトムアップトップダウン学習で捕らえると、これは効率がいい気がする。いきなり「1.普遍的なノウハウ」を学んでもさっぱりだし、「2.システムのノウハウ」からの類推を狙っていく作戦は悪くない。
「3.雑多なノウハウ」の方が楽しい場合も多いが、量が半端じゃないし、こればっかりやっていては、いつまでたっても「1.普遍的なノウハウ」につながる知識は得にくい。

UNIXがだめな自分だけに、オープンソースを見通すにも、EmacsGDBのような便利ツールが使えないのが現状である。

それらを踏まえ、今後の学習方針として、VSを使っても見られるオープンソースを読みつつ、川合式初級プログラマ学習法も同時進行で進めていってみよう。