Tự học Khoa học Máy Tính¶
Dành cho những bạn muốn học thông qua các chương trình học bằng Tiếng Việt (Sẽ vẫn phải sử dụng một phần Tiếng Anh trong quá trình học). Giáo trình này được phát triển và truyền cảm hứng bởi TeachYourselfCS.
Nếu bạn có thể học dựa trên giáo trình gốc với các bài giảng bằng Tiếng Anh, mình gợi ý mọi người dành thời gian để học giáo trình của TeachYourselfCS hoặc OSSU. Giáo trình này cũng sẽ đặt các cuốn sách Tiếng Anh tương ứng cho mọi người có thể chọn.
Tóm tắt¶
Học tất cả 9 chủ đề dưới đây (Không tính Tiếng Anh, ta sẽ học Tiếng Anh song song với chương trình này), nên theo thứ tự, sử dụng loạt bài giảng video hoặc sách giáo trình được gợi ý dưới đây, lý tưởng nhất là học cả hai. Dành khoảng 100-200 giờ học cho mỗi chủ đề (Không tính Tiếng Anh), bạn hoàn toàn có thể quay lại học nếu muốn tìm hiểu sâu thêm.
Chủ đề | Lý do cần học | Sách | Video bài giảng |
---|---|---|---|
Tiếng Anh | Việc học Tiếng Anh là điều bắt buộc cho việc học Khoa học máy tính hay trong thế giới hiện đại | Không giới hạn | Không giới hạn |
Lập trình | Đừng là người "không hiểu rõ" về một thứ như đệ quy. | ||
Kiến trúc máy tính | Có nền tảng vững chắc về cách máy tính thực sự hoạt động giúp việc lập trình của bạn trở nên vững chắc hơn | ||
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ó. | ||
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ế không nhỏ. | ||
Hệ điều hành | Hầu hết các đoạn code bạn viết được chạy trên một hệ điều hành, vì vậy bạn nên biết chúng hoạt động như thế nào. | ||
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ó. | ||
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. | ||
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 code tốt hơn và học ngôn ngữ mới dễ dàng hơn. | ||
Hệ thống phân tán | Ngày nay, hầu hết hệ thống đều phân tán. |
Tại sao phải học khoa học máy tính?¶
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ỉ học ngọn, 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ướng dẫn chi tiết cho các chủ đề¶
Trước khi bắt đầu¶
Có rất nhiều lập trình viên nhắc về việc HỌC TIẾNG ANH ĐI!!! mỗi khi hỏi đáp về các vấn đề trong việc tự học lập trình. Điều này không hề sai, nhưng lời khuyên này thực sự rất tệ vì nó chẳng có ích gì cho bạn cả.
Bạn hoàn toàn có thể đọc luôn các sách Tiếng Anh trong giáo trình TeachYourselfCS, nhưng có hai vấn đề:
- Bạn sẽ phải tra từ rất nhiều.
- Bạn sẽ không thể hiểu nhiều nhất những gì người ta đã viết ra.
Nên điều này đã dẫn đến một lựa chọn khác, học Tiếng Anh song song với việc học các giáo trình KHMT bằng Tiếng Việt để:
- Cải thiện Tiếng Anh của bạn dần dần.
- Vẫn nâng cao hiểu biết về KHMT của bạn.
Việc học bằng Tiếng Việt hay Tiếng Anh là không quan trọng cho các chủ đề cốt lõi này. Tất nhiên, các giáo trình bằng Tiếng Anh của MIT hay trên các trang MOOCs sẽ có nhiều nội dung và đi sâu hơn các chương trình sẽ được gợi ý dưới đây. Nhưng vì chương trình tập trung vào xây dựng nền tảng nên không vấn đề gì!
Tiếng Anh¶
Việc học một ngôn ngữ là cả một quá trình dài. Điều này được viết ra không phải để làm bạn nản lòng, bạn cần phải chấp nhận rằng bạn sẽ phải dành ra rất nhiều thời gian để học ngoại ngữ dù bằng cách nào đi nữa, không có đường tắt nào cả.
Rất nhiều chuyên ngành bây giờ đều đòi hỏi Tiếng Anh ở một mức độ nhất định, nhưng riêng với KHMT thì nó là rất nhiều. Khá nhiều lập trình viên đã tự đánh giá rằng mức Tiếng Anh của họ là đủ đề đọc tài liệu nên mình nghĩ là mọi người đều không hoàn toàn mất gốc.
Dành cho những người mà nghĩ mình không biết một chút gì về Tiếng Anh, hãy bắt đầu bằng cách học một chương trình học cơ bản, mình gợi ý chương trình 30 ngày Tiếng Anh (Cho những người có thể dành thời gian khoảng ít nhất 2 giờ mỗi ngày cho việc học Tiếng Anh). Bạn có thể chọn bất kì chương trình nào bạn muốn, với một tâm thế rằng bạn dành càng nhiều thời gian thì tốc độ lên trình của bạn càng nhanh.
Bạn cũng cần học về cách học ngoại ngữ nữa, bạn có thể lựa chọn một trong hai hướng dẫn sau:
- Tự luyện ngoại ngữ - Được tổng hợp bởi Khu học mở. Trang hướng dẫn cách học ngoại ngữ, cách xây dựng môi trường tự học ngoại ngữ và các bài hướng dẫn khác. Sau đó bạn sẽ đọc trang Tự luyện Tiếng Anh để đọc hướng dẫn riêng cho Tiếng Anh và truy cập các tài nguyên tự học. Các bài đọc sẽ khá dài nhưng sẽ giúp bạn xây dựng phương pháp tự học ngoại ngữ và định hướng tự học hàng ngày.
- Mình đã tự học tiếng Anh như thế nào? (Hướng dẫn chi tiết) - Hướng dẫn của bác heiji_hattori trên Voz.
Bạn sẽ học Tiếng Anh song song với việc học Khoa học máy tính. Việc học Tiếng Anh sẽ không bao giờ có điểm dừng vì bạn càng học, bạn càng giỏi, nhưng chắc chắn sẽ đến một mức mà bạn có thể học thông qua những cuốn sách chất lượng bậc nhất bằng Tiếng Anh như SICP (2nd Edition, sử dụng Scheme) hay CS:APP.
Lập trình¶
Gợi ý của bọn mình cho phần này là bản dịch Tiếng Việt của cuốn SICP (Chưa có!!). Thay vào đó bạn có thể bắt đầu bằng khóa CS50 Vietsub trên Youtube.
Sau khi học xong chương trình được gợi ý, bạn có thể thực hành lập trình bằng cách giải một loạt các bài tập về lập trình trên exercism.io (Hoặc bất kì trang nào mà bạn thích!).
Kiến trúc máy tính¶
Kiến trúc 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.
Một khóa học hiếm hoi mà mình tìm được bằng Tiếng Việt là khóa IT3030. Các tài nguyên hỗ trợ việc học IT3030:
- Giáo trình: Computer Organization And Design
- Khóa học: Kiến trúc máy tính (IT3030) - SOICT HUST
- Slide bài giảng
- Thông tin thêm về khóa học cũng như các nguồn tài nguyên
Thuật toán và cấu trúc dữ liệu¶
Làm quen 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à điểm 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.
Để thực hành, bạn có thể giải các bài toán trên Leetcode.
Tôi chỉ có một phương pháp mà tôi muốn chia sẻ. Đó là suy nghĩ trước khi viết.
- Richard Hamming
Toán cho KHMT¶
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à Giáo trình toán rời rạc - Tổ hợp và đồ thị của Nguyễn Hoàng Thạch.
Nếu bạn muốn tìm hiểu sâu hơn, thì cá nhân mình gợi ý cuốn GIÁO TRÌNH TOÁN RỜI RẠC của NGUYỄN ĐỨC NGHĨA và NGUYỄN TÔ THÀNH. Về video bài giảng thì mình gợi ý danh sách phát Toán rời rạc của TITV
Đối với đại số tuyến tính, bạn có thể xem danh sách phát Đại số tuyến tính của Giang Le hoặc đọc cuốn Giáo trình đại số Tuyến tính của Bùi Xuân Diệu.
Mình không thấy TeachYourselfCS đề cập đến Toán cao cấp, nhưng nếu bạn muốn học Toán cao cấp nữa thì có thể sử dụng 3 cuốn Giáo trình toán cao cấp được biên soạn bởi Nguyễn Đình Trí, Tạ Văn Đĩnh và Nguyễn Hồ Quỳnh.
Hệ điều hành¶
Theo quan sát của mình thì môn học này thường được dạy đầu tiên trong các chương trình đào tạo bậc đại học. Nhưng ở trong chương trình này thì mình khuyến khích bạn đã phát triển tương đối về mặt kiến thức thông qua các môn ở trên trước khi bắt đầu.
Gợi ý của cá nhân mình là cuốn GIÁO TRÌNH HỆ ĐIỀU HÀNH (OPERATING SYSTEM) được biên soạn bởi Ninh Xuân Hải và Huỳnh Trọng Thưa. Về video bài giảng, bạn có thể xem Nguyên lý hệ điều hành (IT3070) - SOICT HUST
Mạng máy tính¶
Có rất nhiều kỹ thuật phần mềm nằm trên web server và client, nên một trong những lĩnh vực có giá trị của khoa học máy tính là mạng máy tính.
Bạn có thể đọc BÀI GIẢNG MẠNG MÁY TÍNH được biên soạn bởi ThS. Nguyễn Xuân Anh.
Cơ sở dữ liệu¶
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.
Những người tự học nói chung nên tránh sách giáo khoa và bắt đầu với Cơ sở dữ liệu (IT3090) - SOICT HUST
Còn về sách đọc thì chưa tìm được.
Ngôn ngữ và Trình biên dịch¶
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ể.
Về gợi ý thì có duy nhất cuốn Crafting Interpreters của Bob Nystrom (Không tìm được tài liệu Tiếng Việt).
Đừ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
Hệ thống phân tán¶
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ó.
Bạn có thể học theo khóa học IT4611 của Bách Khoa, được dạy bởi Trần Hải Anh nên yên tâm về chất lượng nha:
- Thông tin toàn bộ khóa học trên trang của giảng viên
- Giáo trình: Distributed Systems: Principles and Paradigms
- Video bài giảng: Các hệ thống phân tán và ứng dụng (IT4611) - SOICT HUST
- Tài liệu môn
- Example Code: Example code distributed system IT4611
Nếu bạn muốn đọc các cuốn sách bằng Tiếng Anh chuyên sâu hơn thì:
- Cuốn Thiết kế các ứng dụng chuyên sâu về dữ liệu ( Designing Data-Intensive Applications (DDIA))
- Hệ thống phân tán, phiên bản thứ 3 của Maarten van Steen và Andrew Tanenbaum (Cuốn này miễn phí) Hoặc là khóa 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.
Bổ sung thêm¶
Học sâu hơn về các định hướng cụ thể¶
Nếu bạn vẫn học Tiếng Anh và chương trình trên đều thì bạn đã có một lượng kiến thức Khoa học máy tính tương đối rồi đó. Bây giờ bạn có thể:
- Đọc các cuốn sách thuộc các chủ đề ở trên lộ trình (Như Lập trình thì là SICP hoặc Kiến trúc máy tính thì là CS:APP chẳng hạn).
- Lập trình thực tế các thứ, hoặc cái gì cũng được.
Đi theo chuyên ngành hẹp: Advanced CS của ossu/computer-science
Một số câu hỏi¶
Đối tượng mục tiêu của hướng dẫn này?¶
Kỹ sư phần mềm tự học, học từ bootcamp, học sinh phổ thông, 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 (Hoặc bất kì ai)
Còn ngôn ngữ X thì sao?¶
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.