理想的なプログラミング言語の学習シーケンス?[閉まっている]


17

どう思いますか?今日、頻繁に使用されるほとんどの言語とパラダイムを網羅し、一般的なプログラミングの基本、アイデア、および実践を把握するのに役立つ理想的なプログラミング言語学習シーケンスは何ですか?言語ではなく、パラダイムの学習シーケンスを提案することもできます。

注意:これは、私がstackoverflowで尋ねた質問のポートであり、主観的で議論的であるため閉じられました。


いい質問ですね。この質問がパフォーマンス指向の場合、どちらが答えだったでしょうか?私は興味があります:Programmers.stackexchange.com/questions/16323/… :D
JoeBilly

4
私は、Lispが上位の質問によく出てくることを非常に驚き、喜んでいます。
イナイマシ

1
この質問もここで尋ねられました(私はこれが最初に来たと思いますが): Programmers.stackexchange.com/questions/41720/…–
oosterwal

このリンクをここに保存する必要があります-streamhead.com/what-programming-language-to-learn-next
グルシャン

回答:


26

Python、Lisp、C、Haskell

質問は、プログラミングの初心者にとって理想的な学習シーケンスに関するものであると仮定すると(プログラミングの老人は独自の(偶然の)学習シーケンスを持っているため)、10年後にプログラミングを学習する方法に関するNorvigのエッセイを読むことをお勧めします

  1. Python:動的で高レベルなオブジェクト指向および関数型言語から始めます。初心者にとって生産性をできるだけ早く感じることは本当に重要だからです、エイリアンの構文、ライブラリの欠如、マルチプラットフォームの欠如、学習リソースの欠如、コミュニティの欠如によってオフにされないでください。Pythonは非常に読みやすく、多くの優れたライブラリ(特に科学ライブラリ-現代の科学者/エンジニアはプログラミングの方法を知っている必要があります)を持ち、ほとんどのOSから簡単に実行でき、多くのチュートリアルと無料の書籍全体を持ち、一般的にユーザーフレンドリーです—いずれも、大きな問題に取り組む高度なプログラマーになるにつれて、あなたとともに成長するのに十分なほど強力です。また、初心者にとって重要で便利な規約を強化することも重要です。コードの読みやすさはLOTをカウントするため、自分や他の人がすぐに理解できるようにコードを書く必要があります。

  2. Lisp:特に、少なくとも、コンピュータプログラムの構造と解釈をざっと読んだり、SICPビデオを見て、プログラミングの基礎と表現力を見て、目を大きく開いてください。Lispが機能的なパラダイムだけでなく、オブジェクト指向、論理/宣言など、新しいドメイン固有言語の作成のように表現する方法を学びます。NorvigのPAIPを読んで、この言語でマスターができることを目撃してください。次に、Next Big Thingsの1つである可能性がある現代のLisp方言であるClojureを調べてください。

  3. C:それはコンピューティングの共通語だからです。:)特定の非ソフトウェアドメインのプログラマが主にプログラマである場合、最近はおそらくオプションです。ugいですが、基盤となるハードウェアに感謝する価値はあります。一緒に行くK&Rもちろん、。

  4. Haskell:純粋な機能力。現在のCom.Sci。理論と実用的な表現力が出会う。Real World Haskellを参照してください。

上記のツアーの後、問題への取り組みとコードでのソリューションの表現に非常に熟達し、ここでのパラダイムに完全に満足します

代替テキスト


私は(当然)PythonのSmalltalkを#1に置き換えますが、Python(a)はSmalltalkよりも非常に人気があり、(b)Smalltalkを他の言語と話すことはJavaと同じくらい難しいことを知っています、これは初心者を苛立たせるほど難しいと言うことです。Pythonの「スクリプト性」は非常に大きな利点のようです。
フランクシェラー

生産性に関する声明に同意します。絶対的な第一言語としてCを学ぶことは、大量の負荷だと思います。しかし、それは間違いなくどこかにスタックする必要があります。
マークカンラス

+1 Haskellが一番上にあるべきかどうかはわかりませんが、公平を期すために、私はまだそれを知らず、私のリストの次です。
イナイマティ

2
1クリックでフルサイズの図表@ i54.tinypic.com/168ity1.jpg
マイククラーク

Iだろう+1このCがリストになかった場合
バログパル

28

