Khô Hay Ướt

Duplication is far cheaper than the wrong abstraction
Huy Ngo
Sep 12, 2020

Nhiều lúc ngồi nghe câu chuyện giữa các lập trình viên mọi người sẽ nghe thấy những câu nói khá ngộ nghĩnh. Kiểu như mày làm “ướt” quá rồi nè, làm cho nó “khô” lại đi, hay thôi cứ để nó “ướt” vậy luôn đi. Nhiều người đi ngang nghe tưởng có gì mờ ám. Thực ra “khô” (DRY) và “ướt” (WET) là những thuật ngữ kỹ thuật quen thuộc của dân lập trình.

DRY (khô), viết tắt của Don’t Repeat Yourself, tạm dịch sang tiếng Việt là “đừng lặp lại chính mình”. Đại loại là đừng viết những đoạn code (mã nguồn) giống nhau ở nhiều nơi.

Đây là nguyên lý tui tâm đắc nhất từ thời mới biết lập trình. Hồi đó tui dành khá nhiều thời gian để xem lại những gì mình viết. Nếu vẫn chưa “ngon” tui sẽ bắt đầu tìm hiểu xem còn “chiêu” nào khác để “xử” hôn. Mấy dự án thời đại học tui tốn khá nhiều thời gian để cải tiến code. Đáng buồn là mấy thầy cũng chả quan tâm 😭.

Sau này tui nhận ra “khô” không phải lúc nào cũng tốt. Nói đúng hơn là “khô” bằng mọi giá đôi khi sẽ gây ra nhiều tác dụng phụ.

Mấy năm trước tui làm chung với một anh sen-ni-ờ (senior - lập trình viên có nhiều kiến thức và kinh nghiệm) trên một tính năng khá phức tạp. Tui khá tự tin vào những thứ mình đã học nên nói để em làm cái này cho. Rồi tui bắt đầu tung hết mười thành công lực, bấm bấm gõ gõ, bao nhiêu mẫu thiết kế từ đơn giản đến nâng cao đều được đưa vô sài thử. Nếu còn bất cứ chỗ nào chưa “ngon” thì phải ngay lập tức sửa lại hết. Cuối ngày lúc nhìn lại đoạn code mình đã làm tui cực kì hài lòng, vỗ đùi đánh đét một cái. Đẹp, gọn, khô ráo. Ngon!

Vậy mà ông anh se-ni-ờ lại làm tui cụt hứng. Xem qua phần code của tui xong ổng nói sao mày làm phức tạp dzậy. Tui lại phải giải thích cho ổng hết những chiêu thức tui đã áp dụng và những thứ ưu việt của chúng. Lúc đầu em cũng nghĩ như anh, nhưng mà có mấy đoạn cứ phải lặp lại chỗ này chỗ kia, nhìn chả bờ-rồ (pro - professional - chuyên nghiệp) tí nào. Tụi ABC XYZ nó cũng làm giống vậy á. Cuối cùng ông anh đành phải thuận theo cách của tui, vì dù sao tui cũng đã làm rồi. Hoặc là vì tui trẻ khoẻ bự con hơn ổng.

Bẵng đi một thời gian, tầm đâu 2 - 3 tháng sau, bên nhóm thiết kế yêu cầu sửa lại tính năng đó. Vụ này tui không lường trước được, nên thiết kế cũ hoàn toàn không thể đáp ứng. Sau khi loay hoay một hồi tui đành phải chấp nhận sự thật: đập bỏ hết cái cũ để quay về kiểu đơn giản trước đó. Ông anh bắt đầu cười sằn sặc, thấy chưa anh biết mà, chú còn non và xanh lắm.

Tui hậm hực, đỏ mặt tía tai, nói chắc anh biết trước chớ gì. Em mà cũng biết vụ này thì cũng đâu có làm vậy. Ổng tỉnh bơ, nói anh đâu có biết, nhưng mà lúc mình chưa chắc thì “duplication is far cheaper than the wrong abstraction”.

Đó là một câu nói khá nổi tiếng của Sandi Metz, tạm dịch là code bị trùng lặp vẫn ít đáng sợ hơn rất nhiều so với thiết kế sai(*). Ông anh se-ni-ờ vì đã quen với thay đổi kiểu từ trên trời rớt xuống nên luôn ưu tiên chọn những phương án đơn giản và dễ thay đổi. Cuối cùng ổng đã đúng.

Sau vụ đó tui mới biết là khá nhiều lập trình viên khác cũng làm vậy. WET (ướt), viết tắt của Write Everything Twice (lặp lại mọi thứ hai lần), đề cập tới cách làm này. Đại loại là, nếu một đoạn code chỉ lặp lại một lần trong khi việc cải tiến nó khá phức tạp, thì thôi tốt nhất cứ để nó vậy đã. Nếu sau này thấy chắc chắn là nó bị lặp lại nhiều lần thì lúc đó hãy cân nhắc viết lại bằng những cấu trúc phức tạp hơn (abstraction).

Tất nhiên, WET (ướt) không phải là một quy tắc chính thống như DRY (khô) và thường chỉ được coi như là một kinh nghiệm tuỳ cơ ứng biến. Bởi vậy, lâu lâu ngồi tán dóc với đồng nghiệp, tui vẫn hay nói: “Bình thường thì vẫn thích khô, nhưng mà lâu lâu thì cũng cần phải ướt!”

Còn mọi người thích khô hay ướt?

========

(*) “Abstraction” trong lập trình là một khái niệm trừu tượng để chỉ cách lập trình viên gom nhóm các phần logic thành các thành phần khác nhau trong quá trình thiết kế code. Giải thích về abstraction hơi phức tạp so với nội dung bài viết nên tui tạm dịch là “thiết kế”, có thể không đúng lắm với một số bạn.