最初のプログラミングコースの言語選択の基準


35

大学レベルのCS教育者として、最初のプログラミングコースでどのプログラミング言語を教えるかという問題がしばしば議論の対象になります。数千の言語から選択することができ、ある言語キャンプを別の言語キャンプよりも多くの宗教的な熱(または熱意)が支えています。各プログラミング言語を取り巻くこの主観的なバイアスはすべて、教育者が言語を選択することを非常に困難にします。

私の質問は:

教育者はどのような客観的な基準を使用して、大学の1年生のプログラミングコースの基礎として使用するプログラミング言語を選択できますか?これらの基準の根拠は何ですか?

:プログラミング言語のリストと、それらが使用するのに最適な理由を知りたくありません。問題は最高の言語ではなく、言語を選択するための基準です。ただし、特定のポイントを説明するためにプログラミング言語を使用することもできます。


この質問は、トピック外とみなされた別の質問https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-languageに触発されました。


1
この質問は、オンまたはオフトピックであるかどうかについての開かれたメタスレッド:meta.cs.stackexchange.com/questions/362/...
デイブ・クラーク

7
<グラブポップコーン> オットーノイ
-JeffE

3
@Raphael:私はダイクストラの応答がありそうだと思う「すべての人に知られている最初のプログラミング言語は、みんなを台無しにすることができます。」
JeffE

2
@ edA-qamort-ora-y、はい、彼らはいくつかのプログラミングパラダイムにさらされるべきです。いいえ、最初のコースではできません。
フォンブランド

3
我々は持っていたSML、それはどんな生徒が手を前に、その言語を知っているとは考えにくいですので、単純に。これにより、コースを開始するために、すべての学生がほぼ同じレベルにバランスが取れました。
マルクスマルクシュ16年

回答:


14

このテーマは底なしの穴だと思いますが、私は自分の2セントを投入します。誤解しないでください、私はそれが魅力的な質問だと思いますが、おそらく私たちが皆の満足のためにここで解決するものではないでしょう。

一言で言えば、言語はあなたがやりたいことを、できるだけシンプル明確な方法で、そしてそれ以上はないはずです。

私自身の経験は、数世代の1年生と2年生の生徒をOberonプログラミング言語で個別指導することに由来します。この言語を知っている人々は、私の意見でその影響を認識します。この言語は「アルゴリズムとデータ構造」を教えるために使用されたことに注意してください。当時(当時)、関数型プログラミングとオブジェクト指向設計は2年目の時点で別々のコースで教えられていました。

重要:しかし、どの言語の詳細に入る前に、最も重要なことは、あなた自身とあなたの学生にとって、あなたのコースの目標が何であるかについて絶対に明確であることを強調したいと思います。プログラミング自体を教えていますか?それともアルゴリズムとデータ構造?それともソフトウェアエンジニアリングですか?言語を選択する前に、あなたがその言語で行く場所について少し考えてみる価値があります。私の意見では、このレベルでの違い(目標)が、おそらくこのトピックに関するほとんどの意見の相違につながります。

私が重要だと考えるポイントは、すでに述べたいくつかのことと重複する可能性がありますが、ほとんどは次の4つのいずれかのサブセットであると思います

  • シンプルさ:学生は通常、特定のプログラミング言語の機能や複雑さではなく、プログラミング、アルゴリズム、およびデータ構造を教えられるためにそこにいます。ワースはアインシュタインの引用「オベロンの設計の指針として「できる限りシンプルにするが、シンプルではない」を使用しました。他にもいくつかの言語があります。選択するプログラミング言語は、講義で必要なすべての概念を実装できる必要がありますが、可能な限り最小の機能/詳細セットでこれを行う必要があります。通常、プログラミング言語は単なるツールであり、目標ではありません。

  • 曖昧さ:シンプルさのきょうだいです。概念ごとに1つの構成要素があり、できるだけ重複しないようにします。すべての概念を実装する「正しい」方法は1つしかないと考えてください。意味的にすべてが同じことを行う3つの異なるタイプのループ?または、変数をインクリメントする15の異なる方法ですか?良くない。また、これは宿題を修正するか、一般的にちょうどあなたの学生のコードを理解することになり、多くが容易になります。あなたのティーチングアシスタントは感謝します。

  • 移植性:学生はLinux、Windows、およびOSXマシンを使用してクラスに参加し、プログラミング環境は3つすべてで可能な限り類似(同一)にする必要があります。プログラムの結果も同じである必要があります。これは、宿題の採点と質問/問題の処理を担当するティーチングアシスタントが高く評価するもう1つのポイントです。

  • 業界の好み:真剣に、「業界」自体がどのプログラミング言語を最も好むかを決定する場合にのみ、これについて心配する必要があります。コンピューターの発明以来、これは常に動いている目標でした。とりあえず、生徒プログラミングの方法を本当に学べば、それは言語に依存しません。ただし、回路設計用のVHDLやデータベースクエリ用のSQL など、業界が規格に同意している分野もあるため、これは依然として有効なポイントです。

