カーゴカルトプログラミングの態度にどのように対処できますか?


257

必須の入門プログラミングコースにコンピューターサイエンスの学生がいて、プログラミング言語を魔法の呪文のセットと見なします。これは、何らかの効果を得るためにキャストする必要があります(ソリューションのアイデアを表現するための柔軟な媒体と見なすのではなく) 。

問題の本質を考慮せずに、以前の似たような割り当てからコードをコピーアンドペーストする傾向があります。

これらの学生が、書くコードの各部分の構造と意味を理解することができ、また理解する必要があるという自信を高めるための演習や類推はありますか?


8
コメンター:コメントに回答を残さないでください。独自の答えを書いてください。コメントは、質問に対するさまざまな可能な答えを議論する場ではありません。あなたの提案を答えとして提示するか、最初にそれを具体化するためにチャット連れて行ってください。

50
アカデミアがここに来るたびに-私は自分の将来を心配します...ボーイング7-28-7で、Cで書かれた制御ソフトウェアで走っている200,000 RPMで回転しているタービンを、あなたの辛うじて通過する学生の一人が想像します。とにかく私は脱線します。
ベンデモット

67
何度か失敗することを考えたことはありますか?それらはすべて特別な雪片ではありません!

6
SICPは、プログラミングがスペルキャスティングに似ていると言っていることで有名ではありませんか?つまり、あなたの生徒がSICPを引用しているのか、アベルソンとサスマンが描写しようとしているものと同じような比較をしているのではないかと思うのですが、そこにあるコンピュータープログラミングの本は、最初の数ページでまったく同じことをしています。
ロビー

9
エリック・リッパートはこの主題に関して多くのことを述べています。そして、私ができることよりもはるかにエレガントで簡潔な方法で: blogs.msdn.com/b/ericlippert/archive/2004/03/01/82168.aspx
P.Brian.Mackey

回答:


120

それらに一連のエクササイズを提示することができます。各エクササイズは、問題に追加の要素やひねりを加えながら以前のものを構築したり、別の観点から問題を調査したりします。 。これにより、既成のコードをコピーアンドペーストするだけでなく、各ソリューションについて考え、分析し、修正し、実験する必要があります。

もう1つの可能性は、厳密にはプログラミングタスクではありませんが、さまざまなことを見積もるように依頼することです。たとえば、1秒間にミシシッピデルタを流れる水はどれくらいですか?そのような質問には、特に説得力のある(範囲の)値を得るために特定の仮定をする必要があるため、決まった答えがありません。そして、これらの「古典的な」ものの多くに対する答えは確かにグーグルで検索できますが、ネット上のどこにも(まだ)見つからない新しいものを簡単に作ることができます。

これら両方の種類のエクササイズの例は、たとえばJon Bentleyの「Programming Pearls」にあります。また、Pragmatic Programmerにはいくつかの良い課題があります。

3番目のタスクは、(1つ以上の)バグを含むコードを提示し、それらを見つけて修正する必要があることです。これにより、分析スキルとプログラムが実際にどのように機能しているかについての理性を使用するように強制されます。

更新

ビリー・オニールによるコメントからのフィードバック:

「一連のエクササイズ」の問題は、以前のエクササイズに問題がある学生は、残りのエクササイズのために完全に台無しになることです。

あなたは正しいですが、これはコースの難易度を適切なレベルに設定し、同じようなスキルレベルの学生をグループ化するという一般的な問題に関するものだと感じています。さらに、問題と解決策について話し合い、議論し、一緒に問題を解決する必要がある生徒を小さなグループに配置することができます。誰かがそれを受け取らなかった場合、他の人が助けることができます(このセットアップはチームワークのスキルも改善します)。そして、誰かが怠laになり、他の人にすべての仕事をさせようとすると、教師は必ず気づきます(学生は周りのラップトップでWoWを演奏せず、歩き回り、生徒を監督し、指導することになっています;-)

また、異なるスキルレベルの学生に対応するように演習を調整することもできます。初心者は遅くなり、経験豊富な人は速くなります。


私はこの素敵な答えにシンプルなウェブサイトへのリンクを追加します。IMHOはコースを補完するものとして設定する必要があります:http : //projecteuler.net/これはコードへの欲求を刺激するウェブサイトです。彼らが望む言語で解決しなければならない難易度の問題が増えています。まず、それは中毒性があり、競争を刺激します。あなたは彼らのアカウントを通して彼らの進歩を追うことができます、彼らもそれをすることができます。
ニコラスC.

142

あなたは自分の学生のバランス行為戦っている被写体を気にする必要性を、その合格成績を取得する必要があります。多くの学生はそれを感じます:

(間違ったものを取得||実験)==(不合格&時間の無駄)

学生が自分の時間や成績が危険にさらされていると感じるとすぐに、興味深い科目であっても、学習やめて「気にせず、先生に正しい答えを与えるだけ」にジャンプします。生徒たちは、問題についてできる限り考えずに、コピーして貼り付けるだけでそれをハッキングすることで、コーナーをカットしようとしています(または、そう考えています)

