初心者にプログラミングを教えるための最良の方法は?[閉まっている]


324

元の質問

私は現在、弟にプログラミングを教えることに取り組んでいます。彼は完全に初心者ですが、とても頭がいいです。(そして、彼は実際に学びたいです)。一部のセッションが細部まで行き詰まっていることに気づきましたが、私はあまり整理されていないと思います。(しかし、この投稿への回答は非常に役立ちました。

彼に効果的に教えるにはどうしたらいいですか?概念ごとに実行するために使用できる論理的な順序はありますか?後でまで避けるべき複雑さはありますか?

私たちが使用している言語はPythonですが、どの言語でのアドバイスも歓迎します。


助ける方法

あなたが良いものを持っているなら、あなたの答えに以下を追加してください:

  • 初心者向けの演習とプロジェクトのアイデア
  • 初心者を教えるためのリソース
  • スクリーンキャスト/ブログ投稿/無料の電子書籍
  • 初心者に役立つ本を印刷する

参考にできるように、リソースへのリンクを記載してください。私はこれらのアイデアのいくつかを確実に使用していることを皆さんに知ってもらいたいです。あなたの投稿はこの投稿に集約されます。


初心者向けのオンラインリソース


初心者向けのおすすめのプリントブック


なぜこれをクローズするべきか分かりません。少なくとも295人のユーザーが、この質問(および92件の回答)が賛成票を投じるのに十分役立つと感じており、そのうち290人がお気に入りの質問の1つと見なしています。質問は、教材の非常に有用な集合体をもたらしました。それは実際に「議論」や「議論」をもたらしたわけではありませんが、プログラミングにおける困難な「人的要因」の1つに対処する方法についての多くの素晴らしいアドバイスです。このような質問を締めくくることは過酷で、StackOverflowコミュニティにとって有害で​​す。
ジャスティン・スタンダード

@JustinStandard編集をコメントへの回答のいくつかに変換することを検討しましたか?たとえば、ここここ、そしてここ
Jason Plank

回答:


118

私は何人かの初心者(コードを書いたことがない)のプログラマーと一緒に仕事をしなければならなかったので、今秋には高校生と放課後のワークショップを行います。これは、ドキュメントに最も近いものです。まだ作業中ですが、お役に立てば幸いです。

1)FizzBu​​zz。コマンドラインプログラムから始めます。楽しいゲームやツールを非常にすばやく作成でき、最初にGUIツールを学習しなくても、すべての言語機能を非常にすばやく学習できます。これらの初期のアプリは、アプリを動作させるために実際のデバッグツールを使用する必要がないほどシンプルである必要があります。

FizzBu​​zzのようなものは他に何も良いプロジェクトではありません。最初のいくつかのアプリは、DB、ファイルシステム、構成などを処理する必要はありません。これらはほとんどの人を混乱させる概念であり、構文と基本的なフレームワーク機能を学んでいるだけであれば、それほど複雑にする必要はありません。

一部のプロジェクト:

  • "こんにちは世界"
  • 私の生まれた年を取り、私の年齢を計算します(今(今のところ)月の訂正はありません)。(簡単な数学、入力、出力)
  • 方向を尋ねて(上、下、左、右)、ユーザーに運命を知らせます(穴に落ちる、ケーキを見つけるなど)。(ブール論理)
  • FizzBu​​zz、しかし毎秒1回カウントします。(ループ、タイマー、その他のロジック)
  • 年齢によっては、ある間隔でユーザーにランダムな侮辱を呼ぶアプリが本当に好きな人もいます。(ループ、配列、タイマー、および間隔をランダムにした場合はランダム)

2)シンプルなプロジェクト言語機能を十分に理解したら、プロジェクトを開始できます(シンプルで楽しいゲームがうまくいきます)。最初のプロジェクトが6〜12時間以内に完了するようにしてください。早く設計するために時間を費やさないでください。たとえそれがひどいとしても、彼らにそれを設計させてください。それがばらばらになったら、何が起こったのか、なぜ失敗したのかについて話し、次に別のトピックを選んでやり直してください。

