競技プログラミングの牧歌的勉強会をした話

去年の11月から今年の6月までの8ヶ月間、競技プログラミングの初心者向け定期勉強会を開催していました。気楽に勢いで始めた勉強会でしたが、参加者から「和気あいあいとやれていた」というフィードバックを頂いたので、内容や振り返りを公開したいと思います。競技プログラミングの楽しみ方の1つの形として参考になれば嬉しいです。

## 勉強会の内容は？

実施した勉強会の概要は以下の表の通りです。具体的な内容は表の後に説明します。

| 項目 | 概要 |
|:-:|:-:|
|目標|参加者がAtCoderにおいて緑色になることを目指す|
|参加者|メンバーは固定せず、毎週slackで募集|
|日程、場所|毎週水曜日の21:00～22:00、オンラインで実施|
|題材|直前の週末に開催されたABCの緑diff以下の問題|
|進行方法|各問題について参加者のコードを持ち寄り議論し、最後に水色以上の人が簡単な解説をする|

### 目標

この勉強会では「参加者がAtCoderにおいて緑色になること」を目標に設定しました。この目標を設定した理由は、プログラミングに馴染みがなく筋トレしたい人、高レートを目指して競プロを始めたい人、何か別の目的のために競プロを利用しようと思っている人、それぞれにとって最初の良い目標となり得ると思ったからです。別の言い方をすると、参加者の個別の目標は色々あるかと思いますが、緑色を目指すことが各々の目標をうまくカバーしているのではないかと考えて、勉強会の目標に定めました。参加者の学びたいことは幅広いです。目標をシンプルにしたかったのでこのような文言になっていますが、競プロで強くなることだけを勉強会の目標にしていたわけではないことは付け加えておきます。

### 参加者

エンジニア仲間のslackで毎週告知をして、その週に時間があって参加したい人が出席する形をとっていました。参加を必須としてしまうとハードルが高まると思いメンバーは固定していません。一方で参加者が多岐に広がりすぎないように、一般には募集しませんでした。結果的に毎回5人から10人程度の参加者がいる勉強会となりました。目標を「緑色を目指す」にしていましたが、参加者全員が緑に到達していないという訳ではなく、半分くらいが緑色未満、加えて緑色が少しと水色が数名いる状況が多かったです。

### 日程 / 場所 / 題材

勉強会は毎週水曜日、21時から22時の間で実施しました。全員が社会人参加者ですので、休日を避けて平日遅めの時間帯を選びました。また、場所はオンラインで実施しました。コロナで直接会うことが難しい事も理由の1つですが、単純に参加のしやすさを狙ってこの形態で実施していました。勉強会で取り上げる問題は、直前の週末のAtCoder Beginner Contestの問題の中で[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)における緑色と茶色と灰色の問題です。解説出来る限り高度な問題を題材にするということはしていませんでした。目標が緑色になることですので、緑diffの問題を安定して解けるように練習をしていました。

### 進行方法

事前準備として、題材の問題を実際に解くか、解けない場合も少し考えてきてもらっていました。その場で解くようなことはしていません。その上で、勉強会は以下のようにして進行しました。

- 解いた人を募り、その中の1人に自身の解答を解説してもらう
- 次に、他の人にもコードや考察を共有してもらって、実装方法や計算量、アルゴリズムについて議論をする
- 水色以上の比較的高レート者が問題の解説を行う

これを各問題に対して繰り返していきます。もし解けた人がいない場合も、どこまで何を考えたのかを共有してもらっていました。進行方法としてはシンプルですが、気を付けていた細かい点がいくつかあったのでそれについては次のパートで解説します。

## 進行の上で気を付けていたこと

参加者の目標をうまくカバーするために、勉強会を進行していく上で気を付けていたことがいくつかありました。このパートではそれをご紹介します。

### コードの時間計算量は細かい部分まで確認する

共有されたコードの各操作に対する時間計算量は細かく確認するように議論を誘導していました。コードの中では1行で終わっている処理であっても、内部のデータ量に依存した時間がかかる処理がある場合も多いからです。稀に言語の実装まで議論が及ぶこともありました。競技プログラミングで強くなることだけが目標ではないので、このような議論にも多くの時間を割いていました。

### コードと共に思考を共有してもらう

コードを解説する際に、単にコードの流れを解説してもらうだけではなく、何故そのようなコードを書く思考に至ったのかを解説してもらうようにしていました。AtCoderに掲載されている解答を見れば後から問題をACすることは出来ますが、次に同じ問題を解けるようになるためには思考過程を追うことが重要だと考えていたからです。解答まで至らなかった参加者から試行錯誤した際の思考過程を共有してもらって、それについて議論することもありました。

### 別解を極力取りあげる

