なぜCSは記憶されるように教えられているのですか?[閉まっている]


23

私はこの1年間、高校でAdvanced Placement Computer Scienceを受講しています。ドキュメンテーションなどを使用する際のリソースフルかつ効率的な方法ではなく、単にコードと機能を暗記するように教えられているようです。

実際には、多くの(すべてではないにしても)プログラミングの仕事で、ドキュメントをめくる、過去のコードと他のコードをレビューすることができ、基本的には私の教師が「だまし」と見なすことを行うことができます。

コアコンセプトは(どんな主題でも)記憶するために不可欠であることに同意しますが、特にコンパイラー、デバッガー、リファレンスがある場合は特に、CSクラスの筆記試験を行うことは私にとって不必要で非現実的ですマニュアル、およびインターネット全体で、実際の作業状況で参照します。

ドキュメント、サンプルコード、デバッガーなどの使用方法や解釈方法などの有用なスキルを教えるのではなく、CS がコードと機能の記憶に重点を置いて教えるのはなぜですか?


34
CSはコードと関数の暗記ではありません。どこでCSを勉強していますか?本当の問題は、あなたが取っているコースががらくただということです。
アンドレスF.

1
@AndresF。OPは、高校生(大学の前)に提供されるコースであるAdvanced Placement Computer Scienceにあります。

3
@GlennNelsonおっと!誤解しています。OK、その場合:esqew:大学レベルでは、CSは(ほとんど)コードの暗記ではないことを知って安心します。しかし、多くのものを読む必要があります;)CS教育は、必ずしも仕事を見つけることではありません(おそらくそうだと思うなら失望するでしょう)
Andres F.

1
ほとんどの大学ではこの方法ではないことを知っておく必要があります。私の学校では、すべてのコンピューターサイエンステストは公開メモ/公開書でした。
ケーシーパットン

2
答えの一部がCSがプログラミング度でないということであることに注意してください。CSクラスからプログラミングを学ぶことを期待しないでください。プログラマーに関連する、基礎となるあらゆる種類の理論と概念を学ぶことを期待してください。確かに、あなたはいくつかのプログラミング言語を学び、基本的なプログラミングを少し教えられますが、主に、実際のプログラミングは、CSのすべてに集中できるようにするためのものです。周り。
-jalf

回答:


37

高校のクラスでは、習得への道の最も基本的なレベルにいます。あなたのクラスでカバーされるものは、プロのプログラマーが風邪を知っていると期待される種類のものです。多くの点で、これは「タイムテーブル」を学習することに似ています。もちろん、「現実世界」の設定で常に電卓をつかむことができますが、この暗記は、より複雑なタスクでスピードを上げるだけでなく、基本原則のより完全な理解を促進します。

たとえば、いくつかの並べ替えアルゴリズム、それらがどのように実装されているか、それらがどのように機能するか、いつそれらが最適に使用されるか、いつ使用されないかを知っている必要があります。これは常に調べることができますが、そうである必要はありません-数学者が6回調べる必要があるのと同じです8。


9
ソートアルゴリズムの基本的な性質を知っている必要がありますが、バブルソート以外のものを書く機会があったので約15年が経ちました。(非常に小さいNの場合は、より良い答えです。)
ローレンペクテル

1
すべてのコンピューターサイエンスのクラスがこれほど良いと言えるといいのですが。私の高校では、彼らはjavaの基本的な構文を教えました...通年。クラスの多くは、バブルソートとダイクストラのアルゴリズムの違いを説明することさえできなかったとき、「プログラマー」であると自慢していました。
ダニエルグラツァー

2
例として、辞書で任意の単語を検索できることを考えると、理論的には、meansoneに関するこの記事を理解できるはずです。しかし、私たちの脳は、限られた数のネストされた理解不能しか処理しません。
ベンジョー

