すべてのコンピューターサイエンスの学生にどのプログラミング言語を教える必要がありますか?


13

すべてのコンピューターサイエンスの学生は、どの言語(またはプログラミング言語のクラス(パラダイムなど)に加えて、そのクラスの推奨言語)を大学で教えるべきですか?答えを動機付けます。なぜその言語?それからどのような用途がありますか?それはどのような概念を教えていますか(言語Xが教えるよりも良い)?

注/説明:この質問は、純粋なコンピューターサイエンスではなく、ソフトウェアエンジニアリングに重点を置いたコンピューターサイエンスに関するものです。焦点を当てているのは、まだコンピュータサイエンス教育であり、ソフトウェアエンジニアリング教育ではありません。


13
擬似コードはCSに十分なはずです。
ジェキュー

12
@Xepoch-同意しない。熱心な評価と遅延評価のセマンティクス、型シグネチャの共分散/反分散、カテゴリ理論などを擬似コードを使用して表現することは特に自然ではありません。擬似コードはアルゴリズムとデータ構造を記述するのに最適ですが、CSにはそれ以上のものがあります。
エイダンカリー

6
さらに、CS学生の大多数は、卒業後、学業以外の仕事に就くことを望んでいます。競争の激しい雇用市場では、擬似コードはあまり価値がありません。CSの学位は主に職業訓練であるとは思わないが、その方向に適応する必要がある。
アダムクロスランド

2
それらすべて。時間に制限がある場合は、アルファベットの文字から始めます。A +、B、C、C#、D、E、F#、J、K、Q、R、T ...これは実際には悪いリストではありません。
ジェシーミリカン

6
「Which Language?」のさらに別のバージョンを発見して、おめでとうございます。質問。私はすべての意見を読むのを待つことができません。SICPへの参照を忘れないでください。ああ待って、そこにある。
コービン

回答:


21

リストを提供します。

  • アセンブリ(比較的単純な方言):少なくとも少しの基礎を理解することが重要です
  • C:手続き言語。多くの場所で使用されています。OODのようなまったく新しい概念を一度に新しい生徒に負担させません。
  • Java / C#/ Eiffel / C ++:オブジェクト指向の何かが優れていると、これらのいずれかが学生にOODを教えるという目標を達成し、これらの言語の1つを理解すると、他の言語を学習できるはずです。良い言語、Eiffelをリストしたのは、契約による設計もあるからです。
  • LISPとProlog:「現実世界」でこれらのいずれも使用しない場合でも、まったく新しい考え方を学生に教えます。これは重要です。
  • SQLとXML:データについて考え、データを取得して管理する新しい方法を紹介します。

学生は少なくともこれらのパラダイムのすべてにさらされるべきです。1つまたは2つだけではありません。

私は多くの人々がPythonを手続き型スタイル、OOPスタイル、そしておそらく他のものをカバーするよう提案するだろうと思うが、私は自信を持ってそれを勧めることができるほど十分なPythonの個人的な経験を持っていない。


私の学校がXMLとSQLについてさらに詳しく説明してくれたらいいのにと思います。両方のクラスが1つあり、それはテリバッドでした。

Lua、Python、Javascriptなどの最新の動的言語を追加します
Javier

4
ああ、haskellやerlangのような筋金入りの機能も非常に教育的です
ハビエル

1
SQLをリストするための+1。少なくともあなたはリレーショナル代数を考えています。
ジェキュー

1
私は、マネージOOとマネージOO、C ++ および Java も分離します。uni以来、malloc、ヒープ、およびスタックについて学習せずにC ++を使用したことはありませんが、オブジェクト指向を十分に理解することはできません。
markmnl

45

私は個人的には、関数型言語が以前ほど圧倒的に教えられていないことを幾分悲しいと感じています。少なくともcomp sciの学生は、手続き型、オブジェクト指向、機能的、動的という主要なパラダイムすべての言語に触れるべきだと思います。


2
+1プログラミング言語のクラスは、私が受講した中で最も価値のあるクラスでした。
HappyCodeMonkey

1
ITの学生として、私は間違いなく同意します。中学レベルのWebアプリ開発者として学校に通っている間、実世界でフルタイムで働くことにはメリットがありますが、本格的なCS学位で学んだとしても、さまざまな分野の多くの記事が欠けているように感じますパラダイム。
ケン

