競技プログラミング、ソフトウェア・エンジニア、コミュニティ

Dai MIKURUBE
16 min readApr 4, 2021

なんか言及もされたのでアンサー的に書いてみたけど、アンサーには大してなってないな? ってやつです。一部で言及された、競技プログラミング (競プロ) 関係の話。

その前に、「プログラミングの競技」って

いろいろあります。

  • 短時間で問題に解答していく型 (ICPC / 情報オリンピック / AtCoder Regular / TopCoder とか)
  • 最適解が容易に求まらない問題のスコアを競う型 (SuperCon / AtCoder Heuristic / ISUCON / ゴルフ / ICFP Programming Contest の一部とか)
  • 対戦型 (ICFP Programming Contest の一部とか、最近のはあんまり知らないですが RoboCode / Imagine Cup とか)
  • 謎解き型 (ICFP Programming Contest で何回かありましたね。 UMIX は楽しかった)
  • 芸術鑑賞型 (?) (IOCCCとか)

とまあ、いろいろあるんですが、「競技プログラミング」と、特に略して「競プロ」と呼ぶ場合は、主に最初の短時間問題解答型を指す使い方が多いような気がします。これは AtCoder Regular の影響かな。

この使い方ばかりを広げることはあまり本意ではない (そこに対して影響が大きかったであろう AtCoder 的にもそれは本意ではないっぽい) のですが、言及元記事がそうっぽかったのもあって、本記事では主にこれを指して競プロと呼んでいます。 (が、他のタイプのものもおもしろいですよ)

で、お前誰よ?

もうはるか昔の 2000 〜 2004 年ごろに ICPC (大学生向けの国際プログラミング・コンテスト) に参加してました、三廻部と言います。当時は ACM-ICPC って言ったんですが、最近は ACM 付けないんですってね、という程度には過去の人です。当時はまだ「競技プログラミング」という呼び名はありませんでした。 (私のコンテスト以外の話は前に書いたへんでも)

当時の戦績としては、いちおう二度ほど World Finals に進んで、いちおう Honorable Mention にはならなかったけど、メダルは取れなかったね、といったあたり。 (21位タイ @ 2003 Beverly Hills & 27位タイ @ 2004 Prague)

その後 ICFP Programming Contest にこそ数回参加したけど、自分が競技者として「競プロ」に参加したことは多くないです。流行りの AtCoder も、アカウントはあるけどちゃんと参加したことはなく。

ただ ICPC の「World Finals は二回まで」ルールにより少し早めの引退だったので、修士課程の間 (2004年) に「(ACM-)ICPC OB/OGの会」という会の立ち上げに加わり、合宿や練習会を開いて選手の人たちの練習・交流の機会を作る、ということをしばらくやっていました。 (もう退いています)

情報オリンピックへの日本からの参加が本格的に復活した 2007 年の春合宿に呼んでいただいて、チューター・講師として DP の話とかをしたりもしました。

あとは ICPC 本番の裏方にちょっと入ったりもしましたね。いつだったかの東京大会のパーティーで、ビンゴの司会おじさんをやっていたのは私 (ともう一人) です。 (裏方方面はご無沙汰しております。近い世代の皆さまが今もがんばっている様子をうかがっております)

総じて選手時代よりも引退後の活動のほうが、今でも自分の記憶に残っていますね。他の参加者から私を見たときの印象も、そちらの方が残っているかも。

現在は Treasure Data 社でソフトウェア・エンジニアとして働いています。外から見えるものとしては Embulk という OSS のメンテナをやっています。

コミュニティ

そんなわけで (当時はその呼び名ではなかったけど) 競プロについて、私は競技そのものから得たこともあったけど、コミュニティとして関わったこと、その中で得たことが大きかったなー、と感じています。参加していた方々も、そこから多くを得てくれていたらいいな、と今も振り返って思っています。

特に初期の OB/OG の会の参加者の皆さんは大学を超えて広く意気投合してその後も交流を続け、大きな成果を出しています。例えば GNC の西川さんや combat の(故)村主さん・田中さんは、未踏ソフトウェア創造事業でのつながりとも合流して Preferred Infrastructure (PFI) を立ち上げました。 (後のPFNレトリバ)

あと最初 (2004年) の OB/OG の会の夏合宿に参加してた当時の一年生で、なかなかに生意気げな…じゃなかった、元気のいい若者がいるなあ、と思っていたら、彼は次年度以降 ICPC には参加しなくなったものの、後に PFI に合流しました。さらにその後、私が今働いている Treasure Data の創業者になりました (笑)

