はじめに
このタイトルは若干盛っています。すぐに出てきますが、自分がレッドコーダーなのは Codeforces というサイト(いま世界で一番参加人数が多いコンテストサイトですかね?)においてで、日本で有名な AtCoder では一つ下のランクであるオレンジコーダーです。
また、これも後述されますが、自分には他の競技プログラマにないディスアドバンテージを持っていたりするので、決して一般的な話でなくあくまでも一個人の話であることを念頭においてください。
例えば、この記事のせいで「この人が落ちたんだから自分なんて受かるわけないし諦めよう」とかなって企業に不利益が出たとか言われても困るし。
また、就活模様は毎年大きく変化すると思うので、今後就活がある人は本当にあくまでも参考という程度にしてください。
お前は誰
競技プログラミング
rian, riantkb, rian_tkb などの名前でコンテストなどに参加しています。
AtCoder
atcoder.jp
レートは日本人の中で 50 番目くらい、日本人の学生の中で 30 番目くらい、同学年の中で 5 番目くらいに高いと思います。
Topcoder
www.topcoder.com
統計情報はよく知りませんがまぁまぁ高い方だと思います(ほんまか?)。
Codeforces
codeforces.com
レートは日本人の中で 30 番目くらい、日本人の学生の中で 15 番目くらいに高いです。
その他
ICPC2018(年に 1 度の 3 人 1 組の学生チーム戦)の国内予選で 2 位を取ったり、SnackDown2017(2 年に 1 度くらいの 2 人 1 組のチーム戦)で決勝まで進んでインドに行ったりしました。
コンテストの中には本戦に進出したり上位に入賞したりすると T シャツがもらえたりするものもあるのですが、そんな T シャツが家に 20~30 着ほどあります。
学歴
東京にある国立中高一貫男子校(もしかしてこれって一意ですか)に 6 年間通い、東工大に進学しました。大学院も東工大に進み、情報工学を専攻しています。研究は学部 4 年から、バイオインフォマティクス(生命情報解析)と呼ばれる分野に関する研究をしています。
面接でアピールした事柄たち
以下に書いたことはもちろん全てを一度の面接で言ったわけではなくて、全ての面接の和集合を取った感じです。
研究
すごく簡単に研究でどんなことをやっているかの説明をしました(機械学習など、技術としてわかりやすいことをやっているわけではない(強いて言うならば最適化)ので、どちらかと言うと、こういう理由でこういう需要があるため、こんなような問題を解いている、みたいなストーリーの方をわかりやすく説明することが多かったです)。
具体的な内容が気になる方は研究会発表のときのスライドを乗っけておくのでこちらを参照してください(後で出てきますが、自己紹介用のスライドを持っていくタイプの面接ではこれを 5 ページ程度にまとめて説明しました)。
github.com
業績はほとんどないんですが、一応国際論文の 3rd author に入ったり、国内の研究会で発表して(上のスライドのやつ)優秀プレゼンテーション賞をいただいたりしました。
インターン
修士1年の夏に、④社(この表記は後でわかるので今は気にしないでください)で 6週間のインターンをしました。
内容はガチガチのフロントエンド開発業務で、開発業務経験がないどころか JavaScript なんて 1 文字も書いたことない、MVC モデルって何、という状態から、ひいひい言いながら Spring, React, Redux などを使った開発をしていました。
一応期間中にデプロイできて、簡単なリアクションをいただくところまでいけたはずです。
インターンにいく前は自分がガチガチの開発業務をする将来なんてものは全然考えていなかったのですが、インターンでやってみてこういうのも全然面白いし、何より保守を考えてわかりやすく簡潔なコードを書いていくというのはわりと得意で向いてるかも、と思った記憶があります。
アプリ開発
大学院の授業の一貫で、Android アプリの開発をしていました。
2 回あって片方が半月ほどの個人開発(実際には計画性が虚無なので半日で作った)、もう片方は 1 年間のチーム開発でした。
個人開発の方だけ簡単に説明をしておくと、写真を撮るとそこから顔検出をして映った人の顔を福山雅治に置き換える、というアプリを作りました。
github.com
ウェブ開発 (TokyoTech Online Judge)
学部2年生向け向けの C 言語の実習の授業の TA をしていて、その授業で使用するオンラインジャッジシステムの保守運用、bug fix、および一部機能の開発をしていました(実際に開発したのは 2 つ上の先輩なんですが、すでにご卒業されていて大学にいないため)。
Ruby on Rails, Docker, MySQL あたりをひいこら言いながら触っていて、ずっと原因不明だったバグを解決したり新たに順位表機能やスコア問題機能を実装したりしました。
開発? (TSP Visualizer)
上の TA の関連で、TSP のビジュアライザを作ったりしました。kimiyuki さんのフレームワークをお借りして(魔改造して)作りました。
TypeScript を触るのは初めてでしたが、型があるっていいなぁとなった(適当)。
github.com
riantkb.github.io
ディスアドバンテージについて
これは書くかどうかけっこう迷ったんですが、この記事の内容をより正確に、客観的に評価してもらうには書く方が正しいと思ったので書きます。
吃音症
自分はけっこう重めの吃音症を患っています(障害と見なされるようになったらしいので患う、という表現はもしかしたら適切でないかもしれません)。
吃音症についての説明は wikipedia とかを参照してください。
ja.wikipedia.org
どんな感じかという説明はなかなか難しいのですが、一つの例を挙げるとすると、自分の場合は語頭の無声音が苦手で、自分の名字を吃らずに言うことができない、というのがあったりします。
また、相手にわかりやすく伝えるために抑揚をつけて喋るときや、緊張しているときに吃りやすくなるため、端的に言うと面接に死ぬほど向いていないです(ちなみに、べつに緊張していなくても吃るので家族や友達などと話すときも普通に吃ります)。
同様に研究発表も死ぬほど向いていなくて、普通の人が半分くらいの時間で発表し終わるような分量まで削って持っていくことが多いです(かなしい)。
このような背景があったのですが、これが直接的にディスアドバンテージになった(この人は吃音持ちだから取るのをやめよう)とかがあったかどうかは知りません。というかさすがにそれはないんじゃないなぁと思います(これは楽観しすぎですか?)。
ただ、やはり必ず間接的にはディスアドバンテージになっていると思う(吃ってしまい十分に自己アピールができなかった、等)ので、就活の参考にする際にはその点も踏まえるべきかもしれないです。
就活概要
就活の結果としては、7 社を受けて、内定をいただくことができたのは 2 社でした。
これらをおおよそ最終結果が出たのが早い順に ①社〜⑦社 と呼ぶことにします。
①社
①社は ICPC のスポンサーもしていてなるほどなぁ〜、と思ったので 3 月末くらいにエントリーをしました。
通常コースとスペシャリストコース的なのがあったと思うんですが、普通の方に申し込みました。
4 月中旬くらいに web テストを受けて(競プロちっくな問題だった気がします)、5 月中旬くらいに 1 次面接を受けてそこで落ちました。
1 次面接では面接官がフロントエンドのエンジニアの方だったので、基本的にインターンの話を聞かれました。
ただ、如何せん1年近く前のことで、かつそのときすでに TOJ を触っていたこともあり薄い記憶の彼方な話をしていた記憶があります。
また、会社内で競技プログラミングがあまり盛んでないらしく(面接官の方々もやっておらず、また周りでやっている人も知らないとのこと)、なんで ICPC のスポンサーやっているんだろうと思った記憶があります(それを実際に聞いたかどうかが記憶がない…)。
②社
②社は AtCoder でコンテストも開いており、競プロer で行っている人が多く、また楽しそうな雰囲気もすごく伝わってきていたので 5 月初めくらいにエントリーしました。
ここまでエントリーが遅くなった理由としては、正確には②社の中のあるグループ会社?に入りたかったんですが、②社が全社一括採用をしていてどうすればいいのかわからなかったというのがあります。そして、どうすればよかったのかは結局最後までわかりませんでした。
その後、5 月中旬くらいに web テストを受けて(これは競プロちっくな問題とそうでない問題が両方あった気がします)、その結果が返ってきませんでした(え?)
終わりです(え?)
③社
③社はまず去年の夏にインターンにエントリーをしていました。インターンに関しては通過したんですが結局④社の方に行ったので参加はせず、という感じでした。
その後、登録したメールアドレスに新卒採用に関するメールが来るようになって、暇だし web テストだけ受けておくか…、って言って 1 月中旬くらいに受けました(競プロちっくな問題だった気がします)。
すると通過となり、1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
……
そんなメールを 8 回くらいスルーしていたら、いきなり電話がかかってきて「お前来週のこの日空いてるか? 面接すっぞ」って言われました(もちろんこれは超意訳です)。
そうして 4 月初めくらいに 1 次面接を受けに行きました。
すると通過となり、2 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
今度はすぐ電話がきました。2 次面接の日程が決まり、2 次面接をします。
そんなこんなで 4 月中に 3 回面接をしました。
ただ、その時点では他の企業の選考が本当に全く進んでいなかったので、5 月末にもう一回面接をすることになりました。
そこで 4 回目の面接をして、内定を頂きました。
④社
④社は実際にインターンに行ったところです。
人事さんと仲良くなったので、エントリーが始まったときに教えてもらい、3 月末くらいにエントリーをしました。
その後 web テスト(競プロ)と英語テスト(つらい)と適性検査(SPI と呼ばれるやつ?)を受けて、6 月初めくらいに 1 次面接を受けました。
面接の形式は 1 時間のコーディングインタビューで、自分の場合は日本語でした(人による?)。
朝一だったので頭が回っておらず任意のコーナーケースを踏みまくりましたが、まぁちゃんと最後まで行ったっぽいし大丈夫かな、と思っていたんですが落ちました(サイレントお祈りをされました)。かなしいね。
⑤社
⑤社も AtCoder でコンテストも開いている会社です。最近強い競プロer がモリモリ入っている印象で、また研究室の先輩で行っている人が多いという印象もありました。
競技プログラミングのレートが高いとあるコースに申し込めて、そのコースの人は初年度の年収が高くなる、という話があったので 4 月中旬くらいにそのコースでエントリーしました(AtCoder のレートはギリギリ足らなかったんですが、Codeforces のレートが足りていたため)。
その後、5 月初めくらいに 1 次面接を受けました(そのときに実は本来 1 次面接より前にある web テストが免除されていた、という話を聞いた気がします)。
1 次面接は通過となり、6 月中旬くらいに 2 次面接を受けました。
2 次面接は自分のやってきた技術分野とかの紹介スライドを持って行って 5 分程度プレゼンするという形式で、まぁ上に書いたことの一部を適当に持って行きました。わりと研究の話がウケていたような気がします。
その後 6 月末にもう一度面接があり、そこで内定を頂きました。
ただ、初年度の年収に関しては一般の修士卒の金額で、という話でした。理由としては、アルゴリズムなどの知識・経験などは十分だが web 系の経験はまだ十分とは言えないので、という説明をされました。
⑥社
⑥社は 3 月末くらいに ICPC に参加した学生向けのイベントがあり、そこでエントリーをしました。
その後 4 月中旬くらいに web テストがあり、5 月中旬くらいにオンライン面接(日本語)がありました。
このオンライン面接もコーディングインタビュー的な感じでした。問題が興味深かったんですが誰にも共有できないかなしみ。
その後、6 月中旬くらいに面接がありました。
その面接は 45 分のコーディングインタビュー が 4 セットで、自分の場合はそのうち 2 回が日本語でした。
英語自体はとても苦手なのですが、英語のコーディングインタビュー自体はインターンの面接のときにも経験していたのでそこまでめっちゃ不安というわけでもなかったのですが、なんか手応えはそこまで良くなく、実際落ちました。
⑦社
⑦社は AtCoder でコンテストを開いており、そのコンテストの本選に進出したことで最終面接より前の面接をスキップできる権利を持っていたので、5 月初めくらいにエントリーしました。
その後、6 月末くらいに最終面接があり、落ちました。
就活をして思ったこととか、スタンスとか
どういう基準でエントリーする企業を選んだか
基本的には、AtCoder でコンテストを開いたことがある企業からエントリーする企業を選んでいました。
理由としては、探すのがめんどくさかったというのもあるんですが、コンテストを開くくらいだから競プロer の良い点悪い点を理解して、その上で競プロer に来てほしいと思っているのではないか、と思ったのが大きかったと思います。
何をして働きたいか
これが難しくて。だって、本音を言うと「働かずに金が欲しい」で、百歩譲って「競プロみたいな問題を解いてたら金が降ってきてほしい」。
じゃあ 200 歩譲るとどうなるかと言うと「やりたいことは特にない(コードが書ければなんでもいい)」になるんですが、実はこれは就活ではダメらしいです。えー、なんでさ。
でもエントリーの段階でフロントエンドエンジニア、バックエンドエンジニア、アプリ開発エンジニアとか分かれている会社もあるし、やりたいことが決まっている人は決まっているんだなぁ、となりました。
あとこれはわりとびっくりしたんですが、例えばアプリ開発をやりたいけどフロントエンドは死んでもやりたくない、みたいな人が存在したりするらしいです。
個人的にはそこらへんって本質というか根幹は同じだと思っているので、単純になんでそういうことになるんだろうなぁと思いました(これは普通に興味があるので、そういう方がいたら教えていただきたいです)。
結局面接では、まぁ競技プログラミング的なアルゴリズムとかが活かせる問題があれば嬉しいけど、べつにそういうのじゃなくても良いし、開発もインターンでやって面白かったし向いていると思ったのでそっちでも問題ない、みたいなことを言っていました。
企業を選ぶ基準、企業の順位
これも聞かれて困る質問でした。上で書いたように、やりたいことが明確でない/どんなことでもわりと楽しめてしまう ので、どうしても業務内容よりも環境(給料、周りの社員の優秀さ、等)を挙げることが多かったです。
でもこの回答は、おそらく面接官からの印象はそこまでよくなさそうな気がします。
就活のタイミングについて
これについてですが、まず自分の始めた時期は比較的遅めだったと思います。
自分が本格的に色々な企業にエントリーをし始めたのは 3 月中旬くらいからで、その頃にはすでに就活を終えてる同期もいました。
基本的にはいつ就活をしてもいいとは思うんですが、いくつか難しい点があって、
- エントリー〆切(3 月末ごろにはもう締め切っているところが多い)
- (今年の場合、)一部 6 月になってからじゃないと面接をしない企業があり、そうでない企業の選考が早く終わってしまうと長く待ってもらうことになる
- 通年採用のところは、早いうちに選考を進めないと枠が絞られてしまう/埋まってしまうという噂がある(ほんまか???)
あたりを気をつけるべきかもしれません。
面接について
率直な感想としては、良い雰囲気で進んでいても落ちるときは落ちるなぁというやつでした。
終始和気藹々として 1 時間を過ごしたのに落とされると、普通に人間不信になります。
例えばコンテストとかだと明確な判定基準があってこれが解けなかったからこの順位、とかがあると思うんですが、面接で落ちてメールでいつもの定型文を受け取っても、どこが悪かったか、どうしたらよかったか、今後どうすればいいかなんてわかりません。
あとは、やはり短い時間で自分の優秀さをアピールしなければならないので、練習とまではいかなくても話す内容の準備くらいはしていくべきだと思います。
個人的には、たった 1 時間の面接による印象よりも競技プログラミングのレーティングの方がどちらかと言うと頭の良さとか優秀さとかに対する相関があると思っているのですが、さすがにそんなものはただの持論で、実際には競技プログラミングのレーティングにはそんな影響力はないので、やはり口の上手さは重要になると思います。
あとはまぁこれですね。
あとこれも。
結局競技プログラミングだけで就活はできるのか
端的に言うと、受ける会社・受ける職種に依ると思います(それはそうすぎる)。
例えば、面接が全てコーディングインタビューのみの会社だったら、基本的には行けると思います(え、落ちましたが……)。
そうではない場合、例えば機械学習エンジニアを受けるのだとしたら研究分野が機械学習であったり、そうでなくともしっかり触ったことがあることが望ましいだろうし(最近は機械学習をやっている学生も多いため)、フロントエンドエンジニアを受けるのだとしたら少しくらい触ったことがあることが望ましそうです。
それ以外の、特に細かい分かれ方をしていない職種については扱いが少し難しいですが、それに関しては会話が合計で 1 時間持つようなネタがあればまぁ大丈夫だと思います。
これは知見なんですが、競技プログラミングでの成果ってそこまで話を広げられるものでもないという話があります(これはトークスキルに依存するかもしれません)。
なので、みんな研究はやっているだろうから基本はその話で、もしあまり研究で成果がないなら何か他に話せるネタ、アピールできる何かが必要なのかな、と感じました。
就職先について
結局 ③社 と ⑤社 の 2 社から内定をいただき、③社の方に入ることにしました。以下に理由を挙げていきます。
職種について
まずこの 2 社ではそもそも職種が違います。⑤社は web 系企業ですが、③社はいわゆる ITコンサルと呼ばれるところになります。
感覚としてどう違うかというと、前者は何万何億というユーザーに対してサービスを提供、およびそのサービスを改善をしていくのに対し、後者は一人一人(一団体一団体)の抱えている課題を一つずつ整理し解決する、というイメージです(これは個人的なもので、間違っていても責任を負いません(でも間違っていたらこっそり教えてください))。
このどちらが好きか、というのは本当に人それぞれだと思うのですが、個人的には後者の方が好きだと感じました。
あまり関係ないですが、TL にバグった AtCoder の提出が流れてくるとつい見に行って解決したくなっちゃうのと似ているかもしれません。いや、似てないかもな。
業務内容について
最適化をお仕事にできる、というのもやはり魅力の一つではあります。最適化いいよね。
もちろんそれだけではなくて、やはり顧客の抱えている課題を紐解いてちゃんとクリティカルな問題に切り分けていく、というような作業がわりと好きだし向いているなぁと思ったところも大きいです。
まとめ
短くも険しい就活が終わり、つらいことも多々あったけどでも、結局自分で納得のできる結果を得られたかなという気持ちがあります(いま、落ちた 5 社全てからやっぱり内定出すよ、って言われても、やっぱり③社を選ぶような気がします)。
まぁでも苦労したのは事実で、このレートでこの前例を作ってしまったことが少し申し訳ない気持ちもあります。
しうかつが終わったので各位と飲みたい気持ちがあります。連絡をください。雛鶴あいにはならないけど。
今度は、「レッドコーダーなので就活で俺TUEEEEした件」という記事が投稿されるのを楽しみに待っています。