これは私がそれをする方法です:

  1. Python(またはRubyまたはLua):インタプリタ言語であり、型はありません。数行で作業を完了できます。巨大なライブラリ(これにはPythonが最適だと思います)。気を散らすものがないので、アルゴリズムを深く掘り下げることができます。コンパイルは不要で、実行するだけです。それに加えて、Pythonではインデントが必須なので、Pythonでは暗黙的に良いスタイルを教えます。オブジェクト指向を教えることもできます(Luaにはもっと問題があります)。ここでの目的は、多くの楽しみを持ち、学生に何ができるかを示すことです。

  2. C ++(または多分Java):型付きの高速言語。オブジェクトの向きが必要な場合は、すでにいくつかの概念を知っています。主なアイデアは、Pythonで行ったことを「翻訳」し、新しい制約(主に型)でそれを行うことです。概念が正しければ、型の追加はそれほど問題ではありません。次のステップは、より低レベルを考え(ここではJavaは役に立たない)、ポインターをうまく教えることです。これにより、アドレス空間、CPU、OSについて少し説明することで、プログラムの下を確認できるようになります。コンパイルされた言語は、解釈とコンパイルの区別を導入し、機械語とは何かを説明するのに非常に役立ちます。

  3. 組み立て:最後に、魔法はありません。マシンと話すだけです。IntelとGASの構文については議論がありますが、重要ではありません。MIPSをお持ちの場合は、教育に適していると思いますが、x86はより広く普及しているため(x86_64の方がより多くのレジスタと機能を備えているため)より便利だと思います。複雑さのいくつかを取り除き、学生が望むならさらに調査する必要があります。

(これらの最初の3つは「深さ」です。これまで、彼らが言うように「金属に近い」底部に触れるまで下がっていました。これは非常に重要だと思います。何が起きているのかが明確にわかると解決します。これを知っていれば、自信を持ってさらに知識を得ることができます。)

  1. Scheme(またはCommon LispまたはClojure):@dukeofgamingが言ったように、Lisp言語では再帰をうまく教えることができます(明示的なループがないため、このSchemeが最適です)。しかし、私は他に2つのことを教えに行きます:クロージャーとマクロ。マクロは、Lisp言語を他の言語から分離するものです。個人的にはSchemeマクロは好きではありませんが、これはそれほど重要ではありません。たとえば、Clojureマクロは優れていると思います(ただし、JVMには末尾再帰がないため、Clojureの再帰はそれほどきれいではありません)。クロージャは非常に重要な概念であり、一度クロークすると、すぐにJavascriptを「見る」ことができます。C ++、Python、Lispを学んだ後、Javascriptは「簡単」になります。

  2. Haskell:関数型言語については、Haskellに勝てるとは思いません。LispとSchemeは機能的であると考えられていますが、機能的プログラミングを強調するためには、生徒に国家なしで考えさせる必要があります。Haskellには、カレー化や「分解」のためのパターンマッチングなど、他の非常に優れた機能もあります。Haskellについてはあまり知りませんが、記述できるコードの簡潔さは美しいです。Haskellをよく理解すると、Erlangを理解するための道がはるかに簡単になります。

  3. Forth:スタック言語。(LispとHaskellで十分ではなかった場合)再び論理を完全に破壊します。彼らがアセンブリを知っているので、私はジョーンズのフォースを教えるまで行きます、そして、あなたは何が起こっているかを完全に理解することができます。(たとえば、Forthを知るとPostScriptが開きます。)

(つまり、これらの最後の3つはあなたが言っていた幅です。私にとって、これらの言語はあなたの考え方を変えるほど奇妙です。少なくとも私にとってはそうしました。非常に迅速に。)

オプションで、これらを調べることができます:

  1. SmallTalk:純粋にオブジェクト指向の言語。オブジェクト指向を真剣に考えたときに何が起こるかを見るために、言語は「if」、「for」を必要としません。すべてがメッセージです。大きな実現です。(これにより、Objective-Cが簡単になります。)

  2. Go:並行性を重視した(美しい)言語。Goは非常に素晴らしく快適にプログラムできます。

  3. プロローグ:プログラミングのもう1つのパラダイム。私はプロローグを書いたことはありませんが、それはもう一つの心を曲げる言語であることを理解しています。


6
PythonとRuby(Luaについては知りません)は、強く型付けされた言語です。静的に型付けされるのではなく、動的に型付けされることを意味すると思います。
ダニエルローズマン

13
CとC ++を2つの異なる言語として扱ってください。
デビッドソーンリー

1
Bjarne氏は次のように述べています。「「C / C ++」と呼ばれる言語はありません。このフレーズは通常、プログラミングに関する手がかりのない人(人事担当者や貧しいマネージャーなど)によって使用されます。 C ++を知っています(Cでもありません)。」
fredoverflow

1
誰かがアセンブリをC ++に先行させるべきかどうかを議論したいと思います。その時点で、アセンブリにアプローチするのはかなり簡単になります。シンプルな概念と提供されるツールの小さなセットにより、C ++にアプローチするときにメモリとメモリ参照の操作は非常に役立つはずです。メモリの場所と値は、ほとんどの人のsh *を混乱させます。
フィリップデュパノビッチ