繰り返しますが、言語がこのリストにどのように適合するかは、あなたが教えようとしているものに強く依存しています!


4
実際には、VHDLとVerilogの間で回路設計が分かれています。
avakar

@avakar:ああ、くだらない。私は答えでこれを修正します、指摘してくれてありがとう!
ペドロ

うん、これを読んで、私の講師の一人だと思った。小文字キーワードの使用スイッチが自動的に有効になっている限り、Oberonに対して+1。書くのがとても辛いWHILE expr DO stmts ENDなど
コラムロジャーズ

3
「コースの目標は何ですか?」に対する+1 補足説明として、綴られていない場合でも最も一般的な目標の1つは、プログラミングを前提条件とする他のもの(コースやインターンシップ)の基礎を与えることです。
AProgrammer

1つ重要な点(少なくとも今日)は、学生が視覚的に魅力的なプログラムをすぐに、そして痛みを伴わずに構築できることです。彼らは非常に多くのグラフィックを多用するアプリケーションやゲームにさらされているため、当然のことながらコンピューターは人々と対話するはずだと考えています。
フォンブランド

13
  • 主な目標として問題を解決するためのアルゴリズム的思考の開発:最初のコースでオブジェクト指向のパラダイムを使用することの悪い点の1つは、新しい学習者を継承、ポリモーフィズムなどのようなものにすることで、上記の主な目標から注意をそらすことです。実際、ソフトウェアエンジニアリング、移植性、業界での有用性など、この中核となる目標に加えて二次的な考慮事項を導入することは、述べられている理由により非生産的です。

  • オブジェクト指向言語ではありません:今日、ほとんどの大学はオブジェクト指向言語を使ってプログラミングを教えるようになっています。これは間違いだと思います。世界には、その反対とは対照的にしか真に理解できないものがあります。プログラミングの手順パラダイム(プログラムの2つの別個の側面としてのデータと機能)にさらされることなく、オブジェクト指向(データと動作が本質的に結びついていると見なされる)の基本的な考え方を多くの人が見逃します。また、オブジェクト指向プログラミングは非常に重要であるため、その基本的な考え方を見逃すことは小さなことではありません。その上、おそらくCSの学生はより上級のコースで主にオブジェクト指向でプログラムするので、彼らは物事の手続き面にもさらされる必要があります。

そのため、最後に、高度な機能を使用せず、アルゴリズム的思考の開発に焦点を当てた手続き型言語を使用します。しかし、高度な機能を避けることは、難しい問題を避けることを意味するものではありません。つまり、困難な問題であっても、学生は第一原則であるシンプルなツールを使用してそれを解決する必要があります。


たとえば、最初にJavaのサブセットから簡単に始めて、手続き型スタイルを示すことができます。次に、Pandoraのボックスを開き、OOPで同じものがどのように見えるかを示します。
ラファエル

3
@Raphael:public static void main()Javaでは避けることはできません。Javaは、あるクラスのコンテキスト内にある必要があります。これにより、Javaは第一言語として理想的ではなくなりますが、ハードルはそれほど大きくありません。
デイブクラーク

優れたIDEはpublic static void main()、非常に長い間延期できます。BlueJは、生徒がmainどこにもいないプログラムを作成できるIDEの良い例です。
バリーブラウン

2
OOPの問題は、プログラミングの最初の1年程度でカバーされたさまざまなおもちゃの問題に対して、明確な利点がなく、邪魔になることです。OOPは、プログラムが1000行程度の場合に重要になります(高く評価されます)。「OOPのないJava」は恐ろしく、「このように書かなければならない」多くの完全に不透明なものは、オウムではなく学習者に反します。
フォンブランド

11

コンピューターサイエンスプログラムの最初のプログラミングコースについて話しているので、最も重要な側面は、CSの基本的な概念が生徒に教えることだと思います。一度にすべての概念を教えることができる言語はないので、今後どのような概念が必要になるかを考慮する必要があります。

業界の関連性が重要であるという@Kavehの考え方には同意しません。ボーナスかもしれませんが、ここではあまり重要ではありません。CS原則の強固な基盤により、後のコースで「産業」言語を習得するのは比較的簡単です。

補足として、最初に選択した言語に関係なく、できるだけ早く別の根本的に異なる言語に生徒をさらすことが重要です。


1
業界の関連性は二次的なものと考えることができますが、それは小さな問題ではないと思います。これはプログラミングコースの紹介であるため、その中のすべての概念を教えたい理由はわかりません。多くの場合、プログラミングの2番目のコースと、さまざまな言語が議論されるプログラミング言語のトピックに関する別のコースがあります。コースは特定のアプリケーション分野、例えばウェブ向けプログラミングなどに集中しました。
Kaveh

@Kaveh:それは私にとって、工科大学のカリキュラムのように聞こえます。
ラファエル

6
「学生に、できるだけ早く別の根本的に異なる言語を教えることが重要です。」-絶対に正しい。関数型プログラミングを最初に導入することで、プログラムをまっすぐにできると考える新入生を設定します。ほとんどすべてがこのパラダイムに新しく、より多くのC(++)にさらされているように見えます。
ラファエル