これに対処する方法に関する私の提案は次のとおりです。

  1. Bob Rossの方法を使用します。コピーと貼り付けを行うよりも、新たに開始する方が可能かつ高速であることを証明します。授業中に目の前に新しいプログラムを作成します- プログラミングが絵を描くようなものであることを実際に示します。
  2. 創造性を必要とする課題を提供します。たとえば、各生徒に独自のデータ構造(動物園、ペット店、町、大学などを作成するために必要なオブジェクト)を作成し、コース全体で使用するようにします。割り当て#2は、それらの構造をクラスまたはオブジェクトなどに変換することができます。基本的に、抽象的に思考するように誘惑します
  3. 最小限の構文を使用してください。 彼らがいることに気付いていない-の作成クラスと言語の文法のような定型的なものは、それは多くの場合、プログラミングのすべてがちょうどどこ中括弧を置くために知っていることを考えることに学生を誤解させることを、プログラミングの導入で非常に流行しているカーリーの真ん中にあるもの中括弧は創造性が流れるところです。単純な言語を選択し、まだ何かをコピーして貼り付けたい学生にサンプルファイル(空のクラスファイルなど)を提供します。コースが進むにつれて、構文とコンパイル可能な割り当てについてより厳格になることができます。

私は&&それがビットごとの操作として成功するかもしれないと思うけれども、それはそうあるべきです。
tvanfosson

私はデータがどのように見えるかを本当に知りませんが、はい、ビット単位の操作は私が意図したものです。良いキャッチ:-)
ケビンマコーミック

3
==>彼おっと/彼女はそれらのPython、その後...教えていないだろう「中括弧の真ん中にあるものを創造が流れるところである」
オリヴィエ・ポンス

3
単に学習の代わりに教師に「正しい」答えを与えようとすることに関する別の問題は、人々がしばしばそれを学習していると考えることです。例lesswrong.com/lw/iq/guessing_the_teachers_password
ウィルカ

6
そして、ここにいくつかの幸せなセミコロンを追加します
...-VirtuosiMedia

44

私の頭に浮かぶいくつかのこと:

  • 実際に他の誰か(あなた)が書いたコードを説明しなければならない場所に割り当てを与えます。以前のコードを理解すること、またはより具体的にそれがないことは、貨物カルトプログラミングの最大の原因であり、危険でもあります。必要に応じて1行ずつコメントを使用して、プログラムをわかりやすい英語(または使用する人間の言語)で説明するよう依頼します。

  • コードを説明した後のみ、特定の変更を加えるために変更を依頼します。たとえば、降順で並べ替える並べ替え関数を指定した場合、昇順で並べ替えるように依頼します。またはより厳しいもの。ただし、特定のコードを理解する必要があるものであることを確認してください。

  • 必要に応じて、イースターエッグをコードに入れることができます。問題にまったく役に立たない、またはまったく問題に関係しない行または2行。そのような線が存在するというヒントを与え、それらを削除する人に余分なポイントを付与します。

  • その後、初めて自分でコードを一から作成する割り当てを与えることができます。この時点で、彼らはコードが実際に何であるかをよりよく理解するはずです。彼らはそれを自分でやる方が少し簡単だとさえ感じるかもしれません。

基本的な考え方は、プログラミングはコードを書くだけでなく、読むことでもあるということです。コードを読むことも教えてください。


4
イースターエッグのアイデアは、テスト/検証を教えるのにも良い方法のようです。「契約を壊さずにワットを削除できる」という線に沿って。
ニールN

3
読み取りコードに+1。私は多くの人が直観的に推測してバグを修正し、それを証明しようとしているのを見ます。コードを読むことで、適切な解決策を見つける手がかりが得られることがわかりました。当たり前のように聞こえますが、多くのことを無視されています。
クリス

38

別の方法で見てください。この貨物カルト現象は、スキル獲得のドレフュスモデルの初心者段階です。これが私たちが学ぶ方法です。私が最初にプログラミングを学んだとき、私がしていたことは、Computeの後ろからコードのページを入力することだけでした!マガジン。繰り返しが重要です。赤ちゃんは、両親が作る音をコピーして話すことを学びます。私たちが学ぶことはすべて模倣です。模倣から習得へと進む方法を教えなければなりません。

あなたが持っている問題はあなたの学生が何も繰り返さないことであり、彼らはインターネットからそれをコピーしているということです。それにはいくつかの利点がありますが、利益はわずかです。実際にコードを入力する行為は、理解の場所に私を導いたものです。私はタイピングしているもののパターンを見始め、私がしていることの理解を得ました。

1つのオプションは、ラボをコード道場として構成することです。同じ問題について、生徒に交互にペアリングさせます。解決するのに約10〜15分かかる問題を選択します。いくつかのラボでその問題を繰り返し、クラスの習熟度が上がるにつれて、問題に新しいひねりを加えます。おそらく、ソリューションをプログラムするのを生徒に見てもらい、それを繰り返してもらうことで、ラボを開始します。反復ごとにペアを切り替えます。

テストには、各学生がクラスの残りの前で学期からの問題を処理するコードカタがあります。正しさだけでなく、形と創造性にも注目してください。これにより、持ち帰りの課題を与えるよりも、プログラムの方法をより深く理解できると思います。


「最初にプログラミングを学んだときは、Compute!マガジンの裏からコードを入力するだけでした。」:これは、小さなおもちゃプログラムを実行するためにCommodore Vic20を使用していた非常に早い段階でした。非常に退屈。私はすぐに反対の態度を開発しました。他の場所からコピーできるコードを自分で書いてください。
ジョルジオ

私たちの教師の一人は、彼がくれたアセンブラー・プログラムをコピーする割り当てを私たちに与え、彼は自分の手書きでコピーを作成することを要求しました。彼はまた、筆跡が私たちのものであることを確認できるように、彼の前の最初のページで私たちの名前を書くことを望んでいました。その割り当てには約3時間かかりました。
sashoalm

