Dai MIKURUBE
13 min readApr 1, 2019

--

プログラミングを始めてから働き始めるまでの話。

日本の Google Software Engineer (SWE) な人たちが公で語り始める祭りが唐突に始まったので乗っかってみた記事、就職以前編です。

本記事はあまり Google 関係なく特にダラダラと書いてるので、そういうのが読みたいわけではない方はどうぞお戻りください。(祭りの元ネタの Google の話は、主に次の記事です)

学生時代から振り返ると、ただただズルズルと長いことやってただけのスキモノでしかないんですが、それでも迷走しているうちに、おもしろい人たちと出会う機会があったり、楽しい会社と縁ができたり、さらに先につながったりすることもあるんですよ、ということが、やっぱりひたすら好きで続けているような人たち (特に若者たち) に多少なりとも伝わったらいいなと思ったので、最初から書いてみました。

生存者バイアスであることは否めませんが、こんなふらふらしてて、どうにかなったやつもいるんだ、と思ってもらえたら幸いです。

(何回か転職していると、昔の友人に「最近なにやってんの」と聞かれたときとか、新しい友人に自分がどういう人か説明するときとか、毎度めんどいので一回まとめてしまおうと思った、という目論見もあります…)

プログラミングに最初に触れたのは中学・高校の部活で、まだ Windows 95 は出る前、でも Windows 3.1 はあった、くらいの時期でした。

当初、部にあったパソコンは当時としても古めの NEC PC-9800 シリーズ (最速機はなぜか PC-H98)で、そんなのと MS-DOS + Borland Turbo C でゲームを作ったり遊んだり、作ったゲームを文化祭に出したりしてました。いわゆる、典型的なコンピュータオタクだったと思います。

おっさんホイホイな昔話ですが、この PC-9800 + MS-DOS というのは、ちょっと下に潜れば OS やハードウェアっぽいところをすぐ触れて、アドレス直打ちで VRAM を触りに行ったり、常駐プログラムを書いて他の実行プログラムを邪魔しに行ったり、そういう機械いじり (?) がひたすら楽しかったような記憶があります。あと master.lib はいいライブラリだったよね…あのマニュアルを日がな一日読んでた週末とかありました。

高校時代後半に自宅がインターネットに繋がり、でもまだ自宅サーバなんかを立てられるような時代ではなく、やったのはせいぜい当時使えた C 言語で CGI の掲示板作って遊んだりくらいでした。うーん、今考えればとても危なっかしい。 FreeBSD (98) とか Linux/98 で遊んだりもしたけど、そこに貢献しようっていう頭にはまだなりませんでしたね。

高校の終盤に一度 SuperCon というのに挑戦してみましたが、あえなく予選落ち。後輩が通ったので話を聞いて、とても悔し羨ましかった記憶。

大学は、まだ SuperCon が悔しかったのに加えて、まじめにスーパーコンピュータやってみたいな、っていう単純な気持ちでその SuperCon をやってた情報科学科に進み、サークルも無線研究部というところに入ってどっぷりコの世界でした。最初はスパコンやりたくて来たものの、最終的にその道には進まなかったんですが。 (その後 SuperCon には大学生部門でちょっとだけ出ました)

代わりに競技方向にハマって、かなりの時間を ACM-ICPC に吸われていきました。今でいう競プロです。単に競技が楽しかった面も大きいですが、お金を出してもらってあちこち行きつつ、違う大学の、でも同じ趣味の同じ世代の人たちと会えて、プログラミングの話を延々してられるのが結局楽しかったのかな、と。

この頃にできたつながりは今でも自分の中でとても大きな割合を占めていますが、そのつながりを作る一番大きなきっかけになったのが、選手を引退してから ACM-ICPC OB/OGの会というのの立ち上げに参加したことでした。当時はまだオンラインで人とつながる方法が少なく、ハブになるコミュニティを作る側になったことで、多くの人と関わることになりました。もうここからは退いて最近はまったく関与していませんが、会は形を変えながらも継続して「場」ではあり続けているようで、あのとき踏ん張っておいてよかったなと思います。

私の修士課程修了の直前に日本からの情報オリンピック参加が復活し、修了もいちおう決まって時間もあるからと、その合宿で講師を引き受けてみたりもしました。そこに来ていた当時の高校生たちこそ、各方面の最前線で怒涛の活躍をする、今をときめく情報オリンピック (第二次) 一期生の若者たちで、彼らの活躍を耳にすると嬉しいような誇らしいような、若者こえぇ…と戦々恐々とするような日々です。いややっぱ若者こえぇ。

OB 以前の競技者としては、当時それなりの戦果を残せたとは思うんですが、おそらく現代の競プロとはだいぶ感覚が違いそうです。この頃の (日本の) 競プロは、いわゆる趣味人がただただ好きでやってる、今思えば牧歌的な時代でもあったと思います。趣味でやってるからこそ強い (今でも強い) みたいな人たちも、周囲にはたくさんいましたけども。