3
@Kaveh:現実世界で物事を成し遂げるために設計された言語は、コンセプトを教えたり、スキルを開発するのに必ずしも最適ではありません。目標は大きく異なります。
-JeffE

1
@Kaveh:業界で使用されている言語の知識が重要でないと書いたことはありません。つまり、最初のプログラミング言語がしっかりしていれば、後のコースで学生が卒業時に実際に何をするかについて何かを教えるのに問題はないということです。いくつかの入門コースを自分で(TAとして)教えた経験がありますが、そこで学ぶスキルは業界で必要なスキルとはまったく異なります(そのための時間が足りません)。その場合、$ LANGUAGEプログラマーだけでなく、より優れたプログラマーになれるように、堅実な概念を与える方が良いと思います。
evilcandybag

8

私の主な関心事は、このプログラミング言語を学ぶことで学生がほとんどのプログラミング言語を扱えるようになるという意味での普遍性です。

残念ながら、この基準は純粋な関数型言語を除外しています。また、言語のエキゾチックな機能を使用しないコースにも適用されます。

...しかしこれは常識にすぎません。


1
Haskellのようなモナドでは、この基準はもはや純粋な関数型言語には適用できないと言えます。
デイブクラーク

@DaveClarke:モナドは非機能的なことを行う非常に良い方法です。しかし、直接ではなくモナドのオーバーヘッドで最初にこのようなことを学ぶのはあまりにも危険ではありませんか?(たぶんそうではない、私は知らない!)
jmad

2
@jdam:あなたはおそらく正しい。問題はそれ自体モナドにあるのではなく、一般性とプログラマに良いエラーメッセージを提示することの難しさにあります。Haskellの変種であるHeliumはこれらの問題に対処し、1年生の生徒に使用されています。
デイブクラーク

@DaveClarke:うわー、私はそれを聞いていませんでした。それはとてもクールです!残念ながら、これはHaskellの学習には非常に役立ちますが、他の言語の学習に役立たない可能性があるという問題には対処していません。
jmad

4
@Ben:私の考えでは、手動メモリ管理は、プログラミングの基本的なことよりも、特定の言語に固有の(そしてこれらの特定のケースで学習する)ものであると感じています。あなたがそれに同意しない場合、私はそれがC(またはC ++)を指していると思います。
-jmad

8

最初のプログラミング言語を選択する場合、考慮すべき多くの問題があります。これらの多くは、上記の回答で検討されています。これらは、この質問に最初に影響を与えた非公開の質問(https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language)への私の回答の一部であったため、さらに3つ含まれています。。クローズド質問を削除する現在のポリシーに基づいて、ここに回答をコピー(および変更)しました。

いくつかのプログラミング言語を例として使用して、考慮すべき3つのポイントを次に示します。

大規模プログラミングと小規模プログラミング

最初にプログラミングを学習するとき、大規模なプログラミングを支援するメカニズムを学ぶ前に、小規模なプログラミング方法を学ぶ必要があります。

小規模でプログラミングするということは、100行未満のプログラムを書くことを意味します。これらのプログラムには、単純なデータ構造を操作し、単純な制御フローを持ち、単純な問題を解決するアルゴリズムが含まれます。一般にそれらはアプリケーションとみなされません。

大規模なプログラミングとは、多くのコンポーネント/クラスから構築され、API、GUI、データベース、おそらくはクライアント/サーバー構成で構築された大規模なプログラムを書くことを意味します。

小規模でプログラミングする場合にプログラマが考える必要があることは、大規模でプログラミングする場合とは非常に異なります。大規模なプログラミングでは、プログラマーがモジュール性、優れたインターフェース、優れた設計、再利用性、その他の多くの問題について考える必要があります。現代のプログラミング言語は、大規模なプログラミングを支援する多くの構成要素を提供します。これらの構成要素には、クラス、モジュール、インターフェイス、情報隠蔽などが含まれます。小規模でプログラミングする場合、これらの問題はそれほど重要ではありません。

C ++などのプログラミング言語には、大規模なプログラミングを支援する多くの機能がありますが、座って非常に単純なプログラムを書き始めるのはより困難です。Javaも同様です。

一方、Python、Ruby、Scheme、Haskellなどの言語を使用すると、プログラムを直接作成するのがはるかに簡単になります。

高レベルと低レベル

C ++やCなどの言語は、かなり低レベルの言語です。これにより、プログラマはメモリへの参照を直接操作できます。これにより、非常に効率的なコードを記述できますが、最初のプログラマーが低レベルの詳細を理解するのは難しい場合があります。これらの低レベルの詳細は、問題を解決するためのロジックを作成する方法を妨げると主張する人もいます。

Pythonのような高レベル言語を使用すると、問題領域の観点から概念をより直接表現しやすくなります。

静的に型付けされたものと動的に型付けされたもの

