4月中は3週間ほど仕事をせず引きこもる時間があったので「データ構造とアルゴリズム」の基礎の学習に100時間ほど費やした。
学習においては量(時間)だけでなく質のほうが大事で、費やした時間で語るのはアンチパターンだと考えているが、「100時間でどれぐらい進捗するのか」のベンチマークとしてはわかりやすいと思うので参考までに書いておく。*1
インプット
データ構造とアルゴリズムをきちんと体系立てられた書籍やオンライン講義動画で学んだ。
- 『アルゴリズム図鑑 絵で見てわかる26のアルゴリズム』読んだ - valid,invalid
- 『みんなのデータ構造』でデータ構造の基礎を学んだ - valid,invalid
- Courseraで"Algorithms, Part I"を修了した - valid,invalid
あとは細かい記事を色々読んだり。
Coureraの "Algorithms Part I" に57時間、『みんなのデータ構造』に14時間ぐらい使っているので総合したら70時間強はインプットに費やしたことになる。
時間のほとんどはインプットに振ったにも関わらず全然足りない…と感じている。Courseraのアルゴリズムの基礎講座も半分だけだし、AtCoder水色になるために必要な知識群には半分も着手できていないし、データ構造とアルゴリズムに関連する数学の学習はほぼゼロに近い。無職を超えてさらなる無限の学習時間がほしい。
アウトプット
「インプットした事柄の定着」と「理解度の測定」を目的とし、主に競技プログラミング、AIZU ONLINE JUDGE、LeetCodeを活用した。正確じゃないけど30時間ぐらいはやっていたはず。
- 競技プログラミング始めた - valid,invalid
- Google Code Jam 2020 Round 1敗退 - valid,invalid
- Aizu Online Judge
- LeetCode - The World's Leading Online Programming Learning Platform
期間中に計150問ぐらい解いて確かに目的に合致することも多くあったが、演習量も質もまだまだ不足を感じる。最近は"解ける問題を選んで解いている"感があって、なお良くない。
予想通りではあるが上述のインプット(初歩的なデータ構造と初歩的なアルゴリズムの学習)だけで劇的に競技プログラミングの成績が向上するわけではなかった。題意をつかむことや問題の考察、適切なアルゴリズムを当てはめて問題を解くにはそのための訓練が必要。それでもじわじわ伸びているとは感じており、AtCoderではようやく緑に昇格し、A~D問題は安定して解けるようになってきた。
所感
100時間やってこの程度か…という気持ちが強い。今の感覚だと400時間ぐらい、質を高めても250時間ぐらいは学習しないと一山を超えられない気がする*2。
とはいえ、基礎(の一部)を学ぶことで問題の解説を読んで理解ができるようになったり、新しいアルゴリズムを学ぶときに必要となる土台を獲得出来てきたと感じる*3。 初歩的な知識があれば考察を必要としないような典型問題*4はわりとすらすら解けるようになってきた。前回のABC 168 D問題でBFSをさらっと書けたときは嬉しかった。
また、学んだデータ構造やアルゴリズムは本当に基礎的でありながら実用的であることがわかってきた。 ライブラリや言語やミドルウェアの内部実装を読むのにたまに便利で、時折、暇を見つけて以下のようなトピックを色々見ている。
- RubyのSortedSetの内部実装 (基本はhashでrbtree gemがあれば使う、という実装) を見たり
- RedisのSortedSetではSkipListが使われていると知ったり
- Rubyの素数判定の実装を見たり
- 特定製品に限らずスタックマシンのエレガントさが心で理解できたり
今後
30代はこれまで避けてきた領域と本格的に向き合いたい*5と考えており、余暇でデータ構造とアルゴリズムの学習は継続するつもりだ。
基礎分野を学習するほどに「これまでよく知らずにやってこれたな…」と凹むことも多いが知らないのだから知るしかない。
とはいえ自分は個人的な学習において1つのことを数ヶ月単位で続けられない飽き性なので、5月は別の領域を学び、数週間後に戻ってくることにした。
次に再開するときにはCoursera, Algorithms Part 2でより基礎を深めつつ、実戦で使える引き出しをもう少し増やすための本も併読したい。
200時間学習した時との差分比較が楽しみだが、その頃には学習時間の計測に飽きていそうな気もする。