PPPUC++#2

0. Notes to the Reader

"When the terrain disagrees with the map, trust the terrain."。全ての常識をうたぐってかかるのです。一番重要なことです*1

0.1 The structure of this book
    1. Part I "The Basics," 型システム、演算、制御構造からエラー処理まで。
    2. Part II "Input and Output," コンソール&GUI
    3. Part III "Data and Algorithms," STLのコンテナ&アルゴリズム
    4. Part IV "Broadening the View," 理論や歴史など(行列演算テキスト処理テスト、組込みプログラミング)
    5. おまけ。
  • 覚書にはあんまり関係ないけど、読み返すときの道標として、本書には青とか赤とかの○マーカーがついてる。青:概念とか技術とか、緑:アドバイス、赤:警告。つまり「どんな定義だったかな」とかを内容的に追うときは青を順に追っていけば思い出せて、「なんか良いこと言ってたよな、なんだっけ」のときは緑を。「なんかやばいこと思い出してきた」のときは赤を追っかけていくとなんとなく思い出せる、てな感じ。まあタグなわけか。
0.1.1 General Approach

conventionというか, いろいろなこと。最初から通しで嫁よーとか、自己完結になってるよー、とかそんな話。
あとさりげなく自著の宣伝w

0.1.2 Drills, excercises, etc.
  • ドリルは全部やるように。簡単だから。ドリルを完了しないと、読解は未完了。
  • 演習は全部やらんでも良いけど、少なくとも、どれが難しそうかを理解できるくらいの数はやろう。
  • 3人くらいの小さなプロジェクトを実際にやってみよう(どなたか・・・)
  • 適当なところにTry this:を付けておいたので、とにかく試してみたい人はやってみよう。
  • 各章のラストには復習問題を用意。これはPracticeというよりは概念の理解になっているらしい。
  • あと用語集もあります。
0.1.3 What comes after this book
  • 4ヶ月程度でguruになれるとおもうなよ、とか(脅し)
  • 期待していいのは、いい条件でスタートラインに立てたこと程度だ、とか(脅し)
  • 次のステップは
    1. 他人に利用してもらえるような実プロジェクトやってみる
    2. プロレベルの本(さりげなく自著を(ry)を読みふける
    3. GUIとか分散コンピューティングに手を出してみる
  • 他の言語も習得する。プロなら複数言語習得は必須(我々には自明ですね)
0.2 A philosophy of teaching and learning
  • この本では以下のような概念を扱うための最小セットの概念とか技術とかツールを紹介する。
    1. プログラムの構成
    2. デバッグとテスト
    3. クラス、関数、アルゴリズム設計
    4. グラフィックス(2D), GUI
    5. Text manip, Regex, I/O, Mem management
    6. 科学技術計算
    7. C++ Standard Library
    8. 開発戦略
    9. GUIなど
  • 個々のトピックを理解するために、手続き型プログラミング、データ抽象、OOP、Genericプログラミング、などの技術を紹介する。
  • "C++ with a bit of programming theory"ではなく"Programming using C++"。主はProgramming
  • この本は深さ優先探索になっている。 まず技術を手にインストール、それから概念を補完していく
  • とにかく即効で走り抜けるようにプログラム概念を触る。走れ! 赤ちゃんはまず歩き方より先に走り方を覚える。微調整は後から。(実体験からすごく共感)
  • 全部習得しちゃうぞ病の恐怖
  • 学習において「なぜ」は重要。「そう決まってんの」な丸暗記は絶対はダメダメ。応用が利かない
  • 言語matterなこと以外のコードは実アプリの例からの抜粋です。プロ候補生に教えるプロとして書いてます。よろしく。
0.2.1 The order of topics
  • 教え方はいろいろあるけど、オールマイティーはないですね、と。
  • 理想的には、あなたが出くわす問題にあわせてトピックを構成できたら一番良いんだけど・・・
  • 次善の策として、ストーリー形式にしてあるので(階層的にはなってないので)、辞書的に利用することは想定外です。
  • 今回採用しなかった他のアプローチ
    • "C first" : これは時間の無駄。悪い癖つくからやめろ、と(ぎゃああ)。
    • Bottom-up : これもヘボ分類らしい。言語やライブラリの恩恵を最初からちゃんと受けれるようにしないと、良いプラクティスから離れてしまう、という意見らしい。まあ大学のCS courseじゃあ無いんだから確かにそうかも。SICPとは対照的。
    • "If you present something, you must present it fully" : 究極の深さ優先探索。帰ってこれなくなりそう。Mr.Sは「詳細は後からでいいじゃん」、というスタンス。
    • Top-down : そのメリットを知る前に過度に高レベルで考える癖がついてしまう、という意味で例によって入門には向いていない、とか
    • "Abstrast First" : 汚れた現実の問題を軽視する、象牙の塔の住人を作るメソッドとのこと。ハードウェアやシステムを無視したペーパーJavaドライバー育成計画になってしまうそうな(注:そんなことは書いてありません)。しかし、抽象発想もどこかでげとーすべきとは思うんだけどなあ。あ、Firstがいかんのか。なるほど。
    • Software engineering principles first: top-downやabstractと同じ問題を内包。concrete(具体的な)ものの経験無しには、個々のテクニックのメリットが見えない。
    • "Object-oriented from day one" : フイタ。要するに字の書き方知らないのに文章の構成教えても意味ねージャン、ということらしい。確かにねえ。 なお、本書でもDay1からユーザー定義型は出てくるけど、設計とか階層構造までは後の章まで突っ込まないよー、だそうな。
    • "Just believe in magic" : フイタx2。ツールでやっちゃうって奴ですね。水面下で何が起こっているかが不明になっちゃうし、推論するんだけど大抵間違っているという、なんか自分のこといわれているような・・・

てなわけで、全体として Concrete First / Depth Firstで行きますよ、という話でした。

0.2.2 Programming and programming language
  • もちろん主となるのは Programming
  • しかし、やはり何らかのプログラミング言語を使って「手を汚す」ことが絶対必要ということを力説しています。抽象領域だけでは不十分。
  • 本書で説明しているC++の機能は、良いコードの記述に必要になる部分集合を選んであり、更にC++使う上で避けようの無い要素(論理的に必要であるもの&C++コミュニティで一般的なもの)についても触れている。
0.2.3 Portability
  • 互換性について。
  • ISO Standard C++に準拠するだけでなく、なるべくポータブルなコードを心がけているらしい。
  • 特に断りが無い限りはどんなマシンでも動くはず。

この当たり僕弱いんだよなー

0.3 Programming and computer science
  • ProgrammingがコンピュータScienceのすべてじゃあない。
  • アルゴリズムやデータ構造など一部には触れるけど、あくまでこの本はプログラムの設計と実装が中心
  • Programmingには科学の範疇外の「雑多なこと」が関わってくる。本書はそういったことをカバーする(More than CS)一方で、コンピュータ科学を系統だって説明することはしない(Less than CS)。
  • 本書ではProgrammingを, Scienceとしてではなく, 理論と経験に基づく実用的スキルとして教える。
0.4 Creativity and Problem solving
  • 本書ではアイディアをコード化する方法は議論するが、アイディアの導出については直接は議論しない。
  • 例を通して問題解決手法を学ぶスタンス。問題をカイゼンする過程で問題を解析する。指示をしたり説法じゃなくて例。
  • プログラミング自身が問題解決方法になりうる。プログラムできる、ということは問題と解放を曖昧さなく「理解」できたことと同義。 (これもとても共感します)

*1:しかし、このmapってこの章のことだよねw