Twitter で医師を拾ってきて Google のソフトウェアエンジニアにするだけの簡単なお仕事

はじめに

【転職エントリ】Googleに入社します|Lillian|note」という、医師から未経験で Google のソフトウェアエンジニアになった記事があります。

note.com

私は、この記事に出てくる「とある元 Google のソフトウェアエンジニア」で、面接の対策を立てました。

記事が出た当初から大反響で、私もそれなりの反応を見まして、いろいろと誤解されているなあ、と思う一方、アドバイザーはあくまでもアドバイザーだから、アドバイザーとして知りえた情報については、口をつぐむべきだと思っていました。

ただ、あまりにも誤解されており、悪影響が大きく、犠牲者も多くなってきたと思ったので、許可を得て簡単に背景を書いておこうかと思います。

これはあくまでもアドバイザー側からどう見えていたかを書いておくものですが、医学部卒だけでも3,4人 GoogleAmazon に入っていったおぼろげな記憶がありますので、他の人の話と混ざっていたらご容赦ください。

 

教えるに至った背景

動機はいろいろ複雑なところがあるのですが、以前から Google の面接対策をしておりました。はじめは履歴書の添削や教科書の紹介くらいだったのですが、授業もするようになり、ある時期から模擬面接をしてもいいことになったので、模擬面接をするようになりました。

もともと教えることは得意で、特に短時間で全体図や戦略を伝えるのが一番効果が出ていた気がします。学生時代、成績が悪くて志望校を変えろといわれたのでどうしたらいいか見てやって欲しいと言われた小学生が2人いたのですが、それぞれ開成中学桜蔭中学に入っていきました。偏差値40や50からでもなんとでもなりますね。ちなみに、筑駒だけは試験問題の内容が毎年ぶれすぎていてかなりが運です。教員がまともに生徒を取る気がないのでしょう。そして、運要素が大きいので偏差値が高くなります。

それはともかく、模擬面接をするようになってからは技術面接はほぼ通過する感じになりました。ほぼ、というのは、模擬面接はしたけれどもやっぱり受けない人や面接が終わったあとにチームが見つからなかったり辞退する人がいるため分母と分子がよく分からないのですが、面接自体は滅多に失敗しないという感覚です。

前年の2018年はインターンを含めて4人全員が技術面接は通り、2019年6月当時は、すでに2,3人見ていたが結果はまだ出ていない段階だったようです。

今年はもう1人くらい見てもいいかなと思っていたところ、ツイッターGoogle を受けると書いている人がいて、競技プログラミングサイトを運営している中高の後輩がなにか作用したので、偶然見つけました。アカウントを見ると DM が送れたので「Google 受けられるんですね。」と聞いてみたところ、6月の末に模擬面接をすることになりました。「日本から西海岸に人を輸出しようとしている」と説明しました。

Google の技術面接

Google の技術面接は、シリコンバレーのなかではそれほど難しい方ではありません。

西海岸の文化では、面接の場では仕事に関係のない能力を評価できません。このため、日本語能力は評価外です。英語能力は問われますが意思疎通が取れればよく、ここ自体が問題になることはあまりありません。仕事をする上では、どうせ英語能力は帰国子女(小学校から高校までの半分未満を英語圏で暮らしたくらい)でもまったく足りないですし働き始めると伸びます。

また、エンジニアについては、性格についての評価をあまりしないため、差別的でないかなどのポリティカル・コレクトネスを除けば、ほぼ純粋に技術的な能力だけを見ています。

そして、システマチックであるために、個人的には非常に評価をゲームしやすいと思っています(game する: manipulate (a situation), typically in a way that is unfair or unscrupulous. Oxford Languages)。正直な話、FAANG+M 内で比べてもとても対策しやすい印象です。

ポリティカル・コレクトネスについては、日本が儒教の影響下にあるため、西海岸文化でやってはいけないことがむしろ好まれていたりするので、かなり釘を差します。たとえば、長幼の序や男尊女卑などは外すのが難しく、禁忌なのでたまに事故が起きます。一番安全で簡単なルールは、相手が明確に出してきた情報以外を使って会話しないことだと思います。たとえば、目の前の人物がXXだと思っても、明確に相手が自分はXXだというまで、そうであるか分からない前提で会話をすることです。

ラッキーだったのは、リクルーターから声がかかっていたので、面接前の足切りであるレジュメスクリーニングで撥ねられることがなかったことです。東大の工学部や理学部は通るのですが、東大医学部卒は社員がリファーしてもとにかくスクリーニングに通りませんでした。

模擬面接当日

少し雨が降っていました。大きな黒板のある部屋を借りて、午後1時に集合しました。

その年からは、大学の同期で元 Google のエンジニアがもう一人講師役を務めるようになっていました。また、この日はもう一人腕の立つエンジニアが講師役で遊びに来ていて、全部で4人でした。

はじめに手続き的な流れをざっと説明してから、実際に問題を解いてもらいます。

模擬面接から受けた印象としては、このままでは通る見込みはなく、間違った方向に努力してきていて、かなり修正しなくてはいけないが、時間があまりにもないので間に合うか本当にぎりぎりというものでした。

