私とソフトウェア

英語とソフトウェアは、自分が学んできてまともに使えるようになったただ二つのものだ。英語は自分に物理的な解放を与えてくれたが、ソフトウェアは自分に精神的な解放を与えてくれた。というわけで、英語については以前振り返ったけど、ちょうど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を書くという発想は自分が得たものだったし、それを多くの人に助けてもらいながら実装できたのはとても良い経験だった。

ズルズルと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はないし、純粋にこれをやり続けるだけなのでシンプルだ。

課題としては、自分が心からどうしても作りたいソフトウェアというものがまだないので、死ぬまでにそれが見つかるといいなぁというところ。たとえそれがなくても、人が必要とするものを作ることはできるのでいいんだけど、やっぱり根源的に自分が作りたいものを作りたい。


  1. DoGAが運営するCGアニメコンテストで彼女と彼女の猫がグランプリを受賞している。 [return]
  2. ちなみに、募集要項に新卒であること(〇〇年卒業見込み)という要項がないことは確認して受けていて、その後で内定もらってから大学院卒業しませんと連絡した。 [return]
  3. 作った後すぐに部署を離れたけれども、後で聞くと案外長く使われていたらしい。 [return]

riywo

Software Engineer, DevOps, DBA, Solutions Architect, NFL, working for AWS. All posts are my own, not endorsed by any org.