Head First Design Patterns

headfirst_pattern
Tôi bắt đầu tự hỏi rằng quyển Head First Design Patterns nên được đặt tên là Ass Backwards Design Patterns. Đây là một đoạn trích từ trang 594-595 của quyển sách 629 trang này:
Đầu tiên, khi bạn thiết kế hãy giải quyết các vấn đề một cách đơn giản nhất. Mục tiêu của bạn nên đơn giản thay vì tự nghĩ “làm cách nào để ứng dụng một pattern vào bài toán.”. Đừng nghĩ bạn không phải là một lập trình viên xịn nếu bạn không sử dụng các pattern để giải quyết các vấn đề. Các lập trình viên khác sẽ rất tôn trọng và đánh giá cao sự đơn giản trong thiết kế của bạn. Thật sự thì, đôi lúc cách tốt nhất để giữ thiết kế của bạn đơn giản và hiệu quả là sử dụng pattern.
Không ai nói lúc nào thì nên bỏ sử dụng pattern, bạn sẽ nghĩ rằng thật là báng bổ! Không, chúng ta đều đã trưởng thành, chúng ta phải chấp nhận nó. Thế thì khi nào bạn nên bỏ đi một pattern? Khi hệ thống của bạn trở nên rắc rối và sự mềm dẻo (scalable) mà bạn tạo nên là không cần thiết. Nói cách khác, một giải pháp đơn giản không cần pattern sẽ tốt hơn.
Design patterns rất mạnh mẽ, và chúng ta có thể dễ dàng thấy cách chúng được sử dụng trong các thiết kế và lập trình viên thường sẽ thích tạo ra các kiến trúc thiết kế mà ở đó sẵn sàng cho các thay đổi trong mọi trường hợp.
Nếu bạn không đồng ý với việc tạm bợ, nếu bạn cần hỗ trợ cho việc thiết kế, hãy sử dụng pattern để giải quyết các thay đổi. Tuy nhiên, nếu nguyên nhân chỉ là muốn giải quyết các giả định, đừng dùng pattern, điều đó chỉ làm hệ thống của bạn thêm rắc rối, và bạn có thể chẳng cần đến nó.
Mẹ cha ơi, suốt 593 trang trước đó thì rao giảng ra rả về các pattern, sau đó thì lược lại bằng một hướng dẫn như vậy ở phần cuối của quyển sách thật là thiếu trách nhiệm. Lời khuyên kiểu này phải để ở những trang đầu tiên với cỡ chứ 72…
Các lập trình viên mới vào nghề sẽ không bao giờ gặp pattern họ không thích, khuyến khích họ sử dụng pattern giống như việc thêm dầu vào lửa, và chưa nói đến việc cuốn sách thật sự làm gì, trang 597 chỉ cách người mới nên lạm dụng các pattern.
Các lập trình viên mới vào nghề nên sử dụng pattern ở mọi nơi, điều đó rất tốt, họ sẽ có rất nhiều kinh nghiệm với việc sử dụng các pattern trong thực tế. Họ cũng phải nghĩ rằng, dùng pattern càng nhiều, design của họ sẽ ngày một tốt. Người mới vào nghề sẽ học được rằng, tất cả các design nên đơn giản nhất có thể, sự phức tạp của pattern chỉ nên sử dụng ở nơi chúng cần ứng dụng để có thể mở rộng được.
Bạn có thật sự muốn một junior dev sử dụng pattern ở mọi nơi? Điều đó thật sự thì an toàn giống như việc khuyến khích họ thử dùng cưa xích vậy. Cách tốt nhất để học viết code đơn giản là viết code đơn giản! Pattern là một dạng lằng nhằng, phức tạp và nên bỏ qua cho đến khi chúng thực sự cần thiết. Đó là điều đầu tiên người mới cần học, không phải là điều cuối cùng.
Quyển sách không chỉ có điều đó là tệ, bạn có biết cô gái ở bìa quyển sách chỉ ra 1 điều khủng khiếp về 2 mặt cuộc sống? Yep, học sinh ban ngày và vũ nữ buổi tối. Hoặc, có thể không phải…
Lời người dịch:
Wow, đọc xong bài báo của bác Jeff, tớ cũng hơi giật mình, bác này đanh đá thật, tuy nhiên cũng có ý đúng trong bài viết :). Thực tế thì tớ đã đọc quyển này 2 lần, lần đầu là khi bắt đầu học lập trình enterprise, để nói thực, thì tớ không hiểu nhiều và do kiểu học có phần “xôi thịt” nên không vào đầu được mấy, chưa kể lúc đó tớ chưa code nhiều, kinh nghiệm thực tế ít nên đọc một số principle của quyển sách không hiểu được bản chất và chỉ khấn như đọc kinh vậy thôi chứ không ngấm. Gần đây tớ có đọc lại một cách chậm chậm thì hoá ra trong quyển sách có nhiều đoạn đã inject các principal như SOLID, DRY,… có chăng người đọc nếu có nền về những thứ đó thì sẽ nhanh hơn.
Vậy bác Jeff viết có đúng không, theo tớ thì cũng đúng, bạn nên có một chút kinh nghiệm rồi thì hẵng nghĩ tới design pattern, design pattern không đơn giản như những gì quyển sách mang đến.
Tuy nhiên, phải nói tới điểm cộng tuyệt vời của chuỗi sách Head First là cách xây dựng, đưa đẩy rất tốt, giúp người đọc hiểu dễ hơn về các vấn đề. Chẳng hạn, người viết đã xây dựng từng bước, từ lúc đầu tiên khi bắt đầu xử lý problem cho tới từng bước brain storming và xây dựng pattern, áp dụng nó vào thực tế bài toán…
Vậy, tớ nghĩ khác với bác Jeff chút, người mới học Java cũng nên đọc quyển này, nhưng đọc để biết về pattern và để quên (đừng vội áp dụng vào bài toán thực tế sớm), sau đó khi có đủ kinh nghiệm lập trình, hãy quay lại đọc và ngẫm nghĩ, kết hợp với việc đọc những quyển khác như:
  • Design Patterns : Elements of Reusable Object-Oriented Software
  • Patterns of Enterprise Application Architecture
  • Design Patterns Explained

Sau đó áp dụng thử với công việc của mình và tiếp tục ngấm dần và ngộ dần :). Đây không phải là chuyện một hai ngày đâu, hãy cứ yên tâm là không vội được.

Vì chặng đường làm 1 software developer không hề đơn giản, và chặng đường để trở thành 1 software architect giỏi thậm chí còn gian nan hơn rất nhiều 🙂

Advertisements