HÀNH TẨU GIANG HỒ CÙNG C++ CUỒNG ĐAO

Sơ lược lịch sử hình thành của C++

Tiền thân của ngôn ngữ C++ là ngôn ngữ C, được phát triển bởi Dennis Ritchie đầu những năm 1970 tại phòng thí nghiệm Bell Laboratories.  Khi đó Dennis Ritchie đang tham gia vào một dự án phát triển một hệ điều hành mới. Ritchie phát hiện ra rằng, để hoàn thành nhiệm vụ ông cần sử dụng một ngôn ngữ lập trình ngắn gọn và súc tích . Từ nhu cầu này Ritchie đã phát triển một ngôn ngữ lập trình được gọi là C.

Vào đầu những năm 1980, cũng tại Bell Laboratories, một ngôn ngữ lập trình khác được tạo ra trên nền tảng là ngôn ngữ C. Ngôn ngữ mới này được phát triển bởi Bjarne Stroustrup và được gọi là C++.  Theo Stroustrup, mục đích của C++ là làm cho việc viết một chương trình tốt trở nên dễ dàng hơn cho lập trình viên. Khi thiết kế C ++, Stroustrup đã thêm tính năng OOP (Object Oriented Programming) vào C mà không thay đổi nhiều các thành phần C. Như vậy C++ có thể gọi là một “bà con” của C, và bất kỳ chương trình C hợp lệ  nào cũng là một chương trình C++ hợp lệ. C++ được ISO công nhận vào năm 1998, lần phê chuẩn tiếp theo vào năm 2003 (người ta gọi là C++ 03). Hai lần cập nhật gần đây nhất là C++ 11 và C++ 14 (được phê chuẩn vào năm 2011 và 2014). Phiên bản C++17 đã được công bố vào 12/2017 và tiếp theo là các tính năng mới trong C++20 dự kiến sẽ chính thức được phê duyệt vào cuối năm nay (2020).

Đợt vừa rồi mình có livestream cùng vài ae nói về ngôn ngữ C++ nên hôm nay ngồi tổng hợp một vài ý chính cho ae tham khảo.


Ngôn ngữ C++ làm được gì ?

C++ có thể làm được rất nhiều thứ, nó có mặt trong tất cả các lĩnh vực của công nghệ thông tin

  • GAME Engine: Rất nhiều game engine chạy đa nền tảng được phát triển bằng ngôn ngữ C++. Có thể kể đến 1 vài cái tên như Unreal Engine (phát triển bởi  Epic Games – Công ty đang tham gia kiện tụng với Apple thời gian gần đây), cocos2d-x, Torque2D/3D
  • Embedded System & IoT:
    • HMI engine: Qt, Kanzi, Embedded Wizard, wxWidgets
    • Multimedia: Gstreamer, TagLib, FFmpeg
    • C++ được ứng dụng nhiều để phát triển các ứng dụng chạy trên thiết bị nhúng như ô tô, TV, Camera, Robot
  • Database: MySQL, Postges viết bằng C++
  • AI, ML: Caffe, TensorFlow là 2 nền tảng trí tuệ nhân tạo nổi tiếng viết bằng C++
  • Blockchain: Bitcoin viết bằng C++
  • Image processing: OpenCV
  • WebService: một số dịch vụ backend thường được viết bằng C++ để tăng tốc độ xử lý, đáp ứng nhiều giao dịch đồng thời. Ngày xưa mình đã từng phát triển phần xử lý core về quản lý Token và xác thực OTP cho ứng dụng ngân hàng bằng C++
  • Browser: Firefox, Chrome là 2 trình duyệt web phổ biến và được viết bằng C++
  • PC Application: C++ cũng có thể được dùng để phát triển các ứng dụng trên PC. Khoảng 10 năm trước thì hay dùng MFC (Windows), hiện nay thì có thể dùng Qt (chạy trên nhiều platform), wxWidgets (Linux) nhưng hiện giờ người ta ít dùng vì cấu hình PC giờ đã mạnh mẽ hơn. Bây giờ hay dùng C#, Java, Nodejs rất tiện để phát triển app PC.

Điểm mạnh của C++

  • Tốc độ xử lý nhanh, kích thước chương trình nhỏ gọn: C++ được compile thẳng ra machine code nên tốc độ xử lý nhanh và kích thước chương trình nhỏ gọn hơn các ngôn ngữ bậc cao sử dụng trình thông dịch như C#, Java, Python
  • Developer có thể chủ động quản lý (cấp phát, giải phóng) memory để tăng hiệu quả sử dụng memory, giảm bộ nhớ sử dụng bởi chương trình, tăng tốc độ xử lý
  • C++ là ngôn ngữ hướng đối tượng nên rất linh hoạt, có thể áp dụng các design pattern làm tăng khả năng bảo trì, mở rộng cũng như tính sử dụng lại
  • C++ ra đời từ đầu những năm 1980, sau 40 năm tồn tại và phát triển thì cộng đồng rất lớn, các thư viện C++ cũng rất nhiều. Tham khảo thêm tại đây