1
Jon JaggerのCyber​​dojoのような気晴らしのない環境はこれに最適であり、独自のサーバーのセットアップは、仮想マシンまたはソースをgithubからダウンロードするのと同じくらい簡単です。
マークブース

@giorgio私は当時8歳でした。私のスキルレベルは「これを入力して無料ゲームを取得する」
マイケルブラウン

25

私は過去に入門クラスを教えてきましたが、今振り返ってみると、

一部の学生は、プログラミングはさまざまな理由でそのようなものだと考えています。私はかつて、私がしたことをたくさん積んでいた良い子供を覚えています。

それは孤立した問題ではないが、同じクラスの他の生徒は同じような行動をしている、または問題に近づいていて、それを表現していないかもしれないと信じて、私はいつもクラスに取り組んでいました。

  1. 決定論などのいくつかのことを説明するのに時間がかかりました。つまり、同じ環境で同じデータとコードを使用しても同じ結果が得られることを意味します(「ランダム性」を排除します)。

  2. 問題解決は生徒の行動に依存するものであり、他の問題ではないため、問題の解決に注意を払うべきであり、正しい呪文を見つけることはできません。

  3. 彼らは教育環境にあるので、学習体験を提供するために問題が作成され、結果はプログラムする方法を学ぶことです(または、システム管理者のためのクラス、プログラムがどのように機能するかなど、場合によっては異なります)解決策をください。(「世界は別の計算機を必要としない、それは練習問題です」)、利用可能な資料(例:提供されたメモ)で問題を解決できます。

  4. 私はそれがコード完了にあると思います:「コピーして貼り付けても、コードはあなたのものです」。誰かがそれをした場合、それは貨物スタイルであってはなりません。すべての行は、私(個人)または別の生徒(同じ)またはクラスに説明する必要がありました。


23

あなたの学生がいました起動時に正しい「抽象レベル」のコースの初めに?たとえば、コードを1行も書かずにループや条件などの主要なプログラミング構造を紹介する宿題ですか?

プログラミングのイントロを取得したとき、最初の割り当ては「Rick the Robot」と呼ばれていました。銀行、食料品店などの興味深いポイントがある都市の航空写真を掲載した紙を用意しました。 「正しく見える」、「道路を渡る」、「繰り返し」や「何かあれば、何かをする」などを使用できます。(この割り当てを見つけることができなかったため、これは100%ではありません)アイデアは、Rickが与えられたもののみを使用でき、マップ上の別の場所に到達する必要があるというものでした。

これは楽しいエクササイズであり、基本を紹介したものです(初心者にとっては難しい場合があります)。この問題(ゲーム)に対する適切な答えは1つもありません。また、コピーして貼り付ける方法もありません。このようなことにより、コードを威圧することなく、彼らの創造性をもう少し試すことができます。

最後に、アイデアは、抽象から始めて具体的な方向に向かっていくというものです。貼り付け要約をコピーすることはできません。彼らは問題を解決するためにそれを理解しなければなりません。


3
ループと条件?私はそれらを変数、割り当て、および式から始めます。コマンドラインから2つの数字を読み取って追加し、結果を出力します。多くの場合、ほとんど痛いほど明白なことをすることで、生徒は何が起こっているのかを理解できるという自信を学生に与え、実験することを奨励します。
TMN

2
@c_maker:あなたの課題は未就学児向けのゲームのように見えます。生徒にあまりにも簡単な課題を与えると、その科目に対する関心が低下するだけです。
ゴランジョヴィック

2
@c_maker:あなたの答えにはメリットがあると思いますwhile not at-corner do take-one-step end。変数やデータ型のようなものを「埋め戻す」ことなく実際のコードに移行する方法を見ていませんでした。おologiesび申し上げますが、私の反省は反省について少し厳しいようです。
TMN

7
Rick the Robotの背後にある主な価値は、ループやifステートメントなどを理解するのを助けることではないと思います。主な価値は、プログラムを書く方法の一般的なプロセスを理解するのを助けることです。特定の段階的なアルゴリズムの方法で問題を確認するのに役立ちます。このような例でプログラミングプロセスを英語で理解したら、コードがどのようなものかを教えることで詳細を記入できます。これは素晴らしいアイデアです。+1
フィル

1
[Karel the Robot](en.wikipedia.org/wiki/Karel_ ( programming_language))に基づいた入門コース(30年前!)を思い出させます(注:実際のURLに括弧が含まれているため、リンクは失敗します表示されるページの最初のオプションをクリックします。)とにかく、KarelはPascalのような構文を使用しましたが、あまり多くは使用しませんでした
JeffK

20

彼らに求めているのは、現在ブルームの分類法の認知領域で分析と統合を実証することです。そこでは、現在、アプリケーションのみを実証しています。

残念ながら、それは一種の「馬を水に導く」タイプの状況です。理解と分析にまだ苦労している場合、分析と合成も非常に困難です。適切な理解がなければ、分析と統合の活動は学習活動よりも雑草のように振る舞います。

私の個人的な意見では、プログラミングクラスのイントロのアプリケーション以上のものを期待しないでください。学生がこれらの概念に触れたのはこれが初めてなので、子供にエッセイを書く前に読むことを教えるようなものです。それらの高次のスキルは、後のクラスで続きます。


2
ブルームの分類について非常に興味深いビット。私の意見では、イントロクラスでコードをコピーして貼り付けるよりも、学生にコードを理解してもらうことが重要です。if文がどのように機能するかを知り、先に進む前に独自に文を書くことができる必要があります。認知部分を機能させてから、アプリケーションに進みます。
フィル