せっかくですので、ここで本人の記述を見てみましょう。

 このタイミングで、とある元Googleのソフトウェアエンジニアの方から声をかけていただき、模擬面接をしていただけることになりました。後から思うとこの機会は私にとって本当に幸運でした。模擬面接では私がコードをすらすら書いてみせたので、ちょっと驚かれました。競技プログラミングで得られるようなアルゴリズムのコーディングスキルは、面接対策にはもう十分過ぎるほど練習済だと思うとの評価でした。

 その反面、情報科学の知識を前提としたディスカッションでは、私の知識量があまりに乏しいことに半ば呆れられました。模擬面接はその時点で終了して、一緒に近場の書店に行って、教科書を買うことになりました。ここで選んでいただいたオススメの教科書は本当に良書ばかりでCPUやOSの仕組み、ウェブの技術など、情報系の学部で学ぶと思われる情報科学の基礎をしっかりと勉強することができました。

実のところ、こちらからみると、コーディングを始めてから15分かからずに知識がほとんどないことに気がつきました。それを前提に、通る確率を最大化するような戦略を立てます。知識はあとから自習で補ってもらうとして、まず、どうやってコーディング中の応答で知識を使うかについて丁寧に説明します。質問をしたあとで、こういうことを知っていたとしたらどう答えますか、と聞き直すのです。

そして、驚いていたのはコードをプリンターのように上から書いていったことです。これは暗算のようなもので、まともなエディターのない環境や速度が本当に大事なときにやりますが、普通はやる理由がありません。ああ、競技プログラミングの価値観に浸かりすぎたなと思いました。

コードの読み書きができることが救いです。とはいえ、パースなどが絡むと迷うのは理論的バックグラウンドが弱いからでしょうか。さて、4時間で軌道修正します。

競技プログラミング

競技プログラミングは、東京大学競技プログラミング同好会2007年春台湾合宿から始まります。それまで、プログラミングコンテストは開催されてきましたが、競技プログラミングの名前が使われたのはこの合宿がはじめてで、このとき一つのジャンルが生み出されたのです。

合宿のメンバーは、プログラミングコンテストにおける世界と日本の差を感じており、世界で戦えるような後進を育てることにしました。そして、競技プログラミングが日本に広まっていくのです。

黎明期の競技プログラミングをしていた人たちは、Google に入る程度のことくらい造作ない人たちで、実際、その合宿のメンバーは12人中9人が Google で一時期働いていました。

私は情報科学を専攻しておらず、Google 本社から受けることを勧められてオファーレターをもらうまでは、国家一種経済職で官僚にでもなるつもりでエンジニアになる気がありませんでした。そして、大学院でふらふらしていたので多くの同期たちから3年遅れで入ったのですが、同期たちに通るとは思わなかったというと、「何言っているんだこいつは馬鹿か」という顔をされたあとに「いや、通らないわけないだろうけれども、まさかこういう仕事をする気になるとは思わなかった」といわれることが2,3度あってからは、なるほど馬鹿げたことを言っているんだという認識を持ちました。また、入ってみると日本(で教育を受けた程度の意味)のエンジニアの10%-20%は知り合いでした。

そして、自分も面接をするようになってから分かったのですが、たしかにこれは友達とお茶をする程度の難易度です。

大学に入ったばかりの頃、プログラミングコンテストで世界大会にも行くことになる先輩に次のように聞いたことがあります。「情報科学の自主ゼミをしている友人からソースコードと出力が同一になるプログラムが存在すると聞きましたがどのようなものなのでしょうか。」先輩は即答しました。「クワイン文ですね。クリーネの再帰定理から存在が導かれます。それくらいは常識です。たぶん、少し考えたら書けると思うので書いてみてください。」この人の専攻は理工系ではありません。
この先輩は他にもとてもいいことを言ってました。研究者ならば、どのような分野であれ、プログラミングコンテストの初級中級くらいの問題は20分位で解けるべきだが、それ以上やりすぎてはいけない。情報系を大学で専攻しないと決めた以上、圧倒的な知識の差ができるが、それでも彼らが常識としていることを常識としなくてはならない。
そういうものかと思っていたら私もまがりなりにもできるようになりました。たぶん、投入した時間は多く見積もっても半年くらいです。

このように、昔は、Google競技プログラミングは当初はとても近いところにあったのです。

今回模擬面接を受けられた方のように、競技プログラミングを熱心にして、Google に入りたいという人に会うことは多々あります。ただ、現在では昔のように造作ないとは行かないようです。

競技プログラミングは変質し、その悪影響は看過できない所まで来てしまったと思います。競技プログラミングを始めた人たちができていたことが、その少し下の世代ではみるみるできなくなっていったと思われます。少なくとも、競技プログラミングの関係者がここまで Google に通らないことはありませんでした。

というのも、競技プログラミングは面白くするために、いろいろなところが捨てられています。

面白くするためには、やはり勝ち負けはきれいな方がいいので、オーダーの正しいアルゴリズムを思いついて正しく実装できることを基準にしてあります。また、打ち込むのがあまりにも大変なアルゴリズムはでません。

一方で、プログラミング言語の選択は影響がないように作られています。このために、1000倍くらいの定数倍は無視します。

実際の現場では、計算量が遅いもののほうが速いことも多々あります。たとえば、場合によってはハッシュ値を計算している間に50くらい線形でなめられるでしょう。メモリーヒエラルキーを意識することも大切です。また、当然、プログラミング言語の選択だって、実際の現場では重要な技術的な決定の要素です。

クイックソートのようなライブラリーが提供するアルゴリズムについても詳細を聞かれません。たとえば、最悪計算量に近いときにスタックオーバーフローを起こすので、短い方から再帰して、長い方は末尾再帰最適化することなど、いくつかの常識があります。

