採用活動のために競技プログラミング（AtCoder）を始めて一年経ったので感想を書きます

[Supershipグループ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/supership)の1日目の記事になります。

## 自己紹介

名畑です。
Supership株式会社のVPoEです。

たまに下記のようなイベントで話したりもしています。

- [KGDC Tech Conference #0 通信インフラだけじゃないKDDIグループの多彩な技術](https://kgdc.connpass.com/event/203487/)
- [アドテクの「今」と求められる「変革」を考える / AdTechnology Meetup vol.1](https://adtechnology-meetup.connpass.com/event/189385/)
- [株式会社サイバーエージェント オレシカナイト ビアバッシュ＆LT大会](https://cyberagent.connpass.com/event/108040/)
- [Repro Tech: Mobile SDK Reliability support 助太刀](https://repro-tech.connpass.com/event/128924/)

AtCoderの色は緑です。
つまり、後述しますが、上位30%以内となります。特に優秀なわけでも詳しいわけでもありません。
ローカル環境はPythonですが、提出するときはPyPy3にしています。

趣味としては[ツイステッドワンダーランド](https://twisted-wonderland.aniplex.co.jp/)に毎日ログインしています。10月開催のNRC第5回統一試験の結果はSSでした。

## 経緯

昨年[マネージャーになってから自分自身のためにやったことまとめ](https://qiita.com/nabata/items/83c97c5acf73710bc491)という記事で以下の通り書きました。

> 採用活動をしていて思うのは、最近、競技プログラミングの実績を出される応募者の方が多いなと。  
>「[AtCoder](https://atcoder.jp/)で何色です」みたいな。

> もちろん検索すれば何色は上位何%なのかはわかりますし、過去問もあるわけなのですが、そのスキルレベルがなかなか具体的に思い描けずにいました。

> なので、これは自分でやってみるしかないなと思い、つい先日、AtCoderに登録して始めてみました。  
> 言語はPython(3.8.2)です。どうせならと業務経験がない言語を選んでみました。

あれからちょうど一年経ちましたので、感想などをまとめてみました。

## そもそもAtCoderってなに？

公式サイトのトップページに下記の通り書かれています。会社名でもあります。

> AtCoderは、オンラインで参加できるプログラミングコンテスト(競技プログラミング)のサイトです。リアルタイムのコンテストで競い合ったり、約3000問のコンテストの過去問にいつでも挑戦することが出来ます。

コンテストには**AtCoder Beginner Contest(通称ABC)**、**AtCoder Regular Contest(通称ARC)**、**AtCoder Grand Contest(通称AGC)** などがあります。
それぞれ開始日時も制限時間も決められています。  

コンテストでは複数の問題が出され、問題毎に点数が決められています。
解けた問題の点数の合計値並びにその回答時間、ミス数を元に順位が決まり、パフォーマンスという値が算出されます。
パフォーマンスはそのコンテスト単体での結果を数値化したものです。

レーティングという値もあり、こちらは安定して出せる結果を示す数値となります。
一回参加しただけでは実力通りのレーティングにはなりません。
パフォーマンス1000をとり続けるといずれレーティングが1000になるといった感じです。

コンテストに参加しないとレーティングを上げていけません。

ユーザーはレーティングに基づいて色分けがされます。
色毎のスキルレベルなどは[AtCoderの社長である高橋様のブログ記事](https://chokudai.hatenablog.com/entry/2019/02/11/155904)でも言及されています。 

- **赤** / 2800〜 / 上位0.3%
- **橙** / 2400〜2799 / 上位1%
- **黄** / 2000〜2399 / 上位3%
- **青** / 1600〜1999 / 上位7%
- **水** / 1200〜1599 / 上位15% 
- **緑** / 800〜1199 / 上位30%
- **茶** / 400〜799 / 上位50%
- **灰** / 〜399 / 1回でも参加

この%値は実際の参加者のレーティング分布とイコールではないのでご注意ください。
レーティングの計算式の詳細は[AtCoder's Rating System(英語)](https://www.dropbox.com/s/ixci4amralioaif/rating.pdf?dl=0)として公開されていますので興味がある方はどうぞ。

対応している言語やバージョンなどは[ルール](https://atcoder.jp/contests/APG4b/rules)をご覧ください。

## AtCoderの利用者数はどれぐらい？

- 2017年9月25日のプレスリリース
    - [国内最大プログラミングコンテストサイト「AtCoder」の参加者が1万人突破！](https://prtimes.jp/main/html/rd/p/000000003.000028415.html)
- 2020年6月8日のプレスリリース
    - [日本最大のプログラミングコンテストサイトAtCoder登録者数が20万人を突破！](https://prtimes.jp/main/html/rd/p/000000027.000028415.html)
- 2021年7月28日のプレスリリース
    - [日本最大のプログラミングコンテストサイト AtCoder 全世界での登録者数が30万人を突破！](https://prtimes.jp/main/html/rd/p/000000034.000028415.html)

かなりの勢いで増えていますね。

弊社でもAtCoderのコンテストにアクティブに参加する社員が何人もいて、Slack Channelで交流もしていて、利用者数の増加を感じます。

## 楽しいし気持ちいい

はい、ここからが本題です。
AtCoderをやってみての感想です。

AtCoderでは問題に対してコードを提出します。

問題というのは、たとえば[ABC220のA問題](https://atcoder.jp/contests/abc220/tasks/abc220_a)ですと

> A以上B以下であるようなCの倍数を、1つ出力してください。
> 条件を満たす数が存在しない場合は-1を出力してください。

というものです（実際には制約条件や入力例などがあります）。

この問題に対してコードを書いて提出します。下記みたいな。

```
A, B, C = map(int, input().split())
Y = C * (B // C)

if A <= Y:
    print(Y)
else:
    print(-1)
```

そして、あらかじめ用意されたテストケースが複数あり、そのテストケース毎に判定が自動で行われ結果が出ます。

- **AC** / 正答
- **WA** / 論理エラー
- **TLE** / 実行時間制限超過
- **RE** / Runtime Error
- **CE** / コンパイルエラー

全テストケースについてACの場合のみ、その問題に対してACとなるのですが、このACになった瞬間が本当に最高に快感なんですよね。
コンテスト中、悩みながら書いたコードが一発でACになったときは、声上げそうになります（多分、上げてる）。

たとえ解けないとしても、その解説を見て「なるほど、こうやれば解けるのかー」と感動するのも楽しいです。
人間は情報を栄養として食い繋ぐ生き物だと実感する日々。

私がAtCoderを続けた一番の理由は、正直、この楽しさでした。

業務でコードを書く機会がかなり減ったため、こういったサービスの存在は本当にありがたく思っています。
やっぱりコードを書くのって楽しい。

## プログラミングに対して継続力のある人たちの集まり

AtCoderのコンテストの多くは土曜か日曜の夜9時から開催されていて、時間は100分です。

つまり、結果を出すためには、何回も何十回も土曜や日曜の夜を約2時間、AtCoderに費やす必要があるわけです。

本人はただ楽しいから取り組んでいるだけかもしれないですし、苦労しているかどうかはともかくとして、AtCoderで結果を出している人というのはプログラミングに対しての継続力がある人と言えるとは思います。

もちろん、AtCoderで結果を出していない人がプログラミングに対して継続力がないと言うつもりはないです。
土曜や日曜の夜を頻繁に空けることが難しい人というのは、たくさんいるでしょうから。むしろ空けられる方が珍しいかもしれないですね。  
仮に空けられたとしても、集中できる状況でないと厳しいですし。

## 数学から離れて久しいとちょい辛い

少なくとも私は緑になるために（パフォーマンス800以上をコンスタントに出せるために）高度な数学の知識が必須とは思いませんでした。
問題や解説にΣやlogが普通に登場するので高校までの数学は前提なのでしょうが、深い理解までは求められなかった印象です。

ただ、難しい数学知識が求められてはいないものの、解くのになかなか苦戦します。

私は大学を卒業してからすでに20年以上経っています。
社会人になってから数学をまったく使わずにきたわけではないものの、日常的に触れるわけでもない日々でした。
たとえば学生時代ならぱっと思い浮かんだ数式が、20年以上のブランクを経るとなかなか思い出せないわけなのです。**最小公倍数**、**組合せ**、**順列**などなど、学生時代と比べると記憶から引っ張り出すのに時間がかかるのです。

AtCoderはスピード勝負の世界です。
回答時間が順位決定に大きな影響を及ぼします。
このブランクを取り戻すのはなかなか厳しいなと思うことが多かったです。

**「それはブランクのせいじゃなくて年齢のせいじゃないの？」**
 と自問したくなるときもありますが、しない。


## 環境が大事

コードの提出はAtCoderのサイトで行うので、極論としては手元にコードを動かす環境がなくてもやれはするのでしょうが、サイトの入力フォームに文法チェック機能がついているわけではないですし、間違えるとペナルティが課されますし、手元での環境構築は必須と言っていいかと思います。

そして、コンテストに参加する場合は時間との戦いなので、環境依存はかなり大きいと感じます。要はできる限りスピーディーにコードを書ける環境をいかに用意できるかですね。  

これも[ルール](https://atcoder.jp/contests/APG4b/rules)に書かれているのですが

- 自作ライブラリの使用
- インターネットでの検索

は許可されています。  

具体的な環境については言語諸々に依存しますし、いくらでもインターネット上に情報があるので、ここでは言及しません。

## 想像していたレベル感とずれていた

AtCoderを始めたとき、緑まではやろうと思っていました。

理由としては前述した[高橋社長のブログ記事](https://chokudai.hatenablog.com/entry/2019/02/11/155904)で「**緑あれば大抵の企業でアルゴリズム力は十分。AtCoder的には決して上位ではないが、他社評価サイトなら最高評価。**」と書かれていたので、一つの目安かなと（ざっくりイメージなので、できれば高橋社長のブログをお読みください）。

緑色は上位30%です。
つまり全体の1/3よりちょい上。

実際コンテストに参加してみると、自分自身を買い被っていただけかしれないですが、想像していたより到達のための努力が必要でした。

しかし、冷静に考えてみると

- AtCoderのコンテストに参加しようという程度にはプログラミングの経験がある。
- 前述のとおり、継続も誰でもできるわけではない。土日の夜をプログラミングに費やしている。

という母集団であるわけなのですよね。
それを考えると、そもそもの私の想像が間違っていたのだなと。
プライベートな時間をわざわざプログラミングコンテストに捧げている人たちの中での順位付けですから。

## 経験値が結果に直結する

努力が結果に直結すると思いました。
だからこそ面白いですし、だからこそ結果が簡単には出ない。
高Ratingな人たちは**かなりの努力をした人たち**だと本当に思います。

## 競プロのための身だしなみ

昔よりもこまめに爪を切るようになりました。
スピードを競っている状況だと、キーボードを打つときに爪が気になるため。

## どういう人に薦めたいサービス？

たとえば「**どういう人に[リングフィットアドベンチャー](https://www.nintendo.co.jp/ring/)を薦めたいですか？**」と聞かれたなら「**運動不足な人**」とか「**筋肉をつけたい人**」とか「**新垣結衣さんを好きな人**」とか、まあ、答えはいくつか思い浮かぶわけなんですが、リングフィットアドベンチャーは万人における運動不足解消の最善策でも筋肉をつけるための最善策でも新垣結衣さんを応援するための最善策でもないですよね。だから正直、答えを口にしづらい。

「**どういう人にAtCoderを薦めたいですか？**」と聞かれたなら、リングフィットアドベンチャーと同じで、明確な答えが思い浮かばないんですよね。
「**薦められてやるもの**」というよりは「**やりたいからやるもの**」というイメージです。

なぜ唐突にリングフィットアドベンチャーの話を持ち出したかと言うと、AtCoderと同じく、ここしばらくやり続けてきたゲームだからです。  
深い意味はないです。

## 最後に宣伝

- [Supershipグループ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/supership)を明日以降もよろしくお願いいたします！
- [Super Stories](https://super-stories.com/)というオープン社内報やっていますので読んでくださると嬉しいです！
- エンジニアは積極採用中ですので、興味があれば[弊社採用情報ページ](https://supership.jp/recruit/)を訪れてやってください！