定期的に競技プログラミングが役に立つ/立たないの話が盛り上がります。
数年間IT企業でアルバイトして、なんとなく自分の中で答えが出たというか、ソフトウェアエンジニアの中での「自分の強み」みたいなのがわかってきました。
前提
まず、一般的な話ではなくて、あくまで個人の話として読んでください。
そして、ここでいうソフトウェアエンジニアは、配送計画とか工場のスケジューリングとか明らかに役に立ちそうな分野ではなく、一般の(?)ソフトウェアエンジニアを指しています。
自分の話
まず自分の話をしないと意味不明だと思うので、競プロ関連の歴を書きます。
3年前ぐらいにAtCoderを初めて、8ヶ月ぐらいで青になって、1年半ぐらいで黄色までいきました。
そして青になったぐらいのタイミングで、競プロじゃないプログラミング(いわゆる業務プログラミング)を学びたいと思って、IT企業のアルバイトに応募して数年間働いてきました。
https://atcoder.jp/users/nu50218
画像からわかると思いますが、黄色になってすぐ青に戻り、黄色という目標が消えたのでモチベが下がって2年ぐらい隠居状態になっています。
ただ、2021/11のICPC国内予選を突破できたぐらいには、まだ能力があります。
また、最近は大学でもアルゴリズムの研究室に入って研究してるので、そういう意味では完全に離れたわけではないです。
よくある競プロのメリット
こんな感じのメリットをよく見かけます。
実装がはやい
正確に実装できる
計算量を意識しながらコードが書ける
たしかにそうなんですが、これらは個人的には本質的じゃないように思います。
本質的というのは、競プロをやっている人が、そうでない人に比べて明確に差があることを指しています。
というのも、競プロやってないけど結構プログラム書ける人がLeetCodeでちょっと練習すれば、これらは必要なレベルまで行けそうな気がしているためです。
上2つは言うまでもなくという感じで、計算量を意識するというのも、実際には二分探索ぐらいのレベルまで理解していれば大抵の場面で十分だと感じています。
自分の強み
競プロによる自分の強みは、一言で表すと「現実を数理モデルで見ることができる」ことにあると思っています。
ソフトウェアエンジニアの基本は「問題解決」です。
なにか解決したい現実の問題があって、それをソフトウェアを通して解決します。
その中で「数理モデルにして最適化する」という選択肢が自然にあって、すぐに数理モデルとして定式化でき、解けそうかどうか直感でなんとなくわかります。
さっき考えた具体例を出して説明します。
あるカフェでは、淹れてもらうコーヒー豆を選べるのですが、それぞれ合うフードを店員が暗記し、レジでオススメしていました。 しかし新しい豆が入荷したり、新しいフードが登場したりするたびに店員の暗記が必要で、困っていました。 これを解決するシステムを依頼された私は、客の選んだ豆をレジに入力したら、登録しておいた対応するオススメのフードが画面に表示されるようにしました。
好評だったので、次の仕事として、もっと売上を増やせそうなオススメシステムに改良することを依頼されました。 どのような改良をしましょうか?
いくつもアイデアがあると思います。
たとえば、ポイントカードがあれば、過去の履歴を見てフード2つ買ってくれるような人には2つオススメするとか。
ポイントカードの履歴を使って機械学習で作った推薦モデルからオススメするとか。
同じフードばかり売って品切れが起きるとその後フードの購入率が下がって売上が下がるので、オススメ上位3つを表示するようにして、店員がバランス良く売るとか。
ここで数理モデルとして見てみると、たとえばこんな感じにできたりします。
売上の期待値を最大化したい。
次のことがわかっている。
- 今日用意されるフードの種類とそれぞれの数
- 今日の来店者数と、注文する豆の割合の予測
- ある豆に対してあるフードをオススメしたときの購入率
そして「ある豆に対してあるフードをオススメする確率を決定変数にして線形計画法を適用」という感じで解けそうです。
(具体例終わり)
こんな感じで「数理モデルにして最適化する」という選択肢が自然に増えます。
業務プログラミングだと、「最適化問題があるので、最適化してください」みたいな形をしていない問題ばっかりです。
競プロだったり数理最適化で訓練してる人でないと自然な選択肢として出てこないですし、定式化もなかなかできないと思います。
競プロは問題に設定がついているので、知らぬ間に現実の問題とそれに対応する数理モデルが脳に学習されています。
競プロが「仕様(入出力)が与えられるので、高速なプログラムを早く正確に書く」という構造なので、それに引っ張られたメリットが挙げられがちなんですが、実は逆で、こっちのほうが結構本質的な違いかなと思っています。
競プロは役に立つのか?に対する自分の答え
まず決まったプログラムを書く際に役に立つことは基本ないです。
しかし「数理モデルにして最適化」のレイヤーで役に立つ可能性はあって、個人としては競プロは役に立っています。
なんですが、競プロをやっているだけで身につく能力でもないと思います。
結局、一般的に競プロが業務の役に立つかは微妙なところで、その人次第かなというところに考えは落ち着きました。