Bí thuật đơn giản hóa code của bạn

Tác giả: Eric Elliott

TL;DR: Abstractions (tính trừu tượng) sẽ là chìa khóa giúp code được đơn giản hóa đến mức tối đa. Khi code đơn giản, số lượng code cũng từ đó giảm đi. code trở nên dễ đọc, dễ adapt và duy trì hơn.

  11 mẹo đơn giản để tăng hiệu suất Java cấp tốc
  Làm animate siêu đơn giản với hook khi react component mount và unmount

Liệu rằng có phím tắt nào đẩy hiệu quả lên gấp 10 lần hay không? Nếu bạn biết bí mật này – sẽ mở ra một thế giới hoàn toàn mới về hiệu quả và khả năng phát triển phần mềm cho bạn?

Có nhiều ý kiến cho rằng, Thật ra chẳng có lối tắt nào đi đến thành công cả, tất cả mọi người đều phải luyện tập và luyện tập rất siêng năng. Điều này cũng đúng nhưng các chuyên gia bây giờ họ đang luyện cái gì, họ có bí kíp gì không?

Bí mật của các chuyên gia là họ biết đâu là sự khác biệt giữa năng suất trung bình và năng suất gấp 10. Với nó, bạn có thể viết code có thể tái sử dụng nhiều lần hơn, thậm chí ngay cả thêm requirements và thay đổi một số cấu trúc.

Bí quyết đẩy nhanh năng suất gấp nhiều lần chính là nắm vững tính trừu tượng – abstraction. Rất nhiều app bây giờ chứa hàng tấn code. Ví dụ nếu bây giờ in ra source code của top 10 app ra giấy thì bạn có tưởng tượng ra được số lượng giấy nhiều đến mức nào, có thể xếp thành tòa nhà cao tầng. Trong thực tế với số lượng code khổng lồ như vậy thì việc duy trì cũng rất tốn kém. Vì vậy càng nhiều code thì chi phí dành cho chúng càng nhiều.

Xem thêm Tại sao code của tôi thường ngắn gọn như vậy

Tính trừu tượng là chìa khóa của simple code

Tính trừu tượng (abstractions) chuẩn sẽ tạo ra code dễ đọc, dễ thích ứng và duy trì bằng các ẩn những chi tiết không quan trọng lắm với ngữ cảnh hiện tại, giảm số lượng code trùng lặp thực hiện cùng một việc.

Tính trừu tượng được hình thành bởi 2 yếu tố chính:

  • Generalization: loại bỏ các phần lặp và ẩn sau phần trừu tượng
  • Specialization: áp dụng tính trừu tượng cho trường hợp cụ thể, và chỉ thêm những gì khác biệt

Hãy xem qua đoạn code này:

const doubleList = list => {
  const newList = [];
  for (var i = 0; i < list.length; i++) {
    newList[i] = list[i] * 2;
  }
  return newList;
};

Đoạn code trên không có gì sai nhưng nó chứa khá nhiều chi tiết không cần thiết mấy:

  • Bao gồm chi tiết cấu trúc dữ liệu container/transport đang đuợc sử dụng (mảng), nghĩa là nó chỉ có thể hoạt động với mảng mà thôi. (state shape dependency).
  • Bao gồm logic lặp lại, nếu thực hiện thao tác khác mà cần truy cập các phần tử trong cấu trúc dữ liệu, bạn cần phải lặp lại logic trong đoạn code đó. Mà điều này sẽ vi phạm nguyên tắc DRY (Don’t Repeat Yourself).

Xem thêm DRY không hiệu quả, hãy dùng WET

  • Thay vì mô tả khai báo operation được thực hiện thì nó bao gồm nhiệm vị cụ thể và rõ ràng (thay vì dài dòng)

Tất cả những điều này đều không cần thiết và có thể đuợc ẩn sau abstraction. Trong trường hợp này thì abstractions trở nên phổ biến và biến đổi cách build app hiện nay, giảm số lượng for-loops.

Junior dev nghĩ rằng phải viết rất nhiều code để sản xuất ra giá trị, còn senior dev thì hiểu giá trị của những dòng code mà không cần được viết ra,

Hãy tưởng tượng một lập trình viên đã quen thuộc với việc sử dụng phương thức map trong các ngôn ngữ lập trình như JavaScript. Map tóm tắt các chi tiết như kiểu dữ liệu, kiểu cấu trúc dữ liệu, .. từ đó cải thiện độ hiệu quả của ứng dụng.

Jeremy Ashkenas đã giúp những phương thức như vậy phổ biến trong JavaScript, mở đường cho nhiều phím tắt, cú pháp đang được sử dụng hiện nay trong JavaScript (bằng cách tiên phong trong CoffeeScript). Ngoài ra ông đã tạo ra Underscore, Lodash và Backbone, phổ biến cấu trúc MVC trong JavaScript và tạo tiền đề cho Angular và React.

John Resig tạo ra jQuery rất phổ biến và có sức ảnh huởng, hình thành bộ sưu tập JavaScript module có thể tái sử dụng (plugin jQuery) mãi cho đến khi các Node module ES6 modules xuất hiện nhiều năm sau đó. Bộ API của jQuery có ảnh hưởng tới mức chúng tạo nền tảng cho DOM API hiện nay.

Abstraction phù hợp có thể là chiếc đòn bẩy – tác động đáng kể lên năng suất của những dòng code. Module, functions, variables, classes đều là các các dạng của abstraction lý do tồn tại của chúng là để làm abstractions/thành phần của abstraction dễ dàng hơn. Có thể nói không thể nào build một software phức tạp mà không dùng đến abstraction, đến những ngôn ngữ bậc thấp cũng sử dụng abstractions.

Bạn có thể tham khảo nội dung gốc tại Medium

Có thể bạn quan tâm:

Xem thêm việc làm Software Engineer lương cao, đãi ngộ tốt tại TopDev