私は最近、リチャード・フェルダーによる素晴らしい教育関連コースに参加しました。彼の意見では、ステップアップする前に、ブルームの分類の下位レベルを「マスター」する必要はないということでした。一例として、彼は幼稚園の子供たちがセサミストリートと[...?]のどちらのテレビ番組が良いかを比較するよう求められたとき、どのように分析を練習しているかを話しました。
エイバー

11

最初から何らかのコードを提供することを検討ましたか?空のメイン関数のように、割り当てに必要な単純な足場は何でも(使用している言語がわかりません)。コンパイルして実行し、何もしないもの。その後、少なくともその一部が機能するというある程度の自信を持ってコードの追加を開始できます。

これは実際には「現実の世界」ではかなり一般的です。多くのIDEやその他のツールは、典型的なライブラリ/テンプレート/構成ファイルがすでに配置された空のプロジェクトを作成します。


コードを提供するもう1つの方法は、作成したクラス(以前のコードでは機能しない)と対話するように要求し、コードを変更できないという割り当てを要求することです。割り当てを機能させるコード。
Zoot

または、一方向で動作するようにコードを提供し、動作を変更/追加する割り当てを行います。そうすれば、彼らは基本的な動作ではなく、特定の動作に焦点を合わせます。
JohnMcG

最初の言語については、最初に定型文を必要としない言語を使用してみてください。Pythonはこの点で優れており、たとえばC / C ++ / Javaは悪いです。
ライライアン

どちらかといえば、IDE、コード補完、およびテンプレートは貨物カルト精神を促進します。学生がそのテンプレートコードが必要な理由を理解するために時間をかけ、盲目的にレシピに従うよりもはるかに多くを学ぶ場合。
マークブース

8

あらゆる種類のカーゴカルトの考え方(カーゴカルト自体を含む)は、関連する技術の基本的な理解の欠如に由来します。

貨物カルトプログラミングは、問題のある習慣と考えるべきではなく、プログラマが直面している根本的な混乱の症状と考えるべきです。

さらに重要なことは、生徒の理解不足が単に自信不足の結果であるという仮定は根本的に見当違いであり、根本的な問題に対処していないことです。

代わりに、学生のコピーペーストプログラミングスタイルは、この学生が期待することの複雑さに圧倒されていることを伝える赤い旗である必要があります。

彼は現在のプロジェクトを構築するための足場として過去の仕事を本能的に使用しており、以前に解決した問題を構成要素として使用してソリューションを構成しようとしています。私たち全員はある程度これを行いますが、私たちのほとんどは、過去の仕事から知識をビルディングブロックとして使用してこれを行います。この生徒は代わりに作品自体を使用しています。つまり、彼は自分が作業しているブロックを本当に理解していないことを意味します。彼は彼の理解が許す限り作業を分解し、それらがどのように機能するか理解していないため、大きなコードブロックをアトミック単位として扱います。彼は彼らが何をするかを知っているだけです。


ありがとう!あなたは私にたくさんの考えを与えてくれました。最初は、コードの中に構造と構成上の意味があるとは想像できないと思いました。今、私は彼らが実際にそれを理解するのに苦労したが、失敗し、最後の手段としてコピー&ペーストを使用したと考えています。
アイバー

7

プロジェクトのアイデアを変えましょう!

プログラミングの世界では、登場するすべてのソリューションに対して新しいプロジェクトを実際に作成することはめったにありません。ほとんどの場合、古いものを変更します。

プロジェクトのアイデアを、割り当てごとの1つのソリューションから学期全体の1つのソリューションに変更します。各割り当て、以前の割り当てに基づいています。

プロジェクト:エレベーターシステムの構築

  • 課題1:現在のフロアを印刷する
  • 割り当て2:エレベータークラスのデータ構造を作成し、エレベーターに基づいてフロアを印刷する
  • 割り当て3:「エレベーターを動かす」コードを作成し、床を印刷します。キーボード入力を受け入れます(> enter floor:)
  • 割り当て4:複数のエレベーターを扱う

ポイントは、新しいタスクのために古い割り当てをリサイクルするのではなく、以前の割り当てに基づいて構築することです。


2
コピーと貼り付けは問題ではありません。問題は、彼らが何をコピーしているかを理解していないことです。
エイバー

1
増分割り当ての問題の1つは、学生が初期の割り当てを台無しにすると、残りの部分で動作しないコードが残ってしまうことです。多くのインストラクターは、後続の割り当ての基礎として使用する作業コードを有用に提供しますが、元の問題に戻ります:理解できない他の人のコードを変更します。
バリーブラウン

本当に?インストラクターが、生徒がコードを機能させるのに役立つほど役に立たない場合、彼らは本当に自分の仕事をしていますか?
リチャード

すべての人が期日までに課題を実行できるわけではありません。
バリーブラウン

@Barry、これはコース全体で論理的に構築されるすべての科目の場合ではありませんか?たとえば、ユニオンとインターセクションのセットを学習したことがない場合は、離散数学コースの残りの部分に夢中になります。または、周期表を一度も学ばない場合は、残りの化学コースのソルです。アイデアは、学生に正しい順序で概念を習得させ、彼らがそれらを習得するまで彼らのロバを片付けることです。翌日の授業に向けてプログラムを準備するために一晩中一晩過ごすことができない場合、ソフトウェア開発のキャリアを作る必要はありません。
ジョナサンヘンソン

7

