FORCIA CUBEフォルシアの情報を多面的に発信するブログ

AtCoderJobs一期生から見た、競技プログラミングとフォルシア

2020.12.15

アドベントカレンダー2020 エンジニア テクノロジー

FORCIAアドベントカレンダー2020 15日目の記事です。

フォルシアはAtCoderJobsにてエンジニアを絶賛募集中!

この記事はなんでしょう?

新卒エンジニア1年目の吉田です。冒頭でも紹介した通り、フォルシアではAtCoderJobs経由での採用を行っていますが、私も就活ではこちらを活用して入社しました。
私を含めた20年新卒には、初めてAtCoderJobs経由で採用された社員が複数名いるということになるわけですが、ここはひとつJobs一期生を代表して、競技プログラミングとフォルシアでの業務に関して、就活や入社後の経験も踏まえた実感を書き出してみよう!というのが、本稿の趣旨となります。

さらりとした私のこれまで

お控えなすって!

私は経済系の大学院出身です。在学中は知人の紹介でwebアプリを開発するアルバイトをしていました。
といっても、エンジニアとしてはfor文とif文が書ける程度の実力で、フロントサイドのちょっとした修正をするにも時間がかかるような状況でした。

少年は競プロを通しエンジニアの道を知る

そんな中、ふとしたきっかけでAtCoderの存在を知り、趣味の一環として継続的に取り組むようになりました。
ちょうど私が就活を始めた2018年からAtCoderJobsがサービスを開始したこともあり、就活の時期には活用してみることにしました。掲載企業の多くが要求ランクに水色を指定していたこともあり、水色になることを目標にそこそこ頑張った記憶があります(まだBeginners Contestがレート1199までを対象としていた時期ですね)。
そして縁あってフォルシアに内定が決まり、残りの学生生活は修士論文を書きつつ、競技プログラミングをやりつつ・・・といった日々となりました。
入社後も競技プログラミングはやりつつ、しれっと青色になることができ、今に至るといった感じでしょうか。

競技プログラミングは業務の役に立っているか?

私にとってはyesです。

問題解決能力は問題解決で身に着けるものなり

競技プログラミングは、一言でいえば「プログラミングという土俵での問題解決能力を競う競技」であると解釈しています。
業務においても、「プログラミングという土俵での問題」を解決するという点では同じです。
競技プログラミングでは問題解決のためにアルゴリズムやデータ構造の知識を駆使しますが、業務ではこれがフレームワークや扱うデータ等の知識に置き換わるという感じでしょうか。

また、競技プログラミングでは具体的な問題があらかじめ与えられていて、解決策を考える部分が大半を占めますが、業務では抽象的な現象から具体的な問題点を見つける部分、またどのような方法でその解決を行うか考える部分の比重が大きくなります。
そのため完全にオーバーラップするまでは言えないのですが、競技プログラミングにおける問題解決能力の向上は、業務における問題解決能力の向上に直結すると考えています。

ああ やっぱり過去問が一番だわ

私が競技プログラミングに取り組み始めた時期は、前述の通りエンジニアとしての力はほとんどない状況でした。
力がなかった原因は、あきらかに圧倒的な知識と経験の不足によるものでした。きちんと情報科学の勉強をしたわけでも、趣味で開発をしていたわけでもなかったので、作業の中で生まれる課題は初めて見るものばかり、考えつく対応策も不適当なものが多かったように思います。
しかし、競技プログラミングに取り組む過程で、私は上達のため過去に出題された問題をたくさん解く必要に迫られます。

この作業は、

  1. 問題点を見つけ
  2. 解決策を考え
  3. それを実現する

という一連のサイクルを繰り返し訓練する事に他ならず、私にとっては不足していた知識と経験を非常に効率よく補強するものとなりました。
実際AtCoderのレートが伸び始めた頃には、webアプリの開発をするアルバイトの作業中に「昔苦しんだ挙句放置していた問題が簡単に解決できた」「これまで理解できなかったソースコードが容易に理解できた」といった体験を何度もしました。
実は競技プログラミングで使っている言語は開発と一切関連がないのですが、それでもエンジニアとしての根本的な能力が劇的に改善されたと実感しています。

入らないとわからないこともある

一方で、フォルシアに入社する前に想像していた「役に立ち方」と異なっていた部分もあります。
例えば、「競技プログラミングを通じて学んだアルゴリズムやデータ構造の知識が、直接業務で問われるわけではない」という点です。

