Nhận Xét Về Effective C++ 3rd
Một vài suy ngẫm về “Effective C++ 3rd Edition”
Sau bao ngày vật lộn với đống bài tập (dù vẫn còn vài phần cần chỉnh sửa lại), cuối cùng tôi cũng hoàn thành việc đọc xong phiên bản thứ 3 của cuốn “Effective C++” và viết được hàng chục nghìn từ bình luận. Như đã chia sẻ trong email gửi biên tập viên:
Tôi nhận thấy công việc bình luận khó khăn hơn dịch thuật rất nhiều. Tác giả đã trình bày chi tiết đến mức hầu như không cần thêm chú thích nào ở phần lớn nội dung. Điều này có lẽ xuất phát từ việc cuốn sách đã được mài giũa suốt 10 năm trời. Vì thế mà nhiều trang tôi chẳng viết thêm được gì, thực sự không biết nên bình luận thế nào cho hữu ích.
Ban đầu biên tập viên muốn trình bày song ngữ Anh-Việt song song từng trang, nhưng tôi không khuyến khích cách này. Ngoài một vài chú thích đặc biệt nhắm vào đoạn mã cụ thể hay từ khóa quan trọng, phần lớn các ghi chú của tôi đều là những đoạn văn độc lập. Chúng không gắn chặt với từng câu chữ trong nguyên bản, mà chỉ liên quan lỏng lẻo đến chủ đề của từng mục lớn.
Vài ngày trước khi trao đổi thư từ với anh Mạnh Nham, tôi có gửi anh ấy một số bản thảo. Anh ấy nhận xét rằng phần bình luận của tôi về Mục 1 chương đầu tiên “Hãy xem C++ như một liên minh các ngôn ngữ” vẫn chưa đủ sâu sắc. Đúng vậy, nhiều quan điểm thực sự khó diễn đạt trọn vẹn.
Dưới đây là một đoạn trích dẫn được chọn lọc:
Mục 1 / Trang 11 Không ai có thể nắm bắt hết mọi ngóc ngách của C++. Đây không phải lời nói khoa trương hay coi thường trí tuệ người đọc. Bởi ngay từ bản thân C++ đã không ngừng phát triển, liên tục bổ sung các tính năng mới. Cách đây nhiều năm, khi tôi bắt đầu học C++ với trình biên dịch Turbo C++ 1.0, từ khóa “template” chỉ là một từ dự phòng chưa có chức năng gì. Chính Bjarne Stroustrup - cha đẻ của C++ cũng không thể hình dung hết tiềm năng to lớn ẩn chứa trong công cụ nhỏ bé này. Nhưng chính nó lại trở thành nền tảng cho thư viện STL ra đời sau này.
Mục 1 / Trang 12 C++ không phải là một thể thống nhất hoàn chỉnh. Phiên bản thứ hai của cuốn sách này chưa có Mục 1, nhưng đến phiên bản thứ ba thì nó lại được đặt ở vị trí mở đầu. Điều này cho thấy nhận thức của tác giả về vấn đề này cũng phát triển dần theo thời gian. Tôi hoàn toàn đồng cảm với cách tiếp cận này. Đây chính là phần cốt lõi của toàn bộ tác phẩm, người đọc nhất định phải nghiền ngẫm kỹ lưỡng. Nếu đã từng đọc phiên bản thứ hai, chỉ cần so sánh phong cách hành văn sẽ thấy sự khác biệt rõ rệt. Tác giả không còn nhấn mạnh những điều “phải làm” cứng nhắc như trước, mà ẩn hiện trong từng câu chữ là sự bất lực trước sự phức tạp của C++. Đây chính là minh chứng sống động nhất cho quan điểm này.
Theo tôi, sự khác biệt giữa các khía cạnh của C++ còn lớn hơn nhiều so với những điểm chung của chúng. Trải qua hàng chục năm phát triển, C++ đã trở thành một ngôn ngữ tổng hợp chứa đựng vô số phong cách lập trình khác nhau. Việc dung hòa các phong cách này để chúng tồn tại hài hòa trong cùng một ngôn ngữ là điều vô cùng khó khăn. C++ cố gắng đáp ứng nhu cầu đa dạng của đủ loại dự án và lập trình viên ở các thời kỳ khác nhau. Nó không được thiết kế một cách toàn diện ngay từ đầu, mà là kết quả của quá trình phát triển dần dần. Chính vì vậy mà đến tận ngày nay, C++ vẫn tiếp tục phát triển là điều đáng quý. Việc chuẩn hóa phiên bản mới của C++ kéo dài hơn một thập kỷ kể từ năm 1998 đến nay vẫn chưa hoàn tất là điều dễ hiểu.
Nhiều giáo trình C++ (kể cả phiên bản thứ hai của cuốn sách này) luôn nhấn mạnh không nên dùng C++ như một ngôn ngữ C. Về mặt nào đó thì đúng là vậy. Tuy nhiên, chỉ sử dụng một phần của C++ - cụ thể là phần kế thừa từ C, kết hợp các cải tiến của C++ để khắc phục những điểm yếu của C - lại là một chiến lược hiệu quả trong thực tiễn phát triển phần mềm. Cách tốt nhất để sử dụng C++ phụ thuộc vào việc nhóm phát triển định nghĩa thế nào là “C++ của riêng họ” và tất cả các thành viên đều đồng thuận. Google là một ví dụ điển hình khi công bố tiêu chuẩn mã hóa C++ của mình trên mạng, điều quan trọng không phải nội dung quy chuẩn mà là sự tuân thủ thống nhất từ toàn bộ cộng đồng.
Từ năm 2005 đến 2006, tôi từng áp dụng một tập hợp con của C++ theo phong cách C trong một nhóm phát triển. Cách tiếp cận này hoàn toàn khác biệt so với phong cách lập trình C++ tôi từng sử dụng trước đó, nhưng lại hoạt động rất hiệu quả. Trải nghiệm này khiến tôi phải suy nghĩ lại nhiều về lập trình hướng đối tượng và kỹ thuật template, và cuối cùng chuyển hẳn sang phát triển bằng C thuần túy.
Cá nhân tôi cho rằng lập trình viên nên dám thử nghiệm nhiều công nghệ khác nhau, thay vì vội vàng coi bất kỳ kỹ thuật nào là chân lý duy nhất. Bạn có thể say mê lập trình hướng đối tượng, hay muốn khám phá sức mạnh của template. Tuy nhiên cần lưu ý rằng dù C++ cho phép kết hợp linh hoạt nhiều phong cách lập trình khác nhau, mỗi phong cách đều được hỗ trợ hiệu năng cao, tạo cảm giác như nắm cả thế giới trong tay. Nhưng sự xung đột và phức tạp phát sinh từ việc trộn lẫn này dễ dàng vượt quá khả năng kiểm soát của cá nhân. Chỉ học ngôn ngữ thôi là chưa đủ, phải tích lũy kinh nghiệm qua nhiều năm thực chiến mới thấu hiểu được điều này. Đặc biệt là với những lập trình viên thông minh, điều này càng nguy hiểm.
Mục 1 / Trang 13 Việc xác định rõ cách bạn muốn sử dụng C++ là cực kỳ quan trọng. Điều này quyết định dự án của bạn có thể phát triển lâu dài đến khi hoàn thành hay không. Dù bạn làm việc một mình, bạn vẫn phải tương tác với mã nguồn của người khác (ít nhất là thư viện chuẩn), hoặc cung cấp các giao diện mở rộng cho người khác phát triển tiếp. Ngay cả khi bạn kiểm soát toàn bộ hệ thống, cũng không nên tùy tiện áp dụng những tính năng “ngầu” nhất của C++. Vì bạn sẽ luôn phát hiện ra những điều hấp dẫn mới trong C++, dẫn đến việc dự án dần lệch khỏi mục tiêu ban đầu, biến việc viết mã C++ thành mục