web-dev-qa-db-ja.com

学部生が知っておくべきCS科目

大学では理論に興味がありませんでした。読んだことがない。どれだけ試しても、物を読むことができず、実際に何が起こっているのかわかりませんでした。たとえば、オートマトン理論に関する私のコースのように、私の教授は私にそれの数学的側面に関連する可能性のあるすべてを私に話したが、それが実際にどこで使用されるかについて一度も言及しなかった。これは単なる例です。

私はなんとか大学を卒業し、会社にインターンしました。そこでプロジェクトを行いましたが、平均を上回っていたので、彼らは私の成績について気にかけませんでした。

今、私は、CSの学生が絶対的かつ積極的に認識しなければならない科目を知ることに興味がありますか?業界に関連のあるテーマ。これは、私の自由時間があるので、彼らをよく理解するのに役立ちます。

あなたの提案は何ですか?一つのように、アルゴリズムは一つの主題です。

34
Karl

信じられないかもしれませんが、後の人生で私にとって非常に重要であることが判明したことの1つは、コンパイラの構築でした。 LexとYaccを使用した最新のnamby-pambyバージョンではなく、ダミー用です。

独自のシンボルスキャナーとパーサーをゼロから作成するREALコンパイラー構築。

これは、二度と使用しないと思ったものです。しかし、過去20年間で、そのコースは4倍以上の金の重要性を証明しています。私がこれまでに作成しなければならなかったコマンドプロセッサ、すべての着信メッセージスキャナー、すべてのユーザーディスパッチャー、すべてのスクリプトインタープリターは、そのコースの原則を使用しています。そのようにしてください、そして人生は甘く、明確でシンプルです。そして、私はそれをしていない同僚にすべての情報を与えました-彼は実際に抽象的なマシンのためにコンパイラを書かなければなりませんでした。私が追加するかもしれないものは、非常に商業的に成功しました。

いずれかの科目で大学の講師に感謝しなければならなかったとしたら、それだけです。それがなければ私は成功したでしょうが、私の解決策ははるかに醜いものでした。

(そして、誰かがジャンプして「まあ、あなたはLexとyaccを使うことができたはずだ...」と言う前に、答えはおそらく-システムに大きく依存します。場合によっては、プログラミング言語がCではありません(PL/MやAda)、一部のケースでは、プラットフォームですぐに利用できるLexまたはYaccが利用できませんでした。基本を理解しているということは、問題を解決するためにツールを曲げる方法を理解しようとするのではなく、解決策が手元にあることを意味します。)

42
quickly_now
  1. データ構造/アルゴリズム、特にグラフ。私がグラフ関連のアルゴリズムを使用して管理した実際の状況の量は、私にとって驚きでした。データ構造またはアルゴリズムが適切な場合の特性を知ることに焦点を当てます。たとえば、問題を見て、動的プログラミング/貪欲アルゴリズムを使用することを知っていることは重要であり、多くの時間を節約できます。

  2. 計算の複雑さに関する実用的な知識。基数ソートの下限とは何かを頭の上で知る必要はありませんが、特にパフォーマンスが重要なプロジェクトでは、作成したものの最悪の場合の実行時間を把握する方法が重要です。

  3. O.S.概念。メモリ管理、スケジューラーなど。作成するコードが絶えずそれと相互作用していることを考えると、すべての開発者はオペレーティングシステムについてしっかりと理解している必要があります。

  4. NetSec。開発に関する基本的なセキュリティの問題(バッファオーバーフロー、xss、SQLIなど)をしっかりと理解している開発者はほとんどいません。あなたが業界で成功したいなら、これは本当に必要です。次の大きなことを書くことができるのは素晴らしいことですが、ユーザーのデータを保護しないと、多くのユーザーが長く続くことはありません。

  5. プログラミングパラダイム。オブジェクト指向/関数型/手続き型プログラミングの特徴と違いを理解する。私が今まで持っていた最も優れた学部生クラスの1つは、fortan、scheme、prologなどの単純な20命令インタープリターを言語自体で作成することでした。公開だけでも、ソフトウェア開発の基本的な概念を理解するのに役立ちます。

37
Kurtis