ひるがえって自大学での活動、特に研究関係はうまくいっていたとは言い難いものでした。

所属した研究室の指導教官は、どんな分野の話をしても的確なコメントを非常に鋭く返してくれる先生でした。研究室の専門分野はシステム系 (プログラミング言語など) と UI 系ということになってはいたのですが、指導教官は Prolog-KABA とかやっていた方でもあり、並列計算もわかるし、当時ご本人がやっていたのはセキュリティのプロジェクトだったし、アーキテクチャや OS の話はもとより、なんなら当時の画像認識や自然言語処理の話にすら一定以上の知見を与えてくれる師匠でした。

前述のように入学当初はスパコンとか言ってたものの、「スパコンそのものを作りたい」というのとは少し違うなー、と思って所属した研究室でした。最初の輪講では並列ソートアルゴリズムの論文を選んで読んでみたものの、わかったつもりで話してみると、そもそもの前提条件から総ツッコミをもらったりしました。その周辺で数ヶ月粘ってみてもどうにもならなそうだったので、全然違う分野に行ってみては撤退、みたいなことを何回か繰り返して迷走していました。テーマを与えてもらうタイプではなかった上に、なんの話でもできてしまったのもあって、一つの分野に本腰を入れて取り組む覚悟が自分にできていなかったのだと思います。

結局、世の中に既存のコードがあって、論文からコードまで自力で読み書きしてどうにか深掘りできそうだったという理由で OS の世界に引っかかり、分野的にはどうにか腰を据えられた感じでした。ちょうど Xen が出た時期で、仮想化やマイグレーションがおもしろそうだったのですが、「じゃあそこでなにをやろうか」でまたしばらく止まっていました。

普段は無線研 (前述) というサークルに入りびたっていたんですが、当時そこの計算機環境は主に FreeBSD でした。そこで雑談していたら「jail の方が軽くていいんじゃ」みたいな話になり、「それいいかも」と言ってコンテナ型仮想化の話とプロセス・マイグレーションの話をひたすらサーベイしてやれることを探して、学部の卒論としてはかろうじて形になった、という体たらくでした。(ちゃんと始めたのが締切の一ヶ月前くらい)

コンテナ型仮想化って当時あまりメジャーではなく、その FreeBSD の jail と Solaris container があって、あとは Linux だと OpenVZ があったくらい? このころ研究室で議論して出てきたアイデアの中には、今の Docker とかに近いものもあったような記憶があるんですが、当時は「そんなことしてもどう役に立つのかなあ」とか思っちゃった記憶もあります。そういうのはそうそう拾えるものじゃないですね。 (そのアイデアの素を出したのは研究室同期だったはまのさんだった気がするんですが、やっぱり実務と運用を知らないと持てない視点があるなー、と感じます)

そんな有様だったので学部で就職しておけばよかったのかもしれないのですが、学生としてやりたいこともまだ幾分あったので修士過程に進み、同じ苦労をもう一度繰り返すことになります。

学部と同じように繰り返して修士論文まで書けたのかというと、修士のときはどうにもならず、プツッと切れて体調を壊し、休学・留年と相成りました。このときが最初の厄年で、「ほんとに厄年ってあるのねー」なぞと言ってたものです。

この休学中、ただ休んでいても逆に気が滅入るので、無線研の大先輩がやっていた e-trees.Japan という会社でアルバイトさせていただいたり、再びはまのさんに紹介してもらって Linux Academy で「ソースコードを読んでみよう!」みたいな講座の講師をやって GNU tools のコードを輪読 (?) してみたり、あれこれ手は出してみていました。皆さまには本当にお世話になりました…。

「研究って全然うまくいかん…自分には向いてない気がする…」と思いながらも翌4月にどうにか復学したのですが、悔しかったのか意地なのか研究に未練は残っていて、博士課程をいっとき検討しました。

しかし金銭的な事情もあり、その時点から学振を狙うなんてのも非現実的だったこともあり、博士課程は諦めました。ただ、これは結果的にいい方向に転んだと思います。自分に一番足りなかったのは「世の中で解くべき問題としてどんなものがあるかすら自分はよく知らない」ことで、大学に残っていたらそれは見つからないままだっただろうからです。

企業なら簡単に見つかるというわけではもちろんないですが、お金を稼ぐ過程、競争する過程で解かなければならない問題というのは必ずあるはずで、それを見てみるためにもまずは企業の研究所を目指してみよう、と結論しました。 (日本ではいわゆる「研究所」に修士から入る道が当時けっこうあって、これは非常にありがたかったと思っています)

ちなみに復学直前のこのころ、東京で新卒採用を始めて間もない Google に ICPC の縁で声をかけてもらって面接を受けましたが、このときは落ちています (笑) 単にスキルが足りなかったか、「今は開発より研究っぽいことがしたいんだけど、そういう仕事ってありますか」とか偉そうに言っていたからなのか、どちらだったのかはわかりませんが。

