Ấn bản sửa đổi lần thứ 3 của 『Programming: Principles and Practice Using C++』 của Stroustrup
(stroustrup.com)- Ấ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
- Links: Liên kết đến các C++ implementation và môi trường phát triển, cùng vài lời khuyên ngắn để bắt đầu
- How to use modules?: Bao gồm cách build module PPP bằng
PPP_support.h - module PPP: Module PPP dùng khi có thể sử dụng module
- header "PPP.h": Header để dùng
stdvà modulePPPmột cách đơn giản nhất - header "PPPheaders.h": Header dùng khi cần quay lại sử dụng file header
- GUI support: Bao gồm thư viện giao diện người dùng Graphics/GUI cho các chương 10~14 của PPP3
- Cần cài đặt Qt để chạy
- Cũng có The User Manual
- Sample code from the various chapters: Mã mẫu từ nhiều chương, được đánh dấu TBD
- Errata: Đính chính lỗi
- Lectures based on PPP: Slide bài giảng đã được cập nhật cho PPP3
- PPP Coding Style Guide
- Exercise Material: Được đánh dấu TBD
Các chương PPP2 vẫn còn trên web
- Một số chương của PPP2 được viết bằng C++14, nhưng vẫn đúng và giới thiệu chủ đề đó một cách hợp lý
- Tài liệu PPP2 được cung cấp:
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
Ý 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 địnhTrên Debian, chạy
g++ --std=c++23 -fmodules-tscũ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àiclang++17rồi vẫn báomodule 'std' not foundTô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 đề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ằngg++ a.cpprồi chạy./a.outthì vẫn hoạt động nguyên như vậyToà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ệ
Vì vậy hiện tại phải viết trước module file phù hợp thì
importmớ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ạngVớ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
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 GCCNhì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ớigccgo,rustc,javachttps://www.kitware.com/import-std-in-cmake-3-30/
Ở 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ự 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ắnstd::trước mọi thứ nhưstd::every std::last std::bloody std::thingkhiến người ta phát điênusing namespacecho 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ánhNgay 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ủastd::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ênMã 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ả
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Đã 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++
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
distcctrê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 vuiTrong 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/
autocó khá ổn khôngTrướ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ôngTô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
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
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ônghttps://www.stroustrup.com/PPPheaders.h
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