情報オリンピックでチューターをやった当時の参加者たち (当時主に高校生) も、多くが大学に入ると ICPC (や練習会等) に参加し、交流を続けながらその後アカデミアに行ったり Google に行ったり、そこから PFI/PFN に行ったりして大活躍しています。

AtCoder の chokudai さんも学生のときに ICPC に参加して、引退後はコンテスト放送の MC 的なことをやってくれていたりしましたね。

私自身も、このコミュニティの立ち上げに一から関わった経験や、このコミュニティにいたこと自体に助けられたことが、数多くあります。

当時は運営などに苦労したこともあれこれありましたし、こっちばっかやっていたら (いやそれだけが理由じゃないけど) 修士留年したりもしましたが、あれはいいコミュニティだったなあと思いますし、今もそれが続いているんじゃないかなあと思っています。

競技そのものから得たもの

翻って、競技そのものから得たもの (特にソフトウェア・エンジニア業務で役に立っているもの) っていう話もいちおうしておくと、よく言われるものも含め、こんな感じかなあ、と思います。

  1. 力技でも一定のコードを書ききる基礎体力がついた
  2. 単純めのコードなら無思考で書けるようになった
  3. 人に読んでもらいやすいコードの書き方が染みついた
  4. 人のコードを読み解いてデバッグする勘所が身についた
  5. 空間・時間計算量が身体的感覚として身についた (とはいえこれは時代に合わせて更新が必要)

3 については「競プロは逆では?」と思う方もいるかもしれません。ここには ICPC 特有のからくりがあります。 ICPC というやつは「3人1チームで端末 (キーボード) 1台」というルールで、そのため、自分のコードが通らないときに人に見てもらう、逆に人のコードを読み解く、またはペア・プログラミング的なことをする機会が多いんですね。 (まあ long upo; double upopo; みたいなコードを書く人もいましたが…w)

このルールは競技性を微妙なものにしている面も若干あるんですが、教育的にはなかなかよくできていたんではないかなあ、と思っています。学生向けのコンテストですしね。

私個人について言えばこの形式が性に合っていたようで、逆に一人参加のコンテストはいまいち盛り上がれなかったりします。私が AtCoder とかにあまり参加してない理由も一部はそれかなあ。

chokudai さんは競技性を追求したくて ICPC ルールはあまり好みじゃない、みたいなことをどっかで言ってた気もするし、そもそもこのルールはオフラインでしかできないので難しい気がするけど、人が集まれるようになったら、いつか大人向けのn人1端末コンテストやってほしいなー、とかこっそり思ってたりします。 (もしそうなったらちょっと訓練しよう…)

閑話休題。

それぞれの立場の人へ向けて

新たにソフトウェア・エンジニアを生業としたい方へ

まず、かの記事でも AtCoder でも chokudai さん個人も言われていることですが、競プロで求められる能力と、ソフトウェア・エンジニアの業務で求められる能力には、重なる部分こそゼロではありませんが、大きく方向性の違いがあります。「ゼロから競プロ “さえ” 続けていればソフトウェア・エンジニアとして採用される・仕事をするのに必要な能力をカバーできる」ことはまずない、と思ってください。

ソフトウェア・エンジニアは、大学で Computer Science を専攻していなくても就くことができる、懐の深い職種ではあります。しかしそれでも Computer Science の基礎は大事です。例えば新しい道具の使い方を身につけるにしたって、未知の道具をただ試行錯誤で身につけるのと、その背景にある理論を知った人が身につけるのとでは、学習効率にも問題解決の効率にもすぐに差が出ます。 Computer Science を専攻していなかった人が、職に就く前にすべてを押さえておかなければならないことはありませんが、その習得を、少なくとも始めてはおいたほうがいいでしょう。

そして、よき師となる人や、よい仲間を見つけましょう。見つかる場所は、競プロのつながりからよいコミュニティとして発展することもあるかもしれませんし、「〜の会」のような既存の形あるコミュニティへの参加かもしれません。もしかしたら Twitter での個人的な出会いかもしれませんし、大学やプログラミングスクールの友人かもしれません。興味のある OSS のユーザー同士で生まれるつながりもあるでしょう。

さらにできれば、異なる視点を持っていそうな、複数のコミュニティと関わりましょう。見聞きすることに偏りがあると、それが普通のことのように、どうしても錯誤してしまいます。競プロの周辺でも「競プロさえやっていればエンジニアの仕事もOK!」と思わせてしまうような界隈は残念ながら一部にあるみたいですし、プログラミングスクールも一部に偏ったものがあるようです。できるだけいろいろな視点の話を見聞きして、「これは違うのかも…?」と疑問を持てるようにしておきましょう。