1
私は2人のCSの生徒に、組み立て式のアセンブラーで1週間のコースを提供しました。基本的に、私は最小限の命令セットコンピューターとインタプリタを発明しました。それから、彼らはタイミングを備えたいくつかの非常に単純なルーチンを書くことができます(そして実行を見る)。次に、データキャッシング、プリフェッチなどを追加して、アーキテクチャ機能がパフォーマンスとどのように相互作用するかを確認できるようにしました。目的が教訓的なものであれば、人工的なアセンブラーとコンピューターは、使用する可能性のあるものを取得するのではなく、柔軟性と学習効率を高めると思われます。
オメガケンタウリ

12
  • 今必要なもの
  • 次に必要なもの
  • その後必要なもの

真剣に、私はBASIC、COBOL、Fortran、Forth、Pascal、およびPrologを自分の時間で学んだかもしれませんが、特にそれらを使用する必要はなく、それらが他の使用に影響を与えた方法を実際に見ることができません言語。ただし、パラダイムを誤って適用している可能性があります。構造化されたPascalを実際に書くのに十分なBASICを学習するのに何年もかかり、CでPascalコードを書くのを止めるのに数年、Objective-CとJavaを使い始めてOOPを実際に理解するのにさらに数年かかりました。一方、OO言語で(ほぼ)専ら作業してきたので、SchemeやPostScriptのように見せようとせずに、OO言語の使用の改善に集中することができました。


4
あなたは知っている、私はあなたがそれを必要としない場合でも新しい言語を学ぶことのいくらかの価値があると思います...しかし、私はあなたがむしろそれがむしろ有用だと思うだろうと思うので言語を学ぶ方がしばしば良いという一般的な感情に同意しますそれはあなたが「学ぶべき」と思うものだからです。
ティムグッドマン

8

任意のシーケンスが理想的であると主張することは困難ですが、正当化できる計画を示します。

  1. C

    Cを学習するには忍耐と勤勉が必要であり、コンピューターがデータを処理する基本的な方法を紹介し、プログラマーがそのようなマシンを処理するために受け入れることができる最も幅広い一連の責任を示します。

  2. Perl

    Cが要求する厳密さに対する解毒剤として、信じられないほど寛容なPerlを試してください。Cで書くのに1週間かかったものは、Perlで1時間で書くことができます。プログラミングに見られる異なる種類の喜びを紹介し、特定の懸念や詳細を除外することでプログラマーがさまざまなことに集中できることを示しています。

  3. C ++またはJava

    次に、Cがプログラミングの低レベルで原始的な側面に焦点を当て、抽象化レベルを上げるための基盤としてどのように機能するかを見てください。プログラムにとって重要な効率性を維持できる抽象化を形成する方法を調べてください。

  4. Common Lisp

    これは、前のスローガンに対する報酬です。これまでのすべての言語で学んだことのエコーを見つけることができ、Lispでプログラミングするときに、前述の譲歩のどれほど多くが愚かに見えるかを確認できます。CのプリプロセッサとC ++のテンプレートは、Lispのマクロシステムを評価する準備をします。Perlからの表現の容易さ、Cからの低レベルの最適化の機会、C ++またはJavaの抽象化構築機能を取り戻し、それらすべてをうまく乗り越えます。前の3つは、おそらくPerlのデバッガーを除いて、有能なREPL( "read、eval、print loop")を使用した対話型プログラミングエクスペリエンスを用意していません。作業画像ベースの環境(ソースコードと「実行可能プログラム」の概念との関係を変更する)は、プログラムをビルドすることの意味に関する全体的な概念を変更します。

これらの4つを超えて、Haskellの関数型プログラミングやPrologのロジックプログラミングなど、他のスタイルのプログラミングを検討することで、プログラミングの範囲(幅広い知識があれば)をより包括的に理解することができます。あなたが知っているあらゆる言語で、あなたの技術、つまり深い知識を改善することによって

十分に異なる言語を味わったので、あなたの意見は、それらのどれかを超越するアイデアに焦点を当てるようになります。それは一種あなたの父の車を運転することを学ぶと、運転の仕方を知っているとの違いなどからだ任意の車を:あなたは、数日間レンタルミニバンを駆動するために有するフルも好きなスポーツカーを運転の喜びを知って楽しんでいないことがあり、しかし、あなたはそれをどのように操作するかを理解し、アマチュアよりも貧しい獣からより多くのことを確かに理解するでしょう。


4
CおよびCommon Lispの場合は+1ですが、第二言語としてのPerlは?? :) Pythonは動的な言語として見事に機能すると同時に、プログラムの最初の作成から数週間、数か月、または数年後には、自分や他の人にとってコードが非常に読みやすいという良いプログラミング習慣も奨励します。
リミスト