1
そして、驚いたことに、自分のタイムテーブルを記憶することは、まったく役に立たなかった。平均的なソフトウェアエンジニアがソートアルゴリズムの実装に費やす時間はどれくらいですか?ああ待って-おそらく約0。環境が提供するソートでは十分ではないという非常にリモートの偶然でも、1人の男がより適切なアルゴリズムを書く必要があります-彼はWikipediaのようなもので些細な情報を選択して実装することができます最適なアルゴリズム-そして、あなたは残りの時間のためにそれを再利用することができます。
-DeadMG

2
@kaoD:そして、参照を記憶することは、その少しの助けにはなりません。何も工夫する必要はなく、ただのコピーペーストです。メモリからの回答とウィキペディアからのコピーと貼り付けの唯一の違いは、1つはRAMに保存され、もう1つは脳に保存されることです。まだコピーアンドペーストです。
-DeadMG

14

通常、教師は理解をテストする他の方法を知らないため、この方法で教えられます。あなたの気持ちは、このように教えられることは価値がないという点で完全に正しいです。一般的な人々の教育方法は必死に改革が必要です!

人生は良くなりますが、少なくともUIUCでは、CSクラスのレベルが高くなるほど、説明する試験の指向性が低くなり、私のコースの大部分では、すべてのがらくたのチートシートが許可されています。実際にコンピューターの前に座っていたらグーグルで検索したでしょう。

そうは言っても、クラスで上に行くほど、彼らが実際に言語や何かを実装する方法についてあなたに教えることは少なくなります。実際、私は彼らが実際にプログラミングについて何かを教えてくれたクラスを1つしか持っていませんでした。それは主に抽象的な数学的概念であり、私たちは自分でプログラミングの部分を理解することが期待されていました(彼らがいつも助けて喜んでいたが、これは試験ではありません)。


2
アーメン+1。私は大学レベルでプログラミングを教えていましたが、私の目標は、生徒たちを可能な限り迅速に動かして、独自のプロジェクトを行えるようにすることでした。教師が「正しい方法」で物事を記憶したり実行したりするものとして扱うとき、私はそれを嫌います。私がやろうとしたことは、生徒自身の創造性を発揮するのに十分なスキルを身に付けることでした。
マイクダンラベイ

...私は非常に頭がよく、暗記が得意な学生がいました。プログラミングを覚えるのではなく、プログラミングを学ぶためにプログラムを書く必要があることを伝える前に、1〜2回のテストが必要です。
マイクダンラベイ

聞いて聞いて!面白いです、成長して、私は学校で決して良くありませんでした。悪いACTスコア、悪い成績など。しかし、CSに導入されると、すべてが理にかなっています。確かに特定の分野で苦労していますが、CSクラスで学んだ概念を理解することによって、私が妨げていることを克服することだけを学びました。
rudolph9

10

学校教育が教育に干渉しないようにしてください。

- マーク・トウェイン

私はメキシコ人です。メキシコでは、少なくとも公教育では(どのレベルでも)教育にぴったりの場所ではないからです。

まあ、私のキャリア(CS)の途中で、あなたが感じているのとまったく同じように感じるので、私は自分で学習を開始し、1年間学習アルゴリズム、Linux、スクリプト、私のコンピューターの仕組み、少しリレーショナルデータベース、html、cssなど(ほとんどすべて)。そしてもちろん、私は学習するためにクラスをスキップし*、成績を落として*、1年後に卒業*しなければなりませんでした。

その年の後、「通常の」ルーチンに戻り、通常のクラス、宿題、試験、プロジェクトに戻ります。クラスはまだ退屈で、学ぶために新しいものは何もなく、すべて同じでした。そこで私は、UVAジャッジオンラインコードシェフプロジェクトオイラーなどのプログラミングコンテストサイトに参加することを決めました。その後、MITオープンコースウェアでいくつかの講義を見ました。

教訓:物事を起こさないで、物事を起こさせます。学習方法に満足できない場合は、変更してください!

*私が下した最も賢明な決定ではありません。


4
「物事を起こさせないで、物事を起こさせてください」-生きるための言葉があれば、それは!
GrandmasterB