もっと簡単なところでは、バックスラッシュを含む文字列をリテラルで書く方法は不要な知識になっているのか、かなり書けてもできない人をよく見ます。結構ホラーですよ。さらさらとコードを書くのに、どうやってその知識を避けて生きてきたんだと。

こういったものを無視することによって面白くなっているのが競技プログラミングなのです。

昔は、面白くないコンテストというのがたくさんあったのです。

たとえば、線形時間アルゴリズムの最適化のコンテストで、締め切り後にフロッピーディスク内のファイルで計算が行われることが発表され、フロッピーディスクから大きなファイルを読み込むため、非同期処理をして読込み中に計算をした人が2位にダブルスコアで勝つというコンテストがありました。騙された感じはあります。ただ、本当に勉強になりました。

その後、その当時はじめの競技プログラミングをしていた人々は、競技プログラミングの普及から足を洗っていきます。そして、競技プログラミングを広めるのがその下の世代になるにつれて、競技プログラミングは本来の意味を失い、カーゴ・カルト化してしまったのでしょう。

つまり、面白くするために作られたルールだと分かっている人たちがいなくなり、そのルールとそれによる序列が絶対的なものになってしまったということです。競技プログラミングがとてもできるのに落ちたというときに、おそらく起きていることは、バックスラッシュが出力できなかった、ということがたいていでしょう。面接官をすることに慣れている人ならば15分もすれば違和感を感じ始めるものです。まれにすりぬけるんですけどね。

感覚的なものですが、ルールの距離について、新聞記事の編集とクロスワードパズルの解答くらいの距離感と言っていた人がいました。少なくとも、将棋と詰将棋よりは遠い感覚があります。いわゆるフェアリー詰将棋でしょうか。この人も私が教えて未経験から Google でソフトウェアエンジニアをしています。

実際のところ、競技プログラミングは初期はコーディングの読み書きの能力を鍛えますが、かなり初めの方から出題者の気持ちを読む能力を重点的に鍛え始めます。

そして、いまではクリーネの再帰定理すら分からなくなってしまったのです。

今回、模擬面接を受けられた方は、ゲームをゲームと認識しないままやりすぎていたという印象でした。

ところで、ここまで書いてませんでしたが、今回の講師役のうち二人は、競技プログラミングがはじまった2007年春の台湾合宿に参加しておりました。

我々の目的の一つは、我々が始めてしまった競技プログラミングを我々が終わらせることです。

模擬面接

さて、模擬面接に戻りましょう。

面接では難しい問題はまず出ません。ただ知識の不足から知的な問題だったと感じるだけです。そしてたいていの場合、テンポが遅すぎます。よい面接は漫才のように進みます。

LeetCode とかに問題がさらされていますが、あれは、たいてい入り口で倒れているので、本体に到達していないんです。そういった足を踏み入れると深みがあるような問題が好まれます。

解答にひらめきがいるように思われていますが、だいたいの場合は、人類の100年近い情報科学の歴史の中で類題が解かれているので、それを思い出すだけで解ける話ばかりです。そのようにしなくてはいけない制限が随所にあって、それらは、いくらかは合意、いくらかは人類の技術的理由、いくらかはこの宇宙の数学的物理学的制限から来ているものです。

「何をどれくらい知っていなくてはいけないのか」と聞かれたので、ちょっと考えてから、右手を前に突き出しました。手を開いた状態で右手を伸ばしたあとに、「手を握ります」と宣言してからゆっくりと手を握ってみせました。「いま、手を握ろうと思ってから握るまでのあいだに起きたことをできるだけ詳細に説明してください。」
いままで鉄門を何人か教えてきたので、医師にはこれが一番通じると思ったのです。
前頭前野。運動野。頚椎。腕神経叢。ミオシン。アクチン。
「そうですね。H-H方程式やイオンチャンネル、骨や筋肉の名称の話をしてもいいでしょうし、答えが足りなかったら追加で聞いてきます。では、頚椎損傷で今の動きができなくなったとしたら、Cいくつの損傷を考えますか。医師でも結構忘れているので答えられなくてもいいのですが、この答えられなかったときに感じる答えられて当然という感覚を覚えていてください。その番号で人生が大きく変わった人はたくさんいますよね。」
「ヘモクロマトーシスの患者さん、いままでどれくらい見たことありますか。要するにプロというのは、数年に一度見るくらいのことは当然に知っているんです。いままで仕事で書いたダイクストラの数覚えてますか。」
同僚の8,9割が知っていることを8,9割知っていることがどの世界でも求められるのだと思います。

 採用面接は単なるコーディングスキルの試験ではなく、ディスカッションの中でのコミュニケーション(意思疎通)が非常に重要であることを強調されました。チームとして一緒に仕事をする仲間を見極めることが面接の目的であることを考えれば、実践的なコミュニケーションが重要視されるのは合理的だと思いました。

終わったあと、渋谷の本屋に寄り、徹底的に山を張ります。
面接官役3人で協議した結果、できるだけ量を減らして6冊が選ばれました。オペレーティングシステムの本は、どうするのがいいのか少し自信が持てませんでした。3人とも似たような本を読んでいたのがなかなか面白いです。