たとえば、私はプログラミング・シンポジウムという学術寄りのコミュニティにも参加しているのですが、そこに長く参加している先生の中には ICPC 嫌いの方もいらっしゃいます。しかしその先生との議論は実りあるものでもありました。 (ちなみに、そこには逆に ICPC の運営や審判団をしている先生も何人かいらっしゃいます)

ソフトウェア・エンジニア職と競プロ

ソフトウェア・エンジニア職と競技プログラミングの関係は、例えば (昔の) 軍師や軍の作戦部といった職と将棋の関係のようなものではないかと思います。

優れた軍師や作戦担当者の中には、嗜みとして将棋をやる人もそれなりにいたでしょうし、そこから一定の学びを得る人もいたかもしれません。しかしそれがすべてではないし、例えば「私は将棋でこれだけの戦績を残している。貴軍で作戦担当として雇ってほしい」とか言ってくる人がいたら「ん? どういうこと?」となります。雇う側の中には「なにやら将棋をやるやつの中には軍師として優れたやつが割といるらしいぞ」と聞いたら、将棋に一定の注目をする人たちもいるかもしれませんが。

一方の将棋は、軍と軍の戦いをモデルにしたものではありますが、それが役に立つとか、役立つ能力が身につくとか以前に、単体で頭脳スポーツとしての奥深さがあり、現代でも多くの人を惹きつけています。賞金付きの大会も開かれ、初級者から実力者まで、多くの人が楽しんでいます。そしてそこですごい成績を持つ人は、単にそれだけで敬意の対象になっています。もちろん中には、将棋で身についた集中力や思考力を他に活かしている人もいるかもしれませんし、そういう人と仕事をしたいと思う人たちもいるかもしれません。

まあ、そのくらいの関係性です。

逆に、競プロに興味のないソフトウェア・エンジニアの方も、この程度に思っておいてくれればいいのではないでしょうか。仕事で即役立つというようなものでもありませんが、目くじらを立てて敵視するような話でもないですよ。そして、けっこう楽しいですよ。

ごくまれに直接的に役立つと「これ進○ゼミでやったやつだ!」みたいな気持ちになれます。 (基盤系のソフトウェアやミドルウェアを開発していると、たまーにそういうこともあります)

ソフトウェア・エンジニアとして能力を伸ばしたい方へ

先に挙げたとおり、競プロで得られるものの中に、ソフトウェア・エンジニアの業務で活きるものもあるにはあります。 (とはいえ、チーム戦でこそ身についたものも多い)

ソフトウェア・エンジニアとして仕事を続けるなら、やはり根底にあるのは Computer Science の基礎を学ぶこと・学び続けること、そして様々な人と関わること、だと思います。

一定の能力がつき、ソフトウェア・エンジニアとして職に就いた方なら、コミュニティとの関わり方にも選択肢が増えていることでしょう。引き続きの競プロでも、解説したり問題を作ったりする側に回れるかもしれません。業務で使っているソフトウェアの解説記事を書けたりするかもしれませんし、使っている OSS に直接貢献することもできるようになっているかもしれません。自分でソフトウェアを作って OSS として公開できるようになっているかもしれません。経験を積んだあとの視点で大学 (院) で学び直す、という方向性もあるかもしれません。

いろいろな道があります。その関わりの中で、新しいことを知ったり、さらに新しいつながりができたり、もしかしたら新しい仕事に出会うこともあるかもしれません。競プロもその道の一つですし、それ以外の道もある、ということを頭の片隅に置いておきましょう。

競技プログラミングを楽しんでいる方へ

楽しんで!

という一言に尽きますが、その中でいろいろな人と関わっていくと、より楽しいんじゃないかな、というのは個人的な思いです。

職種としてのソフトウェア・エンジニアじゃないけど、という方へ

プログラミングの技能が活きるのは、ソフトウェア・エンジニア職に限ったことではありません。例えば、営業で、カスタマーサポートで、バックオフィスで、プログラミングスキルをちょっと活かす、というのも、いい応用になるでしょう。

直接的に活き、かつ典型的なのは、学術・研究職でしょうか。競プロ周辺でその道に進んだ人も数多くいます。前述の、私がチューターをやった回の情報オリンピック参加者の一人が、現 PFN の秋葉さん (当時高校生) でした。競プロ周りでは有名人ですね。

