C ++の基礎に苦労している学生の指導[非公開]


26

私は、最初のプログラミング言語であるC ++の基礎を学ぶのにかなり苦労している数人の生徒を指導しています。私は、最初のCSコースを失敗または脱落させた優秀で優秀な学生を多く知っています。私が指導している全員が、クラスでの彼または彼女の経験について同様の説明をします。インストラクターはあまりにも速く動きますが、講義では何も意味がありません。このCSクラスの前は、これらの苦労している学生のほとんどは、ワードプロセッサ、Webブラウザ、またはその他のエンターテイメント以外のものとしてコンピュータに興味を示していませんでした。コンピューターは機能するブラックボックスであるため、なぜそれを台無しにしますか?

私の最良の推測は、コンピュータサイエンスの抽象化とおなじみの概念との接続に問題があることです。つまり、これらの学生は数学、生物学、または物理学を学ぶ方法を知っているかもしれませんが、プログラミングに関してはそれらのテクニックは機能していません。

誰か提案やアドバイスはありますか?私が手伝っている学生は、このクラスに失敗するに値しません。インストラクターがこれらの生徒の学習スタイルを考慮していないことは明らかです。つまり、インストラクターは生徒ではなく失敗しています。


2
コメンター:回答がある場合は、回答として残します。コメントとして残さないでください。回答が既に追加されている場合は、投票してください。この質問のトピックについて他の人と話し合う場合は、チャットを使用します

1
しませんか?私の経験から、プログラムを作成する必要のある十分な人がいます

回答:


42