C ++、Haskell、Java、その他多くの言語は静的に型付けされています。これは、コンパイラーが、コード内の各位置で予期されるタイプの値に基づいて、潜在的なエラーが発生する場所を自動的に検出することを意味します。静的型付けが良いことであるかどうかについては少し宗教的な争いがありますが、私はそのことを明確にします。新しいプログラマーの静的型付けに関する問題の1つは、コンパイラーによって報告されるエラーメッセージを理解するのが難しいことが多いことです。これは特に、C ++テンプレートとHaskellプログラム全般に当てはまります。

Python、Ruby、およびSchemeは動的に型指定されます。これは、プログラムの実行中にエラーが検出されることを意味します。これはエラーを検出するには遅すぎると主張することができます(しかし、テストを使用してそのようなエラーを回避することもできます)。繰り返しますが、宗教的な議論を避け、動的に型付けされたプログラミング言語で単純なプログラムを書くときに遭遇する種類のエラーの利点は、このオブジェクトがこの操作を行う方法を知りません。小さなプログラムのコンテキストでは、これらのエラーは簡単に理解して追跡できます。

Cのような言語には弱い型付けがあります。つまり、コンパイラはいくつかのエラーを処理しますが、ランタイムは無効なメモリアクセスなど、発生する他のエラーをトラップできません。その結果、プログラマに返されるエラーメッセージは「プログラムがクラッシュしました」に似ています。動的に型付けされた言語は、これらのエラーをトラップし、それらをよりわかりやすいエラーメッセージに変換します。

その他

他の言語では、プログラミング環境で提供されるサポート、利用可能なAPI、書籍の品質、オンラインチュートリアルなど、さまざまな考慮事項が関係する場合があります。


心から同意します。
フォンブランド

1
また、「静的型と動的型」の競合について、独自の好みがあります。しかし、一般的なCSプログラムでは、両方が何らかのポイントとして教えられている限り、順序はそれほど重要ではないと思います。ただし、コインの片側しか提示されない場合、それは私にとって大きな問題です。
カイ

8

はじめに、1つのコースで複数の言語を提示する可能性を考慮してください。最初の用語では、SMLとJavaの両方を示しました。その対比には、独自の重要なメッセージがありました。仕事に適したツールを選択してください。

しかし、今度は任意の順序での基準です。

学習の難しさは主観的な問題ですが、重要です。あなたは、あなたの学生が言語を学ぶために時間を無駄にしたくないが、それを使っ物事をすることを望みます。おそらく、Rubyのような動的言語がこの分野で勝つ可能性があります。何でもフィードできます。また、Webには優れた「ダミー」チュートリアルがあります。私の記憶が正しければ、プログラミングをまだ行っていない学生が他の言語よりも関数型言語でより良い結果を達成することを示す研究もあります。

豊かさ:あなたが教えることを望むすべての概念に対して、言語は十分に豊かでなければなりません。たとえば、高階関数を議論する場合、関数型言語やScalaなど、関数が値である言語が必要です。

スケーラビリティ:生徒は、表示されている言語よりも多くの言語を自分で学習しない可能があります。そのため、選択した言語を学習期間中に拡張する必要があります。彼らは今すぐペットのエクササイズを書く必要がありますが、後で中規模のプロジェクトを攻撃することもあります。ここでは、Javaと同様の生態圏を持つ言語が適しています。

ツールのサポート:これはスケーラビリティに関連しています。学生が言語で生産的になることを期待/希望する場合は、優れたIDE、ビルドマネージャー、およびライブラリが存在する必要があります。インタラクティブシェル(Ruby、Scala)も、特に初心者にとっては便利です。ツールもすべての主要なプラットフォームで動作する必要があります。

ドキュメンテーション:おそらく実際に言語を教えたくはありませんが、生徒に(抽象的な)指導で教えてもらいます。したがって、適切なドキュメントが重要です。間違いなく、一般的で確立された言語であればあるほど、ドキュメントは改善されます。たとえば、Scalaのドキュメントは非常に貧弱です(ただし改善されています)。Hoogleのようなツールはプラスです。

可用性:実際には、MatlabまたはVisual C ++を使用して教える人がいます。すべての人が必要なプログラムを実行できるライセンスまたはマシンを持っているわけではないことを考慮してください。おそらく、さまざまなプラットフォームで実行される無料の言語を好むはずです。

清潔さ:あなたの生徒の考え方を形作りたいと思うでしょう。メッシエ言語、彼らが考えるメッシエ。コースでPHPを提案することはありません。一般に、動的言語には不利な点があります:悪い習慣を許し、時には促進さえします。

あなたにとって他のどの基準よりも重要な基準は、を教えたいによっても異なります。これは文字通りプログラミングコースですか?アルゴリズムとデータ構造のコースですか?異なるパラダイムでプログラミング言語の概念を紹介するコースですか?大規模なソフトウェア開発に関するコースですか?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ...またはCまたはPascal、どちらもほぼ永久に関数ポインターを持っています。事実上、この基準が実際に締め出す唯一の(メインストリーム)言語はJavaです。
メイソンウィーラー