1
Perlの推奨に関して:それはちょうど私が私の年齢を示しているということです。確かに、今日、PythonまたはRubyは密接な代替品になりますが、どちらもPerlよりも独断的であり、Cから出てくる新しいプログラマーがそうであるように、クラスオブアバッグオブメソッドスタイルのオブジェクト指向に偏っていますまだ必要ありません。Perlを習得したとき、私はすぐに恐ろしく生産的になり、その後オブジェクト指向機能を使い始めたのはそれほど長くはなかったことを思い出します。多くの場合、オブジェクト指向の焦点は、気を散らす不必要な儀式だけです。
SEH

私はあなたの「抽象化で上に移動するときに効率性を高める取引」の見解に同意しません。C ++の柱の1つは、C ++の機能を使用するプログラムが同等の Cプログラムよりも遅くならないことです。たとえば、C ++で仮想関数を使用すると、Cで仮想関数をシミュレートするより遅くなることはありません。
fredoverflow

本当です、フレッド、それが私が意味したことです:機能の仕組みを考えずに機能を利用すると、コストが発生する可能性があります。これは、機能があまりにも複雑であるか、単に不十分な慣用句であるため、機能機能を回避することで以前に回避した可能性があるコスト手動で実装します。たとえば、RTTIが「遅すぎる」と文句を言うと、すぐににどのように問題を解決するのかという疑問が生じます。
seh

6

1. Smalltalk

少なくとも部分的には、子どもたちがコンピューターを使って学習する方法として設計されました。構文は、段落で説明できるほど単純です。ロゴと同様に、「侵入に対する障壁が低く、天井が高い」という原則を例示しています。

Smalltalk は、「すべてがオブジェクトである」という意味での純粋なオブジェクト指向言語です。

また、特にコレクションAPIで、メッセージの連鎖、高次関数、マップ、リデュースなど、多くの機能的なテクニックを教えます。

Squeakのコミュニティは活気に満ちた歓迎です。また、高度な技術に関する多くの議論があります。Lispコミュニティと同様に、メーリングリストには経験豊富なSmalltalker が知識を共有してくれます。(Squeakコミュニティにプロの教育者の大部分がいることは害になりません。)初心者向けの別のリストもあります。

2.プロローグ

他の言語とはまったく異なる計算の見方を提供する論理プログラミング言語。また、プロローグは非常に宣言的です(ただし、完全にそうではありません:!orカット演算子は、述語に重要なセマンティック効果を持つことができます)。

3. Common Lisp

必要に応じて、ここでスキームを置き換えます。Common Lispは複数のパラダイム、特にオブジェクト指向と機能をサポートしています。また、長い歴史があります(Lispは2番目に古い言語ですが、FORTRANの古い言語のみです)。

4.ハスケル

(警告:習い始めたばかりです。)おそらく地球上で最も純粋な関数型言語です。非常に高度な静的型システムを備えています。便利な紹介 があります。

5. CまたはDelphi

コンピューターの動作を知る必要があります。メモリとCPUが実際にどのように機能するかを知る必要があります。これらはどちらも伝統的に「金属に近い」ものであり、言語がアセンブリにどのようにコンパイルされるかについて考えることを奨励するコミュニティを持っています。

なぜこの注文ですか?

Smalltalkは非常に習得しやすいため、コンパイラーと戦うのではなく、問題の解決にすぐに集中することができます(「参入障壁が低い」)。プログラミングを開始すると、できることについて人為的な制限はありません-「高い天井」。

OOがどのように機能するかについての公正な考えが得られたら(および-「OO」が何を意味するかについてのさまざまな理解があるという条件付きで-OOが市場を支配していると言うのは公平です)、Prologに移動すると、開始しないことが保証されますオブジェクト指向が唯一の方法であると考えています。プロローグはほとんどの言語とは非常に異なり、精神的な筋肉を伸ばすので、すべてを知っていると考え始めることはありません。

同様に、Common Lispは大人の言語です。それは成熟した標準を持ち、何十年もの間(Smalltalkと一緒に)言語設計をリードしてきました-あなたのお気に入りの言語が獲得したばかりのこれらの素晴らしい新機能はどれですか?チャンスは、LispまたはSmalltalkのいずれかでインキュベートされたアイデアです。Common Lispも少しいびきをかいていて、どこに行ってもいぼみを感じるでしょう。

Haskellの4番目のリスト(私は聞いたばかりです:習い始めたばかりです)その純粋さは、いくつかの非常に一般的なこと(I / Oなど)が純粋に機能しない言語よりも難しいことを意味します。Haskellの人々は、かなりエキゾチックな用語(「カタモフィズム」などの単語)も使用しているため、取り組む前にプログラミングの経験を積む方が良いでしょう。(しかし、もう一度繰り返す必要があります、私はそれを学び始めたばかりです!この意見をちょっと塩で受け止めてください!)

