Ngày hôm nay, chúng ta sẽ chứng kiến
trận đấu giữa một bên đeo đai đỏ là một lập trình viên đặc biệt từ
Envato là anh Ryan Allen, đại diện cho ngôn ngữ Ruby, người đã xây dựng
phiên bản đầu tiên của FlashDen
bằng đôi bàn tay trần của anh. Và ở góc kia, người đeo đai xanh là
Michael Wales, một thành viên nổi tiểng trong cộng đồng PHP và
CodeIgniter. Trận chiến giữa PHP vs. Ruby bắt đầu!
Trước khi chúng ta bắt đầu
Chúng ta phải lưu ý một điều rằng dạng tranh luận này đơn thuần với mục đích cho vui và để học tập là chính. Có rất nhiều lần bạn sẽ lựa chọn PHP cho một dự án, và có nhiều lần khác bạn lại chọn Ruby. Tuy nhiên, mục tiêu của bài viết này là học cách làm thế nào và khi nào thì đưa ra quyết định đó. Những cuộc tranh luận kiểu này không phải để nói “ngôn ngữ của bạn tồi” mà theo cách để đưa ra lý do tại sao và trong những tình huống chắc chắn nào thì lựa chọn ngôn ngữ này hơn ngôn ngữ kia.Các đối thủ
Đại diện cho ngôn ngữ Ruby là anh: Ryan AllenRyan Allen
Đại diện cho ngôn ngữ PHP là anh: Michael Wales
Michael Wales
Và… Bắt đầu!
1 – . Anh quen thuộc với cả PHP và Ruby như thế nào?Ryan: PHP là một trong những ngôn ngữ lập trình đầu tiên mà tôi đã làm việc cùng (bên cạnh đó là ActionScript và một chút Visual Basic). Tôi bắt đầu xây dựng một số thứ bằng PHP vào năm 2001. Tôi đã làm việc hoàn toàn với nó như là một công cụ backend cho tới cuối năm 2005, khi Ruby (và Rails) thay thế vị trí của nó.
Michael: PHP là ngôn ngữ đầu tiên giới thiệu tôi tới thế giới phát triển web, vào năm 1999 — vì vậy tôi muốn nói rằng mình có một sự hiểu biết khá vững chắc về vị trí của nó trong ngành công nghiệp của chúng ta, lịch sử của nó và hướng đi mà nó đã dẫn đầu. Đối với Ruby, thì cũng giống như nhiều người khác, nó tạo được sự chú ý của tôi bằng việc có sự xuất hiện của framework Rails và sự thành công của trang web 37signals. Tôi có một sự hiểu biết tương đối chắc về Ruby, như là một ngôn ngữ kịch bản trong công việc quản trị hệ thống của mình (Capistrano) cũng như là một số dự án cá nhân (thư viện phát triển game Gosu và Rails). Tôi cảm thấy hơi xấu hổ khi phải thừa nhận rằng mình không quen thuộc với những phiên bản mới nhất của Rails và chắc chắn nó sẽ có trong danh sách những thứ mà tôi sẽ làm quen trở lại.
2 – . Anh có cảm thấy rằng ngôn ngữ anh dùng thì phù hợp hơn với người mới bắt đầu hay những người đã có kinh nghiệm? Ví dụ, nếu tôi khá mới đối với ngành này, tôi sẽ gặp nhiều khó khăn hơn khi học PHP hay Ruby?
Michael: Không may là tôi không thể đưa ra một câu trả lời dứt khoát — ít ra là không như bạn đang mong đợi, vì lẽ rằng PHP và Ruby là hai thực thể hoàn toàn khác nhau. PHP là một sự hỗn hợp của ngôn ngữ và web framework vào trong một gói, ngược lại Ruby là một ngôn ngữ lập trình cùng với một số framework có sẵn.
- Bạn không cần phải hiểu một cách sâu sắc về System Administration hoặc cách triển khai tốt nhất để hoàn thành mọi thứ. Hầu như đối với tất cả các host thì bạn chỉ cần upload lên là xong.
- Bạn sẽ học được kiến thức ở mức thấp hơn của cách web làm việc; ví dụ, một request được truyền giữa client và server như thế nào (nó liên quan đến ứng dụng của bạn), chức năng của session là gì, những giới hạn của cookies, sự khác nhau giữa các phương thức request.
- Xét về ngôn ngữ Ruby (và tôi sẽ giả sử về framework Rails, dựa trên mức độ phổ biến rộng rãi của nó): công việc triển khai có thể khá phức tạp tại thời điểm này (mặc dù đã có sự hỗ trợ của những dịch vụ hosting như Heroku, nhưng bạn sẽ bị thiếu hụt mất cơ hội để học và hiểu ở mức thấp). Tôi nghĩ rằng sự thiếu hụt của kiến thức mức thấp là một nhược điểm chủ yếu của Rails, đứng ở góc nhìn triển khai cũng như góc nhìn phát triển — bạn có thể nhanh chóng và dễ dàng sử dụng session, cookies, tạo ra các controller insecure và destructive (thông qua phương thức GET request). Điều đó không có nghĩa là bạn không thể làm những thứ này tốt trong PHP, nhưng Rails hỗ trợ điểm này tốt hơn.
Từ góc nhìn của một Web Developer, tôi nghĩ đây cũng là một nhược điểm của Ruby (và cả Python nữa) — đó là thực sự không có bất kỳ một điểm gia nhập ở mức trung bình nào (mid-level). Hoặc là bạn hiểu về giao thức HTTP, cùng với khả năng để viết stack của riêng bạn, top-to-bottom, hoặc là bạn phải đi cùng với một “framework tuyệt vời nào đó sẽ giúp bạn làm các thao tác về CRUD (Create, Retrieve, Update, Delete) dùm bạn”.
3 – . Nhiều lập trình viên PHP chuyển sang Ruby sau một vài năm. Anh có nhận thấy hiện tượng này không, và nếu có thì theo anh tại sao hiện tượng này lại trở nên phổ biến? Thời điểm diễn ra nhiều nhất là khi nào?
Ryan: Thời điểm chuyển qua Ruby của tôi (vào năm 2005) khi xuất hiện Rails framework. Tôi cũng đã thử vọc vậy phát triển web bằng Python nhưng vì không có kinh nghiệm nên gặp một chút thời gian khó khăn, lúc đó tôi không biết nên làm cái gì hoặc nhìn đi đâu (nhưng tôi quyết định phải xây dựng một cái gì đó, vì vậy tôi bắt tay tiến hành!), nhưng tôi thực sự đã muốn sử dụng Python trong các hoạt động hàng ngày bởi vì tôi cảm thấy nó tốt hơn, được thiết kế cẩn thận hơn và tôi thích cú pháp của nó. Và bởi vì Snakes (con trăn – biểu tượng của ngôn ngữ Python) thì hấp dẫn hơn Elephants (con voi – biểu tượng của PHP).
Tôi biết về các cơ sở dữ liệu quan hệ khá tốt nhưng tôi cảm thấy rất khó chịu khi phải viết đi viết lại những câu truy vấn SQL giống nhau. ActiveRecord đúng là rất, rất tuyệt vời! Ruby thì cũng gần giống như Python và tôi cũng hạnh phúc khi Larry (bất kể anh ấy là ai) có một framework mà tôi có thể trở nên bận rộn và bắt tay vào xây dựng các thứ. Vì vậy đối với tôi thì tôi yêu cái thư viện đó và cả cú pháp của nó nữa.
Ngày nay chúng ta có hàng đống những thư viện Ruby tuyệt vời được viết bởi những cá nhân tài năng, các thư viện như Sinatra (một web framework nhỏ), Nokogiri (một parser HTML/XML), Sequel (một thư viện database ở mức cao), RSpec (một thư viện kiểm thử tự động). Tất cả những thư viện này có thể cài đặt như là RubyGems mà tôi nhận thấy dễ dàng và thân thiện với người dùng hơn là làm việc với hệ thống PEAR của PHP.
Cộng đồng vẫn khá sôi nổi, thậm chí đã một số năm đã trôi qua, và các công ty cũng đang ráo riết tuyển dụng các lập trình viên Ruby giống như một thứ hàng quý. Ruby 1.9 thì cũng gần như nhanh bằng PHP, vì vậy có nhiều thời điểm để người ta chuyển qua Ruby!
4 – . Thường thì, chúng ta xem ngôn ngữ hiện tại của mình là sự lựa chọn “tốt hơn” các ngôn ngữ trước đó. Nhưng có phải luôn là như vậy, hay nó chỉ “mới” xuất hiện? Có thể là những dòng code cũ của anh trông rất tồi bởi vì bây giờ anh là một lập trình viên dày dạn kinh nghiệm hơn xưa?
Michael: Tôi nghĩ các lập trình viên có thể rất thường chạy theo mốt kiểu “cái mới hay hơn cái cũ”. Đây là lý do tại sao nhóm của tôi luôn phải ngồi họp bàn kỹ lưỡng trước khi chúng tôi bắt đầu một dự án, chúng tôi phân tích các yêu cầu (trong cả thuật ngữ của người dùng và của developer — những thứ này có sự khác nhau rất lớn) và chúng tôi bàn luận về nó, cùng với rất ít sự tham chiếu đến các ngôn ngữ hoặc framework trong tâm trí. Tuần rồi chúng tôi đã phân tích một số GB dữ liệu log với Perl, tuần này chúng tôi xây dựng một ứng dụng mà chủ yếu hiển thị như một ExtJS GridPanel (bởi vì chúng tôi đã mở rộng các file lõi của CodeIgniter để quản lý bất kỳ trường hợp nào mà ExtJS ném ra ngoại lệ).
Có một cách nghĩ khác là càng nhiều ngôn ngữ và công cụ mà bạn có kinh nghiệm, thì bạn sẽ có khả năng kết hợp những kỹ thuật và ý tưởng tốt nhất mà không cần quan tâm đến môi trường mà bạn đang làm việc trong đó (người ta nói về việc học LISP, nhưng tôi vẫn chưa học nó).
Các lập trình viên trẻ sẽ nhảy vào những thứ mới mẻ nhưng bạn sẽ trở nên già đi và trưởng thành hơn, bạn muốn làm việc cùng những công cụ nhỏ nhưng đơn giản và mạnh mẽ. Nếu bạn không sử dụng mọi đặc trưng và mọi thư viện có sẵn trong Ruby thì bạn có thể làm với những công cụ đơn giản và mạnh mẽ mà không gặp quá nhiều vấn đề.
5 – . Có những trường hợp nào khi anh có thể lựa chọn sử dụng Ruby cho dự án này, và PHP cho dự án khác (giả sử là anh có 100% quyền lựa chọn)?
Có những trường hợp khác nơi mà tôi sẽ quan tâm đến ngôn ngữ, và đó là khi tôi tạo ra một sản phẩm dạng CMS để bán trên trang Code Canyon. Tôi sẽ không viết nó bằng Ruby bởi vì hầu hết các web hosting không hỗ trợ nó nhiều lắm. Ngược lại PHP thì đã có sẵn ở khắp nơi và các web designer lẫn các lập trình viên ít kinh nghiệm cũng quen thuộc với nó.
6 – . Nếu tôi là một designer và đôi khi chỉ vọc vậy công việc phát triển, thì anh sẽ khuyên tôi nên chọn Ruby hay PHP?
Michael: Về mặt cá nhân, tôi đề xuất nên sử dụng framework Django của ngôn ngữ Python. Nó thì được thiết kế dành cho mục đích như vậy: có khả năng cho phép lập trình viên làm việc trên mô hình dữ liệu và hiển thị dữ liệu lên màn hình một cách nhanh nhất có thể, rất dễ dàng sử dụng đối với các designer để trình bày dữ liệu theo một cách thức phù hợp, trong khi lập trình viên tiếp tục làm việc trên các logic nghiệp vụ trong cùng một chu trình.
Ryan: Nếu bạn có kinh nghiệm kết hợp một số HTML và CSS cùng với nhau và upload chúng lên Server thông qua FTP, thì tôi có thể đề xuất sử dụng PHP, vì nó có một rào cản rất bé để bạn có thể gia nhập, bởi vì bạn cũng đã thân thuộc với cú pháp của nó rồi (code của nó được bao lấy trong thẻ <?php, sau đó upload nó tới server của bạn với đuôi là .php, và thế là hoàn thành!). Nhưng nếu bạn bắt đầu xem lập trình là công việc nghiêm túc, thì tôi gợi ý là bạn nên học thêm những thứ khác (chẳng hạn Ruby) để mở rộng tầm nhìn của mình.
7 – . Điểm đặc biệt nào ngôn ngữ của anh có mà các ngôn ngữ khác không có?
Đây là một bí mật: nếu PHP phát hành một phiên bản cập nhật chính thức cùng với một cú pháp thay thế (để giống với Ruby/Python hơn), và bao lấy thư viện chuẩn đang tồn tại vào trong một phong cách các thư viện phổ biến của Ruby (và làm cho nó nhất quán), và có những tương thích ngược với các phiên bản trước đây cùng khả năng tích hợp với code có sẵn, thì nó sẽ trở thành một sản phẩm không có đối thủ. Đừng nói với bất kỳ ai là tôi nói điều này nhé!
Michael: Dễ dàng triển khai, có một sự giới thiệu đơn giản với các khái niệm ở mức thấp hơn trong phát triển web và trên hàng trăm tài liệu và các bài thực hành thử-và-đúng thuộc loại tốt nhất.
8 – . Có một quan niệm chung rằng PHP đã đi rất xa và luôn là ngôn ngữ lập trình server-side phổ biến nhất trên web. Vâng, nhưng nó cũng là ngôn ngữ bị chê bai nhiều nhất. Tại sao lại có điều đó? Chắc chắn là có một lý do nào dó giải thích tại sao nó lại được sử dụng rộng rãi đến như vậy, phải không?
Michael: Tôi xin nhắc lại về PHP một lần nữa – dễ dàng triển khai, có một sự giới thiệu đơn giản với các khái niệm ở mức thấp hơn trong phát triển web và trên hàng trăm tài liệu và các bài thực hành thử-và-đúng thuộc loại tốt nhất.
Nhưng nghiêm túc mà nói — bởi vì rào cản để gia nhập vào PHP rất thấp, nên rất khó để có thể phân biệt sự khác nhau giữa một ai đó thực sự biết cái họ đang nói và một ai đó chỉ có cùng mức kỹ năng như bạn đó là có một không gian riêng dành cho blog. Thêm nữa, do bởi PHP đã tồn tại nhiều năm, vì vậy có rất nhiều nội dung ở ngoài kia — và không phải tất cả chúng đều tốt.
Các lập trình viên PHP, trong một số năm đầu của họ, trải qua hội chứng “không phát minh ở đây (not invented here syndrome)” — cái mà tôi không tin là một thứ tồi (cho đến khi họ bắt đầu bán nó hoặc chuyển nó sang cho người khác). Tôi nghĩ cách suy nghĩ của một lập trình viên mới, đang trải nghiệm PHP lần đầu tiên, là họ thực sự muốn hiểu chính xác điều gì đang diễn ra — và PHP làm một công việc hoàn hảo “đưa cho họ đủ sợi dây thừng để treo họ lên” — bộc lộ đủ để học, nhưng bạn có thể sẽ làm tổn thương chính mình. Ngược lại, nếu không tính đến plugin của Rick (đó là một hệ thống authentication tuyệt vời), các lập trình viên Rails thì cho rằng mình đang đi đúng hướng và tiếp tục trên con đường của họ.
Một thứ khác đã giúp PHP bùng nổ đó là những thứ như là sản phẩm cPanel và các nhà cung cấp hosting giá rẻ. Bất kỳ ai cũng có thể trở thành một web host giá rẻ mà không cần phải có kiến thức về kỹ thuật. Mọi người đều muốn có một trang web và hosting giá rẻ. PHP và MySQL là kho chuẩn về những thứ chia sẻ này, và chúng đã có mặt ở khắp nơi (và bây giờ vẫn thế). Sản phẩm tốt nhất không phải bao giờ cũng giành chiến ‘thắng’, cũng như rất nhiều người vẫn còn khó chịu về việc SmallTalk đã thất bại trước Java vậy.
9 – . PHP thì thường bị chỉ trích về tính luộm thuộm của nó. Nhưng, liệu đó có phải là do chính ngôn ngữ này nó như vậy, hay là do người dùng không quen với việc viết code chất lượng? Có rất nhiều cách để viết mã sạch bằng PHP dựa trên mô hình MVC.
Ryan: Điều này thì không dễ chịu lắm, nhưng tôi phải nói rằng những lời chỉ trích phổ biến về PHP thì tương đối đúng và là bởi vì cái cách mà “ngôn ngữ” này được thiết kế (hay nói đúng hơn, là không được thiết kế). PHP thì được sinh ra từ một số scripts CGI mà tác giả ban đầu viết bằng C (hoặc là Perl?).
Ruby thì trái hẳn lại, nó được thiết kế kết hợp những thứ tốt nhất từ một số ngôn ngữ lập trình để tạo một cái gì đó thú vị để làm việc, nó học hỏi từ Smalltalk, Perl, LISP và những ngôn ngữ khác.
Một khi bạn bắt đầu sử dụng các đặc trưng trong module Enumerable của Ruby, thì bạn sẽ tự hỏi làm thế nào mà mình lại sống được nếu thiếu nó.
Michael: Tôi nghĩ đây là một sự phản chiếu của cái rào cản thấp để gia nhập và kế thừa tính tò mò của các lập trình viên PHP để thực sự hiểu cái gì đang diễn ra. Tôi đã đọc/nghiên cứu hàng trăm cuốn sách, blog, bài viết về các hệ thống authentication — nhưng hầu như không thu được gì cho đến khi tôi tự xây dựng hệ thống của riêng mình thì tôi mới thực sự cảm thấy điều gì đang diễn ra. Tôi tin rằng những lập trình viên PHP mới thường háo hức chia sẻ sản phẩm mà họ đã hoàn thành cho phần còn lại của thế giới, và bởi vì họ không tuân theo những quy tắc tốt nhất hoặc các pattern đã được chứng minh là security.
10 – . Cộng đồng và tài liệu thì quan trọng hơn rất nhiều so với chính framework hoặc ngôn ngữ đó. Cộng đồng của Ruby hoặc PHP khi so sánh với các ngôn ngữ khác thì như thế nào?
Michael: Tôi nghĩ rằng cả PHP và Ruby đều có những vấn đề nghiêm trọng trong tài liệu của chúng — và bởi những lý do hoàn toàn trái ngược nhau.
PHP có hàng tấn tài liệu, vì nó đã tồn tại qua rất nhiều năm — bạn có thể tìm thấy câu trả lời cho bất kỳ câu hỏi nào cùng với một cú click chuột tìm kiếm nhanh trên Google. Đó có phải là giải pháp tốt nhất không? Có thể có, mà cũng có thể không…
Trong mặt này, tôi tin rằng PHP có sự thuận lợi hơn vì có các framework riêng biệt (CodeIgniter, FuelPHP, Kohana, CakePHP, v.v…) có thể giảm nhẹ tác động theo một mức độ nào đó — nếu bạn đang sử dụng một trong những framework này, thì khá đơn giản để tìm câu trả lời dứt khoát cho vấn đề mà bạn đang tìm kiếm.
Ryan: Khi sử dụng PHP thì triết lý về tài liệu của nó dường như giống với ‘viết tài liệu một lần và cho phép mọi người bổ sung thêm phần của họ’.
Có rất nhiều các hàm API dùng chung được bao gồm trong lõi của PHP, chúng không thường xuyên thay đổi, vì vậy tôi nghĩ rằng một giải pháp dạng wiki sẽ thích hợp hơn. Theo cách đó thì cộng đồng có thể chỉnh sửa tài liệu chính thức, gợi ý những thay đổi, gợi ý những ví dụ, tích hợp những cái hay từ các bình luận vào trong tài liệu chuẩn. Điều này sẽ có ích hơn (đặc biệt đối với người mới bắt đầu).
Trong Ruby, có rất nhiều thư viện dùng chung trên GitHub, nơi mà mọi người có thể submit những thay đổi nhỏ để cải tiến, và tham gia vào chu trình phát hành đều đặn. Tài liệu thì đã có RDoc (cái cũng tương tự như PHPDoc), và khi bạn cài đặt thì nó cũng sinh ra tài liệu trên hệ thống cục bộ cho bạn. Đối với công việc của mình, tôi hoặc là sẽ đọc tài liệu chuẩn trên rubydoc.info, hoặc đọc tài liệu local trên máy tôi, hoặc trong bản thân mã nguồn của các thư viện.