1 điểm bởi GN⁺ 2024-04-20 | 1 bình luận | Chia sẻ qua WhatsApp
  • Ấn bản thứ 3 của 『Programming: Principles and Practice Using C++』 chủ yếu hướng đến độc giả mới bắt đầu học lập trình, đồng thời cũng có thể dùng như sách nhập môn để những người đã có chút kinh nghiệm học C++ hiện đại và cải thiện phong cách, kỹ thuật tốt hơn
  • Trọng tâm của sách không phải là ghi nhớ chi tiết cú pháp C++, mà là các nguyên lý cơ bản của lập trình và kỹ năng thực hành, đồng thời đề cập cả lập trình thủ tục, hướng đối tượng và generic
  • PPP3 được rút gọn còn khoảng một nửa kích thước so với PPP2, tăng cường các chương nền tảng thường dùng trong khóa học một học kỳ, đồng thời phản ánh C++20·C++23 và mã Graphics/GUI dựa trên Qt
  • Các chương chuyên sâu hơn và tài liệu tham khảo thuần túy đã được chuyển lên web để xem khi cần, còn thông tin tham khảo mới nhất được bổ sung bằng các tài nguyên web như cppreference.com
  • Có cung cấp PDF mẫu, module·header của PPP, mã GUI Qt, slide bài giảng, hướng dẫn coding style, v.v. nên có thể dùng cho cả lớp học lẫn tự học

Mục tiêu và độc giả của cuốn sách

  • 『Programming: Principles and Practice Using C++ (3rd Edition)』, viết tắt là PPP3, là sách nhập môn dành cho người chưa có kinh nghiệm lập trình
  • Những độc giả đã từng lập trình đôi chút cũng có thể dùng sách để cải thiện phong cách và kỹ thuật, hoặc học C++ hiện đại
  • Sách được thiết kế cho giảng dạy trên lớp, nhưng cũng được viết với mục tiêu hỗ trợ tự học
  • Các ấn bản trước đã từng được dùng trong môn lập trình đầu tiên cho sinh viên điện - điện tử, kỹ thuật máy tính và khoa học máy tính tại Texas A&M University cũng như ở nhiều nơi khác

Cách tiếp cận trong việc dạy lập trình

  • Mục tiêu của sách là giúp người đọc cuối cùng có thể viết ra những chương trình đủ tốt để người khác sử dụng và bảo trì
  • Trọng tâm nằm ở các khái niệm và kỹ thuật cơ bản hơn là những chi tiết ngôn ngữ vụn vặt
  • Đây không chỉ là sách nhập môn ngôn ngữ C++, mà được cấu thành như một sách nhập môn về lập trình nói chung
    • Lập trình thủ tục
    • Lập trình hướng đối tượng
    • Lập trình generic
  • Cùng với các kỹ thuật hiện đại ở mức cao, sách cũng đề cập các kỹ thuật mức thấp cần thiết để sử dụng phần cứng hiệu quả
  • Sách cung cấp nền tảng để viết mã hữu ích, chính xác, an toàn kiểu, dễ bảo trì và hiệu quả
  • Sách bao quát rộng các khái niệm thiết yếu, kỹ thuật thiết kế và lập trình, tính năng ngôn ngữ và thư viện

Những thay đổi trong ấn bản thứ 3

  • PPP3 có kích thước khoảng một nửa so với PPP2
  • Sách được tinh gọn bằng cách tăng cường các chương nền tảng thường được dạy trong khóa học một học kỳ
    • Sử dụng những phần cốt lõi của C++20 và C++23
    • Mã trong các chương Graphics/GUI được xây dựng lại dựa trên Qt, có cân nhắc tính di động sang các môi trường như trình duyệt và điện thoại
  • Các chương chuyên sâu hơn, từng được gọi là “broadening the view” trong PPP2, được đưa lên web để dùng khi cần
  • Tài liệu tham khảo thuần túy đã bị loại bỏ
    • Có thể tìm thấy nhiều tài liệu hơn và mới hơn trên web, ví dụ như cppreference.com

Phạm vi chuẩn C++ và thư viện

  • Sách sử dụng C++20 và C++23
  • Sách đề cập đến thiết kế và cách sử dụng các kiểu dựng sẵn và kiểu do người dùng định nghĩa
    • Nhập
    • Xuất
    • Tính toán
    • Đồ họa/GUI đơn giản
  • Cũng bao gồm phần nhập môn về container và algorithm trong thư viện chuẩn C++

