学部生が知っていなければならないCS科目[非公開]


34

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

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

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

あなたの提案は何ですか?1つと同様に、アルゴリズムは1つの主題です。


3
正規表現はオートマトン理論に基づいており、何かを解析する必要がある場合に役立ちます。学校で学んだことは、これまでの仕事とは無関係であることが証明されましたが、少なくとも学んだことと同じくらい自分が取り組んできたことについて語っています。私が学んだことは、あらゆる状況下でこの分野で役に立たないことはありません。
デビッドソーンリー

2
私はあなたのタイプを扱うのが嫌いです... jk(一種)。もし私があなただったら、私はまずあなたが学校から知っておくべきことをレビューするために時間をかけるだろう-そうすればあなたはあなたの次のインタビューで馬鹿のように見えないだろう。その後、現実の世界で使用できるように見える合理的な量のデータ構造とアルゴリズムを学びます。どこに行きたいのかを理解する必要があります。ゲーム開発者の場合、おそらく線形代数、3Dグラフィックス、計算ジオメトリが必要です。一般に、データstr、alg、データベース、os、コンパイラなどを最低限レビューし、学習を続ける必要があります。
ジョブ

算術演算の特定のアプリケーションに名前を付けるのが難しいのと同じ方法で、オートマトン理論の特定のアプリケーションに名前を付けるのは困難です。誇張されているかもしれませんが、それほどではありません。状態図はしばしば有用であり、コードでそれらを操作することは多くの目的に役立ちます。ディシジョンツリー(ダイグラフに最小化)は比較的最近の例であり、コンテナへのキーとして状態モデル(標準形式)を使用する必要さえありました。アプリケーション内にアプリケーションが表示されない場合は、インダイレクションの層を追加するという観点から考えてください-コード生成。
Steve314

1
以下にCSの優れた回答がたくさんありますが、BSCSを入手してから15年で見た最も有用なものがいくつか欠けているように質問を制限すると、人々を差別化できます業界で成功しているのは、小グループでのコミュニケーションとチームワークのスキルです。愚かなことに、スピーチ/言語/劇場部門に向かい、「小グループコミュニケーション」や「チーム/グループリーダーシップ/管理」などのクラスを受講します。管理を行う予定がなくても、そこで得たスキルにより、より優れたエンジニアおよびチームメンバーになります。
キャベツ

回答:


41

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

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

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

いずれかの科目で大学の講座の講師に感謝しなければならないとしたら、これで終わりです。それがなければ私はうまくいきましたが、私の解決策ははるかにいものでした。