ここから、ツールのデバッグ機能の導入を開始します。コードを読んで問題を確認できたとしても、ツールの使用方法を教えてから、問題の見方を示す必要があります。これは、デバッグツールを教えることと、ツールなしでエラーを識別する方法を教えることの2つの目的を果たします。

一度、またはプロジェクトが機能するようになった場合、それを使用してリファクタリングツールを導入できます。その後、計画していなかったいくつかの単純な機能を使用してプロジェクトを拡張できると便利です。これは通常、リファクタリングと重要なデバッグを意味します。これは、最初から半分も適切なコードを書く人がほとんどいないためです。

一部のプロジェクト:

  • 絞首刑執行人ゲーム
  • ロボット工学の実験(VexMindstormsはオプションです)

3)実際のプロジェクト実際のプロジェクトを開始するには、時間がかかる場合があります。適切なソース管理を使用し、スケジュールを立てるようにします。このプロジェクトを実際のプロジェクトのように実行します。他に何もないのは、ツールを扱う必要のある良い経験です。

明らかにあなたは一人一人のためにこれを調整する必要があります。私が見つけた最も重要なことは、最初のシンプルなアプリでさえ、その人が興味を持っていることに適用できるようにすることです。

一部のプロジェクト:

  • テトリス
  • テキストファイルベースのブログエンジン
  • より高度なロボット工学の仕事

これは素晴らしいガイドです。個人的には、私は紙袋から出る方法をコーディングすることはできません(実際に誰かがそれを実際に行うのを見たいのですが)。
keyofnight

これは非常に良い答えです。私の唯一の異論は、テトリスが最初のゲームまたは2番目のゲームに適していないことです。そのレベルでは、衝突検出は困難な問題になる可能性があります-彼らがそれを解決できれば素晴らしいことです。
phkahler、2010

@phkahler私はあなたの要点を理解していますが、コードを書く前後に分析できるOSS /デモの実装がたくさんあるので、テトリスは興味深いと思います。
エリックハスキンズ2010

30

あなたはアリスを使ってみることができます。これは、入門プログラミングクラスで使用するために設計された3Dプログラムです。

多くの場合、新しいプログラマにとって最大の障害は2つあります。

  • 構文エラー
  • 動機(不自然なものではなく、意味のある楽しいものを書く)

アリスはドラッグアンドドロップインターフェイスを使用してプログラムを構築し、構文エラーの可能性を回避します。アリスを使用すると、3Dワールドを構築し、コードコントロール(シンプル)3Dキャラクターとアニメーションを作成できます。これは通常、リンクリストを実装するよりもはるかに興味深い方法です。

経験豊富なプログラマーは、アリスをおもちゃのように見下ろし、コード行をドラッグアンドドロップすることを非難するかもしれませんが、調査ではこのアプローチが機能することが示されています。

免責事項:私はアリスに取り組みました。


ランディ・パウシュの前回の講義で知りました。このプロジェクトの背後にある推論は私の心を吹き飛ばしました。
Jesvin Jose、2011

28

基本的な概念を理解するために、ロゴ(別名亀)をお勧めします。すぐにグラフィカルなフィードバックが得られる優れたサンドボックスを提供し、ループ、変数、関数、条件などをデモートできます。このページは、優れたチュートリアルを提供します。

ロゴの後、PythonまたはRubyに移動します。プログラミングを教える目的で発明されたABCに基づいているため、Pythonをお勧めします。

プログラミングを教えるとき、私はEHaskinsの単純なプロジェクトとそれから複雑なプロジェクトの提案に2番目にならなければなりません。学習する最良の方法は、明確な結果と測定可能なマイルストーンから始めることです。それはレッスンを集中的に維持し、学生がスキルを構築し、次にそれらのスキルを構築することを可能にし、友人に見せるために学生に何かを与えます。自分の作品に何かを見せることの力を過小評価しないでください。

理論的には、Pythonはほとんど何でもできるので、Pythonを使い続けることができます。オブジェクト指向プログラミングと(ほとんどの)アルゴリズムを教えるのに適した手段です。コマンドラインのようなインタラクティブモードでPythonを実行して、Pythonがどのように動作するかを感じたり、スクリプト全体を一度に実行したりできます。その場で解釈されたスクリプトを実行したり、バイナリにコンパイルしたりできます。機能を拡張するための何千ものモジュールがあります。Windowsにバンドルされているような電卓を作成したり、IRCクライアントなどを作成したりできます。