実際にすべての初心者が苦労することはいくつかあります。学生は、コードの書き方を学ぶ前に、コードの読み方を知る必要があります。

  • 命令型言語のシーケンシャルな性質。レシピのように、機能が順番に1項目ずつ実行されることを理解するのは困難です。これを克服する1つの方法は、デバッガーを介して動作するコードを表示することです。
  • =Cスタイル言語の代入演算子()は、非常に紛らわしいです。「aが5に等しい」ではなく、a = 5変数に5を割り当てる」ことを意味する非常に慎重に説明する必要があります。a
  • 初心者にとって、他の関数がジャンプできる構造化されたコードのブロックとして関数を記述することは安全です。また、C ++では、関数の引数が名前ではなく順序で識別されることを初心者が理解するのに苦労しています。
  • ほとんどの命令型プログラミング言語には、いくつかの宣言型コンポーネントといくつかの手続き型コンポーネントがあり、C ++も例外ではありません。コードの一部がプログラムの構造を説明し、他の部分(関数)がプログラムが何をすべきかを説明していることを生徒が理解していることを確認してください。
  • デバッガーを使用してプログラムをステップ実行することは、非常に重要でしばしば無視される教育ツールです
  • 式にはタイプがあります3+3は整数、3.5 + 3倍精度、"3" + "3"(C#では)文字列、x == 5 * 3 + 25ブール(またはC ++では整数)です。学生がこの概念に完全に満足していることを確認するために多くの時間を費やしてください。
  • 可変スコープは、初心者が常に混乱するものです。スコープがどのように機能するかを生徒に説明し、あるスコープでx定義されたものが別のスコープで定義されたものと異なることを確実に伝えxます。
  • すべての変数は、その存続期間中に少なくとも3回参照されます。宣言、割り当て(多くの場合、宣言と同じ行で行われます)、消費です。これらのいずれかが欠落している場合は、どこかに概念上の誤りがあります。同じ理由で、作業中のプログラムを分析している場合、変数の目的を理解するために、コードでこれら3つのことをいつでも調べることができます。
  • forループを使用した反復の適切な例が示されるまで、ループは教えられるべきではありませんwhile。簡単な構文は紛らわしいため、なぜwhileループを使用できないのかと学生に疑問を抱かせます。forループの観点からループを説明する虎の巻whileがあると便利です。
  • 配列とポインターは教えるのはかなり簡単ですが、学ぶのは悪夢です。つまり、クリックするまで練習が重要です。
  • コードはテキストであり、コンパイルされたプログラムは実際にはファイルであるという考え方は、初心者にはわかりにくいものです。必ずシェルで.cpp、.h、およびバイナリファイルを表示してください。

C ++のOOPコンポーネントはまったく異なるものであり、インストラクターがそこに到達しないことを願っています-OOPは、OOPになるように最初から設計された言語を使用して最もよく教えられるからです。私の経験では、C ++でOOPを教えることはうまくいきませんでした。


2
「人々は機能が順番に実行されることを理解するのに苦労していますか?」それは事実上誰も問題を抱えていないことそのものだと思います(手続きを始める前に機能言語をすでに学んだ人を除いて)。しかし、私はあなたが言う他のすべてについて同意します。
leftaroundabout

2
デバッガーでステップ実行する場合は+1を使用するため、プログラム自体とその実行の違いを把握できます。
マイクダンラベイ

4
@leftaroundaboutあなたは驚くでしょう。数学はほとんど宣言的であるため、命令型言語は代数を学んだ人をだれでも捨てることができます。
宮坂

2
この答えは、「概念をばらばらにする」だけのように思えます。コンセプトは間違いなく正しいものであり、確かに重要ですが、この方法で教えることは、道路の規則をたたいて運転する方法を誰かに教えることと似ています。
リウォーク

@ Stargazer712誰もが道路テストを試す前に、道路のルールを学習します。「練習が重要」、「創造的」、「論理的に考える」などのふわふわした大まかなアイデアを提示できましたが、これらのことは、ほとんどの生徒だけでなく、どのインストラクターにとっても非常に明白です。離散数学や言語理論などの抽象的なことをプログラミングの前兆として教えることもできますが、それはメカニズムが非常に複雑で直感だけでは問題を解決できない場合にのみ重要になります。遅かれ早かれ人々は禅になるのをやめて、コンテンツを教え始めなければなりません。
宮坂

19

以前にプログラミングを教えたことがありますか?

私は4年間、CSおよび非CS専攻にプログラミングを教えました。最初の学期、私の経験はあなたのようなものでしたが、いくつかのことを学びました。

私にとって空想的にシンプルに思えたのは、初心者にはまったく簡単ではありませんでした。

言語に関係なく、あなたは精神的な枠組みを整える必要があります。

  • コンピューターは一度に1つのことしか行いません。(並列処理とパイプライン処理があると言う人は誰でも、立ち去ってください。生徒たちが何かを知ったときに戻ってきてください。)コンピューターはほんの少しの異なることしかできません。コンピューターは非常に多くのことを実行し、瞬時に実行するように見えるため、私はこれを言っているだけです、初心者にとっては、彼らは一度にすべてを行い、あなたの心も読むように見えます。

  • 変数は重要です。変数の名前と実行時のその内容は、まったく異なるものであることを理解することが不可欠です。初心者はこれに苦労しています。「名前を入力してからHelloを言うプログラムを書く」と言うと、名前を保持するために変数が必要であり、変数の名前を考えなければならないことを理解する必要があります。自分自身にちなんで名前を付け、「入力」が何を意味するのか疑問に思う。

  • プログラムを作成/編集する時間と実行する時間には大きな違いがあります。最初の演習では、かなり頻繁にこのことを思い出す必要があります。

私が使用した言語は初心者向けの非常に単純なため、BASICでした。基本的なプログラミング機能のセットを構築した後、他の言語に移行することは難しくありません。

ボード上でプログラムを作成してから、「コンピューターをプレイ」します。つまり、現在のステートメントの横にXを配置し、手動で実行してから、Xを次のステートメントに移動します。変数は、現在のコンテンツを書き込むボード上の長方形でした。割り当てが発生すると、それを消去して新しい値を入力します。

私が開発したトリックの1つは、それぞれが4桁の数値を保持できる1000個のメモリ位置を持つシミュレートされた10進コンピュータでした。アキュムレータのロード、追加、保存、ジャンプなどの「オペコード」の小さなセットがありました。この「マシン言語」で小さなプログラムを書いて、それを動作させるためにシングルステップさせます。その後、変数、ジャンプなどの概念の説明がはるかに簡単になります。

お役に立てば幸いです。


シミュレートされたコンピューターのアイデアが好きです。正式な言語はありますか、それとも擬似コード/平易な英語でアイデアを話し合うだけですか?
宮坂

@Rei:Simpleと呼ばれるシミュレータを(BASICで)書きました。それはすべてキーボードインターフェースでした。ユーザーは「メモリ」に値を入力できます。その後、必要に応じて、シングルポイントで各ポイントのアキュムレータとメモリを調べることができます。それは彼らそれについて話しているだけでなく、それをやってもらうために、これは本当に重要だと思います。
マイクダンラベイ

ああ大丈夫。おかげで、私はそのような何かを試してみてください。
宮坂

これが私の意見で一番の答えになるはずです。
リウォーク

12

私の意見では、C ++は第一言語としてはやり過ぎです。

私があなたで、十分な時間があれば、Python(または同様の)を使用してプログラミングとCSの概念を紹介しようと思います。

概念が明確なとき、つまり基本的なデータ構造、インダイレクション、基本的なアルゴリズムなどに慣れているとき、私はゆっくりとC ++を導入し、彼らがすでに学んだことと非常に迅速に関連できるようになります。


2
私は同意しますが、教授には通常、教える言語を選択する権利がなく、TAはほとんどありません。
宮坂

4
Pythonには同意しません。私はC ++で最初のCS 101クラスを経て、PythonでCS 101を教える学校に切り替えました。Pythonの学生は、私たち全員が同じCS 201クラスを受講したとき、基本さえも混乱していました...しかし、すべてのC ++学生は優れていました。
オグマオシリス

@OghmaOsiris、率直に言って、私はPythonについて十分に知りませんが、あなたが目撃したのは、単純に自己選択バイアスの現れであったかもしれません。結局、C ++は一部の学生にとっては特に恐ろしいものです(特にプログラミングの経験の浅い学生にとって)。
ステファンBranczyk

@Oghma 201クラスは何でしたか?低レベルのものであれば、おそらくCを前提とする独自のブランチにする必要があります。
宮坂

1
@OghmaOsiris:うーん、私は反対しなければなりません、そうではありません、私が知っている限り、最初の言語は非常に有用であることが分かっているので、Pythonへの私の普遍的な切り替えの異なる経験を共有します(最初はJava no C ++でした)。個人的な経験は、一方が他方よりも優れているという愚かさ、つまり終わりのない火炎戦争だとは思わない。Pythonは、それはあなたの方法で取得していないために開始するのに最適なプログラミング言語であるかもしれないことにかかわらず、私が主張するかもしれない、それは実際にその良くないこと....多くの学生を取得するほとんどのプログラミング言語、
Trufa

4

ここに私がアドバイスするものがあります:

  1. 把握するために必要なすべての詳細を伝えます
  2. 詳細を理解しようと励ます
  3. 必要なときにいつでも詳細をコンパクトな形式で保存してください

基本的に、必要な詳細がすべて揃ったa4用紙を1つ作成することをお勧めします。すべての詳細を含むある種のリファレンスマニュアル。いくつかの本も役立ちます。たとえば、「Cプログラミング言語」-必要な詳細がすべてコンパクトな形式で利用できるため、本は非常に役立ちました。情報の圧縮は、すべての詳細を含むa4ペーパーの作成に必要な部分です。


3

プログラミングは、学生が遭遇する他の一般的なドメインとは大幅に異なります。大学に入る前の多くの学生は、単に授業に注意を払い、おそらく簡単な問題と本の裏にある答えでいくつかの宿題をすることで成功しました。プロセスを記憶してから作成することです。また、多くの生徒が繰り返し間違った答え(構文エラー、論理エラー、セグメンテーションエラーなど)を取得するのは初めてです。これは、プログラムに取り組むときの学生のモチベーションを損なうことがあります。

プログラミングで何が起こっているのかを真に知るには、多くの練習をする必要があります。よく見落とされがちなテクニックは、母国語が最初のものであれば何でも擬似コードを書き出すことです。問題のかなり詳細な解決策が見つかるまで、それを拡大し続けるように依頼します。次に、それを実際のコードに変換する問題。


3

私は大学にいたとき、他のコースの中でもプログラミングコースのイントロのチューターでした。あなたが説明している問題は珍しいことではありません。特定の役割が何であるかに応じて、異なるアプローチを採用することができます。

まず、これがクラスの学生の大部分に影響を与える広範な問題であり、アクセスできる場合は、学生が把握していない概念についての具体的なフィードバックでコースを教える教授にアプローチします。彼女は、その教材が学期中に再び登場するときに追加のレビューを組み込むか、将来の学期のカリキュラムを改善することができます。

ラボの時間に加えてコースのディスカッションセクションを教える場合、それは講義を混乱させるものについて説明し、それらをより具体的にし、基礎がすべて理解されていることを確認するのに役立つ素晴らしい時間です。

これらの生徒と一緒に働くのがチューターラボでの時間だけである場合、この時間を使用して、生徒に1対1で、または理解するために必要な概念的な構成要素を一度に数人教えることができます宿題を完了します。

彼らは授業でとても迷子になり、どこで立ち止まって質問するべきかさえ知らないかもしれません。その場合は、それらの基本に戻ってください。何が起こっているかを最後に理解したとき、彼らはコースのどこにいましたか?不明な場合、または「決して」理解されない場合は、最初に戻ってhello worldを説明し、変数とは何か、コンピューターが「指示」のリストを取得して、それらを順番に実行しますが、コンピューターは私たちほど「スマート」ではないので、非常に文字通りで、コンピューターが理解するために正確に正しいことなどを言わなければなりません。

それは実際、私が非主要なプログラミングコースで非常に頻繁に見た闘争とフラストレーションのポイントです。学生はいくつかのコードを書きます。それは「ほぼ」正しいように見えますが、その後、彼らはそれをコンパイルしに行き、それはエラー、非常に不可解なエラーを与えます。そして、何が悪いのか分かりません。そして、何時間もコードを見つめます。最後に、セミコロンの欠落や間違った場所にあるブレースのように、それが取るに​​足らないものであることがわかりました。その後、再びコンパイルしますが、まだエラーがあります。それは別の問題です。2回目に変数名を使用したときに、変数名のスペルが異なります。等々。そのため、友人や家庭教師、または誰かに助けを求め、頭の上から「ああ、これを追加するだけでうまくいく」と答えることができます。彼らの経験では、プログラミングは少し「神秘的」だということです

それは家庭教師としての領域であり、そこであなたは多くの手助けをする余地があります。フラストレーションのレベルに応じて、コードが機能しない理由を理解するのに役立つさまざまなアプローチがあるかもしれません。もし彼らがそれを手に入れているなら、私は彼らにヒントを与え、彼らが自分で理解するのを助けようとするかもしれません。しかし、彼らが欲求不満を捨てる準備ができているというロープの終わりにいる場合、私はしばしば彼らにいくつかの景品の答えを与え、少なくとも「この変更があなたのプログラムを修正した理由を理解しますか? ?」

一部の学生、特に非専攻では、優れたプログラマーになったりプログラミングを楽しんだりするために必要な詳細に系統的な注意を払っていない場合があります。あなたは彼らが詳細に注意を払うのを助ける戦略を通してそれらを手で保持し、それが彼らにとって挑戦であったとしても問題を解決するのに十分な方法でいることができます。

しかし、学生がコードを「適切に」インデントすることについては肛門保持的です。多くの場合、初心者プログラマーは、何の下にネストされているかに注意を払わないため、一致しないブレースなどがあるため、ネストとスコープに問題を生じます すべてのコードを適切にインデントし、中かっこが一致することを確認し、特に最初のエラーが表示される行番号の周りですべての行がセミコロンで終わることを確認するなど、「プログラムがコンパイルされないときにチェックするもの」のチェックリストを提供しますアップなど

早期にコンパイルし、頻繁にコンパイルするように指導してください。最小限のスケルトンコード(たとえば、hello world)を作成し、コンパイル/テストします。数行を追加して、再度コンパイルします。大きなバケツではなく、小さなバケツの変更だけを見ている場合、エラーを見つけるのがはるかに簡単です。

問題をより小さな解決可能な問題に分解する方法を学ぶのを助けます。これは、プロのプログラマが解決方法がわからないはるかに難しい問題を解決するのと同じことです。解決方法を知っているか、解決方法を学ぶための調査を行うことができる何かに到達するまで、それを細分化し続けます。「実用的なソリューションを実現するには、どのような手順を踏む必要がありますか?」さて、最初にスケルトンコードが必要になります(hello world)。その方法を知っていますか?はい、素晴らしいです。話し終わったら、それから始めましょう!次に、ファイルを入力として読み取る必要があります。第4章でそれについて読んだことを覚えていますか?あんまり?Hello worldを実行した後、それを見て、どれだけ近くで機能するようになるかを確認してから、折り返し電話してください。あなたがそれで立ち往生するとき、あなたはもう少しあなたを助けます。最初の数回は、問題を解決する方法の例から学習できるように、問題を解決するために必要な手順の番号付きリストを作成する必要がある場合があります。

クラスのすべてではなく一部を取得している場合は、クラスで質問することを奨励します。10人中9人が理解できない学生ではないため、教授はおそらく重要なことをただ単に説明しただけです。

彼らが1つのバグを見つめて「時間」を費やしているのに、それを把握していない場合、それは時間の無駄であり、多くのことを学んでいません。多くの場合、バグは洞察の問題であり、それを解決するための適切な洞察を考え出すことの問題であり、これらのタイプの問題に対するコツはありません。立ち往生したときに取る他の一般的なアプローチを提案します:クラス内の別の友人に助けを求めます(必要に応じてクラスメートと知り合いになります)。開講時間中にチューターラボで質問したり、教授のオフィスアワーに行ったりします。クラミングに慣れていて、暗記の対象に適している場合、フラストレーションの壁にぶつかるでしょう。記憶よりも問題解決に重点を置いたプログラミングに直面しました。教科書やstackoverflowなどから構文の例を調べる方法を見せます。もしあればプライベートクラスの質問フォーラムに質問を投稿するよう促します。

コードが機能しなくなる場所を絞り込む方法を教えます。実行されているものに戻るまでコメントをコメントアウトし、そのセグメンテーション違反が再び発生するまでゆっくりと追加します。

これらのアイデアの多くは、それらがたくさん出てきたら配布資料に変えることができます。ストラテジーは通常、教授が見過ごしている部分です。彼らは、構文、ループ、配列、I / Oなどの記述方法に時間を費やしています。しかし、コードを実行しても、コンパイルされないかクラッシュしますか?」

概念的なこと、特に「変数とは」や「ループとは」などの基本事項について 理解していないと、コースの残りの部分に追いつくことができなくなります。講義ベースのコースでは、教授はすべての質問に答える時間がないか、すべての生徒が電球を消すのを手伝う時間がありません。そして、それがチューターがプログラミングを学ぶためにとても重要である理由の一部です。特定のトピックを具体的にするために、追加の類推で個別の指導が必要になる場合があります。

あなたはC ++で教えているので、クラスは抽象的なトピックとして登場し、一部の学生は「取得」に苦労しています。多くの場合、クラスの抽象化は、「ATMマシン」などのランダムな実世界のオブジェクトに対応する例で教えられ、実世界のオブジェクトに対して類推が行われます。あなたはお金がどれだけ入っているかを追跡する変数を持っているかもしれませんし、特定の条件にどのように応答するかをatmマシンに伝えるルールのようなメソッドがあるかもしれません。 、他の学生は別の学生をよりよく理解します。

可能な限り、彼らのために絵を描いてください。彼らが書いているコードが何をしているかの全体像を見るのを助けるために、時間の経過とともに起こることのシーケンス図のように。ユーザーがこのボタンをクリックします。次に、プログラムはx、y、およびzを実行して応答する必要があります。それぞれが1つの番号のみを保持できる私書箱の束のような配列と、ボックスの前面にある「アドレス」を指す矢印のようなポインターを描画します。等。


2

プログラミング言語の素晴らしい選択肢の中で、この大学は非CS専攻のイントロCSクラスとしてC ++を使用していますか?才能のあるインストラクターの手で、それはリモートで考えられるかもしれませんが、なぜそれをそんなに難しくしますか?

大学のイントロ-CSクラスで「パスカル」を学んだとき、最初の3週間は「ロボットのカレル」で作業しました。これは非常にシンプルなサンドボックスロゴのようなプログラミング環境であり、Pascalで実行する前にすべての基本概念(再帰を含む)を徹底的に調査しました。「Karel the robot」では、簡単なコマンドの小さなセットを使用して2D空間でロボットを制御します。これにより、生徒は、次に何が起こるかを理解できる有用な具体的な根拠を得ることができます。

「ロボットのカレル」の役割を果たす、より現代的な教育用プログラミング言語が現在あるのではないでしょうか?しかし、おそらく今は生徒にとって遅すぎます。


アリスと呼ばれる同様のプログラムがありました。
オグマオシリス


@OghmaOsirisアリスリンクが壊れています。末尾には「URLに追加されました。
ズート・

ええ、それなしでエンディング「)」は切り捨てられました。
オグマオシリス