ただ、これはどの分野でも同じはずです。もっとコモディティー化している、たとえば、生理学の教科書にしても、多く数えてもせいぜい10冊くらいしか選択肢はなく、そのうちの何冊かは読んでおり、いくつかは比較のためにパラパラと見て、少なくとも友人が使ったので評判を知っているという状況になっているので、自然とこうなるのです。

「うーん、たしか、医学部医学科の教育って、これくらいの量の本を読んで、2週間位で試験をするのは普通なのでできますよね。」と聞いたところ「はい」と答えていらっしゃったのですが、あとから、内心、「間に合うのかこれは」と思っていたと聞きました。私の見積もりも間に合う確率50%くらいでした。

結局の所、知っていて当然な知識かどうかの判断をする際には、同僚のエンジニア同士が夕食時などに雑談をして、まあ、そこにいる8-9割方が知っていることならば、出題ミスではないよねとなり、それが常識とされるわけです。その量から比べたら、6冊の本ではあまりにも心もとない、しかし、4時間だけならば被弾せずに耐えきれる可能性があるだろうという読みでした。

そのあとで、面接官の1人は帰ったのですが、残りの3人でメキシコ料理を食べに行きました。

そして、勉強が終わったら応用情報技術者試験がちょうどいいと思います。応用情報技術者試験の勉強をするとクイズのようになるのでよくないですが、勉強した結果、応用情報程度の問題が明らかに感じるようになるとちょうどいいと思います、とお伝えしました。

東大理学部は、研究者による研究者養成なので、半分前後が博士課程まで進学し、そこの教育は仲間なり後継者なりの育成としてなされます。数学科の差しゼミとか顕著ですよね。教授が大学四年生を一対一で詰め続けると数学が分かるとは何かがようやく分かるようになるのです。それまでは、東大理学部数学科でもだいたい学年の半分しか分かっていないと京大の准教授がいっておりました。これでもとても高くて他の旧帝だと普通は1割と聞きますね。
そして、一廉の人物が自分の仲間になるかもしれないと思って教育をするとき、そこには莫大な常識が流れます。その常識を横から掠め取るだけでも相当なものです。医学部だって、そうでしょう。多くの教授たちは、自分が授業をしている相手がいつか、自分の部下となり同僚となり、自らが挫折したところを踏み越えていくと思って育ててたんじゃないんですかね。少なくとも、研修医が終わって医局に配属されたあたりからは、本気の教育がはじまりますよね。そして、その結果、医師同士の能力差は信じがたいほど大きい。
私は、時々、自分を育ててくれた人たちと、その人たちをどれくらい裏切ってきたかを思って、一人嗚咽することがありますよ。あなたもきっとそうでしょう。

動機

さて、このような模擬面接をしている動機についていくつか書いておきましょう。

まず、ある程度は遊びです。数時間の介入で見違えるようになり、人生が大きく変わるのですから。今回は、勉強の仕方を教わらなければ絶対に得られなかった内定だと本人にも思ってもらえているようです。ああ、まあ、分かっている人を教えることも多いんですがね。70%通るだろうという感じの人が95%通るだろうに変わるのはそれはそれで達成感があり楽しいものです。

次に、エンジニアは天然物しかいない、という信念を打破したい、と考えています。エンジニアは養殖できることを立証したいということです。
エンジニアの出身学科で一番多いのは東大理情なのですが、次が東大理物でした。理物では、情報科学教育はほとんど行われていません。ただ、出身者が多く、教育をしようがしまいが現れる、生まれつき、天性のもので、天然物しかいないという信念に繋がります。
あと学科ではありませんが多いのは京大マイコンクラブ(KMC)です。つまり、理情とKMCのようにそもそも天然物が集まる場所と、一切、教育がなされていない場所で、天然のエンジニアが発生するという考え方です。
さらに、現在は若いうちからやらないとよいエンジニアにならないという信仰もあるようです。ただ、大学教育は圧倒的なのでスタートの差が誤差になることが多いでしょう。
この信念を示す目的で行っています。

それから、中国やインドとの国力差です。Google では、およそ中華系インド系がそれぞれ全エンジニアの2割ずつを占めているというのがラフな計算です。一方で、日本の人(中学から大学までの教育の半分以上を日本で受けた程度の意味)はとても少なく、それより2桁小さいと思われます。人口が1桁少ないことを勘案しても、あまりにも少ないです。
いろいろな試算がなされたのですが、仮に日本で教育を受けた人全員がこの面接を受けても、通るのは日本で2000人くらいだろうと思われています。これはどちら方向にも3倍は間違っていないと思われます。

そして、特に Google では、ソフトウェアエンジニアを含むエンジニア職が、企画調査研究開発から設計製造流通までを握り込んでいます。しかも、日本でよくある本社が決めた内容を支社が実行する関係ではなく、全世界のエンジニアのチームがある意味で対等に近い関係である一方、エンジニアの部署とそれ以外の部署の間の情報隔壁は高いです。
実際にやっていることは、戦略を立て、データを解析し、マーケットを分析し、コードを書く仕事です。
そして、少人数で圧倒的なインパクトが出せます。インパクトといってもお金に限らず、人々にどれくらい影響を与えるかです。10兆円を売り上げる何かを触るとそれなりのものがでてきます。

現在、米国の成長を牽引している企業、たとえば FAANG+M の企業文化を知ることのできる人物があまりいないことはストレートに国益を害するでしょう。
端的に言えば、これが日本の情報科学教育の質です。特に研究者や大学教員でもあまり通らないのは問題です。

