Ruby on Rails вниз і застереження [закрито]


25

Це не початковий гамбіт для базування RoR - чесно!

Я вивчаю Рубі та рамки Рейки. Prima facie, здається, дуже крутий і чудовий досвід порівняно з PHP. (Насправді це нагадує мені про щасливіші дні із C # та .NET.)

Однак, займаючись цим, я не маю досвіду роботи з цією рамкою чи мовою, і мені цікаво - які нинішні недоліки або речі, які ви хотіли б знати, коли ви починали?

(Можливо, для цього слід зробити вікі спільноти?)


Я спробував рейки один раз і зупинився, коли зрозумів, що проектування першої бази даних суттєво неможливо.
Сокіл

5
avdi.org/devblog/2011/08/22/your-code-is-my-hell варто прочитати. Я додам, що з будь-якою динамічно набраною мовою надзвичайно важливо мати 80% або більше тестового покриття, інакше рефакторинг буде майже неможливим.
Ерік Вілсон

Зробивши своє запитання більш конкретним і збалансованим (наприклад, "Перехід з PHP на Ruby on Rails - плюси і мінуси"), це усуне необхідність відмовлятися від розбиття та бажання спільноти з вікі.
Thomas Langston,

2
@Thomas Але це не моє питання! Плюси і мінуси PHP дійсно добре відомі. Професіонали RoR знайти досить просто. Однак недоліки РоР виявити непросто як новачок, і я підозрюю, що вони будуть виявлені лише з багаторічним досвідом. Мета цього - навчання з добре заробленого досвіду інших. Багато читаних КВ досить характерних за своєю природою.
Матті

Відповіді:


32

Це з досвіду навчання, продовження навчання та написання порівняно простої програми в Rails.

1) Крива навчання

Рейки оманливо прості. Підручники, відеоролики та книги демонструють, наскільки швидко ви можете отримати робочу програму (якщо це некрасиво), але вони справді просто подряпають поверхню. Вони, як правило, сильно покладаються на створення коду та "риштування", що, правда, є хорошим інструментом при навчанні, але швидко переживає свою корисність.

Не помиляйтесь, Рейки важко освоїти. Після того, як ви перейдете основні принципи (докладніше про це пізніше), ви зіткнетеся з головою в стіну, якщо вам потрібно зробити більше, ніж надзвичайно спрощений "демонстраційний додаток" функціональності, який, як ви бачите, рекламували. Ви можете обійтись основними знаннями Рубі під час навчання, але вам швидко потрібно забрати Рубі, або ви залишитеся високим і сухим (а не хорошим видом DRY), якщо вам потрібно вийти за рамки Рейки.

Рейки - це, як я люблю це любити називати, фарбувати за допомогою програмування чисел . Якщо ви дотримуєтесь 100% домовленостей (тобто залишайтеся в межах ліній і використовуйте кольори, про які вам сказали), ви можете швидко та легко робити гідні програми. Якщо і коли вам доведеться відхилятися, Рейки можуть перейти від вашого найкращого друга до вашого найгіршого ворога.

2) Коли молотком є ​​все, що у вас є ...

Rails дуже добре спрощує програми CRUD. Проблема виникає, коли ваш додаток повинен робити більше, ніж просто читати / писати з бази даних. Тепер для запису остання версія Rails, яку я використав, була 2.3.4, тому, можливо, змінилися зміни з тих пір, але я зіткнувся з основними проблемами, коли змінилися вимоги бізнесу, тому програма повинна була вбудувати в неї невелику систему робочого процесу та інтегруватися з застаріле додаток PHP. Конвенція Rails про "одну форму, одну модель" працює чудово для тривіальних додатків та додатків для введення даних, але не настільки, коли потрібно робити логіку обробки, чи мати робочі процеси, або все, що не є типовим "Користувач вводить дані в кілька текстових полів, хітів "Надіслати" тип речі. Це можна зробити, але це аж ніяк не "просто", а точніше - не було "

Крім того, Rails не любить грати з іншими програмами, які не використовують бажані методи доступу до даних; якщо вам доведеться взаємодіяти з додатком, який не має API стилю "Веб 2.0", вам доведеться обіймати Rails замість нього; я знову говорю з досвіду, оскільки це сталося зі мною.

3) Це нове

