2014年9月1日月曜日

C++初心者が中級者になるための5冊の本

C++は非常に「巨大な」言語です。

とりあえずプログラムが書けるようになるというのと、C++を「理解した」ということは大きな差があるでしょう。思うにC++は、彷徨える初心者が最も多い言語じゃないでしょうか。

C++は沢山の良書と、それ以上に沢山の悪書があります。
そして残念ながら、C++を始めたばかりの方にはそれを見分けることは出来ないでしょう (出来るなら初心者ではないでしょう)。

constとかstaticとか意味は分かるけど、何の為に使うのかが分からない。 ポリモーフィズムもコードは読めるけど、どういう時にどうクラスを設計したらいいのか分からない。

そういう方にお勧めの本を5冊紹介します。



***

Effective C++ (Scott Meyers)

「C++2冊目の本」として確立した名著。
1冊目で文法を学んだら、次にこのEffective C++を読んで間違いないです。
この本は文法そのものに対する解説は深くはしませんが、何故constをつけるのかを考えることによってconstなどの文法への理解が深まります。
C++自体への理解を深めると同時に、50のルールとして、実際のプログラミングに役立てられるようにまとめられています。


More Effective C++ (Scott Meyers)

C++という名前の由来は、Cをインクメントしたものなので、Cをその一部として含みます。しかしCがその大部分を占めているかというと、必ずしもそうではありません。

大まかにC++はC、オブジェクト指向、テンプレート、STLの4つの集合にゆるやかにまとめることが出来ると言われております。Cとは大きく異なる言語です。Cにちょっと機能を足した、というものではありません。(ちなみにC++は++CではなくC++なので、返し値はCだというジョークがあります。)

MoreEffective C++は主にオブジェクト指向の部分と例外について扱います。何故エラーコードではなく例外を投げるのかなど、オブジェクト指向としてのC++について丁寧に解説されています。多くのプロジェクトはオブジェクト指向でしょうから、とりあえずこの本は優先的に読むべきかもしれません。javaでのオブジェクト指向の経験のある方も、C++固有の事情が結構あるので参考になると思います。


C++ Coding Standard (Herb Sutter and Andrei Alexandrescu)

前書きにこの本の真髄が述べられている。標準化(Standardize)の重要性とその方法について解説した本です。標準化というと自由度が損なわれるという意味だと思われる方は是非この本を読むべきでしょう。この本のもう一つの主張は標準というのは自由である、ということです。

プロジェクトメンバーとお作法を統一するなどという狭い意味ではなく、C++の言語の設計思想や言語実装と照らし合わせ、最もスマートな方法(標準)を知ることでパフォーマンス・移植性・頑強性のトレードオフを高い水準で保つことが出来る、という本です。

標準化の方法について、101のルールにまとめて明文化してあります。


Effective STL (Scott Meyers)


 More Effective C++で述べた4つの集合のうち、STLについて解説した本です。
 
STLはオブジェクト指向とテンプレートに内包された集合ですが、それらに比較して重要度が小さいということではありません。また、オブジェクト指向を先に学ばなければならないということでもありません。STLを学ぶべき理由をいくつかあげると、


1. プロジェクト中に実装するデータ構造の殆どはSTLを利用する

2. オブジェクト指向やテンプレートの勉強になる

3. アルゴリズムとデータ構造について学ぶことが出来る


といったことが挙げられます。

Effective STLはプロジェクトにSTLを使うためのTipsをまとめてあります。それらのTipsを知ることは1のプロジェクト中に実装する為の知識となります。また、Scott Meyersは必ずWhyについて言及します。何故そのようにコードを書くべきなのか。それを理解することで2, 3の知識を得ることが出来る、という構成の本になっています。


C++ Template: Complete Guide
(David Vandevoorde and Nicolai M. Josuttis)


Complete Guideの名の通り、全ての方向からテンプレートプログラミングを解説した本。テンプレートの概念的な説明から入り、それがどのように実装されているかも詳述してあります。テンプレートを実装する際の様々なテクニックをリファレンス的に紹介し、テンプレートメタプログラミングの導入と、STLがどのように実装されているかなどの実例も収録されています。

テンプレートがそうであるように、非常に内容の大きい本です。
この本一冊読めばテンプレートの本質とその実装が出来るようになります。テンプレートの魅力を理解できるようになる一冊です。


***


これらの本をすべて(或いは一部)読んだならば、一通りのオープンソースのコードを読みこなすことが出来ると思います。習うより慣れろというのはプログラミングの鉄則ですから、上記の本を読みつつ、オープンソースのコードを読んだり、自分で何か作ったりしてみてはいかがでしょうか。

5冊合わせると約1550ページ(索引除く)ですので、Introduction to Algorithmを越すページ数です。C++は、それくらい大きな言語です。そして、それらを理解してもまだまだ深い世界があるのです。テンプレートメタプログラミングや並列処理など、まだまだトピックはいくらでもあります。

Peter NorvigのTeach Yourself Programming in Ten Yearsという記事があります。
C++に限った話ではないですが、C++は10年かけて学ぶ価値のあるものだというのは皆の共通見解でしょう。



0 件のコメント:

コメントを投稿