Sự Trở Lại Của Ngôn Ngữ C
Vào cuối tuần vừa rồi, tôi có chuyến công tác đến một thành phố khác để giải quyết một số vấn đề kỹ thuật cho dự án của công ty. Trên đường ra sân bay trở về, tôi tranh thủ lướt Google Reader bằng điện thoại để giết thời gian. Ngay lập tức, bài viết mới nhất của Meng Yan với tiêu đề “Cha đẻ Linux: Nói thẳng nói thật về ngôn ngữ C và C++” đã thu hút sự chú ý của tôi. Khi chuyển sang blog của Liu Jiang, tôi đọc hết bài “Linux Torvalds chỉ trích C++: Ngôn ngữ dành cho lập trình viên kém cỏi” và cảm thấy vô cùng đã tai. Ngay lập tức, tôi gửi đường link bài viết này qua SMS cho vài người bạn.
Tranh luận về ngôn ngữ lập trình luôn là chủ đề nóng bỏng như lửa. Đặc biệt khi C và C++ có thị trường mục tiêu trùng lặp cao, các lập trình viên C++ thường có niềm tin sùng bái gần như tôn giáo vào ngôn ngữ này. Tôi hiểu rõ rằng việc tiếp tục cuộc tranh luận này trên blog của mình chắc chắn sẽ招致 không ít chỉ trích. Tuy nhiên, lần này những lời nói của Linus thực sự chạm đến trái tim tôi, nếu không chia sẻ thì tôi sẽ phát điên lên mất!
Trước tiên, xin dành cho những độc giả chưa quen biết tôi một phần tự giới thiệu về bối cảnh kỹ thuật của bản thân:
Tôi không phải là một fan cuồng của Linux, dù hiện tại tôi cũng không có cảm tình đặc biệt với Windows. Phần lớn công việc của tôi vẫn là phát triển phần mềm ứng dụng trên nền tảng Windows, nên tôi khá am hiểu hệ điều hành này. Hiện tại tôi cũng sử dụng một hệ thống không phải Windows, nhưng đó là máy cài FreeBSD chứ không phải Linux.
Tôi tự nhận mình khá am hiểu C++, đã đọc kỹ hầu hết các cuốn sách về C++ có mặt trên thị trường, thậm chí những tác phẩm kinh điển như “D&E of C++” tôi đã đọc không dưới hai lần. Tôi đã viết hàng chục nghìn dòng mã C++, đọc gần hết mã nguồn STL và một phần nhỏ của ACE/Boost.
Trong quá khứ, tôi từng là một tín đồ trung thành của C++. Nếu ai đó dám chỉ trích C++, tôi sẽ hoặc là tranh luận đến cùng, hoặc đơn giản là coi thường người đó.
Một điểm quan trọng nữa: Tôi lần đầu yêu thích C++ là vào 15 năm trước (1992), sau đó dần dần nguội lạnh và quay lại với C. Đến năm 2000, tôi lại một lần nữa say mê C++. Nói cách khác, trong hành trình cá nhân của mình, tôi đã trải qua hai lần yêu rồi từ bỏ C++. Không loại trừ khả năng sẽ có lần thứ ba trong tương lai, nhưng điều này đủ chứng minh rằng việc phủ nhận C++ là kết quả của sự suy xét lý tính chứ không phải hành động bốc đồng.
Tôi viết những điều này không phải để khoe khoang kinh nghiệm. Tôi hiểu rõ rằng các lập trình viên C++ vốn đã ghét việc ai đó dựa vào “tuổi nghề” để chỉ trích ngôn ngữ họ yêu thích. Hơn nữa, xét về资历, tôi chỉ là hạt cát so với Linus. Có “cây cổ thụ” như ông ấy đứng trước, tôi mới có can đảm chia sẻ quan điểm của mình!
C là tập con của C++ (tuy nhiên từ C99 trở đi điều này không còn đúng nữa). Những gì có thể viết được bằng C, C++ cũng có thể làm được và thậm chí còn tốt hơn.
Đây là luận điểm tự phụ mà nhiều lập trình viên mới vào nghề thường dùng để công kích. Linus đã phản bác một cách sắc bén: “Bạn có thể viết mã xấu bằng bất kỳ ngôn ngữ nào. Nhưng một số ngôn ngữ, đặc biệt là những ngôn ngữ mang theo gánh nặng tư duy (mental baggage) vốn dĩ đã tồi tệ.”
Chính xác! Đây là điều tôi muốn nhấn mạnh nhất. C++ chính là “ngôn ngữ mang theo gánh nặng tư duy”. Ảnh hưởng của điều này đến thiết kế phần mềm là vô cùng lớn, và chỉ những ai có nhiều năm kinh nghiệm phát triển phần mềm mới thực sự thấu hiểu.
Nếu so sánh việc tranh luận giữa ASM và C với việc tranh luận giữa C và C++ thì thật vô nghĩa. Vấn đề cốt lõi cần xem xét là: Liệu những tính năng mới mà C++ thêm vào so với C có thực sự tạo ra gánh nặng tư duy không? Câu trả lời không dễ dàng. Nếu chỉ dựa vào độ phức tạp của các tính năng ngôn ngữ dẫn đến khó nắm bắt và dễ bị lạm dụng thì khó thuyết phục được tôi, chưa nói đến việc thuyết phục các lập trình viên C++ thông minh và chăm chỉ hơn tôi nhiều lần. Tôi tự tin rằng mình đã nắm bắt khá tốt các tính năng “cao cấp” của C++ và áp dụng chúng vào nhiều dự án thực tế. Những tính năng này không chỉ thú vị mà còn hiệu quả đến mức đáng kinh ngạc. Chúng giúp tăng tốc độ thực thi mã, rút ngắn thời gian lập trình (ít phải gõ phím hơn), và mang lại cảm giác thành tựu to lớn khi hoàn thành.
Hãy tiếp tục trích dẫn một câu nói của Linus khiến tôi tâm đắc: “Vấn đề quản lý chuỗi và bộ nhớ không quan trọng. Đó không phải phần cốt lõi, cũng không phức tạp. Điều thực sự quan trọng duy nhất chính là thiết kế.”
Thiết kế! Đó mới là yếu tố then chốt.
Nếu phải tóm tắt điều tôi học được trong 10 năm làm lập trình viên gần đây, đó là khả năng thiết kế mã tốt hơn, nhạy bén hơn với các dấu hiệu cảnh báo về thiết kế tồi. Những thứ như thành thạo ngôn ngữ lập trình, hiểu biết hệ điều hành hay kiến thức chuyên môn… chỉ là kết quả tự nhiên của quá trình tích lũy kiến thức, chứ không phải là sự nâng cấp năng lực thực sự.
“Trừu tượng hóa”, “Lập trình hướng đối tượng”, “Mẫu thiết kế” - những thứ này có quan trọng không? Rất quan trọng! Chúng đóng vai trò thiết yếu trong phát triển phần mềm. Nhưng quan trọng không đồng nghĩa với cần thiết. Việc quá đắm chìm vào “trừu tượng hóa” có thể khiến bạn ngày càng xa rời mục tiêu thực tế. Mỗi lần chúng ta cố gắng khái quát hóa đặc điểm chung và xây dựng tầng trừu tượng, chúng ta có thể đã đánh mất đi bản chất thực sự. C++ kế thừa triết lý thiết kế “tin tưởng lập trình viên” từ C, tập trung giúp lập trình viên xây dựng các tầng trừu tượng mà không phát sinh chi phí phụ. Giải pháp của nó là cung cấp càng nhiều công cụ ngôn ngữ và lựa chọn thiết kế càng tốt, mỗi lựa chọn đều đảm bảo không gây tổn thất hiệu năng khi không sử dụng.