プログラミング入門プログラミングコースのコンピューターサイエンスの学生の何人かは、プログラミング言語を魔法の呪文のセットと見なしており、(解決策のアイデアを表現するための柔軟な媒体としてではなく)何らかの効果を得るためにキャストする必要があります。 。
彼らは問題の本質を考慮せずに、以前の同じような外観の割り当てからコードをコピーして貼り付ける傾向があります。
これらの生徒が、自分が書く各コードの構造と意味を理解できること、および理解する必要があることを確信できるようにするための演習やアナロジーはありますか?
それらに一連の演習を提示し、それぞれが前の段階で構築する一方で、問題に余分な要素やねじれを追加したり、別の視点から問題を調査したりできます。これにより、以前の解決策の弱点が明らかになり、新しい別のアプローチが必要になります。これにより、既製のコードをコピーして貼り付けるのではなく、各ソリューションについて考え、分析し、変更し、実験する必要があります。
厳密にはプログラミングタスクではありませんが、別の可能性として、さまざまなことを見積もるように依頼することもできます。例えば。 1秒あたりのミシシッピデルタを流れる水量特に説得力のある(範囲の)値を得るには特定の仮定を行う必要があるため、このような質問には決まった答えはありません。そして、これらの「クラシック」な答えの多くは確かにググることができますが、ネット上のどこにも(まだ)見つからない新しいものを簡単に作ることができます。
これら両方の種類のエクササイズの例は、例えば、 プログラミング真珠 ジョンベントレーまた、 Pragmatic Programmer には、いくつかの優れた課題があります。
3番目の種類のタスクは、(1つ以上の)バグが含まれているコードの一部を提示し、バグを見つけて修正することです。これもまた、分析スキルを使用し、プログラムが実際にどのように機能しているかについての理由を強制します。
Billy ONealによるコメントからのフィードバック:
「一連のエクササイズ」の問題は、以前のエクササイズに問題がある学生が残りのエクササイズに完全にねじ込まれることです。
あなたの言うとおりですが、これは、コースの難易度を適切なレベルに設定する、または同様のスキルレベルの学生をグループ化するという一般的な問題のほうが多いと思います。さらに、問題と解決策について話し合い、討論し、一緒に問題を解決する必要のある小さなグループに学生を配置することができます。誰かがそれを取得しない場合、他のユーザーが支援できます(この設定により、チームワークのスキルも向上します)。そして、誰かが怠惰にして他の人にすべての仕事をさせようとする場合、それは教師によって確実に気づかれます(教師は歩き回って、生徒を監督および指導し、隅にあるラップトップでWoWをプレイするのではありません;-)
また、さまざまなスキルレベルの学生に対応するように演習を調整することもできます。初心者は遅く、経験豊富な人は速く行くことができます。
あなたは、生徒の主題を気にする必要がある生徒と合格点を取得する必要があるという学生のバランスをとる行為と闘っています。多くの学生はそれを感じています:
生徒が自分の時間や学年が危険にさらされていると感じたらすぐに、興味深い科目であっても、学習をやめて、「私は気にしない、ただ与える正しい答えを教えて」あなたの生徒は、問題についてできるだけ考えずに、コピーして貼り付けてハックするだけで、手抜きをしようとしています(または、そう思います)。 。
これを処理する方法に関する私の提案は次のとおりです。
私の頭に浮かぶいくつかのこと:
他の誰か(あなた)が書いたコードを実際に説明する必要がある場所に割り当てを与えます。以前のコードの理解、またはより具体的にはコードの欠如は、カーゴカルトプログラミングの最大の原因と危険の両方です。必要に応じて1行ずつコメントを使用するよう依頼し、プログラムをわかりやすい英語(または使用する人間の言語)で説明します。
彼らがコードを説明した後でのみ、特定の変更を行うためにコードを変更するように依頼します。たとえば、降順で並べ替える並べ替え関数を提供した場合は、昇順で並べ替えるように依頼します。またはもっと厳しいもの。しかし、それが所定のコードの理解を必要とするものであることを確認してください。
必要に応じて、イースターエッグをコードに含めることができます。何の役にも立たないか、問題にまったく関連しない1行または2行。それらにそのような線が存在することのヒントを与え、それらを削除する人に追加のポイントを与えます。
その場合にのみ、自分でコードを最初から作成する割り当てを彼らに与えることができます。この時点で、彼らはコードが実際に何であるかについてのより良い理解を持つはずです。彼らはそれを自分で行う方が少し簡単だとさえ感じるかもしれません。
基本的な考え方は、プログラミングは単にコードを書くだけでなく、それを読み取るということです。コードを読むことも教えられるべきです。
別の方法で見てください。このカーゴカルト現象は ドレファスのスキル習得モデル の初心者段階です。これが私たちが学ぶ方法です。私が最初にプログラミングを学んだとき、私がやっていたことは、Computeの裏側からコードのページを入力することだけでした。マガジン。繰り返しが重要です。赤ちゃんは、両親が発する音を模倣することで会話を学びます。私たちが学ぶことはすべて模倣を通してです。私たちは、模倣から習得する方法を教えられなければなりません。
あなたが抱えている問題は、生徒が何も繰り返さず、インターネットからコピーしていることです。これにはいくつかの利点がありますが、利益はごくわずかです。実際にコードをタイプするという行為は、私を理解の場に導いたものです。私はタイプしていることのパターンを見るようになり、自分が何をしているかを理解しました。
1つのオプションは、ラボをコード道場として構成することです。同じ問題について生徒に順番にペアリングしてもらいます。解決に約10〜15分かかる問題を選択してください。いくつかのラボでこの問題を繰り返し、クラスの熟練度が上がるにつれて、問題に新たなひねりを加えます。おそらく、学生にあなたがソリューションをプログラムするのを見てもらい、彼らにそれを繰り返すようにさせることによって、ラボを開始します。反復ごとにペアを切り替える。
あなたのテストのために、各学生がクラスの残りの前に学期からの問題に取り組むコードカタがあります。正確さだけでなく、形や創造性にも焦点を当てます。これは、宿題を与えるよりもプログラミングの方法をより深く理解できると思います。
私は過去に導入クラスを教えてきましたが、今振り返ってみると:
一部の学生は、プログラミングはさまざまな理由でそのようであると考えています。かつて私がやったことをたくさん積んだ良き子供を覚えています:
それは孤立した問題ではなかったと思いますが、同じクラスの他の学生は同じような振る舞いをしたり、問題に取り組み、それを表現しなかったりする可能性があるため、常にクラスに取り組みました。
決定論などの説明に時間を費やしたため、同じ環境で同じデータとコードを使用しても、同じ結果が得られます(「ランダムさ」を解消します)。
問題解決は学生の行動に依存し、他には何もないので、注意は問題を解決することであり、正しい呪文を見つけることではありません。
それらは教育環境にあるため、問題は学習体験を提供するために作成され、結果はプログラムの方法(または場合によってはシステム管理者向けのクラスのように、プログラムの動作方法が異なります)を学び、解決策をください。 (「世界は別の計算機を必要としない、それは練習です」)、それで彼らの問題は利用可能な資料(例:提供されたメモ)で解決できるでしょう、
それはコードコンプリートにあると思います:「コピーして貼り付けても、コードはあなたのものです」。誰かがそれをしたなら、それはカーゴスタイルであってはなりません。すべての行は、私に(個別に)または別の生徒(同じ)またはクラスに説明する必要がありました。
コースの開始時に、学生はstart正しい '抽象度'でしたか?例えば。コードを1行も書かずに、ループや条件文などの主要なプログラミング構造を紹介する宿題ですか。
プログラミングの概要を説明したとき、最初の割り当ては「Rick the Robot」と呼ばれていました。銀行や食料品店などの興味深いポイントがある都市の航空地図が入った紙がありました。「リック」と呼ばれる男がいて、「一歩踏み出す」、「左を向く」、 「正しく見える」、「道路を渡る」、そして「繰り返し」や「何かあれば、何かをする」などを使用できます。 (私はこの割り当てを見つけることができなかったので、これは100%ではありません)アイデアは、リックは与えられたものしか使用できず、マップ上の別の場所に行かなければならなかったということでした。
これは楽しいエクササイズであり、基本を紹介するものでした(これは、初心者には理解しにくい場合があります)。この問題(そのゲーム)に対する適切な答えはありません。コピーして貼り付けるための解決策はありません。このようなものを使用すると、コードで脅迫することなく、彼らの創造性をもう少し発揮できるかもしれません。
最後に、アイデアはabstractから始めてconcreteに向かって移動することです。アブストラクトをコピーして貼り付けることはできません。彼らは問題を解決するためにそれを理解しなければなりません。
あなたに彼らに求めているのは、彼らが現在アプリケーションを実証しているだけである Bloom's Taxonomy の認知領域で分析と合成を実証することです。
残念ながら、それは一種の「馬を水に導く」タイプの状況です。まだ理解に苦労しているときには、分析と合成も非常に困難です。適切な理解がなければ、分析と合成の活動は学習活動よりも雑草として振る舞うでしょう。
私の個人的な意見では、プログラミングクラスのイントロでアプリケーション以上のものを期待しないことは問題ありません。学生がこれらの概念に触れたのはこれが初めてなので、エッセイを書くように求める前に読むことを子供に教えるようなものです。これらの高次スキルは、後のクラスで続きます。
supplyingを検討するために、最初にコードを記述しましたか?空のメイン関数のように、割り当てに必要な単純な足場が何であれ(使用している言語がわかりません)。コンパイルして実行し、何もしないもの。その後、少なくともpartが機能するというある程度の自信を持って、コードを追加し始めることができます。
これは実際には「現実の世界」ではかなり一般的です。多くのIDEおよびその他のツールは、標準のライブラリー/テンプレート/構成ファイルが既に配置された空のプロジェクトを作成します。
あらゆる種類のカーゴカルトの考え方(カーゴカルト自体を含む)は、関連するテクノロジーの基本的な理解の欠如から生じます。
カーゴカルトプログラミングは問題の多い習慣と考えるべきではなく、プログラマーが直面している根本的な混乱の兆候です。
さらに重要なことに、学生の理解不足が単に彼の自信不足の結果であるという仮定は根本的に誤解されており、根本的な問題に対処していません。
代わりに、学生のコピーアンドペーストプログラミングスタイルは、この学生が期待していることの複雑さに圧倒されていることを告げる赤い旗であるべきです。
現在のプロジェクトを構築するための足場として、過去の作業を本能的に使用し、以前に解決した問題をビルディングブロックとして使用してソリューションを構成しようとしています。私たち全員がある程度これを行っていますが、ほとんどの人は、過去の作業から得られた知識をビルディングブロックとして使用しています。この生徒は代わりに作品そのものを使用しています。つまり、自分が使用しているブロックを本当に理解していません。彼は理解できる範囲で作業を分解し、コードの大きなブロックをアトミック単位として扱いました彼はそれらがどのように機能するのか理解していないため。彼は彼らが何をするかを知っているだけです。
最小限のボイラープレートコードを必要とする非常に高級な言語を使用することを検討してください。
私にとって、魔法のように感じて理解を妨げるのは、大規模なフレームワークや冗長言語の定型コードであることがよくあります。
私は、CS入門プログラミングコースで個人的に [〜#〜] ml [〜#〜] を教えられました。長年、 [〜#〜] lisp [〜#〜] は、MITでのプログラミングの紹介として教えられました。どちらも優れた選択肢です。彼らが持っている利点のいくつかは
プログラミングの世界では、出てくるすべてのソリューションに対して実際に新しいプロジェクトを作成することはめったにありません。ほとんどの場合、古いものを変更します。
プロジェクトのアイデアを、課題ごとの1つのソリューションから学期全体の1つのソリューションに変更します。各割り当てbuilds前の割り当て。
プロジェクト:エレベーターシステムの構築
重要なのは、新しいタスクに古い割り当てをリサイクルする代わりに、以前の割り当てでbuildを実行することです。
私は80年代の初心者プログラマーの問題を調査しました。今日の初心者プログラマーとの私の経験に基づいて、あまり変わっていません。初心者には、コンピューターが実際に行うことについての有用なメンタルモデルがありません。マシン自体が魔法なので、彼らは魔法の呪文に訴える。
プログラミングでは、当然のことながら単純なタスクを不自然に小さなステップに分割する必要があります。初心者は日常生活でこのような細かい細かさを扱っていないため、特にマシンが利用できる小さなステップが明確でない場合、小さなステップがどうあるべきかを理解するのは困難です。しかし、それを理解できたとしても、リモートコントロールによって謎のマシンを制御するプログラミング言語(疑似自然言語になりすました不自然な言語)の厳密な構文と制限されたセマンティクスに直面します。
問題に対する論理的な解決策とマシンの機能を関連付けることができないため、言語の要求を満たすことに焦点を合わせています。最初の目標は、コンパイルする何か-何でも-を書くことです。 2つ目は、プログラムがクラッシュしないように、プログラムを実際に調整することです。次に、時間、エネルギー、興味があれば、プログラムが問題に必要なものに似た結果を生成するようにします。その過程で、それらは誤って適切に記述されたコードを生成する可能性があります。
おそらく、プログラミングを学ぶ初心者は、意図的にコンピューターのメンタルモデルを与えられてそれを内面化したのではなく、コンピューターの有用なメンタルモデルを推測して成功します。
書面での応答が必要なコードについて質問することができますか? 「このコードは何をしていますか?」のように「なぜプログラマーはこれをこのように解決したのですか?」 「もっと良い方法はありますか?」など?
それは実際に彼らに問題について考えさせるでしょう、それは彼らがコードに触れることなく彼らがすることができる何かです。
JoelFansのアイデアと同様に、作成した疑似コード(言語)を使用して紙に最初の割り当てを行わせます。必要に応じて構造を追加でき、魔法の箱を気にする必要はありません。
「カーゴカルト」とは、彼らが必要だと考えるものを挿入しているが、実際には問題の解決に向けてまったく何もしていないことを意味します。
その場合は、簡潔さに基づいてグレーディングにいくつかの要素をいつでも追加できます。プログラムに不要なコードや冗長なコードを残すと、破損する可能性があるため、または単にメンテナンスが困難になるため、将来的に問題が発生する可能性があります。
それらは英語のクラスのライティング演習でも同様に判断されます-誰もがランダムな接線で発進したり、一般に要点に達せずにとりとめたりしていることを望んでいません。
アセンブリクラスを受講したとき、先生は、速度、サイズ、またはメモリ使用量のコードを書いてほしいかどうか、各演習で私たちに教えてくれました。ために。
...
彼らが以前の同様の割り当てからコードをコピーして貼り付けており、実際に新しい問題を解決するためのものである場合...まあ、それは単にコードの再利用であり、再利用のためのコードの適合性について悪い仮定をしていなければ、私は彼らがやることは完全に合理的だと思います。 (たとえば、ファイルからの読み取り、入力のサポート...再利用できるすべてのモジュール式パーツ。それらを実行したくない場合は、演習を異なるものにする必要があります。
残念ながら、それは多くの人の頭脳が機能する方法です。だから、これを「治す」ことができない人々がいるというこの理解に入る。プログラミングに必要な精神的精度のレベルで働けない人がたくさんいます。一部の人々は単にそれのために設計されていません。私は生徒たちをあきらめると言っているわけではありません-誰もがそれを取り上げないとしても、失敗していると思い込まないでください。
クラスのコンテキストについて詳しく知らなくても、これらの問題のある生徒たちに、非常に基本的な構造-simple if/thens、loopsなどに焦点を当てると思います。奇数を出力する単純なルーチンは、 10番目ごとの数値など。それぞれ10行以下のコード。彼らが「魔法の思考」である場合、彼らは明らかにそれらの基本をまだ習得していない。何が起こっているのかを把握するまで、さまざまな単純なルーチンをたくさん実行してもらいます。他の誰かがコードを紙に書くことについて言及しました-私はそれもこれらの単純なルーチンを行うための素晴らしい方法だと思います。
また、フローチャートを学習させることも検討してください。一部の人々にとって、アルゴリズムのフローを確認でき、それがコードにどのように接続するかを理解できると、コードをフローに接続するのに役立ちます。
簡単な提案です。解決またはデバッグする必要のあるプログラミングの問題があるときはいつでも、コードを見て「コンピューターを再生」したいところです。頭の中で、変数とその値、および各行が実行されたときの期待値を追跡しています。 。したがって、どこかからコードをコピーした場合、それ自体が完全であり、それを参照するだけでよい場合を除いて、何が起こっているのかを正確に理解するために、1行ずつ進んでいきます。本質的にコンピュータを再生します。 VBAデバッガーは基本的にこのタスクを容易にしますが、生徒が紙の上でそれを行うようにすると、基本的なことが得られる場合があります。この線は実際に何をしますか?
私は大学レベルで入門プログラミングを教えました。それはパンとバターのコースで、すべての学部がそれをやった、そして私たちはかなりうまくやったと思う。私たちは共通のテキストに従い、共通の試験を受けましたが、それぞれが機能する独自の教室メソッドを持っていました。それから久しぶりですが、時々私はプログラミングの子供を指導します、そして全体像はほぼ同じです。
私のやり方は、できるだけ具体的に、一番下から始めることです。学生が知っているのは構造です。彼らはすでに多くのコンセプトを持っています。私はそれらの上にさらに概念を構築しており、逆効果になるそれらが形成する可能性のある概念を排除しています。同時に、私はそれらを作成します行うことによって学ぶ.
Intel 8008チップ、いくつかのEPROM、およびいくつかの回路を備えた小さなコンピューターを構築しました。 I/Oチップがいくつかのスピーカーに接続されているときに、少しデュエットを演奏するようにプログラムしました。小さなプログラムがどのように機能するかを説明します。カウンターをカウントダウンするための内部ループがあります。それは遅延として機能します。次に、出力ビットを切り替えて再度実行します。それはしばらくの間それを行い、次に別の遅延に切り替え、別のピッチを与えるなどします。メモリチップには小さなタイマーがあり、タイマー入力の1つの下にコンデンサのリード線を押し込むと、プログラムは実行されますveeeeeryゆっくり。クラスは、スピーカーがクリック、クリック、クリックするのを聞くことができました...コンピュータが非常に簡単なことを一度に1ステップずつ実行するであることをクラスに理解してほしかったそれから私はコンデンサーのリード線を外して、「音楽」が飛び出しました。 (拍手)
次に、それぞれが4桁の符号付き10進数を保持する1000のメモリロケーションを持つ非常に単純な10進コンピュータ用のシミュレータを作成しました。 「add to accumulator」、「jump if negative」などの非常に単純なオペコードがありました。 2つの数字を追加したり、数字のリストを合計したりするような、この「機械語」で小さなプログラムを書いてもらいます。次に、シングルステップで実行するか、Enterキーを押して「高速」で実行されるのを確認します。
これのポイントは、コンピュータは非常に少数の異なる基本操作しか実行できず、一度に1つずつ実行できるという概念を導入することでした。これは、コンピューターが複雑で、すべてを同時に実行し、心を掘り下げて読んでいるという印象に対抗するためです。
そこから、「実際の」言語(BASIC :)でのプログラミングに進み、非常にシンプルで興味深いプログラムから始めて、条件、ループ、配列、ファイル、マージなどを処理しました。目的は、彼らが自分で選択したプロジェクトに取り組むことができるように十分なスキルセットを配置することでした。私はプロジェクトのアイデアをいくつか捨て、そこから彼らはそれを採用しました。私は書面でアイデアを求め、それから進捗レポートを提出して、最後まで延期してパニックにならないようにします。彼らは自分の力で学んでいたので、プロジェクトは最高の部分だったと思います。
コンピュータが何をしているかを非常に具体的に理解することで最初に基礎ができたので、後で概念を教えるのがはるかに簡単になりました。私たちは「抽象化」の概念をこの素晴らしいものとして称賛する傾向がありますが、それは空中でではなく、コンクリートの土台の上に構築する必要があります。
[〜#〜] a [〜#〜]saself-プログラマーに教えられたアニメーションコードが何をしているかを知るという点で最も挑戦的である。プログラムに抽象的な操作を実行するアルゴリズムと数学的変換が含まれている場合、任意の時点で数学が何を行っているかを理解する唯一の方法(天才でない限り)は、コード自体の実行を理解する必要があります。
私の素朴なアイデアが間違っている場合は私を修正してください。あなたがやりたいことは、not
で生徒が「デザインパターン」を使用できないようにすることですが、CnPが何であるかを生徒が理解できるようにする方法を見つけるには?次に、アニメーションを操作するように生徒に挑戦します。アニメーションの出力を微調整するには、各ステップで何が起こっているかを理解する必要があります。あなたが述べた懸念について、よく考えられたアニメーションプロジェクトは、学生が「理解する」ときに明白な方法で現れると想像します。彼らが予期しない変換を実現したとき、または特定の関連する相互依存する変数を微調整したとき。
教育的な限界や、あなたが取り組んでいる目標を知らなければ、アニメーションは完全な答えとは言えません。アニメーション専門家以外のアニメーションの全体的なカリキュラムは、私が推測するのは危険ですが、問題外です。いくつかのプロジェクトはそれでも芸術的で素晴らしい何かをもたらすかもしれませんが、それは悪くはありません。
別のメモで、私は高校レベルについての新聞記事(そう、紙!)を読んだ。コーディングオリンピック-wot-wot--competition for大学前のプログラマー。彼らの課題の説明は純粋なコーディングの明確な説明でした私は読んだことを思い出すことができます。競争相手はお互いに対して、そして良い実践基準によって判断されます。これらのコンテストでは、学生はソリューションを計画し、問題が制限時間内に完了するために必要な基本的な「設計パターン」を手動でコーディングする必要があります。したがって、CnPプログラミングに関する懸念の解決策は、学生がCnP'nと同じ「コードチャンク」を書き込めるかどうかをテストすることです
きっとNYタイムズにあったと思います。クイック検索では見つかりませんでした。同様の例は ACMのInternational Collegiate Programming Contestです。 このコンテストは、スピーディーなプログラミングを強調しています。履歴書。"したがって、私は現実の問題からの抽象化がその答えであることをお勧めします。
また、
理想的には、最初の講義で、完全に抽象的なものから始めます:(グループとして、リーダーとして)食料品の買い物をする方法の説明をリストから書き、上位レベルの説明を段階的に分類します彼らが悟りに到達するまで。
これらの指示は文字通り、物事を推論する方法を知らないロボットが従うことになると彼らに伝えるのに役立ちます。しかし、それはあなたが彼らを導く責任がある非常に実践的な活動でなければなりません。
Alistair CockburnがShu-Ha-Riの概念とプログラミングにどのように適用されるかについて話します http://alistair.cockburn.us/Shu+Ha+Ri 。生徒がこの連続体のどこにいるかを覚えておくことが重要だと思います。最初にそれはあなたの欲求不満の一部を和らげるのに役立ちます。コピー/模倣は非常に自然な反応であり、最初に何かを学び始めたときに受け入れられるモードです。第二に、それはあなたが前進する方法のいくつかのアイデアを得るのを助けるかもしれません。たとえば、複数の方法(ループvs再帰、コンソールvs web/gui)で解決できる問題を選択し、最初に1つの方法で解決し、次に別の方法で明示的に解決することを検討することをお勧めします。正当なコードの再利用、コンポーネント化、再利用可能なライブラリの作成などについて.
私が使用したもう1つの成功した方法は、一連のプロジェクトを相互に構築し、割り当てが引き渡された後、各ステップでデフォルトの作業バージョンを使用可能にして、人々の遅れを防ぐことです。プロセスの各ステップでは、何か新しいものを導入する必要があります。これは、プログラミングクラスよりもデザインクラスの方が簡単な場合もありますが、それでも実行可能である必要があります。これについての1つの良いことは、各ステップでそれらと比較するための良い(うまくいけば)実装を明示的に提供することです。この比較を課題として公開します。つまり、自分の努力に対して自分のコードのミニコードレビューを行います。これをいくつかの追加のクレジットオプションの1つにしたい場合があります。
私は通常「コメント」については大したことはありませんが、コードのドキュメントを評点項目の1つにすることをお勧めします。各プロジェクトの「動作理論」ドキュメントを作成して、アプローチ、各コンポーネントの適合性、および問題の解決方法を説明してもらいます。通常、私はコードがこれの多くをそれ自体で実行することを望みますが、それは彼らに彼らの思考の上限を付けてそれを紙に置くように駆り立てるでしょう。
最後に、クリエイティブにして、生徒にお互いのコードをレビューしてもらい、評価を与えることができます。仲間のプレッシャーを働かせてください。これが最高評価のコード(およびドキュメント)のグレードまたは追加クレジットの一部になることを許可します。
技術的には良いがあいまいであるため、コピーする既存のコードを見つけることができないプログラミング言語を使用してクラスを教えます。
難しい方法でそれらを扱うこともできます。
コピー&ペーストをそれらに有害にする方法を見つけます。正確な例はありませんが、最初のエクササイズを作成し、同じような見た目の2番目のエクササイズに貼り付けた場合、カーゴカルトの学生に非常に長く苦痛な「不安定な不安定性」または「サイレントデータ破損」のバグをもたらします。一方、「非カーゴカルト」の2分間の思考は、最悪の学生にも明らかな解決策をもたらしました(彼が最初の運動解決策を見ていなかった場合)。その後、おそらく彼らがレッスンを学び、ペーストするコードを3番目の演習にコピーする前に2度考えてしまう可能性があるでしょう。
直感的に見て先生の問題を指摘したいと思います。
俳優(映画)は、銀行取引可能なイメージ(販売可能)を持つ人で、誰もが見るスターです。
俳優(演劇)とは、自分のエゴを自分の知識の背後に隠して、自分自身に何らかの役割を与えるスキルを備えた人物です。
学生を(科学と知識で)豊かにするためには、演劇の俳優のように生きなければなりません。
あなたは、確かな技術知識を超えて、あなたから何かを与える必要があります。あなたは、本のような配達文に結び付けられた情報的な主題についてすべて知っている卒業生/技術者ではありません、
...しかし、経験と生きた知識を共有する一連のコースと演習を行う経験(直感の始まりの可能性がある)の男性。
次に、生徒に同じアプローチを取るように要求できます。知識や学年を購入するのではなく、言語と能力を取り入れて習得し、コピー/貼り付けできないことを行いますが、仕事の精神を結び付けます。
上記のすべてのヒントは役に立たないか、または役に立たない:あなたは自信があることができますか?このレベルに到達するために、劇場のコースはあなたに爪/スパークを与えるかもしれません。手続き的な方法ではなく、「自分を知る」ための良い方法です。
問題:それはあなた次第です:席を離れる必要があり、体や空間やその他のテクニックを意識している必要があります。言語(単語、メソッドとは何ですか)について深く学びたい
...創造性のスキルを備えた、あなたのすべてのライブのための「仕事」。 ...かどうか:私の仕事の5%のすべてのこの「仕事」? (だから、「生きている」とは何かをあなたに聞いてください)...
英語で読めることを願って
クロード
彼らに同様に聞こえる割り当てを決して与えないでください。
または、もっとクレイジーです。最初からTDDを学んでください。多くのコード(つまり、テスト)を書くこと(つまり、コピーすることではなく)を押して、解決しようとしている問題の定式化に実際に役立ちます。
私が入門プログラミングコースにいたとき、インストラクターは、アルゴリズムを英語で記述し、それを印刷して、コードを書き始める前に提出するように全員に要求しました。次に、変数の作成、ユーザーからの入力の取得、計算の実行、出力の出力など、たくさんのコメントを付ける必要がありました。コメントが足りないために何度かドッキングされたので、たくさんあると思い、追加を開始しました。もっと。そのため、自分が何をしているかを考えて解決策を書き、英語とJavaの間で翻訳をやり直す必要がありました。
私のクラスの人々に非常に役立つことがわかったのは、彼らが自分で選択できるテーマで彼らの小さなプロジェクトを書くことです。
プログラミングを始めたときも私にとっては大変でしたし、クラスでたくさんのコピーをしました。その後、家でゲームプログラマーになりたいと思って小さなゲームを作り始めました。彼らがクラスで見たものよりもはるかに困難でしたが。それが私に興味を持ったからといって。
私のクラスの他の数人は、まったく同じことをしたため、試験の40〜50%から90〜100%に進みました。
この振る舞いは、プログラムは魔法の呪文であるという信念によるものではないかと思います。おそらくそれは怠惰でモチベーションの欠如です。
教師としてのあなたの仕事は生徒のやる気を引き出すことだと思います-真にやる気のある生徒はソリューションをカットアンドペーストしません(これは、期限と最終的なラインを満たすプログラマにのみ有効です...)
サブルーチンを教える。以前の割り当てから取得しているコードを受け取って、それをサブルーチンにしてもらいます。サブルーチンが実際に何をしているのかを理解できるように、関数のドキュメントについて説明します。
インターネットアクセスが提供されていない教室で、目の前の課題を生徒に行わせる(学校に遮断させ、授業中に電話を使用させないようにする)。少なくともテストではこれを行います。基本的なプログラミングの演習でインターネットを使用する必要がある理由はまったくありません。この本は、イントロ演習のための十分なリソースである必要があります。上級クラスに参加し、彼らがすでに考え方を学んだら、インターネットの使用を許可します。
私はこれについてブログの記事を書きました。これは、私たちプログラマーがtutを書くプログラマーがジュニア(私が望む!)のプロのプログラマーの間でこの問題を緩和するために異なる方法で行うべきであるという観点から、そして一部は私たちのせいです。私たちが彼らのために素材を作成する方法は、この問題の本質的な部分だと思います。私が行ういくつかの提案:
コードを小さな不完全な部分に分割します。これは実際には単なる機械的なものであり、おそらく「議論の余地がある」提案です。チュートリアルに大量の作業コードを投稿しないでください。うまくいけば実際に各部分を読んで理解しながら、それらをすべて一緒にまとめるように働きかけます。これは簡単なことではありません。コードが壊れているチュートリアルはすでにたくさんあります。これは、学習者にとって苛立たしいことです。しかし、「ログインフォームを作成する方法」を読んでいるレベルにいる場合は、自分ですべての手順を実行する必要があります(そして、機能しない場合は、Stackoverflowに質問をリンクします)。
答える前に問題を説明してください:チュートリアルを書く際の一般的な手法は、コードのブロックを投稿し、それを1行ずつ読むことです。私は何を追加する必要があるかを言う必要があると主張し、そしてそれを追加し、次に繰り返します。したがって、「postメソッド、ユーザー名とパスワードを保持する要素、送信ボタンを備えたフォームを作成する必要があります」と記述します。見ている前に何を見ているかを知ることは、はるかに効果的な教授法です。
コーディングではなくデバッグを教える:このサイトの最近の投稿で、(うまくいけばいくつかの成功を収めて)新しいテクニックを試しました-壊れたコードの束を投稿し、それで何が問題であるかを理解する方法を教えました。多くの新しいプログラマーは、var_dump()の設定を理解していません。これが、プログラマーにとって最も新しい質問であるIMHOの最大の原因です。
より広く、より深く:Anthony Ferraraは、Programming with Anthonyで素晴らしい一連のプログラミングビデオを開始しました。私がそれらをとても気に入っている理由は、彼らが特定の主題を1つ選び、それを本当に「深く」説明するためです。完全な「ソーシャルウィジェットスクローラー」を作成する代わりに、配列をメモリレベルまで説明しています。広大な主題をカバーする代わりに、小さなものを選び、それを徹底的に根気よく説明してください。
バグを報告する方法を教えます。私たち自身の便宜のためではありません。フォーラムで問題を書いている間、私たちはどれほど頻繁に何かを見つけたかを知っています。その理由は単純です-何かを説明しなければならないとき、あなたはそれについて考えなければなりません。 「Googleで調べる」ことを教えないでください。座って考えてもらうか、問題について自分宛てに手紙を書くように伝えます。
全文: http://codebyjeff.com/blog/2013/05/death-to-teaching-cargo-programming
1)彼らにコンピューターの歴史、プログラミングを教える。 2)さまざまなプログラミング言語がどのように機能するかを教えます。 3)優れたプログラミングとプログラミングの実践について教えます。 4)問題を分析し、解決策を見つけてコーディングを開始する方法を指導します。