競技プログラミングに触れるようになって、自己流ながら少しずつC++が使えるようになってきた。しかしきちんとした参考書を読んだことがなく、体系立てた学習もしたことがないのが気にかかっていた。学習といえば、AOJの教育コンテンツを少しやったばかりで、そのあとは実践問題を解きながら必要に応じて学んできた程度にすぎなく、それでは物足りないと思い始めて、入門の参考書をやってみることにした。
数ある参考書のなかでこれを選んだ経緯について、初めて書影を目にしたときは、いくぶんギョッとさせられた。よくも悪くも潔い印象はある。正直にいって、はじめ手にとったときはこの装丁に圧倒されて、すぐに書棚に戻してしまった。しかし多くの入門書があるなかで、どれを選ぶかと判断しなければならないときに、実名と肖像を大きくフィーチャーしているこの本は、著者としての自信と覚悟がもっともあらわれているという点で強いフックになった。
■
文章について、教科書や参考書というよりはエッセイに近い文体で書かれている。手取り足取りというような親切さはないが、付かず離れずの距離感で読者を先導してくれる印象はあった。リズムに慣れる必要はあるものの、慣れさえすればそう気にはならない。
内容の方に目を向けると、C++についての記述に先立って、 GCC や Makefile の説明を一通りカバーしてくれているのは親切に感じた。C++について自己流で学んできたのと同じように、ビルドについても見よう見まねで覚えてきたため、これらのトピックを付録ではなく冒頭で解説してくれるのは、僕にとってピッタリの進行であった。欲をかいていうと、 cmake がなんであって、どう使うのか、なんかもついでに教わりたい気持ちはあった。とはいえひとまずは make を覚えて手に馴染ませなさい、ということなのだろう。
中盤の「アルゴリズム」の章で、それまで学んだ知識を動員して、標準ライブラリに含まれるような典型アルゴリズムを実装するのもいい教材だった。先行する章で学んだばかりのイテレータの知識を利用して、 for_each
, find
, count
といったアルゴリズムが実装可能であると、手を動かしながら知ることができる。その過程では、これら標準ライブラリに含まれた関数が決してブラックボックスではなく、基本の知識だけでも十分実装可能なものである、という大事な認識も与えられた。「繰り返し処理には for_each
を使いましょう」というような、すでに御膳立てされた道具の使い方を教える方式ではなく、その実装まで付き添って教えてくれるのは、非常に善意のある教え方だと印象に残った。
ポインタの解説についても、「意味としてのポインタ」と「文法としてのポインタ」をよく区別しないまま捉えてしまうことが学習者の混乱の原因であると看破して、よく整理して解説してくれている。先に学んだリファレンスとの比較において、ポインタは機能としては大きくかけ離れたものではないとした上で、複雑に見えるのは文法が難しいに他ならない、としてくれるのは、安心感も納得感もある。要するに、ポインタがわからないと嘆くのは、ポインタの概念がわからないのではなく、文法を覚え切れていないということに他ならないのだろう。自戒も込めつつ、これには実感がある。
■
と、ここまでは実践も含めてたいへん満足いくものであった。他方で、その先のトピックではちょっと置いてきぼりにされてしまったきらいがある。例えば、それまで C++17 を前提に進めてきた演習に、突然 C++20 の機能を使う、と宣言される場面があった。このため手元のコンパイラ(apple clang 11.0.3)でコンパイルできなくなってしまった。コンパイル手段を検討したり、C++17 で実装し直すのは、つまらない作業ではなかったが、学習スピードとしては著しく低下してしまった。
ほかにもコンパイラの相性のせいなのか、サンプルコードをうまく動かせない場面はちらほらあった。ごまかしながら進めていたが、なんとなく動かして満足するのでは学習として意味がないなと思って、手を動かしながらじっくり読むのはやめにした。逐一検証していくことはせず、気になる部分だけを書き写して実行してみるほかは、ザッと読んで参考にするだけに留めておいた。
というわけで、教材としてはおおむね満足しているが、後半、解説が駆け足になるにつれて、置き去りにされてしまった気分は否めない。入門というには高度に思われる話題も少なくない気がしたが、それ自体はそう悪いことではないと思う。それは言うなれば、大学の講義なんかで教授の話を一生懸命聞いているものの、だんだんと内容が発展していき、気づくとついていけなくなってしまっている、というようなものだと思う。そして経験上、こういったケースではあとになって教授の含意に気づく瞬間がふと訪れるものだから、その時までじっくり待てばいい。
要するに、わからなかった箇所もちらほらあるが、わかる部分が皆無だったわけでは決してない。そして事実、新しく学べたことはたくさんあるのだから、まずはその新しい知識を応用できるようになることを目指すのが筋と思う。そのうち、わからなかったこともだんだんわかるようになってくるはずだし、そのようなときに、ここになにが書かれていたかを思い出して、適当に読み返せられればそれでいいだろう。