最小限の定型コードを必要とする非常に高レベルの言語の使用を検討してください。

私にとって、多くの場合、魔法のように感じて理解を妨げるのは、大規模なフレームワークまたは冗長言語の定型コードです。

私はCS入門プログラミングコースで個人的にMLを教えられました。長年にわたり、LispはMITのプログラミング入門として教えられていました。どちらも優れた選択肢です。彼らが持っている利点のいくつかは

  • インタラクティブな通訳。これは探索を可能にするため、非常に重要です。
  • とても簡潔です。定型文は一切ありません。これにより、生徒は表現しようとしているアイデアに集中できます。
  • 比較的あいまいで異質(少なくともJava、C、または学生がすでにある程度の経験を持っている他の主流言語と比較して)。はい、私はそれをプロとしてリストします。おそらく誰も事前の経験がないので、学生の競技場を平準化します。そして、Webから宿題にソリューションをコピーアンドペーストすることができる可能性が低くなります。

MLはかなり良い選択でしょう!しかし、Pythonは最初の2つのポイントにも適合し、使いやすいです(大きな技術的な面倒はありません)。
アイバー

また、特にWing IDEなどの優れたIDEと組み合わせる場合は、Pythonを強くお勧めします。
ケン

6

80年代の初心者プログラマーの問題に関する調査を行いました。今日の初心者プログラマーでの私の経験に基づいて、あまり変化はありません。初心者には、コンピューターが実際に行うことの有用なメンタルモデルがありません。機械自体が魔法であるため、彼らは魔法の呪文に頼る。

プログラミングでは、自然に単純なタスクを不自然に小さなステップに分割する必要があります。初心者は日常生活でこのような細かい粒度を処理しないため、特にマシンがどの小さなステップを使用可能にするかが明確でない場合、小さなステップが何であるべきかを理解するのは困難です。しかし、たとえそれを理解できたとしても、リモートコントロールによってミステリーマシンを制御するプログラミング言語(準自然言語を装った不自然な言語)のスティルト構文と限定されたセマンティクスに直面します。

問題に対する論理的な解決策とマシンの機能とを結び付けることができないため、言語の要求を満たすことに焦点を当てています。最初の目標は、コンパイルする何か-何でも-を書くことです。2つ目は、そのプログラムを実際に調整して、クラッシュしないようにすることです。次に、時間、エネルギー、関心がある場合、問題に必要なものに似た結果をプログラムで生成しようとします。途中で、誤って適切に記述されたコードを生成する場合があります。

おそらく、プログラミングを学んだ初心者は、意図的にコンピューターのメンタルモデルを与えられて内部化されたからではなく、コンピューターの有用なメンタルモデルを推測したから成功します。


5

書面による回答が必要なコードについて質問することができますか?「このコードは何をしているの?」「プログラマーはなぜこのように解決したのですか?」「もっと良い方法はありますか?」など?

それは実際に彼らに問題について考えさせます。それは彼らがコードに触れることさえなしにできることです。


5
  • 問題に可能な限り最短のソリューションを作成するように彼らに挑戦してください。
  • より簡潔なソリューションにインセンティブを与えます。
  • コードのリファクタリングを中心に展開する演習を作成する
  • 学生に課題を交換させ、オーバーヘッドプロジェクターで効率とコードのクリーンさのためにそれらを模擬評価し、いくつかの最も効率の悪いものを例として使用します。

2
リファクタリングは、実際に実践するために非常に重要です。ただし、最短の解決策は必ずしも最もクリーンでなく、最も効率的でもないことに注意してください(これらの用語の定義にも依存します)。
ペテルトレック

学校では、友人のソリューションよりもキャラクターの長さが短いソリューションを書き込もうとしました。つまり、短い変数名を使用し、一般的には読みにくいコードを記述します。
クリスチャン

@Christian要するに、コンパイラは実際には変数名を気にしないので、実際には文字の長さが短いという意味ではありませんでした。私はコードの複雑さについて話している...別名KISS
リンクランブリング

4

JoelFansのアイデアに似ているのは、作成した疑似コード(言語)を使用して、紙の上で最初の割り当てを行うことです。適切な構造を追加することができ、マジックボックスについて心配する必要はありません。


4

「カーゴカルト」とは、必要だと思うものを挿入するという意味ですが、実際には問題の解決にはまったく何もしません。

その場合は、簡潔さに基づいてグレーディングに何らかの要因をいつでも追加できます。プログラムに不要なコードや冗長なコードを残しておくと、将来的に問題が発生する可能性があります。

彼らは英語のクラスの作文演習でも同様に判断されます-ランダムな接線で消えたり、ポイントに到達せずに一般的にとりとめのないものを望んでいる人はいません。

アセンブリクラスを受講したとき、先生は各エクササイズで、速度、サイズ、またはメモリ使用量のコードを書きたいかどうかを教えてくれます。ために。

...