初心者にさまざまな構文と基礎概念の寄せ集めを教えることは、頭を悩ますだけです。
フォンブランド

6

魅力的な質問。客観的な基準に重点を置いていることが好きです。新入生に学習してもらいたい:

プログラミングの概念:最初のプログラミング言語は、関数呼び出し、反復、再帰をサポートする必要があります

基本的な考え方:最初のプログラミング言語は配列をサポートする必要があります(メモリが実際にどのように機能し、ポインタがどのように機能するかを丁寧に紹介する最初のステップ)

実用的なプログラミングスキル:デバッガーの使用方法、プロファイラーの使用方法、大規模な問題の解決方法(高レベル言語)、大規模システムの組み立て方法、問題の分解方法(問題の分解)、記述の回避方法複雑なコード、(しばしば不可解な)一連の実行可能ステートメントの背後にある意図を人間に伝える方法。

sort()のようなもののために事前に記述されたライブラリが存在するという事実、およびそれらを使用する方法-つまり、すべてを最初から記述する必要はないという事実。

第一言語の他の基準

解釈されます(クイックフィードバックは学習プロセスに役立ちます)。

学習、テスト、デバッグを高速化するインタラクティブな環境。

学生はその言語で読むために高品質のソースコードを利用できます

「読みやすい」、「自然言語に近い構文」(SourceCodeを読みやすく、評価しやすくするため)

ポータブル(Mac OS、Windows、Unixで実行)。言語の少なくとも1つのフリーソフトウェア実装。

たとえば、「最初のOOPLとしてJavaを使用するよりも、最初にPythonを、次にJavaを教える方が速いかもしれません。」- 「オブジェクト指向プログラミング言語の比較」TelescopeRule

Matthias Felleisenは、初心者向けにエラーメッセージをカスタマイズしたプログラミング言語を開発しました。彼は、特定の言語の選択は、優れた設計方法論を教えるほど重要ではないことを強調しています。実際、彼は最初のCSコースをリベラルアーツクラスと見なし、批判的思考、問題解決、細部への注意を教えています。

第二プログラミング言語の基準

生徒に学習してほしいものですが、おそらくこれは第2プログラミング言語を待つことができます。

「難解すぎない」「関連する」言語。「業界で人気のある」もの

複雑性理論:現在の技術では不可能なタスクを認識する方法。

高レベルのもの:ジョブに適したツールの選び方、コンパイラーの使用方法、構造、オブジェクト指向プログラミング、関数型プログラミング、論理プログラミング、コンパイラー設計、関数の作成と操作(Lisp / MLの意味で)、並行および分散プログラミング、

低レベルのもの:ポインター演算、コンピューターアーキテクチャ。メモリ管理、スタックフレーム、アセンブリプログラミング、マシンアーキテクチャ、デバイスドライバ、およびオペレーティングシステムの設計(したがって、マシンは「侵入できない恐ろしいブラックボックスのように見えない」)

編集:私が書いた何かの要約を他の多くの人と協力して「合法的な投稿ではないかもしれない」と投稿するのは残念です。

そこで、以前の非公式リンクに、より正式な引用を追加し、フェアユースやその他のWiki著作権の問題に準拠しようとしています。

この回答は、Portland Pattern RepositoryにあるFreshmanの第一言語(2011年以外)要約です。

(Anon 2011)多くの匿名およびその他のさまざまな著者。「フレッシュマンズ第一言語」。ポートランドパターンリポジトリ。9月27日、2011年http://c2.com/cgi/wiki?FreshmansFirstLanguage


コンテンツの複製が許可されているかどうかを元の著者に確認しましたか?ソースは企業のウェブサイトであり、コンテンツが無料であるという宣言を見つけることができなかったため、これは合法的な投稿ではない可能性があります!
ラファエル

1
@Raphaelソースはウィキです(したがって、多くの異なる著者がいる可能性があります)。この資料の著者(共著者)がここに含めることを望まない場合、DMCA削除通知を[このページの下部に記載されている連絡先アドレス](mailto:team+cs@stackexchange.com)に送信する必要があります。 。さらに、この情報は著作権の対象ではなく、表現方法のみが対象です。WordsRunTogetherWikiWikiStyleを少しリファクタリングして削除すると、この回答が改善され、著作権侵害のリスクがすべて除去されます。
ジル 'SO-悪であるのをやめる

1
+良い答えですが、私が選ぶべき点は1つあります。プロファイラーです。それらの背後に理論はありません-ただ「常識」です。学者の間では、見つけられない多くの問題があり、別のテクニックがそうであるということは、一般的に認められていません。このリンクを確認してください。
マイクダンラベイ

5

シンプルさと学習のしやすさが主要な基準の1つだと思います。プログラミングの入門コースでは、不必要なプログラミングのハードルを回避し、プログラミングとアルゴリズムの問​​題解決の原則に可能な限り焦点を当てたいと思います。初年度の生徒は、多くの場合、問題についてアルゴリズム的に考える能力が不足しているため、コースはアルゴリズム的思考を教えることでもあります。

