エンジニアインターン運ゲー度まとめ

図らずとも大学に入ってからそれなりにインターンをしてしまった(もはや収入源だった)のでエンジニアインターンの選考レビューをします。

選考は仕組み上運ゲー度が高いですが、「ここなら何度受けてもほぼ受かるやろ」ってところと、「ここに受かったのはマジで運がよかった」と感じるところに結構分かれます。運ゲー度を下げるためにこういうスキルがあったら受かりやすいかもと感じた点もまとめておきます。

Google

応募・選考の流れ

2,3月ぐらいにGoogle Careerのサイトから応募する。ウェブでプログラミングテストみたいなのをやったあと面接数回。その後にHiring Commiteeというのがあって、合格すればチームマッチング。

ぼく

Hiring Commitee通過したけどチームマッチングに失敗した

特徴

  • 給料いいらしい(月60万とか?しらんけど)
  • 2回通れば内定もらえる?(しらんけど)
  • 社食うまい

コメント

プログラミングテストはほぼ運ゲー要素なし。面接は比較的運ゲー要素なし。問題はあっさりしていて、他社の選考と比べるとかなり競プロに近そう。数学とかコンピュータサイエンスが好きだけど開発興味なし!wという人は逆に通りやすそう。開発に関するモチベを(面接段階では)見られないので。 それに反してチームマッチングはめっちゃ運ゲー。東大内の多くの優秀な友人たちからもここで落ちたという声をよく聞く。リファラル採用があるのでリファラルをもらっておくか、応募先チームから魅力的だと思われるgithub.ioなどを用意しておくかなどして気を惹く必要がありそう。競プロの能力だけだとここかなり厳しいと思う(通過した友人氏より)

他社に比べて専門性によるセレクションがないので(せいぜい競プロ。中途採用は専門的な面接をするらしいけど)、受かった人よりもその分野に圧倒的に精通しているのに、運が悪くて選ばれなかった、みたいなことは多そう。正直AtCoder青色以上だと、もはや競プロ能力で差を見ることが不可能っぽいので、あとは運だと思っている。

必要スキル

  • ウェブテスト、面接の問題を解ける程度の頭

Apple

応募・選考の流れ

何月か忘れたけど(秋?)、公式のcareerページから応募する。書類選考→電話面接→本社面接というパターン。特徴として、一切プログラミングをしない。

ぼく

最終面接で運ゲーに失敗した

特徴

  • (今はどうか知らないけど)1年に1人しか採用しないので相当な運ゲー

コメント

インターンの選考でもっとも運ゲー。プログラミングを一切しない上に1人しか採用しないので、どうしようもない。思想としては、「Appleユーザインタフェースなどによくこだわっていることから分かるように、プログラミングだけではなく、総合的な能力を考慮してAppleに合う人を選びたい」らしい。最終面接で聞いた。最終面接段階までは相当絞られるけど、まあ運ゲーなのでしょうがない。日本支部の代表みたいな人から「1人しか選ばないの申し訳ないけど、ほんましょうがないから落ちてもマジで気にせんといてくれ〜」と言われた。気にするやろ

ちなみに仕事内容はかなり面白くて(非公開情報なので言ったらあかん気がするので言わないけど)、1人しか採用しないので環境もしっかり整備されていて、勉強になると思う。

必要スキル

運要素が強すぎて、これ以外のスキルが思いつかない。応募分野に精通してる必要はまったくなさそう。向こうは一から教える気でいるので。むしろ興味とか人間性を重視されてる印象。

LINE(多くのウェブ系企業もこれに該当すると思う)

応募・選考の流れ

いわゆるインターン募集!みたいな季節に、公式採用ページから応募する。ウェブテスト、面接を数回。

ぼく

受かった

特徴

  • ぼくがやめたタイミングから給料が上がった。月50万?ぐらいあるらしい
  • 採用人数が比較的多い
  • 部署もたくさんある
  • 1,2ヶ月のインターンでも有給がある

コメント