以前の同様の割り当てからコードをコピーして貼り付ける場合、実際には新しい問題を解決するものです...まあ、それは単にコードの再利用であり、再利用のためのコードの適合性について悪い仮定をしない限り、彼らが行うことは完全に合理的だと思います。(たとえば、ファイルからの読み取り、入力のプロップ...再利用可能なすべてのモジュール部品。それらを実行したくない場合は、演習を異なるものにする必要があります。


問題は、彼らがコードの構造を見ずにコピー&ペーストしていることです-彼らはこの種のパターンが前回有用だったと思うので、うまくいけばここにも収まることを願っています。彼らは自信を持つのではなく、望み、努力します。
エイバー

4

残念ながら、それが多くの人々の脳の働きです。だから、あなたがこれを「治す」ことができない人がいるというこの理解に入る。プログラミングに必要な精神的な精度のレベルで働くことができない多くの人々がいます。一部の人々は単にそのために設計されていません。私は学生をあきらめることを言っているのではありません-誰もがそれを拾わないとしても、あなたが失敗していると仮定してはいけないと言っています。

クラスのコンテキストについて詳しくは知りませんが、これらの問題のある学生は、非常に基本的な構造(単純な if / then、ループなど)にもっと焦点を合わせます。奇数、10個ごとの番号などを出力する単純なルーチンそれぞれ10行以上のコード。それらが「魔法の思考」である場合、彼らは明らかにそれらの基本をまだ習得していない。何が起こっているのかを把握するまで、多くの異なる単純なルーチンを実行させます。他の誰かがコードを紙に書くことについて言及した-私はそれがこれらの簡単なルーチンを行う素晴らしい方法でもあると思う。

また、フローチャートを学習させることも検討できます。一部の人々にとって、アルゴリズムのフローを確認し、それがどのようにコードに接続するかは、コードをフローに接続するのに役立ちます。


3

理想的には、最初の講義で、完全に抽象的なものから始めましょう。(グループとして、あなたがリーダーとして)彼らにリストから食料品の買い物をする方法についての指示を書き上げ、高レベルの指示を徐々に分解してもらいます彼らが悟りに達するまで

これらの指示の後に、物事を推測する方法を知らないロボットが文字通り従うことを伝えるのに役立ちます。ただし、ガイドを担当するのは非常に実践的なアクティビティでなければなりません。


いい視点ね!私はこれをやったことがあり、これが多くの学生を正しい道に導いたと信じています。すべてではありません。
アイバー

3

アリスター・コバーンは、シュウ-HA-Riをの概念とどのようにそれはプログラミングに適用さについて語っhttp://alistair.cockburn.us/Shu+Ha+Ri。学生がこの連続体のどこにいるかを頭に入れておくことは重要だと思います。まず、それはあなたの欲求不満の一部を緩和するのに役立ちます。コピー/模倣は非常に自然な反応であり、最初に何かを学び始めたときに受け入れられるモードです。第二に、それはあなたが前進する方法のいくつかのアイデアを得るのに役立つかもしれません。たとえば、複数の方法(ループと再帰、コンソールとweb / gui)で解決できる問題を選択することを検討し、最初にそれを明示的に解決し、次に別の方法で解決することをお勧めします。正当なコードの再利用、コンポーネント化、再利用可能なライブラリの作成などについて

私が使用したもう1つの成功した方法は、相互にビルドする一連のプロジェクトを作成し、割り当てられた後の各ステップでデフォルトの作業バージョンを使用可能にして、人々が遅れないようにすることです。プロセスの各ステップでは、新しいものを導入する必要があります。プログラミングクラスよりもデザインクラスの方が簡単かもしれませんが、それでも実行できるはずです。これの良い点の1つは、各ステップでそれらと比較するために、適切な(できれば)実装を明示的に与えることです。この比較を割り当てとして公開します。つまり、努力に対して自分のコードのミニコードレビューを行います。これをいくつかの追加クレジットオプションの1つにしたい場合があります。

私は通常「コメント」についてはあまり好きではありませんが、コードのドキュメントを成績項目の1つにしたいと思うかもしれません。各プロジェクトの「動作理論」ドキュメントを作成してもらい、各プロジェクトのアプローチ、各コンポーネントの適合方法、および問題の解決方法を説明します。通常、私はコードがこれの多くを単独で行うことを望みますが、それは彼らに思考のキャップをつけて紙にそれを置くように彼らを駆り立てます。

最後に、創造性を発揮し、生徒に互いのコードを確認させ、評価を与えたい場合があります。あなたのために働くために仲間の圧力をかける。これが最高評価コード(およびドキュメント)のグレードまたは追加クレジットの一部になることを許可します。


3

ちょっとした提案。解決またはデバッグする必要があるプログラミングの問題があるときはいつでも、コードを見て、コンピューターを再生するのが好きです。そのため、どこかからコードをコピーした場合、それ自体で完全でなく、単に参照する必要がない限り、何が起こっているかを正確に理解するために行ごとに移動するのが好きです。基本的にはコンピューターを再生します。VBAデバッガーは基本的にこのタスクを簡単にしますが、生徒に紙の上でそれをさせることで、基本的なことができるようになります。この行は実際に何をしますか?


これを行うことを推奨しましたが、一部の人にとっては遅すぎてエラーが発生しやすいプロセスであるため、スキップすることを決定します。
アイバー

マーカーを使用してプロジェクターで彼らの前でこれをやってみましたか?私の高校のプログラミングクラスを覚えていたら、先生がこれをやったのですが、他の生徒のほとんどは気にしませんでしたが、役に立つスキルだと思いました。(警告の一般化が近づいています)私の世代以下の学生にやる気を起こさせるのは難しいです。私たちは質問をしないことを学びました。
マロー

3

大学レベルで入門プログラミングを教えました。それはパンとバターのコースであり、すべての学部がそれを行いました。私たちは共通のテキストに従って一般的な試験を受けましたが、それぞれ独自の教室方式が機能していました。それから長い時間が経ちましたが、ときどきプログラミングの子供を家庭教師にすることができ、全体像はほぼ同じです。

私がやる方法は、できる限り具体的に、一番下から始めることです。生徒が知っているのは構造です。彼らはすでに多くの概念を持っています。私はそれらの上にさらに概念を構築しており、それらが形成するかもしれない、非生産的な概念を取り除きます。同時に、を行うことで学習さます

Intel 8008チップ、EPROM、およびいくつかの回路を備えた小さなコンピューターを構築しました。I / Oチップがいくつかのスピーカーに接続されたときに少しデュエットするようにプログラムしました。小さなプログラムがどのように機能するかを説明し、カウンターをカウントダウンするための内部ループを使用します。それは遅延として機能します。次に、出力ビットを切り替えて、再度実行します。それはしばらくそれをしてから、別の遅延に切り替えて、別のピッチを与えるなどです。メモリチップには小さなタイマーがあり、タイマー入力の1つの下にコンデンサのリード線を挟むと、プログラムの実行速度が遅くなります。クラスは、スピーカーのクリック音、クリック音、クリック音を聞くことができました...私は、コンピューターが一度に1ステップずつ非常に単純なことをしていることをクラスに理解してもらいたいと思いました。。その後、コンデンサのリードを外し、「音楽」が飛び出しました。(拍手)

次に、1000個のメモリ位置を持ち、それぞれが4桁の符号付き10進数を保持する、非常に単純な10進数コンピュータ用のシミュレータを構築しました。「アキュムレータに追加」、「負の場合ジャンプ」などの非常に単純なオペコードがありました。2つの数字を追加したり、数字のリストを追加したりするような、この「マシン言語」で小さなプログラムを作成してもらいます。その後、シングルステップで動作するか、Enterキーを押して「高速」で実行されるのを見ることができます。

これのポイントは、コンピューターは非常に少数の異なる基本操作しか実行できず、一度に1つずつしか実行できないという概念を導入することでした。これは、コンピューターが複雑であり、すべてを同時に実行し、心を安易に読んでいるという印象に対抗するためです。

そこから、「本物の」言語(BASIC :)でのプログラミングに進み、非常にシンプルだが興味深いプログラムから始め、条件、ループ、配列、ファイル、マージなどを進めていきました。オブジェクトは、プログラミングを面白くする唯一のものであるため、自分で選んだプロジェクトを引き受けることができるように十分なスキルセットを配置することでした。私はプロジェクトのアイデアをいくつか捨てて、それから彼らはそこからそれを取るでしょう。私は、書かれたアイデアを求め、それから進捗報告を求めて、彼らが最後まで延期してパニックに陥らないようにします。彼らは自分たちの力で学んでいたので、プロジェクトは最高の部分だったと思います。

コンピューターが何をするかを非常に具体的に理解することで最初に基礎を置くことで、後で概念や後のコースでのポインターのような本当のスピードバンプを概念を教えるのがずっと簡単になりました。「抽象化」の概念をこの素晴らしいものとして賞賛する傾向がありますが、それは空中ではなく、具体的な基盤の上に構築される必要があります。


3

saself -私は信じている教えプログラマアニメーションは、コードが何をしているかを知るの点で最も挑戦的であることを。プログラムに抽象的な操作を実行するアルゴリズムと数学的な変換が含まれている場合、特定の時点で数学が何をしているのかを理解する唯一の方法(天才でない限り)は、コード自体の実行を理解する必要があります。

私の素朴な考えが間違っている場合は修正してください。あなたがしたいことはnot、学生が「デザインパターン」を使用するのを防ぎますが、彼らが彼らがCnPであるものを理解することを確実にする方法を見つけることですか?次に、生徒にアニメーションを操作するように挑戦します。アニメーションの出力を調整するには、各ステップで何が起こっているかを理解する必要があります。あなたが述べた懸念について、私はよく考えられたアニメーションプロジェクトが学生が「それを取得する」ときに明白な形で現れることを想像します-あなたが予期しないまたは特定の関連する相互依存変数を微調整した変換を実現したとき。

あなたが働いている教育の限界と目標を知らなければ、アニメーションが完全な答えだとは言えません。アニメーションの専門職以外のアニメーションのカリキュラム全体は、疑いの余地がありません。いくつかのプロジェクトはそれでもなお、芸術的で素晴らしい何かをもたらすことがありますが、それは悪くありません。

別の注意として、高校レベルのコーディングオリンピック --- wot-wot--就学前のプログラマーのための競争についての新聞記事(はい、紙!)を読みました。彼らの課題の説明は、読んだことを思い出すことができる純粋なコーディングの最も明確な表現でした。競合他社は、お互いに対して、そして優れた実践基準によって判断されます。これらのコンテストでは、学生はソリューション計画し、制限時間内に問題を解決するために必要な要素の「デザインパターン」を手作業でコーディングする必要があります。したがって、CnPプログラミングに関する懸念に対する解決策は、生徒がCnP'nと同じ「コードチャンク」を記述できるかどうかテストすることです。

NY Timesにあったと思います。クイック検索では見つかりませんでした。同様の例は、ACMのInternational Collegiate Programming Contestです。このコンテストはスピーディなプログラミングを強調しています。「チーム競技での電光石火のプログラミングは明らかに風変わりなスキルであり、求職者の多くが履歴書の最上位にいるわけではありません。」したがって、実世界の問題からの抽象化がその解決策であることをお勧めします。

また、

HP Code Wars


2

技術的には優れているがあまりにもあいまいなプログラミング言語を使用してクラスを指導し、コピーする既存のコードを見つけることができないようにします。


1
私は彼らが他の誰かの作品をコピーすることを心配しませんが、彼ら自身の作品またはいくつかの例のスニペットは与えられた状況では使用できません。
アイバー

2

また、それらを苦労して扱うこともできます。

彼らに有害なコピー・ペーストを作成する方法を見つけてください。正確な例はありませんが、同様の外観の2番目のエクササイズに貼り付けた場合、その解決策を最初のエクササイズとして作成すると、貨物カルトの学生は非常に長くて痛みを伴う「不安定な不安定性」または「サイレントデータ破損」バグに陥ります。一方、「非カーゴカルト」の2分間の思考は、最悪の学生でさえ明らかな解決策をもたらしました(彼は最初の運動の解決策を見ていませんでした)。その後、レッスンを学習し、3回目の演習に貼り付けコードをコピーする前に、考え直す可能性があるかもしれません。


1

この振る舞いは、プログラムが魔法の呪文であるという信念によるものだとは思わない-おそらくそれは怠であり、やる気がない。

ですから、教師としてのあなたの仕事は生徒をやる気にさせることだと思います-真にやる気のある生徒は、解決策を切り貼りすることはありません(それは、期限と最終目標を達成するプログラマーのためだけです...)


それらの学生の一部にとって、怠zyおよび/または締め切りは確かに原因です。しかし、いくつかは...本当にハードに働いている
Aivar

@Aivar-インストラクターとして、あなたはおそらく学生の長所と短所についてもっと知識があるでしょう。好奇心から、「一生懸命働いている」学生にとっての障害は何と思いますか?
リー

@Leigh-私は彼らが彼らの脳の分析部分を十分に訓練しておらず、彼らは総当たりで割り当てに近づいていると思う-彼らの作業方法は徹底的な検索から遠くない。そして、それらへの代替アプローチを説明するのは難しいです。
アイバー

@Aivar-おそらく、初期段階での分析により重点を置くべきでしょう。たとえば、2つの部分の抜粋を設計します。最初のセグメントは、コードの構成要素に焦点を当てています。2番目は同じ例を分解、デバッグ、分析します。すなわち、「なぜ」質問をし、さまざまなアプローチ(ブルートフォースなど)と現実世界の相関関係を持つコードを改善する方法を議論します。早い段階で頻繁に行われると、知識が固まり、プログラミングを特定の言語で適切な構文を構築する以上のものと見なすようになります。
リー

1

サブルーチンを教える。前の割り当てから取得したコードを取得して、サブルーチンに変換します。サブルーチンが実際に何をしているかを理解できるように、関数のドキュメントについて教えてください。


これは実際には問題を解決しません。
パブ

そうだと思います。カーゴカルトとは、目的を果たさないコードを含めることです。彼らがコードをサブルーチンに分割し、それらのサブルーチンが何をするかを文書化しているなら、これは役立つはずです。分析は学習の重要な部分であり、分析は物事を部分に分解する必要があります。
トニートッパー

1

インターネットアクセスが提供されていない教室で、生徒に目の前で課題を実行させます(授業中に学校を遮断し、電話の使用も禁止します)。少なくともテストではこれを行います。基本的なプログラミングの実験にインターネットを使用する理由はまったくありません。本は、イントロ演習のための十分なリソースである必要があります。高度なクラスに参加し、思考方法を既に習得していれば、インターネットの使用を許可します。


1

同様に聞こえる割り当てを与えないでください。

または、もっとクレイジーに、最初からTDDを学んでください。それは実際に解決されている問題を定式化するのに役立つ多くのコード(つまりテスト)を書く(コピーする、書くのではなく)ことを要求します。


テストを書くことは、多くの場合、最初にコードを書くことよりも困難です。多分、先生がテストを書き、それを生徒に渡して課題に逆らって実行することを勧めます。
TMN

@TMN:それは裏目に出る可能性があります。テストに合格するまで、生徒はコードをランダムに変更することを暗黙的に奨励されます。
ゴランジョヴィック

@GoranJovic:「暗黙的に推奨」に同意するかどうかはわかりませんが、意図的に書かれたコードとテストに合格するためだけに一緒にハッキングされたコードを区別する簡単な方法はないことを認識しています。もちろん、この問題は学界に限らない...;)
TMN