卒業の要件を満たすことは、あなたができる最高のコンピュータサイエンティストになるには必ずしも十分ではありません。典型的な大学のカリキュラムについて、ここに必ず覚えておくべき上位10項目があります。

  1. 経済学の基礎- 補完および代替 のようなトピックをカバーする入門コースは、より大きな経済での作業、または単に単にそれを理解する。 Giffen Goodのコンセプトは必ずしも役立つとは限りませんが、 externalities について知ることは役立ちます。また、あなたが理解しているよりも多くの状況が双方にとって有利であるということを理解するのにも役立ちます。

  2. 証明の書き方-すべてのコンピュータサイエンス専攻は、証明の書き方を知っている必要があります。また、離散数学はバランスの取れた朝食の一部ですが、数には入れません。 [帰納法は証明技法の1つにすぎず、証明についてあまり知らなくても問題ありません。]証明を実際に書くには、代数または実際の分析のコースが必要です。代数とは、グループ理論または抽象的な代数を意味し、高校で取ったコースではありません。最大限の利益を得るには、代数と実際の分析を同じ用語で考えてください。

    証明を書くことが不可欠なのはなぜですか?プログラミングだから!最初にプログラミングの方法を学んだときのことを考えてください。タスクがifとループを必要とする場合、それらを相互に関連づけてどこに配置するかについて直感がなかったかもしれません。しかし、今では同じタスクが完全に自然に感じられるでしょう。証明を書くことは非常に似ています。あなたが学ぶ一連のトリックがあり、一度それらを学ぶと、物事はかなり異なって見えます。

  3. 書き方-業界や学界で働くかどうかにかかわらず、書面でのコミュニケーションスキルが不可欠です。別のトピックを効果的に扱うライティングコースではなく、メカニックコースを見つけることができれば最適です。つまり、多くの学校では、特別なトピックについて書くことで、ライティングコースをより関連性のある、または興味深いものにしようとしています。コースの「退屈」バージョンを試してみてください。

  4. 確率と統計情報-コースを受講することによってのみ正しく理解できることがいくつかあります。 CSの主要な要件(離散数学、単一変数と複数変数の微積分、線形代数を提供する必要があります)、代数および/または実際の分析と合わせて、統計を取得すると数学のマイナーになります。統計の学習は、他の科学者と共同でプロジェクトを進めるのに役立ちます。

  5. 現在のホットなトピック-過去数十年の間、それはデータベース、またはオブジェクト指向プログラミングであった可能性があります。今日、それはWebプログラミングまたはサービス指向アーキテクチャーかもしれません。現在の流行が何であれ、必ずそのコースを受講してください。流行が何であるかを見るためだけに。

  6. 停止の問題-ほとんどの問題は機械では解決できません。これは、私たちの文化が非常によく吸収され、もはや衝撃的な音に聞こえなくなったというかなり深い考えです。ラジオ、ゲーデル、原爆についても同様です。これらのコンセプトに再び対処できるようになったのは、ポストモダンアートと冷戦の時でした。ただし、計算可能性理論のコースを受講することで、このかなり驚くべき証明に再び敏感になる可能性があります。

  7. 純粋な関数型プログラミング-純粋な関数型プログラミングを研究するか、選択したいくつかの会社で働いていないが、それはあなたがより良いプログラマーになるのを助けます。その理由は、多くの新しい形の抽象化、そして教会の数や継続とモナドのような概念、そしてそうです、再帰を学び、これらのツールは次のJavaプログラムにも適用できるからです。

  8. PおよびNP-OK、これはすでにクリティカルパスにありますが、とにかく注意してください。 NP「非多項式」と誤って呼ばれた場合でも、誰かを修正できるようにしたいのです。

  9. 間違いなく嫌いなコースのトピック-これは、低すぎる、理論的すぎる、または非CSコースでは、不快すぎる、難しすぎる、または退屈すぎると感じます。このようなコースがあなたにとって問題であるように思われ、あなたが自分がそうする必要がないことをとても嬉しく思う理由を他の人に説明しているのに気づいたら、それはあなたがたくさん学ぶことを教えてくれるはずですコースを受講して!コースの教材は学習しないかもしれませんが、自分自身の限界について、そしておそらく自分自身に対して行う正当化について、さらに学習するでしょう。 [ヒント:通常は弱いです。]

  10. あなたがきっと気に入るでしょう、CS以外のコース-最後に、あなたはいくつかの楽しみを持つ必要があります。これは、あなたがたぶん一番手に入れられないコースですが、とにかくそれを取ってください。一度やってください。あなたがたまたまたくさんのコースを愛しているなら、それは良いことですが、このリストの残りのコースをカバーするのに邪魔にならないようにしてください。