そして、なぜC / Delphiは長持ちするのでしょうか?組み込みシステムで作業しない限り、手動のメモリ管理がすべてだと考えてプログラミングを学ぶ必要はないはずだからです。ガベージコレクションは、1980年代レベルのマシンで十分に機能しました。あなたの携帯電話はとても強力です!

最後に、私は本当にそうすべきであるにもかかわらず、上記のリストにErlangを入れていません。


2
これは学習シーケンスですか?
Wizard79

それは明らかに(長さ1の)シーケンスです。
フランクシェラー

面倒ではありません:シーケンスの1つのステップを提供し、あなたはもう1つのステップを提供します。コミュニティは、そのシーケンスの順序について投票します。
フランクシェラー

3
@フランク私はそれを意味しませんでした。完全なシーケンスを期待していました。そして、投票によって順序付けを行うことはできないと思います。
グルシャン

お願いします。あなたが投票するつもりなら、その理由を説明してください
フランクシェラー

5
  1. Python。プログラミングの優れた紹介。これは、プログラミングへの以前の暴露とも結び付けられます。

  2. スキーム。また、プログラミングの優れた入門書です。プログラミング初心者を扱う場合は、最初にこれを教え、次にPythonを教えてください。1つの代替案は、最初にPythonを使用し、次にSchemeの代わりにCommon Lispを使用することです。より多くの作業を行いますが、より多くの報酬があります。

  3. C.シリコンの近くにとどまる低レベル言語。コンピューターができることを学ぶのに適しています。何らかの形式のアセンブラー言語に置き換えることもできますが、Cは基本に非常に近く、操作がはるかに簡単です。

  4. プロローグ。代わりに、宣言型の汎用言語を置き換えます(必要な言語が見つかった場合)。

  5. ハスケル。型システムと純粋な機能については、他に何もありません。

  6. 6つの言語ですべての概念をカバーすることは不可能であるため、ここにはいくつかの候補があります。Common Lispは、マクロシステムとオブジェクトシステム(これまで見た他のほとんどのシステムとは異なる)の場合にのみ、学ぶ価値があります。フォース、Tcl、およびAPLはすべて奇妙な言語であり、ある程度の成功を収めています。そのうちの1つは、学生がすべてを学んだと感じないようにするのに適しています。Erlangは並行性に適しています。


「プログラミングの初心者を扱う場合は、最初にこれを教え、次にPythonを教えてください。」非常に同意しました。それは私の以前の大学が現在取っているアプローチであり、非常にうまく機能しているようです。
-pyvi

これはかなり良いリストです。HaskellとPrologの順序を逆にするでしょう。学生が特に不慣れな場合は、6をノックオフし、リストを上げて、もっとシンプルなものから始めます。
11

4

多くの良い答えが提供されていますが、SQLを提供している人はいませんでした。リストされている他のほとんどの動物とはまったく異なる動物であり、データベースを扱う必要のあるプログラマーにとって非常に重要です。

また、Batch、grep、awkなど、OSレベルのスクリプト「言語」を検討することもできます。「Make」もこのカテゴリに分類されます。

検討したいもう1つの言語(まだ完全に機能していない場合)はCOBOLです。他の手続き言語とは十分に異なるため、言及する価値があります。C、Fortran、Basicなどのバリエーションは非常に類似しているため、一度慣れると、別の場所に移動することは大きな問題ではありませんが、COBOLには他の人に当然と思われる多くの構造がありません。(COBOLで何かを行ってから少なくとも20年が経っているので、この言語に関する私の観察はもはや有効ではないかもしれません。)

歴史的な観点からAPLに言及したい場合もあれば、安らかに眠らせたい場合もあります。あなたの選択。


1
SQLを提案しなかった理由は、SQLが汎用言語ではないためです。私はむしろ、Prologのような宣言的でより一般的なものを生徒に当てたいと思います。OSレベルのスクリプト言語は、PythonやPerlのようなより一般的な言語にはないものを提供します。最後にCOBOLに触れましたが、他の言語では上手く行かないという概念はありませんでした。私はAPLの提案が好きです。歴史的な価値ではなく、非常に異なる言語です。
デビッドソーンリー

@David Thornley:SQLは汎用言語ではないことに同意します。SQLには、他の多くの言語にはない基本的な操作として、いくつかの興味深い論理および集合理論の概念があります。ユニオン、結合、グループ化など、データベースを扱う可能性のある人にとっては注目に値するものです。
-oosterwal

私が見たいすべてのものは、学習者に教えられましたが、その一部は歴史的な感覚を持っています。スクリプト言語を習得することはちょっと重要ですが、他の言語と一緒に行うこともできます。SQLの場合と同様に、それはプライマリーに対するサービス言語です。生徒が数学に非常に強かった場合、APLから始めるのがいいかもしれません(または、読みやすいのでRも同様ですが、同様に使用できます)。
11

2

