【AtCoder】一年経過を機に、精進記録を見直してみた!【勉強法】

競プロerの霧しゃまです!
昨年11月からAtCoderにハマって一年が経ちました。去る8月末に青コーダーになりましたが、やはりというか暖色までの道のりは遠く、忙しさもあって今は少し停滞しています。
そこで最近は、より効率良く精進を行い、仕事や他の趣味との両立を図るべく、現状を分析して新たな勉強法を試しています。今回はその記録です。

忙しい人向けのまとめ

・そもそも、問題を解くために必要なことを考えてみた!
・忘れても思い出せること、断片的な記憶から検索できることを目指した!
・選ばれたのは、Wiki風の構造を実現できるメモソフト"VaNT"でした!

背景および目的

首尾よく青コーダーになった霧しゃまでしたが、ある時期から停滞が始まりました。問題を眺めても平時のような閃きが得られず、考えの甘さから実装の難しい方針を選んでしまったり、考察の嘘に気づくことができなかったり、似たような問題を解いたことがあっても、それを思い出すことができなかったりと、以前のような実力を発揮することができなくなってしまったのです。

まあ簡単に言えば根本原因は仕事によるストレス、過剰なマルチタスク、時間的なプレッシャーなのですが(これらがパフォーマンスを致命的に損なうということについては、『リファクタリング・ウェットウェア』[1]という本に詳しく書いてあります)、社会人erたるもの仕事と趣味の両立は大前提であり、このような状況下でも、趣味のパフォーマンスを落とさない方法を考え、仕組みとして生活に取り入れていかなければなりません(仕事のほうをどうにかするアプローチにも取り組む必要がありますが、今回は触れません)。

ということで、最初に描いたイメージは、「競プロをしているときの脳内システムをエクスポートし、一部外付けにしたり、適宜インポートしなおすこと」です。不幸なことに競プロそのものは全然役に立たない仕事なので(いわゆる業プロerだが、アルゴリズムの要求度は茶色レベル以下で、ドメイン知識の量が非常に大きい)、頭の切り替えが求められます。そのときに、やはりいくらかの競プロに関する知識や感覚がこぼれたり壊れたりしてしまうわけです。それを速やかにリストアすることが課題になります。

それにしても、複雑な脳内システムのすべてを再現するのは無理です。そこで、「未知の問題に取り組む」ことを最大の目的として、そのために必要なプロセスを助けるような基盤を作ることにしました。

材料および方法① ~ 既存の精進記録

曲がりなりにも丸一年、毎日欠かさず精進を続けてきたので、解いた問題の蓄積はそれなりにあります。おおよそ $${2,200}$$ 問です。そして、そのほとんどすべての問題について、解法や考察過程を記したメモを残すようにしています。画像のようなものです。

ABC196E(青色)

また、個別のアルゴリズムやデータ構造についてまとめたメモも同じように作っています。

個別テーマ:Mo's algorithm

ちなみにツールはSimplenoteを使っています。クラウドサービスなので、外出先でも閲覧できるのが魅力です。もともと中の人は、競プロに限らない、より広範な知識をまとめるためにこのサービスを使い始めました。しかし、その知識ジャンルの区分のためにタグ機能を使っているので、例えば競プロの問題の分類のためにそれを使うことはできません。また、全文検索機能もありますが、他分野のメモが結果に引っかかるとか、「どのノートに該当する結果がある」までしかわからない(具体的な該当箇所はノートを開いて見つけに行く必要がある)とかで、若干の不便があります。これでは知識の体系化も全然進みません。中の人はこれを記憶力でカバーしてきましたが、その記憶力が頼りにならない状況が今回の前提であります。

競プロ分野の知識は実際、競プロをするPC以外で使うことはあまりないので、この際、(特に個々の問題に関する精進記録は)他のツールに独立させてしまってもよく、それはクラウドに限らなくてもよいと考えました。

材料および方法② ~ ポリア先生の教え

精進記録を新たな形でまとめるとなったときに、重視したいのは検索性です。『いかにして問題をとくか』[2]によれば、問題を解くためには、「似た問題」や「見なれた問題」を「思い出す」ことが重要なステップになります。それらの解法を適用してみたり、条件をいくらか変えて検討してみたりすることで、解こうとする問題の解に近づくことができるのです。

