開発未経験者が競プロをきっかけにエンジニア・PdMになって見えてきたもの

<!-- 以下本文 -->
## はじめに

menu株式会社のyasudaです。
私は大学院時代に`競技プログラミング`（以下、競プロ）と出会い、そこから情報技術に興味を持ち始めました。
そこから色々あって、バックエンドエンジニアとして新卒でmenuに入社し、その後リードエンジニアを経験し、今はクルーアプリ（＝デリバリー配達員が使用するアプリ）のプロダクトマネージャーとして勤務しております。
本記事では、競プロと普段の業務の話を絡めながら私の体験談をまとめていければと思います！

<br>

## 想定読者
以下の方々に響けば良いなと思いながら執筆します！
もちろん当てはまらない方にも伝わるように執筆しています！
- 競プロ経験者だが、ソフトウェア開発は未経験の方
- ソフトウェア開発経験者だが、競プロは未経験の方

<br>

## 競プロとは

まず初めに、競プロとは数学的な問題をプログラミングの力を利用して解く競技のことです。
アルゴリズムとデータ構造に関しての知識が前提として求められ、それらの知識をどれだけ活かせるかが鍵になります。


例えば、シンプルな問題だと、「整数`a`と`b`を受け取り、`a+b`を出力する」というものがあります。
以下、サンプルコードです。
```cpp
#include<iostream>
using namespace std;

int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    return 0;
}
```
もう少し問題を難しくすると、例えば「五目並べで先攻と後攻がそれぞれ自分が勝てるように最適に行動する時、先攻と後攻どちらが勝つか」みたいな問題もあったりします。
五目並べは、深さ優先探索というアルゴリズムを用いれば解けます。

<br><br>

## バックエンドエンジニアと競プロの関係

大学が物理工学系だったので、大学院で競技プログラミングを始めるまでは私は情報技術のことに関しては全くの無知でした。

競技プログラミングをされている人は比較的ソフトウェアエンジニアとして働いている人が多かった（記憶がある）ので、「そうだ！自分もソフトウェアエンジニアになろう！」と思いmenuに入社しました。


web系のバックエンドエンジニアとして働いてみて、競プロとは違うなと思ったことをまとめます。

1. 競技プログラミングのようにinputとoutputが具体的に決められた問題はない。
    →むしろ、inputとoutputを決めるのに長い時間がかかります
1. アルゴリズムそのものよりも、外部APIコールやDB接続などのネットワーク関連の箇所の方がボトルネックになりがち。
    →N＋1問題でボトルネック作ったりしてしまうのが典型的なケースです
1. アルゴリズムは基本的には自分で実装するのではなく、外部システムだったりライブラリを使うことが多い。
    →例えば、クイックソートは自前で実装しなくても、すでに実装されてますよね(^ ^)

<br>
「競プロは実務に役立つのか？」というのはよくある問いですが、アルゴリズムなどを知らなくても問題にならないように先人たちが色々頑張ってくださったんだなぁと思います。<br>
それでも、やはり競プロをやっていてよかったなと思う点はたくさんあります。
例えば、以下のものです。

1. データベースのindexのアルゴリズムや全文検索エンジンのアルゴリズムがわかるので、裏でどんな処理が行われているかわかる
1. 外部ライブラリが存在しない場合など、自分で実装するという選択肢を持っている
1. 競プロ未経験者よりはコーナーケースに早く気づけ、実装も速くかつシンプルに行える
<br>

web系のバックエンドエンジニアとして働いていて、直接業務に役立っているのかどうかは正直微妙ですが、間接的には非常に役に立っているなと思います。

私が読んでよかったと思っている本を紹介しておきます！

https://www.kspub.co.jp/book/detail/5128442.html

https://book.mynavi.jp/ec/products/detail/id=22672

<br>
<br>

## PdMと競プロの関係

次に、実装者から少し離れてPdMになって思ったことをまとめます。

- 競プロは一般的には問題を「解く」のがミッションだが、（menu社の）PdMは問題を「見つける」ところから始まる。
- どんな問題に落とし込めば「解ける」のかが分かる。

<br>
問題を解くことと問題を見つけることの間には大きな考え方の違いがあるように思います。「イシューからはじめよ」という考え方が参考になります。

https://eijipress.co.jp/products/2356

<br>
私はクルーアプリの開発に携わっていますが、クルーアプリの開発では、注文者様の注文をどれだけ効率的に配達員様に運んでいただけるかが重要になってきます。<br>
この問題は例えば「注文者と配達員を頂点とする二部グラフのマッチング問題」であったり、「配達員の経路最適化問題」という競プロっぽい問題に落とし込むことができます。

問題に落とし込むことができれば、後は解くことに集中できます。もし自分の実力では解けない問題でも、誰かすごい人がいれば解くことができるだろうという感覚があるので、採用活動で欲しい人材を明確に定義できます。


<br>
こちらの本を読むと、どんな問題に落とし込めば解くことができるのかという感覚ができました。

https://www.kspub.co.jp/book/detail/5212707.html

競プロをやっていたから良い問題に落とし込めたという経験があるので、競プロをやっていて良かったなと思います。



<br>

## 競プロやっててよかった！

今の業務にどのくらい競プロで学んだことが役立っているのか分かりませんが、色々学んで良かったなと思います。
競プロを学んでいたから、数理最適化や統計学の分野にも学ぶ範囲を広げていくことができました。
人生は確率に支配された最適化問題と言えるので競プロで学んだことが人生に役に立たないわけないですよね (^^)

ちなみに、確率に支配された世界の中でどのような選択をするのが良いか、という問題を考える時はこちらの本が良かったです。

https://www.oreilly.co.jp//books/9784873119168/

https://www.diamond.co.jp/book/9784478115282.html


「勉強したことを活かしたい」みたいな気持ちを持ちながら学生の時は就活してましたが、社会人になってみると、学んだ知識を活かすも殺すも、結局は自分自身の姿勢と行動に大きく左右されるのだということを実感しています。

ここ数年はなかなか競プロに時間を割けていませんが、機会があればまた積極的に取り組みたいと考えています。

読んでくださりありがとうございました！！






<!-- フッター -->

<hr>

### **▼カジュアル面談**<br>
もし少しでも興味を持ってくださった方がいらっしゃいましたら、お気軽にこちらからご連絡いただきたいです！
こちらのテーマと無関係の話でも全く問題ないので、ご応募いつでもお待ちしております！

https://pitta.me/matches/QkJvOvrOTVRZ

https://pitta.me/matches/vyecHnKtpGFW

<br>

### **▼採用情報**<br>
レアゾン・ホールディングスは、「世界一の企業へ」というビジョンを掲げ、「新しい"当たり前"を作り続ける」というミッションを推進しています。

現在、エンジニア採用を積極的に行っておりますので、ご興味をお持ちいただけましたら、ぜひ下記リンクからご応募ください。

https://recruit.reazon.jp/