思考過程を強化する方法として、別解を極力取り上げるようにしていました。それは計算量的に優秀なものも、そうでないものも含みます。またアルゴリズムレベルでは等価でも、書き方が違ったりするものは多々あります。それらを参加者から漏れなくすくい上げることを意識していました。

### 共有してもらったコードを否定しない

共有されるコードの多くは実際の競技時間中に書かれたものです。つまり、時間圧が極めて高い中で作られたコードです。関係者からコードを強く否定する発言が出ない様に気を付けていました。この勉強会では何を考えてそのコードを書いたのかを共有してもらうことを重要視していました。その為にはコードそのものも共有してもらうことは必須です。その場で否定して、参加者がコードを共有してくれなくなることは絶対に避けるべきと考えました。

## 勉強会の振り返り

目標に対する結果として、４名の方が茶色から緑色へレートを伸ばすことが出来ました。その上で、この勉強会の中で良い方向に働いたと感じたポイントについてご紹介します。

### 「AtCoderで緑色になる」事は程よい目標であった

当たり前と言えるかもしれませんが、勉強会の目標を具体的に提示したことは良かったと思います。結果的に、緑色になるという目標は皆の目標を良くカバーしていました。また、この目標は水色の人達にも良い参加意欲を与えうるものになりました。緑diffの問題に対する議論を適切にフォローすることは簡単なことではありません。参加者をフォローする過程で、水色以上の参加者にとってもメリットのある勉強会になったと思っています。

### 参加者のコードを使って計算量や別解を細かく議論したことは良かった

参加者は競技プログラミングでアスリートになりたい人だけではありません。そんな人にもシンプルな実装を議論することや言語の動作を細かく追うことは興味の出る分野である場合もあって、幅広い層に楽しんでもらえる勉強会になっていたと思います。また、ACするコードを書いてはみたものの自身の理解が甘かった部分を補完できるという効果や、アルゴリズムの細かい動きや理屈を反復して学習できる効果もあったと感じています。

### ABCを勉強会の題材としたことは良かった

当初、過去問は星の数ほど存在するので、適切なレベルの問題を選んできた方が参加者の実力アップには良いと思っていました。なので初回は、私がその週の題材を選ぶ方法を取りましたが、適切なレベルの問題を探してくるコストがあまりにも大きかったので、2回目以降はABCから自動的に取り上げる題材が決定されるようにしました。AtCoder Problemsのdiffによって、問題のレベル感も自動で簡単に揃えられることはとても大きなメリットでした。問題を自ら選定することは余程気合が入っていない限りは避けた方が良いように思います。

### 勉強会の場を用意できたことは良かった

参加者の意見を聞いていると、「毎週定期的・強制的に仲間と議論できる場が開催されていることが、競技プログラミングを続ける大きなモチベーションになった」という意見がかなり多く聞かれました。形はどうあれ、議論の場が存在すること、それ自体がとても重要な事であったのだろうと思っています。つまり、この勉強会の場を用意できたこと自体がとても良いことだったと確信しています。

## 今はやっていないの？

この勉強会は6月末で終了しました。理由は大きく分けて2つあります。
1つ目は、メンバーのレベルアップです。複数名が緑色へ昇格しました。そして、緑色diffだけでなく水色diffの問題をやりたいというメンバーが増えてきました。平均レベルがあがって、入門の勉強会はもう必要なくなってきたかな？と考えました。
2つ目は、私のコストが大きいと感じ始めたことです。あまりマイナスの意味に捉えてほしくは無いのですが、私は主催としてほぼ必ず参加するようにしていて、週1で開催準備をして参加するのがコスト高いなと感じて、閉じることを決意しました。共同主催を探すことも考えましたが、私の意識としては勉強会はカジュアルに閉じられた方が、またカジュアルに開かれるのかなと思うので、気楽に閉鎖を決断したほうが良いかなと思っています。
この勉強会は気楽に開かれて、無理ない範囲で閉じ、6月末で終了しました。

## 後書き
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">競プロを牧歌的に楽しむためのHow toを書いたブログとかあるんだろうか、ググってもすぐ色がどうのなりアスリートとしての生き様がたくさん出てくるのだが、知人にちらほらいる「健康のために軽く触れたい」みたいな人に良い記事を探している</p>&mdash; のみんぐ (@bakaming) <a href="https://twitter.com/bakaming/status/1406923203742617600?ref_src=twsrc%5Etfw">June 21, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

この勉強会を通して私がやりたかったことは、このtweetに書かれている通りです。少し固い勉強会という形式にはなりましたが、参加者の皆様にご協力いただき和気あいあいと議論しながら勉強会を実施できたと感じています。その意味で、牧歌的に競技プログラミングに取り組む1つの形になっていたのかなと思っています。振り返りの欄にも書きましたが、「場がある」ということは何にもまして重要であると感じています。この記事が、これから場を開こうとする人の背中を押すものであることを祈っています。