Làm thế nào để tôi hoàn toàn tự học Khoa học Máy tính? [đóng cửa]


46

Là một lập trình viên hoàn toàn tự học, tôi muốn nó nếu tôi có thể tự cải thiện bản thân mình bằng cách tự học khóa học khoa học máy tính được dạy cho một sinh viên CS điển hình.

Tìm kiếm các tài nguyên khác nhau trên internet rất dễ dàng, tất nhiên có kho khóa học mở của MIT và có các khóa học Coursera từ Stanford và các trường đại học khác. Có rất nhiều tài nguyên mở khác nằm rải rác trên Internet và một số cuốn sách hay được đề xuất nhiều lần.

Tôi đã học được rất nhiều, nhưng việc học của tôi bị phân mảnh rất nhiều, điều đó thực sự làm tôi khó chịu. Tôi sẽ yêu Nếu ở đâu đó, tôi có thể tìm thấy một con đường tôi nên đi theo và một ngăn xếp mà tôi nên giới hạn bản thân mình, để tôi có thể chắc chắn về những phần thiết yếu của khoa học máy tính mà tôi đã nghiên cứu, và sau đó tiếp cận một cách có hệ thống những điều tôi chưa có.

Vấn đề với Wikipedia là nó không cho bạn biết những gì thiết yếu nhưng khăng khăng là một tài liệu tham khảo đầy đủ.

MIT khóa học mở cho khoa học máy tính và điện Engg. có một danh sách lớn các khóa học cũng không cho bạn biết khóa học nào là thiết yếu và tùy chọn nào theo sở thích / yêu cầu của mỗi người. Tôi không tìm thấy đề cập đến một thứ tự mà người ta nên học các môn học khác nhau.

Những gì tôi muốn là tạo ra một danh sách mà tôi có thể theo dõi, như danh sách giả này

SUBJECTS                                                        DONE

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

Như bạn có thể thấy rõ, tôi có ít ý tưởng về những môn học cụ thể mà khoa học máy tính bao gồm.

Nó sẽ rất hữu ích, ngay cả khi ai đó đã chỉ ra các khóa học thiết yếu từ MIT Course ware (+ các môn học thiết yếu không có tại MIT OCW) theo thứ tự đề xuất nghiên cứu.

Tôi sẽ liệt kê các Bài viết tôi đã trải qua (và tôi không nhận được những gì tôi đang tìm kiếm ở đó)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curemony-for-non-cs-major - câu trả lời hàng đầu nói rằng nó không đáng để học cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-elf-taught-programmer-learn-more-about-computer-science - trỏ đến 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


Hoàn toàn? Tất cả những thứ lý thuyết thú vị quá?

Vâng, tôi thực sự thích những thứ lý thuyết thú vị, tôi nghĩ nó sẽ tăng sự hiểu biết của tôi về chủ đề này (mặc dù đó là vấn đề tranh luận trong vòng tròn của tôi). Ngoài ra, tôi cảm thấy bị bỏ lại một mình khi bạn bè CS của tôi thảo luận về công cụ CS hoặc tôi chọc tức họ bằng cách hỏi quá nhiều câu hỏi.
Optimus

2
Lưu ý rằng có một số loại "đảo" trong chương trình giảng dạy, nơi mọi thứ kết hợp với nhau. Bạn ví dụ hiếm khi cần tính toán lambda trong lý thuyết đồ thị. Cũng xem xét rằng có thể có những người cố vấn xung quanh - bạn có sống gần một tổ chức giáo dục phù hợp không?

Như một vấn đề thực tế tôi làm, và thân thiện với các profs nhưng tôi không thể lỗi họ mọi lúc. Họ đã đóng góp cho rất nhiều kiến ​​thức rời rạc mà tôi có ở nơi đầu tiên.
Optimus

3
Trong trường hợp đó, bạn có thể tham gia một hoặc hai khóa học đã chọn - điều đó cho phép bạn sửa lỗi mọi lúc.

Câu trả lời:


24

