Lập trình không có comment

Bài viết được dịch từ blog Coding Horror

Nếu việc gieo rắc vào code của bạn với nhiều comment là tốt, thì việc có vô số comment trong code của bạn sẽ là rất tuyệt vời, đúng không nào? Nhưng điều đó hoàn toàn không đúng. Vượt quá giới hạn là một cách để những comment tốt trở nên tồi:

Chúng ta phải viết comment trong code sao cho hiệu quả nhỉ?Chúng ta phải viết comment trong code sao cho hiệu quả nhỉ?

'*************************************************
' Name: CopyString
'
' Purpose: This routine copies a string from the source
' string (source) to the target string (target).
'
' Algorithm: It gets the length of "source" and then copies each
' character, one at a time, into "target". It uses
' the loop index as an array index into both "source"
' and "target" and increments the loop/array index
' after each character is copied.
'
' Inputs: input The string to be copied
'
' Outputs: output The string to receive the copy of "input"
'
' Interface Assumptions: None
'
' Modification History: None
'
' Author: Dwight K. Coder
' Date Created: 10/1/04
' Phone: (555) 222-2255
' SSN: 111-22-3333
' Eye Color: Green
' Maiden Name: None
' Blood Type: AB-
' Mother's Maiden Name: None
' Favorite Car: Pontiac Aztek
' Personalized License Plate: "Tek-ie"
'*************************************************

Tôi luôn luôn bắt gặp những comment từ những lập trình viên mà dường như họ không hiểu rằng đoạn code đó đã thực sự nói với chúng ta nó làm việc như thế nào rồi; chúng ta cần comment để nói về tại sao nó lại làm việc như vậy. Comment trong code cũng thường bị hiểu sai và lạm dụng một cách tràn lan đến nỗi đôi khi bạn cũng tự hỏi rằng liệu có đáng để sử dụng comment chút nào không nhỉ? Nhưng hãy cẩn thận với mong ước đó của bạn. Đây là một đoạn code mà không có bất kỳ chút comment nào:

r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

Bạn có bất kỳ ý nghĩ nào về điều mà đoạn code đó làm không? Nó thì hoàn toàn dễ đọc, nhưng nó đang làm cái quái gì thế?

Hãy bổ sung thêm một dòng comment nhé.

// square root of n with Newton-Raphson approximation
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

Đó có phải là điều mà tôi đang tìm kiếm, đúng không nào? Có một chút dễ chịu hơn, và đã tiến tới điểm giữa của con đường thỏa hiệp giữa hai thái cực là không có comment chút nào cả và có một comment tràng giang đại hải sau mỗi 2 dòng code?

Không chính xác là vậy. Thay vì bổ sung thêm một comment, thì tôi thích sửa nó lại thế này hơn:

private double SquareRootApproximation(n) {
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
return r;
}
System.out.println( "r = " + SquareRootApproximation(r) );

Tôi đã không bổ sung thêm bất kỳ một dòng comment nào, và bây giờ thì đoạn code khó hiểu đó đã hoàn toàn rõ như ban ngày.

Trong khi các comment vốn đã hoặc là tốt hoặc là tồi, chúng thường xuyên được sử dụng như một vật chống đỡ. Bạn nên luôn luôn viết code như thể là các dòng comment không tồn tại vậy. Điều này ép buộc bạn phải viết code của mình sao cho đơn giản nhất, rõ ràng nhất, và hầu như phần code đó tự bản thân nó đã nói lên chức năng của nó làm gì rồi.

Khi bạn đã rewritten, refactored, và rearchitected phần code của mình hàng tá lần để khiến cho nó trở nên dễ dàng cho các lập trình viên đồng nghiệp của bạn có thể đọc và hiểu được — khi bạn không thể tưởng tượng ra bất kỳ cách nào để code của bạn có thể trở nên rõ ràng và dễ hiểu hơn — thì, và chỉ khi đó, bạn mới cảm thấy vạn bất đắc dĩ bổ sung thêm một comment để giải thích điều mà đoạn code đó làm.

Như Steve đã chỉ ra rằng, đây là một điểm khác biệt chính giữa lập trình viên junior and senior:

Ngày xưa, việc phải nhìn quá nhiều code một lúc thường vượt quá điểm ngưỡng chịu đựng về sự phức tạp của tôi, và khi tôi phải làm việc cùng nó thì tôi thường cố gắng rewrite nó hoặc ít ra thì tôi viết comment rất nhiều. Tuy nhiên, ngày nay tôi chỉ làm việc say mê qua nó mà không than phiền (nhiều). Khi tôi đã có một mục tiêu xác định trong tâm trí và một mẩu code phức tạp để viết, tôi dành thời gian của mình để làm nó hơn là cứ ngồi kể câu chuyện của mình về nó [bằng các comment].