ここでの私のアプローチは、実際に取ることができるコースに基づいて、実用的でした。そして、私は学習される可能性が高い学習目標に焦点を当ててきました。注:この回答は、私のブログ投稿 すべてのコンピューターサイエンスメジャーが学ぶ10のこと に基づいています。

21
Macneil

多くの面接を受けた会社の代表者や友人に話を聞いた後:

  • データベース
  • OOP
  • アルゴリズム
  • データ構造

"musts"になる傾向があります(または、彼らが言ったように、 "強く推奨される"コース)。

役立つ可能性のある他のコースは、コンピュータセキュリティ、アセンブリ、およびマシンアーキテクチャです。私の教授の多くは、コンパイラコースも勧めています。また、時間があれば、グラフ理論、離散数学、組合せ論などの数学のコースを強くお勧めします。ほとんどのCSコースで説明されていないクラスで多くの推論スキルを学びますが、非常に複雑なプログラムを書くときに非常に役立ちます。

お役に立てば幸いです。

8
K-RAN

それは主に学位をどのように計画するかに依存します。ほとんどのCS専攻は、何らかのソフトウェアエンジニアになってしまうようです。それを念頭に置いて、なぜより多くの人々がソフトウェア工学を専攻していないのかは本当にわかりません。特に公的機関では、十分なソフトウェアエンジニアリングプログラムが利用できないと思います。

私は埋め込まれたバックグラウンドから来ています。私が一緒に仕事をしている人は全員、EE学位またはCE学位を持っていました。これは、大学に行くときの「老人」が利用できるCEプログラムがそれほどなかったことがその理由の1つです。したがって、組み込み分野で作業したい場合は、ハードウェアのバックグラウンドが望ましいことは明らかです。

しかし、あなたが働きたい分野に関係なく、私はすべてのプログラマーがアセンブル・プログラミングのコースをとるべきだと思います。決して使用することはないかもしれませんが、関数呼び出し中にプロセッサレベルで何が起こっているか、割り込みの処理方法、メモリの構造、またはさまざまなアドレッシングモードの使用方法を正確に教えてくれます。私はこれらすべてがあなたをより良いプログラマーになると信じています。

また、明確ではない場合もあるため、特定のプラットフォームのデータ構造とアルゴリズムを検討する場合、これらのトピックはすべて重要なトピックです。

6
Pemdas

質問に答えるには2つの方法があります。両方試してみましょう。最初の方法は、潜在的なジョブマーケットの観点、コーディングスキルなどから物事を見る方法です。ここに私のリストを示します。

  1. データ構造
  2. アルゴリズム分析
  3. オブジェクト指向プログラミング
  4. C++またはJavaの特定のコース
  5. オペレーティングシステム
  6. ユーザーインターフェース設計
  7. 並列プログラミング

2番目の方法は、少し抽象的な視点から物事を見る方法であり、誰もが知っているように、少し哲学的かもしれません。以下のリストは、求人市場が要求する最もホットなスキルを備えていない可能性がありますが、これらのコースを終える頃には、ソフトウェア開発の技術をより深く理解していることでしょう。

  1. 有限言語とオートマトン理論
  2. コンパイラの構築
  3. グラフ理論
  4. 人工知能
5
Fanatic23

ソフトウェアエンジニアリングやデザインプラクティスもリストに追加しますが、それらのコンテンツは通常、業界の学生によって取り上げられます。

また、私の意見では(ただし、多くの経験に裏付けされていません)、企業はデータベースなどのコースで教えられる理論的なことのほとんどを本当に望んでおらず、人々に理解してもらいたいと思っています使用できるこれらの事。

編集:反対投票のため、私の答えを説明したいと思います。私はコンピューターサイエンスの最終学年です。私の経験は、インターンシップと、業界の主要企業との面接に基づいています。私の経験では、面接や仕事で複雑なアルゴリズムを使用したり、非常に複雑なデータ構造をコーディングしたりする必要はほとんどありません。