AtCoderJobs上でフォルシアの新卒求人は水色以上を要求ランクとしています。
競技プログラミングで良いパフォーマンスを得るには、問題解決のスキルだけでなく、出題されうるアルゴリズムやデータ構造の知識が必要不可欠です。
フォルシアでは、AtCoderの水色を「標準ライブラリのデータ構造に乗せれば解ける問題」を解くだけの知識と能力が担保されている水準、という観点で要求しています。

水色を目指そうとすると、結構な時間を知識の習得に割く必要があるかと思います。特に私は情報科学の教育をほぼ受けていなかったこともあり、かなり苦戦した記憶があります。
この苦労して培った競技プログラミングにおける知識の部分は、一切役に立たないというわけでもないのですが、業務内容と直接は関係しないものです。少なくとも、競技プログラミングの知見を生かして計算量改善をしていこう!というわけにはいきません(オーダーレベルで改善を行う業務はかなり稀だと思います)。
費やした労力を考えると、少しもったいない気持ちもあります。

しかしフォルシアに入って、これまでの学習がまったくの無駄だった、あるいは要求ランクと実務の間にギャップがある、といったことは感じません。これは実際に業務をするまで理解できませんでしたが、フォルシアの顧客が属する旅行業界が扱っているデータは本当に膨大で複雑です。

私が担当しているアプリではダイナミックパッケージと呼ばれる商品を扱っていますが、これは交通手段と宿泊施設を自由に組み合わせられ、その上価格も動的に変動するというもので、データもアプリも非常に(非常に!)複雑だと実感しています。
膨大かつ複雑なデータに対する高速な検索を実現するため、フォルシアではデータの持ち方にとても気を遣っています。これを理解し適切に運用するための学習は、扱うものは違えど競技プログラミングにおけるデータ構造の学習に通ずるものがあります。

そのため、「AtCoderで水色になれる水準の知識を習得した」という保証は新卒採用の基準として適切だと考えています。
(もちろんこれは「AtCoderのレート」をアピールポイントにする場合の話であって、AtCoderのレートが緑以下ならば適性がない、という意味ではまったくありません!フォルシアがエンジニアに対して求める理想を、採用段階ですべて満たしている必要はありません。フォルシアのビジネスや志向に興味を持った方は、ぜひ公式のフォーム(こちら!)からご応募いただければと思います。)

補足として(これは重要なことなので強調したいのですが)フォルシアは、AtCoderJobs経由での入社だからといって競技プログラミングの継続を強要しませんし、競技プログラマ向けに特別な業務を強いることもありません。 無論、計算機科学の深い知識が必要になる仕事もありますし、希望する方のそういった分野での活躍も強く期待しています(今はインメモリデータベースが熱い!詳しくはこちら)が、あくまで意思決定はエンジニア個人に委ねられています。

業務と競技プログラミングの相乗効果

ここまでの主張は「競技プログラミングをやっていると業務にとってプラスになるよ!」というものでしたが、今になって思うのは、逆に「業務を行っていると競技プログラミングにとってプラスになるよ!」という面すらあるのだ、ということです。

変数名はナメたら命取り

一つ目は、「型」を学べるという点です。これはデータ型という意味ではなく、コーディングの流儀という意味での型です。

アルバイトコーダー時代の私はそもそも流儀云々以前の実力だった上に、基本的に一人での開発、内容も「動けば何でもよし!」というものでした。 それゆえに命名は適当、表記の統一性もバラバラ、可読性なんて言葉聞いたことありませんが?という有様でした。
競技プログラミングを始めてからも、読むのは自分だけ、正答すれば何でもよし!という世界の中で、コードの可読性を上げる努力をしたことはありませんでした。

一方で、フォルシアでコードを書く上では、フォルシアのコード規約を守る必要があります。
また、甘えた命名をしたり可読性の低い処理をコミットしてしまった場合、コードレビューで矢のように指摘が飛んできます(コードレビューに関しては同期がこちらで記事を書いています)。
これは複数人での開発において、プロジェクトの開発効率や保守性を高いものにする上で必要不可欠な過程ではありますが、同時に私にとっては、業務の中で自分のコーディングの「型」を育てる過程にもなりました。

私は入社後にしばらく競技プログラミングを一切しない時期があったのですが、久しぶりにやや複雑な問題を解こうとした際にとてつもない違和感を感じたことを覚えています。
これまで通りのやり方で問題を解くコードを書いていると、心の中のリトルヨシダが「そこは関数に切りだせ」「もっとわかりやすい名前をつけろ」と話しかけてくるのです。いつの間にやら、私はすっかり可読性の低いコードを受け付けない体質になってしまっていたようでした。

