プログラミング経験のない明るい人に、どのようにプログラミングを教えることができますか?[閉まっている]


100

プログラミングの経験はないが、賢く有能な人であるIT部門の人を連れて行って、既存の.Netアプリケーションをサポートするエントリーレベルの開発者のようなプログラミングに移行するのを手伝ってほしいと頼まれました。私は間違いなくこの人がそれを行うことができると信じていますが、私は彼を速くするための最も速い方法を探しています。たくさんのアイデアがありますが、他の人の考えを見てみたいと思いました。これは彼の学習方法にも大きく依存することはわかっていますが、私は一般的に話しているところです。

だから質問:開発者(この場合は.Net)を開発者以外の人が素早くスピードアップするための最良の方法は何だと思いますか?


1
おそらく関連する質問:Programmers.stackexchange.com/questions/10930/…:D
jmservera

Learn Python The Hard Wayは、プログラマー以外の人にも適していると聞きました。
john2x

見てみましょう小さなBasicを。シンプルですが、初心者には便利です。

3
あなたが話していることの精神的なモデルを持っていない人にプログラミングを説明することは無意味だと思います。あなたが話している言語を把握し、チュートリアルを読んでもらい、手を汚して説明してもらいます。彼らは苦労し、あなたは急いで学習プロセスをスピードアップします。
マフィンマン

1
Edgser Dijkstraの|コンピューティングサイエンスを実際に教えることの残酷さ|を読んでもらい、その記事の理由を学んでもらいます。プログラミングの教え方
vfclists

回答:


125

私は通常、プログラミングを学びたい人には同じシーケンスを処方します。それは非常に理論的ですが、良い基盤を築きます。フルタイムの学習には3〜4か月かかりますが、プログラミングは一晩で学ぶものではありません。

このシーケンスを実行できない場合、プログラムを実行することはできません。そのため、ここでgiveめることもできます。

  1. コード、Charles Petzold著。
  2. Cプログラミング言語、K&R
  3. コンピュータプログラムの構造と解釈、AbelsonとSussman。

私のルールは次のとおりです。必要に応じて、これら3冊の本を徹底的に読み進めてください。ご不明な点がありましたら、ご自身で解決するのに苦労してください。これらの3冊の本でおめでとう、おめでとう、あなたはプログラマーです。今、私はあなたに15分でPERLを投げることができます。これらの3冊の本を読めない場合、あきらめて家に帰れば、決して手に入れることはできません。

正直に言うと、CとSchemeを学ぶ必要はないと思います。これらは、将来の学習の基盤にすぎません。これらの2つのかなりシンプルな本はどちらも表面上は非常にシンプルです(CとSchemeは非常に簡単な言語です)が、混乱する構文に時間を浪費することなく、プログラミングの実際の技術を非常に深く理解しているため、再配線を開始するのに優れていますあなたの脳が優れたプログラマーになるために。