1
やや関連:youtube.com/watch?v=Ps8jOj7diA0スタンフォード大学は、プログラミングパラダイム2008の完全な講義をYouTubeで開催しています。
イナイマシ

4
リストに宣言を追加します(プロローグ)。また、一部の言語は明示的に並列です(Occam)。並列処理がどのように機能するかを生徒に教えることは良いことです(誰もそれを正しく理解できません)。
マーティンヨーク

1
@Martin York:Prologは、宣言型言語の一種である論理プログラミング言語です。(一般的に言えば、関数型プログラミング言語も宣言型であるため、これに言及しています。)
mipadi

33

バランスのとれたCSの学生には、4種類のプログラミング言語のそれぞれの言語を教えるべきだと思います。

機能的 -Lisp / Haskell / PostScript。Haskellの経験はあまりありませんが、他のプログラマーがこれについて絶賛しているのを聞いたことがあります。関数型プログラミングの構造と多くの状況でそれらが有用である理由を理解することは、プログラマーが他の言語でアルゴリズムを整理するのにも役立つでしょう。

オブジェクト指向 -選択してください。C#/ Java / Python / Ruby / yadda yadda yadda。このタイプは現代のビジネスが望むものであるという理由だけで教える必要があります。

必須 -C / Fortran / Pascal。これらは最近ではあまり一般的ではありませんが、実用的/歴史的な観点から学ぶ必要があります。彼らが採用している方法は、すべての言語ですべてが命令に要約されるため、依然として実用性があります。また、命令型言語は、リストの作成と指示に従うのが非常に得意です。

論理 -ProLog。これらの言語の実用的な使用例は一度も見つかりませんでしたが、オブジェクト指向言語でメソッドを作成する方法を見つけようとすると、論理言語の背後にある概念がいくつか見つかりました。私は大学時代に論理的な言語に長く集中することはできませんでした。


6
そのリストにプロトタイプを追加することもできます-例えば、JavaScript。
stusmith

@stusmith-プロトタイプは言及する価値がありますが、実際にはオブジェクト指向言語のサブセットであり、javascriptはせいぜい限定的な例です。おそらくプログラミング言語コースでの宿題だと思いますが、焦点ではありません。
ジョエルイーサートン

1
プロローグの+1。私はその実際の使用を見てきましたが、アルゴリズムのプロトタイプを作成するために定期的に使用しています。
フレッドフー

@larsmans-あなたの使用法について聞いてみたい。私は数年も触れていないので、実用的なアプリケーションでよくわからない。ホワイトペーパーまたは同様の記事へのリンクはありますか?
ジョエルイーサートン

ECLiPSe(eclipseclp.org)をチェックしてください。これは、いくつかのヨーロッパの大企業(フランスの鉄道会社SNCF、私が正しく思い出せば、私が参考文献を見つけようとします)で工業的に使用されるオープンソースのProlog方言です。
フレッドフー

6

すべてのCS専攻卒業生が知っておくべき第一の言語は、素晴らしい仕事に就く可能性を最大化する言語です。それは時間とともに変化し、個人の素晴らしい仕事の定義に基づいて変化し、地理的な地域によって異なるでしょう。

とりあえず、私は英語をすべてのCSメジャーが知っておくべき第1言語であると言います(もちろん、これは地域によって異なります)。


素晴らしい仕事は、CS学位の副作用です。CSの学位は、まさにそのための計算理論の知識です。この数年間、数学とCSで頭をつぶすのではなく、職業訓練でより良い仕事を手に入れることができたはずです。
ジェキュー

2
英語の場合は+1。コンピューター言語は実装の詳細です。
ワイアットバーネット

+1。誰かが英語を上手に学べば、マニュアルも上手に学べます。私は英語をよく知っていました。私は言語を学ぶのに何の問題もありませんでした。
シプルモカディム12年

4

