GAFA,入りたいですよね. エンジニアであれば一度は,「Googleで働いてみたいなぁ~」と思ったことがあるのではないでしょうか. 新卒ででソフトウェアエンジニアとしてGAFAのどれか(特定を避けるために,一応どれかは秘させて下さい)にソフトウェアエンジニアとして合格した経験から,これらの企業に入るためにどのような準備をすればいいのかをまとめました.
さすがに「この問題が出ます!」ということは守秘義務的に言えないのですが,一般的な対策くらいはお伝えできると思いますので,紹介していきます!
必要な能力一覧
まずざっくりと,どのような能力が必要なのかについてまとめます.
- ビジネスレベルの英語力
- コンピュータサイエンスの基礎
- ある程度のプログラミング能力
- 企業研究 おおよそは予想通りかもしれませんね. ここからは,それを深く説明していこうと思います.
ビジネスレベルの英語力
まず初めに,日本法人であってもこれらの企業のソフトウェアエンジニア枠の面接は英語が含まれます. メールのやり取りや説明会では日本語が使われることもありましたが,そもそも面接官は外国の方でおそらく日本語は通じなかったと思います(試していませんが……).
ソフトウェアエンジニア職は海外とのやり取りも多く発生し,日本語が通じない人と作業することもしばしばです. ですので,そもそも応募条件に英語でのコミュニケーション能力が課せられています. そしてこれは当然のことではあるのですが,採点するにあたっては,もちろんですが採用担当者の心証が一番です. つまり,コーディング面接などで実際にコミュニケーションをしていく中で,「この人となら気持ち良く仕事ができそうだ」と採用担当者に思わせる必要があります. そのためには,ビジネスレベルの英語力のほかにも,「日常会話力」も必要になります.これはつまり,英語を意思伝達の手段に留めないということです.
コミュニケーション方法の違い
一般に日本語と英語ではコミュニケーションの形が違います.例えば英語では,大体どんなときにもまず「褒め」から入ります.人が何か提案をもってきたら,仮にそれに不備があってもたいていまず「それはいいね!」から入ります.これはつまり,英語話者は会話にお世辞が入っているのを前提し,それを差し引いて考えるということです.
逆に,それがない場合「機嫌悪いのかな?」とか「不愛想だな」という認識になります.日本でいえばなんかちょっと返事がぶっきらぼうであるとか,そういうのに相当するんでしょうか(このあたりの細かいニュアンスは私もネイティブでないのでわかりません). 具体的には,コーディング面接などでアドバイスを受け,それに対して疑問点が残るとします.この時,感謝の言葉や褒めの言葉を一切入れずに「この点がわからないんですが」とだけいうのと,「なるほど!それはいいアイデアですね.ただこの点が私にはまだわかっていません.」というのでは,相手に与える印象(丁寧さ)が全然違います.日本人からするとお世辞を言っているようで少しくすぐったいかもしれませんが,これは正直慣れるしかありませんので,こちらからも是非使っていきましょう.
エンジニアの方の中にはそういうコミュニケーションの部分は些末な問題だと思われる方もいるかもしれませんが,意外とそういう部分で最後に差はつきますので,気を付けておくに越したことはないと思います.
英語力の鍛え方
とはいっても,なかなか鍛えるのって難しいですよね. そのために一番お勧めできるのは,「留学生と話す」ことです.留学生は身近にいますか?エンジニア志望の留学生がいるなら,ぜひ仲良くしましょう.彼らとのコミュニケーションは,まさに面接官とのコミュニケーションです.
相手がいない場合は,なるべくですが課金をしてでも英会話の練習をしたほうが良いと思います.英語面接ではリスニングもスピーキングも必要です. それも厳しければ,英語の映画を見ましょう.そして,日本語とはコミュニケーションが違うなという部分を実感してほしいです.
コンピュータサイエンスの基礎
これは例えば「アルゴリズムとデータ構造」であったりとか,「CPUとメモリがどう協調動作しているか」であったりとかの,まあ情報科学科であれば学部で習うような内容です.コンピュータサイエンス専攻であればここら辺は押さえていると思いますが,なかなか独学では難しいでしょうか.前者はコーディング面接で,後者は面接の中で聞かれたりします.いわゆる「基本情報技術者試験」に受かる程度の知識はあったほうがいいかもしれませんね.これはアフィリエイトですが,例えば以下の教科書とか使うとよいと思います(実際に使った教科書なので許してください). そのうち入れるので少し待って
体系的知識をつけよう
若干コラムチックになりますが,エンジニアの勉強って虫食い式になりがちなんですよね.必要になるたびにかじっていくっていうんでしょうか.それが実際手っ取り早いですし,業務に役に立つのもわかります.ですが,やはり一度は体系的に学習することが大事だと思います.業務には出てこないようなレイヤーの話でも,知っていると役に立つときが来るかもしれませんし,新しく理論を一歩踏み込むときには過去の理論を知っていないと仕方ないですからね. 学生で時間があるうちに,網羅的だったり体系的に基礎を学んでおくのがよいと思います(応用はいつでも学べますからね!).
ある程度のプログラム能力
ある程度って変な言い方ですが,これはつまり「スーパープログラマ」ではなくてよいというだけでなく,「程よくプログラムができればよい」位に思います.というのも,受けた中どこでも,新卒では実装力はそこまで問われてなかったと思います.例えばAtCoder という競技プログラミングの人気サービスがありますが,それでは,たぶん緑になるくらいの力があれば十分なくらいに思えます(私は水色辺りで満足して足が遠のいてしまいましたが……).軽くデータ構造を理解して,必要とあればそれを使える.簡単なもの(二分木とか深さ優先探索とか)は自分で実装できる.それくらいではないでしょうか.
コーディング面接・試験の種類
コーディング面接は主に外資系のITで終盤に,コーディング試験はメガベンチャー含めた多くのITで序盤に行われます. コーディング試験は例えばTrack やHireRoo なんかが有名ですね.選択肢式の問題も記述式の問題もありますが,例えばTrackであれば「試験作成ができる エンジニア職種・役割の一例」(このリンク の途中)に職種別のなんとなくの計測能力が書かれており,もしかしたら事前準備に使えるかも?(自分の時はそこまで頭回らなかったので見てなかったですが,少しは参考になるかもですね)
一方でコーディング面接は対人で行われるため自由度も高く,なかなか対策も難しいですね.とはいえ,時間制限もありますからよっぽど難しい問題は出ない印象です.解けるかどうかがすべてではなく,どのように面接官とコミュニケーションを取りながら解に進んでいくのかを一般的には見る面接ですから,緊張しすぎず,面接官と対話を試みることが必要です.この時に,英語力とコンピュータサイエンスの知識が生きますよ.
コーディング練習をしよう
一応コーディングの練習としてはLeetCode というものが有名で,私も少しだけやっていました.新卒ではMediumが半分解けて半分解けないくらいの感覚で平気の肌感覚です.また,いろいろな企業が足切り的にコーディング試験を行っていますが,私にはLINEのインターンの時の試験が一番難しく,外資を含めたほかのITのコーディング試験はそこまででもなかったように思います.夏インターンにいろいろとメガベンチャーなどに応募してみて,コーディング試験を体験しておくのも懸命だと思います. とはいえ, プログラミング能力がすべてではない! ので,すべての時間をここに費やさないようにしましょう.多分英語やったほうが(就活的には)効率的だと思います.もちろん,両方が大事ですよ.
言語は(メジャーなら)何でもよいことが多い
コーディング試験とコーディング面接,二つの段階でコードを書く機会が考えられますね.前者は足切り的な側面が強いので,自動化の観点から言語が絞られています.ですが例えばC++やPythonといったメジャーどころは使えますので,好きなものを選びましょう.後者は対人でしょうから,自分から「○○使いたいんですがいいですか?」といえば,基本的にはOKしてもらえると思います.
企業研究
エンジニア志望の人は妙にここを疎かにしてしまうことがありますが,最重要です.
志望している会社が何をしている会社なのか,何を大事にしている会社なのか,新卒社員に何を求めているのか.いずれも大事です.
英語もプログラム能力もある程度の水準に達していれば(よっぽど突き抜けていない限り)天井で大体同じ評価になりますから,最後に差をつけられる部分です.しっかり対策しましょう.
調べる内容は深ければ深いほどいいですが,時間も有限なので,例えば私の記事((工事中)Googleの就活情報)などを読んでもらうとともに,公式サイトくらいは目を通してみましょう.
さすがにIR資料まで読む就活生はあんまりいないと思いますが,知識としてはあったほうがいいですよ.入社後ギャップを避けるためにも.
Googleの場合
例えば公式サイトのGoogle 東京オフィスでエンジニアとして働くということ を見てみましょう. いろいろとQAが並んでいますが,有用そうな情報がありますね.
Q:面接における質問は競技プログラミングでの質問と同じですか?
A: いいえ。コーディングに関する質問もありますが、他の様々な質問も行います(例:API デザイン、プロダクトデザイン)。面接の目的は、問題解決能力とプログラミングスキルを確認することにあります。詳細はこのサイト(英語) とビデオ (英語) を参照してください。
なるほど,Googleでは競技プログラミングが役に立つ一方,それだけではだめだと釘も刺されています.最初のリンク に飛べばわかりますが,Googleはコンピュータサイエンスの知識を学んでいてほしいようですね.ちなみにもう一つのリンク はコーディング面接の具体例でした.7年前と大分古いので今の形式とは違いそうですが…… 大体の会社は今どきはオンラインだと思います.
またそのほかにも,
Q: 東京オフィスではローカリゼーションのみをしているのですか?
A: いいえ。ほぼ全てのエンジニアは全世界のユーザを対象にしたプロジェクトで働いています。
とあります.これはおおむね,その少し上にも書いてありますが「海外のエンジニアと協力して全世界向けのプロジェクトに参加する」ということを意味しています.つまり,日本に閉じた存在ではなくて,海外に羽ばたいていくような人材をGoogleは求めており,自分がそのような存在であることを面接官にうまく伝えることが肝要であるといえそうです.
Amazonの場合
もう一つ見てみましょう.今度はAmazonです.SDEの職種説明 にあるように,Amazonでは主に日本ならではの習慣を踏まえた機能開発・改善が重視されていることがわかります.Googleと比べてBtoC色が強いということもあってか,比較的的を絞っているように思いますね.とはいえ,日本で開発されたサービスが海外に逆輸入されるということも書いてありますし,ビジネスレベルでの英語力が必須と書いてありますから,グローバルに展開するエンジニアもいそうです. もう一つリンクを見てみましょう.これは有名な話でもありますが,AmazonにはOLPと呼ばれる16箇条 が存在し,明示的に「求める人物像」と表現されています.16個をここで列挙することはしませんが,面接官に自分がこのOLPを体現している人間であることをアピールできるかどうかが面接では合否の分かれ目になるように思われますね.
まとめ
いろいろと書いてきましたが,
- ビジネスレベルの英語力
- コンピュータサイエンスの基礎
- ある程度のプログラミング能力
- 企業研究
これら4つが主に外資ITで求められる選考対策だと自分は思っています.これが正解とは限りませんが,英語の話とか書いてる記事あんまりみたことなかったので,参考になればと思います. 長い目で見て英語,そしてコンピュータサイエンス.中期的にプログラミング試験対策と企業研究.どれもなかなか大事に思いますので,ぜひ頑張ってみてください.