仕事でC++を使うようになったので、ちゃんと最近のC++を勉強しよう、という事で本を二冊ほど読んだ。 しかも仕事でコードを書きつつ両方とも良く参照しているので、そうした読み終わったあとの使い勝手も含めて感想を簡単に書いてみたい。

The C++ Programming Language 4th

Stroustrup先生の定番本。

TC++PL4とか略されている。C++11の話で14はカバーしてない。残念。 分厚い。

どう読んだか

この本は以前ハードウェア開発のお手伝いの仕事をした時に買って読んだ本で、今回は二回目。 ただ今回は本気でC++使う予定なので昔よりもしっかり読んだ。

Part Iは全部読んだ。そこで気になった新機能は後続の章に飛んで前後を一通り読む。 Part IIは新しい機能の周辺だけ。Reference、constexpr、lambdaの周辺は少し前から一通り読んだ。

Part IIIは継承周りは飛ばしたが、コンストラクタ、デストラクタ、move、overloadの解決あたりは一通り読んだ。 また、RTTIから先(templateやメタプログラミング関連)も全部読んだ。 ただ最後の行列ライブラリの設計の所は一部流し読み(ただ全体的には結構真面目に読んだ)。

Part 4のSTLはStrings、IO stream、locale, numerics, C互換たち「以外を」一通り読んだ。

二周目ではあるがかなりしっかり読んだと思う。

TC++PL4の感想

まず最初に、この本は素晴らしい。Stroustrupの人生を感じる。 こういう本を書けるプログラマ人生を歩んだ、という事は尊敬に値する。

かなり詳しく仕様が載っている上に、それについてポジティブにどうして自分はこれが良いと思っているのかが書かれている。 どうせ勉強するなら良いと思っている人が書いた本で勉強したい。 そっちの方が楽しい。

C++の全容というのはもはやあまりにも巨大過ぎて、一つの機能単体だけではこの言語で何が出来るのかをうまく伝える事が出来ない。 この本は全容を伝えつつ、その使い方も伝える、という2つの目的を同時に達成するようにうまく書かれていて、それがとてもうまく行っている。

具体的にはPart Iのチュートリアル的な部分が良く書けている。 新機能を良く網羅していて、あとの章へのリファレンスが充実している。 使い方を理解してからその細かい仕組みに飛んで読む、という事が出来る。 そしてこのPart Iでカバーされている範囲を読んで参照されてる気になった所を読むだけで、 とても手早くC++11の主要な所をおさえる事が出来る(だがそれだけで使いこなせないのがC++なのだが…)。

また、Part IIIのテンプレート周りは非常に詳しく書かれていて、全部読めばちゃんと理解出来る(膨大だが)。 SFINAEとかADLといった基本知識をちゃんと説明してくれて、 読んだ時は一時的にはちゃんと理解出来る(すぐ忘れるが…)。

Part 4のSTLも網羅的でありながら例もちゃんと載ってて良くリファレンスとして引いている。 webをググって出てくる解説よりも細かい仕様への言及が多くて役に立つ。

全体的に素晴らしい本だが、目次から目的の項目に飛びにくいという欠点がある。 例えばtemplateについて知りたい時にtemplateの章を読んでも知りたい事が書いてなくて、 あとの方のgeneric programmingの章だったりする。 一つのトピックが散らばっていて、一箇所を読むとその事が全部わかる、という風にはなってない。 これはC++という言語の複雑さから不可避とは思うが。

STLのarrayを探す時に、containerの下にはなくて、結構離れたMemory and Resourcesの章にある。別の章なだけでも辛いが、間に関係ない章が2つも挟まっているのが探しづらさを助長している。

目次が膨大過ぎて全部expandしてると読むのが大変だが、章のタイトルからは想像しづらい内容が中に書いてあるのが辛い。

あと、how to的な要素が足りない。 例えばカスタムなイテレータが書きたいなぁ、という時に使えるアンチョコみたいなのが無い。 もう少しhow to集がほしいなぁ、と思った。

この本は「こういう言語機能なので、こう書くとこう動きます」みたいな流れになっているのだが、 これだけだと予想外の動きを知る事が出来ない、という欠点もある。 C++は落とし穴がいろいろあるのだが、それを知るには「こう動かない」という説明も必要で、 それが無い。 だからこんな分厚い本なのにこの本だけではC++が書けるようにならないのです…

あと、perfect fowardingはこの本だけでは自分は理解出来ませんでした。 そのへんは次のEffective Modern C++の方がずっと良く書けていました。

Effective Modern C++

次はこの本。お仕事でちゃんと使うなら二冊くらい読むか、と買ってみた。

自分は若かりし頃 Effective C++をちゃんと読まなかったニワカC++プログラマだったのだけど、今回はちゃんと読もうという事で。C++ 14の話題が多いのも良い。

ただ、昔ちらちら見た Effective C++ の内容は入ってなくて別物になっている。 結局今でもEffective C++の話は重要なのが結構あるので、向こうも読まないとダメかなぁ。でももう疲れたよ…

どう読んだか

先頭から割と全部読んだ。 あまりにも内容が薄い章(Concurrency周りとかweak_ptrとか)はそれなりに読み飛ばしたが、読み飛ばした物はすべて読まなくてもわかっている所だけだと思う。

