私は大学にいたとき、他のコースの中でもプログラミングコースのイントロのチューターでした。あなたが説明している問題は珍しいことではありません。特定の役割が何であるかに応じて、異なるアプローチを採用することができます。
まず、これがクラスの学生の大部分に影響を与える広範な問題であり、アクセスできる場合は、学生が把握していない概念についての具体的なフィードバックでコースを教える教授にアプローチします。彼女は、その教材が学期中に再び登場するときに追加のレビューを組み込むか、将来の学期のカリキュラムを改善することができます。
ラボの時間に加えてコースのディスカッションセクションを教える場合、それは講義を混乱させるものについて説明し、それらをより具体的にし、基礎がすべて理解されていることを確認するのに役立つ素晴らしい時間です。
これらの生徒と一緒に働くのがチューターラボでの時間だけである場合、この時間を使用して、生徒に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つの番号のみを保持できる私書箱の束のような配列と、ボックスの前面にある「アドレス」を指す矢印のようなポインターを描画します。等。