別の基準は、業界における言語の有用性です。業界では役に立たない言語を教えたくありません。学生の大多数は業界で働くことになるので、業界で何が使われているか(そして学生が卒業するときに使われる)ことに目を向けるべきです。

3番目の基準は、学生が後年に受講するコースです。コース、特に必要なコースは、それ自体で設計されているのではなく、他のコースと調整されています。

私が今考えることができる最後の1つはjmadの答えと同じです、言語は他の重要な言語の学習を容易にするはずです。それは十分に豊かでなければならず、後の重要な言語を習得するのは簡単です(ここでは、学生の観点から重要な重要な手段)。

多くの大学は、プログラミングコースの主な紹介をJava / C ++ / CからPythonに変更していると思いますが、他の言語のプログラミングの紹介を提供することもあります(コンピューターサイエンス以外の専攻、たとえば電気工学専攻のCなど)ただし、講師がたまに別の言語を教えることを試してみたい場合は、柔軟性が示される場合があります。


3
プログラミング入門コースでは、業界での有用性をそれほど高く評価しません。野生で成功したプログラマうちは、おそらくそれらのいくつかの「仕事上」、自分のキャリアの間に多数の言語を習得する必要がありますので、ピックアップして、新しい言語を学習する能力は、ニーズが教えられることのキースキルです。その結果、大学のコースで最初の言語が教えられると、卒業時に必ずしも最強になるとは思わないでしょう。
ベン

1
@Ben:学生がCSを専攻しない場合、業界での有用性は特に重要です。私は多くの人から来る場合は、生物学やその他の科学上の仕事に行くと、彼らは多くの言語を学習する時間を持って文句を言わない方法を与え、Pythonのような彼らの生態系に何か共通の学習をすることはおそらくその後、ML、JavaやCでより有用であろう
hugomg

1
業界(特定の業界の1つであり、必ずしも代表ではない)の誰かと言えば、将来のティア1プログラマーになると、業界の関連性が要因になるとは思いません。複数のパラダイムにさらされることで、私のドメイン(組み込みプログラミング)でほとんどCを使用している場合でも、より良いプログラマーになります。言語の詳細はマニュアルで学ぶことができ、一般的な概念は学校でよく教えられます。偶発的なプログラマー(科学者など)の場合、優先順位は異なりますが、Fortranに重点を置きすぎると、Numpyを使用する必要がある場合にNumpyを無視する可能性があります。
ジル 'SO-悪であるのをやめる

5

したがって、私はすぐにひざまずく反応を省きます。つまり、Lispは正しいことなので、誰もがSICPを介してプログラミングを学ぶ必要があるということです。

言語を選択するための多くの優れた基準がすでに提供されています... 最も重要なものの中にシンプルさ移植性があります。しかし、プログラミングを初めて学ぶ学生にとって、現代言語の舞台裏で何が起こっているのかについて間違った考えを持たない(またはまったく知らない)ことも重要だと思います。

これらの他の投稿のいくつかは優れた基準を提供していますが、特定の言語を使用して「基準を満たす」とはどのようなものかを説明したいと思います。

これらの懸念のいくつかは、Joel Spolskyのブログ投稿The Perils of JavaSchoolsで対処されています(私が試みるよりもはるかに優れています)。JavaやPythonなどの言語を選択すると、CSの2つの難しい(そして最も重要な)概念が閉じられます。つまり、ポインターと再帰。

もちろん、Cでイントロコースを教えることは信じられないほど濃密になりますが、再帰に関連する多くの重要な概念も失われる可能性があります。同様に、Lispで教えられているコースは、リンクリストに関連する重要な概念としてcar、そしてcdr言語が詳細を処理できるように、カバーの下でポインターに対処する必要があります。

基本的に、私が得ていることは、学生がデータ構造とアルゴリズムの基礎、および実際の実装を理解する必要があるということです。

また、オブジェクト指向言語を使用しないという提案にも反対します。インピーダンスの不整合が明らかになる限り、オブジェクト指向言語の実世界のモデリングへの有用性は新しいプログラマーにとってプラスの資産であり、そのオブジェクト指向言語は多くのパラダイムの1つであると思います。

私は、Ruby(別の投稿でも可能性として示唆されている)が、プログラミングコースのイントロに使用する言語で探すべき多くの特性を例示することを提案します。

私はこの主張を一時的に正当化しますが、最初に、イントロCSコースで私を邪魔する1つの傾向についてコメントしたいと思います。私は大学で働いており、多くの学校と同様に、最近イントロコースにPythonを使用するようになりました。Pythonは新しいBASICであり、言語の傾向は、最近別の場所で議論したよう、パワーと表現力よりも新しい親しみやすさを選択する傾向があると固く信じています。これは悲惨なことであり、現在の初心者ではなく、彼らがなるプログラマについて考える必要があります。