感想

この本も必読だと思う。1/3くらいは内容が良くないと思うが、2/3の内容は素晴らしいので、読む価値がある。 そしてTC++PL4と相補的な本になっているので、両方読むのが良い。これがC++。

まず1章のDeducing Type, 2章のauto、5章のrvalueとforwardの話は素晴らしい。 これは必読で、この辺の為だけにこの本を買う価値があるし、たぶんこの本を読まないと分からない。 perfect forwardとかは完璧に理解出来た。この辺はC++ 11の鬼門と思うので、ここをちゃんと理解出来るようになる為だけでもこの本を買って読む価値がある。

この本は意外に振る舞う落とし穴とか簡単には実現出来ない事がなぜ簡単に実現出来ないのか、という事を解説している。 この「期待通りに動かない」という解説はTC++PL4には無い。 意外な振る舞いを見る事で、自分が実は全然理解してなかった事が分かる。

一方で、内容が薄い章もある。4のSmart Pointerは数ページにまとめられそうな事を延々と解説している。 一言で終わらせればいい所をうだうだとダメなケースについての解説というか散文みたいなのが続いて、水増ししすぎだろう、と読んでて辛い。

6のLambdaも半分くらいなぜデフォルトのキャプチャモードを避けるべきか、みたいな解説だが、 これに全く説得力を感じない。単に使うべきでないケースもあるだけで、使って良い場合も多く見えるし、その振る舞いもそこまで意外でも無い。 こういう、情報の提示以外の賛同できない宗教論争みたいなので延々とページを埋めるのがいまいち。

7のConcurrency APIも内容が薄くて酷い。 そもそもにSTLのasyncはまだまだ機能が足りなくてあまり使い物にならない、 という事だと思うのだが、それを中途半端に擁護するので読んでいて不愉快だし、 しかも提示される情報がほとんど無い。1ページにまとめられるんじゃないか、というくらい。 volatileは関係ない、で一言で終わらせればいいのに、勘違いしている人がいるから、 とか言って数ページに渡って解説するのとか意味が分からない。 誰だよ、勘違いしている人。

という事で内容が薄い部分もあるが、前半の内容は珠玉なのでぜひ読むべきと思う。 C++の理解がとても深まった。 ただ思ったよりもハウツーというかレシピ的な物が少なかった。 レシピ集みたいなのは別に読まないとなぁ。

この本の不満な所として、単語が無駄に難しい、ということが挙げられる。 わざと難しい単語使っているんじゃないか?というくらい難しい。 なんか口語的な、比喩表現とかが多いが、それが別段理解や読みやすさを助ける訳でもなく、 本当に無駄に難しい。 語彙力が無いのは私が悪いのかもしれないが、不要な文が難しいのでイラッとくる。 ノリとしては「パフォーマンスにこだわる人は怒るだろうね、そして読者の中には結構そういう人が多いんじゃないか?だってそうじゃなければPythonでも使ってわっしょいしてる方がいいじゃない?」みたいな感じのが延々と続いて、その単語が無駄に難しくて長い。

裏返すと軽い読み物的な体裁があって、そういうのを楽しく読める人だと良いかもしれない。 ただ300ページもそんなのを延々と読むので、ちょっとしたのなら良くてもさすがにうんざりしてくる人の方が多いんじゃないか。

各Itemが短いのは良い。ちょっとやる気無い時も1 Itemだけ読んで寝よう、とか、そうやってちょっとずつ進められる。 一部あまりちゃんと独立してないで3 Itemくらいくっついてようやくひとつの内容になってる所もあるけれど、区切りが短いというのは良い。

あとこの本は割と目次からたどりやすい。仕事中にちょっと気になる事があった時にすぐに目的のItemに飛べる。 自分は電子書籍でしか本を読まないので、目次のたどりやすさというのは結構重視している項目で、この本はそこは良く出来ている。

という事で気に食わない所もたくさんあるけれど、それでも必読といって良いくらい有用な本だった。

まとめ

TC++PL4は素晴らしい名著だし、Effective Modern C++も貴重な情報を多く含んでいて、どちらも著者はC++についての深い理解に基づいて書いてくれている。 他の分野だと明らかに自分よりわかってない人の本とかそこら中にある中で、この本はどちらもちゃんとプロフェッショナルで素晴らしいな、と思った。

この二冊を読めば、「C++ 98やJavaとか他の言語に一部の最近の機能を混ぜた感じでC++ 11を理解する」という状態からは抜け出して、 だいぶメインの言語として使い始める基礎みたいなのは身につく。 理解が浅いとC++ 11は普通に使えばあまりわかってなくても平気な気がしてくるのだが、そういう段階からは脱して、しっかりと理解せずに使うヤバさは痛感出来る。 個人的には、その状態まで行ってない人にC++を書かせるのは怖すぎる、と思っている。

ただ、この二冊を読むくらいでは、基礎が身につくだけで、これだけですぐ書き始められる、という感じはしない。 C++ってそういう言語だよねぇ。なんかこう、本番に入る前の素振りが大量に必要というか。

という事で次はcookbookをなにか読みたいなぁ。以下とかどうだろう?C++ 17かぁ。17はまだちょっと使い始めるには早い気もするんだよなぁ。