プログラミングをはじめた理由 あるいはなぜ中1の頃の僕が親父のPCをクラックするに至ったか

91世代部あたりで流行ってるようなので、プログラミングに手を出したいけど悩んでる人向けに、自分がどういう変遷を辿ったか書く。
あまり91世代とは関わりないけど、88なのでそんなに変わらない、つもり。大学4年。


生い立ちから書く。生い立ちを書かなければこのテーマに挑めない。その理由は、次の章の書き出しを見てもらえばわかるとおもう。

小学生 95~00

物心ついた頃からインターネット小僧だった。95年には既に家にインターネットが通っていた。最初はポケモンの裏技ばかり調べていた気がする。最初に触ったのはMacだった。ハイパーカードのゲームで遊んでいた。
小学3年生のころだったか、親父にWin95のノートPCのおさがりを貰って、一人っ子で鍵っ子だった自分はひたすらインターネットをしていた。友達は少なくはなかったが、家が自分だけ皆と逆方向だったので必然的に一人遊びする時間が多かった。
小遣いが少なかったのでインターネットのフリゲばかりやっていた。Vectorにはお世話になった。従量課金で4万円の請求が来たり、ダイヤルQ2に引っかかって怒られた記憶がある。この当時友達とチャットしたりするのにCGI借りてきたり簡単なhtmlを書いていた記憶がある。
大学以降はマカーなので、Windowsに関するスキルは、この当時に身についたもののままだ。

中学生-高校生 01~06

中学生あがってすぐ、アダルトサイトを見ていたことがバレて、PCを没収された。おかげで2001年から2007年の間、インターネットにまつわる記憶はほとんどない。Flash全盛期なにそれ。
今でこそネットジャンキーみたいな生活をしているが、この反動だと思う。 ( 親がここまでアダルトに対して懲罰的なのは、実家の宗教のせいってのがある )


中学一年の夏、インターネット禁止に耐えかねて親父のPCをクラックした。CMOSリセットしてBIOSを初期化、フロッピーブートし、最小構成のLinuxを起動、Windowsパーティションのパスワードを書き換えた。世代あたりのIT偏差値はこの時が最高だと思う。パスワードはすぐに戻すように命じられた。

2003年の夏、アトピーをこじらせて入院した。入院中暇だったので、その時家から一台のノートPCを借りてきて、VB6の本をみながら基本的なプログラミングを勉強した。とは言っても、gotoや関数まで。
まあ、入院中はプログラミングしていた時間より、GBAで「ファイアーエムブレム封印の剣」をやっていた時間のほうが長い。ソードマスターがまだ強かった時代の話。


当時の2chの、厨房氏ね、という煽りを同世代性として体感できなかったのが残念

最初の大学 - 中退 - 再受験 07

大学に進学し、やっと自前のPCを買う許可を得た。ニコニコ黎明期で、狂ったようにニコ動を見ていた。兄貴動画をマイリス工作していた気がする。30垢ぐらい持ってた。
この大学にはすぐ絶望してしまい、半年で退学して再受験した。仮面ではない。
河合塾の寮に入ったのでまたPCがない生活に戻るところだったが、隣室の友人がこっそり持ち込んでいたPCを借り、wolf rpg editor というRPGツクールをよりプログラマブルにしたようなゲームエンジンで適当なゲームを作ってあるはずがない暇を食い潰していた。ソースコードを紛失してしまったが、FFのATBみたいなシステムをつくっていた。この時実装が破綻して設計の大事さとかを学んだ気がする。あまりにプログラミングそのままなAPI群をみて、これコードそのまま書いたほうがいいんじゃないのとプログラミングに興味を持った。
とはいっても、そのPCでネフェシエル/イストワール/魔王物語物語あたりのフリゲをやっていて、これもゲームしていた時間のほうが長い。ぶっちゃけ、今の大学は最初からA判定だったので日本史小説を読むばかりでほとんど勉強してない。*1

今の大学 08年 ~

今の大学の情報科に入学。同時に学科指定のMacBookを買った。Twitterをはじめた。ついでに前々からやるつもりだったプログラミングに手をつけることにした。
漠然と何かが作りたかったわけではない。ただ自分が興味がある世界の裏側が知りたかったという好奇心だけだった。ゲーム製作には興味あったけど、当時流行っていた梅田望夫に騙されて、もっとウェブ技術的な方に興味が向いた。

大学1年

大学ではカリキュラム的にプログラミングを学ぶのは無理だということがわかったので、夏休みから独学でプログラミングを勉強し始めた。大学で学んだのは Javaのawtを使って計算機アプリをつくるところまで。それ以降は勝手にやってね、というスタンスだと感じたので、勝手にやることにした。

一年の夏休み、加入候補のサークルから全てフェードアウトし、暇だったのでひたすらRubyの入門書を写経していた。Rubyは理解できたのだが、Railsの章に入ったところでつまづいた。当時1.2系から2.0系への転換期で、ぐぐってもドキュメントが混沌としていた。あと gem 周りが破滅していてうんざりした気がする。
次に大学で学んだJavaでサーバーサイドやれないかなーとTomcatに挑んでみた。これが悲劇の始まりで、一ヶ月ぐらいドハマリした挙句何の成果もなかった。参考にした本がおそらく間違ってた。ここらへんでググってでてきたコード片を応用するセンスみたいなのは学んだ気がする。

