Ruby on Rails의 단점과주의 사항


25

이것은 RoR bashing의 시작 도박이 아닙니다. 정직합니다!

Ruby와 Rails 프레임 워크를 배우고 있습니다. Prima facie는 PHP에 비해 꽤 시원하고 멋진 경험으로 보입니다. (실제로 C # 및 .NET으로 더 행복한 날을 상기시켜줍니다.)

그러나 이것으로 들어가면이 프레임 워크 또는 언어에 대한 경험이 없으며 궁금합니다. 처음 시작할 때 알고 싶었던 현재 단점이나 것들은 무엇입니까?

(이것은 커뮤니티 위키로 만들어야합니까?)


데이터베이스 우선 엔터티 디자인이 쉽게 불가능하다는 것을 깨달았을 때 레일을 한 번 시도하고 중단했습니다.
팔콘

5
avdi.org/devblog/2011/08/22/your-code-is-my-hell 은 읽을 가치가 있습니다. 동적으로 유형이 지정된 언어의 경우 80 % 이상의 테스트 범위를 갖는 것이 매우 중요합니다. 그렇지 않으면 리팩토링이 거의 불가능합니다.
Eric Wilson

질문을보다 구체적이고 균형있게 만들면 (예 : "PHP에서 Ruby on Rails-찬반 양론으로 전환하면) 강타를 당할 필요가없고 커뮤니티 위키에 대한 열망이 사라질 것입니다.
Thomas Langston

2
@ 토마스 그러나 그것은 내 질문이 아닙니다! PHP의 장단점은 실제로 잘 알려져 있습니다. RoR의 전문가는 찾기가 매우 쉽습니다. 그러나 RoR의 단점은 새로 온 사람으로 찾기가 쉽지 않으며 수년간의 경험을 통해서만 발견 될 것으로 생각됩니다. 다른 사람의 잘 얻은 경험으로부터 배우는 것이 이것의 목표입니다. 내가 읽은 많은 CW는 그 특성이 매우 구체적입니다.
Matty

답변:


32

이것은 Rails에서 경험을 배우고, 계속 배우며, 비교적 간단한 응용 프로그램을 작성하는 것입니다.

1) 학습 곡선

레일은 믿을 수 없을 정도로 간단합니다. 튜토리얼, 비디오 및 서적은 모두 작동하는 (얼마나 추한 경우) 응용 프로그램을 얼마나 빨리 얻을 수 있는지 보여 주지만 실제로 표면을 긁습니다. 그들은 코드 생성과 "스캐 폴딩 (scaffolding)"에 크게 의존하는 경향이 있는데, 이는 학습 할 때 좋은 도구이지만, 유용성을 빨리 능가합니다.

실수하지 마십시오. Rails는 마스터하기가 어렵습니다. 당신이 매우 기본적인 것을 지나고 나면 (이후에 더 자세히 설명 할 것입니다.) 매우 단순한 "데모 앱"기능 이상을 수행해야한다면 벽으로 향할 것입니다. 학습하는 동안 루비에 대한 기본 지식을 얻을 수는 있지만, 루비를 빨리 선택 DRY해야합니다.

Rails는 내가 사랑하는 방식으로 전화를 걸기 때문에 숫자 프로그래밍으로 페인트합니다 . 컨벤션을 100 % 준수하면 (즉, 라인 내에 머물러 있고 사용하도록 지시 한 색상을 사용하는 경우) 적절한 응용 프로그램을 빠르고 쉽게 만들 수 있습니다. 그래도 이탈해야 할 경우 Rails는 가장 친한 친구에서 최악의 적에게 갈 수 있습니다.

2) 모든 것이 망치 인 경우 ...

Rails는 단순한 CRUD 응용 프로그램을 매우 잘 수행합니다. 앱이 데이터베이스에서 읽기 / 쓰기 이상의 기능을 수행해야하는 경우 문제가 발생합니다. 지금까지 내가 사용했던 마지막 Rails 버전은 2.3.4이므로 그 이후로 상황이 바뀌었을 수 있지만 비즈니스 요구 사항이 변경되면 주요 문제가 발생하여 응용 프로그램에 작은 워크 플로우 시스템이 내장되어 있어야합니다. 레거시 PHP 애플리케이션. "일 형태, 하나의 모델"이라는 Rails 규칙은 사소한 응용 프로그램 및 데이터 입력 응용 프로그램에는 적합하지만 처리 논리를 수행해야하거나 워크 플로가 있거나 일반적인 "사용자가 데이터를 입력하지 않는 경우" 일부 텍스트 필드는 제출 "유형의 항목에 해당합니다. 그것은 '수행하지만, "쉽게"결코, 또는 오히려 년후 수