Нарешті, Рейлс все ще є «новою дитиною на блоці» у багатьох областях. Це не має значення для особистого використання або типу "Я думаю, що це круто і хочу це навчитися", але говорити як хтось, хто вважає за краще використовувати Рейки на своїй щоденній роботі, якщо ви не перебуваєте в тому місці, де знаходиться Рейлс Широко поширена робота може бути дуже складно як розробник Rails. Це все ще в значній мірі сфера "хіп, нових стартапів" і не є головним гравцем у більшості столичних районів. Ваш пробіг може залежати в цьому плані, але я знаю, що мої рельси (тампа) в основному відсутні.

4) Вогонь і рух

Рейки постійно змінюються. Це і добро, і погано; це добре, тому що громада розвивається та використовує нові концепції. Це погано, оскільки громада розвивається та використовує нові концепції. Для новачків Rails це може бути дуже непосильним, тому що зазвичай, коли ви стикаєтеся з проблемою, і озираєтесь навколо, ви побачите або людей, які рекомендують такий-і-такий дорогоцінний камінь, щоб виправити це, або говорять, що спосіб все одно поганий, і вам не варто ' t використовуйте його, ось кращий спосіб ... і у вас з’явиться список додаткових інструментів для прання, щоб навчитися разом з Rails не відставати від cognoscenti Rails. Такі речі , як Git, BDD/RSpec, Cucumber,Haml/Sass, і рогівки інших речей все пливуть навколо і підштовхуються, як "правильний спосіб робити справи" в Rails-Land, і, виходячи з досвіду, ви, можливо, вкінці зможете вивчити десяток і більше технологій на додаток до Rails, тому що, використовуючи стандартний інструментарій Rails, він відчуває себе "неправильно".

Тепер це ще більше посилиться за допомогою Rails 3.1, що робить Sass і CoffeeScript для всіх речей за замовчуванням, тож новачок Rails має не тільки вивчити Ruby і Rails, але і Sass (можливо, просто, якщо ви знаєте CSS) та CoffeeScript (не божевільно складно, але, безумовно, достатньо відрізняється від сирого JavaScript) на мінімальному рівні, щоб почати, плюс можна припустити, що Git. Навіть не враховуючи RSpec і друзів, а також десяток і більше дорогоцінних каменів, які ви зазвичай закінчите, це 4 різні речі, які вам доведеться навчитися, перш ніж ви зможете серйозно почати писати програми Rails. Порівняйте це з такою мовою, як C #, або Java, або навіть PHP, де ваші знання HTML / CSS / JavaScript / SQL не зміняться, і вам просто доведеться вивчити саму мову та, можливо, нюанси рамки.


3
WRT Rails 3.1 Sass & CoffeeScript - це параметри за замовчуванням, які можна легко вимкнути. Насправді "нормальний" CSS просто працюватиме, оскільки Rails 3.1 використовує SCSS-синтаксис SASS. Ви можете їх використовувати, але ви ні на що не змушені. WRT Git Я думаю, що Лінус краще пояснює, чому ви дійсно повинні використовувати DVCS, як Git, незалежно від того, яку рамку ви використовуєте. youtube.com/watch?v=4XpnKHJAok8
Shreyas Satish

О, я погоджуюсь, просто кажу, що за замовчуванням Rails зазвичай дуже багато, тому новачок буде відчувати тиск, щоб використовувати його (я знаю, я відчував це так)
Wayne Molina,

3
+1 за №4 ... якщо ви залишите Рейки на рік, коли ви повернетесь, всі будуть літати навколо космічних кораблів, і ви будете думати про свій човен? Синтаксис Rails 2 відчував себе старим до виходу Rails 3.
jimworm

-1 Хороший рейок, який бив, але ви навіть не пропонуєте альтернативи. "Вкладені форми" є важкою проблемою, і Рейлс, ймовірно, вирішує її краще за всіх.
scottschulthess

13

Документація.

Незважаючи на те, що Rails Guides є чудовим навчальним ресурсом, довідники Rails (і, як правило, Ruby) в бібліотеці просто не орієнтуються. Скажіть, ви хочете дізнатися більше про belongs_toметод. Хоча він використовується на ActiveRecord::Baseпідкласах (моделях), це не задокументовано в ActiveRecord::Baseдокументах, а в міксині, який клас імпортує. По суті, ви не можете побачити вичерпний перелік усіх методів, які ви можете використовувати на об’єкті в одному місці (за винятком випадків, коли ви запускаєте irbі перевіряєте сам об’єкт).