Tôi đã thấy một số tài liệu khóa học từ MIT, và nó rất tệ . Họ đã có các tài liệu giảng dạy yêu cầu VC5, một loạt các biến toàn cầu tiềm ẩn, chuyển các màu thành "Blue" thay vì 32GB ARGB, chứ đừng nói là 4x [0,1], kiểu đó. Tôi sẽ không tin vào một chương trình giảng dạy hoặc mã chỉ vì nó đến từ một trường đại học tên tuổi.

Bằng CS của tôi (từ một trường đại học nằm trong top 10 ở Anh về CS) bao gồm:

Năm đầu:

  1. OOP- những điều cơ bản
  2. Hệ thống máy tính - những thứ như, biểu diễn số nguyên nhị phân.
  3. Lý thuyết cơ sở dữ liệu quan hệ cơ bản
  4. Toán học cho CS- hình học 2D và 3D đơn giản.
  5. Một chút HTML / JS- hoàn thành công cụ của người mới bắt đầu
  6. Một chút không kém của PHP.
  7. Một chút lập trình chức năng

Năm thư hai:

  1. Các vấn đề pháp lý trong điện toán - những thứ như, luật xoay quanh việc bảo vệ dữ liệu người dùng
  2. Ngôn ngữ lập trình - hệ thống phân cấp và từ vựng của Chomsky đã được đề cập
  3. Hệ điều hành, Mạng và Internet - chủ yếu là các thứ như bộ nhớ ảo và phân trang, ngăn xếp IP
  4. Đồ họa máy tính 2D - chủ yếu chỉ chứng minh các định lý của toán học cơ bản
  5. AI- mô tả cơ bản về mạng lưới thần kinh, hệ thống niềm tin Bayes, v.v.
  6. Phân tích yêu cầu - tổng quan ngắn gọn về UML, các yêu cầu chức năng / không chức năng.
  7. Dự án nhóm

Năm thứ ba:

  1. Phân tích thuật toán - lý thuyết phức tạp, chủ yếu là
  2. Triển khai các ngôn ngữ lập trình - Kỹ thuật phân tích LL / LR, CFG và những thứ như vậy.
  3. Quản lý dự án phần mềm - xem xét các mô hình Waterfall / Agile
  4. Điện toán quốc tế - Unicode và niềm vui nội địa hóa khác
  5. Thành thật về AI - không biết, và tôi đã sớm có một bài kiểm tra về nó
  6. Đồ họa máy tính 3D - chủ yếu, một lần nữa, chỉ chứng minh các định lý cho ma trận xoay và như vậy
  7. Hệ thống dựa trên tác nhân - chủ yếu là về các tác nhân không đồng bộ giao tiếp, đạt được các quyết định nhóm, v.v.
  8. Ứng dụng vi xử lý- xử lý tín hiệu số
  9. Robotics- bao gồm những thứ như tầm nhìn máy tính và ra quyết định robot ở mức cao

Như bạn sẽ nhận thấy, hầu hết mọi thứ là "những điều cơ bản" của một cái gì đó và hầu như không có gì được đề cập đến một độ sâu hữu ích.

Những thứ thực sự đáng làm, cần thiết:

  1. OOP- và sau đó một số nữa, và một số nữa
  2. Lập trình chức năng - cũng có một số chi tiết. Cố gắng chọn một ngôn ngữ như C ++ hoặc C # trong đó bạn không phải học lại cú pháp và công cụ, v.v., để bao quát cả hai phong cách.
  3. Bộ nhớ ảo của hệ điều hành rất tốt để biết, cũng như chế độ kernel so với chế độ người dùng. Bỏ qua phân đoạn và ngăn xếp IP.
  4. Phân tích yêu cầu - Phải hữu ích cho bất kỳ dự án nào
  5. Phân tích thuật toán - biết độ phức tạp thuật toán là gì, làm thế nào để giảm bớt nó và mức độ phức tạp của các hoạt động phổ biến là quan trọng.
  6. Các mô hình quản lý dự án phần mềm - nhiều cửa hàng làm Agile và nhiều cửa hàng cũ vẫn làm mô hình kiểu Thác nước.
  7. Điện toán quốc tế - Unicode là điều cần thiết