(そして、誰かが飛び上がって「まあ、lexとyaccを使えたかもしれない...」と言う前に、答えはおそらく-システムに大きく依存している。ある場合には、プログラミング言語はCではなかった(PL / MやAda)、プラットフォームで利用できるLexやYaccが利用できない場合がありました。基本を知ることは、問題に合うようにツールを曲げる方法を見つけようとして手を絞るのではなく、解決策が手元にあることを意味します。


6
+1 Compilersは、uniで私のお気に入りのコースの1つであり、常に役立ちます。私はめったにlex / yacc / bisonを使用しませんでした。基本ははるかに具体的な使用です。
11

別の理由ではありますが、完全に同意します。コードジェネレーターの記述方法を知ることは、LexとYaccを使用していても、オブジェクト指向プログラミングに初めて没頭したことでした。
ピーターターナー

コードジェネレーターをプレーンCまたはその他の非OO言語で作成できます(また、その方法を知っている必要があります)。次に、非常に大きな手続き型コードを記述し、パーサー/スキャナー/コード生成を賢明でわかりやすいフェーズに分割することのレッスン。
すぐに

+1コンパイラには非常に多くのパターンと原則が組み込まれているため、設計とコードを実行した後、まったく異なる観点から設計とコードを確認できます。
アンドリューTフィンネル

2
「これは、二度と使用しないと思っていたものです。」私はすべての時間のためのドルを持っていた場合、私が若かったとき、私は....自分自身にそれを言った
ニックSpreitzer

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

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

  3. OSの概念。メモリ管理、スケジューラなど。すべての開発者は、作成するコードが常に対話していることを考えると、実際にオペレーティングシステムをしっかりと理解する必要があります。

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

  5. プログラミングパラダイム。オブジェクト指向/関数型/手続き型プログラミングの特性と違いを理解します。私がこれまでに経験した中で最高の学部クラスの1つは、言語自体でフォルタン、スキーム、プロローグなどの簡単な20の命令インタープリターを書くことでした。露出自体は、ソフトウェア開発の基本概念を理解するのに本当に役立ちます。


1
+1リスト全体が非常に必要です(4)。特に、現代の分散時代では非常に重要です。
11

1
データ構造/グラフで+1。ハッシュテーブルを正しく使用する方法を知らないプログラマーの数や、場合によっては単純な配列ではなくリンクリストを使用する理由は、私を毎日驚かせています。
マチャド

プログラミングパラダイムの場合は+1。異なるタイプの言語間のコントラストをよく理解することは非常に役立ちます。
apoorv020

19

卒業要件を満たすことは、あなたができる最高のコンピューター科学者になるには必ずしも十分ではありません。典型的な大学のカリキュラムの場合、必ず学ぶべき上位10項目を以下に示します。

  1. 経済学の基礎 - 補完と代替のようトピックをカバーする入門コースは、より大きな経済で働くか、単にそれを理解するために不可欠です。Giffen Goodの概念は必ずしも役立つとは限りませんが、外部性について知ることは役立ちます。また、あなたが気付いたよりも多くの状況が双方にとって好都合であることを理解するのに役立つかもしれません。

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

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

  3. 執筆方法 -業界で仕事をする場合でも、学界で仕事をする場合でも、書面によるコミュニケーション能力が不可欠です。異なるトピックに関する効果的なライティングコースではなく、メカニックコースを見つけることができれば最適です。つまり、多くの学校は、ライティングコースを特別なトピックに関するものにすることで、ライティングコースの関連性を高めたり、興味深いものにしようとするでしょう。コースの「退屈な」バージョンを探してみてください。

  4. 確率と統計 -コースを受講することによってのみ適切に選択できるものがいくつかあります。CSの主要な要件(離散数学、単一変数および複数変数の計算、線形代数を提供する必要があります)および代数および/または実際の分析と一緒に、統計を選択すると数学のマイナーが得られます。統計を学習することで、他の科学者と彼らのプロジェクトで協力することができます。

  5. 現在のホットトピック -過去数十年間、データベース、またはオブジェクト指向プログラミングでした。今日では、Webプログラミングやサービス指向のアーキテクチャが考えられます。現在の流行が何であれ、それでコースを取るようにしてください。流行が何であるかを見るためだけに。

  6. 停止する問題 -ほとんどの問題はマシンでは解決できません。これは、私たちの文化が非常によく吸収されているので、もはや衝撃的ではないというかなり深い考えです。同じことがラジオ、ゴーデル、原子爆弾にも当てはまります。これらの概念に再び対処できるようになったのは、ポストモダンアートと冷戦まででした。ただし、計算可能性理論のコースを受講すると、この非常に驚くべき証拠に再び感心することができます。

  7. 純粋な関数型プログラミング -純粋な関数型プログラミングを研究するか、いくつかの会社で仕事をしない限り、純粋な関数型プログラミングにはならないでしょう。その理由は、多くの新しい抽象化の形態、教会番号、継続、モナド、そしてはい、再帰などの概念を学習し、これらのツールを次のJavaプログラムにも適用できるからです。

  8. PとNP -OK、これは既にクリティカルパスにありますが、とにかく注意してください。NPを「非多項式」と誤って呼び出したときに、誰かを修正できることを確認する必要があります。

  9. あなたが嫌い​​だと確信しているコースのトピック -これは、低すぎるレベル、理論的すぎると思うCSコース、またはあまりにも好ましくない、難しすぎる、または退屈すぎると感じる非CSコースである可能性があります。このようなコースがあなたにとって問題であると思われ、あなたがあなたがなぜあなたがそれほど取る必要がないのかを他の人に説明していることに気づいた場合、それはあなたが多くを学ぶことをあなたに告げるべきですコースを受講して!おそらくあなたはコースの教材を学ぶことはないでしょうが、あなた自身の限界について、そしておそらくあなたがあなた自身に対して行う正当性についてもっと学ぶでしょう。[ヒント:通常は弱い。]

  10. あなたが愛するはずの非CSコース -最後に、あなたはいくつかの楽しみを持っている必要があります。これはおそらくあなたが最も得にくいコースですが、とにかくそれを取ります。一度やってください。あなたがたまたま多くのコースを愛しているなら、あなたにとっては良いことですが、それがこのリストの残りのコースをカバーするのを妨げないようにしてください。

ここでの私のアプローチは、実際に受講できるコースに基づいて実用的です。そして、学習される可能性が高い学習目標に焦点を当ててきました。注:この回答は、「すべてのコンピューターサイエンス専攻が学ぶべき10の事柄」に関する私のブログ投稿から引用したものです。


downvoteの説明が役立ちます。おそらく私は私の答えを変えることができ、それからあなたはあなたの心を変えることができます。
マクニール

教授、私はあなたの答えに反対票を投じることはしませんが、私が問題とすることは一つあります。プルーフライティング:今日まで、数字が奇数か偶数かを証明するように頼まない限り、私はまだディスクリートプルーフを書くことができません。私はこれと業界の関係を見ることはできません。「問題解決の側面」が欠けているのかもしれません。数学的帰納法やポンピング補題に脳を巻き付けることはできませんでした。私はそれが私を遅くするとは思わない。
ブライアンハリントン

証明を書くことは、プログラムを書くことに似ています。たとえば、a * 0 = 0であることを証明する方法を学ぶことは、数学のFizzBu​​zzのようなものです(まあ、少し難しいかもしれません)。最初は恐ろしいように思えますが、すぐに、プログラミングの学習時に行ったように、小さなトリックを拾います。証明は、再帰的かつ構造的に考えるのに役立つさまざまな構造を持つことができます。私が言ったように、個別の数学のコースは、実際の証明を学ぶためにそれをカットしません。そのためには、グループ理論または実際の分析が必要です。
マクニール

賛辞の知識は確かに有用ですが、補数の知識は経済学により関連していると思います。
ijw

1
@ijw:CS学生の経済学について、Joelには読む価値のある良い議論があります:joelonsoftware.com/articles/CollegeAdvice.html
マクニール

8

多くのインタビューを受けた会社の代表者や友人と話をした後:

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

新規採用者(または彼らが言ったように、「強く推奨される」コース)にとって「ムスト」になる傾向があります。

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

お役に立てば幸いです!


1
OOPとデータ構造に同意します。
apoorv020

4
基本的なデータ構造... sooooooooooo重要。OOPよりも重要だと思います。情報を保存および整理する方法について考えることができる必要があります。また、組み込みシステムでデータ構造のメモリ内レイアウトが生死に関わるものである場合。
すぐに

3
数学クラスの場合は+1。また、大規模な問題/システムを追跡する方法を学ぶのにも役立ちます。
マイケルK

1
ネットワーキングも行うには良い方法です。
Keyo

おっと?あなたはOOPなしでHaskellまたはCでプログラムできます...私はそれが広く使われていることをあなたに与えますが、私はそれが基本だとは思いません。一方、さまざまなパラダイムにさらされることは非常に便利なようです。
マチューM.

6

それはあなたが学位で何をするかによります。ほとんどのCS専攻は最終的に何らかのソフトウェアエンジニアになります。それを念頭に置いて、なぜソフトウェア工学を専攻しないだけの人が増えているのか、私には本当にわかりません。特に公的機関で利用可能なソフトウェアエンジニアリングプログラムが十分にないと思われます。

埋め込まれたバックグラウンドから来ました。私が一緒に仕事をしているすべての人は、EE学位またはCE学位を持っています。それは、「おじいさん」が大学に通うとき、それほど多くのCEプログラムがなかったからです。したがって、組み込み分野で作業する場合は、ハードウェアのバックグラウンドが望ましいことは明らかです。

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

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


+1は、コンピューターサイエンスの学位を取得すると、幅広い科目/技術の経験が得られるためです。ソフトウェア設計コースに注意してください。
ミスターアント

+1アセンブリの場合、スタックの一番下で何が起こっているかを真に理解することが常に賢明です。誰もがハードウェアを知っていればいいのですが、多くの人にとっては一歩先を行くでしょう。
11

5

質問に答えるには2つの方法があります。両方試してみましょう。最初の方法は、潜在的な雇用市場の観点、コーディングスキルなどから物事を調べることです。そこで、ここに私のリストを示します。

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

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

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

必要だと思われる一連のコースをリストするだけでなく、リストを決定した理由と経験を提供してください。

2

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

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

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

データベースの作成と使用、ソース管理の使用、適切なデバッグ方法の理解、デザインパターンの使用方法の理解などが可能な場合は、より便利です。ソフトウェアエンジニアリング/設計プラクティスでは、通常、中規模のプロジェクトを構築する必要があり、これらすべてのスキルを習得するのに非常に役立ちます。


あなたの経験と、なぜこれらのコースを受講する必要があるのか​​について詳しく説明してください。

@マーク:下票の根拠を説明できますか?
apoorv020

@ apoorv020 では、ソフトウェアエンジニアリングまたは設計プラクティスを推奨する理由を説明せずに、あなたの答えは役に立たない。あなたの編集はまだあなたがそれらを推薦している理由を説明していません。

@ apoorv020 ソフトウェアエンジニアリングまたはデザインプラクティスを実施するための唯一の引き換え価値は、通常、中規模の(それが何であれ)プロジェクトを構築することです。これらのコースを受講して、個人的に何を学びましたか?

彼らは知っているのは良いことですが、これらはCSの主題ではありません。
トーマスオーエンズ

2

私が毎日使用する大学で学んだこと:

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

データベースコースを受講したいです。(卒業してから十分に理解できましたが、もっと知りたいと思います。)バージョン管理が教えられたらいいのにと思います。

数学のコースをいくつか受講しなければなりませんでした。私は卒業してから微積分学を使っていません。統計コースを受講したいです。(繰り返しますが、私は卒業してから十分に習得しましたが、もっと知りたいと思います。)

CS部門を超えて、ライティングコースを受講します。優れた書面によるコミュニケーションスキルは成功に不可欠です。


+1データベースがコースで必須ではなく、通常は必須のコンポーネントであると考えられていることに驚いた。
11

そうだった。私は技術的にそれから抜け出し、それを後悔しています。
pwc

@Orbling:多くの場合、小規模な学科(大規模な州立学校の学科とは対照的に)には、すべての主要なトピックを必要とするほど十分な講師がいません。たとえば、私の学校では、データベースは選択科目でした。
マクニール

@Macneil:私のコースでは、プライマリデータベースコースが前提条件でした(すべての基本をカバー:ERモデリング、通常のフォーム、SQL(基本的なSQL、複合/ネストなどだけでなく)、インデックス配置など)、後者、より複雑、データベースコースは選択科目でした(合計で3つあったと思います)。私はそれらを取り上げることを決して選択しませんでした。それは私が見逃す他のコースよりも簡単に自分で吸収できるものだと思ったからです。代わりに高度なORを使用したと思います。
11

@pwc:きっと、どうやってそれをやめたのか覚えてる?
11

2

行きたい方向に応じて、多くの重要なコースがあります。ただし、プログラムできると仮定すると、最も重要なコースは次のようになります。

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

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

それとは別に、私が長年にわたって複数の分野で最も有用だと感じたコースは次のとおりです。

  • 並行性

    並行性には多くの側面がありますが、共有メモリとメッセージ受け渡しの違いを理解することを期待しています。また、ロック戦略(ミューテックス、セマフォなど)およびトランザクションの強力なカバレッジが必要です。

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

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


1

私が大学にいたとき、私は実際の生活で使用を見ることができなかったかなりの数のトピックがありました、そして時々直観が正しいことが証明されました(ほとんどの場合、形式的な方法は本当に些細な問題に対してのみ実用的です)完全に間違っていました(Big-O表記は非常に便利です)ので、全体として、若い自分は正しかったと思います。

上記の@ K-Ranが推奨するものに加えて、現実の世界に備えたい場合は、Code Completeを読み、それを使用して、難しいと感じたトピックや自分が感じていないトピックの詳細な調査の基礎として使用することをお勧めします十分にカバーされています。


フォーマルなメソッドが役立つことが時々ありますが、明らかに小さなコンポーネントに限られます。ダイクストラらのことを考えました。「あなたが完璧な数学者なら、あなたは優秀なプログラマになれます。」
デビッドソーンリー

あなたが生きるコードに取り組んでいるのであれば、基本的にこのことをしっかりと把握している必要があると思います。しかし、私がやった仕事のためにそれは決して必要ではありませんでした。私は今、必要にそれをやった場合、私は...戻って、最初からそれを再学習しなければならない
glenatron

Zのようなものは、あなたが言うように、命が危険にさらされている組織のミッションクリティカルなソフトウェアにのみ実際に使用されます。ただし、それらを学習することで、コードの正確性に対する認識がはるかに高まり、あらゆる種類の仕様に完全に戻ることができると思います。時々あなたが学ぶことはそれ自身のためではなく、上にあるものを確認するのに役立ちます。
11

堅固な大きなビルディングブロックを作成すると考えてください。コンポーネントが正しいことを証明した(そして、設計と証明で行った愚かな間違いを見つけるためにテストした)場合、書き込みとデバッグの際に心配することはほとんどありません。
デビッド・ソーンリー

1

私はあなたが次を勉強するべきだと思う:

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

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

データ構造とアルゴリズム:-論理的な思考と考え方を開発するために非常に重要です。

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


1

プログラミングの仕事のために候補者に定期的に面接する人、および12年以上業界で働いた後に合理的に達成されたと感じる人として、私は次のことを提案します

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

次に、カリキュラムの追加作業を読みます。

  • 認証タイプの本。多くの場合、カバーの下にある構文と演算子のタイプを教えてくれます。あなたが何かをしている理由を知ることは、「それがうまくいくから」というよりもはるかに重要です。

1

それは依存します、この質問に対する良い答えはありません。

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

現在、あらゆる種類のソフトウェアがあります。たとえば、ウィキペディアを一般化のソースとして使用すると、3つの大きな一般化を満たすことができます。

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

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

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

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

あなたが見ることができるように、あなたが従うことができる多くのコースがあり、あなたの仕事に役立ちます。

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

理論的なコンピューターサイエンスで苦労して学んだように!あなたはこのコースを投げましたか?:P

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

それでは、CSキャリアの中で必見のコースは何ですか?

すべての分野、特に理論分野で学ぶことができる限り多くのことを学ぶことをお勧めします物事が実際にどのように機能するか、そして理論的知識のある人々がどのように物事が機能するかを予測し、自宅で食べ物を手に入れるためのコーディングの可能性を与えているかを見るためのより多くの時間。

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

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

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

私の2セント。

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


1

CSの学生が流shouldにすべき第一のことは、英語です。

話された英語と書かれた英語の両方を理解しなければ、あなたは永遠に不利な立場に置かれます。

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

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

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


1

私は、CSを卒業しておらず、電子工学を専攻していました(ビジネスで未成年者であった)という点で、わずかに異なる視点からこれに来ました。

それに基づいて、私(および他の多くのCS卒業生)はコンパイラの設計などに関することを知らずに幸せに生き残っているので、理解しなければならないことのリストは比較的短いと思います。

私が言ったことは、私が有用だと思うことを拾い上げました:

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

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


0

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

これは奇妙な追加のように思えるかもしれませんが、仕事の一部は専門的に自分自身を売って交渉する方法を学ぶことです。HRドローンの動機に関する十分な知識なしに最初の「本物の」インタビューに入ることは災害のレシピであり、学生が低賃金の給与に縛られてしまう可能性があります。

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


-1

1年目:

  1. 高水準言語の基本的なOOP
  2. データ構造

2年目:

  1. コンパイラ、簡単な1つのフォームスクラッチを構築します
  2. 並行性

3年目:

  1. アルゴリズム
  2. オペレーティングシステム、シンプルなものに機能と拡張機能を追加します
  3. 正式な言語

4年目:

  1. ネットワーキング
  2. 分散システム
  3. ユーザーインターフェース
  4. 高度なコンパイラ
  5. 高度なオペレーティングシステム
  6. 人工知能
  7. コンピューターグラフィックス

これらのコースは、理論とコーディングの実践を豊富に提供する必要があります。


-2

誰もコンピュータアーキテクチャについて言及していないのは奇妙です。


メモリキャッシュ、ページフォールトなどの影響を理解する場合は、コンピューターアーキテクチャを知ることが重要だと思います。
apoorv020
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.