З дуже динамічною мовою, як Ruby, неважко сказати, звідки походить метод, який ви використовуєте. Це може бути проблемою, особливо для навчальних програмістів, які намагаються зрозуміти новий стек технологій.


Це вбивця для мене; всякий раз, коли мені потрібно налагодити деякий наш код Ruby / Rails, я завжди витрачав занадто багато часу, намагаючись з’ясувати, де визначений даний метод; і навіть тоді завжди потрібно тримати ідею в задній частині голови, що тільки тому, що я бачу визначення методу, воно, можливо, було перероблене в іншому місці.
joev

9

Ruby on Rails має значну криву навчання. Спочатку ви маєте вивчити дивацтва мови, потім вивчити рамки, потім навчитися Rails Way робити речі, а потім дізнатися про безліч часто використовуваних дорогоцінних каменів.

Однак, коли ви навчилися цим речам, це відбувається надзвичайно природно. Насправді інші рамки починають відчувати себе тягарем.

Rails дуже орієнтована на TDD / BDD, тому якщо ви цього не зробите, це ще дві речі, які вам доведеться навчитися, перш ніж стати компетентним програмістом Rails. У вас немає компілятора та IDE для резервного копіювання, тому покриття тесту є дуже вашим резервом.

Багато адвокатів TDD, включаючи мене, вважають це одним із сильних сторін РР, а також його прокляттям. Після того, як ви почнете писати TDD, ви виявите, що захищеність, запропонована тестовим покриттям, краща за безпеку, яку пропонує компілятор. Тоді необхідність писати код ДУЖЕ, щоб догодити компілятору, стає обтяжливим.

TDD не відчуває себе додатковим завданням у RoR, він відчуває себе єдиним способом роботи.

Rails має одну серйозну проблему з продуктивністю: кожен запит стоїть у черзі позаду активного в даний час, а не нарізання їх, як це робить більшість фреймворків, або блокування подій, щоб звільнити інші запити, як у Node.js та Twister. Це означає, що вам потрібно кодувати, щоб швидше реагувати, але в більшості випадків це зробити досить просто.

Rails також дуже розроблений для того, щоб дуже добре працювати з контент-системами, що справедливо - це багато Інтернету. Робити щось трохи складніше, наприклад, веб-ігри чи систему електронної комерції, означає вивчити нові дорогоцінні камені. Ви швидко дізнаєтесь, що всі дорогоцінні камені знаходяться там, але чим незрозуміліше ви хочете зробити, тим складніше буде знайти хорошу документацію.


Щодо питання щодо виступу - я, мабуть, пригадую, читаючи, що багато з них були значною мірою вирішені з v1.9 перекладача, але я можу бути абсолютно помилятися. Чи є способи подолати це обмеження ефективності?
Матті

1
@Matty: Як я додав, введіть код, щоб зробити час реакції якомога швидшим. Все, що можна залишити під час резервного процесу, зробіть це. Але тоді ви повинні робити це з будь-якими рамками - це просто не робити. Крім того, jRuby має нитку по-різному, але він має свої проблеми, і моя відповідь була досить довгою.
пдр

7

В моєму особистому досвіді головний біль пов'язаний із сумісністю .

Коли:

  • Є xрейки проекти розгорнуті,
  • кожен проект використовує yдорогоцінні камені.
  • хоча є nваріанти рейок,
  • плюс встановлені mверсії дорогоцінних каменів,
  • з severalверсіями рубіну,
  • на одній коробці Linux як виробничої машини.
  • програміст працює над іншим ноутбуком розробки OS X.

Як фрілансер, який не має розкіш для поновлення / поновлення більшості речей, зіткнеться багато проблем сумісності з вище змінних ... в той час rails, gemsі rubyзберегти зміни / еволюціонує.


7
Все, що ви згадали, виправлено за допомогою RVM (або rbenv ) та Bundler . Тоді ви можете мати конкретні версії Ruby та окремі набори дорогоцінних каменів для кожного проекту.
Ешлі Вільямс

Ця відповідь (зараз) абсолютно не має значення. RVM для управління версіями Ruby, Bundler для обробки версій дорогоцінних каменів; Capistrano для обробки розгортань на виробничому сервері, а Figaro піклується про секрети та змінні середовища. Я розробляю свою програму на [Cloud9] (c9.io) (веб-IDE), і мій процес розгортання відбувається буквально bundle exec cap production deploy. Capistrano піклується про версію програми на сервері. Як і будь-яка інша рамка, яка виходить (наприклад, Node.js), інструменти написані для вирішення ваших проблем .
Chris Cirefice

