CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN Lộ trình học phát triển máy chủ nền Linux C/C++ này được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Lời nói đầu
Chủ đề của bài viết này là "Lộ trình học tập phát triển máy chủ/phụ trợ Linux C/C++".
Tôi tin rằng mọi người đã xem rất nhiều bài viết như thế này. Tôi đã rất lo lắng trước khi viết nó và đặt ra mục tiêu. Bài viết này không thể chỉ tổng hợp các tài nguyên học tập và đề xuất sách mà còn trình bày chi tiết cách thực hiện chúng một cách hiệu quả.
Hãy cố gắng làm cho những học sinh nhìn thấy nó có cảm giác như họ đã đến muộn, hahaha.
Vậy bạn có thể thử xem qua giúp tôi kiểm tra xem nó có đạt được hiệu quả như mong đợi không nhé. Hi vọng bạn sẽ không bị tát vào mặt.
Vậy thì hãy chính thức bắt đầu.
Bài viết này sẽ hơi dài và khô khan nên bạn có thể pha một tách cà phê trước và đọc từ từ nhé.
Văn bản | Thông tin khô khan |
1. Phát triển backend/backend/server?
Chúng ta thường thấy phụ trợ, phụ trợ, phát triển máy chủ, v.v. trong tuyển dụng của các công ty lớn. Một số sinh viên thường nhầm lẫn với các thuật ngữ này.
Trên thực tế, các thuật ngữ này tương tự nhau nhưng có một số khác biệt. Dưới đây là cách hiểu của tôi:
- Trước hết, các công ty thường được chia thành front-end và back-end. Front-end giao dịch với người dùng và chịu trách nhiệm trình bày dữ liệu cho người dùng với hiệu ứng hình ảnh tốt. Front-end rộng bao gồm các máy khách (Android, iOS), Giao diện người dùng web, các chương trình nhỏ, v.v.
- Back-end tương ứng chịu trách nhiệm xử lý logic kinh doanh, chẳng hạn như đặt hàng, thanh toán, v.v., tập trung vào việc xử lý các quy trình kinh doanh.
Phần cuối thường có nghĩa giống như phần phụ trợ, trong khi phát triển máy chủ có phạm vi rộng hơn một chút, không chỉ bao gồm phát triển phần phụ trợ mà còn phát triển cơ bản hỗ trợ toàn bộ ứng dụng phần phụ trợ, chẳng hạn như công cụ tìm kiếm, microservice, khung RPC, KV, bộ lưu trữ, MQ, v.v. .
Nền/phụ trợ tập trung vào xử lý nghiệp vụ và thiên về phát triển lớp ứng dụng, trong khi phát triển máy chủ không chỉ bao gồm phát triển lớp ứng dụng mà còn bao gồm việc phát triển toàn bộ các thành phần liên quan hỗ trợ nghiệp vụ phụ trợ.
Vậy việc phát triển máy chủ/phụ trợ Linux C/C++ đề cập đến điều gì? Nó thực sự dựa trên lập trình C++ trên Linux.
Tuy nhiên, so với hệ thống Java, người ta chú trọng nhiều hơn đến khả năng lập trình hệ thống và lập trình mạng Linux, đồng thời một số cũng liên quan đến việc phát triển các giao thức cơ bản phía máy chủ và các khung mạng.
Phát triển phụ trợ Java và Go truyền thống ưu tiên phát triển Web, nghĩa là nhận các yêu cầu từ giao diện người dùng, gọi nhau thông qua các dịch vụ vi mô, hoàn thành xử lý logic nghiệp vụ và sau đó quay lại giao diện người dùng.
Trên thực tế, quá trình phát triển phụ trợ C++ của Tencent cũng tương tự. Nó có một hệ thống microservice rất hoàn thiện dựa trên C++. Hầu hết quá trình phát triển chỉ cần tập trung vào logic nghiệp vụ, nhưng nó vẫn yêu cầu khả năng lập trình hệ thống Linux, lập trình mạng, v.v.
2. Kiểm tra phát triển phụ trợ là gì?
Nói chung, việc phát triển nền tảng Linux C/C++ bao gồm những kiến thức cơ bản sau:
- Các tính năng và nguyên tắc triển khai của ngôn ngữ C/C++
- mạng máy tính
- Lập trình mạng và lập trình hệ thống Linux
- Nguyên tắc hệ điều hành
- Một số nguyên tắc nhân Linux, chẳng hạn như quản lý bộ nhớ, hệ thống tệp, bộ nhớ ảo, v.v.
- Các lệnh Linux phổ biến được sử dụng
- Thuật toán và cấu trúc dữ liệu
- Nguyên tắc và cách sử dụng cơ sở dữ liệu
- Các thành phần NoSQL phổ biến, chẳng hạn như Redis và Memcached
- Kiểm soát phiên bảnGit
Điểm thưởng tùy chọn:
- Phân phối liên quan, chẳng hạn như các giao thức nhất quán như thuật toán Raft, lưu trữ phân tán, v.v.
- Docker, k8s và các vấn đề liên quan đến ảo hóa và điện toán đám mây khác
- Khả năng thiết kế hệ thống, chẳng hạn như dịch vụ chuỗi ngắn, dịch vụ nhận xét, hệ thống luồng cấp dữ liệu, lấy phong bì màu đỏ, bán hàng chớp nhoáng, v.v.
Do hạn chế về số lượng nên bài viết này chủ yếu giới thiệu lộ trình và phương pháp học các kiến thức cơ bản, các điểm thưởng khác sẽ viết riêng sau.
3、C/C++
Đầu tiên là những kiến thức cơ bản về ngôn ngữ, một số từ khóa và nguyên tắc thực hiện, v.v.:
- con trỏ, tham chiếu, mảng, bộ nhớ
- Sự khác biệt giữa tham chiếu và con trỏ
- Một số khác biệt giữa C và C++, chẳng hạn như sự khác biệt giữa mới, xóa, malloc và miễn phí
- Cơ chế ảo: hàm ảo, bảng hàm ảo, hàm ảo thuần túy
- Thừa kế, thừa kế ảo, thừa kế kim cương, v.v.
- Đa hình: liên kết động, đa hình tĩnh
- viết lại, tải lại
- Nguyên tắc con trỏ thông minh: tính tham chiếu, ý tưởng RAII (thu thập tài nguyên là khởi tạo)
- Cách sử dụng con trỏ thông minh: Shared_ptr, Yếu_ptr, Unique_ptr, v.v.
- Chức năng của một số từ khóa: static, const,volatile, extern
- Chuyển đổi bốn loại: static_cast, Dynamic_cast, const_cast, reinterpret_cast
- Nguyên tắc triển khai của một số vùng chứa STL, chẳng hạn như vectơ, deque, bản đồ, hashmap
- Chuyên môn hóa mẫu, chuyên môn hóa một phần, kỹ thuật trích xuất đặc điểm
- Cơ chế biên dịch và liên kết, bố trí bộ nhớ, mô hình đối tượng
- Một số tính năng mới của C++ 11, chẳng hạn như tham chiếu giá trị, chuyển tiếp hoàn hảo, v.v.
Những gì được liệt kê ở đây chỉ là một số phần quan trọng hơn. Trên thực tế, nó có thể chỉ là phần nổi của tảng băng chìm của C++. Hãy cùng tìm hiểu và trân trọng nó. Đây không phải là C++ 11. ++20 lại ra đời. Cuộc sống là vô tận, hãy học hỏi nhiều hơn thế.
Làm thế nào để học?
1. 《C++ Primer》 .
Cuốn sách này về cơ bản bao gồm tất cả các tính năng của C++ 11. Tốt nhất nên đọc ba phần đầu tiên: Kiến thức cơ bản về C++, thư viện chuẩn C++ và các công cụ của nhà thiết kế lớp. Tôi đã dành hơn một tháng để đọc không liên tục các Mẫu của Chương 16.
2. Từ vựng hiệu quả:《C++ hiệu quả》、《C++ hiệu quả hơn》、《STL hiệu quả》 。
Cuốn sách đầu tiên là điểm mấu chốt. Nếu bạn chỉ đọc "C++ Primer" và thiếu thực hành, rất có thể bạn sẽ không thể viết được mã C++ đủ tiêu chuẩn. tiêu chuẩn. Nó có thể rút ngắn thời gian để bạn viết mã C++ đủ tiêu chuẩn và giảm bớt những sai sót. Bạn nên đọc hai cuốn sách sau đây có mức độ ưu tiên thấp hơn một chút, vì vậy bạn có thể đọc lại khi có thời gian.
3. "Phân tích mã nguồn STL" và "Khám phá chuyên sâu về mô hình đối tượng C++".
Sau khi đọc Primer và Efficiency, bạn sẽ có thể sử dụng C++ tương đối thành thạo, nhưng bạn vẫn chưa hiểu rõ về cơ chế triển khai cơ bản của C++. Chẳng hạn như bảng chức năng ảo, bố cục biến thành viên, v.v. Đồng thời, thư viện STL chỉ có thể được sử dụng.
Hai cuốn sách được đề xuất lần lượt có thể nâng cao hiểu biết của bạn về cách triển khai cơ bản của mã nguồn và nguyên tắc C++ và STL.
Chúng tôi cũng khuyên bạn nên sử dụng những cuốn sách trên cùng với video của giáo viên Hou Jie để có kết quả tốt hơn.
Chỉ cần tìm kiếm "Hojie C++" trực tiếp trên trạm B. Chủ yếu có các dòng sau:
- "Quản lý bộ nhớ C++"
- "Phân tích mã nguồn STL"
- "C++ STL và lập trình chung nâng cao"
- "Tính năng mới của C++11"
Về cơ bản, tôi đã đọc hết và tôi đã học được khá nhiều điều từ chúng. Tôi khuyên bạn nên đọc chúng với tốc độ gấp đôi.
Sau khi đọc những thông tin trên, tôi đã bắt đầu làm quen với C++. Về cơ bản tôi đã đạt được trình độ sử dụng C++ một cách chính xác và hiệu quả.
Bạn có hơi thất vọng sau khi nghe điều này? Tại sao bạn lại đọc nhiều như vậy trước khi bắt đầu? ? ?
Nếu bạn muốn tiến xa hơn trong ngôn ngữ C++ thì nên đọc những cuốn sách sau:
- "Thiết kế và sự phát triển của ngôn ngữ C++"
Cuốn sách này được viết bởi Bjarne Stroustrup, cha đẻ của C++. Về quá trình phát triển trong quá khứ, hiện tại và tương lai của C++, bạn có thể tìm hiểu về triết lý thiết kế của C++. Các tính năng ngôn ngữ phức tạp của C++ luôn bị chỉ trích. Thông qua cuốn sách này, bạn có thể thấy mục đích của việc giới thiệu các tính năng khác nhau và hiểu sâu hơn về mối quan hệ giữa C và C++. Ví dụ, có một nguyên tắc trong C++ là tất cả các cơ chế triển khai không được mang lại thêm chi phí thời gian chạy.
Tôi cũng đang đọc cuốn sách này.
- "Thiền C++"
- "Mẫu C++" và "Lập trình siêu mẫu C++"
Một số cuốn sách kinh điển về C/C++ cũng được tóm tắt ở đây:

Lập trình siêu mẫu C++ thuộc về một thế giới khác. Nó hiếm khi được sử dụng trong quá trình phát triển ở các công ty nói chung. Đây cũng là một cạm bẫy lớn. Nếu bạn thực sự quan tâm, bạn có thể xem qua và cảm nhận chiều rộng và chiều sâu của C++. cũng rất giỏi về thứ này. Tôi không khuyên bạn nên dành thời gian cho nó.
Video CppCon.
Điều này tương tự như một hội nghị thượng đỉnh về nguồn mở do cộng đồng C++ tổ chức. Một số chủ đề về C++ được thảo luận mỗi lần khá thú vị. Chỉ cần tìm kiếm CppCon trên Youtube để tìm thấy nó.
4. Hệ điều hành
Tôi cảm thấy rằng khóa học về hệ điều hành dễ học và khó thành thạo, nhưng việc thành thạo lập trình và phỏng vấn hàng ngày lại tương đối dễ dàng.
Vậy sinh viên tốt nghiệp hoặc bạn nên chuẩn bị ở cấp độ nào cho cuộc phỏng vấn tuyển dụng của trường?
- Kiến thức lý thuyết về bốn mô-đun chính của HĐH: quản lý tiến trình và luồng, quản lý bộ nhớ, IO và hệ thống tệp cũng như quản lý thiết bị
- Hiểu một số nguyên tắc triển khai của nhân Linux, chẳng hạn như quản lý bộ nhớ, quản lý tiến trình, hệ thống tệp ảo, v.v.
Trong số đó, bộ nhớ, quy trình và IO là những điểm chính và đây là những điểm liên quan chặt chẽ nhất đến lập trình. Bạn nên đọc một số sách lý thuyết trước để hiểu toàn cảnh về hệ điều hành:
- "Hệ điều hành hiện đại"
- "Hệ điều hành - Bản chất và Nguyên tắc thiết kế"
Bạn không cần phải đọc hết, cái nào cũng tốt. Tôi đọc kỹ cái thứ hai vì đây là sách giáo khoa của chúng tôi và tôi cũng đã chọn một số chương về hệ điều hành hiện đại.
Sau khi đọc phần này, bạn nên hiểu rõ các chủ đề sau:
- Một hệ điều hành bao gồm những gì?
- Trạng thái quy trình, chuyển đổi và lập lịch
- Phương thức giao tiếp giữa các quá trình (bộ nhớ dùng chung, đường dẫn, tin nhắn)
- Sự khác biệt giữa tiến trình và luồng
- Cách triển khai các luồng (một-một, nhiều-một, v.v.)
- Loại trừ và đồng bộ hóa lẫn nhau (semaphores, màn hình, khóa)
- Phát hiện và tránh bế tắc
- Các vấn đề tương tranh cổ điển: vấn đề người đọc-người viết, vấn đề triết gia ăn uống
- Tại sao cần có bộ nhớ ảo? MMU thực hiện dịch địa chỉ như thế nào?
- Tại sao bộ nhớ được phân đoạn và phân trang?
- Thuật toán thay thế trang
- Hệ thống tập tin được tổ chức như thế nào
- Hệ thống tệp ảo (VFS) được trừu tượng hóa như thế nào
- ...
Nhưng điều này vẫn chưa đủ, sau khi đọc cuốn sách lý thuyết, khi người phỏng vấn hỏi “sự khác biệt giữa quy trình và chủ đề”.
Tôi có lẽ chỉ có thể trả lời một câu trả lời đúng nhưng phổ biến như "Quy trình là đơn vị phân bổ tài nguyên nhỏ nhất và luồng là đơn vị lập lịch CPU nhỏ nhất, balabala...".
Nhưng nếu bạn hiểu cách triển khai nhân Linux, bạn thực sự có thể bắt đầu bằng cách nói về cách tạo ra các tiến trình và luồng trong Linux cũng như sự khác biệt là gì.
Ví dụ, trong Linux, các tiến trình và luồng thực sự sử dụng cấu trúc task_struct để biểu diễn một thực thể thực hiện các tác vụ. Việc tạo quy trình gọi lệnh gọi hệ thống fork, trong khi việc tạo luồng sử dụng phương thức pthread_create, nhưng cuối cùng cả hai phương thức sẽ gọi do_fork để thực hiện các thao tác tạo cụ thể.
Nếu tìm hiểu sâu hơn, bạn sẽ thấy rằng cách Linux triển khai các luồng đơn giản là quá thông minh. Trên thực tế, không có luồng nào cả. Những gì nó tạo ra chỉ là một tiến trình. bảng trang, v.v.) giữa nhiều quy trình mô tả tệp, v.v.), ngăn xếp lệnh gọi hàm, các thanh ghi và dữ liệu riêng tư của luồng khác là độc lập.
Điều này có rất phù hợp với định nghĩa trong sách lý thuyết: nhiều luồng trong cùng một tiến trình chia sẻ tài nguyên của tiến trình, nhưng các luồng không sở hữu tài nguyên mà chỉ sử dụng chúng.
Điều này cũng phù hợp với triết lý Unix - KISS (Keep It Simple, Stupid).
Tuy nhiên, trong các hệ thống khác cung cấp hỗ trợ luồng chuyên biệt, một con trỏ chứa con trỏ tới tất cả các luồng của tiến trình sẽ được thêm vào khối điều khiển tiến trình (PCB), và sau đó mỗi luồng sẽ chứa các tài nguyên độc quyền của riêng nó.
Đây là một phương pháp triển khai rất chính thống, ví dụ như Windows thực hiện điều này.
Nhưng nếu so sánh thì Linux dường như có nhiều thủ thuật và rất đơn giản.
Về quy trình và luồng, bạn cũng có thể hiểu rõ mối quan hệ giữa các mô-đun fork, vfork, clone và pthread_create, điều này sẽ giúp ích rất nhiều cho sự hiểu biết của bạn về việc triển khai quy trình trong Linux.
Đã nói tất cả những điều này, tôi chỉ muốn nhấn mạnh tầm quan trọng của việc tích hợp lý thuyết với thực hành.
Đặc biệt đối với các hệ điều hành, cách tốt nhất là xem cách triển khai nhân Linux. Tất nhiên, bạn không được yêu cầu đọc trực tiếp mã nguồn Linux, đây không phải là điều mà người bình thường có thể thành thạo.
Cách tốt nhất là đọc một cuốn sách, bạn sẽ hiểu rõ bối cảnh của cuốn sách.
Sách gợi ý:
- "Thiết kế và triển khai hạt nhân Linux"
Cuốn sách này rất đúng, nó giải thích rõ ràng những điểm chính của việc triển khai kernel mà không cần xem qua toàn bộ mã nguồn.
Cuốn sách này tập trung vào "Chương 3 Quản lý quy trình", "Chương 5 Cuộc gọi hệ thống", "Chương 12 Quản lý bộ nhớ", "Chương 13 Hệ thống tệp ảo", "Chương 15 Không gian địa chỉ quy trình".
Các chương này thuộc về phần cốt lõi của hệ điều hành. Các chương khác như xử lý ngắt, chặn IO và quản lý thiết bị có thể được đọc theo sở thích của bạn.
Về cơ bản, nếu bạn làm điều này thì sẽ không có vấn đề gì lớn với hệ điều hành.
5. Mạng máy tính
Các giao thức mạng và kiến thức cần có:
- HTTP, TCP, IP, ICMP, UDP, DNS, ARP
- Địa chỉ IP, địa chỉ MAC, mô hình bảy lớp OSI (hoặc mô hình năm lớp TCP/IP)
- Liên quan đến bảo mật HTTPS: chữ ký số, chứng chỉ số, TLS
- Các cuộc tấn công mạng phổ biến: tràn lan LAN ARP, DDoS, TCP SYN Flood, XSS, v.v.
Kiến thức về mạng máy tính tương đối phức tạp. Nhiều sinh viên cho rằng mạng rất khó học. Sau khi học nhiều giao thức mạng, các em vẫn chưa biết mạng có cấu trúc như thế nào.
Đây là việc học không đúng phương pháp, dẫn đến chỉ nhìn thấy cây mà không nhìn thấy rừng.
Khi nghiên cứu, bạn nên nắm bắt chủ đề chính "Gói dữ liệu được gửi như thế nào?"
Với câu hỏi này, chúng tôi nghiên cứu lần lượt lớp ứng dụng, lớp vận chuyển, lớp mạng và lớp liên kết và suy nghĩ về cách các lớp này được kết nối nối tiếp.
Đây là cách tiếp cận từ trên xuống, vì vậy việc đề xuất là điều tự nhiên
- "Mạng máy tính: Cách tiếp cận từ trên xuống"
Cuốn sách này bắt đầu với các giao thức lớp ứng dụng mà chúng ta thường xuyên tiếp xúc nhất, chẳng hạn như HTTP, FTP, SMTP, v.v. và chúng ta có thể thấy rõ vai trò của việc giới thiệu từng lớp.
Ví dụ, để phân biệt các ứng dụng khác nhau trên cùng một máy chủ, lớp vận chuyển được đưa vào và các số cổng khác nhau được sử dụng để phân biệt;
Để truyền dữ liệu giữa các mạng con khác nhau, một lớp mạng được giới thiệu và địa chỉ IP được sử dụng để định tuyến,
Lớp mạng giải quyết vấn đề định tuyến giữa các mạng con khác nhau, nhưng máy chủ trong cùng mạng LAN được xác định thông qua địa chỉ MAC, do đó lớp liên kết được đưa vào để mang các gói dữ liệu IP.
Đồng thời, giao thức ARP được tạo ra để chuyển đổi và ánh xạ địa chỉ IP và địa chỉ MAC.
Tiến bộ từng lớp, khám phá mạng từng lớp, rất khuyến khích! .
Có một cuốn sách khác:
- "Internet được kết nối như thế nào"
Nó mô tả "cách gửi một gói dữ liệu" một cách rất đơn giản và dễ hiểu, và tôi không mất nhiều thời gian để đọc những cuốn sách đen lớn của Hiệp hội Máy móc, nhưng đọc loại này. của cuốn sách có cảm giác như đang đọc một cuốn sách của một nhân vật phản diện. Nếu bạn có những điều cơ bản, thì nó đã kết thúc sau khoảng một ngày.
Chỉ khi nắm được dòng chính của toàn bộ mạng, chúng ta mới tránh khỏi bị nhầm lẫn bởi các giao thức mạng phức tạp. Việc còn lại là tiếp tục chắt lọc và điền chi tiết vào các trục chính này.
Vậy có thể điền những chi tiết nào?
Ví dụ: quy trình làm việc ARP, địa chỉ IP, phân mảnh IP, NAT (đục lỗ UDP), giao thức kiểm soát truy cập lớp liên kết, v.v.
Ngoài ra còn có giao thức TCP quan trọng nhất, TCP cũng là khái niệm quan trọng nhất trong các cuộc phỏng vấn và quy hoạch mạng:
- Ba cái bắt tay và bốn cái vẫy tay
- chuyển trạng thái
- TIME_WAIT ở trạng thái TCP
- kiểm soát tắc nghẽn
- Truyền lại nhanh, khởi động chậm, v.v.
Chắc chắn có rất nhiều điều cần phải ghi nhớ, nhưng đừng học thuộc lòng. Tốt hơn hết bạn nên đặt câu hỏi và suy nghĩ xem tại sao bạn lại làm việc này.
Dưới đây là một số câu hỏi:
- Làm thế nào để TCP đạt được đường truyền đáng tin cậy (Thoại: Cách đạt được đường truyền đáng tin cậy dựa trên UDP
- Tại sao không có bắt tay hai chiều khi thiết lập kết nối TCP (Giọng nói: Giải thích về sự cần thiết đủ của bắt tay ba chiều
- Sự tồn tại của TIME_WAIT giải quyết được vấn đề gì? Tại sao thời gian chờ đợi là 2 MSL?
Cốt lõi của toàn bộ TCP xoay quanh việc truyền tải đáng tin cậy + truyền tải hiệu quả (điều khiển luồng và quản lý cửa sổ).
Vì có quá nhiều chi tiết về TCP nên cuốn từ trên xuống hơi thiếu sót, bạn cần đọc:
- "Giải thích chi tiết về TCP/IP Tập 1: Giao thức"
Đừng đọc cuốn sách này từ đầu mà hãy chọn những chương liên quan đến TCP.
Tại thời điểm này, bạn cần có sự hiểu biết toàn diện và chi tiết về toàn bộ mạng và TCP.
Nhưng vẫn còn một số câu hỏi thú vị ở Jiwang. Nếu bạn chưa nghĩ về chúng, bạn có thể không trả lời được.
Ví dụ:
- Tại sao chúng ta cần địa chỉ IP khi chúng ta có địa chỉ MAC? Sự khác biệt giữa địa chỉ IP và địa chỉ MAC là gì?
- Làm thế nào để hiểu miền quảng bá và miền xung đột?
- Sự khác biệt giữa bộ định tuyến và bộ chuyển mạch là gì?
- Bản chất của kết nối TCP là gì? Nó có thực sự là một "liên kết" không? (Có lần tôi được hỏi: Sự khác biệt giữa kết nối TCP được tạo bởi ổ cắm Java khi máy chủ bị treo và JVM bị treo?
Những câu hỏi này chỉ có thể được trả lời khi bạn thực sự hiểu rõ chúng. Nếu chỉ ghi nhớ thỏa thuận thì có lẽ sẽ khó giải quyết được những câu hỏi phỏng vấn linh hoạt.
Ngoài ra, phần mạng cũng cần chuẩn bị HTTP và HTTPS. Khuyến cáo:
Cuối cùng, đừng quên tự trả lời những câu hỏi được hỏi và viết kém:
- Điều gì xảy ra từ việc nhập URL đến hiển thị trang?
Càng chi tiết càng tốt, ít nhất là năm trăm chữ, hahaha.
6. Lập trình mạng
Phát triển phụ trợ C++ về cơ bản không thể tách rời khỏi lập trình mạng. Trên thực tế, thậm chí toàn bộ quá trình phát triển phụ trợ cũng có thể được coi là lập trình mạng.
Chỉ là khung của người khác giúp chúng tôi thực hiện các hoạt động cấp thấp như phân tích giao thức, truyền dữ liệu mạng và giải mã gói.
Ví dụ, một framework cấp vú em như SpringBoot về cơ bản sẽ làm mọi thứ mà một framework có thể làm, nên khi phát triển kinh doanh, chúng ta chỉ cần xác định định dạng dữ liệu của việc nhận và trả gói tin, sau đó thực hiện xử lý logic.
Việc phát triển kinh doanh sẽ không phải đối mặt với những công việc bẩn thỉu cần thiết cho việc lập trình mạng như tuần tự hóa, giải mã gói và xử lý IO.
Nhưng kỹ năng lập trình mạng vẫn rất quan trọng, đặc biệt đối với việc phát triển Linux C++.
Cốt lõi của lập trình mạng trong Linux bao gồm lập trình hệ thống và IO mạng:
- Các phương thức giao tiếp giữa các quá trình: ngữ nghĩa, đường ống, bộ nhớ dùng chung, ổ cắm, v.v.
- Lập trình đa luồng: khóa mutex, biến điều kiện, khóa đọc-ghi, nhóm luồng, v.v.
- Năm mô hình IO chính: đồng bộ, không đồng bộ, chặn, không chặn, điều khiển tín hiệu
- Có 2 chế độ IO hiệu năng cao là Reactor và Proactor (nhưng do thiếu hỗ trợ IO không đồng bộ trong Linux nên về cơ bản không có Proactor
- Cơ chế tái sử dụng IO: epoll, select, poll (công cụ mạnh mẽ giải quyết các bài toán C10K)
Sách được đề xuất:
- "Lập trình mạng Unix"
- "Lập trình nâng cao trong môi trường Unix"
Hai cuốn sách này đều là sách cục gạch. Mặc dù là những cuốn kinh thánh vô song về lập trình mạng và lập trình hệ thống Unix, nhưng mục đích chính của chúng là đệm màn hình (thoát. Cá nhân tôi cảm thấy loại sách này không dành cho độc giả. Lý do cụ thể và cách thực hiện. đọc loại sách này sẽ được giới thiệu sau.
- "Lập trình máy chủ hiệu suất cao Linux"
Tôi đánh giá cao nó. Nửa đầu của cuốn sách này về cơ bản lặp lại kiến thức cơ bản về quy hoạch mạng, nhưng các chương sau vẫn nói về khung chương trình máy chủ hiệu suất cao, IO hiệu suất cao, ghép kênh IO, bộ định thời, lập trình đa luồng, luồng. các nhóm và nhóm quy trình Phần giải thích rất toàn diện và đáng đọc Sau khi đọc nó, về cơ bản bạn sẽ có một khuôn khổ cho toàn bộ chương trình mạng.
- "Lập trình phía máy chủ đa luồng Linux"
Cuốn sách này cũng rất được khuyến khích. Đây là cuốn sách được viết bởi Chen Shuo. Thành thật mà nói, phần đầu tiên: Lập trình hệ thống đa luồng C++ đã trực tiếp làm tôi bối rối. Trong chương đầu tiên, tôi phải mất hai ba lần mới hiểu được. . . Đây là cuốn sách hiếm hoi giải thích về lập trình đa luồng C++.
Và trong cuốn sách, ông Chen Shuo sử dụng một chương để giải thích về thiết kế và triển khai thư viện mạng Muduo phù hợp hơn cho việc học nâng cao cách thiết kế và viết thư viện mạng sau khi học lập trình mạng cơ bản. Mạng lưới phản ứng chất lượng Thư viện được triển khai bằng cách sử dụng một vòng lặp cho mỗi luồng + nhóm luồng. Sự kết hợp giữa sách và mã nguồn rất tốt cho việc học lập trình mạng.
Sau khi học lập trình mạng, bạn có thể bắt đầu viết một số dự án nhỏ để rèn luyện kỹ năng của mình. Dưới đây là một số dự án:
- Máy chủ HTTP, điều này dường như đã trở thành một dự án dành cho tất cả mọi người trong Linux C/C++?
Dưới đây là hai khuyến nghị để tham khảo:
https://github.com/imarvinle/WebServer: Đây là những gì tôi viết sau khi đọc về lập trình máy chủ hiệu suất cao.
https://github.com/linyacool/WebServer: Phần này được viết bởi Niuke Linya.
Tuy nhiên, máy chủ HTTP trông rất đơn giản nhưng vẫn còn nhiều chỗ có thể mở rộng và viết. Ví dụ: bạn có thể thêm chức năng proxy. Tôi đã viết phần này trong phòng thí nghiệm của sinh viên quốc tế nhưng nó chưa được tích hợp vào. cái này Bạn có thể thêm thư viện nhật ký và bạn có thể Thêm hỗ trợ CGI và hơn thế nữa.
Điều này có thể được coi là phát minh lại bánh xe. Bạn có thể sử dụng mô hình một vòng lặp cho mỗi luồng + nhóm luồng. Trước tiên hãy hiểu mã nguồn Muduo, sau đó tự viết một mã tương tự. Ngay cả khi quá trình này chỉ là sao chép, bạn có thể học được rất nhiều điều. Đúng, không phải cách học lập trình trước tiên bằng cách đọc, sau đó bắt chước, sửa đổi và đổi mới cũng giống như vậy sao?
Để viết PRC, bạn cần xem xét việc tuần tự hóa, truyền mạng, khám phá dịch vụ, v.v. Những tài liệu nổi tiếng hơn là grpc và brpc. Hai tài liệu trực tuyến này tương đối đầy đủ.
Ngoài ra còn có một phiên bản đơn giản ở đây: https://github.com/guangqianpeng/jrpc.
- Phòng chat trực tuyến tương tự QQ
Phiên bản đơn giản có thể thực hiện trò chuyện nhóm, trò chuyện đơn lẻ, v.v. trực tiếp trong mạng cục bộ.
Tiến thêm một bước nữa, bạn có thể xem xét cách triển khai trò chuyện P2P mà không cần chuyển tiếp tin nhắn qua máy chủ, tương tự như QQ. Điều này sẽ liên quan đến việc khoan lỗ UDP, chuyển đổi NAT và các kiến thức khác. Tôi đã sử dụng Java vào năm thứ hai. .
7. Lập trình cấp hệ thống
Là một lập trình viên C/C++, không giống như Java và Python, các chương trình bạn viết chạy trực tiếp trên hệ điều hành, không giống như Java và Python, chạy trực tiếp trên hệ điều hành. Do đó, bạn phải hiểu cơ chế cơ bản và nguyên tắc hoạt động của hệ điều hành. hệ thống.
Giống như các lập trình viên Java được yêu cầu phải hiểu JVM, bạn phải làm quen với nền tảng mà mã đang chạy để có thể xác định chính xác các vấn đề khi chúng xảy ra.
Đây cũng là môn học "Lập trình hệ thống" được cung cấp vào năm học đầu tiên của tôi tại trường chúng tôi. Nó được giới thiệu từ CMU. Sách giáo khoa cũng sử dụng CSAPP. Tôi nghĩ đây là lớp học có giá trị nhất mà tôi từng học ở trường đại học.
Vào năm học cuối cấp, tôi đã tham gia lại lớp học này trong CSAPP, trong đó bao gồm việc làm bài thí nghiệm đi kèm với mỗi chương. Đây là câu trả lời cho câu hỏi tôi đã làm trong Bomblab vào thời điểm đó:
https://www.jianshu.com/p/479333cbccc4 。
Dưới đây là hai cuốn sách được đề xuất:
- "Hiểu biết sâu sắc về hệ thống máy tính"
Tôi không cần bất kỳ lời giới thiệu nào.
- "Lập trình viên tự tu luyện"
Đừng để bị cái tên đánh lừa, đây không phải là cách dạy bạn cách duy trì sức khỏe tốt mà là để tìm hiểu những kiến thức cốt lõi về rụng tóc.
Hai cuốn sách có trọng tâm khác nhau. CSAPP kết hợp rất khéo léo những kiến thức cơ bản về mạch kỹ thuật số, hệ thống tập lệnh và nhị phân, ngôn ngữ hợp ngữ, lập trình và tối ưu hóa, kiến trúc bộ nhớ, liên kết và tải, các quy trình và bộ nhớ ảo từ các nguồn khác nhau. của khoa học máy tính được xâu chuỗi lại với nhau và trình bày dưới góc nhìn của một lập trình viên, vì vậy tên tiếng Anh của cuốn sách này là "Quan điểm của một lập trình viên hệ thống máy tính".
Quá trình tự trau dồi của lập trình viên tập trung vào liên kết, tệp đối tượng, tải, thư viện và thời gian chạy. Sau khi đọc cuốn sách này, bạn sẽ hiểu cách một chương trình C/C++ được biên dịch thành tệp đối tượng và định dạng của tệp đối tượng trong Linux. các tệp mục tiêu khác nhau được liên kết thành một chương trình thực thi, cách xử lý các ký hiệu, di chuyển, phân giải địa chỉ, v.v. trong quá trình liên kết, cũng như sự khác biệt giữa liên kết tĩnh và liên kết động, v.v. và cuối cùng là cách tải tệp thực thi vào bộ nhớ , cách ánh xạ nó vào không gian bộ nhớ ảo.
Có thể bạn cho rằng đây là những kiến thức chỉ được sử dụng khi phỏng vấn và thực tế không hề hữu ích?
Điều đó hoàn toàn sai lầm. Thành thật mà nói, tôi đã đọc hai cuốn sách này hơn ba lần. Tất nhiên, tôi sẽ tập trung vào những điểm chính trong những lần đọc tiếp theo.
Ví dụ: sinh viên viết C/C++ thường gặp phải các lỗi biên dịch sau:
tham chiếu không xác định tới xxx 。
Phím ký hiệu nhân được định nghĩa (bởi xxx.o và yyy.o) 。
Khi gặp phải những vấn đề này khi còn là sinh viên năm nhất, tôi hoàn toàn bối rối và thậm chí không thể hiểu được báo cáo lỗi.
Đặc biệt khi lập trình nhiều file, các biến thường được định nghĩa một cách ngu ngốc trong các file header, dẫn đến nhiều định nghĩa về biến. Những vấn đề này rất khó hiểu đối với những người chưa học kiến thức liên kết.
Nó cũng thường gặp trong lập trình thực tế.
Một ví dụ khác là cách các từ khóa extern và static hoạt động trong quá trình biên dịch và liên kết, và sự khác biệt giữa khai báo và định nghĩa biến là gì?
Phần này có thể được coi là những kỹ năng nội bộ thực sự. Nó cải thiện sự hiểu biết của bạn về hệ thống máy tính và giúp giải quyết các vấn đề sẽ phát sinh trong quá trình lập trình thực tế.
8. Cơ sở dữ liệu
Để sử dụng cơ sở dữ liệu, trước tiên bạn phải học cách sử dụng SQL. Ở đây tôi khuyên bạn nên "Phải biết MySQL".
Về các nguyên tắc cơ sở dữ liệu, bạn có thể xem qua "Các khái niệm hệ thống cơ sở dữ liệu". Cuốn sách này khá dày và bao gồm mọi thứ từ SQL đến thiết kế cơ sở dữ liệu đến các nguyên tắc cơ sở dữ liệu và cơ sở dữ liệu phân tán. ba mô hình lớn), phương pháp tổ chức và lưu trữ đĩa dữ liệu, lập chỉ mục, kiểm soát đồng thời, v.v.
Tất nhiên, điều quan trọng nhất về toàn bộ cơ sở dữ liệu là lập chỉ mục và kiểm soát đồng thời (khóa, MVCC, v.v.). Phần này cũng thường được kiểm tra trong các cuộc phỏng vấn:
- Cấu trúc lưu trữ chỉ mục: Cây B, chỉ mục cây B+, chỉ mục băm
- Sử dụng các chỉ mục: chỉ mục khóa chính, chỉ mục bao trùm, nguyên tắc tiền tố ngoài cùng bên trái, đẩy xuống chỉ mục, v.v.
- Khóa: khóa lạc quan, khóa bi quan, khóa bảng, khóa hàng, khóa ý định, khóa đọc, khóa viết, v.v.
- Cơ chế triển khai MySQL InnoDB MVCC
- Công cụ lưu trữ: InnoDB, MyISAM, v.v., mỗi loại đều có ưu điểm và nhược điểm riêng
- Giao dịch: Lý thuyết ACID
Hai cuốn sách được đề xuất trong phần này:
- "MySQL hiệu suất cao"
- "Người trong cuộc về công nghệ MySQL"
Hai cuốn sách này chủ yếu giải thích về chỉ mục, công cụ lưu trữ innodb, khóa và kiểm soát đồng thời rõ ràng hơn. Nên đọc các chương tương ứng.
9. Thuật toán và cấu trúc dữ liệu
Đầu tiên bạn cần nắm vững các cấu trúc dữ liệu thông dụng:
- Danh sách tuyến tính, mảng, danh sách liên kết
- Ngăn xếp và hàng đợi
- Cây, cây nhị phân, phương pháp thực hiện và truyền tải nhiều cây, quá trình triển khai và chèn và xóa cây AVL, cây đỏ đen (chỉ cần hiểu định nghĩa)
- Đồ thị, cũng như các phương pháp triển khai đồ thị và truyền tải
- Cây B, cây B+
- đống
- Hàm băm và bảng băm
Các thuật toán phổ biến:
- Các thuật toán sắp xếp: bong bóng, chèn, nhanh, Hill, sắp xếp đống, cơ số, hợp nhất, v.v.
- Thuật toán khớp chuỗi: KMP
- Các ý tưởng thuật toán phổ biến: đệ quy, liệt kê, đệ quy, chia để trị, tham lam, lập trình động, v.v.
Bạn có thể xem video:
- "Cấu trúc dữ liệu" của Đại học Chiết Giang trên mooc
- "Cấu trúc dữ liệu và thuật toán" của giáo viên Đại học Thanh Hoa Đặng Junhui trên Xuetang Online
Tôi giới thiệu hai cuốn này vì tôi đã đọc chúng và nghĩ rằng chúng hay. Cuốn đầu tiên tôi làm theo khi học cấu trúc dữ liệu lần đầu tiên và cuốn thứ hai tôi đã học được trong quá trình ôn tập vào năm cuối cấp.
Đối với sách giới thiệu, bạn có thể kiểm tra:
- "Thuật toán Aha"
- "Minh họa thuật toán"
Nâng cao hơn một chút:
- "Thuật toán phiên bản thứ 4"
Cuốn sách này được đánh giá cao, độ khó vừa phải nhưng toàn diện.
Phiên bản cuối cùng:
- "Giới thiệu về thuật toán"
Chỉ cần làm điều này trong khả năng của bạn. . .
Lý do đưa ra đề xuất là: Tôi không khuyên bạn nên xem nó không đủ tiêu chuẩn (:
Với các ý tưởng thuật toán cơ bản và dự trữ cấu trúc dữ liệu, tất cả những gì còn lại là trả lời các câu hỏi:
Nên chải nó.
Bạn nên chải theo danh mục, đầu tiên là dễ và sau đó là khó, chẳng hạn như mảng, chia đôi, cây nhị phân và lập trình động, tổng hợp kinh nghiệm và đảm bảo rằng 150 câu hỏi đều dễ và trên mức trung bình.
Điều quan trọng nhất là duy trì cảm giác và áp dụng nó khi bạn có thời gian.
10. Trang web và video
Một số sinh viên thích xem video nên tôi sẽ giới thiệu chúng ở đây.
Trang web học tập tổng hợp của bạn, chỉ cần tìm kiếm ở đây với từ khóa bạn muốn học.
Nghiên cứu khóa học cơ bản.
- Các khóa học về đám mây NetEase, Xuetang trực tuyến
Một số khóa học hàn lâm và lớp học mở.
Bạn có thể xem Dark Horse cho Linux C/C++. Tôi đã thử xem một vài tập của IO và các bài giảng khá hay nhưng hơi chậm. Cá nhân tôi nghĩ tốt hơn là nên đọc một cuốn sách.
Để giải quyết các câu hỏi, bạn có thể xem video của Niuke Zuoshen.
Đối với mạng máy tính, bạn có thể kiểm tra Bilibili Han Ligang hoặc Học viện Công nghệ MOOC Harbin.
Về hệ điều hành, bạn có thể xem "Hệ điều hành" của Đại học Thanh Hoa trên Xuetang Online.
Có rất nhiều sách được đề xuất, bắt đầu từ đâu?
1. Thảo luận ngắn gọn về phương pháp học tập
Nếu đọc kỹ lộ trình học mà tôi giới thiệu cho từng phần, bạn sẽ thấy tôi đặc biệt chú trọng việc học và nắm bắt nội dung chính, đồng thời liệt kê nội dung chính của từng kiến thức cơ bản cho mọi người.
Ở đây đặc biệt khuyến khích rằng khi học những điều mới, điều quan trọng là trước tiên bạn phải có hình ảnh sơ bộ và hiểu biết về bối cảnh tổng thể cũng như cấu trúc kiến thức, sau đó nắm được nội dung chính của lĩnh vực này, bám sát nội dung chính và nêu bật những điểm chính để học hỏi.
Hãy tập trung thời gian và đạt được kết quả nhanh chóng. Đừng kéo dài thời gian càng lâu thì càng khó tồn tại và hiệu quả sẽ càng tệ hơn.
Về chi tiết, bạn có thể để chúng cho đến khi thực hành và sau đó kiểm tra chúng khi bạn cần! .
Nếu bạn lao đầu vào những kiến thức rời rạc và đọc sách hướng dẫn cũng như sách từ điển, bạn sẽ nhận được kết quả gấp đôi với một nửa công sức.
Các chi tiết còn lại để thực hành. Chúng ta nên dành thời gian một cách khôn ngoan và tập trung vào việc hệ thống hóa kiến thức và thiết lập một khuôn khổ.
2. Câu hỏi thường gặp
Thành thật mà nói, trên thực tế, những cuốn sách này ít nhiều đã được nhiều chuyên gia khuyên dùng và chúng thực sự là những cuốn sách kinh điển. Nhưng các bậc thầy hiếm khi nói cho bạn biết họ đọc như thế nào và đọc những cuốn sách này như thế nào. Họ có đọc từng trang một không?
Đây là phần tôi muốn nói đến nhiều nhất hôm nay, “Cách đọc một cuốn sách lớn”.
Ví dụ, các bạn cùng lớp thường hỏi tôi:
- Tôi không thể tìm thấy những điểm chính trong một số cuốn sách và không thể chịu đựng được nữa. Tôi nên làm gì? Ví dụ, hiểu biết sâu sắc về hệ thống máy tính, lập trình mạng UNIX, APUE. Xin hãy cho tôi một lời khuyên.
- Tôi không phải là chuyên gia CSAPP và có thể không hiểu mọi thứ. Tôi nên làm gì?
- Ông chủ, ông có thể đọc xong nhiều sách như vậy được không?
- Tôi nên làm gì nếu lần đầu đọc những cuốn sách này khiến tôi cảm thấy khó chịu?
Làm thế nào để đọc những cuốn sách này? Những người đã từng đến đó và đang chuẩn bị tuyển dụng vào mùa thu có thể biết rõ hơn, nhưng là sinh viên năm hai hoặc năm cuối đại học, bạn có thể bối rối.
Lấy kinh nghiệm cá nhân của tôi lúc đó làm ví dụ. Khi tìm kiếm trên mạng cách học lập trình mạng, nhiều người đã khuyên dùng UNP và APUE.
Chà, tôi đã mua nó và đọc từng cái một từ trang đầu tiên. Tôi cũng sao chép hầu hết các mã ví dụ trong cuốn sách. Cuối cùng, sau khi đọc bảy hoặc tám chương, tôi thấy rằng mình luôn học được một số api socket và api hệ thống. Cách sử dụng, tôi chưa chạm tới tư duy khuôn khổ của lập trình mạng.
Sau đó, tôi tìm kiếm lại và thấy có người giới thiệu "Lập trình máy chủ hiệu suất cao Linux". Tôi vào Douban và xem thư mục, và có vẻ như đó chính xác là những gì tôi muốn.
Tôi đã trực tiếp tìm thấy bản PDF và bắt đầu đọc. Chắc chắn, cuốn sách này thực sự cho phép tôi hiểu toàn bộ quy trình và khuôn khổ lập trình mạng, đồng thời tôi đã học được nhiều chế độ xử lý sự kiện, bộ tính giờ, xử lý tín hiệu và nhóm luồng, đây là những điều rất quan trọng. trong lập trình mạng.
Tất nhiên là không thể mất UNP và APUE. Mình đã sử dụng 2 cuốn sách này làm truy vấn từ điển. Ví dụ, sau khi học phần IO, mình quay lại đọc phần giới thiệu về 5 mô hình IO trong UNP.
Sử dụng các chức năng kết nối, nghe và liên kết, sau đó quay lại đọc Chương 4 của UNP. Tôi phải nói rằng UNP giới thiệu cách sử dụng các API socket này và cách xử lý các tình huống bất thường khác nhau một cách rất chi tiết và chuyên sâu. Nó xứng đáng là người dẫn đầu trong lĩnh vực lập trình mạng của Kinh Thánh.
Tuy nhiên, người mới bắt đầu dễ bị lạc vào chi tiết và không nắm được dàn ý. Đây cũng là khuyết điểm của loại sách này.
Những cuốn sách như UNP và APUE hướng đến hệ thống kiến thức hơn là người đọc. Chúng thực sự giống những cuốn từ điển hơn. Chúng xếp chồng tất cả kiến thức trong lĩnh vực này lại với nhau một cách rất chi tiết. Chúng có vẻ cực kỳ đơn giản và đầy chi tiết. . Hơn nữa, nội dung trong sách thực sự rất lớn và toàn diện, có nhiều thứ bạn không cần phải học chút nào.
Ví dụ: UNP nói về việc sử dụng các giao thức như sctp, multicast và giao thức miền Unix, những giao thức này hiếm khi được sử dụng trong thực tế. Việc đọc chúng cạnh nhau sẽ không chỉ khiến bạn khó chịu mà còn lãng phí thời gian.
Nhưng chúng là những tác phẩm kinh điển. Chúng thực sự là những cuốn sách rất hay về các lĩnh vực này xét về mặt hệ thống hóa và chiều sâu.
Loại sách nào dành cho người đọc?
Đó là nắm bắt xương sống cốt lõi của lĩnh vực, phác thảo những điểm chính, dẫn dắt người đọc từ nông cạn đến sâu hơn, đồng thời có những chi tiết nhất định, sẽ khiến người ta ngộ ra sau khi đọc.
Ví dụ: "Từ trên xuống", "Lập trình máy chủ hiệu suất cao Linux", "Lập trình máy chủ đa luồng Linux", "Phân tích mã nguồn STL", "C++ hiệu quả", "CSAPP", "Tự tu luyện của lập trình viên", v.v ... tất cả đều có nội dung chính mà tôi muốn thảo luận đều có trong đó, và nó có vẻ rất chi tiết từng bước một.
Phương pháp đọc của tôi là đối với những cuốn sách có nhiều chi tiết hướng đến hệ thống kiến thức, trước tiên chúng tôi duyệt qua mục lục để có hình ảnh của toàn bộ cuốn sách, sau đó xem đại khái một số phần mà chúng tôi quan tâm, chẳng hạn như IO , tệp và điều khiển quy trình trong UNP và APUE, tín hiệu, luồng, điều khiển luồng và lập trình socket cơ bản là các mô-đun tương đối quan trọng khác có thể được kiểm tra sau khi sử dụng.
Một điểm khác là nhiều sinh viên cho biết họ không thể hiểu những cuốn sách như CSAPP. Chúng ta đều biết rằng về cơ bản bất kỳ cuốn sách nào cũng có phần phụ thuộc trước.
Chắc chắn sẽ rất khó đọc nếu không nắm vững những kiến thức nền tảng cần thiết.
Ví dụ, khi lớn hơn, tôi chỉ có kiến thức C cơ bản và một chút kiến thức cơ bản về máy tính, sau đó tôi lao vào đọc CSAPP (sau khi học sinh cuối cấp ra trường, tôi mù quáng mua nó và lập một sạp bán sách ven đường). Lúc đó, tôi chỉ biết rằng cuốn sách này có tên là Đó là một cuốn sách ma thuật, nhưng tôi đã cảm thấy bối rối sau khi đọc hai hoặc ba chương đầu tiên. Nó thực sự quá khó đối với tôi vào thời điểm đó. biết nó đang nói về cái gì, tôi chỉ đọc nó, giống như những con chim bay qua bầu trời, nhưng không có dấu vết.
Mãi cho đến khi đọc lại nó vào năm cuối cấp, tôi mới nhận ra rằng sự tuyệt vời của cuốn sách này nằm ở sự kết nối hữu cơ giữa kiến thức từ các ngành máy tính khác nhau. Vào thời điểm đó, nó mang tính chất bổ sung, nghiên cứu chuyên sâu và cải tiến nhiều hơn vì rất nhiều kiến thức đã được học trong các khóa học như logic số, hợp ngữ, hệ điều hành.
Vì vậy bạn phải hiểu rằng nếu bạn không hiểu thì không phải vì bạn ngu ngốc, không có tài mà là do bạn chưa hoàn thiện kiến thức tiền lệ, và bạn muốn bỏ chạy trước khi tập đi.
Nói chung, trang chủ của mỗi cuốn sách sẽ giới thiệu những kiến thức cần có để đọc cuốn sách này nên các bạn có thể chú ý theo dõi.
Có một phương pháp đọc sách khác mà tôi hay áp dụng khi ôn tập, đó là học theo chiều ngang.
Ví dụ, khi tôi xem lại hệ điều hành, tôi thấy nhiều phần giới thiệu khác nhau về bộ nhớ và bộ nhớ ảo trong "Hệ điều hành: Bản chất và Nguyên tắc thiết kế". Sau khi đọc lý thuyết, tôi xem Chương 12 "Bộ nhớ ảo" và Chương 15 của "Linux". Thiết kế và triển khai hạt nhân" Chương "Không gian địa chỉ quy trình", và cuối cùng đi đến Chương 9 "Bộ nhớ ảo" của "CSAPP". Nhìn theo cách này, về cơ bản bạn có thể hiểu kỹ hơn về khía cạnh bộ nhớ. Phần giới thiệu của những cuốn sách này về vấn đề này khía cạnh nào cũng có ưu nhược điểm riêng, bổ sung cho nhau một cách chính xác.
Một ví dụ khác là phần giới thiệu về quy trình tải và liên kết trong "Bản chất và Nguyên tắc thiết kế". Thực tế, lời giải thích mang tính lý thuyết tương đối.
Sau đó tôi sẽ vào "CSAPP" để đọc Chương 7 "Liên kết". Chương này giải thích cơ bản các khái niệm cốt lõi của liên kết như liên kết tĩnh, tệp đích, tệp mục tiêu có thể định vị lại, phân tích cú pháp tham chiếu và tải, nhưng nó được đề cập trong một chương. . Nhiều đến thế, tất yếu là không đủ sâu.
Tôi sẽ đọc lại Chương 4 "Liên kết tĩnh", Chương 6 "Tải và xử lý các tệp thực thi" và Chương 7 "Liên kết động" của cuốn sách "Tự tu luyện lập trình viên". Chủ đề cốt lõi của cuốn sách này là liên kết, tải, vậy là sau khi đọc bài này về cơ bản mình đã hiểu khá kỹ về khía cạnh link và loading. Có lẽ không nhiều người phỏng vấn hiểu rõ như bạn.
Trong cùng một chỉ mục, bạn cũng có thể chọn các chương tương ứng từ "Khái niệm hệ thống cơ sở dữ liệu", "MySQL hiệu suất cao" và "Người dùng nội bộ công nghệ MySQL", đọc chúng theo chuỗi và tận dụng lợi thế của mỗi cuốn sách theo cách này. thực sự hiệu quả và chuyên sâu.
Đây là phương pháp ôn tập hiệu quả và chính xác mà tôi đã sử dụng khi ôn tập bằng cách kết nối các điểm kiến thức trên nhiều cuốn sách. Hiệu quả cũng rất tốt trong hơn chục cuộc phỏng vấn tuyển dụng mùa xuân, tôi chưa bao giờ thất bại vì những kiến thức cơ bản này.
Sau rất nhiều chi tiết, tôi chỉ trả lời những câu hỏi sau:
"Tôi không thể tìm thấy những điểm mấu chốt trong một số cuốn sách và không thể chịu đựng được nữa. Tôi nên làm gì? Ví dụ, tôi cần hiểu biết sâu sắc về hệ thống máy tính, lập trình mạng UNIX và APUE. Xin vui lòng cho tôi một ít." lời khuyên." "Tôi không phải là sinh viên chuyên ngành CSAPP và có thể không hiểu mọi thứ. Tôi nên làm gì?", "Sếp, bạn có thể đọc xong nhiều sách như vậy không?", "Tôi nên làm gì nếu đọc những cuốn sách này khiến tôi thấy khó chịu. Đầu tiên?"
3. Mất bao lâu để học xong?
Thật khó để nói, nó phụ thuộc vào nền tảng và hiệu quả học tập của bạn. Ví dụ, vào năm thứ nhất và năm thứ hai, tôi đã học một số kiến thức cơ bản một cách nghiêm túc hơn, và tôi chỉ mất hơn nửa năm để học theo. phương pháp. Có lẽ phải mất hơn bốn hoặc năm giờ một ngày.
Nếu bạn thực sự không có bất kỳ nền tảng nào về những thứ như lý thuyết mạng máy tính và hệ điều hành, thì có thể sẽ mất hơn một năm, những nội dung này về cơ bản bao gồm các khóa học cốt lõi của lớp học. bạn có thể giải quyết chúng trong một năm. Khá nhanh phải không?
Một năm có thực sự đủ để bắt đầu lại từ đầu?
Cảm giác cũng tương tự, nhưng tôi đoán bạn phải dành hơn năm hoặc sáu giờ mỗi ngày và bạn phải học tập đàng hoàng.
Nếu đến Nuke, bạn sẽ thấy rằng có những sinh viên thuộc mọi tầng lớp xã hội là sinh viên đại học năm thứ ba và sinh viên năm thứ nhất sau đại học tự dạy mình chuyển mã và cuối cùng họ có thể trở thành người thu thập phiếu mua hàng. một năm đó thôi là chưa đủ. Điều quan trọng nhất là bạn phải tìm ra con đường phù hợp rồi đi xuống.
Bạn có thực sự cần phải đọc tất cả những cuốn sách được đề xuất trong bài viết này không?
Tất nhiên là không, bản thân tôi cũng chưa đọc xong, nhưng chiến lược của tôi đã được đề cập rồi. Về cơ bản, tôi đọc những chương quan trọng của hầu hết các cuốn sách nên có vẻ rất nhanh.
Và khi bạn đọc ngày càng nhiều sách và nền tảng của bạn ngày càng tốt hơn, bạn sẽ thấy rằng một vài chương đầu tiên của mỗi cuốn sách là để đặt nền tảng cho những kiến thức cơ bản, ví dụ như hầu hết những kiến thức đó có thể được bỏ qua trực tiếp.
Một số chương đầu tiên của cuốn sách "Lập trình máy chủ hiệu suất cao Linux" như sau:
- Chương 1 Bộ giao thức TCPIP
- Chương 2 Giải thích chi tiết về giao thức IP
- Chương 3 Giải thích chi tiết về giao thức TCP
- Chương 4 Trường hợp giao tiếp TCPIP: Truy cập máy chủ Web trên Internet
- Chương 5 API cơ bản về lập trình mạng Linux
Bạn có nghĩ rằng cần phải đọc các chương này sau khi đọc "Từ trên xuống" và "Giải thích chi tiết về TCP/IP" không? Dù sao thì tôi cũng chỉ quét nửa ngày là xong.
Cuối cùng, cho dù có bao nhiêu phương pháp hay lộ trình thì cuối cùng bạn cũng sẽ cần phải dành thời gian để nghiền ngẫm và thực hiện chúng.
4. Lẫn lộn ngôn ngữ
Có một nghi ngờ khác mà nhiều sinh viên chọn C++ gặp phải, và tôi muốn giải thích điều đó ở đây:
Ngôn ngữ C++ có nhiều tính năng và khó học. Nhiều tính năng trong số đó chỉ được sử dụng bởi các nhà phát triển cấp thấp. Tôi nên chuyển sang Java hay Go?
Tất nhiên là không. Đúng là Go và Java được sử dụng nhiều hơn trong các bộ phận kinh doanh như Toutiao, Meituan và Alibaba. Trước hết, đó là quan điểm giống nhau. Người phỏng vấn xem xét nền tảng của bạn là Kiến thức và trí thông minh quyết định xem bạn có tiềm năng tu luyện hay không.
Sau đó, bạn có thể nói rằng các vấn đề liên quan chặt chẽ đến ngôn ngữ như ConcurrentHashMap, bảng ảo và cơ chế triển khai hàm ảo thường xuất hiện trong nhiều cuộc phỏng vấn khác nhau.
Theo tôi, những cuộc phỏng vấn hỏi những câu hỏi chuyên sâu về một số chi tiết triển khai ngôn ngữ thực chất không phải là kiểm tra ngôn ngữ của bạn mà để xem liệu bạn có nhận thức để tích cực học tập hay không, liệu bạn chỉ dừng lại ở cấp độ ứng dụng và còn sử dụng ngôn ngữ đó để học tập hay không. kiểm tra một số cấu trúc dữ liệu và kiến thức cơ bản về hệ điều hành.
Vì vậy, tôi nghĩ bạn có thể học chuyên sâu bất kỳ ngôn ngữ C/C++, Java và Go nào. Điều quan trọng là tìm ra lộ trình học tương ứng và đừng nghi ngờ liệu học có tốt hơn cho mình hay không. Vấn đề về giải pháp Java hoặc C++.
Ngoài ra, tôi muốn nói với những sinh viên đang học C++, bạn có thể thấy rằng các bạn cùng lớp của bạn đều tham gia vào Java, Go, v.v., và bạn thiếu một số người bạn để cùng ôn tập và chuẩn bị khi tìm việc làm. Một số thậm chí còn khuyên bạn không nên học C++. Lúc này, các bạn phải vững vàng trong sự lựa chọn của mình và tìm kiếm những người bạn cùng hướng trên Niuke hoặc online để cùng giao lưu và học hỏi.
Thành thật mà nói, về vấn đề tìm việc, cá nhân tôi cảm thấy sự khác biệt thực sự không lớn. Về mức lương và độ khó khi phỏng vấn, chúng không khác nhau nhiều. Điều quan trọng hơn là thuật toán và kiến thức cơ bản.
Hơn nữa, cũng có nhiều sinh viên cần chuyển Java sang C++ để vào Tencent, còn những bạn muốn C++ vào Alibaba và Meituan cần chuyển sang Java. Đây không phải là vấn đề.
Vậy các kịch bản ứng dụng hiện tại của C++ là gì?
Nói một cách dễ hiểu, các ứng dụng yêu cầu hiệu suất hoặc hiệu quả thực thi tương đối cao, chẳng hạn như công cụ trò chơi, cơ sở hạ tầng, công cụ đề xuất, bộ lưu trữ, v.v., tất nhiên cũng có thể được sử dụng để phát triển kinh doanh (vâng, tôi đang nói về Goose Factory) và một số cũng được sử dụng để phát triển máy khách C++, chủ yếu là MFC, QT, v.v.
Thành thật mà nói, những thứ như công cụ trò chơi và cơ sở hạ tầng có rào cản gia nhập tương đối cao và số lượng người tuyển dụng cũng rất hạn chế. Hơn nữa, hầu hết các bộ phận kinh doanh của các công ty Internet hiện đều sử dụng ngôn ngữ. chẳng hạn như Java và Go.
Vì vậy, nhu cầu về C++ ít hơn nhiều so với Java và Go. Tuy nhiên, đồng thời, việc học C++ cũng không nhiều bằng Java nên tính tương đối mà nói thì sự cạnh tranh không quá lớn, và nếu bạn học tốt C++, bạn cũng có thể đến Alibaba, Đối với các công ty có nền tảng công nghệ Java như Meituan, các công ty lớn về cơ bản không hạn chế ngôn ngữ.
Tìm kiếm hàng ngày cho ba liên kết liên tiếp
Tôi đã linh cảm bài viết này sẽ dài 10.000 từ nhưng không nhịn được. Có quá nhiều điều muốn bày tỏ. Các bạn nhớ lưu lại nhé.
Địa chỉ gốc: https://mp.weixin.qq.com/s/XGa4WQ20LiVJPTbcv39z_g.
Cuối cùng, bài viết này về lộ trình học tập phát triển máy chủ phụ trợ Linux C/C++ kết thúc tại đây. Nếu bạn muốn biết thêm về lộ trình học tập phát triển máy chủ phụ trợ Linux C/C++, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. tất cả sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!