AtCoderが、全くできない。
誇張ではない。
A問題で手が止まり、B問題で制約を読み間違え、C問題は最初から見ない。
コンテストが終わったあと、タイムラインに流れてくる「初参加でCまで解けました」とかいう報告を眺めながら、静かにブラウザを閉じる。
一方で私は何をしているかというと、
- 仕事ではGoやらRustやらを書いている
- TypeScriptでバックエンドやフロントエンドも書いている
- API設計もするし、コードレビューもする
- プログラミングで普通に給料をもらっている
いわゆる「業務ではコードを書いている人間」ではある。
それでもAtCoderは、全くできない。
先に断っておくこと
先に断っておくと、この記事はAtCoderや競技プログラミングを否定したい話ではない。
限られた時間で問題を読み、解法を見抜き、ミスなく実装しきる能力は、普通に考えてかなり高度だと思っているし、実際にできている人は素直にすごいと思う。
この記事は、「なぜ自分はそれができないのか」
を整理するための、ほぼ自己分析である。
結論:私は競技プログラミングができない
最初に結論を書く。
私はプログラミングができないのではなく、競技プログラミングができない。
この2つは似ているようで、実際にはかなり別物だ。
AtCoderは「アルゴリズムを思い出すゲーム」
AtCoderの問題を見て、毎回こう思う。
で、これは何を思い出せばいい問題なんだ?
業務でのプログラミングは、
- 要件を読む
- 仕様を整理する
- 必要なら調べる
- 試行錯誤しながら実装する
という流れが基本になる。
一方AtCoderは、
- 問題を読む
- 制約を見る
- 「あ、これは〇〇法だ」と気づく
- 実装する
という世界だ。
もちろん、これは「暗記ゲーだから簡単」という意味ではない。
むしろ逆で、大量の典型を理解したうえで、瞬時に引き出せること自体が一つの専門技能だと思っている。
ただ、私はその訓練をほぼしてこなかった。
業務で書くコードとAtCoderのコードは方向性が真逆
業務では、だいたいこんなことを言われる。
- 可読性が大事
- 保守性が大事
- 変数名はちゃんとつけろ
- 意味のある単位で関数を切れ
AtCoderのコードはどうか。
- 変数名は
i,j,k - 関数は
mainだけ - コメントはない
- とにかくACすれば正義
私はAtCoderでコードを書いていて、
これ、あとで読めないな……
と考えてしまう。
しかし「あとで」は来ない。来る前にTLEかWAで終わる。
制約条件を見ても、何もひらめかない
AtCoderの問題には、だいたいこう書いてある。
1 ≤ N ≤ 2×10^5
競プロができる人は、これを見てすぐに
- O(N log N) まで
- これは全探索は無理
と判断する。(のだと思う)
私はというと、
- 「2×10^5か……多いな……」
で思考が止まる。
業務では、
- 遅かったら直す
- キャッシュする
- そもそもそんな入力は来ない
で済んできた。
制約を見た瞬間に戦略を立てる訓練を、私はしていない。
実装スピードが足りない
業務では、コードは丁寧に書く。
- テストを書く
- ログを入れる
- エラーハンドリングを考える
AtCoderでは、そんなことをしている余裕はない。
特にGo。
- 標準入力が地味に面倒
-
bufio.NewReaderを毎回思い出す - 型変換で一瞬止まる
気づくと30分経っていて、問題はほぼ進んでいない。
AtCoderはスポーツに近い
最近思う。
AtCoderは、かなりスポーツに近い。
- 知識
- 反射神経
- パターン認識
- 制限時間内の判断力
これらを日常的に鍛えている人が強い。
私は何を鍛えてきたかというと、
- 設計を考える
- 仕様を詰める
- 将来の変更を想定する
- 人のコードを読む
使っている筋肉が違う。
だから、AtCoderが安定して解ける人を見ると、普通に「すごいな」と思っている。
自分にはない訓練を積んでいて、自分にはない判断力を持っている。
じゃあAtCoderができない私はダメなのか
別にダメではない、と思いたい。
- AtCoderが強い = 良いプロダクトが作れる、ではない
- AtCoderが弱い = 仕事ができない、でもない
ただし、
- アルゴリズムの引き出しが少ない
- 計算量への感覚が鈍い
という事実はある。
それを自覚したうえで、
- 競技プログラミングを頑張るのか
- 業務特化で生きるのか
選べばいいだけだと思っている。
まとめ
- 私はAtCoderが全くできない
- それでも毎日プログラミングをしている
- 競技プログラミングと業務プログラミングは、求められる能力が違う
- できない理由が分かると、少し気が楽になる
同じように、「仕事ではコードを書いているのに、AtCoderが全然解けない」という人がいたら、それは多分、あなただけではない。
少なくとも私がそうだからだ。
もし良い記事と思ったら、いいね、ストック、フォローお願いします🙇
おすすめ記事