文章にすると難しそうに思えますが、実際わたしたちは、多かれ少なかれ自然にそうしているはずなのです。競プロの問題に限らず、日常のあらゆる「問題」に対して、わたしたちは経験をもとに(たとえそれが、ヒューリスティックに過ぎなくても)解を考え出しています。

ただやはり、今回の目的を考えると厳密な考察ができることは必須です。問題設定や解法を「大雑把に」覚えているだけでは不十分で、似た問題を思い出したときに、厳密な情報にアクセスできるようにしておきたいところです。そこで検索性が重要になります。断片的な記憶や気持ちで検索しても所望のものを洗い出せるようなツールが欲しくなります。

材料および方法③ ~ 自分に合った方法とは

実は何か月か前にも、同じような取り組みをして挫折したことがありました。当時はCubeNoteという、タグでノートを整理できる機能と全文検索機能を有したツールを使ってみました。しかし、「タグを作って付ける」という作業が性に合わず、長続きしませんでした。

「タグ」は一見良さそうに見える方法ですが、効果的に使うためにはなかなか繊細な管理が要求されると思います。例えば、タグを作っていくうちに、似たようなニュアンスのタグが乱立して、結果的に情報が断片化されてしまうことが起こります。逆にあらかじめ必要なタグを洗い出して整理する方法もありますが、これもなかなか労力が掛かりますし、時間とともにタグの表す領域が拡張されたりされなかったりして、あるいは新たな領域が出てきたりして、結局は前述のような問題が出てきます。いわゆる「タグの秩序」を保つための労力は、見かけより重く感じられます。

また、同じタグのノートはすべて横並びになるという点も問題になります。例えば、「ダイクストラ法」というタグを作ったら、ダイクストラ法で解ける問題のメモにもタグを付けますし、『ダイクストラ法の実装例』のようなまとめ系のメモにも同じタグを付けるような形になります。これは整理としてはいまひとつで、そのタグの中で「まず見るべきページ」がわかりにくくなります。そうしたら「まず見るべきページ」みたいなタグを作ることはできますが、これはまさに「タグの秩序」に反する場当たり的な対応になってしまいます。

要するに、タグはなくても良いですが、一定の階層構造や、リンク機能が欲しくなります。この時点で、よくあるブログが選択肢から外れます。
理想としては『ダイクストラ法の概要と用例まとめ』のようなポータルページに当たるものを作って、そこから各問題とか、親ジャンルに当たる『最短経路系の解き方まとめ』のような記事にリンクできるような形です。

材料および方法④ ~ 有機的知識網

で、そのような理想形に近いサービスをわたしたちはよく知っているはずです。Wikiです。Wikiは、ページ間の階層構造こそ厳密なものではありませんが、とにかくリンク機能が柔軟で強力です。あるキーワードに対するポータルページを作っておいて、個々の問題のページでそのキーワードが出たときにそこへ飛ぶリンクが自動で作られると、タグは不要になります。複数のキーワードを一つのページへリダイレクトするようにできれば、表記ゆれにも強く、知識の断片化を防ぐことができます。将来の拡張にも強そうです。

これは『リファクタリング・ウェットウェア』にも書いてあることですが、自分の知識を整理するWikiを作ることで、本来的なマインドマップにも近い、有機的な知識のネットワークを形成することができます。それはつまり、雑多な情報を様々な観点で柔軟に関連させることでまとめ上げ、脳内のクリエイティブな部分を刺激しながら、生きた知識の体系として頭に馴染ませるプロセスになります。

ただ、そのためにWikiの記法を学ぶとか(Markdownも未修得)、サーバを立てるとか、さすがにそこまでのコストを払う余裕はないので、ローカルで完結するアプリを前提に検討しました。そこで見つけたのがVanilla Note Taker(VaNT)というメモソフトでした。

こちらです。タイムリーなことに、つい先日v1.0.0になったようです。これを使って、精進記録をまとめ直してみることにします。

結果

早速導入してみました。こんな感じです。

問題メモ
キーワードメモ

