tag:crieit.net,2005:https://crieit.net/users/anonymouse-engineer-ecrit/feed 然るエンジニア🙊の投稿 - Crieit Crieitでユーザー然るエンジニア🙊による最近の投稿 2019-10-20T08:28:29+09:00 https://crieit.net/users/anonymouse-engineer-ecrit/feed tag:crieit.net,2005:PublicArticle/15492 2019-10-20T08:28:29+09:00 2019-10-20T08:28:29+09:00 https://crieit.net/posts/6729b9bbea0198a976917cfbc1af23df 待てど暮らせど <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップ</a> <a href="https://crieit.net/posts/acbf740434bef542013b122e814419a0">> 前回のお話</a></p> <hr /> <p>その昔日本で大学生をしていた時に同級生から聞いた話によると、新卒採用では受かっていると直ぐに電話がかかってくるが、落ちているとなかなか電話がかかってこないらしい。今もその通りなのかは分からないけれど、シリコンバレーでの僕の就職活動の経験(落とされた経験)はそれとは随分違っているように思う。落とすときの連絡は直ぐにくるし、プロセスが進めば進むほど、受かった時の会社側の対応が遅くなる。きっと日本の新卒では「決められた上限一杯になるべく良い人を探す」のが目的なので、面接の結果の良い人から順番に返答をしていくのだろう。一方で僕がやっている転職活動では、基本的に空いているポジションに合った人を探すのが目的なので、合わない人をどんどん切り捨てていく形になるのではないのだろうか?こちらでも (Newly Graduate) と書かれた新卒用のポジションを見ることがよくある(LinkedIn のレコメンデーションシステムがその辺を区別してくれないせいで)が、僕は縁がなかったので実際のところは分からない。昔こちらで面倒を見たインターンの学生が、「Google (のインターン)に受かったんだけど、面接の後のチームマッチングプロセスがクッソ時間かかったから、他に行くことにした」と言ってるのを聞いたことがある。チームマッチングプロセスがとても時間がかかる話はネットでも散見される。<br /> 話は逸れたが、Amazon のコーディングテスト + 抜き打ちインタビューから3日が経った頃、僕は不安になり始めた。「あれ、もう忘れられてるんじゃないの?」そう思ってメールで問い合わせをしてみた。返信が来たのはさらに3日が経った頃だった。リクルーターのアマンダにもまだ結果は分からないから、もう一週間ほど待ってみてとのことだった。この頃から長い間、僕はずっと慢性的な不安に苛まされ流ことになる。</p> <p>結局、連絡が帰ってきたのは3週間も経った頃だった。3月になっていた。アマンダから電話がかかってきて次のステップに進むと言われた。次のステップからは違うリクルーターが話を進めるとのことだった。次のリクルーターはシアトルにいるマシューだった。例のごとくメールでの紹介が済んだあと、電話の予定を決めた。</p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15380 2019-09-07T10:54:08+09:00 2019-09-07T11:06:11+09:00 https://crieit.net/posts/c91b4d0886e4e5d4e1680a1224edb153 番外編:最近のプライバシー関連の報道で思い起こされる話。 <p>最近のプライバシーに関する報道を見ていて、3月の中頃にこんなメールを LinkedIn 経由でもらったことを思い出した。</p> <hr /> <p><strong>Job Opportunity at Apple!</strong></p> <p>Hi Taro, I came across your profile and wanted to see if you're open to new opportunities. I have an Japanese Language Engineer Position with Apple in Cupertino that you may be a great fit for. I am looking for someone who has experience with ML/NLP and can code in Java, Python, Shell, or equivalent. If interested in further discussion, please pick a time that works best for us to hop on a quick phone call! If you currently are not interested, but know someone within your network that may be, please feel free to forward them my information as we do offer a referral bonus for anyone you refer that is placed on the project. Looking forward to hearing from you!</p> <hr /> <p>クパチーノのアップル本社で日本語の機械学習・自然言語処理のできる「日本語エンジニア」を探しているという話だった。「日本語エンジニア」って肩書きはなんやねんとも思うのだが。</p> <p>「え?何これ?こんなあつらえ向きの話あるの?」</p> <p>メールを何度も読み返して自分の理解が間違ってないことを確認したら、急いで返信のメールを認めた。</p> <p>(今改めて読み返してみると、「Java, Python, Shell もしくは同等の言語で実装の出来る」という表現は、Java と Python を同等とみなすのはよいとしても、Shell をそこに混ぜると何がなんだか分からなくなると思うのだが。)</p> <p>このメールをくれたリクルーターの女性は電話で以下のようなことを言った。</p> <ul> <li>アップルは機械学習の拡大に力を入れていて、英語以外の言語にもリソースを投入しようとしている。</li> <li>仕事の内容は集まった Siri のデータの解析とそれを使用するエンジニアとの調整</li> <li>採用プロセスはマネージャーとの電話のみ</li> <li>労働時間は調整可能</li> </ul> <p>「え、フルタイムじゃないんですか?」</p> <p>「ええ、コントラクターになるの。」</p> <p>コンタラクターか。。。それ以外の内容は申し分ないのに。</p> <p>「コントラクターは、ビザ的に働けるか分からないですね。ちょっと。」</p> <p>「うちで H1B ビザで働いている人は他にもいますよ。成果が認められて正社員にいなった人もいます。</p> <p>労働条件は正社員と同じですよ。給与の支払い元と福祉条件だけが違います。</p> <p>でも、うちもビザのサポートをしてますよ。」</p> <p>「仮になんですけど、不況やらで人員調整の解雇になったらどうなりますか?」</p> <p>「うちを通して他の派遣先を探しますよ。」</p> <p>「ちょっとコントラクターという雇用条件が不明点が多いので、軽くリサーチをしてみますよ。」</p> <p>「分かりました。ではまた追って連絡しますね。」</p> <p>アップルのコントラクターについて軽く調べてみると、あまりいい話は出てこなかった。まあ部署によっても違うのだろうけれど。</p> <ul> <li><p><a target="_blank" rel="nofollow noopener" href="https://www.quora.com/What-is-it-like-to-work-at-Apple-as-a-contractor">What is it like to work at Apple as a contractor?</a></p></li> <li><p><a target="_blank" rel="nofollow noopener" href="https://www.techspot.com/news/78705-apple-contractors-face-second-class-treatment.html">Apple contractors still face second-class treatment</a></p></li> </ul> <p>アメリカでも日本でよく聞く(というか2ちゃんねるでよく見る)派遣・正社員論争とそう変わりないようだった。僕に取っていちばんの問題は LinkedIn に書けないということだった。それでは次の転職の際に苦労することになる。</p> <p>そもそもアップルは正社員でも労働環境が良くないというのに、コントラクターでは中々の地獄を見るのではないだろうか?</p> <p>(今のところシリコンバレーであった人々の中で日曜日も仕事をしているのは、アップルで働く日本人だけだ。)</p> <p>ま、電話がかかってきたら丁寧にお断りするとしよう。そう思ったが、フォローアップの電話はかかってこなかった。</p> <p>時は変わって、2019年も Q2 あたりになるとこの辺の話題のプライバシーに報道が敏感になってきた。</p> <p>4月ごろには Amazon Alexa の会話を従業員が聞いているという報道があった。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.cnn.com/2019/04/11/tech/amazon-alexa-listening/index.html">Amazon reportedly employs thousands of people to listen to your Alexa conversations<br /> アマゾンが Alexa の会話を聞くために数千人規模を雇用しているとの報道</a></p> <p>このようなシステムのバックグラウンドに従事している者としてこのニュースを初めて聞いた時には、そこまで驚きはしなかった。僕自身も似たようなことを仕事柄することもあるからだ。ただしそれは合法的に、前もって明確な了解を得られた会話に限る話だが。まあ僕も、そんな仕事をしていなければ、驚いただろう。</p> <p>そして7月、似たような注目が Apple の Siri にも飛び火した。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.theguardian.com/technology/2019/jul/26/apple-contractors-regularly-hear-confidential-details-on-siri-recordings">Apple contractors 'regularly hear confidential details' on Siri recordings<br /> アップルの契約社員が Siri の録音を定期的に確認していることが判明</a></p> <p>あれ、この契約社員の案件、前に来てたやつじゃん!と思って楽しく記事を読んだ。<br /> 案件の話を聞いている時はプライバシーの話は全くなかったことはないにしても、それでも大きな注目はなかったと認識している。世論は短い時間で大きく変わるものだなあ、と思っていると続報が入ってきた。</p> <p><a target="_blank" rel="nofollow noopener" href="https://techcrunch.com/2019/08/01/apple-suspends-siri-response-grading-in-response-to-privacy-concerns/">Apple suspends Siri response grading in response to privacy concerns<br /> アップルはプライバシー上の懸念に応えてSiriの応答評価を停止中</a> <a target="_blank" rel="nofollow noopener" href="https://jp.techcrunch.com/2019/08/03/2019-08-01-apple-suspends-siri-response-grading-in-response-to-privacy-concerns/">[日本語]</a></p> <p>これは少し僕には予想外だった。まあアップルは昨年の年次会議からプライバシー保護を前面に押し出しているいるので筋の通る話ではあるし、このリアクションこそがアップルが真剣にニュースを受け止めているという証拠だろう。幹部陣の中にもきっと報道を受けて初めてなぜ会話の解析を行う必要があるか説明を受けた人もいることだろう。</p> <p>はて、じゃあ契約社員の人々はどうなったのだろう?やはり契約終了になったのだろうか?僕は雇用条件的にこの仕事に就くことはきっとなかっただろうが、中々他人事にも思えない話だった。</p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15371 2019-09-03T07:37:31+09:00 2019-10-20T08:30:41+09:00 https://crieit.net/posts/acbf740434bef542013b122e814419a0 不意打ち <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップ</a> <a href="https://crieit.net/posts/81831039f649c70bf0465a8915a96430">> 前回のお話</a></p> <hr /> <p>Amazon のコーディングテストを受けてから数日後、オフィスについて車を降りたところでテキサスからの着信があることに気付いた。誰だろうと思って掛け直すと Amazon リクルーターのアマンダだった。</p> <p>「ハイ、タロー。Amazon のアマンダです。コーディングテストの結果とその次のステップの話をしたくて電話しました。それで、結果なんですけど、」</p> <p>こちらが相槌を打つ暇も与えずに、切羽詰まったかの様子でアマンダは話し続けた。</p> <p>「あの、ちょっと今は時間がないので、折り返してもいいですか?えーっと、11時半はどうですか?」</p> <p>「ええ。わかりました、それでは。」</p> <p>リクルーターと電話で話をする際のストレスの一つは、こういった急にかかってくる電話だった。リクルーターにとっては候補者と話をすることは仕事の範疇内だが、候補者にとっては範疇外になる。オフィスで電話を取っても、話をするためにはプライバシーの確保できる場所まで移動しなければならないし、メモも取れない状況で様々な要件をまくし立てられても全部は聞き取れない。携帯電話のような低品質の音声で、相手が外国訛りならほとんど何をいっているか分からない。加えて、求職の身はどうしても遜った態度になりがちになる。電話する場合は緊急の場合を除いては前もって時間を指定するメールをしてほしいものだ。その方が話すべき内容も事前に準備できるのでより良いコミュニケーションになる。</p> <p>そんな訳で、アマンダと話をするために昼前にまたまた例のスターバックスへやってきた。コーディングテストのフィードバックということで、特にヘマをやらかした覚えもないし、次のステップ(電話面接)の予定を決めるのだろうと思い、ある程度の日程に思いを巡らせてから電話に臨んだ。電話に出ると、アマンダは挨拶もそこそこに話始めた。</p> <p>「それで、コーディングテストなんですけど、良い結果が返ってきました。それで次のステップに進んでもらおうと思っていて、それに関していくらか質問したいんです。」</p> <p>「ええ、わかりました。」</p> <p>僕は手元のカレンダーに目を落とした。</p> <p>「ls と cd が何をするかご存知ですか?」</p> <p>「・・・はぁ?」とほとんど声に出かかった反応が僕の頭の中では響いた。</p> <p>「え? Linux のコマンドの話ですか?」</p> <p>「ええ、そうです。ls と cd が何をするかご存知ですか?」</p> <p>「こいつ何言ってんの?」と思いながら、僕は答えた</p> <p>「ls は現在のディレクトリの中身を表示します。cd は引数にディレクトリをとれば、そのディレクトリに移動しますし、そうでなければ、ホームディレクトリに移動します。」</p> <p>「なるほど、分かりました。ハッシュマップの利点と欠点を教えてもらえますか?」</p> <p>「ハッシュマップっていうのはデータ構造の話ですよね?」</p> <p>「ええ、そうです。」</p> <p>「えーとまず、ハッシュマップはコンスタントタイムでのリトリーバルを実現しますね。欠点はバケットのサイズが固定なので、アイテムの数がバケットのサイズに比べて小さい場合にはメモリが無駄になるかと思います。」</p> <p>ハッシュテーブルの話などここ数年していなかったので、ぱっと聞かれてまとまった答えを返すことは叶わなかった。後になって、欠点のメモリの話をする前提のバケットによるハッシュ関数の話をするのを忘れていたことに気付いた。今になって思うと、多分「通常の配列と違いインデックスによるリニアアクセスが出来ない」とかが期待されていた模範回答だった気がする。当たり前すぎるが。</p> <p>「Post-Order Traversal とはなんですか?」</p> <p>「木構造の Depth-first Seatch の話ですよね?」</p> <p>木構造がインタビュー必出の話題とは言え、その前提を飛ばすとはなかなか不親切な聞き方をしてくれる。</p> <p>アマンダは他にいくつかのアルゴリズムとデータ構造に関する質問をした。僕はたじろぎながらなんとか答えをひねり出していった。</p> <p>「分かりました、ありがとう。以上で聞きたかったことは全部です。今日の結果を踏まえたフィードバックを提出しますので、また連絡しますね。」</p> <p>「ええ、ありがとうございます。」</p> <p>なんとも腑に落ちないモヤモヤした気持ちを抱えながら、僕は店を後にした。不意打ちの電話に加えて不意打ちのテストとは。</p> <p>ただ、気になるのは、果たしてアマンダには僕の返答をきちんと理解する知識があったのだろうか?受け答えの感じからして彼女が前もって用意された質問リストから質問を選んでいるのは明らかだった。今日の問答は誰によってどうやって評価されるのだろうか?効率重視の Amazon のことだからおそらく彼女が電話越しに丸バツの判断を下しているのだろう。結果は果たして。。。</p> <p><a href="https://crieit.net/posts/6729b9bbea0198a976917cfbc1af23df">第十話</a>に続く。</p> <p><a href="https://crieit.net/posts/c91b4d0886e4e5d4e1680a1224edb153">番外編:最近のプライバシー関連の報道で思い起こされる話。</a></p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15320 2019-08-12T11:29:32+09:00 2019-09-03T10:14:27+09:00 https://crieit.net/posts/81831039f649c70bf0465a8915a96430 コーディングテスト - 実践編 <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップ</a> <a href="https://crieit.net/posts/f25b2f7288e2fb366eb8923cfe444bd8">> 前回のお話</a></p> <hr /> <p>コーディングテストであれ、次の面接の予定であれ、リクルーターは基本的にはこちらの予定を加味してアポを入れてくれる。毎度毎度予定を詰める段になると、「次のアポまでに予習と準備したいから二週間ぐらい空けるかな。」という発想である程度時間を開けるのだけれど、時間に余裕を持てば持つほどに、本番が近づいてきたときの緊張感とストレスもより一層大きくなる。</p> <p>そんなこんなで、コーディングの練習は十日ほどで見切りをつけて、Amazon のコーディングテストを受けることにした。<a target="_blank" rel="nofollow noopener" href="https://leetcode.com/problemset/all/">Leetcode.com</a> の問題でだいたい Easy を1日3問で一週間。これでメインのトピック<a target="_blank" rel="nofollow noopener" href="トピック">†</a>を網羅した後、Medium を1日1問。それぐらいやると「もう十分だろう、もうやりたくない。」という気持ちで、テストから逃げるモチベーションから早くテストを終わらせたいモチベーションにシフトしていった。</p> <p>コーディングテストではリクルーターが送ってくる専用のリンクにアクセスしてこれらの課題に取り組む。リンクは一週間で失効するので、自分の予定を加味してリクルーターにテストを発行してもらう。Amazon は myamcat.com というオンラインサービス<a target="_blank" rel="nofollow noopener" href="UI">††</a>を使っている。テストを始める際にこのサイトは定期的にスクリーンショットをとる、タイピングを記録するなど、なかなか気持ち悪い要求をしてくる。これを許可しないとテストを受けられないのだがなんともスッキリしない。なんでも、こうしないと課題でズルをする人が後を絶たないからだそうだ。<br /> テストは大体全部で2時間ほどで、コーディングの課題が二問と性格・行動適正診断がある。コーディングテストは全部で二問、合計で最大 90 分かけることが出来る。どちらの問題も「Amazon では、」と、一応問題をそれなりにカスタマイズしたような始まり方だった。一問目は以下のようなものだった。さて、これを読んでいるあなたは何が問われているかお分かりだろうか?</p> <hr /> <p>Amazon では、顧客第一をモットーの一つに掲げていて、商品を配達する際には最も早く商品が配達されなければなりません。出発地点、目標地点、通行不可能な道が与えられた場合に、最短経路を求めるプログラムを実装しなさい。経路情報は2次元配列として与えられます。</p> <pre><code>入力例 [ ['s', '0', '0', '0'], ['0', '0', '1', '0'], ['0', '0', '1', 'g'], ] </code></pre> <pre><code>出力 5 </code></pre> <p>上の例では、<code>s</code>, <code>g</code> はそれぞれ出発地点、目的地点を表し、<code>0</code> は通行可能な経路、<code>1</code> は通行不可能な経路を表します。</p> <hr /> <p>問題の文章はもう少し説明が丁寧だったかもしれないが、まあ大筋は伝わるだろう。二次元のマップが与えられた場合の最短経路はどのようにして求められるだろうか?これを書いている僕の頭の中ではダイクストラ法という言葉が思い浮かんでいるが、それはこの問題にはオーバーキルだろう。この問題を実際に解いている際にはダイクストラ法のことなど思いもしなかったのだが、それはきっと事前練習のおかげで脳がよりコーディングチャレンジ仕様になっていたからかも知れない。では、どうすればよいかというと、模範解答は幅優先探索 (BFS) だろう。</p> <p>木構造に関する知識、探索方法(幅優先(BFS)、深さ優先(DFS))や、深さ優先探索の場合の処理の順番の違いなどは事前に習得していることが期待される知識だ。他にはリンクドリストや、ハッシュマップ、ハッシュテーブル等の特性、ソートアルゴリズムや再帰的な実装がよくテストされる。今回の課題では BFS を使って二次元配列の要素をどのように処理できるかを考える必要がある。</p> <p>と、ここまで尤もらしいことを述べたが、実際には、この「2次元空間の最短距離」の問題は頻出問題の類なので、練習問題を多くこなした人なら大体みたことあるはずだし、課題に取り組む際にはそうであることが理想だと思う。そんな訳で実装の方法は例えば<a target="_blank" rel="nofollow noopener" href="https://www.geeksforgeeks.org/shortest-distance-two-cells-matrix-grid/">ここ</a>で詳しく説明してあるので、ここでは割愛することにする。僕は見た瞬間に「あぁ BFS か。」と思ったので、どのようにしてそこにたどり着いたのかはうまく説明できない。きっと着想方法を説明したサイトも探せばあると思うので、それは読者の皆さんに委ねることにする。</p> <p>二問目も同じような配送をテーマにした2次元配列を扱う問題だった。動的計画法を使うナップサック問題系の課題だったような気がするが、残念ながら忘れてしまった。</p> <p>メインのコーディングが終わると、自身の解法に関する記述課題になる。要は自分の実装を評価するわけだが、ここで大切なのは時間とメモリに関する計算量をきちんと記述すること。O記法(ビッグオーノーテーション)を使って、入力のサイズが変わると、計算時間とメモリ消費量にどのような影響が出るのかを評価する。</p> <p>例えば、上に挙げた最短経路の問題を BFS で解いた場合を考えると、目的地が見つかるまでノードを一つずつ処理していくので、計算にかかる時間は(最悪の場合で)与えられたマップのサイズに比例する。<code>n</code>, <code>m</code> をマップの辺の大きさとすると、<code>O(n*m)</code> となる。メモリ消費量は、辺の長さのうち、短い方に比例するので <code>O(min(m, n))</code> となる。</p> <p>頻出アルゴリズムの時間及びメモリ消費量の性質は覚えておくと、問題を解くときの判断の助けになる。忘れてしまった場合はさっと検索すればすぐに出てくる。</p> <p>さて最後は性格診断である。これは選択問題形式で、日本の就活でよく見る SPI 等とよく似ている。「時間の余裕がない時でも落ち着いて対応できるか」などという実質一択問題がたくさんある。Amazon の場合は<a target="_blank" rel="nofollow noopener" href="https://www.amazon.jobs/en/principles">リーダーシップ理念</a>というものを公に掲げているので、解答に困ったら、それに即したものを選べばよい。<br /> 全てに答えて、提出ボタンを押すとテスト完了となり、リクルーターに結果が送られる。リクルーターは結果を基に次のステップをアレンジする。</p> <p><a href="https://crieit.net/posts/acbf740434bef542013b122e814419a0">第八話「不意打ち」</a>に続く。</p> <p> </p> <p> </p> <p> </p> <h5 id="脚注"><a href="#%E8%84%9A%E6%B3%A8">脚注</a></h5> <h6 id="トピック"><a href="#%E3%83%88%E3%83%94%E3%83%83%E3%82%AF">トピック</a></h6> <ul> <li>Data Structure <ul> <li>Array</li> <li>Tree Structure <ul> <li>Binary Tree Seach</li> <li>Trie</li> </ul></li> <li>Stack / Queue <ul> <li>FIFO / FILO</li> <li>Priority Queue</li> </ul></li> <li>Hash Table <ul> <li>Bucket Implementation</li> </ul></li> <li>Linked List</li> <li>Graph <ul> <li>Directed acyclic graph</li> <li>Adjacency Matrix</li> <li>Adjacency List</li> </ul></li> </ul></li> <li>Algorithms <ul> <li>Sort <ul> <li>Quick Sort</li> <li>Merge Sort</li> </ul></li> <li>Iteration vs Recursion</li> <li>Dynamic Programming</li> <li>String Hashing <ul> <li>Palindrome Detection</li> </ul></li> </ul></li> <li>Others <ul> <li>Big O notation</li> <li>Stack vs Heap</li> </ul></li> </ul> <h6 id="UI"><a href="#UI">UI</a></h6> <p>二年ほど前にもこのテストを受けたことがあるのだけれど、インターフェースが中々分かりにくくて、その時は次の課題に進むボタンだと思って押したボタンが提出ボタンだったことがある。その結果はお察し。</p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15302 2019-08-05T04:40:21+09:00 2019-09-03T10:14:49+09:00 https://crieit.net/posts/f25b2f7288e2fb366eb8923cfe444bd8 コーディングテスト - 練習編 <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップ</a> <a href="https://crieit.net/posts/032b38ba6ac32fcfc16f4707ae8c2a50">> 前回のお話</a></p> <hr /> <p>最初のヤマであるマネージャーとの電話は驚くほどつつがなく終わったので、その次の日曜日に、Amazon の最初のステップとなったコーディングテストを行った。</p> <p>コーディングテストには、きちんと作動するコードが要求される。ブラウザーでテストサービスにアクセスし、専用のエディター上で要求されるコードを実装する。エディターにはテスト機能が付いていて、これを使うと前もって決められた入力パターンを試していき、正しい出力が得られるかどうかを確認する。要はユニットテストである。もしも正しい出力が得られない場合は、時間が許す限りコードを修正することができる。入力テストのパターンには大体エッジケース(特別な例外的な処理が要求される場合)や、入力データのサイズがとても大きい場合等が含まれていて(効率の悪い方法であれば時間内に処理が完了しないので不正解扱いになる)、これらを正しく処理できることが合格の要件になる。</p> <p>このような課題はソフトウェアエンジニアの分野ではよくあるもので、インターネット上には練習に使えるサイトがたくさんある。リクルーターによってはそのようなサイトのリストと練習する際に気をつけることのリストなんかを一緒に送っくれて、受験者にどのように対策をすればいいか助言してくれる。というか、リクルーターの仕事はなるべく多くの採用者を出すことなので、大体のリクルーターがこのような対策用の資料を送ってくれる。例えば Facebook は<a target="_blank" rel="nofollow noopener" href="https://www.facebook.com/careers/life/preparing-for-your-software-engineering-interview-at-facebook">専用ページ</a>で詳しい流れを説明してる。(<a href="#Google">Google は脚注参照</a>)だからテストや面接が始まって予期していなかったということはまずない。</p> <p>練習用サイトでよく名前が挙がる中<a target="_blank" rel="nofollow noopener" href="練習サイト">†</a>では <a target="_blank" rel="nofollow noopener" href="https://leetcode.com/problemset/all/">leetcode.com</a> が使いやすいと思う。日常的にコーディングを行なっている人は、練習する際には要求されていることが普段のエンジニアリングと違うということを意識するとよいだろう。エンジニアリングで重要なことは必ずしも課題を説く上では重要ではない。(メンテのしやすさとか。)僕は leetcode.com でまず Easy を解きながら、一通りのトピックをカバーして、その後 Medium を毎日一問一週間ほど続けた。この時、大事なのはコードを書き始める前にアルゴリズムの全体のプロセスをノートに書きだして整理しておくことだ。これは後のオンサイトインタビューの練習にも通じる。</p> <p>例えば、<a target="_blank" rel="nofollow noopener" href="https://leetcode.com/problems/count-and-say/">38 Count and Say</a> を見てみよう。</p> <blockquote> <p>The count-and-say sequence is the sequence of integers with the first five terms as following:<br /> 1 is read off as "one 1" or 11.<br /> 11 is read off as "two 1s" or 21.<br /> 21 is read off as "one 2, then one 1" or 1211.<br /> Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence.</p> </blockquote> <p>与えられた文字列を「何が」「何回」繰り返されるかによって書き直す。この処理を n 回繰り返したら得られる文字列を出力せよという問題だ。どのようにアプローチすればよいだろうか?</p> <p>まず問題を分析して、必要なコンポーネントを洗い出そう。この問題は Easy なだけあって、全体の流れは簡単だ。まず処理する文字列を “1” で初期化し、与えられた n 回だけ書き換え処理を実行すれば良い。この処理はメインの関数とは別の補助の関数として実行すると良さそうだ。</p> <p>では、どのようにして書き換え処理を実装すれば良いだろうか?まず、ルールを細かく見てコードに直して組み合わせでみよう。</p> <p>まず、文字列全体の書き換えは、部分部分を独立に書き換える処理の組み合わせでできていることが分かる。</p> <p><a href="https://crieit.now.sh/upload_images/4ec966ab393432dc5a27c64d6804fd825d470f75f13b2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4ec966ab393432dc5a27c64d6804fd825d470f75f13b2.png?mw=700" alt="breakdown" /></a></p> <p>では、どうやって全体の文字列を個別の部分に分割すれば良いだろうか?しばらく図を眺めていると、これは単純に同じ文字の集合で分割すれば良いことがわかる。なるほど、与えられた文字列を前から順番に見ていき、次の文字が前と違っていればそこが分割箇所となるようだ。</p> <p>ここの分割の部分がこの問題の中で最も複雑なので、先に取り出して実装してみよう。以下では Python の Generator 構文を使って分割を実装してみる。多分、普通に初見でこの問題を説く際には Generator を使わずに、全てを一つの関数で処理するだろう。実際僕もそうしたが、ここでは問題を細部まで分割して分析すること主眼におくのでこのような形をとった。関数を分けない場合の回答も後に述べる。</p> <pre><code class="python">def _split(string): char, count = string[0], 1 for c in string[1:]: if char == c: count += 1 else: yield char, count char, count = c, 1 yield char, count </code></pre> <p>この分割ではまず初めに、取り出す文字 <code>char</code> とその文字が連続して出現する回数 <code>count</code> を、与えられた文字列 の最初の文字 <code>string[0]</code> と <code>1</code> で初期化する。そして、順番に残りの文字を確認していき、もし同じ文字が見つかったら回数を 1 増やし、違う文字が見つかった場合は、そこまでで分割が完了しているので、今保持している文字 <code>char</code> とその回数 <code>count</code> を放出する。分割ができれば、文字列変換のプロセスは簡単に以下のように書ける。</p> <pre><code class="python">def _process(string): return_value = '' for char, count in _split(string): return_value += '%d%s' % (count, char) return return_value </code></pre> <p>分割された文字と回数をそのまま文字に変換して繋げるだけの簡単なロジックになる。あとはこれを課題の規定する入出力の形式に揃えるだけで良い。課題では入力は n すなわち変換処理を実行する回数で、文字列の初期値は <code>‘1’</code> なので、</p> <pre><code class="python">def countAndSay(n): string = '1' for _ in range(n-1): string = _process(string) return string </code></pre> <p>となる。 先述した通り、普通に課題に説く場合は Generator を使わないで、新しい文字列の生成と、それに必要な文字の分割、数え上げを一緒に実行するだろう。その場合の実装は以下のようになる。</p> <pre><code class="python">def _process(string): return_value = '' char, count = string[0], 1 for c in string[1:]: if char == c: count += 1 else: return_value += '%d%s' % (count, char) char, count = c, 1 return_value += '%d%s' % (count, char) return return_value </code></pre> <p>全体のコードをまとめると以下のようになる。</p> <pre><code class="python">def _split(string): char, count = string[0], 1 for c in string[1:]: if char == c: count += 1 else: yield char, count char, count = c, 1 yield char, count def _process(string): return_value = '' for char, count in _split(string): return_value += '%d%s' % (count, char) return return_value class Solution: def countAndSay(self, n: int) -> str: string = '1' for _ in range(n-1): string = _process(string) return string </code></pre> <p>このようにして、問題を分析し、1. なるべく簡単な基本要素を定義し、2. 基本要素を組み合わせてフロー全体を組み立てることが出来るとコーディングテストはうまくいく。練習初めは実装を行わなくても、よいだろう。問題を見て、一晩かけて解法を考えて翌日取り掛かってもいい。文法やデータ構造の知識も大切だが、練習する際に大事なのは分析することなのだ。</p> <p><a href="https://crieit.net/posts/81831039f649c70bf0465a8915a96430">第七話「コーディングテスト - 実践編」</a>に続く。</p> <p> </p> <p> </p> <p> </p> <h5 id="脚注"><a href="#%E8%84%9A%E6%B3%A8">脚注</a></h5> <h6 id="Google"><a href="#Google">Google</a></h6> <p>Google は全部 YouTube ビデオになっている。</p> <p>Prep Videos:<br /> <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=ko-KkSmp-Lk">How to: Prepare for a Google Engineering Interview</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=XKu_SEDAykw">How to: Work at Google — Example Coding/Engineering Interview</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=XOtrOSatBoY">Interview tips from Google Software Engineers</a></p> <p>More general about hiring at Google:<br /> <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=k-baHBzWe4k">How to: Work at Google — How We Hire</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=1BGAdJ_0FH0">Ask a Google Engineer — How to Work at Google: Prospective Employee Qualities</a></p> <h6 id="練習サイト"><a href="#%E7%B7%B4%E7%BF%92%E3%82%B5%E3%82%A4%E3%83%88">練習サイト</a></h6> <p>Google リクルーターが送ってくれたリンク集。</p> <p>Websites recommended by Google Software Engineers:<br /> Top Coder: <a target="_blank" rel="nofollow noopener" href="https://www.topcoder.com/">https://www.topcoder.com/</a><br /> (If you can handle the DIV I 250 level questions on TopCoder getting around 220+, then you are in good shape.)<br /> HackerRank: <a target="_blank" rel="nofollow noopener" href="https://www.hackerrank.com/">https://www.hackerrank.com/</a><br /> Project Euler: <a target="_blank" rel="nofollow noopener" href="https://projecteuler.net/">https://projecteuler.net/</a><br /> LeetCode: <a target="_blank" rel="nofollow noopener" href="https://leetcode.com">https://leetcode.com</a><br /> 500 Data Structures and Algorithms practice problems/solutions: <a target="_blank" rel="nofollow noopener" href="https://techiedelight.quora.com/500-Data-Structures-and-Algorithms-interview-questions-and-their-solutions?share=1&utm_medium=email&utm_source=hackernewsletter&utm_term=code">Quora</a><br /> Competitive Programmer's Handbook: <a target="_blank" rel="nofollow noopener" href="https://cses.fi/book/index.html?utm_source=hackernewsletter&utm_medium=email&utm_term=books">https://cses.fi/book/index.html</a></p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15298 2019-08-04T07:58:01+09:00 2019-08-05T04:40:48+09:00 https://crieit.net/posts/032b38ba6ac32fcfc16f4707ae8c2a50 電話そして電話 <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップ</a> <a href="https://crieit.net/posts/pow-10-100-5d3ba3a4ddd38">> 前回のお話</a></p> <hr /> <p>ジェームズ( Apple のリクルーター)のアレンジで 2月の中頃、Siri チームのマネージャーと電話することになった。</p> <p>「もしもし、タローです。」</p> <p>「タロー、ハーイ。Apple Siri チームのマネージャーのホセです。今日は時間をとってもらってありがとう。まず、あなたがどのような業務についているか聴かせてもらってもいいですか?」</p> <p>「もちろん。</p> <p>僕は SF ベイエリアにあるスタートアップでエンジニアとして働いています。この会社ではビジネス向けの自然言語処理ソリューションをウェブ上で提供しています。僕は、データ処理のパイプライン関連を主に担当しているんですが、モデルのトレーニングや評価も行うことがあります。</p> <p>10人にも満たないチームで、大学の研究室から始まったチームなので、エンジニアリングのレベルは高くないんですよ。だから、なんとかスケールするエンジニアリングを目指していましてね、開発からデプロイまでのプロセスを自動化したり、モデルの訓練をなるべく簡単にしようとしてるんです。そのために、チームメイトにコードレビューがなんたるか、CI がなんたるかという、まぁ基本ですよね、そういうのを教えたりすることもあるんですが、その分、僕も彼らから自然言語処理のあれこれについて教えてもらっています。モデルの訓練の際には GPU リソースの管理が難しくて。その辺は Apple のような大きな会社ではリソースとインフラが十分に構築されているかと思いますが。」</p> <p>「そうですね、Apple はご存知の通り今機械学習に力を入れていてね、その内でも Siri は最重要チームの一つと言えるね。ただ、完全に内部インフラが整備されているかというとそうでもなくてね。そこらへんをスケールできるシステムを構築中しようとしているんですよ。」</p> <p>「なるほど。僕はエンジニアなんですが、モデルのトレーニングなんかも出来たらいいなと考えているんですが、そういうキャリアパスはありますか?」</p> <p>「問題ないですよ。僕のチームでもエンジニアから入ってトレーニングの方にシフトした人はいるから。」</p> <p>「それは僕の理想ですね。どころでチームの所在地はどこに?」</p> <p>「Siri の主だったチームはボストンとクパチーノになるね。僕は今はボストンから電話をかけてるよ。ボストンオフィス興味ある?」</p> <p>「ええ。ありますよ。」</p> <p>「分かりました。なかなか良さそうなバックグラウンドですね。この後のステップを手配しましょう。追ってリクルーターに連絡しますよ。」</p> <p>「ありがとうございます。それでは、良い一日を。」</p> <p>午後になり、ジョアンナ( Google のリクルーター)から着信があった。ジョアンナの声はまだ若いのに年老いた皺だらけの魔女になろうとしているかのような声だった。話はいつもの流れになった。僕は自分の仕事について簡単に説明した。ジョアンナは、Google Brain はリサーチ系だから僕の履歴にはフィットしないが、機械学習を必要とするポジションはいくらでもあるので、そのようなポジションを見繕うといった。そして、その間採用のプロセスを進みたいかと訪ねた。僕はイエスと答えた。こうして Google とインタビュープロセスが始まった。</p> <p><a href="https://crieit.net/posts/f25b2f7288e2fb366eb8923cfe444bd8">第六話</a>へ続く。</p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15281 2019-07-27T10:06:44+09:00 2019-08-04T07:58:21+09:00 https://crieit.net/posts/pow-10-100-5d3ba3a4ddd38 pow(10, 100) <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップ</a> <a href="https://crieit.net/posts/0e5f16ce924a2e3ce7369500de3e9ca4">> 前回のお話</a></p> <hr /> <p>「そんなわけで、Apple と Amazon でインタビューする流れになっだけど、Google にもレジュメ出すべきだと思う?」</p> <p>「なんかやりたいプロジェクトでもあんの?」</p> <p>「いや、特にないけど流れかなと。Siri, Alexa と来れば、Google のアシスタント。あれ、名前あったっけ?それに、LinkedIn の広告で Machine Learning Engineer ってやたら出てくるのよね。この会社。」</p> <p>「出してみたらいいとは思うけど、去年、インタビューの予定が詰まったストレスで、Google のオンサイトインタビューキャンセルしなかった?」</p> <p>「おっと、完全に忘れてた、それ。まぁあの時は気持ちの準備不足だったしね。」</p> <p>「流れというなら、Facebook は?」</p> <p>「Facebook は特にこれと言っては。音声アシスタントとかやってないし、AI 研究部門はすごいけど、エンジニアが入れるところじゃないし。それに、今はプライバシースキャンダルがすごいじゃない?」</p> <p>「まあ、出すだけ出してみれば?」</p> <p>「やってみるよ。」</p> <p> </p> <p> </p> <p> </p> <h2 id="シューカツの鉄則"><a href="#%E3%82%B7%E3%83%A5%E3%83%BC%E3%82%AB%E3%83%84%E3%81%AE%E9%89%84%E5%89%87">シューカツの鉄則</a></h2> <p>アメリカで就職活動をする上での基本かつ重要なことは、なるべく多くの会社からオファー(内定)をもらうことだ。つまり、複数の会社を同時に受けることだ。</p> <p>そんなの当たり前だと思われるかもしれないが、日本以上にこの違いは大きい。</p> <p>複数の会社を同時に受けるとストレスが等比級数的に増加するが、その利点は、まず、新しい仕事が見つかる確率が上がること。次に、もし一社からオファーをもらっていると、他の会社の面接を余裕を持って受けられること。そして、最も大事なのが、複数のオファーを競合させて、より良い条件を引き出せるようになるのだ。</p> <p>僕はあまり経験がないのだが、このオファーの交渉というステップはアメリカでは当たり前に行われていることで、オファーを出す会社側もそれを踏まえて、予算上限目一杯のオファーというものはいきなりは出さないようにしている。雇用条件を交渉できる状態にしておかないとそれだけで不利を被ってしまうのだ。ここでの交渉は、年収にして 2〜300万円程度なら比較的簡単に変わってしまうので恐ろしい。それで四年程働けば預金口座の額が500万ほど変わることになる。(カリフォルニアでは大体税金で50%取られる計算になる。)</p> <h2 id="Google に応募"><a href="#Google+%E3%81%AB%E5%BF%9C%E5%8B%9F">Google に応募</a></h2> <p>さて、そんなこともあって、日曜日の夜、手持ち無沙汰から <a target="_blank" rel="nofollow noopener" href="https://careers.google.com/jobs/">Google のジョブリスティング</a>を覗いてみた。シリコンバレー界隈でソフトウェアエンジニアの仕事を検索すると、常に数百件の募集があるのに驚かされる。</p> <p>機械学習、AI などで色々見て回った後、結局どれもしっくりくるものはなかったので、とりあえず、Google Brain の Research Software Engineer に出してみた。「とりあえず」で出すようなところでは無いのだが、どこもあまり希望を見出せなかったし、日曜日の夜「何かした」感をもってさっさと寝たかったのでやっつけの応募になった。</p> <p>Google からの返信は意外と早く<a href="#スクリーニング">†</a>、週が明けた月曜日にメールが届いた。メールをくれたこの女性、ジョアンナは署名欄で自分の役職を Machine Learning Sourcer<a href="#Sourcer">††</a> としていた。メールには電話で僕のバックグラウンドの詳しい話を聞きたい旨と、彼女の Google Calendar へのリンクが貼ってあった。カレンダーには電話を受けられる時間の枠が候補として表示されていて、この枠のうち自分に都合のよいものをクリックして、名前と電話番号を入力すると電話の予定が確定となる仕組みだった。なるほど、多くの人とのやり取りを効率よく捌くために、アポイントメントなどの処理を自動化しているわけだ。</p> <p>僕は彼女との電話を水曜日に設定した。ちょうど Apple のジェームズが設定したマネージャーとの電話が午前に入っていたので、その日の午後に設定して、この日は会社に出社せずに家から仕事をすることにした。これで煩わされずに電話ができるだろう。</p> <p>さて。水曜日は緊張の日になる。</p> <p><a href="https://crieit.net/posts/032b38ba6ac32fcfc16f4707ae8c2a50">第五話</a>へ続く。</p> <p> </p> <p> </p> <p> </p> <h5 id="脚注"><a href="#%E8%84%9A%E6%B3%A8">脚注</a></h5> <h6 id="スクリーニング"><a href="#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0">スクリーニング</a></h6> <p>Google のような年間数万件にのぼる応募がある会社の場合、実際にはリクルーターから返信が来る確率はかなり低い。おそらく Google のことだから本当に見込みのない応募者は自動で弾いているだろうが、リクルーターも日々何十件という履歴書に目を通さなければならないので、各履歴書にかける時間は数秒、何か目を惹くキーワードを見つけるかどうかになる。この辺はこのトピックで著名な <a target="_blank" rel="nofollow noopener" href="https://www.careercup.com/resume">Gayle McDowell</a> のページに解説がある。僕のレジュメはここまで簡潔ではないけれど、それでもとりあえずリクルーターには声をかけてもらえる。僕の予想ではその理由は二つ。一つ目は僕が機械学習の経験を持っていること。二つ目は僕が既に何度か(日本でのインターンの面接、ベイエリアでフルタイムの面接)受けていて、僕のメールアドレスが内部システムに登録されているからだろう。Google は生涯で三度まで面接が受けられて、再挑戦者はそれなりに新規挑戦者よりも連絡がもらえる確率が高いとされる。ちなみに、全くの新規で挑戦する場合は、知り合いなどを通じて内部推薦でリクルーターのスクリーニングをバイパスしないとまず連絡は来ないとも言われている。もし、これを読んでいる日本人の方で Google 本社で働きたい人は、まず Google Japan で働いている人と繋がりを持つことがスタート地点になるだろう。最近は就労ビザの取得も難しくなってきたので、Google Japan で働いて、本社転勤が現実的かと思われる。国際的に認知されている業績があればまた別だが。</p> <h6 id="Sourcer"><a href="#Sourcer">Sourcer</a></h6> <p><a target="_blank" rel="nofollow noopener" href="https://en.wikipedia.org/wiki/Sourcing_%28personnel%29">Wikipedia</a> によると Sourcer とは採用活動のうち、候補者を見つけ出し声をかける人のことだそうだ。</p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15232 2019-07-13T15:31:56+09:00 2019-07-29T06:06:38+09:00 https://crieit.net/posts/0e5f16ce924a2e3ce7369500de3e9ca4 時勢 <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップ</a> <a href="https://crieit.net/posts/885681349c2dc8b580eb0edc96d88c77">> 前回のお話</a></p> <h5 id="二社目"><a href="#%E4%BA%8C%E7%A4%BE%E7%9B%AE">二社目</a></h5> <p>Apple のリクルーターから初めて連絡をもらった二日後、Amazon のリクルーターからメッセージが来た。</p> <p>「Amazon Alexa のチームが対話プラットフォームのエンジニアを探していますが、話を聞きませんか?」</p> <p>Apple の Siri に Amazon の Alexa と立て続けにお誘いが来たのは時代の流れだろうか。この流れに乗ることができれば、何か面白いことに出会えるかもしれない。そう思って僕は二つ返事で電話の予定を入れた。</p> <p>Apple のリクルーターとの短い電話があった数日後、僕は再びオフィス近くのスターバックスにやって来た。テーブル席が空いてなかったので、僕はドリンク提供カウンターのすぐ横の席に腰掛けた。すぐ隣で店員と客がやりとりをしているので、少し落ち着かなかった。電話は予定より10分遅れてかかって来た。</p> <p>「タロー、ハーイ、Amazon リクルーターのアマンダです。お、遅れてごめんなさい、まだ時間は大丈夫?」</p> <p>アマンダは少し疲れた声で、切羽詰まった様子だった。</p> <p>「ハイ、アマンダ。大丈夫ですよ。」</p> <p>「よかった。それじゃあ、まず、あなたのことについて聞かせてもらえる?」</p> <p>「ええ、いいですよ。」</p> <p>今度の会話は予期していた流れを辿った。僕は用意していたノートを見ながら話を始めた。</p> <p>「僕は今、SF ベイエリアにあるスタートアップで働いています。このスタートアップは機械学習・ディープラーニングを使った会話データの処理サービスを行っていて、ビジネス向けに API を提供しています。</p> <p>僕はその中で、データ処理のパイプライン周りを担当しています。顧客から集まるデータをデータセットにまとめるわけですね。それをチームのサイエンティストが利用して新しいモデルの訓練に使うわけです。</p> <p>パイプライン自体はバックエンドなのですが、設計段階ではデータを提供してくれるパートナーとのすり合わせが必要になるので、ここら辺のコミュニケーションも行っています。</p> <p>他にもこのデータを処理する際にデータの拡張という作業を行うのですが、このための内部ソフトウェアの開発も行っています。</p> <p>それに加えて、僕は日本語が第一言語なので、日本語に関しては訓練されたモデルの評価を行ったり、僕自身がモデルを訓練したりしています。</p> <p>サイエンティストとエンジニアの間を行ったり来たりすることが多い立場ですね。」</p> <p>「なるほど。日常使いではどのような技術を使ってますか?」</p> <p>「メインは Python になります。TensorFlow や PyTorch といった機械学習パッケージを使う場合や、API リクエストを実行する場合、あとは、Bash スクリプトをラッピングしてインターフェースを綺麗にする場合などが多いですね。あとはたまに C++ を使います。Amazon は Java と聞いてますけど、Java に関しては昔触った経験があるので、業務で使えるようになるのにそんなに時間はかからないと思います。」</p> <p>「なるほど。どうして新しい仕事を探しているのですか?」</p> <p>「この業界はここ数年で大きく変わっています。基本的な音声認識の精度はもはや向上の余地がないレベルになり、自然言語処理技術の向上によって、業界の注目は、これらの技術を基礎にしたアプリケーションの構築に向いています。今回そのような機会をもとに僕もキャリアのフォーカスをそちらにシフトしたいと思ったからです。」</p> <p>この理由は後付けだった。リクルーターと何を話そうか考える中で、オフィスで聞く話や、ニュースで聞く動向、今回の案件の内容を組み合わせた内容だった。後々エンジニアと話をするには弱い内容だが、リクルーターと話すにはこれで十分だった。</p> <p>「わかりました。では Alexa の話をしますね。今私は Palo Alto にある Amazon Alexa のチームに加わるエンジニアを探しています。Alexa はご存知ですか?」</p> <p>「ええ。ただ、持ってはいないですけどね。はは。」</p> <p>「Alexa にはたくさんのサブコンポーネントがあるんですけど、対話型インターフェースと言語理解が重要になるわけで、自然言語処理に携われる方を探しているんです。興味ありましか?」</p> <p>「面白そうですね。ぜひ次のステップの話を聞かせてください。」</p> <p>「分かりました。次のステップはコーディングテストになります。URL を送りますので所定の期限までに受けてもらえますか?」</p> <p>「分かりました。ちょっと今週は忙しいので来週末まで待ってもらってもいいですか?」</p> <p>「いいですよ、では都合がつきましたら連絡してください。」</p> <p>「分かりました。ありがとうございます。」</p> <p>電話を切ってから、僕は今後の流れを考えていた。ジェームズが繋いでくる Apple のマネージャーとの電話があるから、それに集中しよう。そして、時間を見つけてコーディングテストの練習をしなければならない。忙しくなりそうだ。</p> <p><a href="https://crieit.net/posts/pow-10-100-5d3ba3a4ddd38">第四話</a>へ続く。</p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15180 2019-07-01T05:10:57+09:00 2019-07-29T05:59:24+09:00 https://crieit.net/posts/885681349c2dc8b580eb0edc96d88c77 はじまり <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップへ</a> <a href="https://crieit.net/posts/0c826a27a75940947b5db82b6ff2e8fb">> 第一話</a></p> <h5 id="はじまり"><a href="#%E3%81%AF%E3%81%98%E3%81%BE%E3%82%8A">はじまり</a></h5> <p>2月の初め、件の Apple のリクルーターとの電話の為に、僕はお昼休みを使って会社の近くのスターバックスにやってきた。当然のことながら、就職活動は会社の同僚には隠し通さなければならないので、全て秘密裏に行わなければならない。大きな会社ならば会議室を予約してプライベートを確保できるかもしれないが、僕の会社は従業員が10人もいない小さなオフィスなのでそれは叶わなかった。カフェラテとサンドイッチを注文して席に着き、プリントアウトしておいた自分の履歴書に目を通した。今にして思えば、同僚が早めに昼食を済まして食後のコーヒーに来る場合を考えれば、これはとてもリスキーだった。</p> <p>典型的なリクルーターとの会話では、まず初めにリクルーターが候補者の詳細を尋ねて来る。一例を挙げると以下のようになる。</p> <ul> <li>普段どのような業務に従事しいているのか。 <ul> <li>会社はどのようなことをやっていて</li> <li>その中で、自分はどのようなことをやっているのか <ul> <li>どのような技術を利用しているのか <ul> <li>プログラミング言語</li> <li>ソフトウェアスタック</li> </ul></li> <li>どのような経験をしているのか <ul> <li>ソフトウェアの実装</li> <li>ソリューションのアーキテクト</li> <li>システムのデザイン</li> <li>ジュニアメンバーのメンター</li> <li>マネジメント</li> <li>カスタマーサポート等</li> </ul></li> </ul></li> </ul></li> <li>次の職に何を求めいているのか <ul> <li>プロダクト</li> <li>技術 <ul> <li>ソフトウェア</li> <li>言語</li> <li>スケール</li> </ul></li> <li>経験 <ul> <li>開発</li> <li>デザイン</li> <li>マネジメント</li> </ul></li> <li>(オプション) <ul> <li>待遇</li> <li>基本年収</li> <li>ストック / RSU</li> </ul></li> </ul></li> </ul> <p>年収や待遇に関することは面接が最終段階に進むあたりで聞かれることが多いが、予算が厳しい(小さな)会社では最初に聞いてくることもある。<a href="#年収の話">†</a></p> <p>この時は基本的にこちらが一方的に話すことになるので、事前にリクルーターに共有してある履歴書の内容を踏まえながら、一本のストーリーを組み立てて、詳細を肉付けしておかなければならない。 また、リクルーター以外の人(マネージャーや、配属先チームのメンバー等)と話すときも大体は同じようなことをはじめに聞かれるので、電話が始まる前に自分のレジュメを見ながらこれらの要点を確認しておくと心の準備も整うものだ。</p> <p>これに答え終わると、今度はリクルーターが自分の持っている案件の話をする。リクルーターが自社の企業の為に人を探している場合は大抵すでに案件を持っていてその中身をここで教えてくれる。リクルーターが人材紹介会社のエージェントの場合はここから案件の選定が始まる。彼らがどのような会社からの案件を持っていて、その内のどれならよく適合しそうかをここで相談する。とは言え、どちらの場合にしてもリクルーターは技術職ではないので、案件の中身はそれほど具体的ではない。大きな会社の場合は雇用のプロセスは数ヶ月かかるので、あまり細かいことを先に決めることもできないと言う事情もあるだろう。</p> <p>電話で初めての人と話すのは久しぶりのことだったので、僕は緊張していた。頭ではこの会話はプロセスをスタートするためのものであって、直接合否を決定するものではないと分かっていても、リラックスして電話を待つと言うのは難しかった。</p> <p>予定の時刻になると電話が鳴った。</p> <p>「もしもし、タローです。」</p> <p>「やあタロー、Apple のジェームズだ。今 Siri 関連の言語処理チームが機械学習のエンジニアを探していてね、興味あるかな?」</p> <p>「ええ。」</p> <p>「じゃあ、追ってマネージャーと繋ぐよ。次の連絡を待ってて。」</p> <p>そういって、ジェームズとの電話はすぐに終わってしまった。僕はあっけにとられた。ジェームズは僕について質問することもなかったし、僕も積極的に話すこともなかった。肩透かしを食らったようでもあったけれど、特に問題もなかったので気にしないことにした。食べかけのサンドイッチを終わらせると僕はスターバックスを後にした。</p> <p><a href="https://crieit.net/posts/0e5f16ce924a2e3ce7369500de3e9ca4">第三話</a>へ続く。</p> <p> </p> <p> </p> <p> </p> <h5 id="脚注"><a href="#%E8%84%9A%E6%B3%A8">脚注</a></h5> <h6 id="年収の話"><a href="#%E5%B9%B4%E5%8F%8E%E3%81%AE%E8%A9%B1">年収の話</a></h6> <p>ちなみに<a target="_blank" rel="nofollow noopener" href="https://www.businessinsider.com/places-where-salary-question-banned-us-2017-10">カリフォルニアを始めとした幾つかの州</a>ではリクルーターが現在の年収を聞くことは違法になっている。これは給与は仕事に見合った形で決定されるべきで、従業員のこれまでの給与を元に給与を決定することは不公平であるという理念に基づいていて、同じ職に就く人々の間で所得の格差、特に女性の男性との格差を是正するための働きかけとなっている。</p> 然るエンジニア🙊 tag:crieit.net,2005:PublicArticle/15161 2019-06-24T11:10:47+09:00 2019-07-29T06:01:20+09:00 https://crieit.net/posts/0c826a27a75940947b5db82b6ff2e8fb きっかけ・シリコンバレーの雇用事情 <p><a href="https://crieit.net/magazines/anonymouse-engineer-ecrit/my-gafa-interviews">>> 連載トップへ</a></p> <h5 id="きっかけ"><a href="#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">きっかけ</a></h5> <p>「音声アシスタント向けの自然言語処理チームで働きませんか?」</p> <p>LinkedIn のメッセージボックスに Apple のリクルーターからメールが来たのは年が明けてまもない頃だった。その頃僕はシリコンバレーの小さな会社で働いていて、生産性の上がらないマネジメントスタイルに日々ストレスを感じていた。</p> <p>「まあ、この先ここで働き続けて自分が幸せになれるとはとても思えないし、これはいい転機になるかもしれない。」</p> <p>そう思って僕は早速返事を認めた。</p> <p>「連絡ありがとうございます。面白そうな話ですね。もう少し詳しくお聞かせ願いますか?」</p> <p>斯くして、リクルーターからのメッセージに後押しされる形で、僕は転職活動を始めた。</p> <p>後になって、日本では GAFA<a href="#GAFA">†</a> と呼ばれる四大テック企業全てとやりとりをすることになるとはまったく想像もしていなかった。</p> <p> </p> <h5 id="シリコンバレーの雇用事情"><a href="#%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E3%81%AE%E9%9B%87%E7%94%A8%E4%BA%8B%E6%83%85">シリコンバレーの雇用事情</a></h5> <p>ここでシリコンバレー或いはアメリカの就職 / 採用活動事情をご存知ない方のために少し補足しておこう。</p> <p>終身雇用制度が廃れて久しいアメリカでは人材が常時流動している。それはつまり、転職活動が年中盛ん<a href="#雇用のタイミング">††</a>であり、それとともに企業の採用活動も年中盛んであるということである。企業の各部門は、新しい予算を獲得すると求人情報を更新し、人事部はそれに見合いそうな人材を探してコンタクトをとる。</p> <p>LinkedIn は職業や雇用に関連する繋がりを提供する SNS で、リクルーターにとっては候補者を探す恰好の場所になっている。求職中であろうとそうでなくとも、LinkedIn にアカウントを持っていて、自身の職歴や技能を公開していると、このようなリクルーターからのメッセージがよく届くのだ。中には明らかに不特定多数に送信しているものや、聞いたこともない会社から送られてくるものなど、到底返信するに至らないようなものもあるけれど、稀に誰もが知っている大企業の、とても魅力的な案件が送られてくることもある。僕は実務経験数年の駆け出しエンジニアだけれど、リクルーターはなるべく多くの人に声をかけようとするので、僕のような新米にも機会はやってくるのだ。</p> <p>リクルーターとメッセージのやりとりが始まると、次のステップは彼らと電話で会話することになる。ここでリクルーターは候補者がどのような技能を有していて、普段どのような業務に従事して、次の転職の機会に何を求めているのか(キャリアパスや携わりたい技術など)を聞き取り調査する。そして、自分がどのような求人情報を持っているかを説明する。ここでお互いの興味が一致すれば、リクルーターは候補者を面接のステップに進めるための手続きをする。</p> <p>面接の流れは会社によって異なっているが、GAFA の場合、大枠は同じだ。まず、電話面接がある。これは候補者の基本的なコーディング技量を測るためで、面接官が課すプログラミングの課題を候補者がオンラインの共有テキストエディターに実装していくというスタイルだ。この時はコードを実際に走らせることもあるが、しないこともある。これは必ずしも正確なコードを書くことが目的ではなく、出された課題に対する分析能力、解答を提案する能力、それを面接官に伝えフィードバックを元に議論を展開するコミュニケーション能力を見るのが目的だからである。</p> <p>正しいコードを要求する場合の課題は面接官を必要としない自己完結型のサービスを使う場合が多い。今回の僕の就職活動では Amazon がこれに該当した。この場合は課題の URL がリクルーターから送られてきて、自分の都合の良い時間にそれにアクセスして課題を解き、提出するというものだ。Amazon では電話面接の前にこれをこなす必要があった。</p> <p>電話面接を突破すると、次は実施に会社に赴いての面接になる。オンサイトインタビューとよばれる。オンサイトインタビューはほぼ一日消費する。45分から1時間の面接を最低5回、多い場合は7回行う。これらは3〜4種類の面接から構成される。</p> <ul> <li>コーディング</li> <li>人間性(Behavioral Interview, Leadership Interview などと呼ばれる。)</li> <li>システムデザイン</li> <li>専門性</li> </ul> <p>それそれの面接官からのフィードバックはリクルーターに返され、リクルーターはこれを所定の手続きに回す。また、ここで見通しが良さそうな候補者で、まだ配属先の見当がついていない場合はチームマッチングが始まる。良いマッチングがあれば、それもフィードバックに加えられる。このフィードバックから合否の決定までのプロセスは会社によって違うとされる。ネット上に散見される情報やリクルーターとのやりとりから得られた情報をまとめると以下のようになる。</p> <p>Google では 採用委員会 (Hiring Committee, HC) と呼ばれる人々が独立した意思決定を下す。マッチングで決定した配属先のマネージャーは意思決定には関わることが出来ず、マネージャーが採用したいと思っても HC がノーと言うと不採用になる。もちろんフィードバックを提出した面接官はこのプロセスには関わらない。</p> <p>Amazon ではオンサイトインタビューを行ったその日に、面接を行なった人々が集まって合否を決定する。ここでは各々の印象と他の面接官の意見を参考に、多数決投票が行われる。ただし投票には例外がある。面接官の中には特別な拒否権を持った人がいて、この人物がノーと言うと、残りの投票の結果に関わらず、不採用となる。この面接官は <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=cdBR2HoyrCo">Bar Raiser</a> と呼ばれる。恐ろしい名前だ。「Amazon に採用される人は常に現在のチームよりも良い仕事をする人でなければならない」という <a target="_blank" rel="nofollow noopener" href="https://www.amazon.jobs/en/principles">Amazon の理念</a>の一つを実装するためにこのような特別な権限を与えられている。</p> <p>Facebook のプロセスは Google に似ている。一般的に、Facebook ではチームのマッチングは採用前には行われない。採用後に Bootcamp という研修期間を経てチームをマッチングするからだ。しかし、もしチームが先に決まっている場合はチームのマネージャーの承諾も採用決定の一因となる。</p> <p>Apple は他の3社と異なり、社内共通の採用プロセスがないとされる。各チームが独立して採用活動を行なっており、最終決定はマネージャーによって行われる。</p> <p>以上がアメリカ(シリコンバレー)のテック企業の大まかな採用プロセスである。</p> <p>今僕は、この転職活動を終えて、一連の出来事を思い出しながらこれを書いている。様々な人と電話や実際に会って話をしたが、最も強く思ったことは就職・採用活動はとても脆いプロセスだということだった。</p> <p>LinkedIn や企業側の採用プロセス管理ツールやらコーディング課題のためのプラットフォームやら、どんなに優れたシステムで就職・採用活動を行いやすくしたとしても、究極的には会話という最も基本的な人と人とのコミュニケーションを介してプロセスが進んでいく。</p> <p>また、このコミュニケーションも、同じ人ばかりではなく、プロセスが進むにつれて担当者が別の人に変わったり、マッチングのプロセスで様々なチームの人と話をしたり、そのどれもが失敗できない緊張の連続である。その上、多くの案件を同時にこなしていると必ずどこかで連絡が途絶えてしまう。舞い込んだ案件に最初のうちは丁寧に返信をしていたが、自分の忙しさとストレスのあまり途中で急に返信するのを辞めてしまった案件もあるし、逆にリクルーターが連絡するのを辞めてしまった案件もあった。職探しというプロセスはとても不安定なコミュニケーションを辿りながら、なんとか自分を認めさせるプロセスなのだ。</p> <p><a href="https://crieit.net/posts/885681349c2dc8b580eb0edc96d88c77">第二話</a>へ続く。</p> <p> </p> <p> </p> <p> </p> <h5 id="脚注"><a href="#%E8%84%9A%E6%B3%A8">脚注</a></h5> <h6 id="GAFA"><a href="#GAFA">GAFA</a></h6> <p>僕の経験では、シリコンバレーでソフトウェアエンジニアとして働いていて GAFA という言葉を使うことはまずない。業界そのものを分析している人は使うかもしれないけれど、ソフトウェアエンジニアとして働いていると、技術や動向なんかに関しては各社の違いの話をするのが主なので、一緒くたにして話すことはまずない。日本からやってきた人が「GAFA が云々」と言って、相手が「がーふぁって何?」と聞き返されるのを何度か見たことがある。ちなみに一度リクルーターからの案件で Subsidary of FAANG と言うのを見たことがある。 FAANG ってなんだ?と思って調べてそれが GAFA + Netflix だと理解するのに少し時間がかかった。多分アメリカではこちらの方が使われるように思える。どっちにせよ会話で使われることはない気がするし、ちょっと不親切な略語かなと個人的に思う。。結局 FAANG 傘下のとある会社という案件はスルーした。</p> <h6 id="雇用のタイミング"><a href="#%E9%9B%87%E7%94%A8%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0">雇用のタイミング</a></h6> <p>もちろん全ての企業活動には活動予算がつきものなので、採用活動の勢いは予算の具合によって変化する。<a target="_blank" rel="nofollow noopener" href="https://www.topresume.com/career-advice/the-best-times-of-the-year-to-job-search">この記事</a>によると、年明けの予算が確定したタイミングが最も活発になり、(そう言われれば初めての仕事の時は、1月2日にメールがきたなぁ。)、従業員が休みを取る夏に一旦落ち着き、予算を使い切った頃の冬に終了するということだそうだ。確かに、昔とある大企業では12月3日が年内の最終雇い始めの日で、その日をもってHR は正式に年内の仕事納めというケースを聞いたことがある。スタートアップなどは新たにファンドレイジングで予算を獲得するタイミングが最も採用活動が激しくなるということになる。ちなみに<a target="_blank" rel="nofollow noopener" href="https://www.fastcompany.com/3044654/why-you-are-most-likely-to-get-hired-on-a-tuesday">採用通知が来るのは火曜日が統計的に多い</a>という話もある。へー。</p> 然るエンジニア🙊