はじめに
こんにちは、GxPのあさかです。約1年ぶりに帰ってきました
この記事はグロースエクスパートナーズAdvent Calendar 2024の2日目の記事です。
時間が過ぎるのは早いもので、研修が終わり現場配属になってからもう1年以上が経過しました。そこで思い出すのがこの投稿です。
1年経ったということで、学生時代競技プログラミングしかしてこなかった人が、競プロをやっていて活きたこと・どんなことができるようになったかと、活きなかったことをいくつか紹介したいと思います。
ここで書いた内容がすべてのWebエンジニアにあてはまるとは限りません
自己紹介
- 大学は理学部数学科、学部卒
- 競プロ歴は5年くらい(2018年3月に開始)
- レートはAtCoder1350くらい(highest 1441)、Codeforces 1600くらい(highest 1703、大学卒業してからやってない)
- 入社前まで開発経験一切なし
- 開発をする上での基本的な知識も当然なし
- 2023年4月めでたく社会人になりました。入社後どんな研修をやったかはこちらから
業務内容
現在以下の2つの案件を掛け持ちで参画しています。
- クレジットカード会員向けサイト&新規入会用ページの保守開発
- 使っている技術はJava、HTML、CSS、JavaScript、Git等web開発エンジニアが使うものをまんべんなく
- 交通データを用いたデータ分析
- 言語やフレームワークはpandasや、PySparkなど、クラウド環境はAmazon SageMakerや、Databricks
- 最近参加したばかりなので、まだあまり大きなタスクは任されていない
競技プログラミングとは?
与えられた問題を解決するコードを設計・実装し、用意されたテストケースすべてに対して正しい答えを出力することで正解となります。また、コンテスト中に正解した問題数や正解するまでにかかった時間で順位やレートが決まります。
例えば以下のようなものが出題されます。
100個の相異なる整数が与えられます。この中で2番目に大きい整数は、前から何番目にあるか求めてください。
出典:AtCoder Beginner Contest 365 B - Second Best
これは簡単な問題ですが、難易度が高い問題になるとただ実装するだけでは計算効率が悪く、決められた実行時間内に処理が終了しません(不正解扱い)。そこでアルゴリズムやデータ構造を用いて、コードの高速化を行います。
競技プログラミングでは、プログラミング言語の基本文法をはじめ、論理的思考なども身に着けることができます。
活きたこと
知らない言語で書かれたコードに対する読解力がついた
競プロを強くなろうとする上で避けては通れないのが「他人の提出や解説のコードを見る」ということです。
他人のコードを見て、処理内容を理解して、自分のコードに落とし込むというのは、業務でも活きています。
僕はC++とPythonで競プロをしていましたが、業務ではJavaを書いています。ただ、プログラミング言語というのは、それぞれの言語でいろいろな違いはあれど大枠は一緒なんですよね。変数を宣言して値を代入する、ループの構文を使って複数のデータに対して処理をする、関数を宣言したり呼び出す。これは業務とか競プロとか関係なしに行うことです。自分が知らなかった言語に対しても「こういう処理なんだろうなー」というのを考える力が競プロを通してついた気がします。
SQLも一切書いたことがなかったのですが、超簡単な文は何も見ずに書けたり、わからなくても調べながら書くことができるようになりました。
簡単な処理がすぐに書けるようになった
「プロトタイプをすぐに作れる」という面で見れば部分的には活きた点かもしれません。
1つの難しい処理をいくつかの簡単な処理に分解して、「こうやって書けば動くかな?」というのをいろいろ試しつつ、知識をつけて最終的な成果物を作っていきました。1つの難問をいくつかの部分問題に分けてそれぞれを考察・実装するのは競プロでもよくあるパターンですよね。
ある程度パソコンを操作する力がついた
以前こんな投稿を見ました。
これを見て「確かにその通り」だと僕も思いました。
この投稿の文章を借りると、AtCoderは初心者でもコードに全集中できるように、なにからやればいいかが丁寧に書かれた教材やボタン1つでコードを実行できる環境が用意されています。
しかし、ある程度レートを上げるためには自分のパソコンに自分専用の実行環境を用意しなければなりません。僕の場合は、「競プロのレートを上げる」というそれだけのモチベーションで初めて環境構築をして「環境構築ってこうやってやるんだ」というのを知りました。また、コマンドラインでコードを実行するので、Linuxコマンドなども少しだけ知ることができました。
競プロでつながった人脈
競プロをしている・していた社会人の方々は、なんらかの形でコードを書くという仕事をしている方が多いイメージです。社会人になりたての頃から今もSNSで「Gitよくわからん」とか「SQLさっぱりだわ」というような投稿をすると助けてもらえてありがたいです でもこれは自分の能力が活きたのとはちょっと違うかもですね...
活きなかったこと
高度なアルゴリズムやデータ構造を使った処理の高速化
結局のところこれに尽きます。
Webの開発では、開発者が処理の高速化を求められる場面ってほとんどないと思います(少なくとも僕が業務で要求されたことはありません)。なぜかというと、データを抽出する際にデータベースがその辺の高速化をうまくやってくれているのと、いざ抽出されたデータはせいぜい数件、多くても数百件なので、愚直に処理をしても時間がかかるということはほぼないです。それに加えて、競プロのコードと違って業務のコードは保守性がかなり重要になってくるので、「難しいアルゴリズムとかデータ構造を使ってあまりメリットの大きくない高速化をするくらいだったら、リソースを使ってもいいから読みやすいコードを書いてくれ」という風潮があります。
データ分析の業務でも高速化・効率化を求められたことはありません(これは僕がまだ難しいタスクを割り当てられていないというのもありそうです)。
こちらはWebの開発と違って巨大なデータを扱いますが、結局のところ「長時間待つ前提」だったり、「フレームワークや実行環境がよしなにやってくれる」というような感じで、高速化よりもナイーブな実装を求められることが多いです。むしろ、「こうやって書くと遅い場合があるからこれはなるべく使わないほうがいい」といったことや「この場合の解析はこの実行環境を使うよりも別の環境を使った方がいい」ということを求められるイメージがあります。
なので、「競プロで勉強したアルゴリズムやデータ構造の知識をガンガン使いたい!」という方には、正直Webの開発はオススメできません。
早くコードを書く技術
活きたことにも同じようなことを書きましたが、活きなかったことにも当てはまります。
業務では「100分で7つの問題のコードを実装してください」みたいな場面は絶対にないです。「1日使っていいんで、コーナーケース20個くらいある300点問題を1発正解できるように実装してください」みたいな場面は結構あります。
業務で大事なのは「品質が担保された製品(コード)」であって、「正常系だけなんとなく動く製品」ではないのです。
可読性の悪い使い捨てのコードを書くこと
競プロ界隈では度々話題になります。競プロは「AC(正解)すればなんでもいい」「使い捨てだから可読性は気にしない」というのが正義ですが、業務の場合は上にも書いた通りそうとは限りません。
僕の場合ある程度は競プロするときと業務中でプログラミングする頭を使い分けられている気がしますが、リーダブルコードの輪読会に参加したり、既存のコードを読んだりしていいコードを書けるように頑張っています。
まとめ
chokudaiさんの投稿に始まりchokudaiさんの投稿に終わりますが、研修期間も含めエンジニアを1年半くらいやって、この投稿の内容を身をもって実感しました。
「競プロをやってるだけじゃなにもできないが、競プロはすごく役に立つ」と僕自身は感じています。
これからはWebのほうでも難しい機能の設計や実装にチャレンジするのと同時に、Web開発のほうでは競プロで培ったアルゴリズムとデータ構造の力をあまり活かせていないので、データ分析関連のほうで活かせるようなタスクに挑戦してみたいと思っています!