試してみてくださいen.wikipedia.org/wiki/Alice_(software%29関連するメタディスカッション:meta.stackexchange.com/questions/25706/...を
ズート・

2

言われたことに加えて、初心者は表面をひっかくだけでいいので、それに応じてカリキュラムを調整して複雑なことを避けます。

単純な問題を0にします(式を評価するなど)。

1つを理解する時間を与えます。

2人に答えを与えます。

3行ごとに回答を確認する

4-あなたの答えをattmptと比較するように彼らに尋ねます

この問題から教訓を引き出すように5人に依頼する

6-SAME問題にさらにステップを追加します(IFステートメントを必要とする条件など)

7-いくつかの問題について上記のタスクを繰り返します。それまでに、彼らは言語の基礎と環境の使い方を理解していたでしょう。次の準備が整います。

また、

-2クラスかそこらごとに自宅で試してみるボーナスの簡単な問題がある

-各生徒と交流して、生徒がそれ以上進むことを妨げているポイントを確認する

-簡単な参考資料を提供し、複雑なトピックや複雑な本を忘れる

-フィードバックを頻繁に取得して使用する

-クラスに来る前に、次のトピックの準備をしてもらいます


2

私がCS 101を経験したときに助けたのは、コードを見る前にロジックを学ぶことでした。「これはこれと等しい」ではなく「これは本当か間違っている」と考え始めるために、真理値表と前置詞の計算を行った。

すべてが私のためにクリックしたとき、まさにそこにありました。プログラミングは基本的にコアで真/偽の値を操作するだけであることがわかったら、それはすべて比較的単純になりました。

これにより、どの言語を使用しているかは関係なく、ロジックはどこでも同じです。構文は紛らわしいかもしれませんが、「OK、Obj CIではこのようなクラスにメッセージを送信し、C ++メッセージではこのように送信されました。しかし、アルゴリズムはまったく変更されていません。」等


2

ACMまたはIEEEの記事で、初心者(CSを卒業した卒業生でも)が上級プログラマーの後ろに座って問題をコーディングするのを見る必要がある理由について詳しく説明しています。

多くの場合、専門家は難しい問題のためにペアを組んでいます。生徒たちは頻繁に言わないでください。ペアリングの利点(キーボードを順番に使用):1.生徒は、自分が間違っていることをすぐに通知されます。インスタントフィードバック。2.学習者が教師を見るとき、学習者は教師が指摘するとは思わなかったことを取り上げます。

生徒に悪い慣行を開発させるのではなく、彼らは芽に挟まれています。(ここで#1を#2で反転し、生徒にインストラクター/ TAを最初に見させます)

パワーポイントスライドの静的セットを使用してCSを教えることは、プログラムを作成する一時的なプロセスにはあまり適していません。(関数を行ごとに成長させることでできるトリックがありますが、通常は厄介です。)

学習者は、どこで執筆を開始し、どこで停止してコンパイルするかを知る必要があります。私たちの頭脳はほとんど左から右、上から下に読むように配線されていますが、プログラムはまるで自分の冒険の本を1ページに詰め込んでいるようなものです!

多くの場合、初心者はプログラム全体をコピーしてからコンパイルします。プロフェッショナルであっても、すべての関数を空のままにしてプログラムをコンパイルし、作業スケルトンに繰り返し追加する必要があることに気付く前に、その方法で最初のクラックを与えるかもしれません。

また、関連するのは、CSをコンピューターなしで鉛筆と紙だけで教えるべきであるというばかげたアイデアです。これが最良の方法であると実際に採用しているプログラミングプロフェッショナルの数はどれだけか、それともCSインストラクターがコンピューターでの作業が好きではないので、CSインストラクターがそれを行うだけなのだろうか?写真からコンピューターを削除しようとする試みは、平均的なものです。そうすることで、プログラミングが本来よりも楽しく、インタラクティブになりません。パンチカードにデータを入力し、辛抱強く待っている日々を過ぎています。今日のプロの開発者は、すぐに満足するファンです。幸いなことに、ほとんどの学生もそうです。

明らかに、開発プロセスの前後に鉛筆と紙できれいなデザインを描くことは、プロと初心者の両方のプログラマにとって強力なツールです。これは、「キーボード上の手」の時間のようにペアリングに費やされるべきです!たぶんここで、生徒に教師を見る前に最初のラウンドを試みさせるのは理にかなっているかもしれませんが、それでも教師の本当の思考プロセスを見る価値はあります。

最後に、プロの開発者が採用しているホットキーと編集のコツは、学生の学習にとって「ノイズ」ではありません。最も重要なことは、彼らが学生を引き付け、興味を持っていることです。第二に、共通の開発ニーズに対する認識を高めます。さらに、これらのプラクティスの最も基本的なものは、多くの場合簡単に実行できますが、最初は明らかではありません。若い木材店の学生は、ハンマーの爪で釘を取り外す方法を簡単に学ぶことができますが、ほとんどの場合、まずそれが爪の目的であると言わなければなりません。非常に簡単なことのいくつかは、教えられずに学ぶのは簡単ではありません。プロの開発者でさえ、こうした「トリック」を常に忘れており、リシャーパーなどのリファクタリングツールを使用して、冗長なコードや未到達のコードなどを削除できます。


1
ところで、誰かがその記事のタイトルを教えてくれたら、ありがたいです!
デビッド

2

コンピュータプログラミングは、多くの場合、合格するために合成の認知スキルが必要な最初のコースの1つです。そのスキルを他の人に伝えるのは非常に困難です。使用可能なすべてのコンポーネントとそれらの機能を説明できます。他の人々が合成を使用してこれらのコンポーネントをより有用な全体に組み合わせた方法の例を多数挙げることができますが、生徒の心に「クリック」することなくできることは限られています。

私の経験では、ほとんどの場合、プログラミングを「取得」しない人々を排除するのは合成のスキルです。彼らは変数、関数、ループなどの部分を完全に理解していますが、「なぜ機能するのか理解していますが、そこにループを配置する必要があることをどのように知っていましたか?」習得するまで練習する必要があります。


2

アーロン・ヒレガスを間違えるために、彼らが愚かではないことを思い出させてください、それはただ難しいです。プログラミングはあなたの心を訓練するのが難しい、それはまったく別の考え方です、そして彼らは基本に苦労しているかもしれませんが、彼らはおそらく彼らがかなり気づいているので、かなり落胆させます。

これは、1年目のCSコースに失敗した人としても言います。以前は多くのプログラミングをして、すべての概念(VB、ええ、ベイビー)を取得しましたが、C ++はクリックしません。最終的に非常に基本に戻り、そこから作業し、クリックしましたが、誰かが「あなたはバカじゃない、これはただ難しい」と言っていたら、私の人生は楽になりました。


0

あなたは「これらの学生は数学、生物学、または物理学を学ぶ方法を知っているかもしれないが、プログラミングに関してはそれらの技術は機能しない」と言った。

これには理由があります。プログラミングには、他の専門分野が必ずしも必要としないもの、つまり創造性と... ファンタジーが必要です。「仕事で物事を想像する」能力。私は個人的に、このような要件は、専門学校(特に電子工学と電気機械学:特に、電気の流れと相互の制御を想像する必要があります)から来る人々から(より多くの正当な例外を除いて)より存在します「純粋な科学」(すべてが数学を好転させるように見える)よりも、それらを参照してください。

この最後のケースでは、「視覚認識」を支援する必要があります。概念とテキスト(タイプ->コンパイル->エラーを「読み取る」ことができない場合はエラーを確認できない)に焦点を当てるだけでなく、設計時に物事を視覚化する方法を提供することが重要です(マシンで何が起こるかをシミュレートすることにより、ホワイトボードと色付きのポストイットのセットを用意し、実行時に準備します。

この最後の部分を成功させるためには、オペレーティングシステムと「プログラムがマシンにどのように実行されるか」(および実際にそのマシンが何であるか)の本質的な概念を提供する必要があります。そして、威圧的なIDEを与えてはいけません。私は通常、「気を散らさない」ために多くのものを削除した「カスタマイズされたコードブロック」です。ライブラリーにリンクされるオブジェクトを生成するソースで作成されたプロジェクトの概念は、言語について話し始める前に与えられなければなりません。

C ++の従来のHello Worldでは、エントリポイントと出力デバイスが必要です。学生はすでにそれに精通している必要があります。この種のコースの成功は、最初の日にかかっています。プログラミングとは何かを理解させるために、コンピューター内部で何が起こるかを視覚化する必要があります。
残りは構文(科学)と抽象化(ファンタジー)です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.