Tác giả: Semi Koen
Một cái gì đó khô khan như chương trình máy tính có thể được gọi là nghệ thuật? Chắc luôn!
Đẹp thì có nhiều điểm xuất phát. Khi nói đến Phát triển phần mềm, vẻ đẹp được xuất phát từ sự giản đơn và sự gắn kết kiến trúc, đi đôi với sự rõ ràng của các chức năng cũng như sự sáng tạo được áp dụng để giải quyết các vấn đề. Tương tự như vậy, phong cách code là một phần không thể thiếu trong sự trong sáng của code và không nên đánh giá thấp khi nói đến việc (code) cải thiện khả năng giao tiếp của nhóm phát triển.
Hãy cùng khám phá chi tiết hơn về khái niệm vẻ đẹp trong code và sau tất cả những gì tạo nên nghệ thuật lập trình!
TÌM KIẾM CÁI ĐẸP TRONG SỰ GIẢN ĐƠN
Gần đây tôi đã đọc tuyển tập Beautiful Code, và bài tiểu luận gây ấn tượng mạnh nhất với tôi là ‘Dòng code đẹp nhất tôi chưa bao giờ viết’bởi Jon Bentley, cái mà dựa trên nguyên tắc ‘ít hơn là nhiều hơn’, đó là các nỗ lực tái cấu trúc mà một số nhà phát triển nổi tiếng thực hiện, thực hiện hết lần này đến lần khác, để tinh chỉnh các đoạn code của họ và loại bỏ sự dư thừa, làm sao để càng ngắn gọn, càng dễ hiểu và càng cô đọng càng tốt. Một số cách ngôn (trans: Là tục ngữ, ngạn ngữ hoặc danh ngôn, chỉ có nghĩa đen, đơn thuần về mặt giáo dục. Cách ngôn mang phong cách chức năng) thể hiện kỹ năng này, được chọn từ cuốn sách:
Một nhà thiết kế biết rằng anh ta đã đạt được sự hoàn hảo không phải là khi không còn gì để thêm mà là khi không còn gì để bỏ đi — Saint-Exupéry
Các thành phần rẻ nhất, nhanh nhất và đáng in cậy nhất của một hệ thống máy tính là những thành phần không có trong đó — Bell
Nếu tôi có nhiều thời gian hơn, tôi sẽ viết cho bạn một lá thư ngắn hơn — Pascal
Sự đơn giản không tới trước sự phức tạp, nhưng theo ngay sau nó — Perlis
Nói cách khác, đây là lời kiêu gọi cho sự giản đơn.
Mỗi dòng code phải được đọc hiểu, gỡ lỗi, và hỗ trợ sau này. Tất cả điều này là chi phí vốn có! Vì vậy, giảm số lượng code trong khi vẫn đảm bảo chức năng hoạt động đúng là một nỗ lực cao quý. Nếu một phương thức có 10 câu lệnh, nhưng sau đó chúng tôi tối ưu nó xuống còn 5, thì khả năng các vấn đề đã giảm một nửa vì giảm được khả năng code đặt sai vị trí, giảm độ phức tạp, mơ hồ của code. Mã nguồn là một trách nhiệm, không phải là một tài sản! Hãy nghĩ về điều này vào lần tới khi bạn sử dụng LOC (Lines of Code) làm thước đo năng suất!
Ba triết lý liên quan là YAGNI, DRY và KISS. YAGNI (You Aren’t Gonna Need It) gợi ý rằng code cần có một lý do để tồn tại, nếu không có phải được tái cấu trúc hoặc xóa đi. DRY (Don’t Repeat Yourself) đề xuất rằng mọi đoạn code phải đại diện cho một mục đích rõ ràng, duy nhất trong hệ thống. Và cuối cùng KISS (Keep It Simple Stupid) thì khéo léo miêu tả: cần giữ cho mọi thứ đơn giản!
Sự đơn giản, trớ trêu thay, lại là một vấn đề phức tạp!
Trong phần mềm, đoạn CODE ĐẸP nhất, chức năng đẹp nhất và chương trình đẹp nhất đôi khi không có ở đó.
CHẤT LƯỢNG THIẾT KẾ LÀ LINH HỒN CỦA MỘT CHƯƠNG TRÌNH
Mọi lập trình viên đều co rúm lại khi nghe từ ‘bug’. Người ta thường tin rằng các lập trình viên giỏi là những người viết code không có lỗi. Mặc dù chương trình không có lỗi là bắt buộc, nhưng viết code không có lỗi thì không. Điều tôi muốn nói là một số nhà phát triển cố gắng viết code không có lỗi trước khi chương trình được biên dịch hoặc thực thi, tập trung nhiều vào từng chức năng hơn là thiết kế tổng thể hệ thống.
Xem thường việc bảo trì và không tuân thủ các mẫu thiết kế/các tiêu chuẩn trong quá trình phát triển chỉ để đảm bảo tính đúng đắn của từng chức năng là một công thức dẫn đến thảm họa (và thảm họa là một thứ vô cùng đắt đỏ). Một vấn đề khác là dành quá nhiều thời gian để lo lắng về hiệu quả ở sai vị trí và sai thời điểm; tối ưu hóa sớm cũng giống với việc mở hộp Pandora trong kỹ thuật.
Một thiết kế tốt sẽ làm những nhà thiết kế khác thấy như kẻ ngốc vì ý tưởng không phải của họ.
Mọi nhà phát triển phần mềm chuyên nghiệp đều có thể viết code chạy được, nhưng có một khoảng cách lớngiữa code chạy được và code chạy tốt và code trường tồn theo thời gian. Một thiết kế tốt sẽ khiến cho việc sửa lỗi trở nên dễ dàng, bởi vì lỗi sẽ xuất hiện đúng nơi đúng chỗ. Nói cách khác, khi kiến trúc được giữ vững, việc giải quyết bug sẽ đỡ tốn kém hơn và ít làm gia tăng các khoản nợ kỹ thuật.
TẤT CẢ NGHỆ THUẬT ĐỀU BẮT ĐẦU BẰNG MỘT KHUNG VẼ TRỐNG
Một nhà phát triển có khả năng biến suy nghĩ của họ thành một thứ gì đó hữu hình, là định nghĩa của sự sáng tạo. Màn hình là một khung vẽ trống đang chờ để được điền code và tạo ra một giải pháp duy nhất – nếu tác phẩm không phải là duy nhất, nó chỉ đơn giản là ‘sao chép và dán vào! Không có hai lập trình viên nào viết code giống hệt nhau, ngay cả khi phần mềm cuối cùng của họ xuất hiện, ở bên ngoài, giống hệt nhau. Mọi người đều có một tiếng nói riêng ngay cả khi họ là một lập trình viên. Và điều này thật tuyệt vời! Theo kinh nghiệm của tôi, từ việc tìm hiểu một code của nhà phát triển khác, bạn có thể đi vào tâm trí của họ và nhìn thế giới từ quan điểm của họ.
Sự hồi hộp khi có thể viết code thì rất khó để giải thích. Nó không chỉ là những dòng code khô khan. Hãy tưởng tượng là khi bạn code, bạn tưởng tượng ra kết quả, sau đó bạn đổ dữ liệu vào và bùm .. nó hiển thị ra màn hình đúng như những gì bạn tưởng tượng. Tuyệt vời phải không! Đó là phần thưởng về mặt trí tuệ và cảm xúc, đó là thành quả khi bạn thấy một cái gì đó từ lúc ý tưởng đến khi hoàn thành. Không quan trọng nó nhỏ hay lớn!
Trước khi tôi chuyển sang phần tiếp theo, đây là đoạn trích từ Donald Knuth, tác giả của loạt bài ‘Nghệ thuật lập trình máy tính’ (nó giống như thánh kinh của khoa học máy tính), khi ông được yêu cầu lựa chọn lời tựa cho tiêu đề cuốn sách:
Lập trình máy tính là một nghệ thuật, bởi vì nó áp dụng các kiến thức đã tích lũy vào thế giới, bởi vì nó đòi hỏi kỹ năng và sự khéo léo, và đặc biệt là vì nó tạo ra các nguyên liệu của cái đẹp.
SỰ SÁNG CHÓI CỦA THUẬT TOÁN LÀ SỰ TINH TẾ TỘT CÙNG
Thuật toán là phương pháp giúp lập trình hiệu quả. Nó là xương sống của lập trình khi nó mô tả một cách có hệ thống tất cả các bước để giải quyết vấn đề. Mặc dù logic và kỹ năng phân tích là các hoạt động của não trái, giải quyết vấn đề lại là một quá trình sáng tạo bằng cách sử dụng “cơ bắp tinh thần” ở bên não phải. Bí quyết để giải quyết vấn đề hiệu quả là làm chủ sự phức tạp, như chúng ta đã thảo luận trước đó, sự phức tạp có thể có tác động xấu đến các chương trình.
Tất cả các thuật toán tốt nhất tôi đã thiết kế, đã xem hoặc đã nghiên cứu đều có một điểm chung: chúng dựa trên các ý tưởng đẹp để giải quyết các nhiệm vụ một cách hiệu quả hơn, đồng thời tránh các chi tiết không cần thiết và phức tạp. Các thuật toán góp phần quan trọng vào hoạt động của codebase, một số có thể kể tên là: đại số Boolean đơn giản, kỹ thuật tổ hợp sáng tạo, lựa chọn cấu trúc dữ liệu khôn ngoan, sử dụng ngắn gọn các biểu thức chính quy, sử dụng tài nguyên tốt và tuân thủ các nguyên tắc SOLID.
Có một nghịch lý thú vị ở đây, khiến cho việc tạo ra các thuật toán trở thành một nhiệm vụ phức tạp:
Không có thuật toán cho sự sáng tạo – Andy Hargreaves
CHUYỆN PHONG CÁCH CODE
Chúng ta đã tìm hiểu qua tại sao code tốt cần phải đơn giản và thiết kế tốt. Bây giờ tôi sẽ chuyển sang khía cạnh thẩm mỹ của lập trình: bố cục code. Sự xuất hiện trực quan của code được định dạng tốt có liên quan mạnh mẽ đến chất lượng của nó và nhiều lập trình viên tự hào việc này, họ cảm thấy hài lòng từ việc đánh bóng nó, vì họ nhận ra rằng một lập trình viên được nhớ đến vì phong cách và kỷ luật của anh ta chứ hiếm khi về nội dung code.
Code không chỉ được viết cho các máy tính thực thi mà còn cho các lập trình viên khác đọc và giải mã khi họ cố gắng xem lại, mở rộng, sửa, tái cấu trúc hoặc gỡ lỗi nó. Như vậy, một định dạng chính xác và nhất quán về cấu trúc logic của code là điều cần thiết.
Chìa khóa là sử dụng thụt lề và khoảng trắng. Tương tự như vậy, sử dụng bố cục tốt để giữ được định dạng khi có sự thay đổi: thay đổi 1 dòng code không nhất thiết phải thay đổi các dòng khác. Điều đó có thể nói lên rằng, chén thánh của việc giao tiếp giữa các lập trình viên là các đoạn code sẽ tự nó mô tả về chính nó, nghĩa là: sử dụng comment vừa đủ, đặt tên có ý nghĩa, sử dụng các hàm nhỏ, dễ kiểm tra, thuần túy, … v.v
Code tốt là tài liệu tốt nhất – S. McConnell
Vì thế, CODE ĐẸP là code trong sáng, dễ đọc, dễ hiểu. Nó có sự cân bằng. Cấu trúc, hình dạng và kiến trúc của nó cho thấy ý định của nó. Mỗi phần tương đối nhỏ và có một mục đích duy nhất. Giống như một bức tranh khảm: tất cả các đoạn code nhỏ khớp hoàn hảo với nhau, nhưng đồng thời chúng có thể tách ra dễ dàng khi một yếu tố cần thay đổi!
PHẦN KẾT
Mỗi khi chúng ta viết code, chúng ta đang đi một con đường không xác định hướng tới một giải pháp chưa xác định; một cái chưa bao giờ được tạo ra trước đây! Đó là một hành trình khám phá bản thân và thể hiện trí tuệ của chúng ta. Đây chính xác là nghệ thuật!
Chúng ta không phải là loại nghệ sĩ tạo ra niềm vui thị giác cho người khác chiêm ngưỡng. Nhưng khi chúng ta yêu một cái gì đó, chúng ta đặt vẻ đẹp vào đó!
Theo: Nguyễn Gnoc