ある程度プログラムが書けるようになったらば、次にするべきことは、他人の書いたプログラムを読むことである。・・・と、どっかで聞いた気がする。どこで聞いたのか見たのか覚えてないんですが、これって一理あると思うんですよね。
もっと突っ込んで言えば、他人の書いた良質なプログラムを読むことは、プログラムを書くことと同じぐらい。。。いや、それ以上に重要なプラクティスなのかも知れない。
スポーツや武道、それだけじゃなく、将棋や囲碁、それに伝統芸能やモノ作りにいたるまで、まず最初に学ぶべきことは『基礎』です。野球なら正しいバッティング・投球のフォームを身に付けることだったり、将棋であれば定石を覚えることであったりと、初心者は必ず「基礎」を覚え、身に付けるところから入るものでしょう。プログラミングで言えば、プログラミング言語の構文を覚えたり、基本的なデータ構造やアルゴリズム等を勉強することが「基礎」に値するのだと思います。
そして基礎を学び、初心者から中級者への階段を上がるために必要なことは、上級者の技を見て、それを盗んでいくこと。スポーツなどでも、うまい人やプロの選手のテクニックを真似てみたり、伝統芸能やモノ作りにおいても、師の技を盗み、自分なりに消化・吸収していくことで、格段にレベルアップしていけるものでしょう。
プログラミングでは、それが「他人の書いた良質なプログラムを読むこと」に値するんじゃないかと思うんです。良質なプログラムを読むことで、そこで使われている技や知識を、盗んでいくことができるんじゃないかと。
最近、オープンソースのパケットキャプチャソフト「Wireshark」を改造しようと思い、ソースコードを読んでいたんですが、自分では思いも付かなかったロジックが使われているのを見て、非常に勉強になるなぁ~と感じました。世の中には数々のオープンソースソフトがあるんだから、読もうと思えば、いくらでも他人の書いた良質なコードを読むことができるんですよね。ホント、便利な世の中になったもんだ。。。
何かオープンソースのコードを読んで勉強をしよう!っと思ってたところで、ネットで以下の記事を見つけました。少し古い記事ですが、2006年の濃縮還元オレンジニュースより。
『残念ながら休刊してしまった『日経バイト』(日経BP)の2006年1月号にて,
書籍『ふつうのLinuxプログラミング』の著者である青木峰郎氏が
マズイですか!? それも、かなりマズイですか!? ごめんなさい、今すぐ読みますm(._.;)m
ってのはまあ冗談ですが、lsのソースを読む・・・ いや、UNIXコマンドのソースコードを読むっていうのは、勉強するにはなかなか良い選択かも知れない。古くからオープンソースとして作られてきて、そして今なお世界中の人が使っているプログラムなわけですから、それは淘汰された先人の知恵が濃縮還元・果汁120%みたいなことになっていることでしょう。
よーし、UNIXコマンドのソースコードを読むぞ~(゜-゜)o と意気込んでいたら、ちょうどそんな内容の本が出版されていることが分かり、またまたAmazonで購入しちゃいました。
「プログラミングテクニック ~UNIXコマンドのソースコードにみる実践プログラミング手法~」
UNIXマガジンの連載をまとめた本のようなんですが、UNIXコマンドのソースコードを題材に、そこで使われているデータ構造やアルゴリズムなどのエッセンスを読み解いていくという内容です。
少し読んでみたんですが、内容はかなり濃い。「天下一品」のラーメンのスープぐらい濃い。正直、何回も読み直さないと理解が追いつかなかったです。(ただの実力不足か・・・;
あとは誌面の枠組みの都合上、ソースコードが一部しか掲載されていないのと、若干読みづらかったりするので、実際にUNIXコマンドのソースコードを、ネットでダウンロードしてきた方が良さそうでした。
濃縮還元オレンジニュースのページでも触れていますが、GNU版のソースコードは読みづらいです。FreeBSD版のソースコードの方が断然読みやすい。比べてみてみると、一目瞭然です。
FreeBSD版 lsコマンド: http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/ls.c?rev=1.85.6.1;content-type=text%2Fplain
GNU版 lsコマンド: http://cvs.savannah.gnu.org/viewvc/*checkout*/coreutils/coreutils/src/ls.c?revision=1.471&content-type=text%2Fplain
実際にFreeBSD版のソースコードを見ながら、本を読んでいくと、かなりの勉強になりそうです。
言語はC言語に特定されてしまいますが、アルゴリズムや知識を学ぶ上では、UNIXコマンドは最良の教材になり得るかも知れないですね。CGプログラミングの勉強がてら、ちょこちょこと読み進めてみます。