Điểm yếu của C++

  • Giả sử so với Python thì C++ không có sẵn nhiều hàm thuật toán nên khi code thì đấu hoặc làm về AI thì dùng Python code sẽ tiện và nhanh hơn
  • Trong C++ chúng ta hoàn toàn được chủ động trong memory management: cấp phát, giải phóng ==> Tuy nhiên đây là con dao 2 lưỡi, việc C++ không có cơ chế bảo vệ bộ nhớ mà phó mặc hết cho developer sẽ làm tăng rủi ro dẫn đến các lỗi nghiêm trọng như: rò rỉ bộ nhớ (Leak Memory), tràn bộ nhớ (Buffer Overrun), truy cập vùng nhớ trái phép. Những lỗi này sẽ dẫn đến crash cả chương trình
  • C++ ko user-friendly như các ngôn ngữ khác C#, Java, Python nên khó học hơn 1 chút

Cơ hội nghề nghiệp trong mảng lập trình Nhúng cho LTV C++

Làm embedded thì có 3 mảng chính là làm driver, service (middleware) và làm application

  • Phát triển Device Driver thì có đặc điểm là:
    • Viết code tương tác trực tiếp với phần cứng
    • Chủ yếu dùng ngôn ngữ C
    • Cần có kiến thức về vi điều khiển (MCU) và các thiết bị ngoại vi
    • Cần có knowledge về các giao thức truyền thông như UART, SPI, I2C, Ethernet, CAN, LIN, FlexRay, USB
  • Phát triển Service (middleware) thì có đặc điểm là:
    • Service không tương tác trực tiếp với User mà tương tác với tầng dưới (device driver, OS), các service khác và  tầng trên:(các application)
    • Để code đc service thì cần am hiểu về 1 protocol hoặc technology nào đó, ví dụ:
      • Bluetooth service: Bluetooth stack, bluetooth profile
      • Carplay service : Bluetooth, Wifi, iAP
      • UsbMedia service: USB, Audio/Video container
      • Media Streaming service: RTSP (realtime streaming protocol)
      • etc
  • Phát triển Application
    • Application là Layer cao nhất trong kiến trúc của Embedded Software, tương tác trực tiếp với User
    • Là layer chứa nhiều business logic nhất, cần có giao diện (HMI) để tương tác với user
    • Application cũng là phần dễ thay đổi yêu cầu nhất trong hệ thống
      ⇒ Do đó các kỹ năng và kiến thức khác (ngoài ngôn ngữ lập trình) để có thể làm tốt phần Application, đó là:
    • Kiến thức về domain: Làm Automotive thì cần có kiến thức về xe, làm IoT thì cần có kiến thức về SmartHome, Smart City, etc
    • Có kiến thức về design pattern để làm sào thiết kế App dễ maintain, dễ đáp ứng với thay đổi, dễ mở rộng
    • HMI framework : Qt, Kanzi, CGI, Embedded Wizard, etc.
    • OS: Linux, QNX, INTEGRITY, FreeRTOS, etc.
    • Platform: GENIVI, AGL, Android Automotive
    • Cross compile: Yocto

Ở VN hiện nay theo những gì mình biết thì lập trình C++ sẽ có rất nhiều đất dụng võ trong embedded system. Embedded System ở đây thì nổi bật lên 2 domain chính là Automotive và IoT. Mình thì ko có kinh nghiệm làm IoT mà chỉ có kinh nghiệm làm Automotive nên mình không dám chém linh tinh về IoT mà chỉ xin chia sẻ 1 chút cơ hội nghề nghiệp cho các bạn C++ trong ngành Automotive

  • Ngành Automotive hiện tại đang cần rất nhiều nhân lực làm các ứng dụng IVI. 90% là sử dụng ngôn ngữ C++ (kết hợp với Framework chuyên dụng) để develop ứng dụng IVI trên xe ô tô
  • Một số công ty đang có sô lượng LTV C++ làm việc rất nhiều:
    • FSOFT, LG, HUMAXX, LUXSOFT, PANASONIC R&D, etc
    • Khoảng 2 năm gần đây thì VINFAST tuyển nhiều nhân sự C/C++ để tự phát triển hệ thống nhúng trên xe nhưng chỉ tuyển những người có kinh nghiệm (Senior Level)
    • FSOFT là công ty tuyển nhiều LTV chưa có kinh nghiệm (các lớp fresher), khi vào các bạn sẽ đc đào tạo lại 1 khóa cơ bản sau đó sẽ đc phân vào các dự án vừa học vừa làm và tích lũy kinh nghiệm. Mô hình này khá phù hợp với các bạn mới ra trường, chưa có nhiều kinh nghiệm hoặc những bạn đã đi làm các nghành khác nhưng muốn chuyển ngang sang lĩnh vực lập trình.
    • Lương senior: $1500~$2000, tech lead nhiều chỗ có thể lên đến $2500~$3000