Những thứ đáng làm, tùy ý:

  1. Ngôn ngữ lập trình - hệ thống phân cấp Chomsky, các công cụ từ vựng và phân tích cú pháp. Bỏ qua lý thuyết đằng sau các trình phân tích cú pháp LL hoặc LR - một trình phân tích cú pháp LR có thể chấp nhận hầu như bất kỳ CFG rõ ràng thực tế nào và khi không thể, tài liệu của trình tạo trình phân tích cú pháp của bạn sẽ cho bạn biết về nó.
  2. Đồ họa 3D. Tôi không có nghĩa là "Chứng minh đây là một công thức ma trận xoay vòng" lãng phí thời gian, ý tôi là thực tế "Đây là một công cụ tạo bóng đỉnh" hay GPGPU. Đó là niềm vui, thú vị và khác biệt.
  3. Một số nội dung của AI rất thú vị - như các lĩnh vực tiềm năng và tìm đường.

Những thứ đó rất cần thiết nhưng dù sao tôi cũng không bao gồm nó:

  1. Đồng thời - một điều cần biết, ít nhất là những điều cơ bản, cho bất kỳ ai trong năm 2012.

Phần còn lại là một sự lãng phí hoàn toàn thời gian. Thật không may, hầu hết chín điểm này tôi đều đã biết hoặc chọn các phần hữu ích ở nơi khác. Nếu bạn đọc về những thứ như vấn đề FizzBuzz, thì rõ ràng là bạn thực sự không cần phải biết tất cả những gì để đứng đầu gói - điều may mắn, vì bằng cấp của tôi và nhiều tài liệu tôi đã xem trực tuyến đối với các bằng cấp khác thực sự không dạy nhiều.


3
@ ThorbjørnRavnAndersen: Lý thuyết là một công cụ để viết mã, không có gì hơn. Một lý thuyết không có giá trị gì nếu bạn không thể sử dụng nó để tạo mã tốt hơn.
DeadMG

3
@Optimus: Đại đa số tất cả các lý thuyết không thể giúp bạn tạo mã tốt hơn.
DeadMG

3
Lý thuyết là nền tảng để biết mã nào có thể được viết, và mã nào không.

17
Có một số lời khuyên rất tốt trong bài đăng này, nhưng bạn quá giáo điều về việc tuyên bố một số lĩnh vực lãng phí thời gian. Ngày nay có sự đa dạng đáng kể trong công việc lập trình, và việc lãng phí thời gian cho một công việc có thể là điều cần thiết cho một công việc khác. Thay vì chỉ đơn giản là gạt bỏ một cái gì đó như một sự lãng phí thời gian, sẽ rất hữu ích khi mô tả các loại phát triển mà bạn đã tham gia.
Charles E. Grant

4
Tôi đã thực hiện rất nhiều cuộc phỏng vấn trong vài năm qua, và dường như khoảng cách lớn nhất hiện nay ở các trường đại học là trong việc giảng dạy các cấu trúc dữ liệu và thuật toán. Khoảng cách lớn thứ hai là trong cách hiểu các công cụ được triển khai trong nội bộ. Theo tôi, các lớp trong việc sử dụng một công cụ cụ thể là một sự lãng phí thời gian. Không có nhiều điểm để biết cú pháp C ++ nếu bạn không thể giải thích khi nào nên sử dụng bảng băm và khi nào nên sử dụng cây.
Gort Robot

5

Open Course ware chỉ là một danh sách các khóa học mà họ đã có sẵn. Nếu bạn muốn biết một sinh viên sẽ làm gì, hãy truy cập trang web của MIT (không phải OCW) và xem chương trình thực tế. Họ có một danh sách những gì được yêu cầu và những gì được coi là điều kiện tiên quyết cho những gì. Đây là trang của họ.


Tôi đang xem xét nó, nhưng tôi thấy yêu cầu của họ khá ngắn gọn. và danh sách dài các khóa học ở đâu?
Optimus

1
web.mit.edu/catalog/degre.engin.ch6.html Là danh sách lớn. CS được gọi là 6,3
stonemetal

cảm ơn, điều này cũng sẽ hữu ích, thật tốt khi biết chương trình giảng dạy lớn nào đang theo dõi
Optimus