この人数を中国やインドに比する割合まであげなくてはいけません。

Google の特殊事情を差し置いても育成はエンジニアにせざるをえません。というのも、基本的に、日本人が海外で自発的に生活する手段というのはほぼないからです。たしかに他人の都合に依存して滞在する方法はあります。まず、「紐付き」で企業や官庁などがスポンサーをしてくれて海外にいるように命じている場合。次に、「結婚」で配偶者に養われている場合。芸術やスポーツなどのプロ。ほか、事実上の通訳。そういう現地の人とは異なる手段での滞在の方法はありますが、それ以外で、海外で生活している人は、大学等の研究者かエンジニアの二択です。(金融系や建築系でモデルを書くなどの広い意味で数学的工学的技能を使う人はエンジニアに含めておきます。)

私の知人では例外は、カリフォルニアで幼稚園の先生をしている人、それと、フランスでパンを焼いている人の二人です。

たしかに、アメリカなどで弁護士資格を取ってくる人いますが、ほぼ間違いなくアメリカでは働けていないはずです。日本の帰国子女程度の語学力では、弁護士資格を取ることはできても、向こうで働くことは困難なのです。まあ、いちおう、インターナショナルスクールで教育を受けてアメリカで大学とロースクールに行った知人で、アメリカで弁護士ができている知人が一人いますので、この人も例外に入れておきましょうか。ただ、中学から大学までの大半を英語で教育を受けており、さらに日本人の多い都市で働いているという留保をつけてです。

不思議なことに、日本語が第一言語でない場合は働けている人がそこそこいます。ただ、いずれにしても、日本語が第一言語の場合は、中学から大学までの半分以上を英語圏で教育を受けなければ、とても英語だけで仕事ができる能力にはならないでしょうが、エンジニアと研究者だけはなんとかなります。

つまり、日本の将来の競争力に対して、エンジニア教育はクリティカルに効くはずです。

そして、教育の格差を埋めることです。その原因のかなりが家庭と大学における教育の欠如と人間関係にあります。

まず、大学における教育の話です。

東大では、入学時から学問をするとは何かが見えている人はあまりいません。そもそも、入学当初の数学の授業についていけるのがそもそも10%程度で、基礎学力すらおぼつかない状況です。そして、そこに対して、仲間を育てる水準の教育をしようという人があまりいないため、教育を受けられる学生はそれほど多くないです。

筑駒の同期たちは、5%がアラサーのうちに准教授相当になり、1割が助教相当になりました。たしかに、学者になることを考えていそうなのにならなかった人がある程度はいますので、それぞれ学年の1割2割を占める法曹や医師がほぼ挫折していないことに比べれば難しく、運の要素もあるのだろうという感じはしますが、それでも、これはおそらく学者になることが中学受験に比べて簡単になってしまっていることを意味しています。

日本のアカデミアは多くの場所で競争がないということです。組織の大きなところ、たとえば医学部はそれでもまだ活気があります。
ただ、実際に、信頼できる友人たちは特に人文社会系の教員は3割くらいは会話が成立しないと嘆きます。
この原因はなんとなく分かります。数学科では学部のうちに教授と1対1で毎週詰めるという話をしましたが、人文社会系の多くの学科では、教員あたりの学生数が多く、それほど博士進学率が高くないために、そこまでのコストが払えません。このため、教育が大学院からはじまるのですが、指導教員にはっきりとつくために、運が悪いと教育をなされないまま、博士を取り教員になっていくことになります。

そして、懸念に拍車をかけるのが大学における人間関係が薄いことです。
囲碁や将棋には田舎初段という言葉があって、正規の訓練を受けた人からは相手にされるほど強くないが、素人になら無双できるレベルというのがあるんです。レベル5くらい、と私は時々表現します。人間関係が薄いとこれに簡単になります。

多くの能力について、初級のときに身につけるスキルとその後にずれがあります。たとえば、数学をするにしてもはじめは九九の暗唱をします。それが得意であれば、レベル5くらいまでにはなります。それをよしとするかあしとするかはともかく、大学受験までは芸大でもなければ、田舎初段で通ってしまうというのが日本の水準です。東大でも数学が得意だと名乗って証明と称するグロテスクな画像をネットにあげている人いますよね。受験数学は好きだったが数学者とカジュアルにお話をしない法学部文学部医学部あたりではよく見ますし、理学部でさえもたまにいますね。レベル5で周りから賢い人と思われるまでになったとしても、そのあとに国家試験などでふるい落としがある場合は、やり方を変える必要に気が付かないと苦しむんですが。

田舎初段になるのは、別に学問だけじゃないです。たとえば、事務でも同じことが起きます。新型コロナウイルス感染症が日本に来た頃に「マスクを医療従事者に」というクラウドファンディングを立ち上げまして、1.5億円集めて500以上の病院にマスクを寄付しました。トップページの文章はだいたい口述筆記してもらったもので、また輸入元と配布先の選定を主にやっていました。あの頃は英語や中国語が読めたら明らかにおかしいと分かるような書類や品物が飛び交っていて、かなり立場がある人や法人等でも漫然と事務をしていると偽造された書類をさっくり踏むんですよね。京都大学が苦しんでいたので身投げする気分で突っ込んだんですが、結果的には、関税局とのやり取りが面白かったので「緊急事態における手続き変更・解釈変更――マスク・手指消毒薬不足に対しての財務省の応答――」というペーパーを税法学者と書けて、自分の中では辻褄が合いました。が、それはともかく、日本の資料読解力に危機感を持ったのは確かです。専門職でジョブ型の雇用されていると事務や執行のあたりがまったく見えなくなる方は多く、その点、日本の雇用制度の定期人事異動システムはよくできていますね。

