413
108

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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が全然解けない」という人がいたら、それは多分、あなただけではない。

少なくとも私がそうだからだ。

もし良い記事と思ったら、いいねストックフォローお願いします🙇

おすすめ記事

413
108
14

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
413
108

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?