PHP - The Wrong Way
Trong "Thế giới" lập trình PHP (World of PHP), một loạt các xu hướng đang được nhiều người, nhiều cuốn sách được tuyên truyền là "Modern PHP" trong khi tất cả các cách tiếp cận khác bị "cau mày" (frowned) vì ngược lại, "stupid" hoặc là sai lầm. Bài viết này được tạo ra nhằm cố gắng đưa ra một ...
Trong "Thế giới" lập trình PHP (World of PHP), một loạt các xu hướng đang được nhiều người, nhiều cuốn sách được tuyên truyền là "Modern PHP" trong khi tất cả các cách tiếp cận khác bị "cau mày" (frowned) vì ngược lại, "stupid" hoặc là sai lầm.
Bài viết này được tạo ra nhằm cố gắng đưa ra một cái nhìn thực dụng về lập trình PHP. Một quan điểm dựa trên kinh nghiệm và kết quả đúc kết từ thực tế chứ không phải là các xu hướng, lý thuyết hoặc học thuyết phổ biến.
Sự nguy hiểm của chủ nghĩa cực đoan
Một vấn đề với các quy tắc và hướng dẫn (rules and guidelines) là nó thường chỉ được phục vụ cho các mục đích trong một ngữ cảnh cụ thể. Một quy tắc tốt áp dụng đúng ngữ cảnh sẽ trở nên cực kỳ hữu ích. Trên thực tế, một quy tắc tốt sẽ trở nên tồi tệ khi áp dụng nó một cách cực đoan vào tất cả các trường hợp.
Nguyên tắc KISS, viết tắt của cụm từ “Keep It Simple, Stupid”, là một nguyên tắc cực kì khôn ngoan và tốt, nó thường được dùng như là một lời khuyên của những người có kinh nghiệm dành cho những lập trình viên trẻ. Tuy nhiên ngay cả nguyên tắc "khôn ngoan" này cũng sẽ trở thành nguy cơ cho một dự án nếu bị "áp dụng đến cùng".
All general purpose PHP frameworks suck!
-- Rasmus Lerdorf
Nhiều lập trình viên hôm nay đã bỏ qua các nguyên tắc cơ bản của lập trình và họ dành nhiều thời gian để tưởng tượng những thứ phức tạp mới, thông minh hơn, "cool" hơn và dễ chấp nhận hơn bởi bất cứ ai mà họ coi là đồng nghiệp.
Trong ngành công nghiệp phần mềm, bạn có thể so sánh việc phát triển một ngôi nhà với việc xây dựng một ứng dụng. Xây dựng ứng dụng bằng việc sử dụng các framework, bạn sẽ như là người thợ mộc sẽ phải thiết kế nội thất sao cho phù hợp với yêu cầu của cả khách hàng và kiến trúc hiện tại của ngôi nhà. Sẽ không dễ dành cho bạn khi bạn muốn thay đổi một phần nào đó của ngôi nhà để công việc của bạn trở lên nhanh chóng hơn hoặc dễ dàng hơn. Tương tự với các framework, khi bạn muốn thay đổi một thành phần nào đó của nó, bạn sẽ phải phải tìm hiểu cách vận hành của các thành phần liên quan đến thành phần mà bạn muốn thay đổi, đồng thời kiểm tra xem sau khi thay đổi ứng dụng của bạn có chạy sai hay gặp vấn đề gì không.
PHP được tạo ra bởi Rasmus Lerdorf như một tập hợp các công cụ được viết bằng C cho phép bạn dễ dàng và nhanh chóng phát triển các trang web động. PHP đã, đang và vẫn là a framework in and of itself
PHP đã phát triển ồ ạt từ đó và ngày nay PHP có thể được ứng dụng cho nhiều mục đích hơn. Nếu chúng ta xem PHP như là một "framework" thì không sai. PHP tự nhiên là một lớp trừu tượng để phát triển các ứng dụng web được viết hoàn toàn bằng các thủ tục C.
Sử dụng thư viện trong dự án của bạn chỉ là điều tự nhiên. PHP chính nó đi kèm với một bộ thư viện mà bạn có thể sử dụng để mở rộng code của riêng bạn. Ví dụ, PDO là một thư viện nhẹ cung cấp một giao diện thống nhất để truy cập cơ sở dữ liệu trong PHP.
Sử dụng một framework trên PHP là một vấn đề khác hoàn toàn. Nó có nghĩa là bạn đặt một lớp trừu tượng lên một lớp trừu tượng khác. Càng nhiều lớp trừu tượng bạn sử dụng, ứng dụng của bạn càng dễ trở lên mắc lỗi và sự trừu tượng càng cao thì chi tiết và hiệu quả sẽ bị mất.
Có thể hiểu cả đoạn text dài ở trên bằng 1 câu: Số dòng lý tưởng của code trong bất kỳ dự án nào càng ít càng tốt trong khi vẫn rõ ràng và dễ đọc nhất có thể!
What everyone doesn't need is a general purpose framework. Nobody has a general problem, everyone has a very specific problem they are trying to solve. Điều mọi người không cần là một framework chung. Không ai có chung một vấn đề chung, mọi người đều có một vấn đề cụ thể mà họ đang cố gắng giải quyết -- Rasmus Lerdorf
Trong công nghệ phần mềm, một mẫu thiết kế là một giải pháp tái sử dụng cho một vấn đề thường xảy ra trong thiết kế phần mềm. Một mẫu thiết kế không phải là một thiết kế hoàn chỉnh có thể được chuyển trực tiếp thành mã. Nó là một mô tả hoặc một ý tưởng để làm thế nào để giải quyết một vấn đề có thể được sử dụng trong nhiều tình huống khác nhau. Các mẫu thiết kế hướng đối tượng thường hiển thị các mối quan hệ và tương tác giữa các lớp hoặc các đối tượng, mà không nêu rõ các lớp ứng dụng cuối cùng hoặc các đối tượng có liên quan.
PHP hỗ trợ các mô hình bắt buộc, chức năng, hướng đối tượng, thủ tục và phản mô hình. PHP là một bộ công cụ rất lớn với nhiều công cụ khác nhau giúp bạn giải quyết nhiều vấn đề bằng nhiều cách khác nhau - không chỉ một cách.
Khi chúng ta cố gắng để cải thiện bản thân, và trong trường hợp này cụ thể hơn là mã của chúng ta, đôi khi chúng ta bị treo lên trong triết lý của một mô hình hoặc ý tưởng đặc biệt và có xu hướng quên suy nghĩ thực tế.
When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough - often that I'm generating by hand the expansions of some macro that I need to write. Khi tôi nhìn thấy các mẫu trong chương trình của mình, tôi coi đó là dấu hiệu của sự cố. Hình dạng của một chương trình chỉ phản ánh vấn đề nó cần để giải quyết. Bất kỳ sự thường xuyên nào trong mã này là một dấu hiệu cho tôi, ít nhất là tôi đang sử dụng các lớp trừu tượng không đủ mạnh - thường là tôi đang tạo ra bằng tay sự mở rộng của một số macro mà tôi cần viết.
-- Paul Graham
Chúng ta không nên tìm cách bắt kịp triết lý hoặc ý tưởng đằng sau một khuôn mẫu hoặc giải pháp cụ thể. Mối quan tâm chính của chúng tôi là giữ cho đoạn code dễ dàng điều chỉnh và hiểu rõ nhất có thể, và kết quả là dễ duy trì và dễ bảo mật.
I think patterns started off as generally recognized best solutions for common problems. But now that they have been around for a while and we have experienced applications being made ten times more complicated than they need to be because people try to cram in all the patterns that they have read about ("my application is well architected, because it is loaded to the gills with patterns.") my impression of the value of the pattern has shifted a bit. Tôi nghĩ rằng các mô hình bắt đầu như là giải pháp tốt nhất được công nhận tốt nhất cho các vấn đề phổ biến. Nhưng giờ đây họ đã trải qua một khoảng thời gian và chúng tôi đã trải nghiệm các ứng dụng phức tạp hơn mười lần so với cần thiết bởi vì mọi người cố gắng nhồi nhét trong tất cả các mẫu mà họ đã đọc về ("ứng dụng của tôi đã được kiến trúc tốt, vì nó được sử dụng cách mẫu thiết kế.") ấn tượng của tôi về giá trị của mô hình đã thay đổi một chút. -- Paul Weaton in Evil Design Patterns
The wrong way: Looking for a pattern to solve a problem.
The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle. Vấn đề với các ngôn ngữ hướng đối tượng là chúng đã có tất cả môi trường tiềm ẩn này mà chúng mang theo xung quanh. Bạn muốn có một quả chuối nhưng những gì bạn có là một con gorilla đang cầm quả chuối và cả rừng rậm.
-- Joe Armstrong in Coders at work - Reflections on the Craft of Programming
Nhiều nhà phát triển phần mềm, và nhiều công ty, cảm thấy rằng lập trình hướng đối tượng là cách hợp lý duy nhất để phát triển phần mềm ngày nay. Bất kỳ ai lập luận về lập trình hướng đối tượng thì ngay lập tức nhận thức được rằng họ đang tranh cãi với "sự khôn ngoan thông thường" của ngành công nghiệp.
Thực tế là cái gọi là lập trình hướng đối tượng như vậy thường gây ra một gánh nặng của sự phức tạp không cần thiết!
Ngày nay, một trong những điểm mạnh chính của PHP là hỗ trợ cho các mô hình bắt buộc, chức năng, hướng đối tượng, thủ tục và phản mô hình. PHP là một bộ công cụ rất lớn với nhiều công cụ khác nhau giúp bạn giải quyết được nhiều vấn đề bằng nhiều cách khác nhau - not just one way!
The object-oriented model makes it easy to build up programs by accretion. What this often means, in practice, is that it provides a structured way to write spaghetti code.
-- Paul Graham in Ansi Common Lisp
The wrong way: Always use object-oriented programming.
Một nguyên nhân giải thích cho việc sử dụng một framework là mọi người không muốn làm việc với các dòng code đã được viết từ đầu bởi những người khác.
Tuy nhiên, đây là một tâm lý kỳ lạ, chủ yếu gặp phải trong các nhà phát triển web trong cộng đồng PHP, đó là một sự thiếu chuyên nghiệp và kinh nghiệm. Viết ứng dụng và xử lý code của người khác là bình thường, nó là một phần của công việc hàng ngày của một lập trình viên chuyên nghiệp, nó không phải cái gì đó để sợ. Một lập trình viên chuyên nghiệp không nhìn vào code của các lập trình viên khác và bắt đầu rên rỉ về những dòng code của người lập trình cũ. Đây không phải là tư duy của một lập trình viên chuyên nghiệp. Không ai làm điều này.
Những codebases lớn nhất và thành công nhất trên thế giới là các codebase đã được phát triển bởi hàng trăm người thậm chí chưa từng gặp nhau, codebase được phát triển mà không cần sử dụng bất kỳ framework nào, codebase được thực hiện hoàn toàn bằng ngôn ngữ lập trình theo thủ tục mà không cần sử dụng bất cứ điều gì ngoại trừ mô hình thủ tục, và họ sẽ không mơ ước làm việc đó một cách khác.
Hạt nhân Linux (Linux Kernel ) bao gồm hơn 20 triệu dòng mã được viết hoàn toàn bằng cách sử dụng lập trình thủ tục bởi hơn 14.000 người tham gia mà không sử dụng bất kỳ framework nào.
Vậy nên, không nên giữ tâm lý sợ code của người khác, thay vì đó hãy cải thiện những đoạn code đó đồng thời cải thiện code của chính bạn để những người khác khi sử dụng code của bạn cũng sẽ không phải "sợ"