1
Tôi đang làm EECS tại Berkeley ngay bây giờ. Nếu chương trình MIT EECS được cấu trúc bất cứ thứ gì như của Berkeley, thì bạn sẽ không nhận được nhiều hướng dẫn ở đó: chúng tôi có một đoạn giới thiệu ngắn và sau đó nó thực sự làm bất cứ điều gì bạn muốn theo bất cứ thứ gì bạn muốn miễn là bạn làm một số lượng tối thiểu nâng cao các khóa học. Tôi nghĩ nó thật tuyệt, nhưng có lẽ nó sẽ không giúp bạn tìm ra khóa học nào: Tôi phải tự mình đưa ra quyết định. (Tôi đã có sự giúp đỡ từ cố vấn giảng viên của mình, nhưng trong một sự trùng hợp hoàn toàn, lời khuyên của anh ấy là tham gia hội thảo sau đại học của anh ấy :)).
Tikhon Jelvis

@TikhonJelvis Dễ dàng đưa ra lựa chọn về những gì bạn muốn học và những gì bạn không muốn, một khi bạn có ý tưởng về phạm vi của lĩnh vực này và phạm vi tối thiểu nên được đề cập. Tôi, là một sinh viên tốt nghiệp ngành Kỹ thuật Xây dựng, có rất ít ý tưởng về những gì diễn ra trong Khoa học Máy tính và Tiếng Anh. Trường
Optimus

5

Hãy thử các đề xuất chương trình Khoa học Máy tính năm 2001 từ ACM / IEEE, được liên kết tại đây: http://www.acm.org/education/curricula-recommendations

cùng với các bản cập nhật CS 2008.

Trang 17 của báo cáo năm 2001 có một biểu đồ tiện dụng, gạch chân tất cả các kiến ​​thức "cốt lõi" và vẫn liệt kê các môn tự chọn.

Một chương trình đại học sẽ không có thời gian để bao gồm cả các khóa học được coi là cốt lõi bởi các khuyến nghị này, vì vậy họ sẽ gộp một số loại lại với nhau và để sinh viên chọn trong số đó (ví dụ: Hệ điều hành, Ngôn ngữ lập trình và Kỹ thuật phần mềm được gộp vào Phần mềm, và sinh viên chọn một bài hát).

Bạn có thể tìm thấy các khóa học cần thiết trên trang web của bộ phận CS cho bất kỳ trường nào, và chúng nên là một số phiên bản này.


tốt, một chút lỗi thời, nhưng vẫn còn rất nhiều môn học được lựa chọn trong một chương trình giảng dạy bình thường được coi là cốt lõi ở đây, thật tuyệt khi có nhiều lựa chọn học tập hơn nếu bạn hết những thứ bạn đã xếp hàng +1.
Optimus

Đối với những người lười biếng, danh sách đó chứa: Các thuật toán cơ bản và cấu trúc lập trình (DS) cấu trúc rời rạc (AL) Cấu trúc và hệ thống (AR) Cấu trúc hệ điều hành (NC) Net-Centric Computing (NC) Human-Computer Tương tác (HC) Đồ họa và tính toán trực quan (GV) Hệ thống thông minh (IS) Quản lý thông tin (IM) Các vấn đề xã hội và chuyên nghiệp (SP) Kỹ thuật phần mềm (SE) Khoa học tính toán và phương pháp số (CN).
Damien Roche

-4

Nếu tôi có thể, tôi muốn đề xuất tham gia github.com như một phần của quá trình học tập của bạn.

Sau đó, bạn có thể tìm kiếm mã có một số ứng dụng trong thế giới thực mà bạn quan tâm, tự sao chép nó, làm việc với nó, viết mã và tìm hiểu nó, và cuối cùng bắt đầu gửi các bản vá lại cho dự án nguồn và xuống dòng đang làm việc với một dự án nguồn mở mà bạn có hứng thú.

Và, tất nhiên, bạn sẽ làm quen với git, điều này tốt hơn tất cả.


5
-1: Mặc dù có giá trị, nhưng điều đó không đưa anh ta đến các khía cạnh lý thuyết trong khoa học máy tính mà anh ta cần biết.
Ken Bloom

đã hoàn thành điều đó, chúng tôi cũng có một repo git cá nhân, Treo xung quanh github sẽ giúp bạn trở thành một lập trình viên tốt hơn
Optimus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.