Ericは、「コードはデータであり、データはコードである」という概念を持つLispなど、始める方法について非常に興味深い点があるので、最初にエリックレイモンズの「ハッカーになる方法」を読むことをお勧めします。

プログラミングについては、Haskell、Prolog、SQL、およびアセンブリ言語(一部のみ)もお勧めします。

学習内容に関係なく、時間をかけて適切に学習し、重要なコードを書きます。それは自転車に乗っているようなものです。本から学ぶことはできません。


2

最初>プログラミングを始めたら何をしたいですか?ゲームプログラマになる方法を学ぶことは、ビジネスのデータベースプログラマになる方法を学ぶこととは異なります...ウェブベースのプログラマとは異なります...

2番目>学習を開始したら、高いところから始めて、自分の道を進みたいですか?または、低いところから始めて、上に向かって進みます。C#の学習(高レベル)は、アセンブリの学習(低レベル)とは大きく異なります。

大きな選択は、何をしたいかによって異なります。ドライバーのプログラミングには、おそらくCまたはアセンブリが含まれます。Webサイトのプログラミングは、PHP、C#、aspなどになります。Webプログラミング用のアセンブリには触れません...など...

基本的なこと...やりたいことを決めたら、言語を選択するのは簡単です。たとえば、私は病院のデータアナリストになりました。私の言語の「選択」は、データアクセス用のSQL / TSQL / DB2、Windowsクライアント用のC#WPF、Webクライアント用のSilverlight、IBMバックエンドロジック用のRPG / CLです。

個人的には、良い本にこだわり、言語を練習するための独自のプログラムを作成しています。私はAPressが好きで、C#を学ぶときにC#2008 Illustratedを読むのが大好きでした。彼らには、未学習者と専門家の基本を網羅した他の本があります。


2

新規参入者は最初に1つの言語のみを必要とし、2番目の言語を学習した後、多くの競合する開発者を超えてすでに進歩しています。次の順序で学習します。

  • Smalltalk-これはオブジェクト指向が得られる最高のものであり、単純な露出は物事が行われるべき方法に目を開かせます。オブジェクト指向の概念を学ぶのに最適です。
  • JavaまたはC#-静的にチェックされた型を導入しながら、オブジェクト指向に対するよりアーキテクチャ的で計画的なアプローチを提供します。
  • RubyまたはPython-JavaまたはC#を感じるまで、感謝することはできません。
  • Erlang-簡単に見える方法で実行される並行性。あなたのオブジェクト指向言語やCができるよりもはるかに優れています。
  • Lisp、Haskell、またはその他の関数型言語-問題を解決するための別のアプローチです。
  • C-Javaのネイティブ拡張を構築するか、低レベルのアルゴリズムを実装することにより、コンパイラーを作成するまで誰かが必要とするのと同じくらいアセンブリに近い

「C ++はどこですか?」Xはどうですか?正直なところ、複数の言語を学習すると、いくつかのことが行われます。経験が豊かになり、より多くの言語を学習する意欲が高まります。私がよく知っている言語(Java、C#、Ruby、C ++、Javascript)のリストはすべてオブジェクト指向ですが、それは主にそれが私が毎日仕事でしなければならないことだからです。私が経験した言語のリスト(Smalltalk、Python、Erlang、JESS、C、Assembly [Motorola 6502/6510]、Go)はすべて、貴重な教訓を教えてくれました。少なくとも、これらの言語で何が起こっているのか理解できます。私がまだ調べていないことはたくさんありますが、将来的にはそうかもしれません。HTML、XSL:FO、XSLT、CSS、XML、SGMLなどのマークアップ言語もいくつかあります。これらの言語は、何らかの方法でWebを操作する場合に公開する必要があります。

少なくとも2つの異なる言語を学習した後、学習意欲のある人が次に学習することを決定するものを制限すべきではないと本当に思います。学習は有機的な経験でなければならず、プロセスの構造が多すぎると、まったく同じように考える人々のグループが作成されます。いわばモノカルチャー。


2

これらの答えのほとんどはほぼ同じように見えるので、別の意見を述べます。私は長い間、最高の第一言語はTclだと信じてきました。

どうして?1つは、非常に簡単に習得できることです。言語にはあまり構文がないため、学生はプログラミングの概念に集中でき、特定の言語の構文の特質に集中できません。これを書いている時点で、Tclには言語全体を管理する正確に12のルールがあります(過去数十年の11から)。

もう1つは、Tclに素晴らしいGUI言語が組み込まれているため、比較的すぐに満足を得ることができ、イベント駆動型プログラミングの基礎を学ぶことができます。

第三に、拡張可能です。繰り返しループについて教えたいですか?リピートループを実行するコマンドを記述して、repeat ... untilの使い方を学ぶだけでなく、実際に自分で書いたためにwhileループとはどのように異なるかを学ぶことができます。

また、拡張性があるため、Cに簡単に接続できます。Cの基本を学習し、a)別の言語で記述された新しいコマンドでTclを拡張する方法、またはb)で記述されたプログラムにスクリプト言語を追加する方法を学習することができますC.

