プログラミングができるようになるためにはというのが最近よく話題になってるっぽい。twtter:tamuken,プログラミング未経験者がJavaScriptでプログラミングをするために必要なこと
そういえば自分はどうだったのかなー?と思っていろいろ考えてみた。
たぶん自分の場合何段階かあったような気がする。

  1. 親になんとなく勧められた
  2. インターネット登場
  3. しばらくさわらなかった
  4. ベンチャーへの興味
  5. コンピュータへの興味

気づいたころには、なんで書けてるのかよくわかんない感じになってたので、どうやったらできるようになるのかという質問が一番難しいのですが。
ただ、自分は目的があってそこで初めて言語を覚えるタイプなので、実はプログラミング的にきれいに書くとか、プログラミング自体にはそれほど詳しくありません(デザインパターン?副作用?関数?だからなに?的な)
よくいろんな人が言っていますが、プログラミングは自己表現の一環であって、もちろん言語に関して詳細な知識を持っているほうが流暢な言葉がしゃべれるんでしょうが、別にそうでなくてもいいわけです。

まぁなんやかんや言ったところであれですが、ようは俺が小学生のころに書けたんだから、書けないことはないでしょう。

howto系は他の人に任せるとして、体験談から。プログラミングかけるようになるコツとか書いてないかも?

親になんとなく勧められたベーシック

小学校2年の頃だったかな。pc9801の青白液晶のPCがたぶん人生初のPCとの出会いでした。青白って何?って感じでしょうが、昔はなんだか知らないけど液晶は青白だったんですよ。コントラストが悪かったんでしょうか?

そのときにN88Basicなんてものがあったんですが、親になんとなく本を渡され色々教えてもらいました。もはや中身は思えてないですが。

たぶん人生初のプログラミングはautoexec.batです。はい、これまた何なの?って感じでしょうがunixのshみたいなものです。今でもwindowsだと.batのファイルとかありますよね。
昔はフロッピーをいれて電源を入れると、フロッピーに入ってるプログラムが動くということがありました。いわゆる起動フロッピーというやつです。
そこにDOSのシステムとconfig.sysとautoexec.batというのを書くと、環境を設定してくれてautoexec.batに書かれているプログラムを起動してくれるわけです。

中身はたとえばこんな感じです。

omoshiroi_game.exe

こんだけ。もうちょい中身はありますが、要はゲーム起動するだけ。当時何も仕組みわかりませんでしたが、どうやらこうするとゲームができるというのは覚えたので、こんな感じでやってました。当時インターネットなんかなく情報源といえばパソコン通信と父親。やっぱし父親が詳しかったのは大きいかもしれないです。

で、当然自然な成り行きとして、今度はゲームを作りたくなるわけです。だってタダですからね。アイスクリーム買うのにも躊躇するのに、タダでゲームができるわけです。やらないわけがない。

詳細な話は省きますが、N88Basicというと今みたいにビジュアルなゲームを作るのには色々ねたっぽい事をしないとだめです。たとえばキャラクターひとつ書くにもピクセルごとに色を指定して全部配列みたいにして書いたりします。
関数なんてない(あったかも知れんけど使わんかった・・・)ので、全部GOTOとかで書いたりとか。結果的にこういうところでコンピュータの仕組みが帰ってわかった気がします。
関数がなんだかんだとやるより、Goto 100とかやると100行目に飛ぶとかいうほうが100倍わかりやすいですよね。ある意味最近のプログラミングは複雑になりすぎたのかもしれないです。

まぁさしてプログラミングなんか興味なかった(いまもそれほど興味ないんだけど)わけですが、ゲームをしたいって衝動とありあまる時間でプログラミングしてました。

インターネットとの出会い

これも小学校の頃ですね。まぁ最初はホワイトハウスのwebを見たりしてきゃいきゃいさわいでただけですが。(当時のインターネット入門本はyahooとホワイトハウスが鉄板でした)
中学校の頃webページを公開したくなり、HTMLとjavascriptとperlとjavaを覚えました。なに作ってたかってブラクラとか某ゲーム機から履歴をぶっこ抜くとかそういうプログラミングをしてました。中学生というと、なんというか、サブカルチャーにあこがれますよねw(当時から厨房という言葉はあり、「ほんとに中学生ですがなにか?」というのはよく使ってましたね・・・・)