또한 Rails는 선호되는 데이터 액세스 방법을 사용하지 않는 다른 응용 프로그램과 잘 어울리지 않습니다. "Web 2.0"스타일 API가없는 애플리케이션과 인터페이스해야하는 경우 대신 Rails를 사용해야합니다. 다시 한번 나는 이것이 나에게 일어난 일이기 때문에 경험에서 말합니다.

3) 새로운

마지막으로 Rails는 여전히 많은 분야에서 "블록의 새로운 아이"입니다. 개인적인 용도 나 "멋지다고 생각하고 배우고 싶다"유형의 시나리오는 중요하지 않지만 Rails가있는 위치에 있지 않은 경우, 일상 업무에서 Rails를 선호하는 사람으로 말하기 광범위하게 레일즈 개발자로서 풀 타임 작업을 찾는 것은 매우 어려울 수 있습니다. 그것은 여전히 ​​"엉덩이, 신생 기업"의 영역이며 대부분의 대도시 지역의 주요 기업은 아닙니다. 귀하의 마일리지는 이와 관련하여 다를 수 있지만 내 지역 (Tampa) Rails가 본질적으로 존재하지 않는다는 것을 알고 있습니다.

4) 화재 및 운동

레일은 끊임없이 변화하고 있습니다. 이것은 좋고 나쁜 것입니다. 커뮤니티가 새로운 개념을 발전시키고 포용하기 때문에 좋습니다. 공동체가 새로운 개념을 발전시키고 포용하기 때문에 나쁘다. 레일스 초보자에게는 큰 부담이 될 수 있습니다. 일반적으로 문제가 발생했을 때 주위를 둘러 보면 사람들이 그러한 보석을 추천하여 문제를 해결하거나 어쨌든 그 방법이 나쁘다는 말을 보게 될 것입니다. ' 그것을 사용하지 않는 것이 더 나은 방법입니다 ... 그리고 결국 Rails cognoscenti를 따라 잡기 위해 Rails와 함께 배울 추가 도구의 세탁 목록이 있습니다. 상황이 좋아 Git, BDD/RSpec, Cucumber,Haml/Sass그리고 Rails-land에서 "일을하는 올바른 방법"으로 밀려 나고 다른 것들의 풍요의 뿔이 밀려납니다. 그리고 경험을 통해 말하면 , Rails 이외에도 12 개 이상의 기술을 배우려고 노력할 때 표준 Rails 툴킷을 사용하면 "잘못된"느낌이 들기 때문입니다.