データベースの作成と使用、ソース管理の使用、適切なデバッグ方法の理解、デザインパターンの使用方法の理解などができる場合にさらに役立ちます。ただし、前述のように、これらのスキルは通常、業界で採用されており、コースでは取り上げられていません。ソフトウェアエンジニアリング/デザインプラクティスでは、通常、中規模プロジェクトを構築する必要があり、これらのすべてのスキルを学ぶのに非常に役立ちます。

2
apoorv020

どちらの方向に進むかによって、多くの重要なコースがあります。ただし、まったくプログラムできると仮定すると、最も重要なコースは次のとおりです。

  • データ構造とアルゴリズム

    コンピューティングにおける事実上すべてが、アルゴリズムを使用したデータの処理に戻ります。配列とハッシュテーブルは特に一般的に使用されている中で最も有用なデータ構造であるため、特に注意してください。同様に重要です。さらに、アルゴリズムを理解することは、ひどくないコードを作成するために不可欠です。 (それ以外の場合は、O()O( ログ)1つは行います。)CSの学位に必須 DS + Aコースがない場合、CSではありません。またはソフトウェア工学。それともプログラミングだけでも。

それとは別に、私が長年にわたって複数の分野で最も有用であると私が見つけたコースは、

  • 並行性

    同時実行には多くの側面がありますが、共有メモリとメッセージパッシングの違いを理解することを期待しています。また、ロック戦略(ミューテックス、セマフォなど)とトランザクションを強力にカバーしたいと考えています。

    もちろん、これは並列化を理解する上で不可欠ですが、分散されたもの(たとえば、インターネットに公開されるサービスを作成する場合)にも重要ですシングルスレッドの場合でもクライアントはとにかく非同期になるため)。ゲーム(通常はマルチスレッド)の作成や組み込みデバイスの操作にも役立つことを理解しています。

それとは別に、彼らができるだけ多くの異なるアイデアに触れられることは、ほとんどの学部生にとって最大の利益になると思います。たくさんのプログラミング言語とパラダイム。アプリケーションのさまざまな分野がたくさんあります。妥当な量の数学(これも頻繁に役立つため)と、ヒューマンファクターや心理学への露出(ユーザーとやり取りするソフトウェアはすべて人を扱っているため)。結局のところ、将来何をするつもりなのか正確にはわからないので、柔軟性を計画することは優れたライフ戦略です。

2
Donal Fellows

私が毎日使う大学で学んだこと:

  • オブジェクト指向の設計方法論
  • デザインパターン
  • 正規表現
  • 基本的なアルゴリズムと分析
  • データ構造

データベースコースを受講したいです。 (私は卒業してから十分に習得しましたが、もっと知りたいと思います。)バージョン管理についても教えてもらいたいです。バージョン管理は至る所にあり、非常に便利で、学校のカリキュラムでは完全に無視されていました。

私はいくつかの数学のコースを受講する必要がありました。私は卒業してから微積分を使っていません。統計コースを受講したいのですが。 (また、卒業してから十分に乗り越えてきましたが、もっと知りたいです。)

CS部門を超えて、ライティングコースを受講してください。書面での優れたコミュニケーション能力は、成功に不可欠です。

2
pwc

私が大学にいたとき、実生活での用途を見ることができないかなりの数のトピックがあり、時にはその直感が正しいことが証明されました(フォーマルメソッドは、ほとんどの場合、些細な問題では実際にのみ実用的です)。完全に間違っている(Big-O表記は非常に便利です)ので、私は全体として、若い自分は部分的に正しかったと思います。

@ K-Ranが上記で推奨しているものに加えて、現実の世界に向けて準備をしたい場合は、Code Completeを読んで、それを基礎として、難しいと思うトピックをより深く研究することをお勧めしますまたはあなたが十分にカバーしていると感じていません。

1
glenatron

