ラベル 書籍 の投稿を表示しています。 すべての投稿を表示
ラベル 書籍 の投稿を表示しています。 すべての投稿を表示

2015年2月27日金曜日

【完全版】初心者・中級者・上級者 熟練度別C++の選書23冊 (和書多し)

(この記事は基本的にhttp://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-listよりの翻訳です。)

 他のプログラミング言語と異なり、C++はインターネットの資料をかき集めるだけで学ぶことは難しく、良書を読むことが必要になる。 C++は非常に巨大で複雑な言語である。あまりに巨大で複雑なので、C++の書籍には非常に非常にたくさんの悪い本がある。 以下のリストはAssociation of C and C++ Users (ACCU) のメンバーによるレビューを受けたC++の選りすぐりの良書である。 


元のstackoverflowのリンクは全て英語だったのが不便だったので、訳書のあるものはそちらを示した。



・初心者

プログラミング経験のない初心者向け

ストラウストラップのプログラミング入門



プログラミング経験があり、C++を始める人向け

C++ プライマー 第4版


A Tour of C++ (英語)


Accelerated C++―効率的なプログラミングのための新しい定跡

Thinking in C++: Introduction to Standard C++, Volume One (英語)



ベストプラクティス

Effective C++ 第3版

Effective STL―STLを効果的に使いこなす50の鉄則


・中級者

MORE EFFECTIVE C++

Exceptional C++―47のクイズ形式によるプログラム問題と解法

More Exceptional C++ さらに40のクイズ形式によるプログラム問題と解法

Exceptional C++ Style―40のクイズ形式によるプログラム問題と解法=スタイル編

C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス

C++ テンプレート完全ガイド

Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14 (英語)


・上級者

Modern C++ Design: Generic Programming and Design Patterns Applied (英語)

C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond (英語)

C++ Concurrency in Action: Practical Multithreading (英語)

Advanced C++ Metaprogramming (英語)


・レファレンス (初~上まで)

ストラウストラップのプログラミング入門

The C++ Standard Library: A Tutorial and Reference (英語)



・古典的良書

The Design and Evolution of C++

C++再考

Advanced C++ Programming Styles and Idioms (英語)

Large Scale C++ Software Design (英語)

2014年9月6日土曜日

プログラミングの理論 計算機プログラムの構造と解釈

プログラミングの勉強というと、どういうことを思い浮かべますでしょうか。
実践的には言語の仕様やSTLを学ぶというのは大切でしょう。情報科学としてはアルゴリズムとデータ構造、あるいは情報数学のようなものになるでしょうか。

もちろん言語・STLの仕様とは科学者工学者の英知の結晶でありますから、吸収できるものはたくさんありますし、アルゴリズム等を知ることは実装の幅を広げてくれるでしょう。しかしそのどちらもプログラミングの理論かといわれると、少し遠いように思えます。

Just let me code.
プログラミングは理論というより手を動かすものじゃないかと思っていたのですが、そんなときに「計算機プログラムの構造と解釈」(Structure and Interpretation of Programming)という本に出会いました。これはまさしく「プログラミングの理論」といえる内容の本です。

プログラムを実装するに当たってどう考えればいいのか、何を考慮しなければならないのか、良いコードとは何か。言語仕様等に依存せずに、抽象化、構造化、関数型プログラミング、オブジェクト指向、論理プログラミングといった考え方を学ぶことが出来ます。詳しい内容はAmazonのレビューに任せ、何故この本が良いのかに絞ってお話をします。

こういう洋書のいい所は、言葉だけで説明するのではなくちゃんとコードでも説明して、なおかつ練習問題を用意してくれることに思えます。(練習のためのコードはschemeですが、その文法を学ぶことを通じてソフトウェア工学を学べるというつくりになっています。)学術書一般において和書に比べて洋書が厚い・高いのはこういう寄り添った説明があるからでしょう。

この本はMITの一年生の1学期の教科書として書かれ、今は多くの大学でも初年時のプログラミングの教科書となっています。初年時の教科書ですからプログラミングを始める人も読めますし、プログラミング経験が豊富な方もこの本で理論を学んではいかがでしょうか。

ひたすらにコードを書くだけでは学べないものが学べます。特にプログラマを目指す人は必ず読むべきだと思います。


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年かけて学ぶ価値のあるものだというのは皆の共通見解でしょう。



2014年8月6日水曜日

タダで読めるプログラミングの本

幸運にも世の中にはたくさんのfreeのプログラミングの本があります。これは情報科学の強みの一つでしょう。

一番有名なのは「計算機プログラムの構造と解釈」でしょうね。この本が和訳でタダになっているのは本当に素晴らしい。(絵柄はあれですけれど中身は美しいです。)

http://sicp.iijlab.net/fulltext/

しかし思うに情報が氾濫していて、どこに良い情報があるかが分かりにくくなっているというのが現状でしょう。また、和訳版が少ないのもソフトウェア産業には問題でしょう。

free-programming-booksはfreeのプログラミング教材の情報をまとめようというプロジェクトです。プログラミングの本だったり、オンラインチュートリアル、あるいはビデオレクチャーなど。

日本語の本の情報もまとまっています。まだ少ないですが、新しい分野・言語の最初の一冊などを探すには便利だと思います。(かく言う私もcommitしています。)

こういうプロジェクトが広がっていくのは面白いですね。

2014年5月29日木曜日

コンピュータサイエンス

コンピュータサイエンスというのは色々なパラダイムが共存しているように思えます。

論理学や離散数学の延長といえるものもありますし、UIなど認知に伸びていく分野も多いですし、そもそもサイエンスといいつつ工学的な応用が非常に大きな部分を占めているように思えます。そうするとコンピュータサイエンスというくくりは大きすぎるのかもしれませんね。

それでも、ゴールは多岐に渡っても学ぶべきスキルというのはある程度収束するものだと思います。つまり共有できるツールや枠組みというのはあるのでしょう。やはり基礎から学ぶというのは定石の一つだと思います。イメージとしてはピラミッド型に伸びている科学技術の要の部分から学ぶということです。

さて、では基礎を学ぼうとしたときに、じゃあ基礎って何なんでしょうか。思うに本屋に並ぶ本はアプリケーションレベルのものばかりで、むしろ末端を深く解説するものが置かれている印象です。だからといってアプリケーションを作りたい人が記号論理学とかを学ぶにはモチベーションがないとやってけないように思えます。


ということでまずはコンピュータサイエンスを俯瞰するという作業がまず必要になるでしょう。どういう分野があって、どういう内容をやっていて、それらはどう関連しているのか。

お勧めの教科書はこちら。



一冊でだいたいの俯瞰が出来るようになります
Cやjavaなどの高レベル言語が物理レベルまでどう翻訳されていくか、コンピュータが下部構造をいかに隠蔽してあるか、丹念に説明されています。


あとはADUniがおすすめです。
これは元々、他分野のバックグラウンドを持つ学生に一年間で情報科学を一通り教えるというコンセプトで生まれたプログラムです。各分野を体系立って学ぶことが出来ます。前述の教科書を見て面白いと思う分野があればこっちでもっと深く学ぶというのが良い方法だと思います。



2014年5月21日水曜日

データ構造とアルゴリズム

データ構造とアルゴリズムの本は五万とありますね。アプリケーションレベルに近いほど多様性を増していくというのは書籍の数にも表れますね。

しかし考えてみると、データ構造やアルゴリズムというのは離散数学なので、例えばマージソートの説明の仕方にそんな五万通りもあるようには思えません。

逆に、アルゴリズムを学ぶメリットというのはアルゴリズムが汎用的であり、一度根幹を学べば同じフレームワークを似た問題で何度も使えるというところにあると思います。

つまるところ、汎用的で再利用可能であることが特にアルゴリズムを学ぶべき理由であると思います。そうすると、javaアルゴリズムだとかC++アルゴリズム事典だとかいう本はややアドホックにすぎるように思えます。

でもこういうアドホックな本が出回るのは自然なことで、アルゴリズムが抽象的すぎて学習しずらいということは大いにあるでしょう。目的からの距離が遠いですから。

データ構造とアルゴリズムで一番評判の高い本はIntroduction to Algorithmsでしょう。


しかしこの鈍器に等しい厚さの数学書を一人で全て理解しきることが出来る人はそんなにいないでしょう。

そこで、なんとも素晴らしいことに、MITOPENCOURSEWAREでこの本の講義が開かれております。

Introduction to Algorithms MIT OPEN COURSEWARE



You TubeのVideo Lectureに比べて充実しているのは、Video Lectureだけでなく講義ノート、宿題や試験とその解答まで公開されていることです。MITの学生と殆ど変わらない学習環境になるんじゃないでしょうか。


もっと薄い和書だとデータ構造とアルゴリズム(杉原厚吉)とかがコンパクトにまとまっています。しかし薄いということは内容が凝縮されていることであって必ずしも簡単だとは限らないと思います。いずれにせよ上の洋書があまりにもきついという人はこちらから初めてもよいように思います。



2014年5月18日日曜日

コンピュータアーキテクチャ

今や大学の授業はタダで受けられる世界です。

テキストファイルのチュートリアルはいくらでもあるし、動画ならCoursera, iTunes, Youtubeで見られる。具体的に知りたいことがあるならgoogle検索で調べればいいし、見つからなければStack Overflowに聞けばいい。

ただ、こうなってくるとどう手をつけていいか分からなくなってきますよね。情報がありすぎると今度は適切なMiningをする必要が出てきます。

ということでData Miningの話も面白いと思うのですが、今日はComputer Architectureを学ぶための1セットをまとめてみました。

・Computer Architecture - Carnegie Mellon

カーネギーメロンのコンピュータの授業です。
これを見れば少なくともアプリケーションレベルのプログラマは困ることはないんじゃないかと思います。35回×1.5時間なのでかなりしっかり学ぶことが出来ます。そんなに時間をかけられないという人でも最初の2、3回だけでも見るべきだと思います。コンピュータアーキテクチャの概念とか目的といったものが非常に明瞭に分かります。Trade-offや隠蔽のヒエラルキーなどの本質的な考え方というのは本では学びにくいことなので。

Computer Architecture Video Lecture


・Computer Organization and Design (Patterson & Hennessy)

世界的に有名でコンピュータアーキテクチャの金字塔といえる教科書です。

しかし、この本、声を大にして言わなければならないのは、日本語訳があまりにもひどすぎる!和訳版は残念ながら学術書ではない。(こんな価値の高い教科書がこんな訳で出てしまう限り日本のIT技術がアメリカに追いつくことはないだろう・・・)

ので原著を強くお勧めします。アセンブラ、ISA、 プロセッサまわりの説明が充実し手織り、今後必ず必要になるであろう並列プログラミングを真に実現するのに非常に役に立つ教科書だと思います。

また、上のCarnegie Mellonの講義でも教科書的に使われていますので、この本を読みつつ講義を見れば、理解がいっそう深まるかと思います。


しかしこの本の翻訳の問題はもっと根が深いでしょうね。
IT関連で何か検索すると英語でした方が100倍位情報があるというのは非常に大きな問題でしょう。もう日本語で科学やビジネスは出来ないということなのでしょうか。

・CPUの創りかた

なんとも人を選ぶ表紙で、キャッチーなだけの中身のない本かと思ってしまいますが、とても面白い本です。かなり本格的な理論を学びつつ、手を動かして4BitCPUを作ることが出来ます。

4bitCPUなのでもちろん実用性はないのですが、ゲートや回路レベルからCPUレベルまでの階層がどうなっているのかを理解するのに非常に役立ちます。

この本を学べば結構本格的な電子工作も出来るようになると思います。というかこの類の本でこんなにAmazonのレビューが高いというのも驚きです。


ということでコンピュータアーキテクチャのまとめでした。

この流れでコンピュータサイエンスを俯瞰していこうかなって考えています。