私とソフトウェア
英語とソフトウェアは、自分が学んできてまともに使えるようになったただ二つのものだ。英語は自分に物理的な解放を与えてくれたが、ソフトウェアは自分に精神的な解放を与えてくれた。というわけで、英語については以前振り返ったけど、ちょうど Software Engineer へとジョブチェンジできたタイミングなのでソフトウェアも自分用に振り返っておこう(最近記憶力が。。。)。なお、僕は生まれついてのギークでは全くないので、そういう人への参考にでもなれば幸い。
中学・高校
家には親が買った PC があって最初は Windows 3.1 だったんだけど、ちょうど Windows 95 が出てフロッピーディスクを何枚も入れ替えながら更新するという今では貴重な体験をしたりしていた。でも、その PC で何やってたかというと、プログラミングなんて全くやってなくて、パソコン雑誌についてる CD-ROM からゲームをインストールして遊ぶ程度。
その雑誌に丁度DoGA-L1という 3DCG アニメ制作ソフトが収録されていて、それを見た当時の僕は「これを使える様になれば、絵がとても下手くそな僕でもアニメが作れるようになる!」と少し興奮し、ロボットのモデリングやモーション作成をしてみたけれども、泥臭い作業に飽きてしまい、すぐに諦めてしまった。あの時諦めずに継続していたら、尊敬する新海誠監督1のようになれていたのかもしれない(いや無理だけど)、それでなくても今 3DCG に関わる仕事ができていたかもしれないと思うと、物凄く惜しいことをしたと思う。と同時に、自分にはまるで向いていないことが 10 代前半で把握できたのは良かったことなのかもしれない。
もう一つ覚えているのが MIDI で、もはや利用したソフトウェアは思い出せないけど、やはり楽器の弾けない自分のコンプレックスを救うための手段だと一瞬ときめいてみたものの、音楽の教科書の楽譜を打ち込むので精一杯。それ以上のチューニングやら創作には全く興味も才能もないことがわかり、同じく諦めてしまった。
この 2 つ、合わせて育てていたらきっと初音ミクが出てきたときに楽しんで創作活動ができただろうなと今では思うけれども、実際にはどちらも自分にはできないという現実を早々に理解していたので、傍観者として眺める以外に選択肢がなかったのがとても悔しかったのは後の話。
で、この頃から今につながるものが唯一あって、それがプログラミング。といっても、自分がやったのは、雑誌に紹介されていた Delphi や VB を一瞬触って意味不明でそっ閉じしたくらい。その後、インターネットなるものを家にどうにか引いて(ISDN 64kbps)、CGI なるもののゲーム(大富豪とか)が面白そうだったので、ダウンロードしてプロバイダのレンタルスペースに上げて学校のクラスで少し遊んでみた程度。コードは今思えば Perl だったけど、中に何が書かれているかは一切不明のまま。あとは、JavaScript なるものをコピペで HTML に配置して、マウスカーソルを追いかける星を眺めたり、ちょっとだけプログラムを自分で書いたけれども入門書通りの電卓や画像が流れる程度。
この時もっとどうして踏み込んでプログラムをやらなかったのか?それはプログラミングで実現できるものに自分としての現実感がなかったから。自分の想像力も貧困だったけど、CG や MIDI よりもずっと作りたいものが無かったから、見過ごしてしまっていた。本当にもったいないことをしたと、今となっては思う。
大学・大学院
一般教養としての Java の授業でようやく初めてまともなプログラミングというものを勉強した。とはいえ、何を学んだか今ではさっぱり覚えていない程度の定着だった。その後、ロボットを作ってみたいと思って工学系に進んで、そこでもう少し本格的にプログラミングを学んだけれども、機械系だったのでどちらかというと力学や制御そのものの方が中心だったので、プログラミングは本当に手段として学んだ程度。おまけに、講座ごとに言語もバラバラで C だったり C++だったり Lisp だったりで、その時点ではプログラミングに興味のない僕はどれもさっぱり身につかなかった。
ただ、プログラミングが面白いと思えた重要なタイミングがあった。ある課題で 1 ヶ月程度(正確に覚えてない)で、とても簡単なロボットアームを企画から実装まで行った。授業で扱った USB カメラをプログラムから利用できるのが面白いなと思って、色の違うマーカーをアームのポイントに配置すれば、カメラ画像から逆動力学でアームを望む位置に移動できるかな?と思って実装してみて、今考えればひどいコードだけど動くものはなんとかできた。この時、ハードウェアの調達やら回路設計やらも全部やったわけだけど、物理世界や電気の世界には全然興味わかなくて、前の CG や MIDI みたいな感覚だった。なんかこう、もっと良くできるというアイデアが全然わかない感じで、あぁ才能ないなという既視感だった。けれども、カメラ画像から位置を取得し、関節の角度を計算してフィードバックするというソフトウェア部分には、もっとこうできるはずというアイデアがどんどん湧いてきて、すごく楽しかった。多分この時が自分が最初にソフトウェアに興味をもった時だと思う。齢 20 ぐらいだろうか。
それで、ソフトウェア中心でやることに決めて機械学習なんかもそこそこ楽しく勉強はしたけれども、研究となるとてんでダメで、その結果はご存知の通り。研究でやったことよりもずっと、ロボットアームの方が後の自分に残っている。
あとは、これも授業で使わされた Emacs(というか Meadow)にちょっとだけ興味が湧いて、ネットに落ちてる elisp を入れまくって魔改造してたけど、Lisp はさっぱり分からなくてやる気も起こらなかった。なお、カスタマイズしすぎると素の状態で何もできなくなってしまい、結果としてサーバ上に入っていた素の Vim で満足してしまい Vi に改修したのは後の話。
大学・大学院を通じて今の自分のプログラミングに直接残っているものはやっぱりなくて、どれも中途半端に諦めて終わってしまった。ここで機械学習や画像処理をもっとしっかりやっていれば、今をときめく AI エンジニアとして華々しく活躍していたかもしれないが、きっとそんなことは起こらなくて、好きなんだけど自分には向いてないということが早々に理解できた点で、3DCG や MIDI と大差なかった。
22 歳〜24 歳
大学院では何もできずに腐っていたころ、就職活動をしていた。自分が仕事として何をやりたいのかなぁと思った時に、そういえば自分が普段使っているサイト、具体的にははてなブックマークだったり、Twitter だったりってプログラムで動いているんだなと改めて気づいた(この時点での Web の知識は中学のコピペ大富豪 CGI 止まり)。それで忘れていたプログラムへの関心をふと思い出し、そういうのを書く仕事もありだなと思った。一方で、インターネットに流れてくるエンジニアの話には全くついていけるわけもなく、自分にそんな仕事ができるともあまり思えなかった。
そんな時に、まだモバゲータウンが中心だった頃の DeNA が未経験でもソフトウェアエンジニアでの採用をしていると聞いて、モバゲータウンが一体何なのかも知らなかったけど箸か棒にはかかるかなぁと思って受けてみて2、結果として DeNA に入ることになった。
で、せっかく研究もやってなくて入社まで時間は余っているので(というか修士号を取るためだけに今しか役に立たないことに時間を費やすつもりになれなかった反動で)、就職後に役にたつかなという思いコンピュータを触りはじめたのがこの頃。これまでずっと、コンピュータは与えられたものを使うだけという感じだった。せいぜいが、パソコンショップでスペックみてどれにするか決める程度。でも、なんかそれじゃよく分からんなと思って、初めて自腹で安いデスクトップとモニタを買って、無料で使えるらしい Linux とやらを入れてみることにした。
これが大変で、安いのを買ったせいで最初に選んだ Fedora だと諸々ドライバが対応してなくてまともに画面すら映らないという状況。コンピュータって難しい、、、と悩みながらも Ubuntu というものもあるらしいと知ってそっちにしてみたら何のことなくインストールできて感動した(単にドライバが豊富だっただけ)。それで次にやったのが、なぜか VPN サーバの構築でどうしてかその時の僕は家の外から家のネットワークに繋ぎたかったらしい。そもそも家に何もないんだけどね。。。で、ネットワークの知識も何もなくて、どれくらいないかというと、学部生の頃に貸与された PC に机の LAN ケーブルというものを挿すだけでインターネットにつながることに初めて感動するレベルだったわけです。同時に無線 LAN という至極便利なものがあるということもその頃知ったレベル。それがなぜかサーバを家に買って VPN やりたいとなって、わからないなりに BUFFALO のルータを買って四苦八苦して、結局 VPN はできなかった w なお、この流れからか、レンタルサーバで動かしていたブログの WordPress を VPS に移してみたりもしていた。インストールというものに抵抗感がなくなってきていた。
なんか手元に Linux が 1 つ手に入って、その流れで確か持ち運び用の Laptop を勢いで Ubuntu Desktop にしたりした記憶もあるけど、ともあれ無料でプログラムを学ぶのにいい環境が手に入った。それで、ちょうどその時ハマっていた Twitter で Bot とやらを作ってみたいなと思って手をだしたのが Plagger だった。たまたまググって出てきた Bot の実装が Plagger だっただけなんだけど、やってみようと思って CPAN から Plagger をインストールしようとすると、これが入らない入らない。。。この時結局何をどうしてインストールできたのかもはや覚えていないけれども、とにかく辛かったのだけは覚えていて、後の自分に強い影響を与えている(パッケージ管理の考え方)。
それはさておき、Plagger を使うと本当に簡単にやりたいことが実現できた。スクリプト言語というか Lightweight Language (LL)に触れたのも初めてで、こんなにも簡潔に書けるものなのかと感動した。それで、そのコードやら関連して作った Perl モジュールやらをブログで晒していたらコメントもらったりして、その流れで Plagger の作者が日本人であること(@miyagawa さん)が分かったり、というか日本人の方達が作ってるモジュールがたくさんあってすごいなぁと純粋に感動したりした。彼らは今でも僕のヒーローであり一つのロールモデルだけど、後に実際に会って飲んだり話したりできるようになれるとはこの時は全く思ってなかった。
この 2 年間で、誰に学ぶでもなくググってコピペで試してデバッグしてなんとかするというサイクルを回し続けたことは、研究に時間を費やすよりも重要なことを学べたとは思う。一方で、修士号を取得できていれば海外移住にここまで苦労しなかったことを考えると、どちらが良かったのかはわからないが、自分には研究も向いていないことが分かったわけで、これも 3DCG や MIDI と(ry
24 歳〜29 歳
就職してからは何を思ったか、プログラムを書く仕事よりもインフラの仕事を選んでしまったので、人のコードを読むことの方が多かったというか、コードを書くことはほぼなかった。Perl のコードはもちろん、Apache や MySQL のコードもごく少量、Linux は参考程度にほんの少し読んだ。システム運用という観点は今までなかった視点なのでたくさんの学びを得たけれども、一向にコードを書けるようにはなっていなかった。
ちょうどその頃課題に感じていた内容があったので、それをなんとかしてコードに落とし込んだのが Touryo で、YAPC::Asia 2012 でも発表したんだけど、これが多分人生で初めてゼロから書いたまともなコードだった3。Perl を使った外部 DSL を書くという発想は自分が得たものだったし、それを多くの人に助けてもらいながら実装できたのはとても良い経験だった。
https://speakerdeck.com/riywo/ops-tool-made-by-perl-beginner-number-yapcasia-2012
ズルズルと 4,5 年インフラの仕事を続け、San Francisco オフィスに出向した時点でもインフラのままで行ったわけだけど、その過程で出会った@niw さんや@mootoh さん、@hmsk さんといった本物のソフトウェアエンジニアを見て、自分がやりたいと思っていたことは今の仕事なんだっけ?という疑念が強くなった。彼らは UI からサーバサイド、コンパイラまで何でも知っていて何でも扱えた。対して自分が知っている領域のあまりの狭さに愕然とした。自分の次のステップとしてやっぱりこのままマネージメントなのかなぁとぼんやり思っていたけれども、ある夜、僕はこれからはコードを書くと心に決めた。
その日から、ひたすらに勉強とアウトプットを続けた。少し前に Fluentd の plugin を書いたことがあって、その流れで Ruby も Rails も触ってみたし、Node.js がいいらしいと聞いてそれも触り、Go がいいらしいと聞くとそれも触り、iOS やってみたいと思い CS193P を見て Objective-C を触ってみたり。Coursera がとってもよくて、Java でアルゴリズムとデータ構造をやったり、アセンブラを書いてみたり、Scala で Reactive programming をやってみたり。とにかくこだわりなく片っぱしから触れるものを触り続けた。
この頃から今も変わらないんだけど、僕の新しい言語の学び方は、基本的に書く・読む・書く。入門書やらをじっとこなしてから作りたいものを書くのではなく、先に書きたいものを決めてとりあえず始めてみて、詰まったらググるなりで他の人が書いたコードを読んではまた試し、とその繰り返しで言語を学んでいく。言語外の新しい概念については体系立てて学んだ方がいいと思ってて、iOS 開発や RoR は概念がさっぱりわからなかったので、先にお勉強から入ったけど、言語そのものの仕様については書いて試す、が基本姿勢でやっている。個別のプログラム言語自体に関する本は今もほぼ読んだことがない。
この時は割と寝食を削ってでも学習したものが大きいけど、それだけやっても全然嫌じゃないというか、むしろ楽しくてしょうがなかった。こんな感覚は今までの 3DCG や MIDI やハードウェアや機械学習や研究では一度も味わうことがなかった。
30 歳
日本に帰ってきて配属されたのが、新サービスを立ち上げるチームだった。その時点でコードベースはゼロ、やりたいことと大まかなシステム構成、そしてリリース日だけが決まっているような状況。僕はそこで 1 年ほど開発者として初めて仕事をすることになった。これが 2018 年に Vancouver に移るまでに、唯一仕事で Software を書き続けた経験だ。
システムの細かい設計から言語・フレームワーク等の選定、ビジネスロジックの実装、共通ライブラリの実装、ビルドシステムの実装、パイプライン設計、果てはセキュリティに関する実装やバイオインフォマティクスまで幅広く対応した。とても良い経験だった。
なぜ経験ゼロから一気にそれらをやりきれたかについては、すでにその当時ブログをしたためているので、そちらが参考になる。
あと転職前の隙間時間では、誰の役にも立たないプロジェクトとして、8086 のエミュレータを Go で書いてみるなどしていた。こんなことをできるようになるとは 22 歳の頃には夢にも思わなかった。
31 歳〜34 歳
そのあと AWS に移って、開発者から Solutions Architect という職種に変わった。またしてもコードを書く機会はなくなってしまい、代わりに System Architecture を深く知ることになった。数多のお客さんや世界中の事例から、1 台のコンピュータで考えるべきこととは全く次元のことなるレイヤの知見をたくさん蓄えることができた。この辺は言語にするのはとても難しくて、センスに近い部分もあると思うんだけど、あぁ僕はこの領域にはセンスがあるんだなと自覚できたのは生まれて初めてだった。
一方でコードを書けないことは非常に苦しかったので、なんとかプロジェクトは見つけてサイドワークに近いけど時折コードは書いていた。その成果はこちら。
現在
で、35 歳を前にしてようやく本当にやりたかった仕事、Software Engineer のスタート地点につけたと感じている。遠回りをしてきたけど、その過程でたくさんの他のことを学んだ。
- システム運用の勘所
- システム全体〜サーバ 1 台まで (一部ネットワークやハードウェア含む)
- System Architecture のセンス
- 分散システムとクラウドコンピューティング
そして、まさにこれらをある程度評価してもらえたが故に今の職につけているし、今現時点でそれらを発揮しながらコードを書いている。
それでもなお、新卒エンジニアみたいな地点にいるのは間違いないので、これからまだまだ学ばなければならない。だから、ずっと興味の赴くままに誰の役にもたたないコードは書いていて、Multi Paxos を実装してみたり、直近ではLLVM を使って Forth を実装してみたけど、本当に楽しかったし学びは多い。もちろんこれからは仕事でたくさん学べるわけだけど。
まとめ
新卒として就職活動していた時点ではエンジニア未経験歓迎に飛びついていた僕が、北米で Software Engineer をできるようになったのは、ソフトウェアは自分が本当に心から、知りたい・良くしたいと思えて、なおかつ自分でそれができた初めての分野だったから。もっと若くにそこまで至っていればこんなに紆余曲折せずに済んだよなぁとは毎日思うけれども、それはそれ。ここまで時間がかかった分だけ、他の選択肢をたくさん諦めてきた。だからもう What if はないし、純粋にこれをやり続けるだけなのでシンプルだ。
課題としては、自分が心からどうしても作りたいソフトウェアというものがまだないので、死ぬまでにそれが見つかるといいなぁというところ。たとえそれがなくても、人が必要とするものを作ることはできるのでいいんだけど、やっぱり根源的に自分が作りたいものを作りたい。