プログラミングの仕事のために定期的に候補者に面接する人、および業界で12年以上働いた後、かなり熟練していると感じている人として、私は以下を提案します

  • データベース設計とSQL:単純なSQLを知らないプログラマーが驚くほど多く、優れたSQLスキルを持つプログラマーは非常に貴重です。優れたデータベースを設計できることは、データベース構造が設定されている企業では役に立たない可能性があります。新興企業や変化を遂げる企業にとって、それは必須です!
  • デザインパターン。彼らは単にあなたが良いデザインについてより良い決断をするのを助けるでしょう
  • OOP:これは通常、ほとんどのコースの前提条件ですが、役に立ちます。
  • アルゴリズム:再帰とは何かを知っている人はほとんどいないため、複雑なコーディングを大幅に節約できる時期を理解することは言うまでもありません
  • データ構造:最新の言語のほとんどは、これを処理しますが、それらを理解することが、優れた設計の鍵となります。

次に、いくつかの追加のカリキュラムの仕事を読んでください:

  • 認定書。彼らはしばしば、カバーの下にある構文と演算子のタイプを教えてくれます。日常的に行われている「機能するから」ではなく、なぜ何かをしているのかを知ることの方がはるかに重要です。
1
Codemwnci

IT'S DEPENDS、この質問に対する1つの良い答えはありません。

プログラマーは、コンピューターソフトウェアを書く人を特定する一般的な世界です。

今、あらゆる種類のソフトウェアがあります。たとえば、一般化のソースとしてウィキペディアを使用すると、私たちは満たすことができます great generalization

  • システムプログラミング
  • プログラミングソフトウェア
  • アプリケーションソフトウェア

最初のフィールドシステムプログラミングで、デバイスドライバー、オペレーティングシステム、サーバーを開発します。たとえば、オペレーティングシステムのコースをたどることができます。

プログラミングソフトウェアはどうですか?ここでウィキペディアが書いたように、コンパイラー、デバッガー、インタープリター、リンカー、テキストエディターをコーディングできるため、自動化理論、言語理論、言語、コンパイラーのコースが役立つ場合があります。

どんな種類のアプリケーションソフトウェアについても話せません。
-ビデオゲーム:代数、物理学、オブジェクト指向コース?
-数学ソフトウェア:数学コース?
-画像編集:数学、物理学、アルゴリズムコース?
-産業オートメーション:数学、物理学、アルゴリズム、ロボットコース?
-医療ソフトウェア:生物学、医療、その他のコース
-ここにはたくさんのものがあり、ここにはたくさんのコースがあります。

あなたが見ることができるようにあなたが従うことができる多くのコースがあり、あなたの仕事のために役立つでしょう。

私の経験では、私はsecurity(セキュリティコースをたどりますか?)フィールドのシステムソフトウェアエンジニアリングおよびアプリケーションソフトウェアです。プログラミングの非常に経験があるので、アルゴリズムと分散システムに興味を抱き始めています。また、私が書いた汎用アプリケーション(スニファー、ネットワーク侵入検知システム、プロトコルディセクタとディテクタなど)の単純さに不快に感じています。

理論的なコンピューターサイエンスでよく学んだように!このコースを受講しましたか? :P

たとえば、すべてのコンピュータ言語を一連の計算可能な数学関数に適合させることができることを学びました。たとえば、経験が私の同じ道をたどると、すぐにこの微積分のセットに不快になり、私のようにどのように発展しているかを見ることができますソフトウェアはそれほど魅力的で素晴らしいものではありません。同じデザインパターンが再び復活し(デザインパターンのコースをたどっていますか?)、たとえば、WHYへの関心が高まり、言語を数学関数に変換して、コンピュータ言語はそれほど複雑ではないことを学んでください!たとえば、すぐに人と心理学に驚かされ、それについてもっと興味を持ち、優れたプロジェクトマネージャーになることができます。ソフトウェアのライフサイクルに関するコースに従っていますか?

さて、あなたのCSキャリアで必須のコースは何ですか?

すべての分野、特に理論分野でできるだけ多くのことを学ぶことをお勧めします。一般的な仕事の分野では、身の回りの少しの複雑さにすぐに飽きてしまい、フルタイムの労働者になると、学ぶ時間がほとんどなくなるためです。物事が実際にどのように機能するか、そして理論的な知識が豊富な人々が物事を機能するように予測し、食事を家で食べるようにコード化する可能性をあなたに与えてくれるより多くの時間。

コンピュータサイエンスには現実の間違った感覚があります。たとえば、コンピュータサイエンティストは、ソフトウェア開発者から遠く離れていることがあります。

