コンピュータサイエンスを完全に自習するにはどうすればよいですか。[閉まっている]


46

完全に独学のプログラマーであるため、典型的なCS卒業生に教えられたコンピューターサイエンスコースを自己学習することで自分自身を改善できるといいのですが。

インターネットでさまざまなリソースを見つけるのは簡単です。もちろん、MITのオープンコースウェアがあり、スタンフォード大学や他の大学のCourseraコースもあります。インターネットにはさまざまなオープンリソースが散在しており、繰り返し推奨される優れた書籍もいくつかあります。

私は多くのことを学んでいますが、私の研究は非常に断片化されており、それは本当に私を悩ませています。私は大好きですどこかで、私が従うべき道と私が自分自身に制限するべきスタックを見つけることができたので、私が研究したコンピューターサイエンスの本質的な部分を確信でき、それから私が持っていないものに体系的にアプローチします。

ウィキペディアの問題は、何が必要かを教えてくれないが、完全なリファレンスであることを主張していることです。

MITは、コンピューターサイエンスと電気工学のためのコースウェアを公開しています。また、コースの膨大なリストがあり、個人の興味/要件ごとにどのコースが必須で、どのコースがオプションであるかを教えてくれません。異なる科目を研究すべき順序については言及していません。

私が大好きなのは、このダミーのリストのように、フォローできるリストを作成することです

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data structures                                                   *
Adv. Algorithms
...

おわかりのように、コンピューターサイエンスが特定の主題で構成されているかどうかはほとんどわかりません。

たとえ誰かがMITコースウェアの必須コース(+ MIT OCWに存在しない必須科目)を推奨される学習順序で指摘したとしても、それは非常に役立つでしょう。

既に行った投稿を一覧表示します(探しているものが見つかりませんでした)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major-一番上の答えは、cseを勉強する価値がないと言っている

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science-MIT OCWを指す

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming


完全に?すべての楽しい理論的なものも?

はい、私は実際に楽しい理論的なものが好きです、それは主題の私の理解を増やすと思います(それは私のサークルでの議論の問題ですが)。また、CSの友人がCSのことについて話し合ったり、あまりにも多くの質問をすることで彼らをいらいらさせたりするとき、私は孤独に感じます。
オプティマス

2
カリキュラムには、物事が結びつく「島」の種類があることに注意してください。たとえば、グラフ理論ではラムダ計算がほとんど必要ありません。また、メンターがいるといいかもしれません-あなたは適切な教育機関の近くに住んでいますか?

実際のところ、私はそうしており、教授とは友好的ですが、常に彼らをバグにすることはできません。彼らは私がそもそも持っている多くの断片的な知識に貢献してきました。
オプティマス

3
その場合、選択したコースを1つか2つ受講できる可能性があります。これにより、常に教授にバグを起こすことができます。

回答:


24

私はMITからいくつかの教材を見てきましたが、それは驚くほど悪いものでした。彼らはVC5を必要とする教材を持っていました。暗黙のグローバル変数の束、32ビットARGBの代わりに「青」、4x [0,1]のフロートはもちろん、色を渡します。カリキュラムやコードが有名な大学から来ているという理由だけでは信用しません。

私のCS学位(CSで英国のトップ10にある大学から)は、以下で構成されていました。

1年目:

  1. OOP-超基本
  2. コンピューターシステム-バイナリ整数表現のようなもの。
  3. 基本的なリレーショナルデータベース理論
  4. CSの数学-シンプルな2Dおよび3Dジオメトリ。
  5. 少しのHTML / JS-初心者向けの完全なもの
  6. 同様に小さなPHP。
  7. 少しの関数型プログラミング

二年目:

  1. ユーザーデータの保護に関する法律など、コンピューティングに関する法的問題
  2. プログラミング言語-チョムスキーの階層構造と字句解析について説明しました
  3. オペレーティングシステム、ネットワーク、およびインターネット-主に仮想メモリやページング、IPスタックなど
  4. 2Dコンピュータグラフィックス-主に基礎となる数学の定理を証明するだけ
  5. AI-ニューラルネットワーク、ベイジアン信念システムなどの基本的な説明
  6. 要件分析-UMLの概要、機能/非機能要件。
  7. チームプロジェクト