TwitterUbuntuがもてはやされていたので、前の大学に入ったときに買ったPCからXPを消してUbuntu8.04 をいれ、Linuxをいじるスキルを学んだ。中学生のクラッキング以来のLinuxだった。

大学2年

当時話題になっていた集合知プログラミングを読みながら Pythonを覚えた。以降Pythonがメイン。twitter-pythonを読んでモジュールの書き方とWebAPIの作法を覚えた。
加入した出版サークルのHPをつくりながら HTML/CSS/PHPを覚えた。まあ、PHPというよりかはWordpressだったのだけど…。 HTMLは小学生の頃から書けたのだけど、当時CSSなどというものが存在しなかったので、モダンなやつをゼロから勉強しなおした。
vimperatorにはまり、プラグインをいじりながら javascriptXUL を覚えた。
Emacsいじりにこって、自分でminor-mode書いたりしながら emacslisp を少し覚えた。lispはまだ理解から程遠いところにいる。

大学3年

まずゼミの課題をこなすために R と TeX を覚えた。
なんとなくウェブサービス作りたくなったので Pythonでサーバーサイドやろうとして WSGI/MongoDB覚えた。以降MongoDBばかり使ってる気がする。SQL弱いのでどうにかしたい。
大学の夏季集中講義、アルゴリズムとデータ構造を、本来JavaだったものをLL脳に侵された自分は、勝手にGroovyを勉強しつつ書いた。
canvas API眺めてたら簡単にブラウザゲー作れそうな気がしてきたので、ついでにjavascript覚えた。
エディタに凝ってVimを一通り学んでおきたくなり、Vimプラグインを一通りなめまわしたりした。

大学4年(今)

研究でOpenCVKinect使うことになったのだが、バインディングC++しかなかったので、今まで放置してきたC系に手を出した。まだ苦労している。C++に関しては OpenNIのUserTrackerのコードばかり読んでいる。
Kinectのリアルタイムビジュアライザをnode.jsとWebSocketで作ろうとして、一緒に紹介されていたcoffeescriptが意外に楽しかったので、去年作ったゲームエンジンを移植したりしていたのが昨日一昨日の話。もうちょっと作ったら公開する。


coffeescript可愛い。人間がどれだけ愚かにプログラム書けるか挑戦している気がする。
あとGoとかScalaをちょこっといじってるけど、全然使えるレベルにない。日常的に使うのはPythonjavascript(node) 。

モチベーション、あるいは後悔

中学-高校の間に全くと言っていいほどPC触らせてもらってないので、その間に差をつけられたのが悔しい。その意味で91世代とか、同世代のギークっぽい連中を見てると非常に何かもどかしい気持ちを感じたりする。下手の横好きでアレコレ手を出しすぎて、本質の理解が遅れてるのも後悔。まだメタプログラミングを楽しめない。


とはいっても、あの当時同世代でPC触ってた手合いは、ギーク、またはガチのネトゲ廃人と、極端に分離しているので、自分の傾向的に後者になってた可能性が強い。その意味では普通の生活をしていて良かったのかもしれない。


モチベーションが続いたのは、2008年4月にTwitterはじめた頃フォローした人が自然とアーリーアダプターの連中で、それで色々煽られて情報発信するようになった影響が一番大きいと思う。
RSSを大量消化するようになり、そしてネットウォッチの効率化の為にはプログラミングスキルが必須だった。Google Readerをいじり、vimperator がなければきっとここまでやることもなかった。Plaggerは挫折した。Perl怖い。
Twitter APIを叩くのは凄く勉強になった。ChirpUserStream公開されたときはかなりいじくりまわしていた気がする。昔はだだもれストリームで、結構酷いことができた。フォローしてるユーザーのすべてのFavoriteイベントを監視できたり。
スクレイピングは自作ウェブ漫画ダウンローダ作ったりするのに役に立った。未だにオレオレ仕様で作ってしまうので gistに貼りつけて終わってしまうのが、どうにかしたいところ。


学んだこと

  • 朱に交われば赤くなる。Twitter初期のプログラマだらけの空間に放り込まれたことで、プログラミングやればすごくなれる!という錯覚を起こした。
  • たくさんの言語を学ぶより、ひとつの言語に通じて、アルゴリズムを理解し、それから目的を達するためのライブラリを探し、そのために言語を学んでしまうのがいい。
  • 流行りの言語をつまみ食いするのは、なんだかんだで同じパラダイムにあるのでそんなに苦労しない。ドキュメントがあれば欲しいライブラリを使える、程度の実感が得られればよい。
  • 他人が作ったライブラリを使えるようになると楽しい。そのためにドキュメント読むスキルを身につけるべきだし、ある程度やれば勝手に身につく。
  • 実行速度を気にするのは、それが本当に問題だと自分で感じてからでいい。初心者へのベンチマーク自慢はなんの役にも立たない。
  • 初心者はググって答えが出る言語を選択すべきで、「とりあえずここ数年の流行りの言語」は間違ってない。
  • とにかく応用がきく言語をひとつ持っておくと日常生活が向上する。現状はPythonRubyだろうか。もうちょっと実例整ったらnodeもいけそうな気がする。
  • EmacsVimはどちらか覚えておいたほうがいい。補完を使いこなせば脳が拡張する感覚が得られる。 Java一本ならEclipseもアリだけど、Java以外も使うならEclipseに絞るのはおすすめできない。
  • Unix入門としてのMacはそれなりに優秀

*1:結果として補欠合格