話を少し戻すと、Google の入社試験は、そういう意味では田舎初段では難しい、ただ、レベルが10あれば通る可能性がでてきて、レベルが30くらいあれば余裕というのが私の感覚です。これの恐ろしいところは、なにかの分野では一廉でも別分野では田舎初段に容易になるということです。

学者とかでも、他分野に友人が十分にいれば、そう踏み間違えないが、孤独ならばどんどんおかしなことを言い始めます。よく分かっていないことに対して一定数が陰謀論を取るのは進化論的に正しいことだと思っていて、たとえば、新しい食べ物が手に入ったら、群れの1,2割はホールドバックエクスペリメントに割り当てて、食べないようにしないと、運悪く遅効性の毒だったら群れが全滅するでしょう。でも一部が残っていれば、それがまた繁殖して増えればいいのです。だから親子兄弟ほど仲違いをし、保険がかかるようになっているのではないでしょうか。このために、人は思い込んだら説得が効かないようにできているのだと私は思ってます。

これを止められるのは、かなり簡単に狂うことを意識していることと分野を超えた人間関係があることが揃っている場合くらいでしょう。

たとえばですが、最近、ひやっとしたことがありました。とある大企業の創業者会長と散歩しながらビッグバン元素合成の話をしていました。散歩しながら自然科学の話をするのはだいたいコーディング面接と頭の使い方が同じです。そこで、陽子と中性子の存在比がおよそ7:1になる理由を口にしようとしたところで違和感を感じ、あとで京都大学の准教授に聞いたところ、宇宙の膨張率と反応率の兼ね合いで、現在の人類の理解では必然ではないことが分かりました。

こういうことがあるので、ビッグバン元素合成の話をするときには信頼できる人にちょっと見てもらうわけです。このブレーキが壊れると簡単におかしくなります。

ちなみに、ネットで有名になるためには、田舎初段であることはかなりプラスに働きます。専門性があるとある種のためらいがありますが、仲間がいないとそれがなくなります。そして、ためらいがないほうが、一般に知的に見えるんですよね。

普段から様々な分野の学者と話し合っていると、およそまともではない専門家の意見がネットで飛び交っているのがよく分かります。特に、ネット上で声の大きい医師や弁護士の意見は、医学者や法学者の集まりでは評判が悪いです。
別に学者ならば問題がない人たちであるわけではなく、ネットによく書き込んでいる大学教授がクイズの定期便扱いされていて、どう勘違いしたらこういい出しちゃうのかというクイズが解かれているのはよく見ますね。

要は、教育を受けた人たちでさえ、仲間とお茶をしていないのです。そしてそれを見抜くのはとても簡単です。

もう一つは、家庭の話です。

エンジニアの人数で男女差がないのが中国でほぼ半々ですが、日本は2%という感覚でした。
まあ、そもそも総数もとても少ないのですが、それはともかく、男女比が問題となりました。米国では、人種によるエンジニア比率も人口比と大きくずれ、エンジニアの女性率は2,3割です。

ある日、私は東大の二年生の方に話を聞きました。すると「Google が私達なんかに興味を持つのか」と聞くのです。私は意味がよく分かりませんでした。そして、しばらくして、なぜ進振りで情報系を女性は選ばないのか聞いたところ、いろいろな理由を挙がったあとに、最後に「理学部は大学院がほぼ必須なので」といわれました。
まさか戦後生まれで大学院に行くことが人生の選択肢にないことがあるとは思わなかったので、私は本当にショックでした。30を過ぎるまでこれにまったく気が付かなかった自分自身への怒りで、視界がおかしくなっていました。浅くなった呼吸を整えて、「この程度の情報科学を学び、計算とは何かについて考え、学問がもたらす景色を見ることができると思えないことは、尊厳の……尊厳の問題だと思います。」とだけいいました。

昔、母方の祖母のところに FAX が毎晩届いていました。祖母の同級生で、第二次世界大戦とその後のごたごたで高校に行けなかった人が、一念発起をして高校受験をすることにしたので、英語を見て欲しいといって、英作文を FAX で送りつけて祖母に採点してもらっていたのです。私も二三回英作文の微妙な表現などで祖母の相談にのりました。そして、干支が一周くらい下の人たちと高校を卒業し、その後大学を受験して大学も卒業していました。

少し落ち着いた後に、私は、そういった話をいくつか思い出し、なるほど、と気がつきました。これは、私にとって、être を直接触られる話なのです。そして、最後に、新約外典のペテロ行伝に、ペテロがローマに戻ろうとしているキリストの幻を見て、自らがローマに戻り十字架に架けられることを理解する話があったことを思い出しました。

小銭のために大学に行くのも悪いとは思いませんが、私は、人として生まれたからにはこの世界について知りたいと思うのは自然であると思うのです。

ただ、男女問わず、どうしても家庭の期待がエリートになることであると、家庭の考えるエリートになるために必要な修行をさせようとします。

