別に暗記するほど理解できないとかいう話ではない。(理解するために本を読んでいたらそのうち覚えるだろうし、暗記の為に何度もコードを打っていたら突然理解できるということもある。)
ここで言いたいのは、初心者がプログラミング言語を学習する時、「どこまでを記憶して、どこからが理解していれば良いのか」という境界が分からないことが多く、教える側もそれを巧く伝えるのが難しいという話である。
プログラミング言語の仕様やAPIは膨大であり、一般にエンジニアはレファレンスで必要なものを調べながら実装するものだ。だから、経験者は初学者に指導する時「覚える必要は無い。理解が重要であり、必要な事は必要な時に調べれば良い。」と言ってしまう。
しかし、初学者の中にはこの言葉を字の如く受け取ってしまう人がいる。必要な事を調べれば良いと言っても、よく使うデータ型なり基本構文なりクラスの作り方なり、チュートリアルに載っているような事は記憶していなければ、まともに実装することはできない。
「足し算の概念とやり方を理解するのが大事」と言っても、まさか足し算をする度に演算子(+)の書き方を調べる人はいないはずだ。
足し算なら、どこまで覚えていれば良いかは分かりやすいが、プログラミングの世界になると初学者にとってはそうではない。for文を書き方を調べたり、整数の定義の仕方を調べたり、という段階では、ちょっと応用的な課題が出てもまともに進まないのだ。
では逆に、「基本的なデータ型と基本構文をしっかり覚えましょう」と指導したとする。そうすると、今度は初学者は記憶一辺倒になり、覚えることはできても、応用的な課題になると「それっぽいコード」は書けるが、本質的には理解していないので上達は遅い。初学者にとっては、多くのエンジニアが覚えている「プログラミング言語のお約束」も、初学者にとっては膨大な量(に見えるの)であり、理解と記憶を両立させることができない。
ここに理解と記憶の「トレードオフ」が発生する。トレードオフに括弧「」を付けているのは、本来は同時並行的に進めることができるはずだが、プログラミング初心者に限っては、あちらが立てばこちらが立たず(=トレードオフ)の状態が発生してしまう事を指している。