とにかく、Rubyを導入言語として正当化する...

  • Rubyは、末尾呼び出しが最適化されていませんが、再帰をかなりうまく行います。それがあります。
  • Rubyはマルチパラダイムです。これは純粋なオブジェクト指向言語ですが、関数型プログラミングも取り入れており、Cから派生したいくつかの必須のトレーニングホイールを追加しています。これを、一部のオブジェクト指向オブジェクト(ボルトは表示されていますが)を備えた手続き型言語であるPythonと、いくつかの機能要素(PythonのBDFLが繰り返し使用を試みました比較してください。
  • CRuby(別名MRIまたは「Ruby Classic」)はCで記述され、拡張さmalloc()れています。Cで言語を拡張するように教えることで、ポインター、メモリ管理、恐ろしい神について生徒に教えることができます。
  • 高度で動的な言語だと思っていても、データ構造、型などについて多くを教えることができます。赤黒の木からカモタイピングで奇妙なことをするまで、あなたが想像できるあらゆるもののためのライブラリ(宝石)があります。

とにかく、専門的に使用するかどうかにかかわらず、多くのパラダイムから多くの言語を学ぶことに代わるものはありません。基本的に、誰もがCとLispを使用していなくても理解すべきだと思います。Rubyは入門学期で考えられる最高の妥協案です。

とにかく...それは私のUS $ .02です。Rubyを使用するように説得するつもりはありません。イントロコースを教えるための言語で探すための資質の模範としてそれを使用するだけです。


2
「Pythonは新しいBASICであると固く信じています」-それをコピーしてください。「CSの2つのより難しい(そして最も重要な)概念、すなわち、ポインターと再帰」-ポインターを明示的に扱う言語を学んだことはなく、見逃したこともありません。コンパイラがどのように機能するかを学んだとき、ポインタは十分に素早く説明されていました。
ラファエル

マルチパラダイム言語には魅力があることに同意します(2〜3つの「純粋な」言語を教える方が良いかもしれませんが)。そのため、Rubyは選択しません。特に基本的なライブラリに関して、より良い仕事、私見、への他の言語。たとえば、Scalaには不変のコレクションのライブラリがあります。
ラファエル

3
Pythonは新しいBASICでもあると思います。しかし、なぜそれがPython に対する議論なのでしょうか?
JeffE

1
@Raphael、ポインターはCで始めたときにのみ難しくなります。これは、あまりにも多くのものが落ち着かず、配列と混同する関係がある場合にポインターにさらされることをやや強制します。パスカルを独学したとき、ポインターは私にとって難しくありませんでした。Algol 68でそれらを教えられた私のクラスの人々にとってポインターは難しくありませんでした(それらはそこで参照と名付けられていますが、Javaのように別の名前のポインターです; Algol 68で難しいのは自動逆参照規則です)。 Cサブセットを教えることから始めなければ、C ++ではポインターは難しくありません。
AProgrammer

1
@DaveClarke:空白でインデントしますが、それはそれらを補います。
ラファエル

5

私の最初のプログラミング言語は、おもちゃのアセンブリ言語でした。2番目はFortranです。その間に、私は「アルゴリズム」表記法を教えられました。これはおおよそアルゴル60でした。私はまったく大丈夫でした。実際、私が教えられたことはほぼ完璧だったと思います。

関数型プログラミングを最初に調べたとき、実装された言語ではありませんが、研究論文で、「すごい、これはまったく違います。まったく数学的です!」関数型プログラミングを教えられたほとんどの人は、同じ種類の「すごい」経験をまだ持っています。それは素晴らしいと思います。

命令型プログラミングと関数型プログラミングは、まったく異なる2つの世界観です。生徒たちにその多様な経験を奪うと、生徒たちを傷つけます。

最高の最初のプログラミング言語は、生徒が明確に考える方法に集中できるように、できるだけシンプルで、できるだけ明確なものでなければなりません。残念なことに、アセンブリ、Fortran、およびAlgol 60のシンプルさと明快さは、現代のほとんどのプログラミング言語にはありません。Haskellは例外です。しかし、Haskellは私の理想的なプログラミング言語であり、最初のプログラミング言語ではありません。エッフェルまたはオベロンはおそらく法案に合うかもしれません。


5

で、科学と数学のノースカロライナの学校、私たちは能力が短く書くことだと思うので、私たちは、手続き型プログラミングを教えるためにそれを使用する2004年以降のPythonを学生に紹介した、正しい手順は、重いツールを使用して、後で進んOOを含むために不可欠ですプログラミング。

これらの理由で気に入っています。

  1. Pythonは自由形式の言語ではありません。インデントを使用してブロックでコードを書くことを生徒に強制します。(テクニカルノートとして、vimテキストエディターを使用set tabstop=4 set etし、.vimrcに[ ]を配置して、厄介な問題を排除し、コードのインデントが目立つようになりますが、過度の水平方向のドリフトは発生しません)。学生は、空白で区切られたプログラムの階層構造を見ることに慣れます。その結果、他の言語でプログラムを作成するため、フォーマットの習慣は非常に優れている傾向があります。

  2. Pythonの構文上の単純さにより、Pythonは初心者にも使いやすくなりました。単純なプログラムは、最小限の不可解なキーワードと魔法の呪文で書くことができます。通常はプログラミングを考えない学生に試してもらいたい。Pythonのシンプルな美しさに注目してくださいhello.py。何が起こっているのかは明らかです。

  3. Pythonは動的に型付けされ、アヒルは型付けされます。これにより、変数を簡単に導入できます。変数は単なるラベルであることを生徒に伝えます。オブジェクトを指しています。誰かが電話をかけてあなたにメッセージを送信するのと同じように、変数名を使用してオブジェクトにメッセージを送信します。

  4. Pythonは、野心的な学生が成長しないツールです。便利なものをホストする洗練されたライブラリがあります。初心者がアクセスできる強力なクリエイティブツールです。

  5. Pythonは無料で、すべての主要なプラットフォームで実行できます。私たちの学校は、あらゆる種類のマシンを備えた異種OS環境です。互換性の問題などの頭痛を心配する必要はありません。ほぼすべてのコンピューターで実行されます。

  6. Pythonには優れたドキュメントがあります。生徒は線の外側を探索、いじり、色を付けることをお勧めします。彼らはPythonのドキュメントの使用方法を早期に学び、クラスの外でクールなものを探索することがよくあります。

Pythonには非常に満足しています。


1
ようこそ!これは素晴らしいケーススタディですが、選択基準の後の質問にはほとんど答えません。アイテムを逆読みすることでそれを行うことができますが、そのように意図したかどうかはわかりません。
ラファエル

特定の順序は意図されていません。これは「and」です。
-ncmathsadist

3

私は言うかもしれません、言語(ある制限の下で)は、あなたがその言語で何をするかほど重要ではありません。ほとんどの言語で、ソフトウェア開発、アルゴリズム、オブジェクト指向プログラミング、コンピューターハードウェアなどについて同じことを学ぶことができます。重要なのは、これらのすべての概念を活用する興味深いものを開発することです。

https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/から移行された回答)