3年目:

  1. アルゴリズム分析-複雑性理論、ほとんど
  2. プログラミング言語の実装-LL / LR解析手法、CFGなど。
  3. ソフトウェアプロジェクト管理-ウォーターフォール/アジャイルモデルの概要
  4. 国際コンピューティング-Unicodeおよびその他のローカライズの楽しみ
  5. 高度なAI-正直、知らないで、すぐに試験を受けました
  6. 3Dコンピュータグラフィックス-ほとんどの場合、回転行列などの定理を証明するだけです。
  7. エージェントベースのシステム-主に非同期エージェントの通信、グループ決定への到達などについて
  8. マイクロプロセッサアプリケーション-デジタル信号処理
  9. ロボット工学-コンピュータービジョンやロボットの意思決定などを高レベルでカバー

お気づきのとおり、ほとんどすべてが何かの「基本」であり、有用な深さまでカバーされるものはほとんどありません。

実際に行う価値のあるもの、不可欠なもの:

  1. OOP-そしてさらにいくつか、そしてさらにいくつか
  2. 関数型プログラミング-さらにいくつか。両方のスタイルをカバーするために構文やツールなどを再学習する必要がないC ++やC#のような言語を選択してください。
  3. カーネルモードとユーザーモードのように、OSの部分仮想メモリについて知っておくと便利です。セグメンテーションとIPスタックをスキップします。
  4. 要件分析-すべてのプロジェクトに役立つ
  5. アルゴリズム分析-アルゴリズムの複雑さ、その軽減方法、一般的な操作の複雑さを知ることが重要です。
  6. ソフトウェアプロジェクト管理モデル-多くのショップはアジャイルを行い、多くの古いショップはまだウォーターフォールスタイルのモデルを行っています。
  7. 国際コンピューティング-Unicodeは不可欠です

やりがいのあるもの、オプション:

  1. プログラミング言語-チョムスキー階層、字句解析および解析のツール。LLパーサーまたはLRパーサーの背後にある理論をスキップしてください。LRパーサーは、事実上あらゆる明確なCFGを事実上受け入れることができます。
  2. 3Dグラフィック。「これが回転行列式であることを証明する」というのは時間の無駄ではなく、実際の「これは頂点シェーダーである」もの、つまりGPGPUを意味します。それは楽しくて、面白くて、異なっています。
  3. AIの一部は、潜在的なフィールドや経路探索のように楽しいものです。

不可欠なものですが、とにかく取り上げませんでした。

  1. 並行性-2012年のすべての人にとって、少なくとも基本を知っておく必要があります。

残りは完全に時間の無駄でした。残念ながら、これらの9つのポイントのほとんどは、私が既に知っているか、他の場所で有用な部分を取り上げました。FizzBu​​zzの問題のようなものを読むと、パックのトップに立つためにそれほど多くのことを実際に知る必要がないことがすぐに明らかになります。これは幸運なことです。他の学位については、まったく多くを教えません。


3
@ThorbjørnRavnAndersen:理論はコードを書くためのツールです。より良いコードを作成するためにそれを使用できないなら、理論は何の価値もない。
DeadMG

3
@Optimus:すべての理論の大半は、より良いコードを作成するのに役立ちません。
DeadMG

3
理論は、どのコードを記述でき、何を記述できないかを知るための基盤です。

17
この投稿にはいくつかの非常に良いアドバイスがありますが、一部のフィールドを時間の無駄だと宣言することについてあなたは独断的です。最近のジョブのプログラミングにはかなりの種類があり、1つのジョブの時間の無駄は別のジョブに不可欠な場合があります。。単に時間の無駄のように何かを却下するのではなく、あなたがに関与してきた開発の種類を説明するために役立つだろう
チャールズ・E・グラント