時間とともに変化すると思いますが、理想的には、3つの非常に異なる視点からの3つの言語です。私の時代は、手続き型、オブジェクト指向、機能的-Pascal、C ++、LISPでした。私は特にこれらの3つであまり売れていません。しかし、インタビューするときは、

  • メモリ管理に注意を払わなければならない言語のある程度の経験(C / C ++およびその他多数)
  • APIの使用と利用可能なさまざまな抽象化(C ++ / Java)に期待するオブジェクト指向言語のある程度の経験
  • 「ストレッチ」言語-奇妙で困難でやりがいのあるもの。誰かがLISP、アセンブリ、または他のやりがいのある言語を知っているので、私は採用しませんが、エンジニアは深刻な問題解決とたくさんの「これは一体何ですか?」瞬間。

別の取引として-CSプログラムは、市場で卓越した言語で学生を訓練する必要があると思います。常に、2〜3の言語が仕事の大部分で深刻な問題を抱えていると思います。学校は、これらの言語のうち3つのうち2つを学習する機会を提供し、少なくとも1つで十分な深さのトレーニングを利用できるようにしていると考えています。


4

CSの学生の場合、議論されているCSの概念に密接にマッピングされているプログラミング言語を探してください。私はお勧めします:

  • スキーム、ラムダ計算をよりよく理解するため
  • アーラン、俳優モデルを理解する
  • Prolog、述語論理および証明システム用
  • Haskell、タイプ/カテゴリ理論、および遅延評価が言語で完全に表現されているため
  • 少なくとも1つのアセンブリ言語-このバナーの下でカウントしたい場合は、JavaまたはCLRバイトコード、LLVM IRなどのバイトコード言語もスローします
  • おそらく、VerilogやVHDLなどのハードウェア定義言語
  • コンパイラ構築クラスのバイソン
  • 動的な型システムを持つもの(Rubyが思い浮かぶ)...

リストはこのように進むことができますが、基本的な考え方は非常に単純です。概念を教える方法に最適なプログラミング言語を生徒に教えます。


3

yacc

使用しているプログラミング言語に関係なく、舞台裏で何が起こっているかを把握するために。デッドコードなどの基本的な概念や、(良い)コンパイラーが実行できるさまざまなタイプの最適化を把握するのに役立ちます。


2

Lisp(OOPのCLOSを使用)およびHaskell。この質問は学生に限定されません。新しい派手なプログラミング言語は、この2つから多くの機能を借りてきました(コピー、盗難?...いいえ、悪くはありません)。将来に備えて準備できます。関数型プログラミング(スタイル)は今日、より重要であり、C#(LINQ)やC ++(ラムダ)などの命令型プログラミング言語で導入されています。一部の学生がJavaのみを学習しているのは残念です。


1
私はそれらの両方に同意しますが、何らかの推論を下したいかもしれません(これらをあなたの唯一の言語として知ることは特に有用ではないことにも注意します)。
イナイマシ

2

言語は人々が信じるほど重要ではないと思います。

はい、プログラミング方法などを知る必要がありますが、多くの優秀なプログラマーは、開発の際に役立つ実世界での経験を独学で学んでいます。

学生は、本の方法だけでなく、現実世界でのプログラミング方法に関するいくつかのレッスンを行うことができます。これにより、生徒はより「丸みを帯びた」ものになり、私のオプションでは開発者/卒業生がより良くなります。

大学を卒業して仕事を始めてから、プログラミングとソフトウェア開発についてさらに学びました!


2

それは本当に重要ですか?

通常、この質問の背後にあるかゆみは、「履歴書に入れて、最もputかる/興味深い/挑戦的/簡単な仕事を見つけることができる流行語は何ですか?」です。ほとんどの履歴書は、自分が探しているものを理解していない人事部によって最初に選別されるため、質問にはメリットがあります。しかし、ゲートを通過すると商品を配送する必要があるため、非常に浅いです。

あなたが良いか悪いプログラマーになるのはあなたが知っている言語ではなく、それをどのように使うことができるかです。このために、プログラマーには基本的に2つのカテゴリーがあります。

  1. 言語の学習に重点を置いているものが中心です。最も重要なのは、言語とその使用方法です。極端な場合、彼らはコードのあらゆる小さな点を極度に最適化する傾向があり、しばしばできるという理由だけであいまいな機能を使用します。

  2. それから、テクニックとパラダイムについて学びたい人がいます。彼らがどの言語を使用するかは、それが彼らの精神的な絵をエレガントに表現できる限り、本当に重要ではありません。極端な場合、これらはUMLを使用する傾向があるか、他のシステムが他のシステムがコーディングの面倒な作業を行うことを望んでいます。