運ゲー度はスキルさえ持ち合わせれば低め。Googleと違って面接で、アルゴリズムの質問などをされない。むしろ、開発についての雑談をするタイプの面接。普通に開発経験が豊富なら雑談をするだけなので楽だしパフォーマンスも安定する。 向こうが普段使っているような技術をそこそこ使っていて、このツールのこういうポイントクソだるいよね〜〜〜とか最近こういうのも出てきて便利になったよな〜〜〜ぐらいの業界の会話ができるレベルなら問題なく通りそう。競プロだけ、みたいなのは逆にかなり厳しいと思う。少なくとも業界に対する興味を十分持っていないと厳しそう。

必要スキル

  • ある程度の開発経験(こういうサイトつくりました!みたいなのをいくつか、など)
  • コミュ力アルゴリズムを聞かれる面接ならしゃべることが無にはならないけど、そもそもしゃべるのが苦手なら雑談系の面接でしゃべることが無になりそう)

Preferred Networks

応募・選考の流れ

これもゴールデンウィークぐらいに応募する。事前のコーディング課題の後、面接を数回。

ぼく

受かった

特徴

  • 事前のコーディング課題がしっかりしていて、普通に勉強にもなるし、付け焼き刃ではどうにもならない感じが良い
  • 採用人数が比較的多い
  • インターンのプロジェクトがしっかり用意されていて、他社のように雑務の一つを振り分けられる感じではない

コメント

運ゲー度はある程度あると思う。事前課題がレポート形式なので、ある程度完成度が高くても、手応えとは裏腹に落ちるみたいなこともありえそう。個人的にも面接は、もう一回受けたら落ちていたかもしれないと全然思える。でもこれはあくまでぼくの感覚で、研究室の優秀な人をイメージすると、何百回受けても落ちなそう。Googleとかはいくら優秀でも普通に落ちるイメージ。

必要スキル

わりとこれ的確な気がする。他社の選考に比べて圧倒的にコンピュータサイエンスの基礎的なスキルが要求されている気がする。逆に言えば開発経験とかまったくなくても合格するタイプの選考なので、コンピュータサイエンスを勉強してきた人たちには本当におすすめ。

ベンチャー諸々

ひとくくりにしてしまって申し訳ないです。AtCoder JobsもしくはWantedlyで通年募集しているような会社を指していると考えてください。

ぼく

受かったり落ちたりした

特徴

  • 給料相場は安め(もちろん会社によるけど)
  • わりと戦力を求めている
  • 選考難易度とは独立して、環境はかなりピンキリ

コメント

将来うちに来てもらおうとエンジニアを養成するつもりはあまりなく、どちらかというとガッツリ働いてもらいたいという印象を受ける(繰り返しになりますが、会社によります)。なので、完全未経験でも、週xx時間いけます!みたいなことを言うとあっさり採用されたりすることも多い。コーディング試験や順を追った面接すらないこともあって、会社に行ってカジュアル面談をしていたら、いつのまにか「じゃあ週何日来れる?」とか突然言われて帰る頃には内定が出ていたりする。時給1000円〜1500円ぐらいの相場な気がする。会社によっては、大企業から独立した非常に優秀な人が設立した会社などもあって、上述したようなインターンの環境よりもずっとプロジェクトに近い形で、クオリティの高いコードレビューを受けたり設計の中心に関われたりする。しかし、たまにウ ン チ ー コ ン グみたいな会社もあって、入社してみたら自分が一番プログラミングができてびっくりし倒すこともある。

スキル

  • やる気
  • (会社によるけど)ちょっとした開発経験

まとめ

一般に大企業のほうが運ゲー度が高いです。また、専門性の高い質問をしてくる会社のほうが運ゲー度は低いです。会社によっては最初から運ゲーだと思って受けるほうが精神衛生がいいです。めっちゃ優秀(各世代に1,2人レベル)だと国際学会の発表などを通して向こうからオファーがかかってくるなどもあるので、そのレベルになるとあまり運ゲーじゃないかもしれません(研究室の先輩が月100万以上で海外で長期インターンしてたりした)。インターンをするためにインターンをしなければいけない、という愚痴をよく聞きますが、ある程度は正しいと思います。ぼくも上のようにたくさん書きましたが、自分も一番最初はベンチャーから入りましたし、振り返ってみるとかなりちゃんとステップを踏んでインターンをつないできた感じがします。

おまけ

そういえばエンジニアだけではなく外銀でインターンをしたことがありました