こんなページ(まだあったよこれ・・・・)

中学から高校の頃まで管理してました。なんつーか、恥ずかしいことたくさんあってなえた・・・・
内容は趣味で作ったプログラム公開とかそんなんですね。あとは友達との交流とか。ライトノベルなんかもよく読んでたので、そういうのも書いてあります。

プログラミング自体の話になると左上のカラスっぽい絵。とうじホワイトボードみたいなソフトウェアで全うにwebで動くのがなかったため自分で作ろうと思ったんですね。ないもんはしょうがない。
で、フラッシュとかもあったんだかなかったんだかという時代なのでjava appletで入力インターフェースをつくり、サーバへの保存をperlで書いています。
で、これまた残念なことにCPANとかがあったのかなかったのか当時よく知らなかったので、GIFの圧縮処理も自力で書いてます。
LZWの仕様書とか読んでましたね。ここで、ついでに英語も読めるようになりました。

なんかいろんな都合でHTTPとかFTPやSMTPのRFCとかを読んだりしていろんなプロトコルとかも実装しました。チャットソフトとかもjavaで作りましたね。最近1000speakersでflashで作ってた人いましたが、ほとんど同じ実装だったので懐かしい感じでした。

しばらくさわらなかった

高校受験をはさんで、たいしてプログラミングしなくなりました。何ででしょうね。謎です。一説によるともてたかったんじゃないかという噂がありますが、大してもてたわけでもないので謎です。
けどなんだかんだで高校のwebつくったり、VJなんかもしました。CPU500MHzとかで動画編集するのは地獄でしたねー。composite stationをはじめて触ったときには感動ありました。だって当時のスペックであんだけさくさく動画動くんですよ?びびりましたね。
高校の紹介ビデオをフルデジタル編集して、2年間くらいは学校の公式行事で使われたりしました。プログラミングらしいプログラミングはほとんどしてません。

ベンチャーへの興味