XKCDはPythonのパワーをもう少しよく説明しています: 「あなたは飛んでいます!どうやって?」 「パイソン!」

その後はC#またはJavaに移行できますが、Pythonにはまだ備わっていない機能は提供されていません。これらの利点は、Cスタイルの構文を使用することです。これは、多くの(ほとんどの場合言うでしょうが)言語で使用されています。まだメモリ管理について心配する必要はありませんが、言語インタプリタからの自由度が高く、手持ちが少ないことに慣れることができます。Pythonは空白とインデントを強制します。これはほとんどの場合に便利ですが、常にそうとは限りません。C#とJavaを使用すると、厳密に型指定されたまま、独自の空白を管理できます。

そこから、標準はCまたはC ++です。これらの言語の自由は、ほとんど実存的なものです。自分のメモリ管理を担当します。役立つガベージコレクションはありません。これは、本当に高度なアルゴリズム(マージソートやクイックソートなど)を教える場所です。ここで、「セグメンテーション違反」が呪いの言葉である理由を学びます。ここで、Linuxカーネルのソースコードをダウンロードし、Abyssを見つめます。まず、文字列操作用の循環バッファーとスタックを記述します。次に、上に向かって進みます。


実際には、Cでメモリを完全に管理しているわけではありません。mallocなどを用意して、自由に管理できます。メモリを増やしたいときや、使用していたメモリを使い終わったら、システムに通知する必要があります。
compman '24

15

優れたPythonコースは、MITのPythonを使用したプログラミングの穏やかな紹介です。それはすべてオンラインで無料で、それを理解するためにMITの学生である必要はありません。

編集[ ジャスティンスタンダード ]

このコースでは、この無料のオンラインブックを使用しています:コンピュータ科学者のように考える方法
私は間違いなく、それは非常に便利見つけることです。


12

PythonパッケージVPython -Ordinary Mortalの3Dプログラミング(ビデオチュートリアル)。

コード例:

from visual import *

floor = box (pos=(0,0,0), length=4, height=0.5, width=4, color=color.blue)
ball = sphere (pos=(0,4,0), radius=1, color=color.red)
ball.velocity = vector(0,-1,0)
dt = 0.01

while 1:
    rate (100)
    ball.pos = ball.pos + ball.velocity*dt
    if ball.y < ball.radius:
        ball.velocity.y = -ball.velocity.y
    else:
        ball.velocity.y = ball.velocity.y - 9.8*dt

VPythonバウンドボールhttp://vpython.org/bounce.gif


基本的な概念を学習した直後に適しています。ビジュアルを作成することは、人々にプログラミングを学ぶ動機を与える優れた方法です。
phkahler 2010

12

PythonのTurtleグラフィックから始めます。

Pythonに標準で付属しているタートルグラフィックを使用します。それは視覚的でシンプルであり、この環境を使用して、構文に深く入り込む前に、反復やプロシージャー呼び出しなどの多くのプログラミング概念を導入できます。Pythonでの次のインタラクティブセッションを考えてみます。

>>> from turtle import *
>>> setup()
>>> title("turtle test")
>>> clear()
>>>
>>> #DRAW A SQUARE
>>> down()        #pen down
>>> forward(50)   #move forward 50 units
>>> right(90)     #turn right 90 degrees
>>> forward(50)
>>> right(90)
>>> forward(50)
>>> right(90)
>>> forward(50)
>>>
>>> #INTRODUCE ITERATION TO SIMPLIFY SQUARE CODE
>>> clear()
>>> for i in range(4):
        forward(50)
        right(90)
>>>
>>> #INTRODUCE PROCEDURES   
>>> def square(length):
        down()
        for i in range(4):
            forward(length)
            right(90)
>>>
>>> #HAVE STUDENTS PREDICT WHAT THIS WILL DRAW
>>> for i in range(50):
        up()
        left(90)
        forward(25)
        square(i)