元の精進記録と比較して、かなりシステマチックになりました。
とりあえず、個々の問題について解法や考えたことをまとめる「問題メモ」と、共通的なキーワードをまとめる「キーワードメモ」を作っていくことにしました。
問題メモでは従来、何分何ペナで解けた(あるいは解説ACした)という情報を書いていましたが、結局これは数字が厳密でない場合もあり価値が低いのでオミットしました。キーワードメモは従来とほぼ同じですが、より幅広いキーワードについて積極的に作っていくことにしました。目標としては、問題ページの解法欄をキーワードだけで表現することです。名のない典型要素にも自分で命名するつもりでやっています。

"<<< 文字列型"のように記述すると、すべてのメモの"文字列型"という記述が検知され、自動でリンク的なものが(厳密には、全文検索機能へのショートカット)が張られます。これは"come-fromリンク"という機能です。これをキーワードメモのタイトルに使うことで、Wikiらしくなります。

"文字列型"で全文検索した結果、先頭にcome-fromリンクがヒットする

この仕組みによって、タグやリンクの管理など非本質的な部分に苦慮することは限りなく少なくなると思います。仮に似たようなキーワードメモを複数作ってしまっても、"come-fromリンク"は複数並べて書けるので、キーワードメモをマージするのも容易です。逆にメモを分割するのも容易です。

他にも普通に全文検索やインクリメンタルサーチは便利ですし、定型文や画像挿入など役立ちそうな機能があります。数式表示の機能もあるらしいので、将来的に使ってみたいと思います。
あと、データがローカルに保存されるのは安心感があります。やはりというかSimplenoteのような無料クラウドサービスはいつなくなるかわからない側面もあるので、データを自分でバックアップできるのは重要です。

考察と今後について

一つ問題があるとすれば、精進記録の移行作業です。復習になるので無駄ではありませんが、それでも問題数が圧倒的に多いので、それこそ数か月単位の時間が掛かる見込みです。地道にやっていくしかありません。しかし、これが完成した日には、これまでの付け焼刃的な学習スタイルを脱却し、一つ高い次元に至れるのではないかと思います。

中の人は、選んだ進路としては理系ですが、学習スタイルはかなり文系的です。多くのことを文章の暗記で乗り切ってきました。乗り切れないものもそれなりにどうにかしてきました。なぜ暗記に特化してきたかと言えば、「体で覚える」のが嫌いだったからです。具体的には、「反復練習によって反射的に何かをできるようになる」というプロセスが小学生のころから嫌いで、理論も手順も丸暗記することでゴリ押ししてきたのでした。

暗記でも物量さえあればかなりのことができますし、それを引き出すための「連想」を鍛えれば、ある程度は応用力もエミュレートできます。そのために言葉を使うので、読解力なども後からついてきます。
しかしこれは、最終的には断片的でまばらな知識を詰め込んでいるだけで、実質的に忘れてしまったらほとんど終わりです。また、ある問題を解く時点で意識に上りやすくなっていたものに自分の答えが左右されがちであり、不安定です。「今はすぐに解けたものが、一週間後もすぐ解けるかはわからない」という葛藤と戦う必要があります。頭の切り替えとの相性も悪くなるわけです。真面目に復習しようとすると$${O(N^2)}$$のオーダーになり、実は効率が悪いのです。

また、速度も遅くなりがちです。高校入試以降の数学は常にこれで苦戦していました。センター試験(後の共通テスト)でも、数学は8割超えを最初から諦めて、各大問の最後以外を全部取る戦略にしたほどです。

記憶力も頭の柔軟さも、これから衰えていく恐れがあります。そのときにこれまでのような方法がずっと通用する保証はありません。ただでさえ、単純な知識の引き出しではAIに取って代わられると言われる時代です。

これから、真に求められる生産性を実現するために、まだまだ探究は続きます。まずはこの新たな勉強法を確立しながら、AtCoderで黄色を目指していきたいと思います。

おわりに

最後になりますが、AtCoderの運営のみなさま、AtCoder Problemsなど様々な関連サービスの運営のみなさま、ならびにVaNTの開発者さまに、厚く御礼申し上げます。
以上、霧しゃまでした!

参考文献

[1] Andy Hunt, 武舎広幸・武舎るみ訳『リファクタリング・ウェットウェア』O'REILLY, 2009
[2]George Polya, 柿内賢信訳『いかにして問題をとくか』 丸善出版, 1954

この記事が気に入ったらサポートをしてみませんか?