私の意見では、両方が必要です。#1は短期的なスキルを提供し、賢明に選択するとHRゲートを簡単に利用できるようになりますが、#2はあなたのすべてのキャリアを維持し、プログラマーとして定義します。

#2はガイダンスを提供し、目前の問題に対する有効な解決策に向けて思考の流れを整理しますが、1がなければ、それはアイデアのままであり、蒸気ウェア天国の縁に永遠に浮かんでいます(または、あなたがそれを見た場所によっては地獄)。

#1は、実際に動作するシステムにアイデアを実装する手段を提供しますが、2がないと、システムは癌のような形のないモンスターになりがちです。


はい、それは重要です。最初に学ぶ言語は、将来の言語をどのように見るかについての脳を形成します。

1

質問に自分で部分的に答えたと思います。

本当に重要なことは、学生にいくつかのパラダイムと接触する機会を与えることです。実際の言語は重要ではありません。

もちろん、主にほとんどの仕事の機会を与えるパラダイムを教えることが重要です(おそらく現時点ではOOP)。したがって、このパラダイムで広く使用されている言語を教えることも、これは決して使用しない可能性のあるものを学習するよりも役立つため、より良い方法です。そのため、試験で擬似コードを記述する必要もありませんでした。「固定」構文がない限り、擬似コードは問題ありません。コンセプトを伝えることができるはずです。

具体的に:

OOP:.NETまたはJava

学生に他のアプローチを認識させるための、少なくとも1つの追加のプログラミングパラダイム。

機能:Lisp?


機能的です。いいえ、LISPではありません。むしろ:haskell。
マリオトモ

1

アセンブリ言語とマイクロコード。CSの学生は、ブールステートマシンと最新の高レベルの機能/ OOPなどの間の抽象化のすべての基礎層を理解する必要があります。プログラミング言語のパラダイム。

BasicまたはLogoまたはSqueak(et.al.)、小さな子供たちにコンピューターリテラシーを教える方法を理解したい場合。

Fortran、Cobol、およびLisp。プログラミング言語の歴史、および現代の慣行が修正する実際の問題を理解したい場合。


そしてC、あなたはあなたが勉強できるすべてのオープンソースコードの90%を理解しています。
右折して

1

異なるパラダイムから3つ以上の言語を選択することはそれほど難しくなく、多くの良い答えが与えられています。しかし、言語を1つだけ選択する必要がある場合は、Scalaに行きます。これは、機能指向でありオブジェクト指向であるためです。同じ言語内でさまざまなアプローチを説明および比較できます。


1

スタック指向/連結言語を忘れないでください!彼らは本当のマインドベンダーになることができます。彼らは、小さく、理解しやすいプリミティブを使用して複雑さを構築することを強調しています。それらを使用して、とてもきれいに感じるポイントフリー(または暗黙の)コードを書くことができます。

古典的な言語はForthですが、最近の私のお気に入りFactorです。また、チェックアウトする価値があるのはJoyCatです。連結言語wikiをお見逃しなく。ハンマーでいっぱいのバッグよりも楽しい!


0

機能的なもの、HaskellまたはLispが最初の選択肢ですが、Erlangかもしれません。関数型言語は、非常に強力な方法で抽象化を構築する方法を実際に教えてくれます。


しかし、学生は1つのパラダイムに制限されるべきですか?Scalaのような機能的なOOP言語はどうですか?
アント

1
もちろんそうではありません。私は他の人がそれらのためにパイプを入れると思っていました!
ザカリーK

0

メインストリーム性の欠如にもかかわらず、D、特にバージョン2は、他の場所では簡単に学べない興味深いレッスンを提供することがわかりました。他のどの言語よりも真剣に試みて、命令型/手続き型、オブジェクト指向、関数型プログラミングを互いにうまくやり取りし、非常に低いレベルでのプログラミング(ポインター、手動メモリ管理、インラインアセンブリ言語)と同じ言語の非常に高いレベル(汎用および生成プログラミング)。