5

Швидкість, безумовно, є проблемою. Гранична гнучкість Рубі супроводжується значним успіхом у виконанні.

Масштабування масштабів по горизонталі - це не очевидна задача, за винятком технологій, спеціально розроблених для цього завдання, які, як правило, просто торгуються простотою, щоб добре масштабувати.
Якщо ви можете обробити в 100 разів більше запитів на машині з технологією A, ніж із технологією B, використовуючи технологію A, варто врахувати, якщо у вас є підстави вважати, що ви можете подавати свої дані з одного сервера протягом періоду часу, що дозволяє додавати паралелізація після цього.
У 2009 році stackoverflow все ще обслуговувався з одного веб-сервера . Звичайно, це вже не варіант. Але я гадаю, що було добре, що вони почали з технології, яка могла б охопити до багатьох користувачів на одному екземплярі, перш ніж їм довелося переживати про масштабування.

Порівняно з цим, RoR дійсно повільний. Час на обробку простих запитів є значним, а тому обробляти багато клієнтів (це все слід побачити стосовно більш швидких альтернатив).

Для розпливчастої орієнтації, ось кілька цифр, порівнюючи різні інші мови, придатні для веб-розробки, до Ruby:

  • Іди
  • Clojure
  • JavaScript V8 ( node.js )
  • JRuby (альтернатива, яку не слід забувати - залежно від вашої проблемної області JRuby може бути кращим або гіршим вибором, щоб отримати деяку швидкість з програми рейки)
  • Скала
  • Java
  • C #

Зауважте, що це не означає, що якщо ви використовуєте Framework X для Java, це буде точно в 200 разів швидше, ніж RoR. Але різниця швидкостей, виміряна в цих орієнтирах, має важливий вплив на загальну ефективність вашої програми.


4
Ця відповідь говорить лише про "швидкість" під час виконання. Ruby (та Rails) оптимізовані для швидкості розвитку.
Ніколай Решлінг

5
Це не гарне порівняння. Більшість часу, витраченого на веб-запит, виконується введення-виведення з бази даних. Пов’язання з критеріями, що інтенсивно працюють на процесорі, вводить в оману.
ryeguy

3
@pdr: Проблема щебетання полягала в тому, що вони використовували рубін для всього , навіть їхніх резервних процесів, які були інтенсивними процесорами. Такі області були статично типовими мовами. Вони використовують Скалу для цього зараз. Я, чесно, по-справжньому вважаю, що використання RoR значно швидше за часом розробки, ніж C # або Java. Я б використовував його для більшості веб-додатків, а потім використовувати C # або Scala для будь-яких робочих процесорів, що інтенсивно працюють на процесорі.
ryeguy

3
+1, для дійсних балів. Однак, ви можете зробити багато для оптимізації програм Rails. Rack надає себе як досить розширювана система, яка дозволяє досягти великої гнучкості в тому, як все викликається. Не кажучи вже про те, що Ruby 1.9 швидше, JRuby - швидше. Я особисто є великим шанувальником JRuby, вміння змішувати сили JVM - чудова перемога (будьте обережні, дорогоцінні камені, які використовують винятки для контролю потоку -> величезні накладні витрати)
Xorlev

2
@Nicolai Reuschling: Яке значення полягає в тому, що Ruby або RoR є "оптимізованим для швидкості розвитку"? Можете чи ви надати перевіряються , кількісні дані , як рубін на насправді забезпечує більш високу швидкість розробки , ніж альтернативні (Lift, наприклад)? Все інше - це лише недійсна претензія. Також це питання стосувалося недоліків RoR . Висока швидкість розвитку є перевагою і, таким чином, виходить за межі цього питання. Погана ефективність роботи знаходиться в межах цього питання, оскільки це є недоліком.
back2dos

3

Rails має одну серйозну проблему з продуктивністю: кожен запит стоїть у черзі позаду активного в даний час, а не нарізання їх, як це робить більшість фреймворків, або блокування подій, щоб звільнити інші запити, як у Node.js та Twister. Це означає, що вам потрібно кодувати, щоб швидше реагувати, але в більшості випадків це зробити досить просто.

Я думаю, що це дуже помилково. Ви можете запускати Rails у багатопотоковому режимі. Під час роботи в багатопотоковому режимі слід використовувати лише бібліотеки IO, які випускають GIL (наприклад, gem 'mysql2'), інакше це стає безглуздим.