ショートカットを取得して、今すぐ学習したい正確なこと(C#やASP.NETで開始するなど)を直接学習しようとする試みは運命にあります。


25
C#の能力を強く推奨された「プログラマー」を机の上で頭を叩かなければならなかったが、十分に文書化された基本クラスの実装、cおよびc ++プログラムでのメモリリークの発見などの単純なことができなかったため、または、自分で問題を見つけたり、適度なペースで新しいアイデアを学んだりすることも同意します。これはエリート主義ではありません。それは常識です。ポインターと再帰を習得できない場合、自分で問題を解決できる開発者を必要とする人にとっては、あまり役に立ちません。
ジョナサンヘンソン

53
いいえ、優れたプログラマーになる唯一の方法ではありません。しかし、もし3冊の本が「恐ろしいリスト」であるなら、プログラマーが何をするかを過小評価しているかもしれません。
ジョエルスポルスキー

32
ときどき連絡が取れない、ジョエル。
ロバートS.

46
申し訳ありませんが、新聞は私たちのプライベートクラブに到着するまでに数日かかります。新聞を見るには、バレットにアイロンをかける必要があります。
ジョエルスポルスキー

19
残念ながら、この答えはup to speed quickly一部失敗します。
-rlb.usa

30

開発者以外の人をすばやくスピードアップするための最良の方法は、彼ら刺激与えることです!

成功するためには、候補者は少なくとも(プラットフォームに関係なく)プログラミングに興味を持っていなければなりません

私は理想的な候補者の場合はジョエルに同意しますが、私は弱い考えにあまり多くの理論を詰め込まないように注意します-それはそれらを先送りにするだけです。彼らが霊感を受け、好奇心が強く、願わくば情熱的であれば、彼らは魔法を見た後に理論を理解したいと思うでしょう。

私は@karudzoに完全に同意します-自己達成と建設的なレビューは非常に刺激的です。


29
「船を作りたいなら、木材を集めるために人を太らせたり、仕事や仕事を割り当てたりせず、海の無限の広大さを願うように教えてください。」-アントワーヌドサンテグジュペリ
ジュリアンチャスタン

ジュリアン-いいね!まさに!
-jkoreska

私はこれについてあなたに完全に同意します!私は、経験がなく、時にはプログラマになるとは思わなかった多くの開発者を指導/指導しました。私は単に彼らを道に沿って導くことによってこれをしました...彼ら自身の好奇心と情熱は彼らを最終結果に導きました。それらの2つの属性がなかったとしたら、彼らが達成したことを達成することは不可能だったと思います。私は、これらの属性の一方または両方を欠いている多くのプログラマーと仕事をしており、利用可能な仕事がたくさんあるという理由だけでそこにいます...それはひどいです!
ジーチ

同意する。プログラミングを学ぶという質問は、文字通り答えられていると感じています。人々は理由で物事を学びます。問題を解決し、人々を助け、アイデアを現実のものに変えるためのプログラミングを学びます。私はこれを途中で忘れてしまった人々に会いました、そして、彼らがそれを再発見したとき、彼らはプログラミングに対する彼らの愛を再発見しました。あなたが学ぶことを本当に楽しんでいるとき、あなたは学ぶ方法を見つけ、あなたは良くなります。
ルイス・ペレス

12

私は彼をスピードアップさせる最も速い方法を探しています。

最も手っ取り早い方法は、彼にかかる時間を与えることかもしれませんが、それは簡単に1、2年になるかもしれません

確かに、彼に簡単な言語(C#、. NETのことなら)を教えるのは簡単に思えますが、言語を学ぶことはプログラミングを学ぶことではありません。

一度もプログラミングしたことがない場合、少なくとも1つの言語の構文とライブラリに加えて、配列、リンクリスト、学習した言語のコンパイルモデル、モジュール化、リソース管理、パラダイム、パターン、Big- O表記...-エンチラーダ全体。それは多くのことであり、私たちのほとんどはこれらの基本を学ぶために数年かかっただけでなく、本当のプロのプログラマーになるにはさらに多くの時間を要しました。

この多くをカバーする資料があります(C ++言語を教えるのではなく、C ++を使用してプログラミングを教えるStroustrupの最新の本のように)が、そのほとんどはなく、すべてをカバーするものはありません。だから、男は喜んで学び、たくさんの本や記事を読む必要があります。

これを行う方法について:ここに貼り付ける本格的なカリキュラムはありません。(申し訳ありませんが)
私がお勧めするのは、1つのプログラミング言語を教えることから始めることです。そうすることで、彼は少し早い初期の進歩を遂げ、心強い結果を得ることができます。そのような言語を教えるための本がたくさんあります。使い慣れたものを選んでください。本に多くのエクササイズがあり、彼がそれらをやる気があるならば、それらを手伝うのに多くの時間を費やす準備をしてください。本に(m)何もなければ、あなた自身の物をずっと先に考え始めなさいが、彼の理解のレベル/速度にそれらを合わせるために準備されなさい。
その最初の言語がCまたはC ++でない場合、IMOは次にこれらのいずれかを学習する必要があります。K&Rは、StroustrupのTCPLと同じように、または彼が(あなたの助けを借りて)急な学習曲線に対処できる場合、Koenig / Mooに適しています。これをお勧めする理由は、Cまたは(IMOが望ましい)C ++を知ったら、C#、Java、ObjCなどのC派生物を比較的簡単に選択できるからです...

残りについては、彼に良い本や記事の絶え間ない流れを提供してください。1)それはあなたの会社の文化に適合しなければならない、2)あなたは彼にそのようなことを学ぶように言って安心しなければならないので、私たちがそれらをあまりにも多く提案するならば、それはあまり役に立ちません。


1
「既存の.Netアプリケーションをサポートするエントリレベルの開発者」...「配列、リンクリスト、学習した言語のコンパイルモデル、モジュール化、リソース管理、パラダイム、パターン、ビットO表記について学ぶ必要がある」すべては「持っているだけでいい」ものです、コードを書いた開発者のかなりの部分はそれらのスキルを持っていないと思います。
カークブロードハースト