>>>
>>> #NOW HAVE THE STUDENTS WRITE CODE TO DRAW
>>> #A SQUARE 'TUNNEL' (I.E. CONCENTRIC SQUARES
>>> #GETTING SMALLER AND SMALLER).
>>>
>>> #AFTER THAT, MAKE THE TUNNEL ROTATE BY HAVING
>>> #EACH SUCCESSIVE SQUARE TILTED

最後の2つの割り当てを達成しようとすると、多くの失敗した試行が行われますが、失敗は視覚的に興味深いものであり、期待どおりに描画されなかった理由を理解しようとするため、すぐに学習します。



11

重要なのは、問題の人が解決したい問題を抱えている必要があるということです。書きたいプログラムがない場合(そして「次の地震を書きたい!」ではなく、賢明で明確に定義されたもの)は、プログラミングを学ぶことができません。 。つまり、本を読んで言語の構文とセマンティクスを大まかに理解することはできますが、記述したいプログラムができるまで、イラクサを理解することはできません。

その推進力が存在する場合、他のすべてはほんの小さな詳細です。


技術的な主題を学ぶ最良の方法は、小さな増分問題を解決することを学ぶことだと思います。
cbednarski、2010





4

彼が興味を持っているなら、マイナーな詳細は良い部分ではありませんか?Pythonを使用すると、混乱を解消するために、GUIはすでに切り離されています。プロジェクトやゲームなどを選んで実装してみませんか。古典的なハイロー番号推測ゲームは、コマンドラインから20行から30行のコード(もちろん言語によって異なります)で簡単に実装でき、変数、条件、ループ、ユーザー入力を提供します。



4

私は彼にたくさんのコードを書かせただろう。彼にあなたたちがすることすべてを運転させ、質問に答えられるようにしてください。

信じられないかもしれませんが、数か月のくだらないコードを書いて数か月した後、彼はアイデアを得て、より良いプログラムを書き始めるでしょう。その時点で、詳細(メモリなど)に行き詰まり、一般的な設計原則について話すことができます。

偉大な芸術家と平凡な芸術家を区別するものは、彼らが練習するたびに、どんなに小さくても、何かを改善するということです。兄に練習させてください。そうすれば、彼はキーボードに座るたびに上達します。

編集:[ジャスティンスタンダード]

エステバン、これは最近のコーディングホラーポストを思い出させます。私あなたが正しいと思います。しかし、彼の実践を導く方法を見つけることはまだ価値があると思います。間違いなく、私は彼に方法を知っているのと同じくらい多くのコードを書いて欲しいです。それが私がサンプルプロジェクトを求めている理由の1つです。


はい、私はあなたがジャスティンについて話している投稿を知っています。それを読んで、私が学んだことのほとんどは、自分の過ちを試して学んだことから生まれたものだと思いました。私は実際に学ぶことの重要性を十分に強調することはできません!
エステバンアラヤ

2

まず、Hello Worldプログラムを使用して、他の人と同じように始めます。シンプルで、プログラムのレイアウトの基本的な感じを与えます。最初にプログラミングしたときと、いくつかの概念がどれほど難しかったかを思い出してください。簡単に始めましょう。

Hello Worldの後で、いくつかの基本的な変数、算術を作成し、ブールロジックとif / elseステートメントに移ります。古いプログラミングの教科書を持っている場合は、初期の例をいくつかチェックして、彼にそれらを実行してもらいます。一度にたくさん紹介しすぎないようにしてください。そうしないと、圧倒されて混乱を招きます。


2

兄弟にプログラミングを教えるときに非常に注意する必要があるのは、兄弟があなたに過度に依存しないようにすることです。多くの場合、私が他の人を助けることに気付いたとき、彼らは私を彼らのすべての質問への答えの本として考え始め、答えを見つけるために実験するのではなく、彼らは単に私に尋ねます。多くの場合、最良の教師は実験であり、兄弟が「文字列に2を追加するとどうなりますか?」あなたは彼にそれを試してみて、自分の目で確かめるように言うべきです。また、コンセプトを誰かに伝えることができないときは、各セグメントを個別に見て、それを少しずつ説明できるサンプルコードを見ると役立つことに気づきました。余談ですが、プログラミングに不慣れな人は、オブジェクト指向プログラミングのアイデアにしばしば問題を抱えています。


2