Якщо ви використовуєте jRuby, ви можете просто запустити процес одного рейки в багатопотоковому режимі і повністю використовувати всю наявну потужність процесора. Однак якщо ви користуєтеся МРТ (Ruby 1.8.x або 1.9.x), вам потрібно запустити кілька процесів, щоб повністю використовувати процесори, що стосується і node.js.


Пояснення тут - чи є простий спосіб знайти, які бібліотеки IO випускають GIL?
Матті

Я думаю, що найкращий спосіб розібратися в цьому - це його порівняння gist.github.com/35d4769d8c8c0dfafc56
Pratik Naik,


Приємно почути від одного з основних розробників! Ця інформація не вказана в жодній документації, чи не так? Починати тестувати бібліотеки, щоб дізнатися це, трохи нудно (хоча і цікаво).
Матті

3
  • Рейки мають безліч приємностей, які приховують від вас складність. (Асоціації ActiveRecord, весь життєвий цикл перевірки / збереження, інтерпретація даних запитів на основі наданих заголовків) Коли ви тільки починаєте, це приголомшливо. Зростаючи, ви побачите, що починаєте підлаштовувати свою програму до "способу рейки" поводження з речами - іноді це добре, іноді це нешкідливо, а іноді насправді контр-інтуїтивно зрозуміло до того, що ви намагаєтеся зробити. Не всі таблиці баз даних повинні моделюватися як об'єкти, може знадобитися крок перевірки в іншому місці тощо. Багато програмістів Rails не уникають боротьби з рамкою (що зазвичай є розумним), але довгостроковий ефект від цього ... перенесе звички Рейлів з вами до тих місць, де їх не обов’язково вимагати.

  • У спільноти є звичка писати програмне забезпечення, яке рахується як "магія" - кешуючи контури, які магічно працюють! Вирівняний введення / вивід, який магічно робить вас швидшими! Чарівна магія! Зазвичай тут так, що для технічного рішення, якого не вистачає, надається дуже привабливий API, і вас обдурюють дуже гарні приклади того, що річ робить те, що ви задумали, і лише згодом виявите, що вона охоплює неповне рішення. Цикл цього явища досить постійний, і ви навчитеся кататись з ним, але вам обов'язково слід ознайомитися з ідеєю читання лотів і безлічі коду, від якого ви залежите (гарна річ!). Я кажу, що магічні рішення спільноти Rails не є настільки магічними, як README.

  • Наслідок вище: чим більше ви використовуєте Rails, тим більше вам слід читати його джерело. Чим краще ви зрозумієте внутрішні рамки, тим щасливішим ви будете довгостроково. Насправді в цьому немає конкретних Рейок, але я лише кажу вам з досвіду. Імена методів іноді обіцяють щось, чого ви насправді не отримуєте.

  • Вантажний культ є проблемою, що стосується рейок, але це, мабуть, вірно для всіх фреймворків та спільнот. Це здається більш вираженим (для мене) в Rails, і тому воно має тенденцію надати дивному поколінню код Rails - коли ви працюєте над різними проектами Rails, ви помітите певні тенденції, які, як правило, зраджують часовий період, у який вони були створені . Як ви можете здогадатися з цього твердження, громада має тенденцію рухатися досить швидко у прийнятті нових рішень та знеціненні старих. Ви дійсно повинні бути в курсі ваших новин Ruby, просто щоб зрозуміти частину коду, який ви будете відчувати щодня.

  • Взагалі кажучи, я думаю, що проблема одночасності даних зазвичай недостатньо вирішується громадою - коли ви робите додаток, коли ви потрапляєте в точку, коли вам потрібно обробляти дані, відкатати фізично віддалені зміни та блокувати доступ до даних, рішення стають трохи більше налаштованого вручну, завдяки чому деякі з приємно виглядають рейок речей, які ви робите, затуманені з технічними потребами точності. Рейки не вирішують будь-якої проблеми, пов’язаної з веб-додатком, я думаю, що я говорю, і хоча творці, звичайно, не доповідають цього повідомлення, його легко обдурити, думаючи, що це мається на увазі.


2

Залежно від того, як ви на це дивитесь, швидкість, з якою змінюються Rails, може бути або не бути для вас застереженням. З року в рік все дещо докорінно змінюється, оскільки все більше забирається з того, що висмоктує та потребує рішення.

Якщо ви активно займаєтесь розвитком, все одно ви будете мати пальці на пульсі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.