@TMN:そして、「一度に(開発者が必要とするのと同じくらい簡単な)1ステップ」という段階がなくなります。
ハービー

解決策:プログラムの作成中に学生が使用できる最小限のテストセットを提供しますが、プログラムはより包括的なテストセットに対して評価され、学生が作成したテストに対して実行されることを警告します。
バリーブラウン

1

私のクラスの人々にとって非常に役立つとわかったのは、自分たちが選択できるテーマで、彼らに小さなプロジェクトを書くことです。

私がプログラミングを始めたとき、私にとっても大変でした、そして、私はクラスで多くをコピーしました。それから、自宅で、ゲームプログラマになりたいと思って、小さなゲームを作り始めました。彼らはクラスで見たものよりもはるかに困難でしたが。興味があるからといって。

私のクラスの他の数人は、まったく同じことをしたため、試験の40〜50%から90〜100%になりました。


1

私がプログラミングの入門コースにいたとき、インストラクターは全員にアルゴリズムを英語で書き、それを印刷して提出してからコードを書き始めるように要求しました。次に、変数の作成、ユーザーからの入力の取得、計算の実行、出力の印刷など、多くのコメントを配置する必要があります。もっと。これにより、私は自分が何をしているかを考え、解決策を書き、英語とJavaの間で前後に翻訳し続ける必要がありました。

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