Tài liệu mẫu được công bố

  • Preface: Trình bày những gì cuốn sách hứa hẹn và không hứa hẹn
  • Table of Contents: PDF mục lục
  • Chapter 0: Notes to the Reader: Hướng dẫn về cách tiếp cận của sách
  • Chapter 10: A Display Model: Chương mẫu
    • Người mới hoàn toàn có lẽ chưa nên đọc ngay
    • Đây là chương nhằm cho giáo viên và độc giả có kinh nghiệm thấy mức độ mà sách đạt tới vào khoảng tuần thứ 5, với tiến độ 2 chương mỗi tuần
    • Mục đích cũng là để cho thấy một phần của C++ hiện đại

Tài liệu hỗ trợ và mã nguồn

Các chương PPP2 vẫn còn trên web

Tình trạng bản dịch

  • PPP3 hiện עדיין chưa có bản dịch
  • Có thể xem các bản dịch của những ấn bản trước tại book covers page

1 bình luận

 
GN⁺ 2024-04-20
Ý kiến trên Hacker News
  • Tôi thấy khá có vấn đề khi “chương trình đầu tiên kinh điển” trong cuốn sách này dùng import std; ngay từ dòng đầu. Theo tôi biết, ngoài MSVC ra thì hầu như không compiler nào hỗ trợ đúng cách ở trạng thái mặc định
    Trên Debian, chạy g++ --std=c++23 -fmodules-ts cũng không được, và nhìn vào https://en.cppreference.com/w/cpp/23 thì đề xuất liên quan là P2465R3, nhưng clang++ 17 cũng chỉ “hỗ trợ một phần”. Cài clang++17 rồi vẫn báo module 'std' not found
    Tôi hiểu import std; là một tính năng rất mới, nhưng cuốn sách này là dành cho người mới học C++, nên tôi tò mò một người mới trung bình sẽ phản ứng ra sao. Khi đọc “Tour of C++” 1–2 năm trước tôi cũng gặp cùng vấn đề

    • Nhận xét hay, và tôi cũng gặp y như vậy. g++ của tôi cũng đưa ra đúng lỗi và hướng dẫn tương tự
      Tôi chưa đọc bản mới nhất của Stroustrup đang được bàn tới, nhưng đã đọc các bản cũ hồi còn dùng C++ hằng ngày. Đến giờ, sau 20 năm, tôi vẫn thích Accelerated C++ của Koenig và Moo hơn. Có thể về sau đã có sách hay hơn, nhưng tôi chưa đọc
      Nếu nhớ không nhầm, Hello World trong cuốn đó có dạng như #include, int main(), std::cout << "Hello, world!" << std::endl;, và ngay cả trên Arch Linux hiện nay, build bằng g++ a.cpp rồi chạy ./a.out thì vẫn hoạt động nguyên như vậy
      Toàn bộ cuốn sách được tổ chức rất xuất sắc, mô phỏng một phong cách C++ hiện đại đơn giản và gọn gàng, gần như mã giả, không cần số học con trỏ của C. Nó cũng khá giống cảm giác chỉn chu của Python thời kỳ đầu; phía Python khi đó chưa có những yếu tố như vậy cho đến khi pandas về sau kéo theo các thư viện bọc C++ như numpy, scipy
      Trong thực tế công việc, tôi hầu như không thấy mã C++ gọn gàng. Tôi không làm ở FAANG, và trong các prototype làm nhanh thì code review cũng hiếm, nên tôi không biết kiểu hướng dẫn của Koenig và Moo phổ biến đến đâu ngoài thế giới greenfield mà tôi từng trải qua. Những nơi như lĩnh vực xạ trị, nơi không muốn trở thành Therac-25 tiếp theo, có thể là ngoại lệ
    • Tài liệu GCC 13.2.1 hiện nói rằng thư viện chuẩn không được cung cấp dưới dạng các header unit có thể import. Muốn import những unit như vậy thì trước tiên phải build chúng một cách tường minh, và nếu không cẩn thận có thể tạo ra các khai báo trùng lặp mà cơ chế module phải gộp lại, khiến mức dùng tài nguyên của compiler bị ảnh hưởng bởi cách chia tách header file
      Vì vậy hiện tại phải viết trước module file phù hợp thì import mới hoạt động. Tuy nhiên, tôi nghĩ việc cập nhật thư viện C++ chuẩn của GCC sẽ không mất quá lâu, nên về sau có lẽ có thể dùng ngay cuốn sách mới này nguyên trạng
      Với những người đã biết C++ cũ và chỉ muốn cập nhật kiến thức, việc tự viết module file đó cũng có thể là một trải nghiệm học tập tốt
    • Giờ đây việc duy trì một chương trình C++ thú vị mà không có build system là không thực tế. Dù vậy, lệnh gọi g++ được nêu làm ví dụ nhiều khả năng một ngày nào đó sẽ hoạt động nhờ xử lý đặc biệt của compiler, nếu ai đó gửi patch cho GCC
      Nhìn chung, trừ các ví dụ nghiên cứu, cách tự ghép các lệnh gọi g++ không còn thực tế nữa. Các ngôn ngữ biên dịch khác cũng dùng những hệ thống như gobuild, cargo, Maven thay vì thao tác trực tiếp với gccgo, rustc, javac
      https://www.kitware.com/import-std-in-cmake-3-30/
    • Tài liệu được trang sách tham chiếu này có thể giúp ích cho vấn đề module: https://www.stroustrup.com/module_use.html
  • Ở chương GUI, sách đã chuyển từ FLTK sang Qt. Vì Qt được dùng rộng rãi trong ngành nên đây là một thay đổi khá lớn và có lẽ sẽ được đón nhận tích cực, nhưng tôi không rõ đường cong học tập sẽ thay đổi thế nào

    • Tôi tò mò Stroustrup nghĩ gì về Meta Object Compiler. Ở một số khía cạnh, Qt có cảm giác như một phương ngữ riêng của C++
    • Qt có Qt Creator, nên tôi nghĩ đây là hướng tốt hơn
    • Vì sách dùng một thư viện wrapper tùy chỉnh, tôi không rõ Qt thật sự được lộ ra đến mức nào
    • Tôi đã nhờ cả 4 trợ lý lập trình AI từng dùng (claude3, gemini, gpt4, deepseek) viết boids và Game of Life bằng C++, và tất cả đều dùng SFML cho phần đồ họa
      Tôi tự hỏi liệu đó là vì nó đa nền tảng, hay vì trong mã mà các mô hình này được huấn luyện có nhiều ví dụ dùng SFML hơn. SFML có vẻ tương đối mới hơn Qt hay FLTK, nên việc có nhiều dữ liệu huấn luyện hơn nghe hơi lạ; chuyện cả 4 đều thống nhất đề xuất dùng SFML cho đồ họa C++ cũng khá kỳ
  • Điều tôi thích trong mã của Stroustrup là using namespace std;. Quy ước gắn std:: trước mọi thứ như std::every std::last std::bloody std::thing khiến người ta phát điên

    • Còn tùy trường hợp. Trong header file thì tuyệt đối không được đặt using namespace cho bất kỳ namespace nào. Vì làm vậy sẽ tạo ra đúng kiểu xung đột tên mà namespace được sinh ra để tránh
      Ngay cả trong file triển khai, cá nhân tôi cũng không thích using namespace std;. Tôi cho rằng nó làm giảm khả năng đọc mã, và vì nội dung của std:: quá lớn và vẫn tiếp tục phình ra, tôi muốn tránh luôn khả năng xung đột tên
      Mã chỉ viết một lần nhưng được đọc nhiều lần, nên chọn tên ngắn, kể cả bằng cách bỏ namespace, có vẻ là một lựa chọn kém hiệu quả
    • Không có xung đột tên thì tốt. Nhưng bằng cách nào đó các ngôn ngữ khác đã giải quyết được vấn đề này
    • Tôi nghĩ khi C++ modules thật sự ổn định thì chuyện này sẽ không còn là đề tài tranh luận nữa
    • Hơn cả bản thân std, dấu hai chấm kép :: mới là thứ xấu xí. Tôi chưa bao giờ hiểu tại sao không thể dùng một dấu chấm như các ngôn ngữ khác
    • Chắc là bạn học lập trình trên Windows
  • Đã hơn 10 năm không dùng C++, nhưng tôi vẫn nhớ mình đã học rất sâu phiên bản trước của cuốn sách này. Dù khi đó tôi vừa trải qua 4 năm đại học gần như 99% dùng C++
    Đây thật sự là một cuốn sách hay. Nếu dành thời gian để hiểu đúng C++ trong sách, sẽ thấy hơi buồn khi hiểu vì sao thế giới lại sợ C++ đến vậy
    Tất nhiên sau đó tôi gặp cả đống người chưa từng đọc những cuốn như thế này mà vẫn viết mã C++ kinh khủng

  • Tôi nhớ thời còn làm việc với C++. Cảm giác như khi đó mình ở tầng thấp hơn của stack phát triển so với bây giờ. Ngày trước UI, phân tích API, gần như mọi thứ đều xử lý bằng C++

    • Có một thời gian tôi nhớ Fortran, nhưng viết thử khoảng 30 phút là khỏi ngay. Cứ thử parse JSON bằng C++ một lần rồi xem nỗi nhớ có trụ nổi qua quá trình đó không
    • Tôi cũng thật sự nhớ. Cũng chưa lâu đến vậy, từng có một ứng dụng mà cả client lẫn server đều viết bằng C++, UI, API, mọi thứ đều là C++. Cảm giác như một ngôn ngữ đa dụng thực sự đã xuất hiện
      Tôi không nói nó hoàn hảo, nhưng công việc rất thú vị, và được làm cùng những người trình độ cao có thể làm việc với stack đó cũng rất vui. Không có giờ ăn trưa nào phấn khích bằng lúc chúng tôi chạy distcc trên blade server để build nhanh hơn rất nhiều. Việc tôi không phải là người duy nhất mê Linux cũng rất vui
    • Ở công ty chúng tôi, gần như mọi thứ ngoài UI đều là C++. Tôi nghĩ lý do duy nhất UI không dùng C++ là để chừa lại một phần codebase mà sinh viên mới tốt nghiệp có thể bắt tay vào làm ngay cả trước khi được đào tạo C++
    • Để thỏa cơn khát C++, tôi vẫn thỉnh thoảng mày mò game engine như dự án cá nhân. Bất chấp đủ loại phê phán, tôi thật sự thích dùng C++
    • Chỉ mong là không phải làm việc bằng Python
  • Trong 1 năm qua tôi đã hoàn thành phần lớn bản 2. Đây là một cuốn sách thật sự xuất sắc, và đã giúp tôi vượt qua nhiều rào cản tinh thần trong lập trình mà tôi vấp phải suốt nhiều năm
    Lý do chính khiến bản này ngắn hơn là Part IV: Broadening the View đã bị lược khỏi sách. Phần này, vốn đề cập các chủ đề bổ sung như xử lý văn bản, tính toán số và hệ thống nhúng, nay được cung cấp trực tuyến. Các chương đó vẫn còn phù hợp và dùng C++11/14, nên không được cập nhật trong bản 2

  • Cũng chia sẻ C++ Annotations, một cuốn sách liên tục cập nhật về C++ hiện đại: http://www.icce.rug.nl/documents/cplusplus/

    • Tôi tự hỏi liệu với một dự án emulator, cách tiếp cận kiểu C có class rồi chỉ thêm smart pointer và auto có khá ổn không
      Trước đây tôi từng nghe nói C++ có bốn thành phần. Thứ nhất là “C”, thứ hai là hướng đối tượng, thứ ba là năng suất và tính linh hoạt như STL và template, cuối cùng là dành cho các tình huống đặc biệt như volatile, asm. Người đó khuyên nên dùng mục 1 một cách cẩn thận và tránh những tình huống phải dùng mục 4, không biết điều này có hợp lý không
    • Bị 404 rồi
  • Tôi tưởng nó sẽ thành một cuốn sách gạch còn dày hơn, nhưng bất ngờ là lại giảm còn một nửa
    Bản 2 là paperback 1312 trang, nặng 4,81 pound, còn bản 3 là paperback 656 trang, nặng 2,71 pound

    • Nhìn lời tựa thì có vẻ một phần đáng kể tài liệu tham khảo đã được đưa ra khỏi sách và chuyển sang tài liệu C++ trên Internet
      Bản 3 của “Programming: Principles and Practice Using C++” có kích thước khoảng một nửa bản 2, và nói rằng các sinh viên phải mang sách theo sẽ hoan nghênh trọng lượng nhẹ hơn. Lý do rút gọn là vì có nhiều thông tin hơn về C++ và thư viện chuẩn trên web
    • Thấy đo kiến thức C++ bằng đơn vị pound cũng hay
    • Đúng nghĩa đen là chính xác một nửa. Không biết có phải họ chọn phông chữ nhỏ hơn không
  • Tôi thắc mắc vì sao Bjarne có lúc thêm khoảng trắng sau #include, có lúc lại không
    https://www.stroustrup.com/PPPheaders.h

    • Có thể là trộn lẫn header gõ tay với header do IDE tự động chèn, cộng thêm thiết lập mặc định gập phần import, hoặc không chạy clang-format khi lưu nên bị sót
  • Tôi thật sự mong chờ phiên bản mới này. Dù không quan tâm đến C++ hoặc đã là lập trình viên thành thạo, cuốn sách này vẫn đáng đọc
    Trong phạm vi tôi biết, đây là một trong những ví dụ hay nhất về viết kỹ thuật và giáo dục lập trình máy tính