彼もまた元気のいい若者だなー、と当時思っていたら、あれよあれよと国立情報学研究所の研究者として、ゴリゴリと新しい成果を世に出していました。それは今の PFN でも変わらないようで、いやはや、すごいやつにチューターなんてやったもんだなー、と今でも思うものです。

アカデミアで彼が出したグラフ関係のアルゴリズムの成果の中でも、一部は競プロの問題の検討からの発展に端を発していた、なんてことを聞いたような気もします。学術×競プロというコミュニティの掛け合わせ (?) で、こういう関わりもあるんですね、という、いい例かもしれません。

(まあ、掛け合わせも何も、情報オリンピックも ICPC も運営に関わっているのは主に学術系の方々ですが…)

競技プログラミング界隈からソフトウェア・エンジニアを雇うことを検討している企業の方へ

前述したとおり、競技プログラミングの腕と、ソフトウェア・エンジニアという業務の腕は、完全に重なるものではありません。競プロコミュニティに優秀な人が一定数いるのは確かですが、自分たちがどういう人を採用したいのか、というビジョンを、前もってできるだけはっきりさせておくことをおすすめします。

(このあたりは AtCoder なら chokudai さんがちゃんと話されているものと思いますが)

事業としての競技プログラミングの運営について

ここは自然とほぼ AtCoder の話になりますが。

まず AtCoder 運営と経営、お疲れさまです。

私なんかも選手や裏方だった時代に「誰かこういうのやってくんないかなー」みたいなことを他力本願で言っていた身なので、それを本当に実現し、今でも何年も運営を続けていることに、驚嘆と称賛、感謝を今でも持っています。

事業としてやる以上はお金を稼がねばならず、競プロとソフトウェア・エンジニア職の技術のギャップの間で、「第一には娯楽と競技の場だ」という運営方針と、そこでリクルーティングからマネタイズすることとのギャップと戦い続けるのは大変だと思います。そこはぜひ誠意を持って、そのギャップを正しく紹介していくことにも、そのギャップを埋めていくことにも、エネルギーとリソースを割いていっていただけたら、と思っています。

AtCoder が、コミュニティとしての競プロを代表する企業の一つなのは間違いないと思いますので、そのコミュニティの健全な維持と発展に寄与されることを期待しています。

応援しております。

「良きコミュニティ」

ここまでほとんどの話を (かなり強引だったところもありますが) 「コミュニティ」というところにつなげてきました。かの記事と結びは同じ言葉になりますが、いろんな人と、多くの人と話しましょう。

ただし、誠意を持って。

コミュニティは競プロだけではありません。「〜の会」のような具体的な形を持つものでもないかもしれません。企業の開発チームかもしれませんし、ある OSS の開発者チームかもしれません。ユーザー会かもしれません。大学やスクールの特定の友人の集まりもそうでしょう。

どんなコミュニティであれ、あなた自身と、あなたが他の人とおこなうコミュニケーションそれ自体が「コミュニティ」の一部であり、常にそのコミュニティを形作り続けているのだ、ということを忘れないようにしましょう。そのコミュニティを「良きコミュニティ」たらしめ続けるのは、常にあなた自身です。

そして、そのコミュニティで「それは違うんじゃないか」と思うことがあるのなら、そのコミュニティを「終わらせる」とか言うのではなく、誠意を持って、それを皆にフィードバックしましょう。

フィードバックするほどの価値を感じない、またはフィードバックしても話が通じないというのであれば、言い換えればそのコミュニティにもう誠意を持てなくなったのであれば、静かにそこを離れましょう。それは、単に「そこはもうあなたの場所ではない」ということです。そこはあなたの場所ではなく、もう彼らの場所です。彼らがあなたに (離れても) 害をなすというのでもない限り、あなたはもう、そこに口を出す立場ではありません。

そう思うということは、逆にあなたにはおそらく新しい場がもうあるのでしょう。そちらで未来に向かって活躍を続ければいいのです。 (念のため、ハラスメントの訴え、みたいなことはその限りではないと思います)

誠意を持ってコミュニケーションを取っているならば、あなたはそこから多くのものを得て、逆に多くのものを提供することもできるでしょう。

競プロの周辺にも、様々なコミュニティがあると思います。 AtCoder 自体も一つの大きなコミュニティでしょうし、その参加者の一部がコミュニティになっていることもあるでしょう。そこにはそれぞれ、いろいろな人がいます。

私自身は競技者でなくなって久しいですが、競技プログラミングに関わる多くのコミュニティが、良きコミュニティであらんことを願います。

--

--