Các lập trình viên junior dựa vào các comment để nói lên câu chuyện khi mà họ nên dựa vào code để nói lên câu chuyện đó. Các comment mang tính tường thuật; quan trọng theo cách của riêng chúng, nhưng không có cách nào có thể thay thế cốt truyện, đặc tính và các thiết lập được cả.

Có lẽ đó là một bí mật hơi bẩn thỉu của các comment trong code: để viết các comment tốt thì bạn phải là một tay viết tốt. Các comment không phải là code dành cho trình biên dịch, chúng là những từ để truyền đạt các ý tưởng với những người khác. Trong khi tôi (hầu như) rất yêu quý những đồng nghiệp lập trình viên của mình, nhưng tôi không thể nói rằng việc truyền đạt hiệu quả với người khác là thế mạnh của chúng ta. Tôi đã từng nhìn thấy những bức email dài tới 3 đoạn từ những lập trình viên trong nhóm của mình mà khiến tôi cảm thấy não mình tan chảy. Liệu đây có phải là những người mà chúng ta đang tin tưởng sẽ viết ra những dòng comment rõ ràng và dễ hiểu trong code của mình? Tôi nghĩ rằng có thể một số người trong chúng ta phải trở nên gắn chặt với điểm mạnh của mình hơn — đó là, viết cho trình biên dịch theo một cách rõ ràng nhất mà chúng ta có thể làm, và chỉ sử dụng comment khi đó là phương án cuối cùng.

Việc viết những comment tốt và có ý nghĩa thường rất khó. Nó cũng khó như là nghệ thuật viết code vậy; thậm chí còn khó hơn là đằng khác. Như Sammy Larbi đã nói trong bài Common Excuses Used To Comment Code rằng: nếu bạn cảm thấy code của bạn quá phức tạp để có thể hiểu mà không có comment đi kèm, thì code của bạn có thể rất tồi. Hãy viết lại nó cho tới khi không cần chút comment nào nữa. Nếu bạn đã hoàn thành xong nỗ lực đó, nhưng bạn vẫn cảm thấy các comment là cần thiết, thì hãy bổ sung thêm các comment. Nhưng thật cẩn trọng.

Các bài viết liên quan:

Về tác giả bài viết:

Jeff_atwood_coding_horrorJeff Atwood là một chuyên gia công nghệ tại Mỹ, hiện đang sinh sống và làm việc tại Berkeley, CA. Anh là một kỹ sư phần mềm chuyên về công nghệ Microsoft .NET, và là một blogger nổi tiếng trong cộng đồng công nghệ với blog Coding Horror, anh là người sáng lập và kiêm Giám đốc điều hành (CEO) của trang web hỏi đáp uy tín Stack Overflow và cũng là đồng sáng lập của Stack ExchangeDiscourse.

Advertisements

4 comments on “Lập trình không có comment

  1. Comment là 1 vấn đề rất quan trọng
    – Người không biết code thường ko comment, viết code không ai hiểu
    – Người biết code thì phải biết viết comment
    – Người code giỏi thậm chí không cần comment nhưng code vẫn dễ hiểu.
    Có câu rất hay “the best kind of comments are the ones you don’t need” 😀 Vì nhiệm vụ của comment chỉ mục đích “Code Tells You How, Comments Tell You Why” chứ không phải giảm độ phức tạc cho dòng code của bạn.
    Cảm ơn vinacode vì bài viết.

  2. Bài viết rất hay và ý nghĩa,nhất là cho các bạn trẻ vừa bước vào môi trường lập trình.Đừng nghĩ vấn đề đặt tên biến hoặc comment là vấn đề nhỏ nhặt.Nó chính là nền tảng cho sự chuyên nghiệp của bạn và thể hiện cả trình độ cũng như đam mê của bạn trong từng dòng code.Mình cũng là 1người chân ướt chân ráo vừa ra trường chứ chưa làm được gì to tát nhưng mình nghĩ ..chúng ta thường lo xây nhà cao tầng để rồi chợt nhớ ra chúng ta chưa làm phần móng..Vì thế hãy luyện tập cách viết code Kiss và comment đúng lúc cần thiết để xây dựng nền móng vững chắc cho mình.Xin cám ơn

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s