プログラミング言語のどの言語(またはパラダイムのようなクラス)に加えて、そのクラスの推奨言語)は、コンピュータサイエンスのすべての学生があなたに応じて大学で教える必要がありますか?あなたの答えをやる気にさせる;なぜその言語?それからどのような用途がありますか?それはどのような概念を教えますか(言語Xよりも優れています)?
注/明確化:この質問は、純粋なコンピュータサイエンスではなく、ソフトウェアエンジニアリングに重点を置いたコンピュータサイエンスに関するものです。それはまだコンピュータサイエンス教育であり、焦点はソフトウェア工学教育ではありません。
リストをあげます。
学生は少なくともallこれらのうちparadigmsにさらされる必要があります。 1つまたは2つではありません。
多くの人がPythonを手続き型スタイル、OOPスタイル、そしておそらく他のスタイルをカバーするように提案すると思いますが、私はPythonに関する十分な個人的な経験がありません自信を持ってお勧めできます。
個人的には、関数型言語が以前ほど主に教えられていないのは少し悲しいと思います。少なくともcomp sciの学生は、手続き型、オブジェクト指向型、関数型、動的のすべての主要パラダイムの言語に触れる必要があると思います。
バランスのとれたCSの学生には、4つのプログラミング言語タイプのそれぞれで言語を教える必要があると思います。
Functional-LISP/Haskell/PostScript。私はHaskellについてはあまり経験がありませんが、それについて絶賛している他のプログラマーの話を聞いています。関数型プログラミングの構成を理解し、それらが多くの状況で有用である理由を理解することは、プログラマーが他の言語でのアルゴリズムの編成にも上手になるのに役立ちます。
Object-Oriented-選択してください。 C#/ Java/Python/Ruby/yadda yadda yadda。このタイプは、それが現代のビジネスが望んでいるものだからといって教える必要があります。
命令型-C/Fortran/Pascal。最近はあまり一般的ではありませんが、実用的/歴史的な観点から学ぶ必要があります。彼らが採用する方法は、すべての言語ですべてが指示に要約されるため、依然として実用性があります。命令型言語は、リストの作成と指示に従うのが非常に得意です。
論理-ProLog。これらの言語の実用的な使用法を見つけたことはありませんが、論理言語の背後にあるいくつかの概念を、よりオブジェクト指向の言語でメソッドを記述する方法を理解しようとするときに便利だと感じました。大学時代は論理的な言語に長く集中することができなかったので、集中力を高めることでそれなりの効果があったと思います。
卒業するすべてのCS専攻が知っておくべき第1の言語は、優れた就職先を獲得する可能性を最大化する言語です。それは時間とともに変化し、素晴らしい仕事の個人の定義に基づいて変化し、地理的な地域によって変化します。
とりあえず、私はEnglishがすべてのCSメジャーが知っておくべき1番目の言語であると言います(これはもちろん、 、地域によって異なります。)
CSの学生の場合、議論されているCSの概念に密接にマッピングされているプログラミング言語を探します。私はお勧めします:
リストはこのように続くかもしれませんが、基本的な考え方はかなり単純です:概念を教えたい方法に最も適したプログラミング言語を生徒に教える。
時間とともに変化すると思いますが、理想的には、3つの異なる視点からの3つの言語です。私の日は、手続き型、オブジェクト指向、関数型でした-Pascal、C++、およびLISP。私は特にこれらの3つでそれほど販売されていません。しかし、私がインタビューするとき、私は探します:
別の取引として、CSプログラムでは、市場で著名な言語について学生をトレーニングする必要があると思います。いつでも、2〜3の言語が大多数の仕事にとって非常に卓越していると思います。私は学校がそれらの言語の3つのうち2つを学習する機会を提供することは学生に負っていると思います。
裏で何が起こっているのか、どんなプログラミング言語を使っているのかを知るために。デッドコードのような基本的な概念や、(良い)コンパイラーができるさまざまなタイプの最適化を把握するのに役立ちます。
言語は人々が信じているほど重要ではないと思います。
はい、プログラミング方法などを知る必要がありますが、多くの優れたプログラマーは、開発の際に役立つ実際の経験を利用して独学しています。
学生は、本のメソッドだけでなく、現実の世界でプログラミングする方法についてのいくつかのレッスンを行うことができます。これにより、彼らはより「丸みを帯びた」ものになり、私の選択肢ではより良い開発者/卒業生になります。
大学を出て仕事を始めた後、プログラミングとソフトウェア開発についてもっと学びました!
LISP(OOPにCLOSを使用)およびHaskell。この質問は学生に限定されません。新しい豪華なプログラミング言語は、この2つの機能の多くを借用しました(コピーしたか、盗んだか?...いいえ、悪くありません)。将来に備えることができます。関数型プログラミング(スタイル)は今日より重要であり、C#(LINQ)やC++(lambda)などの命令型プログラミング言語で導入されています。一部の学生がJavaのみを学習しているのは残念です。
本当に問題になりますか?
通常、この質問の背後にあるかゆみは、「最も有利な/興味深い/やりがいのある/簡単な仕事ができるようになる、履歴書にどんな流行語を付ければよいか」です。ほとんどの履歴書は人事担当者が最初に審査するため、質問にはメリットがありますが、探している内容を理解できません。しかし、ゲートを通過すると商品を配達する必要があるので、それは非常に浅いです。
それはあなたがあなたを良いか悪いプログラマーにするあなたの知っている言語ではなく、それをどのように使うことができるかです。このため、基本的にプログラマーには2つのカテゴリーがあります。
核となる言語を学ぶことに集中するもの。最も重要なのは、言語とその使用方法です。極端な場合、コードの細かい点すべてを非常に最適化する傾向があり、可能であれば単にあいまいな機能を使用することがよくあります。
それから、テクニックとパラダイムについて学びたいものがあります。彼らの精神的イメージを上品に表現できる限り、彼らが使用する言語は本当に重要ではありません。極端な場合、これらはUMLまたは他のそのようなシステムを使用する傾向があり、他の人がそれをコーディングするという面倒な作業を行うことを期待しています。
私の意見では、両方が必要です。 #1は短期的なスキルを提供し、賢く選択するとHRゲートを通過しやすくなりますが、#2はあなたのキャリア全体にとどまり、プログラマーとして定義されます。
#2は、目前の問題の解決策に向けたガイダンスを提供し、一連の思考を編成しますが、1がなければ、いつでもベーパーウェアの天国(またはどこから見ているかによって地獄)に浮かんでいます。
#1は、実際のシステムにアイデアを実装する手段を提供しますが、2を使用しない場合、システムは癌の形のないモンスターに向かう傾向があります。
アセンブリ言語とマイクロコード。 CSの学生は、ブールステートマシンと最新の高レベルの機能/ OOPなどの間の抽象化のすべての基礎レイヤーを理解する必要があります。プログラミング言語のパラダイム。
ベーシック、ロゴ、またはスクイーク(et.al.)(小さな子供にコンピュータリテラシーを教える方法を理解したい場合)。
Fortran、Cobol、LISP(プログラミング言語の歴史を理解したい場合、および現代の慣習で修正されている実際の問題は何か)。
異なるパラダイムから3つ以上の言語を選択することはそれほど難しくありません。多くの良い答えが与えられています。しかし、1つの言語のみを選択する必要がある場合は、Scalaを使用します。それは、機能とオブジェクト指向の両方であるためです。同じ言語で異なるアプローチを説明および比較できます。
自分で質問に部分的に回答したと思います。
実際に重要なのは、学生にいくつかのパラダイムに触れる機会を与えることです。実際の言語は重要ではありません。
もちろん、ほとんどの仕事の機会を与えるようなパラダイムを主に教えることが重要です(おそらくOOP現在のところ)。したがって、このパラダイムで広く使用されている言語を教えることは、使用しない可能性のあることを学ぶよりも便利です。したがって、試験で疑似コードを書く必要もありませんでした。「固定」構文がない限り、疑似コードは問題ありません。概念をもたらすことができるはずです。全体。
具体的には:
OOP:.NETまたはJava
学生に他のアプローチを認識させるための、少なくとも1つの追加のプログラミングパラダイム。
機能的:Lisp?
主流性の欠如にもかかわらず、D、特にバージョン2は、他の場所では簡単に学ぶことができないいくつかの興味深い教訓を提供することがわかりました。命令型/手続き型、オブジェクト指向、関数型プログラミングを相互にナイスでプレイし、非常に低いレベル(ポインタ、手動メモリ管理、インライン)でプログラミングできるようにするために、他のどの言語よりも深刻な試みをします。アセンブリ言語)と、同じ言語での非常に高いレベル(ジェネリックおよびジェネレーティブプログラミング)。
パラダイムを別々の宇宙に存在するかのように孤立して見るのではなく、木々を通して森を見ることができるので、これは価値があります。各パラダイムの長所と短所をプログラムに組み込むと、細かいレベルで確認できます。低水準コードの観点から、パラダイムの主要な側面をライブラリにどのように実装できるかがわかります。標準ライブラリモジュール std.algorithm は、重要な関数型プログラミングプリミティブを実装しますが、魔法のない単純な単純なDコードです。同様に、 std.range は遅延評価を実装しますが、これもかなり単純なDコードです。 Dの金属に近い機能により、内部で実際に行われていることが比較的透過的になるため、各パラダイムのプリミティブに関連するコストを理解できます。 Cのような低レベルのものを記述してから、魔法の接着層を邪魔することなく、同じ言語でかなり高レベルのインターフェースを作成することもできます。
疑似コード。
フィールドの人々は、フレームワークまたは構文固有の専門用語を使わずに、首尾一貫した構造化された方法で自分のアイデアを説明できる必要があります。アルゴリズムを理解するために、角括弧と中括弧の違いを知っている必要はありません。 _??
_の意味やgrep
スイッチの意味を知る必要はありません。
わかりやすい言語で記述しますが、コードのように構造化してフォーマットします。誰でも好きな言語で実装できます。
編集:この答えは、一部のプログラマーが疑似コードを書き込めないことに動機があります。
「アルゴリズムを疑似コードで書くだけ」
"あれは何でしょう?"
疑似コードの利点は、非プログラミング関係者がそれを理解できることです。 BAやユーザーにコードの証明を依頼することはお勧めしませんが、プログラマー以外の人が必要なアルゴリズムを理解している場合に役立ちます。 Psuedocodeは、for (int i = 0; i < j; i++)
および基本的にボイラープレートの専門用語について説明する必要をなくします。
一般的な問題解決スキルを習得するために適用されたプログラミング言語の一部、およびプログラミングの概念はLogoとKarelであり、C/C++/Java/LISP/Perl/Assembly/whateverプログラミングパラダイムの前に教える必要があります。
学生はプログラミングの非常に実用的な入門を取得します。
C.
もちろん、古い手続き型言語だけでなく、複数の言語を知っている必要があります。しかし、コンパイラが1つしかない無人島に行かなければならない場合は、古き良きgccを使用します。低レベルのプログラミングについて知っていれば、高レベルのプログラミングを理解できます。逆の場合はそうではないと思います。
HaskellかLISPのどちらかが機能的であることが私の最初の選択ですが、おそらくErlangでしょう。関数型言語は、非常に強力な方法で抽象化を構築する方法を本当に教えてくれます。