Lưu ý: trang hướng dẫn này đã có những thay đổi lớn vào tháng 5/2020. Để xem phiên bản trước, click vào đây.
Nếu bạn là một kỹ sư tự học hoặc tốt nghiệp từ bootcamp, bạn nợ chính bản thân mình việc học khoa học máy tính (KHMT). Rất may, bạn có thể tham gia một chương trình giáo dục KHMT đẳng cấp thế giới mà không cần đầu tư nhiều năm hay bỏ một lượng tiền tương đối để có một tấm bằng 💸.
Có tương đối nhiều nguồn tài liệu ngoài kia, nhưng một số tài liệu thì tốt hơn số khác. Bạn không cần một danh sách kiểu "200 khoá học trực tuyến miễn phí". Bạn cần các câu trả lời nhưng câu hỏi sau:
- Bạn nên học những chủ đề nào, và tại sao?
- Cuốn sách hay video bài giảng hay nhất cho từng chủ đề là gì?
Trang hướng dẫn này là nỗ lực của chúng tôi để trả lời dứt điểm những câu hỏi này.
Học tất cả chín chủ đề dưới đây, tốt nhất là theo thứ tự như đã trình bày, sử dụng loạt bài giảng video hoặc sách giáo trình được gợi ý, nhưng lý tưởng nhất là học cả hai. Hãy đặt mục tiêu cho 100-200 giờ nghiên cứu cho mỗi chủ đề, sau đó xem lại các chủ đề yêu thích trong suốt sự nghiệp của bạn 🚀.
Chủ đề | Tại sao học? | Sách | Video |
---|---|---|---|
Lập trình | Đừng là người “chưa bao giờ hiểu rõ” về một thứ như đệ quy. | Cấu trúc và diễn giải các chương trình máy tính | Brian Harvey's Berkeley CS 61A |
Kiến trúc máy tính | Nếu bạn không có nền tẳng vững chắc về cách máy tính thực sự hoạt động, tất cả các bản abstraction cao hơn của bạn sẽ trở nên không mạch lạc. | Hệ thống máy tính: Góc nhìn của một lập trình viên | Berkeley CS 61C |
Thuật toán và cấu trúc dữ liệu | Nếu bạn không biết cách sử dụng cấu trúc dữ liệu phổ biến như ngăn xếp, hàng đợi, cây, và đồ thị, bạn sẽ không có thể giải quyết các vấn đề khó. | Hướng dẫn Thiết kế Thuật toán | Bài giảng của Steven Skiena |
Toán cho KHMT | KHMT về cơ bản là một nhánh của toán học ứng dụng, vì vậy học toán sẽ mang lại cho bạn lợi thế cạnh tranh. | Toán học cho Khoa học Máy tính | MIT 6.042J của Tom Leighton |
Hệ điều hành | Hầu hết các đoạn mã bạn viết được chạy bởi một hệ điều hành, vì vậy bạn nên biết chúng tương tác như thế nào. | Hệ điều hành: Ba mảnh dễ dàng | Berkeley CS 162 |
Mạng máy tính | Internet là một vấn đề lớn: bạn cần hiểu cách nó hoạt động để khai thác hết tiềm năng của nó. | Mạng máy tính: một cách tiếp cận từ tầng trên xuống dưới | Stanford CS 144 |
Cơ sở dữ liệu | Dữ liệu là trọng tâm của hầu hết các chương trình quan trọng, nhưng ít người hiểu cách hệ thống cơ sở dữ liệu thực sự hoạt động. | Đọc trong Hệ thống Cơ sở Dữ liệu | Joe Hellerstein's Berkeley CS 186 |
Ngôn ngữ và Trình biên dịch | Nếu bạn hiểu cách ngôn ngữ và trình biên dịch thực sự hoạt động, bạn sẽ viết mã tốt hơn và học ngôn ngữ mới dễ dàng hơn. | Tạo thông dịch viên | Khóa học của Alex Aiken trên edX |
Hệ thống phân tán | Ngày nay, hầu hết hệ thống là phân tán. | Thiết kế các ứng dụng chuyên sâu về dữ liệu của Martin Kleppmann | MIT 6.824 |
Nếu ý tưởng tự học 9 chủ đề trong nhiều năm làm bạn cảm thấy quá sức, chúng tôi khuyên bạn chỉ nên tập trung vào hai cuốn sách: Hệ thống máy tính: Quan điểm của một lập trình viên và Thiết kế các ứng dụng tập trung về dữ liệu. Theo kinh nghiệm của chúng tôi, hai cuốn sách này mang lại hiệu quả cực kỳ cao trên tổng thời gian đầu tư học, đặc biệt cho các kỹ sư tự học và tốt nghiệp từ bootcamp làm việc trên các ứng dụng trực tuyến. Chúng cũng có thể được coi là chất xúc tác giúp bạn có động lực học các chủ đề còn lại.
Có 2 loại kỹ sư phần mềm:
- những người hiểu rõ về khoa học máy tính để làm những công việc đầy thử thách và sáng tạo.
- những người chỉ làm việc đều đều vì họ đã quen thuộc với một số công cụ.
Cả hai đều tự gọi mình là kỹ sư phần mềm và cả hai đều có xu hướng kiếm được mức lương tương tự khi mới vào nghề. Nhưng các kỹ sư loại 1 sẽ tiến tới công việc hoàn thiện hơn và được trả lương cao, xứng đáng hơn theo thời gian, cho dù đó là các dự án thương mại hay các dự án nguồn mở, người quản lý về kỹ thuật hay bản thân là cá nhân xuất sắc.
Các kỹ sư loại 1 tìm cách học chuyên sâu về KHMT, cho dù thông qua các kiểu học truyền thống hay bằng cách học hỏi không ngừng nghỉ trong suốt sự nghiệp của họ. Các kỹ sư loại 2 thường chỉ ở trên bề mặt, học các công cụ và công nghệ cụ thể hơn là nền tảng cơ bản tạo ra chúng, chỉ học các kỹ năng mới khi các công nghệ mới diễn ra và xuất hiện.
Hiện tại, số lượng người vào ngành IT đang tăng lên nhanh chóng, trong khi số lượng người tốt nghiệp KHMT thì tương đối ổn định. Tình trạng dư cung của cá kỹ sư loại 2 này đang bắt đầu làm giảm cơ hội việc làm của chính họ, và đẩy họ ra khỏi ngành IT. Cho dù bạn đang phấn đấu để trở thành kỹ sư loại 1 hay chỉ đơn giản là tìm kiếm công việc an toàn hơn, học KHMT là con đường đúng đắn duy nhất.
Hầu hết các chương trình đại học cho ngành KHMT đều bắt đầu với phần “giới thiệu” về lập trình máy tính. Các khóa học tốt nhất cho chủ đề này không chỉ giúp cho người mới học, mà còn rất tốt chho những người đã bỏ lỡ các khái niệm và mô hình lập trình khi họ mới học viết mã.
Gợi ý chung nhất của chúng tôi cho nội dung này là cuốn sách kinh điển Cấu trúc và diễn giải các chương trình máy tính (SICP - viết tắt tên tiếng Anh). Nó được cung cấp trực tuyến miễn phí dưới dạng sách điện tử, và dưới dạng một tập hợp các bài giảng video của MIT. Mặc dù những bài giảng đó rất hay, nhưng đề xuất video của chúng tôi là bài giảng SICP của Brian Harvey (cho khóa học 61A tại Berkeley). Các bài giảng này được trau chuốt hơn và hướng đến đối tượng là sinh viên mới tốt hơn so với các bài giảng của MIT.
Chúng tôi khuyên bạn nên học qua ít nhất ba chương đầu tiên của SICP và làm các bài tập. Để thực hành thêm, hãy thử giải quyết một loạt các bài tập về lập trình nhỏ trên exercism.io.
Kể từ khi hướng dẫn này được đăng lần đầu tiên vào năm 2016, một trong những câu hỏi thường gặp nhất là liệu bây giờ chúng tôi có nên đề xuất các video mới hơn của khoá học 61A do John DeNero dạy, và/hoặc cuốn sách tương tự Soạn thảo chương trình, vẫn là cuốn sách SICP nhưng sử dụng Python. Chúng tôi nghĩ rằng các tài liệu của DeNero rất tuyệt và một số sinh viên có thể thích chúng hơn, nhưng chúng tôi vẫn đề xuất cuố sách gốc của SICP, Scheme, và các bài giảng của Brian Harvey như là nguồn tài nguyên đầu tiên nên thử.
Tại sao? Bởi vì SICP đặc biệt, ít nhất là nhiều khả năng, trong việc thay đổi suy nghĩ cơ bản của bạn về máy tính và lập trình. Không phải ai cũng sẽ cảm nhận được điều này. Một số sẽ ghét cuốn sách, những người khác sẽ không vượt qua được vài trang đầu tiên. Nhưng giá trị tiềm năng mà nó mang lại rất đáng để thử.
Nếu bạn không cảm thấy thích SICP, hãy thử Soạn thảo chương trình. Nếu vẫn không phù hợp, hãy thử Cách thiết kế các chương trình. Nếu không có tài liệu nào trong số này làm bạn cảm thấy bạn có thể dành công sức cho nó, có lẽ đó là một dấu hiệu cho thấy bạn nên tập trung vào các chủ đề khác trong một thời gian và xem lại chủ đề lập trình này trong một hoặc hai năm nữa.
Cuối cùng, một điểm cần làm rõ: hướng dẫn này KHÔNG được thiết kế cho những người hoàn toàn mới học lập trình. Chúng tôi giả định rằng bạn là một lập trình viên có năng lực mà không có nền tảng về KHMT, đang tìm cách lấp đầy một số lỗ hổng kiến thức. Thực tế là chúng tôi đặt ra một chủ đề về "lập trình" chỉ đơn giản là một lời nhắc nhở rằng bạn có thể cần tìm hiểu nhiều hơn nữa. Đối với những người chưa bao giờ viết mã trước đây, nhưng nếu muốn, bạn có thể thích một hướng dẫn như cái này.
Kiến trúc Máy tính — đôi khi được gọi là “hệ thống máy tính” hoặc “tổ chức của máy tính” — là một góc nhìn quan trọng đầu tiên về phần tính toán bên dưới bề mặt của phần mềm. Theo kinh nghiệm của chúng tôi, đó là lĩnh vực bị bỏ qua nhất trong các kỹ sư phần mềm tự học.
Cuốn sách yêu thích để giới thiệu của chúng tôi là Hệ thống máy tính: Góc nhìn của một lập trình viên (CS:APP - tên viết tắt tiếng Anh) và khóa học điển hình sử dụng cuốn sách này sẽ bao gồm hầu hết các chương 1-6.
Chúng tôi thích cuốn sách CS:APP vì cách tiếp cận thực tế, hướng đến lập trình viên. Mặc dù vẫn có nhiều thứ về kiến trúc máy tính trong hơn những gì được đề cập trong cuốn sách, nhưng nó là một điểm khởi đầu tuyệt vời cho những ai muốn hiểu về hệ thống máy tính nhằm để viết ra các phần mềm nhanh hơn, hiệu quả hơn, và đáng tin cậy hơn.
Đối với những người muốn có phần giới thiệu nhẹ nhàng hơn về chủ đề này và sự cân bằng giữa phần cứng và phần mềm, chúng tôi đề xuất Các yếu tố của hệ thống máy tính, còn được gọi là “Nand2Tetris”. Đây là một cuốn sách đầy tham vọng nhằm cung cấp cho bạn sự hiểu biết đầy đủ về cách mọi thứ trong máy tính hoạt động. Mỗi chương liên quan đến việc xây dựng một phần nhỏ của hệ thống tổng thể, từ việc viết các cổng logic cơ bản trong HDL, thông qua CPU và assembler, cho đến một ứng dụng có kích thước bằng một trò chơi Tetris.
Chúng tôi khuyên đọc sáu chương đầu tiên của cuốn sách và hoàn thành các dự án liên quan. Điều này sẽ giúp bạn hiểu được mối quan hệ giữa kiến trúc của máy tính và phần mềm chạy trên đó.
Nửa đầu của cuốn sách (và tất cả các dự án của cuốn sách), được cung cấp miễn phí từ trang web Nand2Tetris. Nó cũng có sẵn dưới dạng một khóa học Coursera với video đi kèm.
Khi tìm kiếm sự đơn giản và gắn kết, Nand2Tetris đánh đổi với độ sâu của kiến thức. Đặc biệt, hai khái niệm rất quan trọng trong kiến trúc máy tính hiện đại là pipelining và phân cấp bộ nhớ, nhưng cả hai đều hầu như không có trong sách.
Khi bạn cảm thấy thoải mái với nội dung của Nand2Tetris, chúng tôi khuyên bạn nên quay lại CS: APP hoặc xem xét cuốn sách kinh điển và xuất sắc Tổ chức máy tính và thiết kế của Patterson và Hennessy. Không phải mọi phần trong sách đều cần thiết; chúng tôi khuyên bạn nên theo dõi khóa học CS61C của Berkeley “Những ý tưởng tuyệt vời trong kiến trúc máy tính” để có thể đọc cụ thể. Các ghi chú bài giảng và phòng thử nghiệm được cung cấp trực tuyến, và các bài giảng trước đây có thể xem trên Internet Archive.
Phần cứng là nền tảng
- Mike Acton, Giám đốc kỹ thuật tại Insomniac Games (xem cuộc nói chuyện CppCon của ông ấy)
Chúng tôi đồng ý với sự đồng thuận chung trong nhiều thập kỷ rằng sự quen thuộc với các thuật toán và cấu trúc dữ liệu phổ biến là một trong những đặc điểm có nhiều ý nghĩa nhất của chương trình giáo dục khoa học máy tính. Đây cũng là một nơi tuyệt vời để đào tạo khả năng giải quyết vấn đề chung của một người, khả năng này sẽ mang lại hiệu quả trong mọi lĩnh vực nghiên cứu khác.
Có hàng trăm cuốn sách ngoài kia, nhưng cuốn sách yêu thích của chúng tôi là Hướng dẫn Thiết kế Thuật toán của Steven Skiena. Tác giả rõ ràng yêu thích việc giải quyết vấn đề bằng thuật toán và thường thành công trong việc nuôi dưỡng sự nhiệt tình tương tự giữa các sinh viên và độc giả của mình. Theo ý kiến của chúng tôi, hai cuốn sách được nhiều gợi ý hơn (CLRS và Sedgewick) có xu hướng hơi quá nặng theo hướng chứng minh cho những người chủ yếu học lý thuyết đẻ giúp họ giải quyết vấn đề thực tế.
Đối với những bạn thích các bài giảng video, Skiena hào phóng cung cấp phiên bản trực tuyến. Chúng tôi cũng thực sự thích khóa học của Tim Roughgarden ởtrên Coursera và nơi khác. Cho dù bạn thích phong cách giảng bài của Skiena hay Roughgarden đều ổn, đấy chỉ là sở thích cá nhân. Trên thực tế, có hàng tá lựa chọn thay thế cũng rất tốt, vì vậy nếu bạn tình cờ tìm thấy nguồn tài liệu khác mà bạn thích, chúng tôi khuyến khích bạn tiếp tục với nguồn tài liệu đó!
Để thực hành, chúng tôi gợi ý giải các bài toán trên Leetcode. Chúng là những vấn đề thú vị với các giải pháp và thảo luận đi kèm. Họ cũng giúp bạn kiểm tra sự tiến bộ so với các câu hỏi thường được sử dụng trong các cuộc phỏng vấn kỹ thuật tại các công ty phần mềm cạnh nổi tiếng. Chúng tôi khuyên bạn nên giải quyết khoảng 100 bài toán leetcode ngẫu nhiên như một phần của việc nghiên cứu và học tập.
Cuối cùng, chúng tôi đề xuất cuốn sách Cách giải quyết như một hướng dẫn tuyệt vời và độc đáot liên quan tới giải quyết vấn đề nói chung; nó hữu dụng cho khoa học máy tính cũng như toán học.
Tôi chỉ có một phương pháp mà tôi đề xuất rộng rãi. Đó là suy nghĩ trước khi bạn viết.
- Richard Hamming
Theo một cách nào đó, khoa học máy tính là một nhánh của toán học ứng dụng đã phát triển quá nhanh. Mặc dù nhiều kỹ sư phần mềm cố gắng bỏ qua chủ đề này ở các mức độ khác nhau, chúng tôi khuyến khích bạn nắm bắt nó bằng cách nghiên cứu trực tiếp. Nếu học được thành công sẽ mang lại cho bạn một lợi thế cạnh tranh to lớn so với những người không học.
Lĩnh vực toán học có liên quan nhất đối với KHMT được gọi rộng rãi là “toán học rời rạc”, trong đó “rời rạc” đối lập với “liên tục” và là một tập hợp các chủ đề toán học ứng dụng thú vị ngoài giải tích. Với định nghĩa mơ hồ như vậy, sẽ không có nhiều ý nghĩa nếu cố gắng học mọi thứ về “toán học rời rạc. Một mục tiêu thực tế hơn là xây dựng sự hiểu biết về logic, tổ hợp và xác suất, lý thuyết tập hợp, lý thuyết đồ thị, và một chút lý thuyết số thông báo về mã hoá. Đại số tuyến tính là một lĩnh vực đáng nghiên cứu bổ sung, do tầm quan trọng của nó trong đồ họa máy tính và học máy.
Điểm bắt đầu mà chúng tôi đề xuất cho toán học rời rạc là tập hợp các ghi chú bài giảng của László Lovász. Giáo sư Lovász đã làm rất tốt việc làm cho nội dung dễ tiếp cận và trực quan, vì vậy đây là điểm khởi đầu tốt hơn so với tài liệu chính thức.
Để có hiểu sâu hơn, chúng tôi đề xuất Toán học cho Khoa học Máy tính, ghi chú bài giảng dài như sách cho khóa học ở MIT có cùng tên gọi. Video bài giảng của khóa học đó cũng miễn phí, và là video bài giảng chúng tôi khuyên dùng cho môn toán rời rạc.
Đối với đại số tuyến tính, chúng tôi khuyên bạn nên bắt đầu với loạt video Bản chất của đại số tuyến tính, theo sau là sách của Gilbert Strang và video bài giảng.
Nếu mọi người không tin rằng toán học là đơn giản, đó chỉ là vì họ không nhận ra cuộc sống phức tạp như thế nào.
- John von Neumann
Khái niệm hệ điều hành và Hệ điều hành hiện đại là những cuốn sách “kinh điển” về hệ điều hành. Cả hai đều bị chỉ trích vì sự thiếu rõ ràng và không thân thiện với học sinh.
Hệ điều hành: Ba mảnh dễ dàng là một thay thế tốt, được xuất bản trực tuyến và miễn phí. Chúng tôi đặc biệt thích cấu trúc và tính dễ đọc của cuốn sách và cảm thấy rằng các bài tập rất đáng giá.
Sau Hệ điều hành: Ba mảnh dễ dàng, chúng tôi khuyến khích bạn khám phá các quyết định thiết kế của các hệ điều hành cụ thể, thông qua các cuốn sách kiểu “Phía trong của {Tên hệ điều hành}" chẳng hạn như Bài bình luận của Lion về Unix, Thiết kế và triển khai hệ điều hành FreeBSD và Phía trong của Mac OS X. Đối với Linux, chúng tôi đề xuất cuốn sách tuyệt vời Phát triển nhân Linux của Robert Love.
Một cách rất tốt để củng cố sự hiểu biết của bạn về hệ điều hành là đọc mã của một hạt nhân nhỏ và thêm các tính năng. Một lựa chọn là xv6, một phiên bản từ Unix V6 sang ANSI C và x86, nó được duy trì cho một khóa học tại MIT. Hệ điều hành: Ba mảnh dễ dàng có một phụ lục về tiềm năng của xv6 labs, trong đó nêu ra những ý tưởng tuyệt vời cho các dự án tiềm năng.
Thực tế hiện nay có rất nhiều kỹ thuật phần mềm nằm trên máy chủ web và máy khách, nên một trong những lĩnh vực có giá trị tức thì của khoa học máy tính là mạng máy tính. Các sinh viên tự học của chúng tôi, những người nghiên cứu mạng máy tính một cách có phương pháp thấy rằng cuối cùng họ cũng hiểu các thuật ngữ, khái niệm và giao thức mà họ đã nhìn thấy trong trong nhiều năm.
Cuốn sách yêu thích của chúng tôi về chủ đề này là Mạng máy tính: một cách tiếp cận từ tầng trên xuống dưới. Các dự án và bài tập nhỏ trong cuốn sách rất đáng để làm, và chúng tôi đặc biệt thích “Phòng thí nghiệm Wireshark” mà họ cung cấp trực tuyến miễn phí.
Đối với những người thích các bài giảng video, chúng tôi đề xuất Khóa học Giới thiệu về Mạng Máy tính đã được cung cấp trên nền tảng MOOC Lagunita của trường Standford nhưng đáng buồn là bây giờ chỉ có sẵn dưới dạng không chính thức trên Youtube.
Bạn không thể nhìn vào quả cầu pha lê và nhìn thấy tương lai. Những gì Internet sẽ trở thành trong tương lai là những gì xã hội tạo ra nó.
- Bob Kahn
Tự học về hệ thống cơ sở dữ liệu sẽ mất nhiều công sức hơn so với hầu hết các chủ đề khác. Đây là một lĩnh vực nghiên cứu tương đối mới (tức là sau những năm 1970) với những giá trị thương mại lớn cho các ý tưởng tưởng được giữ lại sau các cánh cửa đóng kín. Ngoài ra, nhiều tác giả tiềm năng cho các giáo trình xuất sắc tiềm năng đã muốn tham gia hoặc thành lập các công ty hơn là viết sách.
Trong hoàn cảnh đó, chúng tôi khuyến khích những người tự học nói chung tránh sách giáo khoa và bắt đầu với các video CS 186, đây là khóa học cơ sở dữ liệu của Joe Hellerstein tại Berkeley, sau đó mới tiến sang đọc giáo trình hay tài liệu khác.
Một tài liệu cụ thể rất đáng đề cập đối với sinh viên mới l Kiến trúc của một hệ thống cơ sở dữ liệu. Tài liệu này cung cấp một cái nhìn độc đáo nhằm bao quát về cách hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) hoạt động. Nó sẽ là một nền tảng có ích để các bạn nghiên cứu thêm.
Đọc trong Hệ thống cơ sở dữ liệu, còn hay được gọi là cơ sở dữ liệu “Sách đỏ”, là một bộ sưu tập các bài viết do Peter Bailis, Joe Hellerstein, và Michael Stonebraker biên soạn và chỉnh sửa. Đối với những người đã đạt ngưỡng vượt qua mức nội dung của CS 186, "Sách đỏ" sẽ là điểm dừng tiếp theo của bạn.
Nếu bạn kiên quyết sử dụng sách giáo trình cho người mới học, chúng tôi đề xuất Hệ thống quản lý cơ sở dữ liệu của Ramakrishnan và Gehrke. Đối với sinh viên có hiểu biết tốt hơn, cuốn sách kinh điển của Jim Gray Xử lý giao dịch: Khái niệm và kỹ thuật rất đáng giá, nhưng chúng tôi không không khuyến khích sử dụng những tài liệu này ngay từ đầu.
Cuối cùng, mô hình hóa dữ liệu là một khía cạnh bị bỏ quên và không được chú trọng khi dạy về làm việc với cơ sở dữ liệu. Về chủ đề này, chúng tôi đề xuất Dữ liệu và Thực tế: Quan điểm vượt thời gian về việc nhận thức và quản lý thông tin trong thế giới không chính xác của chúng ta.
Hầu hết các lập trình viên học ngôn ngữ, trong khi hầu hết các nhà khoa học máy tính học về ngôn ngữ. Điều này mang lại cho nhà khoa học máy tính một lợi thế khác biệt so với lập trình viên, ngay cả trong lĩnh vực lập trình! Kiến thức của họ khái quát; họ có thể hiểu hoạt động của một ngôn ngữ mới sâu hơn và nhanh hơn so với những người chỉ đơn thuần học một ngôn ngữ cụ thể.
Chúng tôi đề xuất cuốn giáo trình tuyệt vời được cung cấp miễn phí trực tuyến Crafting Interpreters của Bob Nystrom. Nó được tổ chức tốt, mang tính thư giãn cao và rất phù hợp với những người có mục tiêu chính là hiểu rõ hơn về ngôn ngữ và công cụ cho ngôn ngữ của họ. Chúng tôi khuyên bạn nên dành thời gian để giải quyết toàn bộ vấn đề, thử bất kỳ "thách thức" nào mà bạn quan tâm.
Một đề xuất truyền thống hơn là Trình biên dịch: Nguyên tắc, Kỹ thuật & Công cụ, thường được gọi là “Sách Rồng”. Thật không may, nó không được thiết kế để tự học mà để giảng viên chọn ra các chủ đề có giá trị trong từ 1-2 học kỳ cho các khóa học của họ.
Nếu bạn chọn sử dụng "Sách Rồng", điều quan trọng là bạn phải chọn trước các chủ đề, tốt nhất là với sự giúp đỡ của một người cố vấn. Trên thực tế, nhằm khai thác tối đa "Sách Rồng", chúng tôi đề xuất sử dụng nó như là tài liệu tham khảo bổ sung cho một bài giảng video. Đề xuất của chúng tôi cho là bài giảng video của Alex Aiken trên edX.
Đừng là một lập trình viên dập khuôn. Thay vào đó, hãy xây dựng các công cụ cho người dùng và các lập trình viên khác. Hãy xem lại lịch sử của ngành dệt may và thép: bạn muốn chế tạo máy móc và công cụ, hay bạn muốn vận hành những máy móc đó?
- Ras Bodik nói ở phần mở đầu khóa học trình biên dịch viên của mình
Khi số lượng máy tính tăng lên, chúng cũng lan rộng. Trong khi các doanh nghiệp trước đây thường mua các máy tính càng ngày càng lớn hơn, thì giờ đây việc các ứng dụng thậm chí rất nhỏ chạy trên nhiều máy tính cũng rất phổ biến. Hệ thống phân tán là nghiên cứu về các đánh đổi khi sử dụng nó.
Cuốn sách gợi ý của chúng tôi để tự học là của Martin Kleppmann Thiết kế các ứng dụng chuyên sâu về dữ liệu. Cuốn sách này tốt hơn nhiều so với một cuốn sách giáo trình truyền thống, rất dễ đọc, và được thiết kế cho những người thực hành, tránh được việc tìm hiểu quá sâu và học thuật.
Đối với những người tìm kiếm một giáo trình truyền thống hơn hoặc những người muốn tài liệu được cung cấp miễn phí trực tuyến, chúng tôi khuyên bạn nên sử dụng Hệ thống phân tán, phiên bản thứ 3 của Maarten van Steen và Andrew Tanenbaum.
Đối với những người thích video, một khóa học tuyệt vời với các video trực tuyến là MIT's 6.824, một khóa học sau đại học do Robert Morris giảng dạy với các bài viết được cung cấp tại đây.
Bất kể bạn lựa chọn sách giáo trình hay các tài nguyên thứ cấp khác, việc nghiên cứu các hệ thống phân tán đòi hỏi phải đọc các bài viết nghiên cứu liên quan. Bạn có thể tìm hiểu danh sách này tại đây và chúng tôi thực sự khuyến khích bạn tham dự một nhóm của Papers We Love tại khu vực của bạn.
Trong suy nghĩ của chúng tôi, bạn là một kỹ sư phần mềm tự học, tốt nghiệp từ bootcamp hoặc học sinh phổ thông có khả năng, hoặc một sinh viên đại học đang tìm cách bổ sung cho chương trình giáo dục chính thức của mình bằng cách tự học. Câu hỏi về thời điểm bắt đầu cuộc hành trình này là một câu hỏi hoàn toàn cá nhân đối với mỗi người, nhưng hầu hết mọi người có xu hướng được hưởng lợi từ việc có một số kinh nghiệm chuyên môn trước khi đi quá sâu vào các lý thuyết KHMT. Ví dụ: chúng tôi nhận thấy rằng sinh viên thích học về hệ thống cơ sở dữ liệu nếu họ đã làm việc với cơ sở dữ liệu trong công việc, hoặc về mạng máy tính nếu họ đã làm việc trên một hoặc hai dự án web.
Chúng tôi đã cố gắng giới hạn danh sách của mình trong các chủ đề khoa học máy tính mà chúng tôi cảm thấy mọi kỹ sư phần mềm làm việc thực tế đều nên biết, bất kể chuyên môn hay ngành cụ thể nào. Theo kinh nghiệm của chúng tôi, đây sẽ là những chủ đề đêm lại hiệu quả cao nhất cho phần lớn các kỹ sư tự học và sinh viên tốt nghiệp bootcamp, đồng thời cung cấp một nền tảng vững chắc để nghiên cứu thêm. Sau đó, bạn sẽ ở một vị trí tốt hơn để chọn sách giáo trình hoặc các nghiên cứu, và học các khái niệm cốt lõi mà không cần hướng dẫn nhiều. Dưới đây là các điểm khởi đầu mà của chúng tôi đề xuất cho một số “môn tự chọn” phổ biến:
- Đối với trí tuệ nhân tạo: học Khóa học giới thiệu về AI của trường Berkeley bằng cách xem video và hoàn thành các dự án Pacman. Dưới dạng sách giáo trình, hãy sử dụng sách của Russell và Norvig, mang tên Trí tuệ nhân tạo: Phương pháp tiếp cận hiện đại.
- Đối với học máy: thực hiện khóa học của Andrew Ng trên Coursera. Hãy kiên nhẫn và đảm bảo rằng bạn hiểu các nguyên tắc cơ bản trước khi bắt đầu với các chủ đề mới hấp dẫn hơn như học sâu.
- Đối với đồ họa máy tính: học Berkeley's CS 184, và sử dụng tài liệu Đồ họa máy tính: Nguyên tắc và thực hành dưới dạng sách giáo trình.
Trên thực tế, tất cả các chủ thể này có một số lượng trùng lặp đáng kể và liên quan đến nhau. Ví dụ: mối quan hệ giữa toán học rời rạc và thuật toán: học toán trước tiên sẽ giúp bạn phân tích và hiểu các thuật toán của mình sâu hơn, nhưng học thuật toán trước sẽ cung cấp động lực và bối cảnh lớn hơn cho toán học rời rạc. Tốt nhất, bạn nên xem lại cả hai chủ đề này nhiều lần trong suốt sự nghiệp của mình.
Do đó, thứ tự được đề xuất của chúng tôi chủ yếu ở đó để giúp bạn chỉ việc bắt đầu... nếu bạn có lý do thuyết phục để chọn một trình tự khác, thì hãy tiếp tục với nó. “Điều kiện tiên quyết” quan trọng nhất theo quan điểm của chúng tôi là: kiến trúc máy tính trước hệ điều hành hoặc cơ sở dữ liệu, mạng và hệ điều hành trước hệ thống phân tán.
Khi hướng dẫn này được viết lần đầu tiên vào năm 2016, Hướng dẫn phần mềm nguồn mở OSS có quá nhiều chủ đề, đề xuất nhiều tài liệu không tốt cho nhiều chủ đề, và không cung cấp lý do cụ thể về việc tại sao hoặc khía cạnh nào của các khóa học có giá trị. Chúng tôi đã cố gắng giới hạn danh sách các khóa học của mình mà bạn thực sự nên biết với tư cách là một kỹ sư phần mềm bất kể chuyên môn của bạn, và giúp bạn hiểu lý do tại sao mỗi khóa học được bao gồm. Trong những năm tiếp theo, "Hướng dẫn phần mềm nguồn mở OSS" đã được cải thiện, nhưng chúng tôi vẫn nghĩ rằng hướng dẫn này của chúng tôi cung cấp một con đường rõ ràng và gắn kết hơn.
freeCodeCamp chủ yếu tập trung vào lập trình, không phải khoa học máy tính. Để biết lý do tại sao bạn có thể muốn học khoa học máy tính, hãy xem lại ở trên. Nếu bạn chưa quen với lập trình, chúng tôi khuyên bạn nên ưu tiên làm điều đó và quay lại hướng dẫn này sau một hoặc hai năm.
Học một ngôn ngữ lập trình cụ thể hoàn toàn khác với việc học về một lĩnh vực khoa học máy tính - học một ngôn ngữ sẽ dễ dàng hơn và ít giá trị hơn nhiều. Nếu bạn đã biết một vài ngôn ngữ, chúng tôi thực sự khuyên bạn chỉ cần làm theo hướng dẫn của chúng tôi và ghép nối giữa ngôn ngữ bạn biết và các khoảng trống kiến thức. Nếu bạn đã học lập trình tốt (chẳng hạn như thông qua Cấu trúc và diễn giải các chương trình máy tính), và đặc biệt là nếu bạn đã học trình biên dịch, bạn chỉ sẽ mất hơn một tuần để học những điều cần thiết của một ngôn ngữ mới, sau đó bạn có thể tìm hiểu về các thư viện/công cụ/hệ sinh thái trong công việc.
Không có công nghệ đơn lẻ nào là đủ quan trọng để trở thành một phần cốt lõi trong quá trình học tập và tìm hiểu của bạn. Tuy nhiên, thật tuyệt khi bạn rất hào hứng khi tìm hiểu về công nghệ đó. Bí quyết là làm việc từ công nghệ cụ thể, học sang lĩnh vực hoặc khái niệm cơ bản, và tìm hiểu sâu về điều đó trước khi xem công nghệ thời thượng của bạn phù hợp như thế nào với bức tranh lớn hơn.
Bạn hãy nhìn xem. Một số người thấy "Cấu trúc và diễn giải các chương trình máy tính" (SICP) thật sự khó hiểu và đau đầu, đây là một đặc điểm mà rất ít cuốn sách khác có đặc điểm chung. Nếu bạn không thấy thích cuốn sách này, bạn luôn có thể thử một cái gì đó khác và quay lại với SICP sau.
"Sách Rồng" vẫn là tài liệu đơn lẻ đầy đủ nhất cho các trình biên dịch. Nó có một đoạn tệ, thường là do nhấn mạnh quá mức vào một số chủ đề không còn phù hợp để đề cập chi tiết ngày nay, chẳng hạn như parsing (phân tích). Vấn đề là, cuốn sách không bao giờ có ý định nghiên cứu từ trang đầu đến trang cuối, mà nó chỉ nhằm cung cấp nguồn tài liệu đầy đủ cho một giảng viên tổng hợp chúng thành một khóa học. Tương tự, một người tự học có thể chọn cuộc lối đi của riêng họ thông qua cuốn sách, hoặc tốt hơn là làm theo những gợi ý mà các giảng viên đã đưa ra trong các tóm tắt khóa học của họ.
Nhiều sách giáo trình mà chúng tôi đề xuất được cung cấp miễn phí trên mạng, nhờ sự hào phóng của tác giả. Đối với những sách không có, chúng tôi khuyên bạn nên mua các cuốn sách đã qua sử dụng của các phiên bản cũ hơn. Theo nguyên tắc chung, nếu đã có nhiều hơn một vài ấn bản sách giáo trình, thì rất có thể một phiên bản cũ hơn là hoàn toàn phù hợp. Chắc chắn một điều là phiên bản mới nhất tốt không thể tốt hơn 10 lần so với phiên bản cũ hơn, ngay cả khi đó là sự khác biệt về giá giữa hai phiên bản!
Hướng dẫn này ban đầu được viết bởi Oz Nova và Myles Byrne, với các cập nhật vào 2020 của Oz. Nó dựa trên kinh nghiệm của chúng tôi giảng dạy kiến thức khoa học máy tính nền tảng cho hơn 1000 kỹ sư chủ yếu là tự học và sinh viên tốt nghiệp bootcamp mà học trong các nhóm nhỏ ở San Francisco hay trực tuyến. Cảm ơn tất cả các sinh viên của chúng tôi vì đã tiếp tục phản hồi về các nguồn tài liệu tự học.
Chúng tôi rất tự tin rằng bạn có thể tự học mọi thứ ở trên, nếu có đủ thời gian và động lực. Nhưng nếu bạn thích một chương trình chuyên sâu, có cấu trúc, có người hướng dẫn, bạn có thể quan tâm đến khoá học về máy tính trên https://bradfieldcs.com/csi/ của chúng tôi. Chúng tôi KHÔNG khuyên bạn theo đuổi bằng thạc sĩ.
Để nhận các cập nhật mới về hướng dẫn này, tin tức và tài liệu về ngành khoa học máy tính, bạn có thể đăng ký email của bạn với Bradfield: [truy cập vào cuối trang https://teachyourselfcs.com/ để đăng ký].
hello@bradfieldcs.com. Sanfrancisco, California. © 2016-2020 Trường Khoa học Máy tính Bradfield.