1
@KirkBroadhurst:もしそうなら、あなたの会社で何かが間違っています。
SBI

@sbi多くの企業で何かおかしいことがわかると思います。OPの会社は、非プログラマー(ただし、彼は「賢い男」です!)をアプリケーションサポートを行う役割に移動することを提案しています。私はあなたがどこで働いているのかわかりません...しかし、私の経験ではそれは「現実世界」です。本当に優れた有能なプログラマーは例外です-ほとんどの業界のように、ほとんどの人はうまくやってくれます。
カークブロードハースト

1
@KirkBroadhurst:私が働く場所は私の決断です。私は企業が無能であることを理由に逃げてきましたが、少なくともこれらのことのほとんどを開発者が誰も知らない場合は逃げます。
SBI

7

.NETでは起動しません。私はこの間違いを何度も犯しました。時間のために雇用主に無能なプログラマーを作るように圧力をかけさせないでください。.NETは高速な開発プラットフォームかもしれませんが、開発者にプログラミングを習得させることはありません。C#だけでは、開発者が参照型、オブジェクトの有効期間にこだわっており、巨大なメモリリークを残し(はい。CまたはC ++(おそらくO ++の概念を使用する必要があるため、おそらくc ++)でそれらを起動し、次のようなことを言う方がはるかに良いでしょう。指向であり、これらの厄介なポインターのすべてに対処する必要はありませんでしたか?」これがC#とJAVAです。C ++を習得している場合、1週間または2週間で両方を征服します。ジョエルの連隊をお勧めします。それがCS 101の先生が私にくれたリストであり、そのために数値解析を行ったときはずっと良くなりました。これにより、候補者がマスタードを切るかどうかをより早く知ることができます。また、cとc ++を取得すると、本の紹介を読んだ後、c#とjavaを自動的に理解できます。それらを理解するだけでなく、cとc ++を知らなかった人よりもそれらをよく理解するでしょう。


4
「「あなたの記憶があなたのために管理されていて、すべてのものがオブジェクト指向であり、これらの厄介なポインタのすべてに対処する必要がなかったらいいのではないでしょうか?」つまり、ここにSTLがあります。 。なぜ最初からC ++でSTLを使用するように教えてくれなかったのですか?!
Raynos

まあ、STLは甘いです。Windowsプログラミングに関しては、Windows APIについても言及しています。Windows APIは、OOPを考慮して設計されていません。貧しい人々がc ++のAPIを使用してアプリケーションを作成できるようにすることは、素晴らしい練習だと思います。次に、彼/彼女にWindowクラスを記述させ、イベントループをカプセル化します...そう、オブジェクト指向にします。そして、彼らがようやく動作した後、Windowsフォームを見せます。それは彼らにいくつかの基本的な概念、すなわちWindowsアプリケーションがどのように機能するかを扱うことを本当に強制します。
ジョナサンヘンソン

4
なぜ誰かがスティックでWindows APIに触れるのでしょうか。hWNDつまり、80年代からの話でしたね。代わりに、いくつかの優れた抽象化を使用することは明らかです(この抽象化はまったく別の議論です)。フードの下でどのように機能するかを知っているのはいいことですが、抽象化のためにC#.NETは必要ありません
Raynos

2
Windows APIは素晴らしいです。とにかく、私はそれを教育ツールとしてのみ使用します。たとえば、通常、人々はWindowsプログラムでイベントが魔法のように発生する方法を理解していません。彼らがイベントループをだます必要があると便利です。また、プログラマーは少なくともグラフィックスをだますAPIを扱う場合は、少なくともhWNDに精通している必要があります。これは、XIDの使用方法を知らずにUnixで何かをするのに苦労するのと同じです。とにかく、Windowsプログラムがどのように機能するかを学習させます。また、終了すると、Windows.Formsの仕組みを理解します。
ジョナサンヘンソン

一般に.NETに移行するだけで、C#btwに移行する必要はありません。@Joelには、フレームワークを使用する前にプログラマーが内部を見るのが良い理由について、Leaky Abstractionsの法則に関する良い記事があると思います。
ジョナサンヘンソン

6

