競技プログラミングとエンジョイと誠実さ

13 min read読了の目安(約11700字

※noteにも同じ記事がありますが、Zennの方がユーザ層とあっているかも?と思い書き直しています。
末尾に重要な追記があるので、追記をよんでください〜

はじめに

競技プログラミング界隈で、"怪文書"が流行っています。
この文書の誤読がリトマス試験紙になる...
正しいけど絶望的な状況について、なんだろう、感情を揺り動かされてしまい、その状況をもう少しお互いにわかるようにするための「解説」をするためのものです。とにかく"誤読"というか、相互で見えない立場が気になってしまった。それに尽きます。
はじめに、どういうスタンスで自分がこの記事を書いているか?という事を示しておきます。

chokudai氏は、頂上じゃないところにも価値があるという事をきちんと思っていて、「(当人を含めて)化け物は化け物と割り切って、それでもエンジョイできる事に意味がある」という考えと思うので、その点においては、私は彼の考え方を支持する。支持したい。(もし違ったらすみません、、、)

でも一方で、才能をどう使うべきかという点においてはカピバラ氏の言うことが正しいとも思う。ごく一部を見た時に、競プロによるスポイル的な事を感じるのは間違いではないと思う。(終了、滅殺すべきという程かはわからないけど、、、)

また、頂上以外のことを一旦保留するとしたら、KOHSUKE氏の言うように一つの頂だけを唯一の頂上とは思わない方が良いと思う。ただし、じゃあ頂に居ない人はどうなるの、と私は思う。あるいは、頂上に居たくない人に対して、頂上に居るものとして扱ったり、それを期待することで、逆にプレッシャーをかけてしまうという事もある。(私はそれで沢山失敗しました、、、)

それぞれの記事とリンク

それぞれの記事へのリンクは以下です。

https://nuc.hatenadiary.org/entry/2021/03/31

https://chokudai.hatenablog.com/entry/2021/04/01/115755

https://ja.kohsuke.org/ソフトウェア開発/優秀さについて/

誠実さが嫌味に見えること

まず、私が思うに、"件の怪文書記事から読み取るには"カピバラ氏は非常に誠実な人です。そんなこと無いのでは?と思う人も居るかも知れませんが、簡単に説明します。

  • 彼は天然物と言われる才能や真の学問に囲まれて育った
  • 必ずしも天然物ではなくてもエンジニアとして通用する=人間の理性が素質・天与の物を部分的には凌駕する、あるいは神に対して"一撃"を加えられる事を示したい
  • そのために"ハック"、例えばGoogleに入るのは簡単で実際に再現性もある事なので、遊びを兼ねつつ模擬面接を行っている(簡単というのは、彼の尺度において)
  • その取組の中で、複数の才能のある人が、必ずしも業務的に成果を残すこととは結びつかない別種のハックないし娯楽である「競技プログラミング」に浸かりすぎたように見えた(全く不要とは言っていないし、一定の効果も認めるものの、行き過ぎということ)
  • この事例を見た時に、才能や時間のスポイルという事を強く感じた
  • そのいくつかの具体的な事例については、軌道修正をしたら"上手くいった"が、逆にその成功を語ったことが呼び水になって、競技プログラミングが一層就職ハックの側面で強調される事になった...実態と乖離しているにも関わらず
  • この「競技プログラミング」によるスポイルについて苦々しく思っている上に、大学の頃の自分達が当初の在り方に影響を与えたであろうという事実を振り返って考えると、その事について大きな責任を感じた

→真摯な反省に基づいて、以下の言葉が生まれる:
我々の目的の一つは、我々が始めてしまった競技プログラミングを我々が終わらせることです。

いかがでしょう、これ、私は物凄く誠実だと思うんですよ。人間がいかに後天的に変わるかという事、いわゆる理性というものをある種信仰していて、理性によって世界が変わるという事を示したいと思う中で、その障壁になる要素を見出した時、自分の過去の行いと結びつけて「他の良いやり方がある」という事について真摯に反省をして、目眩を覚えるような感覚の中で是正を促そうとする。
偏執的ではあるかもしれませんが、誠実な事だと思います。
(そもそも、自分の行動についての信条とか思想に関して、突き詰めて考えて目眩を覚える人って、どれぐらい居るものですかね?)

一方で、どこまでを意図したものかは不明ですが、その繋がりが読みにくいようにも書かれています。
例えば、東大の女学生のくだりや神学のくだり、学問のくだりというのは、誠実さを示すための一つの記述ですが、なぜこれを書いているのか・ここにそれを入れ込む意味はなにかという事をニュートラルに考えないと、正しく理解することができません。言い換えると、この部分については、ただただ筆者の知識や経験を並べて「常識の無い人」との差を示そうとしているだけのようにも読むことができるという事です。
先程引用した文言はかなり刺激的なので、その文言や前評判によって変な先入観を持つと、そうした意図を読む事ができなくなります。
この文章の中に「人は思い込んだら説得が効かないようにできているのだと私は思ってます。」とまで書いてあるのは皮肉なことで、この文章の本意を誤読するという事自体が、そもそもまともな専門家・常識から隔絶した環境にあるんだよ、という事をメタ的に示すような文章になっているわけです。そうすると、たしかに嫌味のように読める部分はあり、また「これだから上位男子校ホモーソーシャルセクターは...」みたいな事にもなるのですが、「これを嫌味として読むという時点で、まさに長々と説明されている常識のない人に該当する」という構造によって、優秀なリトマス試験紙として機能してしまう部分があるわけです。

きびしい。
※このような構造の文書であるという事もあって、公開前、筆者の周りの沢山の人に意見を求めたという事でもあるのでしょう。

浸かりすぎ、を自分の言葉で表現する

ここでいう「浸かりすぎ」という事について、端的に私自身の言葉で表現すると、「学校で学問ではなくて受験対策だけをして、かつ受験対策がゴールであると思いこむこと」みたいなものです。
例えば、2000年代前半、競技プログラミング(またはその原型)が流行った界隈では、競技プログラミングはあくまでもゲームであって、学問と共通する部分はあれど、学問や教養そのものではないという事への認知があり、それだけを過剰にすればよいという事はありませんでした。
この事については、少し表現の違いはあっても、chokudai氏含め問題意識がそれなりに共有されているように思います。
ただ、ここで敢えて私が自分の言葉でこれを表現したのは、「単純な娯楽にハマりすぎる」という事以上に問題と思われる部分がなにか、を端的に示す為でした。私が感じるのは、まさに加熱した受験対策みたいな事と同じようなことです。受験勉強にもある種のゲーム的な側面はあって、道を間違えるとそれ自体を目的化してしまいますが、本来はその先を見据えての受験勉強であると思います。しかし、クイズ王みたいなものが流行する風潮を見ると、ちょっと受験勉強ハックによって違う方向に物事が進んでいるのでは、と感じる部分があります。(クイズ王が必ずしも悪いものだと思ってはいないですが、まあ違和感があるということで)
その意味で、本質的に競技プログラミングをゲーム化・目的化することそのものへの懐疑も少し存在していると思い、この部分の問題は本当はもう少し根深いのではないかなと感じています。
まあ、とはいえ、ざっくりとしたレベルでは皆同じような事を考えているとは思うので、一旦これぐらいにしておきます。
【追記】...一旦これぐらいにしておいたものの、やはりここが致命的になっているように思ったので、記事の最後に追記します。

常識がなければどうすれば良いのか・どう"しても"良いのか

この怪文書は、常識が無い人については直接的に触れることはせず、あたかも透明人間であるかのように扱っているように見えるところがあります。存在には触れていますし、先に説明したリトマス試験紙としての文章構造の通り「読み手としては常識が無い人が含まれる」という事も折込済になっていますが、まともな人間として扱われていないように見えるという事です。
常識がない事への対策としての答えは単純で、常識のある沢山の人と話をする事です。しかし、単純でも簡単ではないので、結局どうすればよいのだろうね、みたいな事は残ります。実際、常識のない人がそれでも独学をしないといけないと思う場面はそれなりにあって、それによって独学大全という本が流行っています。独学大全の中でも、本来は専門家同士での話を踏まえて形成される常識が重要であるという事を伝えていて、それでも独学しないといけない人は...という事を述べていました。そのような世界の現実を直視していないのでは、という事です。
(余談...なんとなくですが、カピバラ氏の価値観は独学大全のある意味での反対の位置にあるのかな、という事を思っています。私自身、カピバラ氏の価値観に同意できる部分が少なからずあり、例えば怪文書で述べられていた数学徒の中の数学を学ぶことを理解している学生・理解していない学生みたいな事については、挙げられた比率込みで非常に同意しますし、これまで解説した過適応というか目的化みたいな事についても、少なくとも部分的に同意する事はあります。一方で独学大全の考え方には、漠然とした違和感がありました。今この話を整理していて、こういうことなのかな、と思いながら書き進めています。)
競技プログラミング自体は、単純にそれ自体に面白みのある事で、かつ、彼の求めるレベルでの常識は有しないが、普通の世間的な意味での常識は有するという人が趣味として楽しむ対象でもあるということです。
もっと言うと、彼の求めるレベルの常識/理性を有さずに生きている人の方が圧倒的多数であるというのが世界の現実です。
敢えて、彼の求める常識を持たない人からは反感を買いながらも、意見を届けたい人に対しては正確に意見を届けるという手法は見事ですが、常識や理性がなくても人間は人間です。
本人が非常に誠実に生きて、努力を重ねてきたのであろうという事は怪文書一つでもよく分かるつもりです。しかし、理性の有無で人をぞんざいに扱ってよいのかというと、たとえそれが後天的な要素であったとしても、そういう事ではないと私は思います。

エンジョイ

この世の中には、カピバラ氏のように本当にストイックな人もいますが、そうでない人が大半です。
現在、競技プログラミングに興じる人にも、ストイックな人からエンジョイできればよいという人まで、実に様々です。いま既に多様な人で構成された競技プログラミングの世界に対して、ストイックな人からストイックな人へのメッセージとしての「競技プログラミングを終わらせる」という言葉が仮に正しかったとしても、その他の人も含めた現状への言葉としては適切ではないと思います。
カピバラ氏の"謝罪"は、このあたりでchokudai氏が本質的に何について怒っているのかという事を捉えそこねていて、内容的に斜め上のように思います。
例えば、考えられるものとしては...カピバラ氏の中では「ストイックな人においてもスポイルが発生しているのだから、常識のない人においても当然スポイルが発生する」と思っているのかもしれません。しかし、それは全く自明ではありません。
例えば、現在のAtCoderでいう緑のランクは競技プログラミング的な側面ではG社に入れる(しかし、当然それだけでは入れない)というような事ですが、開始直後にすぐに緑・水色・...とランクアップして、その後橙や赤までいく高校生もいれば、長い期間をかけて緑や水色に到達するプロの開発者まで、様々です。物事を構造的に見抜く事・いわゆる仕事をする事やビジネスの本質を見抜くことに長けていたり、常識を持ち合わせていても、競技プログラミング的な素養の部分は不得意という人も沢山います。
競技プログラミングに興じることは、そのような人に対して、苦手な部分を補強するという効果もありますし、あるいは自分が苦手な事を得意な人が存在するという事を自覚する事によって、よりそれぞれの得意不得意を見極めた戦略を考えないといけない、という自覚を促す手段としても成立し得ます。もちろん、それが競技プログラミングでなければならないという事は無いと思いますが、その一つであってもよいのではないか、という事です。
そうした見識を深め得る趣味の一つとして、エンジョイする対象の一つとして、競技プログラミングは本当に終わらせるべきものなのか?と考えると、私は必ずしもそうではないと思います。
また、単純に自分自身がどういう世界観で生きていきたいか、というような事でいうと、chokudai氏のような世界観なのではないかな、と思います。それぞれの人には、才能や常識も含め到達できるレベルの差がある、でもそれは世界のよくある不条理の一つとして受け入れた上で自分にはできる事をコツコツと進める。もちろん、競技プログラミングは決して万能ではないし、万能であるかのように誤認される事は避けないといけないが、しかしストイックで誠実な人から一方的に終わらせると言われるべき対象でもない。

ただ、逆の見方をすると、カピバラ氏は非常に誠実な立場で、実際にスポイル/過剰ハックのようなことが発生しているという事を真面目に憂いて問題を提起している。競技プログラミングは万能、それだけやってればOK、みたいな勘違いが産まれてしまうと、それはそれで良くないし、もっと言えば、本来の競技プログラミングの魅力はそういう事ではないと思うので。本来ってなんだ、みたいな事はありますが。元々は、単に楽しかった、ですよね?

(この「元々」が唯一無二の競技プログラミングのあり方であるとは当然思っていないですが)

あと、スポーツ的にそれ自体を対象化することも、他のスポーツと同程度には許されると思うので、特化して楽しむという事も、問題のあることではないと思います。(当たり前かもしれませんが、一応)

なんでこんな事を書いているのか

このリトマス試験紙が有効に機能してしまい、表面的な内容への反論(反論になっていない)が噴出する現状が、いろいろな意味で厳しいと思ったからです。
極論すると、「これだから常識のないやつは」みたいな事をまざまざと示す事実になっているというか。そうではなくて、もっとお互いに理解してほしい...という事を、個人的には強く思います。
ただ一方で、個人のレベルで、このぐらいの大きな差のある常識を埋めようとすると、それはそれは労力が必要になるという事は感じています。
でも、できれば、お互い"それなり"にはわかりあえた方がよくないですかね?そうでもないのかな?

余談:「優秀さ」はそうかもしれないのだけど

この話と関連して出てきた「優秀さ」について。
上品な考え方で、ベースの考え方としては同意するのですが、一方で気になることもいくつかありました。あまりそのことへの言及を見かけなかったので、それにも言及してこの記事を終えることにします。

まず、「羽生名人が田舎初段を捻り潰す」ような動きをしているのは、自己顕示などではなくて、ここで述べたように純粋にリソースの使い方としてもったいないからだ、というだけだと思います。実際、理Ⅲから医師になって、おそらくその中でも優秀な部類の人を紹介され、実際にやっていた事がなにか聞いたらこれだけかよ、みたいな事が何度かあったのかなと思います。それを自己顕示と思ってしまうと、ちょっと話が違ってきますし、怪文書に対して違った印象を与えてしまうかなと思います。

また、頂は一つではないという事について。それは全くその通りです。
一方で、頂に到達していない人については、どうすれば良いのか?
この記事でエンジョイというところに書いた内容のうち、頂上まで到達できない人のことです。
それぞれの人には可能性があって、頑張れば何かしらの分野で「何者か」になることはできると思う一方、実際には「何者か」にならない人の方が多数です。頂、何者か、表現は色々とあると思いますが、自分自身とかではなくて、周囲にそういった人がいたときに、どうすれば良いのか?
本筋には同意しますが、一方でこのような点において、この優秀さの価値観にも難しい部分はあります。もしこの優秀さ(後天的になんらかの物事を成すこと)を軸にしてしまえば、おそらく本質的にはカピバラ氏と同じ考え方ですし、結局分野によらず頂に到達しなければ相応の扱いをするみたいな事になります。一方で、頂に到達したいと本心から思っていない人(でも口では頂に到達したいと述べる)を頂に到達するものとして扱うと、それはそれで結局ダメという事を多く経験して、この辺の話は本当に難しいなあと思います。

...という、何の答えにもならない、迷走の過程を記してこの記事は終わりです。とりあえず、それぞれの考え方の相互理解が深まるといいなと思いました。

さらに余談:10年後

終わりにすると言いつつ、書き忘れていたので追記します。
これは揶揄する意図はないのですが、10年後、
我々の目的の一つは、我々が始めてしまったGoogleハックを我々が終わらせることです。
と言ってそうだなと思いました。なんだろう、本当はGoogleハックにはその後に価値を作るという目的があったのに、後から参入した人によって手法だけが流行して、目的なきGoogleハックが流行り、それを終わらせることになるのかな、みたいな事でした。
いたちごっこというか。
難しいですね。

それを解決するためには、やっぱり後進が本質的に理解する事が必要なのではないかと思うのですが、そうすると、常識が異なる集団の理解を拒絶するよりは、常識が異なる集団にあっても理解が生まれるような在り方の方がよいのでは、というように個人的には思いました。
もちろん、そうでなくても良いと思いますが、生きづらいのではないでしょうか。そんなことはないのかな。
生きる世界が違うと言われれば、そうなのかもしれませんが、それもどうなのかな、みたいな。そういうことでした。

追記:結局どういう事象を挙げて終わらせるべきと思ったのか?

少し時間が経ち、さらに本質的でない反論記事が増えているように感じます。
私個人としては、本筋でない部分に反論をしても意味がないと思います。
ここで紹介している怪文書、少なからず優秀な人に影響を与えていることは確かですが、ではその記事を書くに至った実際の事象はどういうものだったのでしょうか?

そして、驚いていたのはコードをプリンターのように上から書いていったことです。これは暗算のようなもので、まともなエディターのない環境や速度が本当に大事なときにやりますが、普通はやる理由がありません。ああ、競技プログラミングの価値観に浸かりすぎたなと思いました。

コードの読み書きができることが救いです。とはいえ、パースなどが絡むと迷うのは理論的バックグラウンドが弱いからでしょうか。

こういう事が、実際に起こっていたのですね。
これは、たった一人の人に起こっていたことですが、しかし書きぶりからすると、実際には少なくとも数人に起こっていたのではないかと推測されるようなことです。本人の記事によると、

AtCoderでは水色になりコードはある程度すらすら書けるようになりました。

という事だったので、「水色に値するレベルのコードを書けるようになった一方で、コードをプリンターのように上から書いていった」という事が実際に発生していた事でした。

実際に業務で書くコードは、どのようなものであるべきか?
という事は、非常に難しい問題であって、携わる業務によってその内容は大きく変わってくるでしょう。
ただ、一般論としては、バグが出にくいコードを書くという事は一つの大きな指標であると思いますし、また他人にとって読みやすいコードを書くという事も一つの大きな指標であると思います。
そのような観点で、「コードをプリンターのように上から書く」ということは、問題を構造化して読み解けるように書き下すということをせず、処理の羅列として"暗算のように"解いたものをそのまま書いているという事を意味します。
私の経験的には、そのようなコードは自分では読みやすいですが、他人にとっては読みにくい事が多いと思います。それは、プログラムを最後まで読まないと全体の構造がわからない場合があるからです。
一方、プログラムの適切な書き方をしている場合には、まずそのプログラムが全体でどういう事をするのかという構造が主たる処理において示され、それをブレイクダウンしていく形で個々の処理の内容が説明され...というようになります。「まず全体像を伝えてから、個々の処理を説明する」というような、人間と人間のコミュニケーションにおいて望まれるような形がコードに現れ、いわば「親切なコード」になります。
私の言葉でいうと、上記のような「親切なコード」を書ける人が、怪文書の中で言う「お茶をする」対象に相当するという事なのですね。そして、頭からすらすらと書く人は、たしかに面白いし才能があるかもしれませんが、「お茶をする」対象には選ばれにくいであろう。ということです。

※恥ずかしい話ですが、私自身は社会人になりたての頃には、このような考え方にはやや懐疑的でした...別に競技プログラミングをやっていた訳ではないですが。これは、実際に仕事としてプログラムを保守したり新しく書いたりする中で学んだことです。(しかし、私が常にそれを実践できているかというと、必ずしもそうでない場合があり、難しいなあと思うのですが)
例えば、他人ではなく自分自身に論点を限ったとしても、自分が書いたコードを目にする瞬間というのは、競技プログラミングであれば常にある程度集中している・漲った状態になるのかもしれませんが、業務においては3年後にクタクタで目をこすりながら見る事になるかもしれません。それを意識できるか、みたいな事もあります。(そのような状況は本来は避けるべきでしょうが、なにかの障害やプロジェクトの遅延があったりして、そうした状況で自分が書いたコードを目にするという瞬間も人生に一度ぐらいはあるのではないかと思います。)

もちろん、競技プログラミングにおいても、いろいろなコードを書く場面があるとは思うのですが、最もスタンダードなタイプの競技においては、例えば一ヶ月かけて1万行のコードを書くということはあまり無いでしょう。しかし、業務においてはそのようなことはしばしばあります。
これが1万行なのか1000行なのか、はたまた10万行なのかというのはモノによるでしょうが、数百行という範囲では収まらないことは確かです。
また、扱う変数の量は、競技よりも多い場合が多々あると思います。
例えば、一般的なGUIで、何かの入力フォームみたいなものを作るとしたら、その項目数が10個20個あるということはザラです。いくつかの量の関係性を見出す分析を行う場合にも、やはり10個20個の変数を扱うということは自然に考えられますし、もっと多くの変数を扱う場面もあると思います。
そのような場面では、プリンターのように書けることは、書けないよりは随分とマシですが、しかし他の書き方を目指すべき、という事になります。

ところで、競技プログラミングは、その性質において、現実の業務よりも書く事に特化した戦略が多いのではないか?という仮説を立てられます。(これが実際に成立するかどうかは研究をしたわけではないのでわかりませんが)
例えば、目先のある一つの問題を解くためであれば、一時的に自分が認識できる変数名でコードを書けばよく、また関数への分割も読みやすさよりはパフォーマンスを意識すべき場面がしばしばあります。このようなとき、書く事と読む事を比較すると、書く事に力点が置かれがちではないかな、と思います。
このようなことが、例えば「G社に入社するかどうか」という問題を超えて、業務ないしものづくりにおいてどのような影響を与えるのか?という事が重要なことです。
例えば競技プログラミングでアルゴリズム力が培われるということ、それ自体はあまり悪い作用はないでしょう。(ハンマーを持った人が、釘を探してしまうというような現象を除けば。)
しかし、実際には競技プログラミングの影響というのはそれだけではなくて、例えば書くコードと読むコードの比重の置き方とか、処理分割の仕方とか、物事の構造的把握とか、そうした事にも大きな影響を与えます。
そのような部分で、業務に悪影響があるか、あるいは悪影響とまでは言わなくても回り道になる事があるよ、というのが具体的かつ本質的な指摘事項なのです。

そのような観点で、例えば、「競技プログラミングにおいても、読みやすいコードについての得点をつけるコンテストがある」とか、「プログラムのアーキテクチャやCyclomatic Complexityみたいなものを得点化して、ある種のメトリックスにおける保守性を競うコンテストがある」とか、あるいは思いつきのデタラメですが「プログラムの一部を意図的にtypo等で壊そうとしたときに、エラーが出るほどロバストであると考えることにして、そのロバスト性のような事を競うコンテスト」というようなことがあれば、直接的な反論にはならないにしても、競技プログラミングの可能性を示す一つの事ではあると思うのです。これは、ある種の論点のすり替えですが、しかし競技プログラミングという手法が必ずしも書く事に特化した影響を与えない、という主張にはなります。
しかし、そういう(ある種の論点ずらしかもしれないが、しかし現在の競技プログラミングの可能性を伝え得る)反論も含めて、上記の本質に直球で答えている内容が、あまりないような気がしています。
そうすると、結局、怪文書が正しかったのだろうか、と思うところもあります。

その辺、真正面から論じられた記事の登場を望んでいます!

※追記の補足...元の記事では、こうしたコードの読みやすさみたいな概念の他にも、単純な基礎的な知識の欠如、みたいな事に言及しています。それを補った本から逆算すれば、どういった事が欠けていたかということはわかりますが、例えば...インターネット経由のWeb APIのコール、イントラ内のRDBアクセス、Redis等へのアクセス、サーバー内の固定記憶IO、メモリのIO。これらの応答は、それぞれオーダーが違うぐらいに変わってきますが、そういう事を理解しているか。その構造や理由を、人間が手を握るまでに発生する反応を医師が説明することと同じレベルで説明できるか。そういうことです。これは私の、水色〜黄色のインターン生たちと触れ合った経験の限りでは、あまり理解していなかった人の方が多かったと思いますが、一方でWeb系での面接では致命傷になる事も十分にあるレベルの話であると思います。(もちろん、レベルによると思いますが。)
また、そもそも、元の記事では学問の本質というところから言及をしているので、私がここで述べているようなことを論点の中心としてしまうと、それはそれで元の記事の主張全体としては矮小化されてしまう部分もあります。ただ、私が述べたような事について反論すれば、少なくとも弊害があるという部分については十分な否定ができるのかなと思っていて、マイナスではないと示すことができれば、ある意味十分なのではと思っていました。