Stroustrup氏の回答 3:まず具体例を示し、概念を理解し、詳細にはこだわらない
You are right that "depth-first", "concrete-first" and "concept-based" are hard ideas to grasp in the abstract. To really understand these concepts (any concept), you need both an explanation of the general idea (concept) and an example. If you are given just a description of the abstract idea, you have a hard time figuring out if you are using it as intended. Conversely, if you are given just an example, you have a hard time generalizing what you see to a wider range of uses. So by "concrete-first" I mean that give concrete examples before explanations of the general principles involved. For example, I'll show uses of function calls before explaining about argument passing and I use vector<string> long before I explain how to build vector and string. I am pretty sure that "concrete first" is the way most people most easily learn in essentially all areas. The alternative is often to present pages of "theory" before getting to an example or to completely explain a set of language facilities before showing a realistic of them.
おっしゃるとおり、概要を一読しただけでは、”depth-first”、”concrete-first”、および”concept-based”の3つの意味を理解することはできません。理解するためには、一般的な考え(概念)の説明と具体的な例が必要です。抽象概念の説明を受けただけでは、その概念の適応が意図に沿ったものであるかどうかの判断が難しくなります。逆に、具体的な例だけを示された場合には、自力でそれを一般化し、適応可能範囲を定義しなければなりません。
”concrete-first”とは、一般原理を説明する前に具体的な例を示すことです。例えば、関数を説明する際には、引数の渡し方を説明する前に、まずその呼び出し方法を説明してしまいます。同様に、ベクタや文字列の説明では、まずvector<string>
の使用方法を説明し、次にベクタと文字列の定義方法を解説します。私は、この”具体例先行(concrete first)”方式は最も効果的な教授方法と確信しています。別の選択肢としては、理論をじっくり教えた後で具体例を示す方法、あるいは言語機能セットを完全に説明し、その後で現実に沿った応用例を示す方法があります。
By "concept-based" I mean that the aim and focus of the book is to get the student to understand the concepts/ideas and techniques that underlie good software (By "good" I mean correct, comprehensible, maintainable, etc.). Students must understand why something works or they will invent (typically erroneous) reasons and (mis)apply those "lessons." Also, they will cut&paste rather than building new abstractions because the lack of understanding will lead to excess imitation and fear of novelty. "How to design interfaces", "how to use invariants", and "when to use inheritance" are examples of concepts and their applications. Programming is more than stringing if-statements together.
私は、次期書籍の中で良質なソフトウェアを支える概念、アイデア、テクニックを理解する重要性を強調しています。これが”concept-based(概念ベース)”の意味です。良質なソフトウェアの”良質”とは、正確、分かりやすさ、保守性などの点で優れていることを意味します。
学習者は、”それがなぜ動作するのか(動作の背景)”を理解しなければなりません。理解できない場合、彼らはそれらしき理由(誤解)を勝手に見つけ出し、そのまま前に突き進んでしまいます(誤解の応用)。また、理解を欠いた学習者はひたすら模倣に走り、斬新な取り組みを避けるようになります。結果、彼らはカットアンドペーストを繰り返し、独自の抽象化コードを書こうとしなくなります。
”インターフェースをどのように設計するか”、”オブジェクトの安定性(invariant)をどのように確保するか”、”継承をいつ使用するか”などは、概念とその応用の例です。プログラミングは、if文の繋ぎ合わせ作業ではないのです。
By "depth-first" I mean that I "rush" through the early chapters without explaining every detail (to get deep into the language). The aim is to collect a collection of language features and techniques to be able to present semi-realistic examples as soon as possible. If the student has to understand every detail of every language feature used (I think of that as "breath") we are forced into a bottom-up approach where we never (in a semester course) get to anything interesting or useful. For example, I do not explain all or C++'s built-in types and their interactions, I just show uses of bool, char, int, and double and postpone more detailed explanations until much later; vector and string are used for the very start.
”depth-first”とは、技術詳細にこだわらないことです。私は、前半部の数章では言語詳細に触れていません。可能な限り早い段階で実世界の要求をほぼ満たすコード例を紹介したいと考えたからです。そのため、必要と思われる言語機能とテクニックだけを取捨選択し、拙速気味にそれらを紹介しています。
学習者がすべての言語機能の詳細を理解しなければならないとすれば、ボトムアップアプローチを採用せざるを得なくなります。このアプローチは、学習者を退屈させ、限られた時間内では有益な効果をもたらしてくれません。例えば、すべての型やC++の内蔵型、および、それらの型の間にある関係などは説明していません。bool
、char
、int
、double
などの使用法には触れていますが、その詳しい説明はずっと後になって行っています。ベクタと文字列は最初から紹介しています。