私はプログラミングを教えるために使用していましたが、あなたの兄弟は彼が学びたいと思っているほとんどの私の学生に比べて1つの主な利点があります:)

Cを使うことに決めた場合、友人には、古い世代のプログラムを基本的なタイプインとして覚えているようなプログラムがあるサイトがあります。それらのより複雑なものは、ncursesを使用します。これは、一種の教材としての使用を無効にしますが、それらのいくつかは小さなものであり、教えられなくても負荷を学ぶことができます。

個人的には、PythonとRubyが素晴らしい第一言語になると思います。

編集: 夜間に表示される初心者向けプログラミングの割り当てのリストは、まさにあなたが探しているものかもしれません。


2

それは本当にあなたの兄弟の学習スタイルに依存します。多くの人々は、手を汚し、それに入るだけで、概念と全体像を具体化し、進歩して知識を構築することで、より速く学びます。

私は、全体像から始めて、要点を掘り下げることを好みます。私が最初に知りたかったのは、すべてがどのようにすべてのオブジェクト指向のgobbledygookに適合しているか、次にクラスとインスタンスなどについてです。構文を学ぶ前に、基礎となる概念と理論について少し知りたいと思います。20年前にBASICでいくつかのゲームを書いたので、少し有利になりましたが、それ以降は何もありませんでした。

おそらく、全体的なミッションステートメント、計画またはフローチャート、あるいはその両方から始めて、実際にコードを書く前に(最終的に使用する構文に向かって)いくつかの疑似コードに加工することによって、生産プロセスを隠すことが役立つでしょう。

ここでの黄金律はあなたの学生の傾いたスタイルを口説くことです。


2

兄がiTunesにアクセスできる場合は、ニューサウスウェールズ大学のリチャードバックランドが提供するコンピュータサイエンス入門コースのビデオ講義をダウンロードできます。彼は魅力的なインストラクターであり、コンピューティングの基礎とC言語をカバーしています。他に何もない場合は、バックグラウンドでvidを再生するように兄弟に伝えます。浸透によっていくつかの概念が浸透する可能性があります。:)

COMP1917高次コンピューティング-2008セッション1 http://deimos3.apple.com/WebObjects/Core.woa/Browse/unsw.edu.au.1504975442.01504975444

リンクが機能しない場合、パスは次のとおりです。

ホーム-> iTunes U->エンジニアリング-> COMP1917高次コンピューティング-2008セッション1


2

ありますのpythonを学ぶためのかなり良いですwikibookが

ウィキブックが他の言語でどのように使用されているかはわかりませんが、個人的には2007年2月のように、ウィキブックからpythonを個人的に学びました

PS-ウィキブックスに慣れていない場合は、基本的にはウィキペディア版のブックオーサリングです。説明するのはちょっと難しいですが、そこでいくつかの本をチェックすると、それがどのように機能するかがわかります



2

Pythonは素晴らしいアイデアだと思います。私は彼に自分で行ういくつかの基本的な割り当てを与え、彼がヒットした行き止まりはおそらくグーグルへの旅行で解決できると彼に話します。少なくとも私にとっては、自分で問題を解決することで、誰かが解決策を教えてくれるよりも常に問題を解決できました。

いくつかの可能なプロジェクト(順不同):

  • コインフリップシミュレータ。ユーザーがコインを弾くために必要な試行回数を入力できるようにします。それを実行し、結果を表または裏のパーセンテージとともに表示します。

  • ユーザーが入力するメニューから温度変換器を作成し、ユーザーが実行したい変換の種類を選択します。変換を選択して実行すると、メインメニューに戻ります。

    同じ考えの拡張コンバーターの例を次に示します。http//pastebin.org/6541

  • 数値入力を受け取り、変換先の文字のグレードを表示するプログラムを作成します。最終的には、ifおよびelifステートメントに対して入力を評価して、どこに適合するかを見つけます。

  • 複数の選択肢からなる簡単なクイズを作成するか、空白の質問に答えてください。最後に、ユーザーが行った方法が表示されます。彼は好きな質問を選ぶことができます。

  • いくつかの(おそらく大きい)数のペニーの入力を取り、それをより大きな金種に変換します。たとえば、149ペニー= 1ドル、1クォーター、2ダイム、4ペニー。

  • 簡単なリストマネージャーを作成します。リストの追加/削除、およびそれらのリストのエントリの追加/削除ができる。これはクリスマスリストマネージャーの例です:http : //pastebin.org/6543

  • 入力した数値が魔方陣を形成するか(2D配列で)ビルドしてからテストするプログラムを作成します。ここではいくつかのサンプルコードですが、それは本当にユーザーが正方形をbulidingという点である場所を示すために、各ステップでの正方形をプリントアウトする必要がありますhttp://pastebin.org/6544