이제 Rails 3.1이 Sass와 CoffeeScript를 기본으로 설정함으로써 훨씬 더 복잡해졌습니다. 따라서 Rails 초보자는 Ruby와 Rails를 배울뿐만 아니라 Sass (CSS를 알고 있다면 간단 할 것입니다)와 CoffeeScript (매우 어렵지는 않지만 확실히 시작하기에 최소한 최소한의 원시 JavaScript와는 다르며 Git이라고 가정 할 수 있습니다. RSpec과 친구들, 그리고 일반적으로 수십 가지 이상의 보석을 고려하지 않아도 Rails 응용 프로그램을 심각하게 작성하기 전에 배워야 할 4 가지가 있습니다. 이것을 C #, Java 또는 HTML / CSS / JavaScript / SQL 지식이 변경되지 않는 PHP와 비교하면 언어 자체와 프레임 워크 뉘앙스를 배우기 만하면됩니다.


3
WRT Rails 3.1 Sass & CoffeeScript는 쉽게 끌 수있는 기본값입니다. 실제로 "일반"CSS는 Rails 3.1이 SASS의 SCSS 구문을 사용하기 때문에 작동합니다. 당신은 그들을 사용할 수 있지만 당신은 어떤 강박하에 있지 않습니다. WRT Git Linus는 어떤 프레임 워크를 사용하든 Git과 같은 DVCS를 사용해야하는 이유를 더 잘 설명한다고 생각합니다. youtube.com/watch?v=4XpnKHJAok8
Shreyas Satish 님이

아, 난 그냥 (내가 그런 식으로 생각을 알고) 초보자가 사용하기 압박감을 느낄 수 있도록 레일 기본이 많이 과대 선전 일반적으로 말하는 동의
웨인 몰리나

3
# 4의 경우 +1 ... 1 년 동안 Rails를 떠나면 돌아올 때 모든 사람들이 우주선에서 날아 다니며 노 젓는 배를 타고 떠날 것입니까? Rails 2 구문은 Rails 3이 출시되기 전에 오래되었다고 느꼈습니다.
jimworm

-1 좋은 레일 bashing post이지만 대안을 제안하지는 않습니다. "Nested forms"는 어려운 문제이며 Rails는 아마도 누구보다 더 잘 해결할 것입니다.
scottschulthess

13

선적 서류 비치.

하지만 레일 가이드는 (일반적으로 루비) 훌륭한 학습 자원, 레일있는 라이브러리 참조를 쉽게 탐색 할 수 없습니다. belongs_to방법 에 대해 더 배우고 싶다고 가정하십시오 . 가에 사용되지만 ActiveRecord::Base서브 클래스 (하나의 모델), 그것은에 설명 아니에요 ActiveRecord::Base문서 만의 믹스 인 이 클래스 가져옵니다. 기본적으로 한 곳에서 객체에 사용할 수있는 모든 방법의 전체 목록을 볼 수는 없습니다 (객체를 시작 irb하고 확인한 경우는 제외 ).

Ruby와 같이 매우 역동적 인 언어를 사용하면 사용중인 메소드의 출처를 쉽게 알 수 없습니다. 새로운 기술 스택을 파악하려는 프로그래머에게 특히 문제가 될 수 있습니다.


이것은 나를위한 살인자입니다. Ruby / Rails 코드를 디버깅해야 할 때마다 항상 주어진 메소드가 정의 된 위치를 파악하는 데 너무 많은 시간을 소비했습니다. 그럼에도 불구하고 항상 메서드 정의를 볼 수 있기 때문에 다른 곳에서 재정의되었을 수 있다는 아이디어를 항상 내 머리 속에 두어야합니다.
joev

9

Ruby on Rails에는 상당한 학습 곡선이 있습니다. 먼저 언어의 이상한 점을 배우고, 틀을 배우고, Rails Way of work, 그런 다음 자주 사용되는 많은 보석에 대해 배워야합니다.

그러나, 당신이 그 것들을 배웠을 때, 그것은 자연스럽게 왔습니다. 실제로 다른 프레임 워크는 부담처럼 느껴지기 시작합니다.

Rails는 매우 TDD / BDD 지향적이므로, 그렇지 않다면 유능한 Rails 프로그래머가되기 전에 알아야 할 두 가지 사항이 더 있습니다. 백업 할 컴파일러와 IDE가 없으므로 테스트 범위는 대체로 큰 문제입니다.

나 자신을 포함한 많은 TDD 옹호자들은 이것이 RoR의 강점과 저주를 고려할 것이다. TDD 작성을 시작하면 테스트 범위에서 제공하는 보안이 컴파일러에서 제공하는 보안보다 낫다는 것을 알게됩니다. 그런 다음 컴파일러를 기쁘게하기 위해 코드를 작성 해야하는 것이 부담이됩니다.

TDD는 RoR의 추가 작업처럼 느끼지 않고 작동하는 유일한 방법 인 것 같습니다.

Rails는 하나의 심각한 성능 문제가 있습니다 : 대부분의 프레임 워크 에서처럼 요청을 스레딩하거나 Node.js 및 Twister와 같이 다른 요청을 해제하기 위해 이벤트를 차단하는 것과는 대조적으로 각 요청은 현재 활성화 된 요청 뒤에 대기합니다. 즉, 응답 시간을 단축하기 위해 코드를 작성해야하지만 대부분의 경우에 매우 쉽습니다.

Rails는 또한 콘텐츠 시스템을 매우 잘 처리 할 수 ​​있도록 설계되었으며, 인터넷은 상당히 공평합니다. 웹 게임이나 전자 상거래 시스템과 같이 좀 더 복잡한 것을하는 것은 새로운 보석을 배우는 것을 의미합니다. 모든 보석이 있다는 것을 빨리 알게 되겠지만, 원하는 일이 모호할수록 좋은 문서를 찾기가 더 어려워집니다.


성능 문제 다시-나는 많은 것들이 해석기 v1.9로 크게 해결되었다는 것을 기억하는 것처럼 보이지만 완전히 잘못되었을 수 있습니다. 이 성능 제한을 극복 할 수있는 방법이 있습니까?
Matty

1
@Matty : 추가 한대로 응답 시간을 최대한 단축하는 코드. 백엔드 프로세스에 남을 수있는 모든 것이 가능합니다. 그러나 모든 프레임 워크에서이를 수행해야합니다. 쉽지 않습니다. 또한 jRuby는 다르게 스레드되지만 자체 문제가 있으며 내 대답은 이미 충분히 길었습니다.
pdr

7

내 개인적인 경험에서 주요 두통은 호환성에 관한 것 입니다.

언제:

  • x배치 레일 프로젝트,
  • 각 프로젝트는 y보석을 사용합니다 .
  • 거기에있는 동안 n레일의 버전,
  • 플러스 m보석의 버전 설치
  • several루비 버전,
  • 단일 Linux 박스에서 프로덕션 머신.
  • 프로그래머는 다른 OS X 개발 노트북에서 작동합니다.

/ 업데이트에 여유가있는 것들의 대부분을 업그레이드 많이 직면하게 될하지 않는 프리랜서로서 호환성 문제가 있는 동안 ... 위의 변수에서를 rails, gems그리고 ruby계속 진화 / 변경.


7
언급 한 모든 것은 RVM (또는 rbenv ) 및 Bundler 를 사용하여 수정됩니다 . 그러면 각 프로젝트마다 특정 버전의 루비와 격리 된 젬 세트를 가질 수 있습니다.
Ashley Williams

이 답변은 (현재) 전혀 관련이 없습니다. RVM은 Ruby 버전 관리, Bundler는 gem 버전 관리를 처리합니다. 프로덕션 서버 및 Figaro 에 대한 배포를 처리하는 Capistrano 는 응용 프로그램 비밀 / 환경 변수를 처리합니다. [Cloud9] (c9.io) (웹 IDE)에서 애플리케이션을 개발했으며 배포 프로세스는 문자 그대로 입니다. Capistrano는 서버에서 응용 프로그램의 버전을 관리합니다. 다른 프레임 워크 (예 : Node.js)와 마찬가지로 도구는 문제를 해결하기 위해 작성됩니다 . bundle exec cap production deploy
Chris Cirefice

5

속도는 분명히 문제입니다. Ruby의 뛰어난 유연성은 상당한 성능 저하와 함께 제공됩니다.

수평 적으로 확장하는 것은 명확하지 않은 작업입니다. 단, 해당 작업을 위해 특별히 설계된 기술을 제외하고는 일반적으로 단순성과 균형을 잘 맞 춥니 다.
기술 B보다 기술 A가있는 머신 당 100 배 많은 요청을 처리 할 수있는 경우, 추가 할 수있는 기간 동안 단일 서버에서 데이터를 제공 할 수 있다고 생각할 경우 기술 A를 사용하는 것이 좋습니다. 이후 병렬화.
2009 년에도 하나의 웹 서버 에서 stackoverflow가 제공되었습니다 . 물론 이것은 더 이상 옵션이 아닙니다. 그러나 규모 확장에 대해 걱정하기 전에 단일 인스턴스에서 많은 사용자로 확장 할 수있는 기술로 시작하는 것이 좋았다고 생각합니다.

이에 비해 RoR은 실제로 느립니다. 간단한 요청을 처리하는 데 시간이 많이 걸리므로 많은 클라이언트를 처리하는 데 문제가 있습니다 (이는 더 빠른 대안과 관련하여 볼 수 있습니다).

모호한 오리엔테이션을 위해 웹 개발에 적합한 다양한 다른 언어를 Ruby와 비교 한 몇 가지 숫자가 있습니다.

이것은 Java 용 프레임 워크 X를 사용하는 경우 RoR보다 정확히 200 배 빠르다는 것을 의미하지는 않습니다. 그러나이 벤치 마크에서 측정 된 속도 차이는 앱의 전반적인 성능에 중요한 영향을 미칩니다.


4
이 답변은 런타임에 "속도"에 대해서만 이야기합니다. Ruby (및 Rails)는 개발 속도에 최적화되어 있습니다.
Nicolai Reuschling

5
이것은 좋은 비교가 아닙니다. 웹 요청에 소요되는 대부분의 시간은 데이터베이스에서 I / O를 수행하는 것입니다. CPU 집약적 벤치 마크에 연결하는 것은 잘못된 것입니다.
ryeguy

3
@ pdr : 트위터의 많은 문제는 모든 것에 루비를 사용 하고 있었고 CPU를 많이 사용 하는 백엔드 프로세스조차도 문제였습니다 . 이와 같은 영역은 정적으로 입력 된 언어가 빛을 발했습니다. 그들은 지금 스칼라를 사용합니다. 솔직히 RoR을 사용하는 것이 C # 또는 Java보다 개발 시간면에서 훨씬 빠르다고 믿습니다. 대부분의 웹 응용 프로그램에 사용하고 CPU 집약적 백그라운드 작업에 C # 또는 Scala를 사용합니다.
ryeguy

3
유효한 포인트의 경우 +1 즉, Rails 애플리케이션을 최적화하기 위해 많은 것을 할 수 있습니다. 랙은 모든 것을 호출하는 방법에 많은 유연성을 허용하는 확장 가능한 시스템이 될 수 있습니다. 말할 것도없이, 루비 1.9는 빠르며 JRuby는 빠릅니다. 개인적으로 JRuby에서의 큰 팬이다는 JVM의 힘에 혼합 할 수있는 것은 멋진 승리 (-> 큰 오버 헤드 단지 흐름 제어에 대한 예외를 사용하는 보석의주의)
Xorlev

2
@Nicolai Reuschling : "개발 속도에 최적화 된"Ruby 또는 RoR의 가치는 무엇입니까? 당신이 제공 할 수있는 검증 , 양적 (예 : 리프트) 데이터를 루비 실제로 대안보다 개발 속도를 제공하는 방법? 다른 것은 무효 청구입니다. 또한이 질문은 RoR 단점 에 관한 것 입니다. 높은 개발 속도는 이점이므로이 질문의 범위를 벗어납니다. 좋지 않은 런타임 성능은 단점이므로이 질문의 범위 내에 있습니다.
back2dos

3

Rails는 하나의 심각한 성능 문제가 있습니다 : 대부분의 프레임 워크 에서처럼 요청을 스레딩하거나 Node.js 및 Twister와 같이 다른 요청을 해제하기 위해 이벤트를 차단하는 것과는 대조적으로 각 요청은 현재 활성화 된 요청 뒤에 대기합니다. 즉, 응답 시간을 단축하기 위해 코드를 작성해야하지만 대부분의 경우에 매우 쉽습니다.

나는 이것이 매우 잘못된 것이라고 생각합니다. 다중 스레드 모드에서 Rails를 실행할 수 있습니다. 다중 스레드 모드에서 실행하는 경우 GIL을 해제하는 IO 라이브러리 (예 : 'mysql2'gem) 만 사용해야합니다. 그렇지 않으면 무의미합니다.

jRuby를 사용하는 경우 다중 스레드 모드에서 단일 레일 프로세스를 실행하고 사용 가능한 모든 CPU 전원을 완전히 활용할 수 있습니다. 그러나 MRI (Ruby 1.8.x 또는 1.9.x)를 사용하는 경우 node.js의 경우와 마찬가지로 CPU를 완전히 활용하려면 여러 프로세스를 실행해야합니다.


여기에 대한 명확한 질문-어떤 IO 라이브러리가 GIL을 릴리스하는지 쉽게 찾을 수 있습니까?
Matty

나는 밖으로 벤치 마크에 있음이 그림에 가장 좋은 방법을 생각 gist.github.com/35d4769d8c8c0dfafc56
Pratik Naik는


핵심 개발자 중 한 사람의 의견을들을 수 있습니다. 이 정보가 문서에 나와 있지 않습니까? 이것을 찾기 위해 라이브러리 테스트를 시작하는 것은 약간 지루합니다 (흥미로운 활동이지만).
Matty

3
  • Rails는 복잡성을 감추는 많은 장점이 있습니다. (ActiveRecord 연결, 전체 유효성 검사 / 저장 수명주기, 제공된 헤더를 기반으로 요청 데이터의 해석) 방금 시작했을 때 정말 좋습니다. 당신이 성장함에 따라, 당신은 일을 처리하는 "레일즈 방식"에 앱을 맞추기 시작한다는 것을 알게 될 것입니다. 때로는 이것이 좋고, 때로는 무해하며 때로는 실제로 당신이하려는 일에 반 직관적입니다. 모든 데이터베이스 테이블이 객체로 모델링되어서는 안되며, 유효성 검사 단계는 다른 곳에서 수행해야 할 수도 있습니다. 많은 Rails 프로그래머는 프레임 워크 (일반적으로 현명한)와 싸우지 않았지만 장기적인 효과는 ... 당신입니다. Rails의 습관을 반드시 필요한 곳으로 옮기십시오.

  • 커뮤니티는 마술처럼 작동하는 라이브러리를 캐싱하는 "매직"으로 청구되는 소프트웨어를 작성하는 습관이 있습니다! 마술처럼 더 빨라지는 이벤트 I / O! 마법의 마법! 일반적으로 여기에있는 것은 부족한 기술 솔루션에 대해 매우 매력적인 API가 제공되며, 당신이 의도 한 것을 수행하는 아주 예쁜 예에 빠지고 나중에는 불완전한 솔루션을 다루는다는 것을 알게됩니다. 이것의주기는 꽤 일정하며, 롤을 배우는 것을 배우지 만, 의존하는 많은 코드를 읽는 아이디어에 대해 잘 알고 있어야합니다 (좋은 일입니다!). Rails 커뮤니티 매직 솔루션은 README가 제안한 것만 큼 마술이 아닙니다.

  • 위의 결론 : Rails를 많이 사용할수록 소스를 더 많이 읽어야합니다. 프레임 워크 내부를 더 잘 이해할수록 장기적으로 더 행복해질 것입니다. 실제로 Rails에만 해당되는 것은 아니지만 여기서 경험을 통해 알려줍니다. 메소드 이름은 때때로 실제로 얻지 못하는 것을 약속합니다.

  • 카고 컬 티즘은 Rails의 이슈이지만 모든 프레임 워크 / 랭 커뮤니티에서는 사실 일 것입니다. Rails에서 더 두드러진 것처럼 보이며 Rails 코드에 이상한 세대 모양을주는 경향이 있습니다. 다른 Rails 프로젝트에서 작업 할 때 생성 된 기간을 배신하는 경향이 있음을 알 수 있습니다 . 그 말에서 알 수 있듯이 커뮤니티는 새로운 솔루션을 채택하고 오래된 솔루션을 더 이상 사용하지 않는 경향이 있습니다. 매일 경험하게 될 코드를 이해하려면 Ruby 뉴스를 가장 잘 읽어야합니다.

  • 일반적으로 데이터 동시성 문제는 일반적으로 커뮤니티에서 잘 해결되지 않는다고 생각합니다. 앱을 개발할 때 데이터를 샤딩하고 물리적으로 원격 변경 사항을 롤백하고 데이터에 대한 액세스를 잠글 필요가있는 시점에 도달하면 솔루션이 좀 더 손으로 조정하면 멋진 Rails의 것들이 기술적으로 필요한 정확성을 갖추게됩니다. Rails는 웹 응용 프로그램에서 발생하는 모든 문제를 해결하지 못합니다. 내가 말하는 것 같아요. 창조자는 분명히 그 메시지를 전파하지 않지만 암시 적이라고 생각하는 것은 쉬운 일입니다.


2

당신이 그것을 보는 방법에 따라, Rails의 변화 속도는 당신에게 경고가 될 수도 있고 아닐 수도 있습니다. 해가되고 해결책이 필요한 것에서 더 많은 것들이 빠져 나감에 따라 상황은 해마다 다소 급격히 변화합니다.

당신이 적극적으로 개발하고 있다면, 당신은 이것의 맥박에 손가락을 가질 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.