1

TL; DR:その背後にある基準には客観的な根拠がないため、これに客観的に答える方法はありません。青が客観的に赤よりも「良い」色であるか、バニラアイスクリームが客観的にチョコレートよりも「美味」であるかを議論しようとするのはarbitrary意です。


すでに素晴らしい投稿がいくつかあると思いますが、2セントを追加します。

教育者はどのような客観的な基準を使用して、大学の1年生のプログラミングコースの基礎として使用するプログラミング言語を選択できますか?

この質問は、アイスクリーム店を初めて訪れたときに他の人が試すべき最初のアイスクリームのフレーバーを客観的に選択する方法があるかどうかを尋ねることに似ています。いいえ、本質的に主観的なものを選択する客観的な方法はありません。

どうして?Pedroの回答で言及されている合理的な基準を見ても、誰もが各要素が他の誰かの意見に対してどのように「持ちこたえているか」という主観的な見解を持っているからです。

たとえば、Ruby はPythonよりも客観的に「シンプル」ですか?どんな意味でシンプルですか?何に関して?「単純」にとって何を意味するのあなた?「少ないコード行」という意味ですか?「読みやすく、理解しやすい」という意味ですか?他の人はどうですか?ここで特定の選択に誰もが同意する必要があるのはなぜですか?その質問に客観的に答えることはできないと思います。

これは次の質問につながります。

これらの基準の根拠は何ですか?

いくつかの基準が妥当であるとしても、これは他のものよりも主観的な好みに基づいていると思います。たとえば、Pedroの単純さ曖昧さ移植性業界の好みの基準を受け入れる必要がある理由はありません。実際、業界の選好は定義上主観的であり、単純に悪循環に陥ります。(誰もがトレーニングを受けているので、誰もがそれを業界で使用しているため、誰もがトレーニングを受けています...)

たとえば、なぜ

  • 効率:実行時間とメモリフットプリントを実際に測定できます。
  • サイズ:可能な限り少ない予約語を使用すると、言語が学習しやすくなります。
  • 機能セット:サポートされている機能(ラムダ、ジェネリック、オブジェクト指向、演算子のオーバーロードなど)の幅広いセットにより、言語を切り替えたり、スクエアに戻ることなく、より多くの概念を教えることができます。
  • 相互運用性:他の言語やネイティブシステム(C#やPythonのWin32 APIなど)との連携を容易にする言語は、より良い長期的な投資などとして調達できます。

ポイントは、評価基準の別のセットを思い付くことができ、それでも合理的であると考えることができるが、他の誰かより客観的に優れている/劣っていると主張することはできないということです。

結論として、基準には客観的な根拠はありません。青が客観的であるかどうかを議論しようとするのと同じくらいarbitrary 意的ですに赤よりも「良い」色であるか、またはバニラアイスクリームが客観的にチョコレートよりもおいしいかどうか意です。

それは、あなたの好みを正当化する正当な理由がないと言うことではなく、結局のところ、彼らはあなたの好みに過ぎません。

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