シンプルでありながら解決に役立つものを提供します。彼らに少し手探りさせて、彼らがそれを磨くのを手伝いましょう。それらに拍車をかけるのに役立つ小さな成果のようなものはありません(ただし、プログラミングに興味のない人はw


6

ペアプログラミング。独自のコード(任意のコード)を書いている間、彼らにあなたを隠してもらいましょう。数時間以内に、必要な場合でもキーストロークごとに何をすべきかを指示しながら、彼らにコードを入力してもらいます。彼らの質問のいくつかに答えてください。しかし、それほど遅くはないので、遅くなります-それらをすべて浸してください。彼らはあなたのタイプミスとあなたが思っているよりも多くのバグを見つけます。数日以内に、彼らは「ナビゲート」を開始し、以前見たようなタスクのためにどのコードを入力するかを教えてくれるでしょう。

この方法で1か月以内に開発者として知っていることの多くを学び、この方法で他のいくつかの新しい開発者に教えました。そのうちの1人は、数か月後にスタートアップの主任開発者として引き継ぐことができました。私たちが初めて一緒に仕事を始めたとき、彼はコードを一行も書いたことがありませんでした。


1
ペアプログラミングは初心者プログラマーに教えるのに本当に素晴らしい方法だと思いますが、ペアプログラミングは常に問題になると思います。初心者のプログラマーは、問題を解決し、能力に自信をつける方法を学ぶために一人で働く時間が必要だと思います。
ヘレファント

はい、ペアプログラミングを始めて、シンプルなタスクを与えてください。実際のタスク、作業対象のソフトウェア上で、作業対象の言語で、実際に達成してください。すべての作業を確認および指導すると、進歩します。
トーマスW

2

彼に良い考えを与えてください(ビジュアルスタジオ、エクスプレスはまだ良いです)。構文の一般的な60%を彼に教えます(yield、linq、enum、attributesなどを除外し、クラス、仮想、オーバーライドを教えます)。デバッガー(特に呼び出しスタック)で時間を費やしてください。その後、彼が助けを必要とするときはいつでも「msdn functionanme」をグーグルで検索するように彼に言ってください。

また、例外をキャッチして飲み込まないように彼に教えてください。彼はそれを再スローするか、ログに記録する必要があることを伝えてください!

ボーナス:jsonデータをシリアル化して、ファイルを簡単に読み書きできるようにする方法を教えてください。データベースはやりすぎであり、学ぶには多すぎます。カスタムファイル形式を作成することは望ましくありませんが、ファイルタイプごとに1つのエントリを許可して、文字列配列を保存/ロードすることができます。


1

私は多くの人々が言語とそれらの言語の本について話していることを知っています。私は違います。

プログラミングとは、分析的に考えることを学ぶことです。何よりもまず、人は問題が何であるかについて一枚の紙で考えてアルゴリズムを考え出すことができるはずです。あなたが彼らが正しい思考テクニックを得るように彼らを導く必要があります。

次に、言語の基本が来ます。選択した言語で始めましょう。プログラムに問題を与えます。

この最初のカットが終わったら、CSの基礎とデザインパターンを実行させます。

次に、これらの新しい概念を使用して、以前の問題を再プログラミングします。


1

彼に基本を教えてください:変数、ループ、whileループ、forループ、配列、彼に基本を教え、スクリーンに印刷し、簡単な計算をします。メソッドと基本的なOOPに移動します。クラスの作成方法など、方法だけでなくその理由を示します。

言語は重要ではありませんが、あなたが知っているものを選んでください。それは非常に抽象的なもの(java、pythonなど)で、メモリ管理、ポインタなどのことを心配する必要はありません。再帰、ハニオの塔、または再帰的にディレクトリを検索します。

プログラミングの学習は、Rubyプログラミングに関する優れた無料リソースです。楽しく、簡単で楽しいものにしてください。


1

彼にいくつかの課題を与え、問題を自分で解決するためのリソースを見つける方法を学んでもらいます。

あなたが彼に答えを見つけて自給自足する方法を教えることができれば、彼は自然にうまくプログラムする方法を学びます。批判的思考と機知は、プログラマーにとって2つの重要なスキルです。

結局のところ、情熱/興味は間違いなく彼らがそれをすぐに学ぶことに成功するかどうかの重要な要因になるでしょう。彼が「バグ」を持っていない、またはキャッチしていない場合は、時間がかかり、痛みを伴うプロセスになる可能性があります。彼がバグをキャッチした場合、彼はコーディングが遅くなり、勤務時間外になり、人生の時間を過ごすことになります。

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