また、xTurtleまたは別のグラフィックスモジュールを使用して、物事を混合し、退屈しないようにすることもお勧めします。もちろん、これは非常に実践的なプログラミングであり、多くの人々が実際にpythonを使用するスクリプトではありませんが、私が提供した例は、pythonを介して学習していたときに直接取得したものであり、非常にうまくいきました。幸運を!


2

ただお楽しみください!

驚くべきことに、Kojoを試すならScalaが最も簡単かもしれません。


2

兄がパズルが好きなら、Pythonチャレンジをお勧めします。私は1対1のチュートリアルでは正式な教育ツールとしては使用しませんが、一緒にいなくて自分自身に挑戦して楽しんでいるときに彼ができることです。



2

無料の電子書籍をいくつか読んだ後、プログラミングを学ぶのに最適な本はO'Reily Pressから出版されたHead First Programmingでした。言語としてPythonを使用し、最初から作業するプログラムを提供します。彼らはすべて「Hello World」よりも興味深いです。それは私がそれに費やしたお金の価値があります、そしてそれは少しの間使われなくなったので、あなたはEbayまたはAmazonでより安い中古コピーを見つけることができるかもしれません。


1

言語固有ではなくプログラミングの基本を教えたい場合は、MITで作成されたScratchと呼ばれるアプリケーションがあります。それは人々がプログラミングスキルを開発するのを助けるように設計されています。ユーザーがスクラッチプロジェクトを作成すると、条件やループなどを作成する方法を学びます。スクラッチプロジェクトのコミュニティもあり、どのプロジェクトをダウンロードできるかがわかります。これにより、他の人のプログラムを探索して、それらがどのように構築されたかを確認できます。


1

彼が基本(変数、ループなど)を理解したら、彼が興味を持っている具体的なものを見つけ、それを実現するための必要性を学ぶ手助けをするように努めるべきだと思います。興味があれば、もっとやる気があり、やる気があることを知っています。また、困難な問題にも対処できるようにしてください。自分で理解した瞬間ほど満足できるものはありません。


1

フローチャートとPDL(プログラム設計言語)を使用して、言語にとらわれない方法で問題を解決する方法を学ぶことで教えられました。その数週間後、私は自分が書いたPDLを言語に変換することを学びました。言語に縛られることなくプログラミングを行い、問題を解決してきたので、私はそのように学んだことを嬉しく思います。私が使用する言語は、常に実装の詳細であり、設計の一部ではありません。

問題をその基本的なステップに分解することによって問題を解決する必要があることは、重要なスキルです。プログラミングできるものとできないものを分けるものの一つだと思います。

言語の概念の順序にどのように取り組むかに関する限り、最も簡単な方法は、プロジェクトを念頭に置いて、必要に応じて概念に取り組むことを決定することだと思います。これにより、興味のある対象に必要なときに適用できます。言語を学習するときは、いくつかの単純なプロジェクトを念頭に置き、いくつかを段階的に複雑にすることをお勧めします。それらを決定することは、必要な概念とその順序を明確にするのに役立ちます。


1

スクリーンキャストを見ることをお勧めします-それらは通常、言語ではなく特定のテクノロジーのコンテキストで作成されますが、Pythonコードが表示されている場合はそれでうまくいきます:)。重要なのは、彼らは何人かの優れたプログラマーによって作成され、優れたプログラマーのプログラムがいかに優れているかを見守ることです。あなたとあなたの兄弟もピアプログラミングを行うことができます。なぜあなたがそうではなく、このように何かをするのかを説明することを忘れないでください。私はプログラミングを学ぶための最良の方法は良い例からであり、悪い例を見ることさえしないようにしようと思う。


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