TclとCを習得すると、他のほとんどの言語はこれらの両極端の中間に位置し、比較的簡単に習得できるはずです。TclとCの後に教える4つの完全なリストは次のとおりです。

  1. Tcl
  2. C
  3. Python-オブジェクト指向の概念に加えて、他の言語と対比するためのインデントによるブロック定義の動作です。
  4. Ruby-オブジェクト指向の別の視点に加えて、フレームワークについて学ぶためのレール
  5. java-どこでも使用されているので、それを知る必要があり、JVMについて学ぶ必要がある
  6. groovy-動的言語に戻る

1

アセンブリ言語、C、SQL、C#

私は知っている、退屈でオールドスクール。そして、質問全体では、プログラミングの非常に難しい部分、つまり問題解決、ドメインモデリング、およびアルゴリズム構築を無視しています。しかし、その理由は次のとおりです。

  1. アセンブリ言語を偽造することはできません。あなたはそれを手に入れるか手に入れません。コンパイラはあなたを救うことはありません、フレームワークやライブラリのオーバーヘッドはありませんし、マシンのアーキテクチャから隠すことはできません。それは純粋なプログラミングです(初心者のadd-two-numbersレベル)

  2. 数百行以上のアセンブリ言語プログラムをいくつか書いた後、ポインターとメモリ管理はもはや神秘的ではなく、コードのパターン(if、switch、array、loopなど)に気付くはずです。 )。Cは、これらのパターンを太陽光に導き、輝かせます。標準ライブラリは、広大でなくても便利ですが、マクロ/テンプレート/などには煩わされません。この段階では。

  3. SQLを使用してデータベースにジャンプします。ストアドプロシージャにこだわるのではなく、テーブルとクエリの基本を理解するだけです。

  4. 数百行を超える数個のCプログラムを作成した後、ポインター、構造体、およびメモリ管理は第2の性質であり、手続き構造は古くからの友人です。高次のパターンに気付くでしょう。これらの関数は常にこのデータ構造に対応しています。コードのこの部分は、メソッドX、Y、Zなどを除いて、コードのその部分とまったく同じです。これにリレーショナルデータの把握を追加すると、オブジェクト指向言語の準備が整いました。大規模なフレームワークと一般的に鈍いドキュメント。現実の世界へようこそ!GUIの探索、デスクトップアプリの作成、Webサイトの作成、Webサービスの作成、好きなものの作成。あなたがそんなに傾いているなら仕事に行きましょう。

あなたは今、プログラミングのジェダイですか?コード忍者?いいえ、今あなたは単に有能です。しかし、あなたは輝かしい新しい楽しいものを探索するために立つための強固な基盤を持っています。



0

OK、これは賞金の最終日です。そして、答えを追加しています。私の提案したシーケンス

C、C ++、JAVA / C#、Python / Ruby、その他の言語(Assembly / Lisp / Prologなど)

  • 私は第一言語が最も簡単なものである必要はないと思います。むしろ、抽象化を保ちながらコンピューターがどのように機能するかの全体的な考えを与えるべきだと思います。
  • CからC ++への移行が簡単になります。最近、最もよく使用されるパラダイムであるOOPがあります。
  • C ++からC#/ Javaへの移行が簡単になります。関数型プログラミングのような多くのパラダイムが組み込まれているため、私はC#を好みます。
  • 誰かがPythonやRubyなどの動的言語を使用するようになると、「WoW」が発生します。動的型付けの美しさを感じやすくなります。しかし、最初に動的言語を学習し、後で静的言語を学習すると、「ああ!なぜこれらすべてを追加する必要があるのですか?
  • 現在、最も使用されているパラダイムと言語はほぼ完成しています。だから、あなたが望むものを探ります。アセンブリからLisp、PrologまたはHaskellへ。さまざまなプログラミング言語の新しいコンテキストと機能を発見してください。

ここで、Cは開始するためのものです。
グルシャン

JavaよりもC#の優先度は多くの要因に依存しますが、どちらもほぼ等しいと言えます。
prasonscala

0

スキーム、C、C ++