冒頭の方で少し言及した中学受験のアドバイザーをして御三家に入れる話でも、はじめに手を入れるのは親子関係です。まずは、親を制圧します。親が抑えきれなければ、子供を精神的に切り離して影響を受けないようにします。
だいたいの場合は、親が不安を子供にぶつけているのが悪いのでそこを止めるために、どうしても親子関係に手を入れるのが必要になります。なおさら悪いのが、親が学問をしたことがない場合で子供が苦痛を感じていないと安心しない場合です。親が高学歴のエリートでも教育を受けていない場合は多く、そうなっていることがあります。
そして、わるくて無意味、よくてもレベル5のための訓練を延々と強制されるおぞましい環境が現れるのです。

このように、家庭内の人間関係と大学内の人間関係、そして教育が問題です。常識が何かを教えてくれる人がいるだけでいいのに、家庭内どころか大学内でさえもそれが見つけられないのです。

それから、私はね、教育というのは、いつか、この人は自分を踏み越えていくと思って教えなくてはいけないと思っています。同僚たちでもそうではない教え方をする人いますが、私はこんなしょうもない内容で下々の者を調教するという態度が取れるのはちょっと理解し難いですね。

いや、正直、Google はそういうのを排除しようとしていますが、それでも儒教的な価値観が言動の端々に見られることがありますからね。実感として、北米の人々も人種差別から抜けられない人がそこそこいますね。としても、少なくとも排除しようという努力をしているだけましでしょうかね。少し前に、Google で James Damore というエンジニアが、"Google's Ideological Echo Chamber" という文章を書いて首になってましたね。当時一緒に仕事をしていました。こういう内容について話すことはなかったのですが、きっとしていたら、私は教育がどれほど後天的に人を変えられるかについて話したでしょう。私の父母世代とそれから下の世代の親戚の女性は大半が理系です。そこまでは普通にそうなるものです。(参考までに Google 元幹部の応答を私が訳したものもつけておきます。: さて、グーグル社員の書いた例の文章(声明)についてだ。 - 白のカピバラの逆極限 S.144-3)

最後に、京都帝国大学の学生たちが南方で血を流したからですが、その話はまたいつか。いや、周辺のエピソードの部分だけしてしまいましょう。

昔、神学博士に会ったことがあります。数学から経済学まで話題も広く、圧倒的な視野だなと思っているとあとで祖父がこう説明をしてくれました。あの人は京都帝国大学の経済学部で学んでいて学徒動員に取られ、南方で多くの級友たちを失ったと。それで帰ってきてから、なぜ自らが生き残ったかに悩み、卒業後に神学の道を選んで、イェールで博士を取ったと。祖父は最後に余計なことを言いました。残念なことに神学も(leider auch Theologie)博士の疑問に答えたかは分からないと。

これもまた、第二次世界大戦の末期の話です。法学部の助教授が徴兵されて広島で被爆し、数日後に京都の私の祖母宅までたどり着きました。そして、そこで、歴史上類を見ないことが起きた、近代国家が近代国家の市民を明白に標的にしたと述べたというのです。私はそこに救いを見出していて、どれほど取り返しのつかない惨めな目に(im unwiederbringlichen Elend)遭おうとも、それを理解できるならば、そこに救済があると思うのです。

そして最後に。高校時代から語学に堪能な人がいました。8カ国語を操り、在学中に旧司法試験に合格し、大学教員をしていました。私はその人の授業を受けていたのですが、他大学の教員にその話をすると、あの人が本当に知的だったときのことを君は知らないだろうといわれました。ある日、ちょっとした事件があってそれ以来キレを一切失ったのだと。
ときどき、授業中にまったく関係のない話を突然する人で、ある時、授業を受けていると、とある経済史の論文を読んだ者がいるか尋ねました。たしか、明治時代の製糸業の M&Aミクロ経済学的に扱ったものでなかなか面白かったと答えると、どこで読んだのか、と聞くのです。ああ、先学期にその先生による学生二人だけの授業を受けていて、そこで取り上げられたので読みました、というと、君は本当に幸せだな、君は本当に幸せだな、といわれました。
また、ある時、先生は「ところで君は司法試験を受けるのかね。」と聞きました。いや、受ける気はないというと、「受けてみなさい。受かるから。」と言いました。その時の表情。ええ。そう言いたくなった気持ちを私は分かるように思います。
この話を法学者の友人にして、救われている(ist gerettet)のだと、私が主張すると、その学者は私をたしなめました。

最後に

この面接が、最も胃が痛かったですね。模擬面接が終わった後のフォローアップを最もしたのもこのときでした。

今回間に合ったのは、競技プログラミングをやり込んでいたのを止めたからです。本人の努力と真摯さはもちろんですが、見ず知らずの人に常識を叩きこもうとする私の狂気も貢献していました。そして、そもそも別分野で一度教育を受けたことがあったということも大きな要素です。あれは友達とお茶をする程度のものだからです。ただ、その友達は常識人でないといけないのですが。

たしかに、Google の面接も、情報技術全体からしたら一部しか切り取っていないものです。そうであるからこそ、容易に対策することができるのです。
とはいえ、技術的に最低限のことが分かっていることになるので、社内で明らかな間違いに基づく決定がほとんどないです。私が経験した明らかに不可解な結論が出た議論は、セキュリティに関すること、統計に関すること、法律に関すること、くらいで、そのときは説明しても理解してもらえずおかしな結論になったのですが、結局すべて1週間程度で修正されていました。
つまり、基礎的な土台としては十分であり、そこから社内の大量の独自フレームワークを見て、エンジニアリングとは事物や環境の構築を通じて価値を届けることだということを習い、同僚たちと雑談をし、すぐに大きなインパクトを社会に与えるのでしょう。