パラダイムを別々の宇宙に存在するかのように孤立して見るのではなく、木々を通して森を見ることができるので、これは価値があります。各パラダイムの長所と短所をきめ細かなレベルで確認し、それらをプログラムに組み込むことができます。低レベルのコードの観点から、パラダイムの主要な側面をライブラリに実装する方法を確認できます。標準ライブラリモジュールstd.algorithmは、重要な関数型プログラミングプリミティブを実装していますが、魔法のない単純で単純なDコードです。同様に、std.range遅延評価を実装しますが、これもかなり単純なDコードです。Dの金属に近い機能により、内部で実際に行われていることを比較的透過的にするため、各パラダイムのプリミティブに伴うコストを理解することができます。Cのように見える低レベルの何かを書いてから、同じ言語で、マジックグルーレイヤーを邪魔することなく、Cにきれいで高レベルのインターフェイスを作成することもできます。


0

擬似コード。

分野の人々は、フレームワークまたは構文固有の専門用語を使用せずに、一貫した構造化された方法でアイデアを説明できる必要があります。アルゴリズムを理解するために、角括弧と中括弧の違いを知る必要はありません。スイッチの??意味や意味を知る必要はありませんgrep

平易な言語で記述しますが、コードのように構造化およびフォーマットします。誰でも好きな言語で実装できます。

編集:この答えは、一部のプログラマーが擬似コードを書くことができないために部分的に動機付けられています。

「アルゴリズムを擬似コードで記述するだけ」

"あれは何でしょう?"

擬似コードの利点は、プログラミング以外の関係者が理解できることです。BAとユーザーがコードを校正することを推奨するわけではありませんが、プログラマ以外の人が必要なアルゴリズムを理解している場合に役立ちます。Psuedocodeは、説明の必要性をなくし、for (int i = 0; i < j; i++)基本的には定型的な専門用語を説明します。


多くのプログラミング言語は十分に強力であるため、実際のコードと疑似コードの違いはほとんどありません。実際のプログラミング言語のどの構文要素に反対しますか?
ケビンクライン

@kevin cline-私が知っている構文要素に満足しています-私反対するかもしれないことを私は知らないものです。もちろん、それらを解読することはできますが、ポイントは、擬似コードにこれらの問題がないことです(本当に擬似コードのように見えるプログラミング言語はまだ見ていません)
カークブロードハースト

0

C.

  • まず第一に、カーネルだけでなく、今でも使用されています(広く使用されています!)。現在、Cでコード化されたビジネスアプリケーションを保守しています。したがって、純粋で単純なCでも、仕事を得ることができます。大企業、業界、ほぼすべての場所(ただしWeb開発)。
  • Unix / Linux環境で作業する場合、少なくともCを少し知らないということは、買い物に行ってタグの価格を読み取れないことに少し似ています。
  • ポインター!誰もがポインタを理解する必要があります(Joel Spolskyを参照)。さらに、mallocの概念をつかめば、OOPの言語で不注意に「新しい」と入力したときにどのようなことが起こるかを正確に知ることができます。
  • ほとんどの「ポピュラーな言語」構文はCから派生しています。
  • はい、それは常に明確ではありません。はい、学ぶのは難しいです。はい、文字列は初心者にとってはやや悪夢です。しかし、プログラミングは必ずしも明確ではなく、習得するのが困難です。Cを学習した後、C ++を試してstd :: stringを発見すると、OOPの優れた点を本当に理解できます。

もちろん、古い手続き言語だけでなく、複数の言語を知っている必要があります。ただし、コンパイラを1つだけ使用して無人島に行かなければならない場合は、古き良きgccを使用します。低レベルのプログラミングについて知っていれば、高レベルのプログラミングを理解できます。私はそれが逆に真実ではないと思います。


0

一般的な問題解決スキルとプログラミング概念を習得するために適用されたプログラミング言語の一部は、LogoとKarelです。C/ C ++ / Java / Lisp / PERL / Assembly /どのようなプログラミングパラダイムよりも先に教える必要があります。

学生はプログラミングの非常に実用的な紹介を受けます。


-1

オブジェクトを持つもの。彼らがそれをよく学ぶことを確認してください。

私はいつでもC#に優れたJavaプログラマーを雇いますが、実際のコードを書いたことのない人を雇うことには多くの疑念があります。

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