はなしは大学まで飛びます。プログラミングの商業的側面について考えるようになったのはこの頃です。
ITベンチャー!シリコンバレー!大金持ち!ぐへへへへ。何気に幼少の頃からNHKとかでやってるシリコンバレーの話を延々と聞かされていたせいか強くベンチャーに興味がありました。
で、インターン紹介のなんとかって会社経由でチームラボという会社にバイトをしに行きました。2004年の2月くらいかな?
初日からいきなり「PHPとかSQLとか知ってる?書いて(ハート」という展開。ぜんぜん知らなかったわけですが、他人のプログラム直したりテストしたりしてるうちに、なんとなーく書けるようになりました。知らないもんを何で直せるんだって話はあるんですが、割とそこにプログラムがあるとわかるものです。というか、直したというよりは直るまでいじくりまわしてたという感じですが。

結構個人的にはここがターニングポイントで、やっぱし自分より詳しい人がいるという環境は結構重要でした。linuxとかサーバとかテストとかデバッグとかIDEとか。知らないこと盛りだくさん。これは感動的。
もともとあんま大学行ってなかったですが、延々と何回も高校の頃もやったような微分積分とか、いまさらな美術論とかやられるよりは、新しい情報があるほうが楽しい!まぁ大学もっと無視するようになりましたね。(あとで、研究室とかに行くのもありだったなと思うようになりましたが)

で、ほんとにこの辺からプログラミングで独立しようと考え始め、ドリームゲートなど起業系のイベントにも行き始め、プログラミングもどちらかというとコストカットについて考えるようになりました。
フレームワークとかライブラリとか。オブジェクト指向とかも基本的に生産性の問題で覚えました。

で、色々あって一人で仕事もらうところまでやりました。はじめて請求書に自分の名前書いて出したときは結構感動ありましたね。

ここもひとつポイントですね。生産性。利便性。あと、お客さんのことでしょうか。ぶっちゃけた話、プログラムのきれいさとか美しさなんてのはどうでもよくて、そのシステムを使う人、サービスを受ける人の利便性を考えることが重要だということ。
最終的には、その利便性を担保しつつ、コストを抑えるための仕事の選び方やフレームワーク選定、ライブラリ、バージョン管理などなど。
商業的な側面としてプログラミングを捉えるようになったのはこのころなきがしました。

コンピュータへの興味

なんというか、今まで手段としてのプログラミングをよく考えてきてたわけなんですが、ここにきてコンピュータそのものにも興味が出てきました。

O倉君との出会いが少しプログラミングへの考え方を変えました。ひいては大学院行ってもいいかなと思うきっかけになったのですが。

ある日プログラミングで関連検索のようなものを実装する必要が出たわけですが、どうも自分がやるとうまくできそうにない。と、いうわけで、その部分だけ頼んだわけです。すると、あっという間に作り上げてしまいました。これはすごい。

最近保守の関係で久しぶりに見たのですが、今見てみれば単にTF/IDFによる特徴語抽出と、そこからの関係だけをみてるだけなんですが、当時はまったくそんなことわかりませんでした。
しかもお客さんはこれにたいそうな名前をつけて売ろうとかするわけです。これはすごいなー。

この辺からアルゴリズムやコンピュータそのものに対する興味が出てきました。単純にサイト構築でも一日あたり数十~百万件のデータ処理をするものとかを作るようになり素朴に実装すると動かなくなり始めたというのもあります。もはやGOTO100とかやってたころのテンションじゃ無理です。自分が提案している内容もデータの分析とかそっちのほうに自然とシフトして行ったのですね。

しかし困った。知恵がねぇ。もはや自頭で考え続けるのには限界な感じがしてきてました。残念ながら天才ではないのでみんなが必死に勉強してるようなもんを普通に思いつくほどには頭よくないわけです。
というところで、今はコンピュータアーキテクチャそのものやアルゴリズムにすごく興味が出てきて勉強しています。

もちろん動機は「お金になるから」とか「笑えるから」とかそういうゴミな発想なのですが。だけど、一番大きいのはそこには越えられない壁があるなと感じたのが大きいです。
なので超える努力をしようというのが最近です。

プログラミングできるようになるためには?

個人的には、書こうと思ってかけるもんじゃないと思うんですよね。自分を客観的に考えてプログラミングの才能がある気がしません。
単にいろんな理由で、商業的にとか、趣味的にとかで色々研究してるので、なんとなくその延長でかけてるだけといえばそうです。

実例として、起業した友達とかはECサービスをやりたい一心で結局自分でもある程度PHPやflashをかけるようになりました。あの根性はすごい。
それで経営もやってますからね。

動機が必要というとありきたりですが、もしプログラミングせずにあなたの目標が達成できるなら別にしなくていいんだと思います。
趣味ではじめたいなら、本でも買って読めばいいわけです。最近iPhone出ましたね。じゃぁobjective-cとか。iPhone用のhtmlなんか書いてみてもいいかもしれないですね。これも本はあります。

プログラミングのためのプログラミングは好きな人のみができる話だと思います。haskellとか興味ありますし、ちょっと触りましたがあれを今おぼえる気にはなりません。

私個人の話をするなら、やっぱり「これがしたい!」という動機でしょうか。いまメディアサイトの立ち上げなどを計画してサーバ借りたりCMS選定したりしてますが、全部一から調べています。それなりに時間とお金かかってますが、まぁ要はやりたいかやりたくないかです。

CMSなんかぜんぜん知らないですが、本を買ったりネットで調べたりするわけです。一から作ってもいいわけですがスケールの問題と管理コストの問題などを総合的に評価してCMSを今回は「使ってみる」という判断をしたわけです。
別にサイト作るだけなら何でもいいと思います。

はっきりいえば、自分はお金大好きです。はい。あと手を動かすのも嫌いです。働いたら負けですね。そう思ったときにシステム作れたほうがいいと思っただけです。
だから第一義的なコンピュータそのものに対する興味はいまだに疑問です。が、すべては関係していてそれが最終的にコンピュータそのものへの興味へとつながっているわけです。コンピュータについて、プログラミングについて、たくさんのことを知っていれば最終的に手間をかけずに色々実現できますよね?

根本的に言えば、数学が好きです。これは趣味ですね。論理学とかああいうはっきりしていて議論しやすいものは好きです。だからコンピュータとかの発想もなじむといえばそうなのかもしれません。

なんだか、ばらばらかいてますが。だいたい、プログラミングするときになに考えてるかとか、プログラミングなんでできるようになったかとかをまとめるとこんな感じ。