4
過去数年にわたって多くのインタビューを行ってきましたが、最近の大学での最大のギャップは、データ構造とアルゴリズムを教えることです。2番目に大きなギャップは、ツールが内部的に実装される方法を理解することです。私の意見では、特定のツールを使用するクラスは時間の無駄です。ハッシュテーブルを使用するタイミングとツリーを使用するタイミングを説明できない場合、C ++構文を知っていることはあまり意味がありません。
ロボット

5

オープンコースウェアは、彼らが利用可能にしたコースの単なるリストです。学生が何をしたかを知りたい場合は、MIT(非OCW)のWebサイトにアクセスして、実際のプログラムを見てください。彼らは何が必要なのか、何が何のための前提条件と見なされるのかを持っています。 こちらが彼らのページです。


私はそれを調べていますが、その要件はかなり簡潔であることがわかりました。そして、コースの長いリストはどこにありますか?
オプティマス


おかげで、これも参考になります、大きなunivsは以下の通りです何カリキュラム知って良いです
オプティマス

1
私は今バークレーでEECSをやっています。MIT EECSプログラムがBerkeleyのような構造になっている場合、ガイダンスはあまり得られません。短いイントロシーケンスがあり、最小限の高度な操作を行う限り、文字通り何でも好きな順序で実行できます。コース。すばらしいと思いますが、どのコースを受講するべきかを判断するのに役立つとは限りません。自分で同じ決定を下さなければなりませんでした。(私は教授陣から助けを借りましたが、偶然にも彼のアドバイスは大学院のセミナーを受講することでした:))。
ティコンジャービス

@TikhonJelvis分野の範囲と少なくともカバーすべき範囲がわかったら、学びたいこととしないことを選択するのは簡単です。土木工学の卒業生である私は、コンピューターサイエンスと工学で何が起こっているのかについてほとんど考えがありません。フィールド
オプティマス

5

ここにリンクされているACM / IEEEの2001 Computer Scienceカリキュラムの推奨事項を試してください:http : //www.acm.org/education/curricula-recommendations

2008 CSアップデートとともに。

2001年のレポートの17ページには、すべての「コア」知識を強調し、選択科目をリストした便利なチャートがあります。

学部課程のプログラムでは、これらの推奨事項で中核と見なされるコースをカバーする時間がないため、いくつかのカテゴリをまとめて、学生がそれらの中から選択できるようにします(オペレーティングシステム、プログラミング言語、ソフトウェアエンジニアリングなど)ソフトウェア、および学生がトラックを選択します)。

ほぼすべての学校のCS部門のWebサイトで必要なコースワークを見つけることができますが、これは何らかのバージョンになっているはずです。


良い、少し時代遅れですが、まだ通常のカリキュラムで選択するために残された多くの科目がここで中核と見なされます、あなたがキューに入れたものを使い果たした場合、利用可能な研究の幅広い選択肢を持つことは素晴らしいことです+1。
オプティマス

怠zyな人のために、そのリストには以下が含まれています:離散構造(DS)プログラミングの基礎(PF)アルゴリズムと複雑さ(AL)アーキテクチャと組織(AR)オペレーティングシステム(OS)Net-Centric Computing(NC)プログラミング言語(PL)人間-コンピューターインタラクション(HC)グラフィックスおよびビジュアルコンピューティング(GV)インテリジェントシステム(IS)情報管理(IM)社会的および専門的問題(SP)ソフトウェアエンジニアリング(SE)計算科学および数値法(CN)。
ダミアンロシュ14

-4

可能であれば、学習プロセスの一環としてgithub.comに参加することをお勧めします。

次に、興味のある現実世界のアプリケーションを含むコードを検索し、自分用にクローンを作成し、それを操作し、コードを作成し、それを理解し、最終的にソースプロジェクトにパッチを送り返します。 、そして将来的には、あなたが既得権を持つオープンソースプロジェクトに取り組んでいます。

そして、もちろん、あなたはgitに慣れるでしょう。


5
-1:貴重ではありますが、コンピュータサイエンスの理論的側面にさらされることはありません。
ケンブルーム

そこに我々はまた、個人的なGitのレポを持っている、ということで行われ、githubのぶらぶらすることは、あなたにかかわらず、より良いプログラマ作るん
オプティマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.