特徴

  • エンジニアに比べては圧倒的文系就活
  • スーツ
  • 数日なのでほぼ無給。夏休みとかになると、内定者は有給でバイトができる
  • エンジニアと違って、仕事(=お金のやりとり)はできない。仕事を眺めるだけ

コメント

  • エンジニアインターンに比べると圧倒的虚無。ただ、なかなか普段見れない業界なので、業界を知っておくという点ではやっておいてもいいかもしれない。SPIみたいなのを受けて、面接を無限回やった。いわゆるフェルミ推定みたいな問題が本当に出る。「この瓶に塩って何粒入りますか?」という質問に隣の慶大生が「まあ俺が普段使ってる塩は高級岩塩なんで、20粒ぐらいしか入りませんねwww」とか答えて合格もらってた。さすがすぎる。ふざければいいもんではないけど、頭のキレがよくて会話が上手ければ通りそう。自分はトレーダーだったけど、トレーダーなら比較的数字感覚のセンスとかみられそう。あと最近情報系がこの分野で希少なので情報系というだけでアドありそう。

スキル

  • 空気読んで会話をあわせる能力

そういや空気読んで会話あわせる能力はかなり重要な気がしますね。「プログラミングができる人」より、「空気読んで会話をあわせる能力が異常にあって、数単語プログラミング用語を知っているだけの人」のほうが、(トップIT企業は無理だと思いますが)多くのIT企業の面接において有利なんじゃないかと思えてきます。

就活をしたよ!

5社受けて4社から合格をいただきました。アルファベットはテキトーです。

A社

インターンにいった会社。すんなり合格がでた。ちなみに学部のときにも受けていて内定をもらっていたが、当時提示された給料よりも低い給料が提示されてびびった

B社

落ちたところ。面接官とのコミュニケーションに失敗して面接終了時点で落ちたと思った。ある程度は面接官運が悪かったと思っているが、ここで落ちたおかげで他の面接でいいコミュニケーションができたと思っている。

C社

ツイッターで知っている人が面接官だったが、猫をかぶっていて、ツッコむか迷った。後から聞くに会社では真面目らしいことがわかった。あぶないあぶない。

D社

面接が10億7回あってつかれた。ツイッターでうしたぷにきあくん笑をしていたら、人事からツイッターに関する注意喚起メールが届いて焦った。

E社

インターンにいった会社。人事面談を忘れていてモーニングコール(午後3時)されたりした。かなりすんなり合格が出た。

F社(番外編)

受けようと思ったらコロナのせいで新卒採用ページが消えていた。

G社(番外編)

応募していないのにお祈りされた。

なんか界隈で毎年新卒オファー額1000万超えをそれなりに聞くけど、あるんだなあという気持ちに

本編

xuzijian629.hatenablog.com

研究に詰まったらやること

みなさんは研究に詰まったらなにをしますか?

とくに理論系のひとは、本当に数日間進捗皆無(いろいろなアイデアを試してダメだったという意味ではなく、そもそも考察をしつくしたみたいな状態になること)になっちゃうこともあると思うのですが、自分がやっているいくつかの対処法を紹介します。

こういうのいいよ〜というおすすめがあれば @xuzijian629 までリプをするなりして教えて下さい!

他人に相談する

もっとも効果的だと思うものから紹介します。その分野に詳しい人でも詳しくないひとでもいいので、そこそこちゃんと話を聞いてくれそうなひとに相談しましょう。話しているうちに思考が再整理されることもありますし、自分では思いつかなかった視点が生えることもあります。指導教官に相談するのもいいと思います。進捗がない状態で、報告することが皆無!wと思うかもしれないですが、問題を整理し直して報告する、ぐらいでも案外話してみれば、話してよかった〜と後から感じることが多いです。自分はありがたいことに一週間に一回はこういう場が設けられているので、一ヶ月まるまる何も新しい発見がなかった、みたいなことは避けられている気がします。

研究をやめる

気分転換をするということです。具体的には散歩、運動、料理、ゲーム、睡眠などです。世界的機械学習研究者オケ村オケ明はスプラトゥーンを1300時間以上プレイしているうえ、おいしいものをよく食べに行ってQOLを高めているので、持続的に研究モチベを保つには気分転換必須だなあ〜という気がします。 自分はこういう状態のとき2~3時間の散歩をよくするんですが、散歩中にふと頭をよぎったものとかをiPhoneにメモして、その後数日かけて考えてみる、みたいなことをよくします。

