いかにプログラミングを勉強するか

今まで多少でも弄ったことのあるプログラムといえばC/C++JavaPrologJavaScriptC#Rubyあたり。


一番最初にやらかしたエラーはCで

#include<studio.h>

と書いたことだ。



最近相談を受けたのは

int hoge(int a)
{
   if(a == 0)   return 0;
   if(a == 1)   return 1;
}

みたいなコードで

invalid return type

というWarningが出るというのだったが、こういうのっていつ覚えたんだろうなぁ。
いつのまにか覚えてたような気もする。最初のエラーもそうだけど「こう書いたら直るよ」っていう教え方をされたし、そう教えた。
for文のネストでループ変数が両方iになってたとか、ローカル関数で宣言した変数のスコープが切れてぬるぽったりとか、マルチスレッドでタイミングがずれてバグったとかいうのもある程度経験的に対処できるようにはなった。K&Rもそれなりに読めるようにはなったと思う。


Cに関して言うと、ポインタで躓いたという感触はそれほど無い。それほど動的なメモリ操作をするプログラムを書いてないという方が正しいが。どっちかというと配列で躓いた。今でもCの文字列処理は苦手だ。あと

char str[16];

とか書くのが非常に気持ち悪い。そして可変長配列を作ろうとして断念したりする。使い捨てプログラムでフールプルーフに凝りすぎるとよくないのだろうか。最近は

char str[BUFSIZ];

とかでごまかしてるが。


そこそこコードが書けるようになって躓いたのはGUIWindowsプログラミングあたり。C言語入門の本にはコンソールアプリしか載ってないし、IDEの解説本にはIDEの使い方中心にしか書いてない。windows.hの存在をやっと知ったと思ったら

int WINAPI WinMain(
	HINSTANCE hInstance, 
	HINSTANCE hPrevInstance, 
	LPSTR lpCmdLine, 
	int nCmdShow
);

とかあってまたよく分からん型で悩まされる。


始めてGUIを触ったのはJavaで、SWTだのSwingだのを使ってアプリを作ってボタンの座標を設定したりしてこんなに面倒なことをせにゃならんのかと思った。それもEclipseだのコマンドラインからの起動で、たとえばOOoなんかはJava使ってますとか書いてるけど実行ファイルじゃん何それとか思ったもんだった。


C#を使うようになってWindowsアプリに関してはかなり簡単に作れるようになったがこれもなんとなく天下り的にライブラリを使ってる感が非常にしていて気持ち悪いことが多々ある。Object型の引数の扱いとか。もちろんいちいち初めから作ろうなんて考えると四角い車輪の再発明になることは目に見えてるのだが、グローバルフックを実装しようとしてイベントハンドラを弄ったり、DLLインポートを使ったりアンマネージコードを使ったりするのはほとんどコピペで終わってしまって理解できてないところが多々ある。


バイナリファイルすら満足に扱えないのだが、研究用プログラムならそれでどうにかなっても、趣味でフリーソフトを公開できるような人やハッカーと呼ばれるような人はどうやってプログラミングスキルを身につけてるんだろうなぁ。


まあこんな駄文を書いている間に何か練習プログラムの1つでも書いてみたほうが上達するような気もする。