Khó khăn/trở ngại gì so với các ngôn ngữ khác khi học C++

  • Phần mà các bạn hay lúng túng nhất khi học C++ là pointer và memory management
    Trong C++ chúng ta hoàn toàn được chủ động trong memory management: cấp phát, giải phóng → Tuy nhiên đây là con dao 2 lưỡi, developer nếu không hiểu bản chất của pointer và ko quản lý bộ nhớ tốt sẽ dẫn đến các lỗi nghiêm trọng như: LeakMemory, Buffer Overrun và làm toàn bộ chương trình crash
  • Compile chương trình viết bằng C/C++ khó hơn việc compile chương trình viết bằng các ngôn ngữ khác như Python, C#, Java
  • C++ ko user-friendly như các ngôn ngữ khác C#, Java, Python nên khó học hơn 1 chút

Lời khuyên về lộ trình học C++

Muốn giỏi thì phải thực chiến và rút ra các bài học xương máu từ khác lỗi lầm chứ không nên ngồi ôm sách đọc lý thuyết. Sau đây là một vài gạch đầu dòng cho các bạn mới tiếp cận với C++ và muốn dùng C++ hành tẩu giang hồ:

  • Trước tiên cần học 1 khóa C++ basic cái đã
    • Option 1: Download tại liệu và tự học offline
    • Option 2: Học trực tuyến tại các trang có phí hoặc free như Codelern, Cousera, Udemy, edX
    • Option 3: Học 1 khóa Automotive tại ĐH FUNiX của FPT. Khóa học bao gồm C++ cơ bản, C++ nâng cao, Qt
      Các bạn có điều kiện 1 chút và xác định học xong đi làm luôn thì nên học khóa này vì khi học khóa này các bạn sẽ được
      – Có mentor hỗ trợ giải đáp thắc mắc và làm bài tập
      – Có cơ hội việc làm ngay tại FPT software sau khi tốt nghiệp
      Tham khảo thêm tại đây
  • Lưu ý khi học
    • Ae nên cài IDE về để học vì IDE có tích hợp compiler và debugger. Học Code thì phải biết debug mới nhanh lên trình được
    • Nếu máy khỏe chút thì nên cài Visual Studio, yếu hơn thì dùng CodeBlock
    • Trong quá trình học phải luyện tập thật nhiều, debug để hiểu bản chất: Code → Lỗi → Debug → Giải quyết được vấn đề→ Hiểu bản chất → Lên trình
    • Cần đặc biệt chú ý và cố gắng hiểu bản chất của:
      • Pointer/Reference
      • Memory management: allocation, release
      • Tính đa hình
    • Đối với các bạn đã ra trường (ko còn là sv nữa) thì khi học xong basic nên xin đi làm luôn, mới đầu có thể làm fresher (1 hình thức học việc). Khi đi làm, va vấp nhiều vđ thực tế, giải quyết vđ, skill up.
    • Đới với sv thì basic có thể học tiếp nâng cao (cho biết) sau đó thì xin thực tập hoặc tự làm project nào đó
  • Khi nào thì đi làm được ???
    • Nẵm vững kiến thức basic
    • Biết debug
    • Biết search google và chọn lọc câu trả lời
  • Lời khuyên khi đi làm
    • Khoảng 2-3 năm đầu đừng để tâm quá nhiều đến tiền lương, tất nhiên là ko đc quá thấp, phải đủ trang trải cuộc sống. Hãy cố gắng học hỏi thật nhiều, cố gắng kiếm cho mình 1 mentor và tạo ra nhiều mối quan hệ.
    • Khi bạn cảm thấy mình đã thành thục một công việc gì đó thì cần phải xin chuyển công việc khác, hãy nhận công việc có độ khó tăng dần.

Một số cuốn sách ưa thích chủ chốt của mình

  • Effective C++ và More Effective C++ đều của tác giả (Scott Meyers)
  • Clean Code (Robert C. Martin)
  • Design Pattern for Dummies
  • The Pragmatic Programmer (David Thomas, Andrew Hunt)
  • Lập trình và cuộc sống (Dịch giả Hồ Sĩ Hùng dịch tổng hợp các bài trên blog của Jeff Atwood – founder của stackverflow)

Một số bài viết liên quan 

— Phạm Minh Tuấn (Shun) —