必須の入門プログラミングコースにコンピューターサイエンスの学生がいて、プログラミング言語を魔法の呪文のセットと見なします。これは、何らかの効果を得るためにキャストする必要があります(ソリューションのアイデアを表現するための柔軟な媒体と見なすのではなく) 。
問題の本質を考慮せずに、以前の似たような割り当てからコードをコピーアンドペーストする傾向があります。
これらの学生が、書くコードの各部分の構造と意味を理解することができ、また理解する必要があるという自信を高めるための演習や類推はありますか?
必須の入門プログラミングコースにコンピューターサイエンスの学生がいて、プログラミング言語を魔法の呪文のセットと見なします。これは、何らかの効果を得るためにキャストする必要があります(ソリューションのアイデアを表現するための柔軟な媒体と見なすのではなく) 。
問題の本質を考慮せずに、以前の似たような割り当てからコードをコピーアンドペーストする傾向があります。
これらの学生が、書くコードの各部分の構造と意味を理解することができ、また理解する必要があるという自信を高めるための演習や類推はありますか?
回答:
それらに一連のエクササイズを提示することができます。各エクササイズは、問題に追加の要素やひねりを加えながら以前のものを構築したり、別の観点から問題を調査したりします。 。これにより、既成のコードをコピーアンドペーストするだけでなく、各ソリューションについて考え、分析し、修正し、実験する必要があります。
もう1つの可能性は、厳密にはプログラミングタスクではありませんが、さまざまなことを見積もるように依頼することです。たとえば、1秒間にミシシッピデルタを流れる水はどれくらいですか?そのような質問には、特に説得力のある(範囲の)値を得るために特定の仮定をする必要があるため、決まった答えがありません。そして、これらの「古典的な」ものの多くに対する答えは確かにグーグルで検索できますが、ネット上のどこにも(まだ)見つからない新しいものを簡単に作ることができます。
これら両方の種類のエクササイズの例は、たとえばJon Bentleyの「Programming Pearls」にあります。また、Pragmatic Programmerにはいくつかの良い課題があります。
3番目のタスクは、(1つ以上の)バグを含むコードを提示し、それらを見つけて修正する必要があることです。これにより、分析スキルとプログラムが実際にどのように機能しているかについての理性を使用するように強制されます。
ビリー・オニールによるコメントからのフィードバック:
「一連のエクササイズ」の問題は、以前のエクササイズに問題がある学生は、残りのエクササイズのために完全に台無しになることです。
あなたは正しいですが、これはコースの難易度を適切なレベルに設定し、同じようなスキルレベルの学生をグループ化するという一般的な問題に関するものだと感じています。さらに、問題と解決策について話し合い、議論し、一緒に問題を解決する必要がある生徒を小さなグループに配置することができます。誰かがそれを受け取らなかった場合、他の人が助けることができます(このセットアップはチームワークのスキルも改善します)。そして、誰かが怠laになり、他の人にすべての仕事をさせようとすると、教師は必ず気づきます(学生は周りのラップトップでWoWを演奏せず、歩き回り、生徒を監督し、指導することになっています;-)
また、異なるスキルレベルの学生に対応するように演習を調整することもできます。初心者は遅くなり、経験豊富な人は速くなります。
あなたは自分の学生のバランス行為戦っている被写体を気にする必要性を、その合格成績を取得する必要があります。多くの学生はそれを感じます:
学生が自分の時間や成績が危険にさらされていると感じるとすぐに、興味深い科目であっても、学習をやめて「気にせず、先生に正しい答えを与えるだけ」にジャンプします。生徒たちは、問題についてできる限り考えずに、コピーして貼り付けるだけでそれをハッキングすることで、コーナーをカットしようとしています(または、そう考えています)。
これに対処する方法に関する私の提案は次のとおりです。
&&それがビットごとの操作として成功するかもしれないと思うけれども、それはそうあるべきです。
私の頭に浮かぶいくつかのこと:
実際に他の誰か(あなた)が書いたコードを説明しなければならない場所に割り当てを与えます。以前のコードを理解すること、またはより具体的にそれがないことは、貨物カルトプログラミングの最大の原因であり、危険でもあります。必要に応じて1行ずつコメントを使用して、プログラムをわかりやすい英語(または使用する人間の言語)で説明するよう依頼します。
コードを説明した後のみ、特定の変更を加えるために変更を依頼します。たとえば、降順で並べ替える並べ替え関数を指定した場合、昇順で並べ替えるように依頼します。またはより厳しいもの。ただし、特定のコードを理解する必要があるものであることを確認してください。
必要に応じて、イースターエッグをコードに入れることができます。問題にまったく役に立たない、またはまったく問題に関係しない行または2行。そのような線が存在するというヒントを与え、それらを削除する人に余分なポイントを付与します。
その後、初めて自分でコードを一から作成する割り当てを与えることができます。この時点で、彼らはコードが実際に何であるかをよりよく理解するはずです。彼らはそれを自分でやる方が少し簡単だとさえ感じるかもしれません。
基本的な考え方は、プログラミングはコードを書くだけでなく、読むことでもあるということです。コードを読むことも教えてください。
別の方法で見てください。この貨物カルト現象は、スキル獲得のドレフュスモデルの初心者段階です。これが私たちが学ぶ方法です。私が最初にプログラミングを学んだとき、私がしていたことは、Computeの後ろからコードのページを入力することだけでした!マガジン。繰り返しが重要です。赤ちゃんは、両親が作る音をコピーして話すことを学びます。私たちが学ぶことはすべて模倣です。模倣から習得へと進む方法を教えなければなりません。
あなたが持っている問題はあなたの学生が何も繰り返さないことであり、彼らはインターネットからそれをコピーしているということです。それにはいくつかの利点がありますが、利益はわずかです。実際にコードを入力する行為は、理解の場所に私を導いたものです。私はタイピングしているもののパターンを見始め、私がしていることの理解を得ました。
1つのオプションは、ラボをコード道場として構成することです。同じ問題について、生徒に交互にペアリングさせます。解決するのに約10〜15分かかる問題を選択します。いくつかのラボでその問題を繰り返し、クラスの習熟度が上がるにつれて、問題に新しいひねりを加えます。おそらく、ソリューションをプログラムするのを生徒に見てもらい、それを繰り返してもらうことで、ラボを開始します。反復ごとにペアを切り替えます。
テストには、各学生がクラスの残りの前で学期からの問題を処理するコードカタがあります。正しさだけでなく、形と創造性にも注目してください。これにより、持ち帰りの課題を与えるよりも、プログラムの方法をより深く理解できると思います。
私は過去に入門クラスを教えてきましたが、今振り返ってみると、
一部の学生は、プログラミングはさまざまな理由でそのようなものだと考えています。私はかつて、私がしたことをたくさん積んでいた良い子供を覚えています。
それは孤立した問題ではないが、同じクラスの他の生徒は同じような行動をしている、または問題に近づいていて、それを表現していないかもしれないと信じて、私はいつもクラスに取り組んでいました。
決定論などのいくつかのことを説明するのに時間がかかりました。つまり、同じ環境で同じデータとコードを使用しても同じ結果が得られることを意味します(「ランダム性」を排除します)。
問題解決は生徒の行動に依存するものであり、他の問題ではないため、問題の解決に注意を払うべきであり、正しい呪文を見つけることはできません。
彼らは教育環境にあるので、学習体験を提供するために問題が作成され、結果はプログラムする方法を学ぶことです(または、システム管理者のためのクラス、プログラムがどのように機能するかなど、場合によっては異なります)解決策をください。(「世界は別の計算機を必要としない、それは練習問題です」)、利用可能な資料(例:提供されたメモ)で問題を解決できます。
私はそれがコード完了にあると思います:「コピーして貼り付けても、コードはあなたのものです」。誰かがそれをした場合、それは貨物スタイルであってはなりません。すべての行は、私(個人)または別の生徒(同じ)またはクラスに説明する必要がありました。
あなたの学生がいました起動時に正しい「抽象レベル」のコースの初めに?たとえば、コードを1行も書かずにループや条件などの主要なプログラミング構造を紹介する宿題ですか?
プログラミングのイントロを取得したとき、最初の割り当ては「Rick the Robot」と呼ばれていました。銀行、食料品店などの興味深いポイントがある都市の航空写真を掲載した紙を用意しました。 「正しく見える」、「道路を渡る」、「繰り返し」や「何かあれば、何かをする」などを使用できます。(この割り当てを見つけることができなかったため、これは100%ではありません)アイデアは、Rickが与えられたもののみを使用でき、マップ上の別の場所に到達する必要があるというものでした。
これは楽しいエクササイズであり、基本を紹介したものです(初心者にとっては難しい場合があります)。この問題(ゲーム)に対する適切な答えは1つもありません。また、コピーして貼り付ける方法もありません。このようなことにより、コードを威圧することなく、彼らの創造性をもう少し試すことができます。
最後に、アイデアは、抽象から始めて具体的な方向に向かっていくというものです。貼り付け要約をコピーすることはできません。彼らは問題を解決するためにそれを理解しなければなりません。
while not at-corner do take-one-step end。変数やデータ型のようなものを「埋め戻す」ことなく実際のコードに移行する方法を見ていませんでした。おologiesび申し上げますが、私の反省は反省について少し厳しいようです。
彼らに求めているのは、現在ブルームの分類法の認知領域で分析と統合を実証することです。そこでは、現在、アプリケーションのみを実証しています。
残念ながら、それは一種の「馬を水に導く」タイプの状況です。理解と分析にまだ苦労している場合、分析と合成も非常に困難です。適切な理解がなければ、分析と統合の活動は学習活動よりも雑草のように振る舞います。
私の個人的な意見では、プログラミングクラスのイントロのアプリケーション以上のものを期待しないでください。学生がこれらの概念に触れたのはこれが初めてなので、子供にエッセイを書く前に読むことを教えるようなものです。それらの高次のスキルは、後のクラスで続きます。
if文がどのように機能するかを知り、先に進む前に独自に文を書くことができる必要があります。認知部分を機能させてから、アプリケーションに進みます。
最初から何らかのコードを提供することを検討しましたか?空のメイン関数のように、割り当てに必要な単純な足場は何でも(使用している言語がわかりません)。コンパイルして実行し、何もしないもの。その後、少なくともその一部が機能するというある程度の自信を持ってコードの追加を開始できます。
これは実際には「現実の世界」ではかなり一般的です。多くのIDEやその他のツールは、典型的なライブラリ/テンプレート/構成ファイルがすでに配置された空のプロジェクトを作成します。
あらゆる種類のカーゴカルトの考え方(カーゴカルト自体を含む)は、関連する技術の基本的な理解の欠如に由来します。
貨物カルトプログラミングは、問題のある習慣と考えるべきではなく、プログラマが直面している根本的な混乱の症状と考えるべきです。
さらに重要なことは、生徒の理解不足が単に自信不足の結果であるという仮定は根本的に見当違いであり、根本的な問題に対処していないことです。
代わりに、学生のコピーペーストプログラミングスタイルは、この学生が期待することの複雑さに圧倒されていることを伝える赤い旗である必要があります。
彼は現在のプロジェクトを構築するための足場として過去の仕事を本能的に使用しており、以前に解決した問題を構成要素として使用してソリューションを構成しようとしています。私たち全員はある程度これを行いますが、私たちのほとんどは、過去の仕事から得た知識をビルディングブロックとして使用してこれを行います。この生徒は代わりに作品自体を使用しています。つまり、彼は自分が作業しているブロックを本当に理解していないことを意味します。彼は彼の理解が許す限り作業を分解し、それらがどのように機能するか理解していないため、大きなコードブロックをアトミック単位として扱います。彼は彼らが何をするかを知っているだけです。
プログラミングの世界では、登場するすべてのソリューションに対して新しいプロジェクトを実際に作成することはめったにありません。ほとんどの場合、古いものを変更します。
プロジェクトのアイデアを、割り当てごとの1つのソリューションから学期全体の1つのソリューションに変更します。各割り当ては、以前の割り当てに基づいています。
プロジェクト:エレベーターシステムの構築
ポイントは、新しいタスクのために古い割り当てをリサイクルするのではなく、以前の割り当てに基づいて構築することです。
最小限の定型コードを必要とする非常に高レベルの言語の使用を検討してください。
私にとって、多くの場合、魔法のように感じて理解を妨げるのは、大規模なフレームワークまたは冗長言語の定型コードです。
私はCS入門プログラミングコースで個人的にMLを教えられました。長年にわたり、LispはMITのプログラミング入門として教えられていました。どちらも優れた選択肢です。彼らが持っている利点のいくつかは
80年代の初心者プログラマーの問題に関する調査を行いました。今日の初心者プログラマーでの私の経験に基づいて、あまり変化はありません。初心者には、コンピューターが実際に行うことの有用なメンタルモデルがありません。機械自体が魔法であるため、彼らは魔法の呪文に頼る。
プログラミングでは、自然に単純なタスクを不自然に小さなステップに分割する必要があります。初心者は日常生活でこのような細かい粒度を処理しないため、特にマシンがどの小さなステップを使用可能にするかが明確でない場合、小さなステップが何であるべきかを理解するのは困難です。しかし、たとえそれを理解できたとしても、リモートコントロールによってミステリーマシンを制御するプログラミング言語(準自然言語を装った不自然な言語)のスティルト構文と限定されたセマンティクスに直面します。
問題に対する論理的な解決策とマシンの機能とを結び付けることができないため、言語の要求を満たすことに焦点を当てています。最初の目標は、コンパイルする何か-何でも-を書くことです。2つ目は、そのプログラムを実際に調整して、クラッシュしないようにすることです。次に、時間、エネルギー、関心がある場合、問題に必要なものに似た結果をプログラムで生成しようとします。途中で、誤って適切に記述されたコードを生成する場合があります。
おそらく、プログラミングを学んだ初心者は、意図的にコンピューターのメンタルモデルを与えられて内部化されたからではなく、コンピューターの有用なメンタルモデルを推測したから成功します。
書面による回答が必要なコードについて質問することができますか?「このコードは何をしているの?」「プログラマーはなぜこのように解決したのですか?」「もっと良い方法はありますか?」など?
それは実際に彼らに問題について考えさせます。それは彼らがコードに触れることさえなしにできることです。
JoelFansのアイデアに似ているのは、作成した疑似コード(言語)を使用して、紙の上で最初の割り当てを行うことです。適切な構造を追加することができ、マジックボックスについて心配する必要はありません。
「カーゴカルト」とは、必要だと思うものを挿入するという意味ですが、実際には問題の解決にはまったく何もしません。
その場合は、簡潔さに基づいてグレーディングに何らかの要因をいつでも追加できます。プログラムに不要なコードや冗長なコードを残しておくと、将来的に問題が発生する可能性があります。
彼らは英語のクラスの作文演習でも同様に判断されます-ランダムな接線で消えたり、ポイントに到達せずに一般的にとりとめのないものを望んでいる人はいません。
アセンブリクラスを受講したとき、先生は各エクササイズで、速度、サイズ、またはメモリ使用量のコードを書きたいかどうかを教えてくれます。ために。
...
以前の同様の割り当てからコードをコピーして貼り付ける場合、実際には新しい問題を解決するものです...まあ、それは単にコードの再利用であり、再利用のためのコードの適合性について悪い仮定をしない限り、彼らが行うことは完全に合理的だと思います。(たとえば、ファイルからの読み取り、入力のプロップ...再利用可能なすべてのモジュール部品。それらを実行したくない場合は、演習を異なるものにする必要があります。
残念ながら、それが多くの人々の脳の働きです。だから、あなたがこれを「治す」ことができない人がいるというこの理解に入る。プログラミングに必要な精神的な精度のレベルで働くことができない多くの人々がいます。一部の人々は単にそのために設計されていません。私は学生をあきらめることを言っているのではありません-誰もがそれを拾わないとしても、あなたが失敗していると仮定してはいけないと言っています。
クラスのコンテキストについて詳しくは知りませんが、これらの問題のある学生は、非常に基本的な構造(単純な if / then、ループなど)にもっと焦点を合わせます。奇数、10個ごとの番号などを出力する単純なルーチンそれぞれ10行以上のコード。それらが「魔法の思考」である場合、彼らは明らかにそれらの基本をまだ習得していない。何が起こっているのかを把握するまで、多くの異なる単純なルーチンを実行させます。他の誰かがコードを紙に書くことについて言及した-私はそれがこれらの簡単なルーチンを行う素晴らしい方法でもあると思う。
また、フローチャートを学習させることも検討できます。一部の人々にとって、アルゴリズムのフローを確認し、それがどのようにコードに接続するかは、コードをフローに接続するのに役立ちます。
アリスター・コバーンは、シュウ-HA-Riをの概念とどのようにそれはプログラミングに適用さについて語っhttp://alistair.cockburn.us/Shu+Ha+Ri。学生がこの連続体のどこにいるかを頭に入れておくことは重要だと思います。まず、それはあなたの欲求不満の一部を緩和するのに役立ちます。コピー/模倣は非常に自然な反応であり、最初に何かを学び始めたときに受け入れられるモードです。第二に、それはあなたが前進する方法のいくつかのアイデアを得るのに役立つかもしれません。たとえば、複数の方法(ループと再帰、コンソールとweb / gui)で解決できる問題を選択することを検討し、最初にそれを明示的に解決し、次に別の方法で解決することをお勧めします。正当なコードの再利用、コンポーネント化、再利用可能なライブラリの作成などについて
私が使用したもう1つの成功した方法は、相互にビルドする一連のプロジェクトを作成し、割り当てられた後の各ステップでデフォルトの作業バージョンを使用可能にして、人々が遅れないようにすることです。プロセスの各ステップでは、新しいものを導入する必要があります。プログラミングクラスよりもデザインクラスの方が簡単かもしれませんが、それでも実行できるはずです。これの良い点の1つは、各ステップでそれらと比較するために、適切な(できれば)実装を明示的に与えることです。この比較を割り当てとして公開します。つまり、努力に対して自分のコードのミニコードレビューを行います。これをいくつかの追加クレジットオプションの1つにしたい場合があります。
私は通常「コメント」についてはあまり好きではありませんが、コードのドキュメントを成績項目の1つにしたいと思うかもしれません。各プロジェクトの「動作理論」ドキュメントを作成してもらい、各プロジェクトのアプローチ、各コンポーネントの適合方法、および問題の解決方法を説明します。通常、私はコードがこれの多くを単独で行うことを望みますが、それは彼らに思考のキャップをつけて紙にそれを置くように彼らを駆り立てます。
最後に、創造性を発揮し、生徒に互いのコードを確認させ、評価を与えたい場合があります。あなたのために働くために仲間の圧力をかける。これが最高評価コード(およびドキュメント)のグレードまたは追加クレジットの一部になることを許可します。
ちょっとした提案。解決またはデバッグする必要があるプログラミングの問題があるときはいつでも、コードを見て、コンピューターを再生するのが好きです。そのため、どこかからコードをコピーした場合、それ自体で完全でなく、単に参照する必要がない限り、何が起こっているかを正確に理解するために行ごとに移動するのが好きです。基本的にはコンピューターを再生します。VBAデバッガーは基本的にこのタスクを簡単にしますが、生徒に紙の上でそれをさせることで、基本的なことができるようになります。この行は実際に何をしますか?
大学レベルで入門プログラミングを教えました。それはパンとバターのコースであり、すべての学部がそれを行いました。私たちは共通のテキストに従って一般的な試験を受けましたが、それぞれ独自の教室方式が機能していました。それから長い時間が経ちましたが、ときどきプログラミングの子供を家庭教師にすることができ、全体像はほぼ同じです。
私がやる方法は、できる限り具体的に、一番下から始めることです。生徒が知っているのは構造です。彼らはすでに多くの概念を持っています。私はそれらの上にさらに概念を構築しており、それらが形成するかもしれない、非生産的な概念を取り除きます。同時に、を行うことで学習させます。
Intel 8008チップ、EPROM、およびいくつかの回路を備えた小さなコンピューターを構築しました。I / Oチップがいくつかのスピーカーに接続されたときに少しデュエットするようにプログラムしました。小さなプログラムがどのように機能するかを説明し、カウンターをカウントダウンするための内部ループを使用します。それは遅延として機能します。次に、出力ビットを切り替えて、再度実行します。それはしばらくそれをしてから、別の遅延に切り替えて、別のピッチを与えるなどです。メモリチップには小さなタイマーがあり、タイマー入力の1つの下にコンデンサのリード線を挟むと、プログラムの実行速度が遅くなります。クラスは、スピーカーのクリック音、クリック音、クリック音を聞くことができました...私は、コンピューターが一度に1ステップずつ非常に単純なことをしていることをクラスに理解してもらいたいと思いました。。その後、コンデンサのリードを外し、「音楽」が飛び出しました。(拍手)
次に、1000個のメモリ位置を持ち、それぞれが4桁の符号付き10進数を保持する、非常に単純な10進数コンピュータ用のシミュレータを構築しました。「アキュムレータに追加」、「負の場合ジャンプ」などの非常に単純なオペコードがありました。2つの数字を追加したり、数字のリストを追加したりするような、この「マシン言語」で小さなプログラムを作成してもらいます。その後、シングルステップで動作するか、Enterキーを押して「高速」で実行されるのを見ることができます。
これのポイントは、コンピューターは非常に少数の異なる基本操作しか実行できず、一度に1つずつしか実行できないという概念を導入することでした。これは、コンピューターが複雑であり、すべてを同時に実行し、心を安易に読んでいるという印象に対抗するためです。
そこから、「本物の」言語(BASIC :)でのプログラミングに進み、非常にシンプルだが興味深いプログラムから始め、条件、ループ、配列、ファイル、マージなどを進めていきました。オブジェクトは、プログラミングを面白くする唯一のものであるため、自分で選んだプロジェクトを引き受けることができるように十分なスキルセットを配置することでした。私はプロジェクトのアイデアをいくつか捨てて、それから彼らはそこからそれを取るでしょう。私は、書かれたアイデアを求め、それから進捗報告を求めて、彼らが最後まで延期してパニックに陥らないようにします。彼らは自分たちの力で学んでいたので、プロジェクトは最高の部分だったと思います。
コンピューターが何をするかを非常に具体的に理解することで最初に基礎を置くことで、後で概念や後のコースでのポインターのような本当のスピードバンプを概念を教えるのがずっと簡単になりました。「抽象化」の概念をこの素晴らしいものとして賞賛する傾向がありますが、それは空中ではなく、具体的な基盤の上に構築される必要があります。
saself -私は信じている教えプログラマアニメーションは、コードが何をしているかを知るの点で最も挑戦的であることを。プログラムに抽象的な操作を実行するアルゴリズムと数学的な変換が含まれている場合、特定の時点で数学が何をしているのかを理解する唯一の方法(天才でない限り)は、コード自体の実行を理解する必要があります。
私の素朴な考えが間違っている場合は修正してください。あなたがしたいことはnot、学生が「デザインパターン」を使用するのを防ぎますが、彼らが彼らがCnPであるものを理解することを確実にする方法を見つけることですか?次に、生徒にアニメーションを操作するように挑戦します。アニメーションの出力を調整するには、各ステップで何が起こっているかを理解する必要があります。あなたが述べた懸念について、私はよく考えられたアニメーションプロジェクトが学生が「それを取得する」ときに明白な形で現れることを想像します-あなたが予期しないまたは特定の関連する相互依存変数を微調整した変換を実現したとき。
あなたが働いている教育の限界と目標を知らなければ、アニメーションが完全な答えだとは言えません。アニメーションの専門職以外のアニメーションのカリキュラム全体は、疑いの余地がありません。いくつかのプロジェクトはそれでもなお、芸術的で素晴らしい何かをもたらすことがありますが、それは悪くありません。
別の注意として、高校レベルのコーディングオリンピック --- wot-wot--就学前のプログラマーのための競争についての新聞記事(はい、紙!)を読みました。彼らの課題の説明は、読んだことを思い出すことができる純粋なコーディングの最も明確な表現でした。競合他社は、お互いに対して、そして優れた実践基準によって判断されます。これらのコンテストでは、学生はソリューションを計画し、制限時間内に問題を解決するために必要な要素の「デザインパターン」を手作業でコーディングする必要があります。したがって、CnPプログラミングに関する懸念に対する解決策は、生徒がCnP'nと同じ「コードチャンク」を記述できるかどうかをテストすることです。
NY Timesにあったと思います。クイック検索では見つかりませんでした。同様の例は、ACMのInternational Collegiate Programming Contestです。このコンテストはスピーディなプログラミングを強調しています。「チーム競技での電光石火のプログラミングは明らかに風変わりなスキルであり、求職者の多くが履歴書の最上位にいるわけではありません。」したがって、実世界の問題からの抽象化がその解決策であることをお勧めします。
また、
また、それらを苦労して扱うこともできます。
彼らに有害なコピー・ペーストを作成する方法を見つけてください。正確な例はありませんが、同様の外観の2番目のエクササイズに貼り付けた場合、その解決策を最初のエクササイズとして作成すると、貨物カルトの学生は非常に長くて痛みを伴う「不安定な不安定性」または「サイレントデータ破損」バグに陥ります。一方、「非カーゴカルト」の2分間の思考は、最悪の学生でさえ明らかな解決策をもたらしました(彼は最初の運動の解決策を見ていませんでした)。その後、レッスンを学習し、3回目の演習に貼り付けコードをコピーする前に、考え直す可能性があるかもしれません。
この振る舞いは、プログラムが魔法の呪文であるという信念によるものだとは思わない-おそらくそれは怠であり、やる気がない。
ですから、教師としてのあなたの仕事は生徒をやる気にさせることだと思います-真にやる気のある生徒は、解決策を切り貼りすることはありません(それは、期限と最終目標を達成するプログラマーのためだけです...)
同様に聞こえる割り当てを与えないでください。
または、もっとクレイジーに、最初からTDDを学んでください。それは実際に解決されている問題を定式化するのに役立つ多くのコード(つまりテスト)を書く(コピーする、書くのではなく)ことを要求します。