特に開発経験のあまりない、プログラミングはAtCoderでしかしていません!というような方にとっては、(フォルシアに限らず)業務を通じて一定の流儀がある環境に身を置くことで、プラスになる面があると考えています。

チャランポランなコード程バグると恐い

二つ目は、デバッグが速くなるという点です。

先程述べた通り、業務では競技プログラミングと比べて問題点を見つける部分の比重が大きくなります。
例えば運用・保守の業務であれば「問題が発生した。解決してほしい」という依頼を出発点として、沢山あるコードの中から原因を特定して修正することになります。
また、開発業務であっても、自分の実現したいことと既存の実装に矛盾がある場合は、その原因を特定して改善する必要があります。
競技プログラミングでは基本的に自分のコード、または正解のコードを見る機会がほとんどだと思いますが、業務の中では誤っている(かもしれない)コードを見る機会が非常に多いです。

また、前項の通り、業務の中で「型」を身に着け、可読性の高いコードを書くようになることで、自分のコードがそもそもバグを生みにくい、かつバグを発見しやすいものになっていきました。誤りを見つける訓練と、誤りを見つけやすくする訓練の二つが、業務の中で自然と行われていたことで、競技プログラミングにおいても自分のデバッグ力の向上を実感することができました。

フォルシアでの競技プログラミング

さて、業務におけるシナジーという観点で話を進めてきましたが、入社してからも純粋に競技プログラミングを楽しむ機会は沢山あります。
せっかくの機会なので、過去約一年以内にフォルシア内で行われた、またはフォルシアとして参加した関連イベントについて紹介していきます。

AtCoder

やはり一番盛んなのはAtCoderです。20卒の入社で社内のユーザーがかなり増えましたが、それ以前から取り組んでいる先輩も多数います。
最近は社内向けの仮想コンテストを定期的に開催しており、夏のインターン時には学生も交えて盛り上がりました(インターンについて詳しくはこちら)。

また、アルゴリズム実技検定(PAST)も毎回多くの社員が受験しています。前回は満点を出した同期が社内向けの解説会を開催し、普段競技プログラミングに触れない層も含めたイベントになりました。

ゆるふわオンサイト

フォルシア主催のプロコンです。詳しくはこちら
前回は20卒の同期たちが作問をしていました。私はオンラインでこっそり参加しましたが、あまり成績が良くなかったのでこのことは誰にも明かしていません。
次回の開催予定はまだ未定ではありますが、必ず再開されると思います。フォルシア競技プログラミング部では作問のできるエンジニアを絶賛募集中!

ICFPC

72時間で難問を解くタフなプロコンです。私は軟弱なので参加しませんでしたが、タフな同期と先輩が参加していました。フォルシア競技プログラミング部はタフなエンジニアを絶賛募集中!

ISUCON

チームでwebサービスの高速化を競うプロコンです。私は参加しましたが、普段やっている競技プログラミングと比べるとかなり実務よりの知識が要求されるため新鮮に感じました。
案の定というか結果は散々だったので来年こそは!という気持ちがあります。フォルシア競技プログラミング部は自走力のあるエンジニアを絶賛募集中!

PG BATTLE

3人1組でそれぞれが問題を解いて合計点を競うプロコンです。
私は20卒の同期と組んで出場しましたが、二人が満点だったにも関わらずせんべい役の私が大失速してしまいランクインを逃してしまいました。フォルシア競技プログラミング部は強靭な顎を持ったエンジニアを絶賛募集中!

CodinGame

ゲームAIを作って他のAIと戦わせ、上位を目指すプロコンです。
かなりカジュアルですが、企業ごとに上位プレイヤーのスコアの集計でランキングが競われます。
私はカジュアルに参加してカジュアルな戦績しか得られませんでしたが、フォルシアとしては全世界62位でした。フォルシア競技プログラミング部は拡大再生産に強いエンジニアを絶賛募集中!

おわりに

節目節目に宣伝を入れ直せ

上でも少し触れましたが、特に情報系以外の出身の方や、競技プログラミングがコーディング生活の中心という方ほど、競技プログラミングとフォルシアでの業務は相互にシナジーを生む、ということが実感できるかと思います。この記事を読んで「もしかして私?」と思ったあなたには、この後ぜひ見ていただきたいページがあるので、それを紹介してこの記事はおしまいということにします。

フォルシアはAtCoder Jobsにてエンジニアを絶賛募集中!

この記事を書いた人

吉田 侑弥

2020年新卒入社。旅行プラットフォーム部エンジニア。
フォルシアPCゲーム部はFPSのできるエンジニア、非エンジニアを絶賛募集中です。