Thứ Hai, 14 tháng 12, 2009

Nghệ thuật code

Một phản hồi mà tôi nhận được từ Những hạn chế của Java cho rằng lập trình viên Java không mấy quan tâm đến những hạn chế đó khi mà họ hoàn toàn có thể đạt được cùng một mục tiêu bằng cách này hay cách khác.

Nhận định trên không sai nếu ta coi mọi sản phẩm lập trình như những hộp kín. Toàn bộ giá trị của mọi sản phẩm lập trình sẽ nằm ở những tính năng mà chúng bộc lộ. Số source code bên trong có thể được lờ đi.

Tuy nhiên, gần như mọi sản phẩm lập trình sẽ đến lúc cần phải được nâng cấp, gần như mọi source code sẽ đến lúc cần phải được sửa đổi và dùng lại. Xu hướng open source càng nhấn mạnh rằng một khi code được viết ra, sẽ có người đọc để học hỏi, đóng góp. Trách nhiệm của lập trình viên khi này không chỉ nằm ở việc đảm bảo code thực thi được mục tiêu mà còn ở việc viết code sao cho trong sáng, hàm súc, thông minh.

Tính nghệ thuật của công việc lập trình không chỉ nằm ở vẻ đẹp của sản phẩm mà còn được chứa đựng ngay trong source code. Bản thân source code thể hiện tư duy của kiến trúc sư và của người viết code. Trong đa số các sản phẩm được đánh giá cao nhất từ trước đến giờ, hai người này là một.

Nếu một bức tranh là một sản phẩm nghệ thuật thì tính nghệ thuật của nó không chỉ nằm ở ý đồ của họa sỹ mà còn ở từng đường nét mà anh ta vẽ ra. Nếu một bản nhạc là một sản phẩm nghệ thuật thì tính nghệ thuật của nó không chỉ ở thông điệp của nhạc sỹ mà còn được hàm chứa ngay trong từng tiếng đàn mà người chơi chau chuốt, nâng niu.

Giới nhà văn thường phân tích yếu tố nghệ thuật trong cách dùng câu từ của một tác phẩm văn học bên cạnh giá trị nhân văn của toàn bộ tác phẩm. Tương tự như vậy, một codebase không chỉ ẩn chứa vẻ đẹp nghệ thuật qua kiến trúc vĩ mô mà còn qua từng chi tiết nhỏ - từng module, từng function, từng dòng code.

Người chơi guitar phải mất trung bình 10 năm lao động nghệ thuật để có được tiếng đàn âm vang, tròn trịa, sâu lắng. Người viết code cũng phải mất từng ấy thời gian để viết code một cách trong sáng, hàm súc, thông minh.

Nếu bạn vẫn coi viết code là một công việc thuần tuý chân tay, bạn không nhận thấy sự khác nhau giữa code viết bởi một lập trình viên trung bình và code viết bởi Linus Torvalds chẳng hạn, thì rất có thể bạn chưa đủ độ chín để hiểu được sự khác nhau ấy. Điều này tương tự với việc người mới học đàn thường không nhận thấy sự khác nhau giữa tiếng đàn của thầy dạy đàn và của John Williams.

Cảm thụ vẻ đẹp nghệ thuật phụ thuộc vào năng lực chuyên môn. Cảm xúc thu được khi hưởng thụ nghệ thuật bị giới hạn bởi nhận thức về bộ môn nghệ thuật đó.

Điều này cũng có nghĩa là bài viết này bị giới hạn bởi trình độ của tôi trong thời điểm hiện tại. Cái mà tôi hiểu về nghệ thuật hẳn sẽ thay đổi sau 10 năm nữa. Đến lúc đó, tôi sẽ có dịp nhìn lại xem mình nhận thức thế nào về nghệ thuật cách đây 10 năm.

Cách đây 2,5 năm khi tôi có dịp làm việc với một người bạn là VietNT, tôi mới biết thế nào là code đẹp. Cùng một mục tiêu, nhưng code của VietNT trong sáng, hoa mỹ hơn của tôi rất nhiều. Tôi vẫn coi VietNT là người có ảnh hưởng sâu sắc nhất tới tôi cho đến thời điểm này trong lĩnh vực lập trình.

Vào lúc đó, với trình độ hạn chế của mình, tôi tạm hiểu code đẹp là code sáng sủa (chia đoạn đúng chỗ, ngắt câu đúng chỗ), dùng từ chính xác (đặt tên biến, tên hàm, tên class), đủ ý (không viết thừa, không viết thiếu), tối ưu (nhận thức về tài nguyên, về tốc độ thực thi).

Khi mới học đàn, tất cả các thầy dạy đàn tận tâm đều sẽ khuyên bạn nên chơi thật chậm và lắng nghe từng tiếng đàn của mình. Bạn cũng sẽ không được phép chơi tác phẩm cho đến khi thành thục những bài tập đơn giản nhất. Tương tự, nếu nghiêm túc với nghệ thuật code, có lẽ ta nên bắt đầu với những bài toán đơn giản nhất. Code thật chậm và để ý đến từng dòng code.

Cái khó của lập trình viên là không mấy ai khuyến khích họ "code chậm", "code đẹp". Lập trình là một ngành đã được thương mại hoá. Thông thường, bạn sẽ lắp vào một khâu trong quy trình làm sảm phầm đã được công nghiệp hoá. Người ta dùng từ "thợ code" để chỉ lập trình viên thời nay là vì thế.

Ở Việt Nam, trình độ trung bình của lập trình viên không cao. Bạn không cần phải quá giỏi so với thế giới để trở thành senior programmer hay giám đốc kỹ thuật. Bạn sẽ được giao những bài toán hết sức phức tạp mà bạn vẫn có thể xoay sở thực thi theo cách này hay cách khác.

Bạn có thể chỉ cân tập đàn 6 tháng để chơi được một tác phẩm khó, nhưng sẽ cần đến 10 năm để chơi nó như một người nghệ sỹ thực thụ.

Không phải tất cả mọi người đều hiểu hết giá trị nghệ thuật mà một người nghệ sỹ tạo ra. Code đẹp để làm gì trong khi sếp không quan tâm, end users thì lại càng không? Đó là một câu hỏi thông mình và hợp lý. Câu trả lời tuỳ thuộc vào mức độ đam mê của chính bạn đối với bộ môn nghệ thuật code.

Đọc thêm: Refactoring, Beautiful Code, Code Complete. Như tất cả các cuốn sách công nghệ khác, chúng đều dài dòng hơn mức cần thiết. Bản thân tôi cũng chưa đọc hết nhưng chỉ cần lướt qua cũng có thể giúp truyền cảm hứng cho bạn về việc viết code đẹp.