論文を読む

関連分野の論文を読んでみたりします。たいていドンピシャで有用な情報が書いている論文はすでに読んでいたりするんですが、とりあえずまったく新しい発見がない、という状態を避けるためのテクニックです。たまに自分の研究で十分忙しそうなのに新しい論文を読みまくっているひとを見ると、こういう理由で読んでいるのかな、という気持ちにもなります(どうなんでしょう?)

問題を見直す

コンピュータ科学の分野には、何十年も解かれていないような問題がたくさんあります(P != NP予想とか有名ですね)。そもそもいま考えている問題が現実的にアプローチできるのかというのはかなり重要で、いまの自分の力量で取り組める問題なのかどうかは指導教官や先輩との相談を通して早期に見当をつけておいたほうがいいです。こういうのは本当に大御所に聞くのが有用で、関連問題を教えてくれたりもしますし、どちらにせよ早期に相談することは重要です。

さいごに

いろんな人の経験談を聞くと、問題をとりあえず放置して別のことをやっている間(風呂など)も、頭の片隅にはとどめておいているケースが多いようです。オケ村さんと食事中に、脈絡なくいきなり「え???解けたかも????」みたいなことを言い出していたケースは何度かありました。一回の集中力で問題が解けるケースは非常に稀(もしくは問題が簡単すぎるか)なので、長期的に問題に取り組む上では、常時頭に留めつつ、定期的にガッとのめりこんで深く考察することが重要なのかもしれません。

DDCC2020参加記

NHK杯羽生結弦を(オンサイトで)見ていたら予選出れなかった

うしくんもぐもぐ笑

これはなに?

たぷりすたべる

Minimum Feedback Vertex Setの乱択アルゴリズム

Feedback Vertex Set (FVS)とは、グラフ Gの頂点の部分集合で、その頂点を取り除いたとき、グラフが閉路をもたなくなるようなもののことです。

最小のFVS, すなわち、最小何頂点取り除いたときにグラフがcycle-freeになるかを求める問題はNP困難な問題として知られています。

この前NIIでwataさんに会ったときにかなり単純なアルゴリズムを教えていただいたのでまとめておきます(調べてもありえないぐらいヒットしなくて困りました)。

問題を判定問題として扱うために、入力はグラフ Gと整数 kとし、 Gが大きさ k以下のFVSをもつか、を判定することにします。 Gの単純性は仮定しません。

Reduction

 Gの最小次数を3以上にするために以下の操作を繰り返します。

  1. 頂点 vがself-loopをもつ場合、その頂点を削除し、問題の kを1減らす。
  2. 多重度3以上の辺がある場合、多重度を2にする。
  3. 次数が1以下の頂点がある場合、削除する。
  4. 次数2の頂点 vがある場合、 vを削除し、 vにつながっていた2頂点を新たに辺で結ぶ。
  5.  kが負なら"No"を返してアルゴリズムを終了する。

すげー命題

最小次数が3以上のグラフ Gについて以下が成り立つ。任意のFVS  Xについて、 Gの半数より多くの辺が Xに含まれる頂点を端点に持つ。

乱択アルゴリズム

上述した命題により、reductionを適用したグラフにおいて、一様ランダムにひとつ辺を選び、さらに一様ランダムにその端点を選ぶ(これは次数に比例してランダムに頂点を選ぶことと等価です)と、その頂点は1/4より大きい確率でFVSに含まれる、ということです。

なので、以下の乱択アルゴリズムを構成することができます。

「reductionを適用したグラフ Gにおいて、閉路がなくなるまで、 Gでの次数に比例した確率で頂点を k個まで順番に選んで削除し、閉路がなくなったらYesを出力する。閉路がなくならなかったらNoを出力する」

このアルゴリズムは、判定問題の答えがYesのとき、少なくとも 4^{-k}の確率でYesを返します。

参考:

https://www.mimuw.edu.pl/~malcin/book/parameterized-algorithms.pdf (101ページあたり)

う し た ぷ に き あ く ん 笑 (スター稼ぎ用)