+1の見積もり。私は<ほとんど>残りの答えを読む必要はありませんでした
チャン

3

記憶しようとしているものに依存します...

たとえば、数学を勉強するには、代数に精通している必要があり、方程式を単純化するために代数操作の実行方法についてかなり創造的である必要があります。しかし、これらの興味深い部分に集中できるようにするには、特定のビルディングブロックを記憶しておく必要があります。たとえば、乗算表を暗記しなければなりません。また、それらの恒等式を使用するために方程式を操作する方法を認識できるように、恒等式をいくつか知っている必要があります。

コンピューターサイエンスを研究するには、基本的なビルディングブロックのデータ構造とアルゴリズムに精通している必要があります。これらをより高いレベルの問題に適用する必要があるからです。たとえば、現実世界で独自のリンクリストの実装を記述することはほとんどありません。ライブラリで提供されているものを使用するだけです。しかし、リンクリストの実装方法と独自の実装方法を知っていれば、より高いレベルの問題で作業を開始するときにリンクリストを使用する場所と使用する場所を判断できます。同様に、独自のバイナリ検索関数を記述することは決してありませんが、データベースがインデックスを使用できる場所とできない場所などについて推論できるように、その機能を理解することが重要です。

いくつかの基本的な構成要素が記憶されると、ドキュメントの解釈などの作業がはるかに簡単になります。ドキュメントは、リストが使用されていることを示し、これは挿入がO(1)であり、検索がO(n)であることをプログラマが暗黙的に知っていると仮定する場合があります。また、ビルディングブロックは長期にわたって非常に安定しています。数年ごとに新しいデバッガを使用する可能性が高く、キャリア全体で同じバイナリ検索を使用する可能性があります。


リンクリストを使用する場所と場所は、さまざまな操作の複雑さやメモリパフォーマンスなどに基づいています。これらのいずれかを知るために実装する必要はありません。データベースはどこでバイナリ検索を使用できますか?比較方法がわかっているキーの場合。まあ、それは簡単でした。
-DeadMG

3

「有用なスキルを教えるのではなく、暗記に焦点を当ててCSを教えるのはなぜですか」-暗記を少々割引きすぎていると思います。デバッガを使用してコードの記述、ドキュメントの解釈を練習する必要があるのと同様に、暗記も練習する必要があります。

APIリファレンスに頻繁にアクセスしたり、多くのデバッガーコマンドを検索したりする必要がない場合、どれだけ効率的になるか驚くかもしれません。

高校で学んだ最高のことの1つは、クラスでメモを取ったことがない友人を観察することでした。彼の主張は、何が重要かを覚えているということでした。私は同じことを始めて、それが私の暗記スキルを向上させたと思います。それは、それらのすべてのAPIリファレンスが手軽に利用可能であっても、毎日非常に役立つと思います。


2
APIを調べる必要がないのは、APIを正式な教育として教えるのではなく、実践を通じて行われます。
DeadMG

@DeadMG:他のすべてと同じように、より多くのものを覚えることができるようになるには練習が必要です。特定のAPIを覚えておくことは、それ自体が目標ではありませんが、頭を訓練して情報を保持する手段であるため、頻繁に調べる必要はありません。そして、APIだけについて話しているのではなく、もう1つ覚えておくことができれば、Google / MSDN /別のソースファイルへの移動が1回少なくなります。 。
DXM

その特定のAPIで練習します。一般的に物事を覚えていません。そして、教育に費やされる時間は、専門的な時間と比較して小さな脚注です。
-DeadMG

2

ペンと紙の試験は、目標が手元の対象の完全な理解をテストすることである場合、実際に意味をなします。私はほぼ10年前にComputer Science AB試験を受けましたが、ペンと紙の方法に同意します。

ターゲット言語で実装コードを記述する方法を推論できるように、コンピューターサイエンスの下位レベルで学習するアルゴリズムを十分に知っている必要があります。学生は、ほとんど正しい構文で手作業でコードを書くこともできるはずです。私たちは皆セミコロンや括弧を時々見逃しています:)。また、有用なIDEから推論することなく、デバッグと設計のスキルをテストできます。

