Thông thường trong mỗi một căn phòng, mỗi người sẽ có sắp xếp riêng, thậm chí là không có bất kỳ sự sắp xếp gì cả, bạ đâu vứt đấy, miễn là khi cần bạn vẫn có thể tìm ra thứ mình cần tìm là được, với cá nhân bạn nó vẫn được gọi là “sạch”.

Bạn có thể thấy “sạch” nhưng người khác lại thấy bừa bộn

Tuy nhiên khi một người nào đó bước vào phòng của bạn và họ không thể tìm thấy cái mà họ cần tìm thì với họ đó không phải là sạch nữa. Với lập trình cũng vậy, mỗi người sẽ có một cách code riêng và đó là sạch theo ý chủ quan, tuy nhiên với người tiếp nhận code của bạn thì đó là một cơn ác mộng thực sự. Đây là câu chuyện mình gặp quá nhiều khi đi làm outsource, có những lúc tưởng chừng như không thể maintain được dự án nữa. Và đó cũng chính là lúc mình mấy thấy ý nghĩa thực sự của clean code (mã sạch).

Clean code là gì?

clean code
clean code

Từ ví dụ ở trên chúng ta có thể thấy được clean code là các mã nguồn có khả năng đọc hiểu được bởi người tạo ra và những người tiếp nhận. Giá trị mà clean code mang lại là những mã nguồn dễ đọc, dễ nâng cấp bảo trì trong suốt vòng đời của một sản phẩm.

Nguồn ảnh: https://blog.knoldus.com/keep-your-code-clean/

Làm sao để đạt được clean code?

Những nguyên tắc trong lập trình
Những nguyên tắc trong lập trình

Nguồn ảnh: https://medium.com/@theody85/programming-principles-i-the-basics-d78238fce59a

Bản chất của clean code đó chính là việc chúng ta tuân thủ theo những quy tắc chung kinh điển mà hầu hết mọi người đều biết, những nguyên tắc đó bao gồm:

  1. Phải thiết kế trước: Trước khi lập trình, chúng ta phải thiết kế trước để hình dung phần mềm sẽ có những thành phần nào, được sắp xếp ra sao và liên kết thế nào.
  2. Single responsibility: Mỗi hàm, mỗi lớp nên thực hiện các tính năng riêng biệt, như mỗi người nên tập trung vào thế mạnh của mình thay vì làm quá nhiều việc đồng thời.
  3. Open-Close: Đóng với việc sửa đổi và mở với việc mở rộng, hạn chế thay đổi mã nguồn ổn định và tạo mã mới nếu cần, như một nhóm hoạt động tốt thì hạn chế thay đổi nhân sự, nếu cần có thể tuyển mới.
  4. Liskov substitution: Sử dụng tham số mà không làm phá vỡ chương trình đang chạy ổn định. Ví dụ, thay thế một chú chó thật bằng một chú chó máy nhưng cả hai đều phải trông được nhà.
  5. Interface segregation: Chia nhỏ các giao diện lập trình. Ví dụ, một nhà kho có thể chia thành nhiều cửa: cửa nhập hàng, cửa xuất hàng, cửa thoát hiểm để cụ thể hóa và thuận tiện cho các công việc khác nhau.
  6. Dependency inversion: Đảo ngược phụ thuộc, thay vì mô đun chính khởi tạo tất cả, framework sẽ làm việc này, giúp lập trình viên tập trung vào nghiệp vụ mà không cần quản lý các đối tượng phụ thuộc.
  7. Keep it simple, stupid (KISS): Giữ cho mọi thứ đơn giản, dễ theo dõi. Ví dụ, khi báo cáo có thể sử dụng hình ảnh, biểu đồ thay vì văn bản.
  8. Write DRY code: Đừng lặp lại mã nguồn giống nhau ở nhiều nơi, như việc đừng để nhiều người trong một tổ chức làm cùng một công việc.
  9. You aren’t going to need it (YAGNI): Bỏ đi những thứ không dùng đến và những thứ không cần thiết nữa.
  10. Composition over inheritance: Sử dụng các lớp hỗn hợp thay vì thừa kế để có thể sử dụng chung các thành phần và giảm thiểu mã nguồn unit test.
  11. Separation of concerns: Tách mối quan tâm, chia mã nguồn thành các mô-đun khác nhau để phát triển song song và có thể hợp lại khi cần.
  12. Self-comment: Đặt tên biến, hàm, lớp rõ ràng dễ hiểu để không cần phải viết tài liệu.
  13. Document your code: Đối với các mã nguồn phức tạp thì cần viết tài liệu mô tả và hướng dẫn sử dụng.
  14. Refactoring: Nếu phần mềm hoạt động ổn định thì không nên thay đổi, nhưng nếu có cơ hội thì có thể sửa đổi mã nguồn sao cho tối ưu hơn, cần có chiến lược và kinh nghiệm.
  15. Clean code: Làm sạch mã nguồn, giúp nó trở nên trong sáng, dễ theo dõi và nâng cấp hơn.
  16. Unit test: Viết các mã nguồn kiểm thử các hàm để đảm bảo những logic nhỏ nhất đều hoạt động đúng.
  17. Đừng lạm dụng thư viện: Hạn chế sử dụng thư viện để dễ nâng cấp về sau và giảm chi phí vận hành.
  18. Không được quên bảo mật: Khi lập trình cần chú ý các nguyên tắc bảo mật để bảo vệ phần mềm, hệ thống và người dùng.
  19. Xây dựng chiến lược log: Cần có chiến lược lưu lại lịch sử hoạt động của phần mềm để thuận tiện cho việc gỡ lỗi và vận hành.
  20. Đừng tối ưu hóa quá sớm: Cần bám sát yêu cầu phát triển của đội ngũ kinh doanh, hạn chế tranh luận và chỉ nên tối ưu khi thực sự cần thiết.
  21. Cẩn thận với SQL: Cần hiểu biết đầy đủ về việc đánh chỉ mục, cẩn thận với hàm đếm, hàm xóa dữ liệu và các cách phân trang trong SQL.

Đây là 21 nguyên tắc gần như sống còn trong lập trình và bạn cần tuân thủ để đạt được clean code.

Bao lâu thì có thể thành thạo clean code?

Để đạt được clean code bạn phải tuân thủ theo các nguyên tắc lập trình kinh điển, nghe thì dễ nhưng làm thì lại khó vì nó liên quan đến kỹ thuật lập trình, với cá nhân mình phải mất 8 năm mình mới thực sự tự tin vào khả năng clean code của mình, các bạn có thể nhanh hơn, nhưng mình nghĩ ít nhất cũng phải 5 năm kinh nghiệm.

Tổng kết

Clean code là mong muốn của hầu hết các lập trình viên, nó giúp cho mã nguồn dễ đọc, dễ nâng cấp bảo trì. Để đạt được clean code bạn sẽ cần tuân thủ theo các nguyên tắc cơ bản trong lập trình và điều này không dễ, sẽ phải mất ít nhất 5 năm kinh nghiệm, chúc các bạn sớm trở thành code cleaner nhé.