プログラミング,どうやって学んだっけな

note.mu

が話題になり,様々な意見が飛び交う中,そういえば自分はどうやってプログラミングを学んだかなと考えていた。ここでいう「プログラミングを学んだ」は仕事で売れるレベルのプログラムを書けることを指す。私は今プログラミングを仕事にしており,死んでいないので,「学んだ」といえるだろう。

 結論から言うと,完全な独学でもないし,学校での演習にも限界があった。しかしいろいろな積み重ねが現場での経験でコードに結びついたような感じだ。

 最初にプログラミングに触れたのは中学に入る直前の98年だった。プログラミングに興味はあったのだが,親が厳しかったのでパソコンは実質的に使うことができなかった。このため,親にとって意味不明な機械であるポケコンを買ってもらった。当時既にポケコンはひどい時代遅れで,電気屋では「こういうのは買わないほうがいいと思いますよ」と言われた。工業高校では生き残っていた。ポケコンにはBASIC,CインタプリタCASLが入っていたはずである。なんだかんだいってBASICを使った。変数やループなどの基礎的な概念はそれで学んだように思う。

 で,BASICには限界がある。そもそも私が買ったポケコンは予算の問題からグラフィックを出力できず,見栄えの良いものを作れなかった。図書館にあった本で勉強していたのだが,図書館のBASICの蔵書はN88-BASIC中心のため,いろいろ言語上の制約もあった。途中でやめてしまった。

 中学時代は母親が統合失調症を発症したので家にいられず,パソコンはネットカフェで使っていた。今もネットカフェに行くと安心する。しかし,ネットカフェなので開発をするならポータブルな開発環境が必要で,しかも当時の記録媒体の中心はフロッピーディスクである。ブラウザで動くJavaScriptで学べ?何年前だと思っているんだ。JavaScriptの実行は危ないから切れって言われてた時代だぞ!ということでいろいろ駄目で挫折した。

 高校は東工大附属というところに入ったのだが,そこでプログラミングの授業があった。486のPC-9821 CanBeにFreeBSDを入れたクソ遅いX環境でMule(多言語対応のEmacs。のちに本線に統合。当然Emacsなのでメモリを沢山食う)を使い,C言語を学んだ。内容としては最初はこの記事

kirimin.hatenablog.com

にあるような,簡単なアルゴリズムから始めたが(ひし形を横に並べるとジャイアンの服の柄になる),同級生の中にはターミナルで大文字と小文字の区別ができないなどして挫折したのもいた。電子科なので,プログラミングに向いていない人はハードウェアに行った。プログラミングをさらに学びたい人はXlibを使ったGUIプログラミングや,8086アセンブラに触れ,課題研究などでやっていくことになった。私は友人とIA-32 プロテクトモードで動く原始的なOSを作ったが,友人と能力の差がありすぎたためコードはほぼ書かず,2chFlashやMADなどを見てゲラゲラ笑っていた。これが平成ネット史である。

 自分で何かいじってみようと思ったのは高校を出る直前である。当時2ch「繰り返し囚人のジレンマ」のアルゴリズムを戦わせる大会があり,大会の運営形式がスレにCプログラムを投稿するというものだった。洗練されたバージョン管理などはなく,一人の人間がとりまとめていた。私がこれを知ったのは大会が終わったあとだったが,コードはあったのでそれに自作アルゴリズムを追加して勝てるものを作ろうと思った。結果的に興味関心はブレていき,アルゴリズムだけでなく大会の運営コード自体をいじり,「デフォルトの設定では勝てるが,そもそもこれはパラメータによって勝敗が異なるような大会だ」ということにいたった(この辺はゲーム理論の領域である)。基本的には既存の小さいプログラムの修正にとどまっていた。

 大学は04年に電通大の情報通信工学科に入ったが,正直大半のことは高校でやったので3年前期「アルゴリズムとデータ構造演習」に至ってもまだ物足りなかった。Pascalは嫌な言語だった。個人では当時勃興していた社会ネットワーク分析に関心があった。Pythonを使ってmixiから引っ張ってきた人間関係のグラフの解析や,その構造に基づいたシミュレーションを行うプログラムを書いたりしていたが,バリバリ大きいプロダクトを作ったり,OSSに貢献するには至らず,途中で文転した。

 さて,07年から文転したので文章が主要な戦場となったのだが,はてなブックマークはやっていたし,プログラミングに関する興味は消えなかったので,ちょいちょい最新の技術はいじってはいた。最初にgitに触れたときはおおっとなったし(のちにsvnを仕事で使ってウーンとなった),VM立ててなんかやったりした。あと当時はiPhoneというものが流行っていて,アプリで一儲けすることを思いついたが,大したものは作らなかった。ちょっとずつ画角を変えて複数の写真から360度画像を作るものなどは作ったが,Objective-C部分はほぼコピペで,ほぼすべてをCで書いた。全方位画像に関してはなぜか関心があり,OpenCVを覚えて実験をいろいろやっていた。

sites.google.com

sites.google.com

Androidへのポート

http://www.interaction-ipsj.org/archives/paper2011/interactive/0282/2INH-12.pdf

 その間にOpenPNEというSNSを作っている手嶋屋でバイトを始めた。文転して修士課程にいたものの,プログラミングは飯を食う手段としてはいいんじゃないかと思い,はてな含めIT企業のバイトを受けては落ちていた。手嶋屋では手嶋屋トライアルという試験一発で採用という仕組みがあり,Linuxサーバを1つ与えられ,Webサーバの立ち上げからOpenPNEのデプロイ,小さいプラグインの開発までやるものだった。全部やるとそこそこ広い知識を要求されるのだが,そこは器用貧乏がうまく働いて完走し,バイトを始めた。

 ということで

github.com

OpenPNE3が私が関わった最初の大規模プロダクトである。そこで,初めて大規模なプログラムに携わるということを学んだ。コードを読み,構造を理解し,そして小さい修正をする。それならできるし,その経験が結果的にゼロから作ることにつながったように思う。主にバグ修正だったが,バグチケットの粒度が適切だったのが成長を促した。

 とはいっても,最初にスタートアップに関わってそこそこ大きなプロダクトを作ったときは大失敗だった。iOSアプリのコードベースは最終的に手のつけられないものになった。なぜか莫大なメモリリークが起きていたが,その原因はわからなかった。

 その後,某大学の研究成果である物体認識手法をiOSに移植するという仕事をした。C++OpenCVの,学生が書いたような,というか実際に学生が書いたプログラムを渡されて,それをほどいてObjective-C++につなぐというものなので,スキルに合っていた。その仕事を振ってもらった社長に拾ってもらって就職し,今に至る。いろいろな仕事をやったが,基本的に既存のプロジェクトやOSSの改修,もしくは小さいアプリケーションがメインだった。今の仕事は初めてゼロから書き始めた中規模なアプリケーションで,基本的にコード側は試行錯誤しながら今に至る。いつできるようになったのかは不明である。

おまけ GNU/Linux をどう学んだか

 RMSの理念を支持し,コンピュータというものに向き合えば自然についてくる