学生がこれを行うことができない場合、彼らはそのトピックの習熟度を持たず、たぶん単に親しみを覚えているだけです。


-1:すべての手書きの構文的に正しいコードは、その人がコンパイル可能なプログラム(おそらく最も遅いコンピューターよりも約100万倍遅い)を書くことができることを示します。さらに悪いことに、彼らは良い記憶を持っているだけで、おそらく尋ねられればシェイクスピアを暗唱することができます。開発者としての人のスキルを示すのにはほとんど役立ちません。
-mattnz

この回答は、提示された意見の理由を示していません。なぜ誰かが自分の好きな言語でソートアルゴリズムの実装を書くことができるのですか?
DeadMG

ポイントは、この人物が優れた開発者であるということではなく、クラスで教えられているコンピューターサイエンスの資料を知っているということです。学生が関数をグラフ化する方法を教えられている場合、その学生が試験でそれを行うことを期待するのは合理的です。良いテストは、このデータ構造に複数のキーを使用してバブルソートを実装するなど、概念的な理解を必要とする質問をすることで暗記を打ち負かしただけです、または、この検索疑似コードとバイナリ検索の違いを説明しています
ピータースミス

-2

私の経験では、暗記は簡単な練習で行われ、それを教える必要はまったくありません。さらに重要なことは、このアプローチは、何をしていても実際に覚えておく必要があることだけを記憶することを意味します。いくつかのアルゴリズムの実装を記憶するのに費やした時間は、他の原因により専念できます。

結局のところ、なぜアルゴリズムの作成を練習する必要があるのでしょうか?あなたが一度それを書くたら、あなたも他の誰かがすでに選択した言語のために自由に利用可能な実装を書かれていないことを非常にリモート機会にすべての、時間のためにそれを再使用することができますし、ご使用の環境がすでに提供していないこと並べ替えなどの単純なアルゴリズムの大部分では、ほとんど使用されないアルゴリズムです。そもそもやらなければならない可能性が非常に低い場所で何かを実践しているとしても、たとえそれを行ったとしても一度だけやらなければならないということはありませんか?時間の貴重な使用ではありません。

Heapsortについて知っておくべき重要なことは、Heapsortを実装する方法ではありません。それは、最良の場合と最悪の場合の操作の複雑さ、および同様のものです。しかし、驚いたことに、Wikipediaにはこの情報を即座に提供する便利なダンディテーブルがあります。繰り返しますが、その知識を持っていることに価値ありません。今から時間の終わりまで、実質的に無料で、いつでもすぐに利用できます。では、なぜそれを暗記したいのでしょうか?無意味です。

私の経験では、生徒に何かを暗記するように要求する理由はまったくありません。参照元から回答できる質問をしている場合、回答できる価値がない場合に質問していることになります。


2
ジー、みんな、あなたのダウン票やそのようなことをわざわざ説明しないでください。--DeadMG
12:52

ヒープソートを知る必要があったのは、変更可能な優先度キューが必要なときだけでした(ヒープソートは優先度キューとして最適です)。既知のアルゴリズムを適応させることができるのは、それらの実装方法を知る正当な理由です。
デビッドソーンリー

@David:ヒープソートの仕組みを知る必要はありません。並べ替えアルゴリズムを使用した実装で問題ありません。
-DeadMG

その特定の場合ではなく、そうではありません。すでに過剰な負荷がかかっている可能性のあるシステムで、多くのイベントを頻繁に処理する必要がありました。そのプロジェクトには効率が必要でした。コンテキストについては、それはかなり長いキャリアの中で一度起こったものであり、長い間私の並べ替えはすべてSQL ORDER BYやC ++のstd::sortファミリのようなものでした。
デビッドソーンリー

@David:したがって、すべてのプログラマーが必要とするものではないことをお勧めします。
DeadMG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.