Bài viết gồm 2 phần

C và C++ là ngôn ngữ khó để có thể làm chủ được nó, nó khó là vì nó kích thích trí óc chúng ta phải tư duy, sáng tạo không ngừng, nó dành cho những người thật sự thích thử thách. Nói vậy không có nghĩa chúng ta nghĩ rằng C#, Java, Python là dễ hơn, nhưng nếu phải so sánh thì thật sự chúng dễ hơn C++.

Nhiều ngôn ngữ khác cung cấp tính năng cho phép lập trình viên tập trung vào giải quyết vấn đề thay vì tập trung vào lập trình (Thật ra C++ cũng có hỗ trợ tốt điều đó). Trong C#, Java bạn không cần quản lý bộ nhớ, trong JavaScript bạn thoải mái sử dụng biến mà không cần quan tâm kiểu dữ liệu: "chỉ cần lưu trữ giá trị vào biến".

Với các ngôn ngữ có mức độ trừu tượng cao như C#, Java hay Python cho phép các lập trình viên giải quyết vấn đề của họ nhanh hơn trước và đồng thời, mức độ trừu tượng đó cho phép các lập trình viên "biết ít hơn về lập trình, tạo được nhiều tính năng hơn và kiếm tiền nhiều hơn". Có thể bạn chỉ còn gặp phải 1 vấn đề cần giải quyết đó là "hiệu suất" của chương trình. Và theo quan điểm này, bạn nghĩ rằng ngôn ngữ chỉ là một công cụ. Nó phải phục vụ bạn, công việc của bạn thay vì làm bạn đau khổ.

Thử đặt 1 câu hỏi, điều gì làm bạn trở thành một lập trình viên thật thụ? Bạn "nghiên cứu" C#, Java, Python hay JavaScript thì đã là 1 lập trình viên? Chắc chắn đấy KHÔNG PHẢI là một lập trình viên! Chính xác bạn chỉ là 1 người dùng cuối "hơi biết lập trình". Tại sao vậy? Để tôi giới thiệu cho bạn Alice, cô ấy là luật sư, cô ấy giỏi máy tính, cô ấy có thể cài đặt phần mềm, thiết lập kết nối mạng, cô ấy có thể phân biệt WiFi với Dữ liệu di động nhưng cô ấy không biết lập trình. Cô ấy biết về các hệ điều hành khác nhau cho máy tính để bàn và thiết bị di động. Cô thậm chí còn sử dụng hai hệ điều hành, một OS X được cài đặt trên MacBook và một chiếc Windows, được cài đặt trên máy tính để bàn. Cô ấy biết ngay cả những ứng dụng Mac không thể được cài đặt trên Windows. Cô sử dụng một số phần cứng để làm chủ phần mềm cho công việc của mình, một số phần mềm đặc biệt của luật sư. Để nắm vững phần mềm này, cô đã tham gia các lớp học cho "SupaLoya2012-Ultimate", cô đã học được các truy vấn (query) khá khó để lấy dữ liệu từ tòa, cô đã học được giao thức (protocol) để sử dụng SupaLoya2012-Ultimate, cô ấy đã học thứ tự các nút và mục menu để nhấp để có được kết quả mong muốn. Cô ấy chắc chắn không phải là lập trình viên, bạn có thể nói cô ấy là người biết cách làm việc trên máy tính tốt hơn nhiều người khác và cô ấy biết một số phần mềm khó dùng, giao thức, truy vấn dữ liệu...

Và sau đó đến Bob, Bob yêu thích máy tính, anh đã xem quá nhiều phim về tin tặc, người lập trình, người khởi nghiệp. Tôi đã đề cập đến tin tặc? Anh ấy giỏi thao tác với máy tính như Alice, mặc dù Bob không biết SupaLoya2012-Ultimate, anh ấy biết JavaScript, anh ấy học rất nhiều về nó, anh ấy không dùng Promises, anh ấy có thể dùng AJAX. Vì vậy, anh ấy có thể code 1 số thứ để dùng cho công việc. Trên thực tế, Bob nghĩ rằng mình một lập trình viên. Bob thậm chí không biết rằng Bob không nhận thức được địa chỉ bộ nhớ, máy ảo, JIT là gì, quan hệ "is-a" / "has-a" là gì? Bob sử dụng i++ thay vì ++i và không biết được sự khác biệt là gì? Dù sao, Bob có khác với Alice không? Bạn có thể dạy cho Alice cách code JavaScript, "các truy vấn khó" để "yêu cầu" một cái gì đó và cô ấy vẫn làm được như Bob. Nhưng Alice lại không nhận bản thân là lập trình viên.

Vậy lý do tại sao phải học C++ là ngôn ngữ lập trình chính và tìm hiểu nó kỹ lưỡng? Bởi vì, khi học C++ bạn phải:

  • Quan tâm về quản lý bộ nhớ.
  • Phân biệt được trình biên dịch (compiler), trình liên kết (linker) và trình tải (loader).
  • Tìm được cách tối ưu hóa code tốt hơn.
  • Phân biệt thời gian biên dịch (compile-time) và thời gian thực thi (run-time).
  • Thực sự hiểu đa hình (trong hướng đối tượng) ở mức sâu.
  • Hiểu được rằng trình biên dịch tạo ra mã cụ thể và hiểu ra rằng có rất nhiều nền tảng khác ngoài Windows trên x86;
  • Hiểu kích thước của các kiểu dữ liệu.
  • Hiện thực con trỏ hàm để hiểu được call-back.
  • Hiểu sâu hơn vào lập trình nói chung.
  • ...

Đấy là 1 trong số những kiến thức mà bất kỳ sinh viên khoa học máy tính nào cũng cần có, và là kiến thức để bạn trở thành một lập trình viên giỏi. Kiểm soát được C++ sẽ giúp bạn làm chủ hầu hết các ngôn ngữ lập trình khác.

@Medium