せっかくなので、本を紹介したときに何を話したかと、もう少し時間があったら紹介していたであろう本を追加しておきます。

どの分野であれ、ここからここまでは常識という範囲があり、特にある程度体系化された学問はそれがはっきりしています。たとえば、ACMIEEE-CS は Computing Curricula を出しているので、それを参考にするのでもいいですし、関係する学科のカリキュラムを参考にして、その授業でどのような書籍が参考に挙げられているかを見るのもいいでしょう。

情報科学は、「作ってみた」「現実はこう」「理論的制限」の本を読むとよいと思います。たとえば、交通ルールを考えてみましょう。標識の形が各国違うように、その標識の形自体はただの約束として作られたもので、さまざまな歴史的な経緯の集積の末にできあがったものです。ただ、まったく無作為に作られるものではなく、たとえば、左側通行と右側通行が同じ道で混在すると問題を起こすことであったり、見通しが悪ければ一旦停止が必要であることであったり、速すぎる速度でカーブに突入すれば曲がりきれないから速度制限がいることであったり、さまざまな数学的物理的技術的制限がかかってきて、それ自体も知る価値があります。そして、それらを分かっている人が無人島を借り切って箱庭で交通システムを作ってみることがあり、その記録を読むと、何が起きているかとてもよく分かります。作ってみた系は意外と現実についても最低限の言及がありますね。

CPUの創りかた
「作ってみた」系の本として、CPU やメモリーの構造が分かりますので、このレイヤーを俯瞰するのによいでしょう。

・32ビットコンピュータをやさしく語る はじめて読む486
古い本ですが、このあたりで現在のマルチタスク OS をサポートする CPU が完成しますので、アーキテクチャについて、知っているべきことについてだいたいカバーしていると思います。欠けているものがあるとすれば、高速化や仮想化のための技法くらいでしょうか。興味があれば「プロセッサを支える技術」あたりがそれを埋めるでしょう。

・マスタリング TCP/IP 入門編
3ウェイハンドシェイクと輻輳制御が書かれているとなると、ほとんど選択肢がありませんでした。逆に、Tier 1 network とかは知らなくていいんじゃないでしょうか。

・岩波講座 ソフトウェア科学 オペレーティングシステム
オペレーティングシステムについての本はこれでよかったかはまだ迷いがあります。

オペレーティングシステム―設計と理論およびMINIXによる実装
一緒にタネンバウムも紹介していました。

・Webを支える技術
REST にこだわりが強い本ですが、そこは軽く流すようにと伝えました。

・ふつうのコンパイラをつくろう
コンパイラの大まかな原理は聞かれることがあるかと思います。言語に特有のことは出てこないので、そこは別で補ってください。

・Modern Compiler Implementation in ML
高速化の技法の部分は過剰かもしれません。

・30日でできる! OS自作入門
この本はたしか本屋では名前が挙がっていました。OS を作ってみようという本なのですが、周辺の技術、たとえば、ハードディスクのフォーマットである FAT16 の仕様が載っているのがいいですね。

プログラミングコンテストチャレンジブック
アルゴリズムが苦手だったら入れていたでしょう。最近の模擬面接ではコードがおぼつかない感じだと思うと、なんでもいいんですが、AtCoder の ABC 4問時代の C 問題くらいを埋めることをおすすめしています。あと、コードは書けたら終わりではなくて、どの行をどう変えたらどうなるのか、どういう場合に動かなくなるのか、どう書いたらより洗練されるのか、を考えるといいと思います。

・Introduction To Functional Programming
C++ Templates: The Complete Guide
・Purely Functional Data Structures
この辺は私の趣味ですが、関数型言語はなにか触っておいたほうがいいと思いますし、C++ テンプレートはやらかしでチューリング完全なので一回目を合わせておくべきですし、純粋関数型データ構造は見ておいて、いいんじゃないでしょうか。

・エキスパートCプログラミング―知られざるCの深層
・Modern C++ Design
・Effective C++
・Exceptional C++
競技プログラミングの始祖のあたりの人たちは、C++ 使うならばこのあたり読んでいた気がします。最近の C++ はちょっと違うものですが、大切なのは、見慣れていて使役しているものが本性はおぞましいという感覚じゃないでしょうか。

言語は何でもいいと思うのです。たとえば、従妹にはじめてプログラミングを教えたときは C++ でしたが、妹には Perl + SQLite という構成で教えました。Perl は、たとえばレキシカルスコープとダイナミックスコープが両方あるなど、とても教育的にいい言語です。ただ、とにかく表層的にしか理解していない人や本であふれていて、社会的なノイズのせいできちんと理解するのが大変です。私は、大学の同期を問い詰めるまで、振る舞いが分かりませんでした。なお、その人も合宿のメンバーで Google の同僚になりました。

・入門 コンピュータ科学 ITを支える技術と理論の基礎知識
これは、最近見つけたんですが、広く書かれていて、とりあえず、これもいいんじゃないでしょうか。


必要な能力は「椅子に座れること」「四則演算ができること」「本が読めること」だと思います。

そしてできるだけ多くの人と話をしてください。


なにかあれば、Twitter の DM 開放してますのでどうぞ。

twitter.com