私はバイアスをかけられ、私の大学が現在中核となるコンピューターサイエンスカリキュラムに使用しているモデルを使用します。私は最初の1年間は反対でしたが、後年には感謝しています。モデルは、プログラミングの経験を必要とせず、学習する能力を必要とすることに基づいています。

  1. Scheme
    私たちはあなたが最初にプログラミングを学んでいるので、魔法が少ないほど良いです。Schemeの教育言語は、言語の明確で合理的な定義を提示します。これは、構築して拡張できる非常に小さな公理(「魔法」)のセットです。数学の関数を理解できる人なら誰でも、Schemeプログラムをトレースして推論できます。Schemeから開始すると、言語固有の詳細を気にせずに計算について考えるためのクリーンで強力な方法が提供されます。

  2. C
    SchemeからCへの移行は抜本的なものですが、高レベル言語から低レベル言語への非常に重要なマッピングについて学ぶことができます。メモリモデル(ポインター、ヒープ、スタックなど)とプログラムのコンパイルおよび実行方法、ポインター、スタック、ヒープの動作方法を学ぶことは不可欠なスキルです。この低レベルの理解を通じて、より高いレベル(Big O)でプログラムの分析を開始できます。さまざまな実装(たとえば、単純なハッシュテーブルとセットのバイナリツリー)を使用して、独自の抽象データ型のロールを開始できます。

  3. C ++
    CとSchemeを学習することで、プログラミング言語のさまざまなパラダイムと、それらがさまざまな問題にどのように適用されるかを理解し始めます。これで、プログラミングの最も恐ろしい側面、つまり選択とトレードオフにアプローチできます。プログラミング言語の選択は、パフォーマンス、可読性、保守性、堅牢性などに影響を与える可能性があります。頭の中で保持できるものよりも大きな問題を解決するには、この選択は素晴らしいですが危険です。C ++は、プログラマーの選択をできる限り少なくしようとします。C ++を学習することで、問題を解決するためにこれらのトレードオフと選択を自分で行う方法を学習します。

業界でこれらの言語を使用したり、再度触れたりすることはないかもしれませんが、それらを学習するプロセスは、使用する他の言語を理解するのに役立ちます。別の側面は、特定の言語に関するツールを学ぶことです。コマンドラインからgccを実行し、Vimを学習し、GDBを使用してプログラムをステップ実行し、Makeファイルを作成し、SVNを使用してコードをチェックインし、テストを自動化するシェルスクリプトを作成します。

コアカリキュラムには、他のコース(コンピューターアーキテクチャ、データ構造とアルゴリズム、コンパイラー、オペレーティングシステムなど)もあります。したがって、単にこれらの言語を習得するだけでは、プログラミングに習熟するには不十分です。


0

基本的な言語から高レベルな言語に移行するのが方法です。そのように、あなたはまだ何が後ろで起こっているかについての考えを持っています。

  • C-ポインターとメモリ管理
  • C ++-オブジェクト指向の基本であり、非常に人気があります
  • Java / C#-最も一般的な言語
  • 基本的な組み立て
  • 関数型言語-例えば、Haskell
  • スクリプト言語-例えばPython

0
  1. Python。作業を完了するには、通常のプログラミングを行います。手続き型、オブジェクト指向、(ある程度)機能的。

  2. 正規表現。それらはPythonライブラリにありますが、別個のDSLです。

  3. シェル(BASHなど)。「&」、「|」、「;」プロセスを結合するための演算子は、Pythonで重要かつ不快です。

  4. SQL。これは、今のところ、データアクセスの共通語です。

  5. XHTML。これは-今のところ- データ表示の共通語です。

  6. CSS。

必要になった場合はCになるかもしれません。


あなたは「深遠な啓発」の段階を省いたようです。その数は7ですか?
マークC

@Mark C:「今日よく使われているほとんどの言語とパラダイム」をカバーしようとしています。私の経験では、これらの「その他」またはDSLはおそらくプログラミング言語よりも頻繁に使用されます。これが深い啓発につながるかどうかはわかりませんが、実際に使用されている多くの言語に触れるだけです。
-S.ロット

あなたは正しい、彼がそう言ったのを見ると、彼が「またはパラダイム」も言っていることに気づいた。それはちょうど良いユーモアでした。
マークC

@Mark C:しかし、SQLとCSSは最も興味深い「その他のパラダイム」です。実際、正規表現は、スタックオーバーフローに関する多くの疑問を引き起こすパラダイムです。
-S.ロット

0

金属の近くから始めます。

  1. アセンブラ
  2. C
  3. C ++
  4. C#
  5. 舌足らずの発音
  6. PythonまたはRuby

現在、このような幅広いアプローチの問題は、長年の研究なしに、これらの言語で誰もリモートになれないことです。

  1. アセンブラー:3か月
  2. C:6か月
  3. C ++:2年
  4. C#:6か月
  5. Lisp:3か月
  6. Python / Ruby:3か月

あなたの意図が「Hello world」を教えることである場合を除き、6つすべてについて約1か月かかります。


-1

まっすぐに進んでVBまたはC#を学んでください。私の意見では、どちらも初心者から上級者までの完全な言語です。


4
それは広さではなく、したがって質問への答えではないからです。さらに、これらのいずれか(または両方)が学習すべきすべてをカバーしていると思う場合は、自分でさらに言語を学習する必要があります。
デビッドソーンリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.