ウィキペディアの説明をご覧ください。

人生を楽しんでください:)

私の2セント。

本当に下手な英語でごめんなさい。

1
boos

私はあなたが次のことを勉強すべきだと思います:

オペレーティングシステム:-プログラマーとして動作する必要はないかもしれませんが、オペレーティングシステムがどのように動作するかを知っておく価値があり、CSの卒業生に期待されています。どんな良い本でも助けになります。

OOP:-これはパンとバターです。必見です。質問したい場合の本:最初の本は:-頭からOOADにする必要があります。その後、Grady BoochとIvar Jacobsonの本に行くことができます。

データ構造とアルゴリズム:-論理的思考と考え方を発達させることは非常に重要です。

私にはこれで十分です。遅すぎることはない。 :)

1
Abhi

私はCSを卒業したのではなく、電子工学を専攻していました(ビジネスで未成年者を出していた)ので、少し異なる視点からこれに来ました。

それに基づいて、私はあなたが(必須を理解していること)のリストは比較的短いと思います。

私が便利だと思ったものをピックアップしたと思います:

  • RDBMSの設計-RDBMSはほとんどのシステムとサイトの背後にあり、少なくとも何が起こっているかの基本を理解する必要があります(私は仕事でこれを学びました)。
  • 基本的なUIデザイン-私が一緒に働いたすべての最高のプログラマーは、地獄ほど醜くはない使いやすいアプリケーションを作成できました。 1つを除いて、彼はルールを証明する例外です。
  • いくつかの基本的なプログラミング-そして私は基本を意味します。 C(画像処理と組み込みシステム用)、アセンブリ言語(コースを修了してから数週間以内に忘れてしまいました)、Pascal(基本的なコンピューティングコースはすべてのエンジニアの標準でした)を学びました。面接すると、CSの卒業生のうち、商業組織が有用だと考える方法で実際にプログラミングできる人がほとんどいないので、あまり期待していませんが、基本を知っていると思います。
  • ロジック-私はデジタルエレクトロニクスで、数学者は理論で、CSの卒業生はプログラミングでそれを学びましたが、あなたがそれを学んだとしても、多くのことを理解する必要があります。
  • コミュニケーションスキル-私は大学で実際の学位、プレゼンテーションスキル、アサーティブネス以外のコースをいくつか行いました。常識はたくさんありますが、賢明なことを何度か言われることは決して害にはなりません。
  • ビジネスと会計の基礎。一部のプログラマーは重要ではないように振る舞いますが、私の頭では会社で働く誰にとっても重要です-これがゲームのしくみであり、あなたの人生をコントロールすることになるので、少なくとも基本的なことを知りたくないのです。どのように、そしてなぜ物事が起こるのですか?

そして、プロジェクト管理について学ぶ機会があったとしても、それは実際には害にはなりませんが、それは多くの場合、大学でかなりひどく教えられており、プロジェクトに取り組むだけで仕事について少し学ぶことになります。

1
Jon Hopkins

CSの学生が流暢に話すべき一番のことは、英語です。

話されている英語と書かれた英語の両方を理解しないと、永遠に不利な状況に陥ります。

Stackサイトに寄せられる無数の質問をご覧ください。それらの多くが解読するのは難しいです。 l33tとテキストメッセージの組み合わせを使用している人もいます(正しい用語はわかりません)。他の人は声明を出し、動詞や形容詞のような重要な小さな考えを欠きながら疑問符を付けるだけです。

コミュニケーションが取れないと、他の人が言っていることをあまり理解できなくなります。

それ以外はすべて詳細です。コミュニケーションがとれ、少なくとも平均的な知性があり、読んだ内容を理解できれば、あなたもキャリアプログラミングを成功させることができます。

1
NotMe

基本的な人事/心理学コースもいくつかリストに追加します。

これは奇妙な追加のように思えるかもしれませんが、専門的に仕事の一部は、自分を売り、交渉する方法を学ぶことです。人事ドローンの動機についての確かな知識なしに最初の「本当の」インタビューに足を踏み入れることは災害のレシピであり、学生が低給の給料に夢中になってしまう可能性があります。

自分を守るために敵を知ってください。

0
Peter Bernier