面接は延々コードの議論をしてとても疲れましたが、それが楽しくもあったことはよく覚えています。うち数回は英語でした。「なるほどそれで動きそうだけど、なぜそのやり方を思いついたの?」と聞かれたときは、思考過程を英語でどう説明したものか、四苦八苦しました、確か。

さて「企業研究所を目指す」とは言ったものの、復学した4月には「就職活動」はあらかた収束していたし、前年に内定を出してもらったところにも留年したことで蹴られていたし、いや実際どうすんのよ、といきなりつまづいた状態でした。

まだ新卒採用をおこなっている企業すらほとんどない中、珍しく通年で採用をおこなっていた IBM の東京基礎研究所 (Tokyo Research Laboratory; 現在の IBM Research — Tokyo) にダメモトで行ってみたのでした。

面接内容は学部や修士の研究プレゼンテーションを2回、最初は近そうな分野の研究員数名に、次は研究所のマネージャー (全員バリバリの研究者) が勢揃いする前で、というものでした。

当時の研究内容にはまったく自信がなかったので「これは無理だなー」と思っていたのですが、変わり者が好きな当時の所長になにやら気に入っていただいて、ここがフルタイムで働く最初の職場になりました。

このへんの流れは本当に幸運だった結果としか言いようがなく、例えば留年せずに最初の内定先にそのまま就職していたら自分はどうなっていたかと考えると、想像しにくいですがどちらかというと悪くなっていた気がします。塞翁が馬というか、人生なにがあるかわからないものです。

採用が決まったところで、修士論文を書けなければ同じことの繰り返しなんですが、基礎研でプレゼンをやってフィードバックをもらえたことで気持ち的に開き直れたのか、またふらふらしていた分野も再度コンテナ+マイグレーションに決め打ちして、修士論文はどうにか「でっち上げ」て修了しました。開き直りは大事。 (※でっち上げといっても不正とかしたわけではありません)

それと並行して、同時期に ICPC をやっていた友人からちょっと手伝えと誘われ、未踏ユースのプロジェクトに共同開発者として混ざったりもしたんですが、「修論と並行だからあんまコミットできんぞ!」と事前に言っていたとおりになってしまい、これは申し訳なかったなあと思っています。

この年には ACM-ICPC の世界大会が東京で開かれ、その裏方にいたりもしましたね。当時は IBM がスポンサーだったのもあって、ただの OB としてと IBM 内定者からのボランティアとしてと、二足のわらじであれこれやっていました。

プログラミング・シンポジウムという、アカデミア・企業を問わず老若男女 (一桁から八十代まで) のコの業界のスキモノが集まる、日本最古のプログラミングのコミュニティがあるのですが、これにもこの頃から毎年参加するようになりました。最初は ACM-ICPC OB/OGの会つながりで誘ってもらったのですが、未踏ユースでのつながりもでき、今でもここでアカデミアとの縁を微妙に保ちながら楽しんでいます。

…と、こんなふうに締めくくると (そしてこのあとソフトウェア・エンジニアとして転職していったという文脈があると) 学術・研究系の活動・仕事についてネガティブに捉えられてしまうかもしれませんが、決してそんなことはない、というのは、最後に添えておきたいポイントです。

ただでさえ厳しかった師匠 (指導教官) から最も厳しく叩き込まれ、そしていま最も役に立っているのは、個々の専門分野のあれこれではなく、論文のような技術文書やプレゼンテーションにおける、ストーリー (話の流れ) の作り方でした。

「こういう問題があって、すぐ考えられるやり方・既存のやり方ではこういう解決方法があって、でもそれらはこういう理由で適用できなくて、だからここではこういう方法を提案して、実際にやってみたらこういう点でこう改善されましたよ」という論文定番の話の流れは、なにも論文だけのものではありません。ソフトウェア・エンジニアの仕事でも、社内で新しいアーキテクチャを提案するとき、コード変更の内容を Pull Request で説明するとき、こういう話の流れを踏まえるだけで、話の伝わり方や議論の始めやすさがまったく違います。

Google だと Design Doc とかが有名ですが、あれも、特によく書けているやつはほとんど論文でした。 (最近は Design Doc 自体にも賛否あるみたいですが、個人的には今でも好きで、他のチームの Design Doc を掘り出してきて読んでみるのも楽しかったですね)

いま修士課程の方などは、研究職に就く気はなくエンジニア職に就こうと思っている方でも、こういう訓練を積む意味で研究に取り組んでみてもためになると思います。

こんな具合で、博士号はいまだに足の裏の米粒だったりしながら、今はソフトウェア・エンジニア職でやっています。そのあたりの話、本来の元ネタの話は、次の記事で。

--

--