
Rails isn't for beginners - xyzzyb
http://rakeroutes.com/blog/rails-is-not-for-beginners/
======
japhyr
I come from the django camp, but I feel this article applies to both
frameworks. I teach high school math and science, and I have started teaching
python to interested students. It has been very satisfying, and now students
who didn't think themselves capable of learning to program are interested
because they are watching their friends have fun with it. They enjoy writing
programs that output to the terminal, and some students are developing gui-
based programs.

This has led me to consider whether I could teach them to build web apps using
django, or rails, or any other framework. It quickly becomes a daunting
proposition for anything nontrivial.

You can follow tutorials, books, and videos all you want. But when it comes
down to it, every good web app is developed over time through iteration and
troubleshooting. Those are two areas where you simply have to understand what
is going on under the hood to be successful. It's nice to work with data
through an abstraction layer, but when you do something that doesn't work well
with the abstraction layer you need to be able to do some manual twiddling
with your actual database.

Frameworks make it easier for experienced developers to build meaningful
projects quickly, which they are then able to maintain based on their deeper
technical understanding. Frameworks may help inexperienced people play with a
simple web app. But frameworks don't let the average person build and maintain
complex web apps.

~~~
thisishugo
I think it depends on the framework.

A full-stack framework such as Rails or Django isn't going to help with
learning because it 'magics' too much of the underlying structure of building
a web app away. You end up using so many proprietary pieces, all of which
"just work" (and don't worry how, just know that it does) together.

Conversely, micro-frameworks such as Sinatra and web.py (the structure of
which inspired App Engine's webapp, and Friendfeed's Tornado) get rid of just
enough of the underlying complexity of getting Ruby/Python to talk to a
browser to, as is often said, let you feel as if you are writing a Python (or
Ruby) web app, rather than a Django (or Rails) web app.

Perhaps the middle ground for your students is frameworks such as Flask and
Pyramid, which start as a micro framework, but which offer the full-stack
batteries included features as and when you need them.

~~~
smacktoward
I dunno if the magic is the real problem. I think the real problem with full-
stack frameworks is that they require you to drink their entire pitcher of
Kool-Aid in order to get up and running. There's no easy "Hello World" to give
new users confidence.

Take Django for instance (because I have more experience with it than I have
with Rails). Just to get through the introductory tutorial
(<https://docs.djangoproject.com/en/dev/intro/tutorial01/>) you have to wrap
your brain around projects, apps, views, models, and Django's command-line
tools. Contrast that to getting started in PHP without a framework; you can
introduce someone who only knows HTML to PHP extremely gently, by taking an
existing HTML document (which they understand) and sprinkling in some PHP to
do simple stuff. They won't be a programming god with that knowledge, of
course, but that's not important; what's important is that they took the first
step and succeeded, which gives them the confidence to take the second. With a
full-stack framework, getting that first step right involves a _lot_ of mental
work, which increases the chances that people will screw it up or abandon it
in frustration.

Frameworks frequently compound this problem by inventing their own terminology
for features, or taking words people already use and redefining them, so you
can't easily map things you already know from other systems to things inside
the framework. Just in the Django intro, for instance, we have to learn the
difference between _projects_ and _apps_ , both of which are commonly used
terms that Django has overloaded with Django-specific meanings.

All of this means that taking the first step in going from "has never used
Django" to "Django newbie" involves a _lot_ of learning, and that guarantees
that some people are going to just walk away and others are going to try to
follow along but get lost in the complexity.

------
xxdiamondxx
I agree completely.

A couple of months ago my sister approached my and asked "How do I learn how
to make websites?" She has no programming experience, so I thought for a while
on where to start. I figured if I showed her what I was working on in
Python/Django, she would be completely overwhelmed. So I started with just
HTML. As she worked through that, she started asking questions like, how to
change layout and fonts, so we started working with CSS. She's not at the
point yet, but I think PHP is going to blow her mind, as I've seen her
copy/pasting stuff from file to file.

I think its important to start at the beginning and learn some of the pain
points that these frameworks solve before jumping in. Otherwise you just get
frustrated wondering why things are set up a certain way.

~~~
xyzzyb
That's the nail on the head right there. Without any context even the
conventions of Rails seem like arbitrary decisions just to make things
complicated. Once you understand the problem you can appreciate the solution.

~~~
kristianc
I'm not sure. I remember learning HTML and CSS through WYSIWYG editors such as
Dreamweaver (essentially abstractions, no?), and then getting frustrated by
how much excess code it was adding. That then gave me the impetus to delve
into the code and then begin learning the HTML, CSS, principles informing the
design. Had I started back then trying to tackle HTML head on, I might have
been overwhelmed.

Similarly, I'm trying to learn building web apps at the moment. I'd rather
have some decisions taken for me by Rails (in the knowledge that they've been
based on some kind of best practice / consensus) and try and build backwards
from there. It's probably not the purists way of learning, but then I don't
have the level of expertise a purist probably does.

~~~
xyzzyb
Coming to Rails frustrated with the slog that you have to deal with otherwise
is exactly the path that Rails was designed to accomodate. You know and
appreciate the fact that Rails is making decisions for you to help you get
going while a beginner would probably be overwhelmed by all the complexity.

~~~
kristianc
Absolutely - and in fact, one of the virtues of the better Rails tutorials is
that they do expose you to some of the complexity.

You learn to understand that things are passing between the model and
controller, and the rough sequence of things. I've come to appreciate the
basics of a RESTful approach, and why things are as they are. I'll of course
need to take away the abstraction over time, but without having the
abstraction in the first place, I probably wouldnt have started.

That said, I second the point about getting it installed. I shouldn't have to
be on StackOverflow for that.

------
kaiuhl
_Learning to program is all about learning mental abstractions. A beginner
will have no conceptualization of what a web application can or should do.
Where an experienced web programmer from any language will hear requirements
and immediately (and almost unconsciously) start building up a mental model of
the problem domain, the beginner will still be struggling with how the system
itself works. That will be true in any web development framework, because
there’s simply no way for any framework to think through the problem for you._

This.

~~~
toast76
There seems to be a fundamental misunderstanding about what "beginner" means
for Rails.

I've been a .NET developer for over 10 years. I'm a Rails "beginner". I'd say
I'm comfortable with web technology, and yet Rails was an absolute nightmare
for me to get started with.

If the Rails community wants people like me to stop doing what they were doing
and use Rails instead, it MUST be easier to get started with.

~~~
oblique63
I just got hired for a gig as a rails developer, and I feel your pain. I got
hired because I primarily work with python, and have good experience with
Django, flask and the like, but I had never really touched rails. From the
various comments I'd heard, I figured it would be a simple transition, but man
has it been annoying. Just setting up their dev environment took almost an
entire 8-hour day, and I was one of the 'faster ones'.

Not to mention that having to deal with rails legacy code, you quickly realize
that despite the original developer's best efforts, the whole
magical+'convention over configuration' aspect of rails just totally goes
against the concept of 'self-documenting code'. Compound that with the fragile
version requirements of both Ruby _and_ Rails, and you have a recipe for
frustration. Out of any given search I perform, about a third of the
'relevant' results are for incompatible versions of rails, making it hard to
find anything reliable outside the official docs (which leave a bit to be
desired).

I may just be spoiled by the relatively conservative + documentation-heavy
nature of most of the python frameworks I've worked with, but considering the
popularity of rails (even amongst non-developers), I guess I just expected the
barrier to entry to be a bit lower...

~~~
mattbriggs
Can you give more details? Bundler gives very strong versioning of
dependancies, I find railstutorial.org, railsguides, and the api docs to be
pretty complete, and "convention over configuration" means things like your
models are singular names of your tables, and if you do something like
"belongs_to :other_model" it expects an "other_model_id" field by default, and
will link to to a class called OtherModel. It is the sort of thing that can be
a pain if you don't know it, but can be learned quite easily, especially if
you have more experienced folks your working with.

I learned rails and django at about the same time, and I never understood the
praise of the django docs. Both projects have above average documentation for
open source projects, but if anything I find the rails docs are far more
consistently up to date compared to django. Both have helpful and active
communities though (which is far more important imo), and I never really had
that hard of a time figuring something out.

I think rails has a "For Noobs" reputation with people who have never used it,
but as someone who didn't really have any preconceptions going in, I find this
"rails 3 is hard" thing really hard to understand.

~~~
oblique63
> It is the sort of thing that can be a pain if you don't know it, but can be
> learned quite easily

I agree, it's not terribly hard to pick up the basic idea, but it still
doesn't lend itself to the idea of being 'self-documenting', which has always
been a helpful fallback when dealing with python stuff that I encounter
problems with. I guess it kinda just feels like it encourages too shallow of
an understanding of what's going on, especially if for some reason I might
want to tweak/customize certain things later on; it feels more geared towards
giving you a fish, as opposed to teaching you how to fish (which is
highlighted by the 'standard' encouragement to use lots of code generation).
Even after going through the docs, it took me way too long to get even a vague
idea of how to properly set up a custom model/migration _without_ the rails
generator tool. But I'll admit, that's all a lot more in the realm of personal
preference.

Bundler is cool, but even with strict versioning, setting things up for the
first time is no walk in the park. I won't blame rails for that though, that's
clearly more of an ecosystem problem. A bigger problem than versioning though
(in my eyes anyway), is when plugins follow this 'rails-way' of doing things
magically, and leave no clear way to troubleshoot problems when they arise
(devise, I'm looking at you).

I too find the rails guides and rails tutorial to be immensely helpful, but
it's more because I would literally be completely lost without referring to
them every 5mins, than because I find them terribly insightful. I know the
django docs aren't _really_ that much better, but since I can usually work my
way around a django project without referring them as frequently, I guess my
standards for them is lower? Same could be said for a lot of their plugins,
because again, at least there I have been able to fall back on 'self-
documenting code' most of the time.

I do think rails is pretty cool, and I could see why it got the praise it did,
but I would probably only use it on small projects that involved only a
handful of people from the get-go, because I would feel bad dropping a newbie
onto a mountain of legacy rails code.

~~~
mattbriggs
>>I agree, it's not terribly hard to pick up the basic idea, but it still
doesn't lend itself to the idea of being 'self-documenting', which has always
been a helpful fallback when dealing with python stuff that I encounter
problems with. I guess it kinda just feels like it encourages too shallow of
an understanding of what's going on, especially if for some reason I might
want to tweak/customize certain things later on; it feels more geared towards
giving you a fish, as opposed to teaching you how to fish (which is
highlighted by the 'standard' encouragement to use lots of code generation).

I have been doing rails every day for about two years now, working on a
moderately large (200k loc) app, and we very rarely go against the "rails way"
of doing things wrt to naming. Like if you have a model called Post and a
model called Comment with a line that says "has_many :comments" in the post,
there is a lot going on. The name of the accessor will be called "comments",
it will lookup data in the "comments" table that have an fk of "post_id" and
materialize a collection of Comment objects.

I find those are good conventions, they are readable, and more importantly,
they are consistant across all the rails apps I will ever see. So when I write
new code, or am reading code I am not familiar with, there is this whole class
of things I don't need to make decisions about, since there is already this
implied group understanding of the way things should be.

Now, in the time I have been doing this, there have been probably around 3-4
times when I _have_ wanted to customize those things, but it is really so
incredibly rare that I would go so far as to say you wont hit a point where
going against the convention is a good idea until you do this professionally,
at which point hitting up apidock and finding out about the :class_name and
:foreign_key options.

The places where I tend to branch out is things like custom validators, or
putting a bit more architecture in then jamming everything into fat models,
but fighting rails conventions really isn't something you ever want to do no
matter how experienced you are with them

>> Even after going through the docs, it took me way too long to get even a
vague idea of how to properly set up a custom model/migration without the
rails generator tool. But I'll admit, that's all a lot more in the realm of
personal preference.

I think this is where the disconnect is for me about accusations of magic. A
model is a ruby class that extends ActiveRecord::Base, is named as the
singular version of the table, and is put into the app/models directory. I
don't find any of those things particularly magical or mysterious, but if you
only use the generators then you are never forced to think about the
implications of the code that is being used, so that process of learning gets
pushed out until way later.

The other thing is I see it recommended quite often to skip learning ruby by
itself, and just pick it up as you go with rails. I think that is terrible
advice, rails uses many features in the ruby language that aren't common in
other similar languages. So when you run across an api like the create_table
which uses a builder pattern with blocks, it seems like a lot more magical
then it actually is.

Personally, I only use generators to create migration classes, and that is
just so it puts the timestamp in for me. They are really there to help
beginners get going (and potentially write some boilerplate code for you,
although I usually would rather only write the bits I need rather then delete
all the stuff I don't need). Maybe they do more harm then good though, and
people should start recommending that beginners learning the framework create
files manually until they gain a certain baseline of understanding.

------
mgkimsal
I'd always remembered word-of-mouth from Rails enthusiasts touting how easy
Rails was (talking 2006-2007). A Rails guru last summer told me that 'Rails
was never promoted as being _easy_ '. Was my memory faulty? Has the PR around
Rails changed over the years?

~~~
ahoyhere
It was promoted as being easy for _people who already knew how to program_.
Which it was. The 5-minute blog video wouldn't help a total newb at all, but
to an experienced developer it's clear how powerful it was.

~~~
wh-uws
I can attest to this. I was a total noob when I saw that video and didn't get
it.

Spent several years in the murky php waters because I could just drop that
code in the html I did know and go.

Now that I have more experience its more more clear the benefits of
rails/django

------
ZanderEarth32
I am a beginner and you are 100% right. I am working my way through learning
some Python and when I started to find stuff referring to Django and web
frameworks, they all seem to be touted as 'easy'. So, I thought, 'what the
hell, let's build a web app'. After installing Django I was totally lost.
Sure, I could install the framework and work through the tutorials but I am
still miles away from actually building something on my own, because, while I
know how to write some lines of code and create some basic tools I still don't
know how to BUILD anything.

~~~
xyzzyb
Yeah, I'm realizing that there isn't a great starting point for someone to get
into web development from scratch. I don't think Django or Rails should even
factor into it.

I've liked what I've seen of Code Academy, that might be something to look
into if you haven't already: <http://www.codecademy.com>

~~~
ZanderEarth32
Thanks, I went through the Code Academy courses and they were fun and helpful,
but the biggest strides I've had in programming have been thinking of an idea
and then trying to build it from what I know. This way, I am applying what I
already know, further cementing it and it forces me to run into problems that
I cannot yet solve. I spend up to a week trying to figure out a solution to
that problem on my own. If I can't, I'll head to Stackoverflow and ask there.
That's been the best way for me so far.

~~~
xyzzyb
Absolutely. Thinking of an idea and then coding to its realization is a
classic method of learning to program. It sounds like you have a great system
for learning. I'd only caution that even if you come up with a solution to a
problem on your own: do the search engine/stack overflow research anyway to
see alternative methods. If you don't find any: blog about it.

------
joedev
Interesting that right at the top of rubyonrails.com is this quote:

“Ruby on Rails is a breakthrough in lowering the barriers of entry to
programming. Powerful web applications that formerly might have taken weeks or
months to develop can be produced in a matter of days.” -Tim O'Reilly, Founder
of O'Reilly Media

~~~
techiferous
"Powerful web applications that formerly might have taken weeks or months to
develop can be produced in a matter of days."

This is true if you are already an experienced web developer. You already know
the problem space well and have an intuition about good solutions and
approaches. Someone handing you Rails as a tool can certainly speed up the
development time.

This is also only true if the application is trivial; you can only create a
simple "first cut" of a product in a matter of days.

"Ruby on Rails is a breakthrough in lowering the barriers of entry to
programming."

I think Ruby is a great first programming language; it has a cleaner, more
consistent syntax than some other languages with fewer gotchas and edge cases
(I'm looking at you, JavaScript!).

Rails, on the other hand, has a lot of magic, so that if it is your first
programming experience, you will probably approach programming more in terms
of memorizing and repeating the magical incantations instead of having an
understanding of how the system works and practice in designing and crafting
good systems of your own. So in that sense, Rails (and the state of web
programming in general) may make it _harder_ for people to get really good at
programming.

------
saltcod
I got pretty far along with Rails Tutorial, and came to love Ruby after just a
short time. Its so nice and such a refreshing change from PHP.

BUT! What I hadn't anticipated was really not knowing anything about how to
make a web app. I knew nothing about REST, nothing about get/put, nothing
about forms, etc.

I thought Ruby and Rails were the answer to the problem I'd been having for
years. I thought that I was just in need of the right programming language to
help take my skills to the next level. I realize now however, after some cool
Ruby bits and some Rails basics, that you're only going to get the best
results out of language and framework when you know the basics.

And there's a lot of basics: rest, basic http methods, forms, sql, routes, etc
etc etc.

------
cosecant
I am a huge advocate for the Django web framework, yet I always tell people
that web frameworks (Django|Rails|etc) are not for beginners. Like many have
mentioned, it's easy for experienced web programmers that have been mucking
around things done "the old fashioned way" and without any true MVC structure.
I assume it would be difficult for novice programmers to really understand
what the advantages and best practices of MVC web frameworks are for, when
they have little experience of having worked in anything else.

------
mmackh
I would argue that the lack of a simple installation process to get Rails
running makes it inaccessible for a lot of beginners (myself included).
Without stackoverflow, I wouldn't have known where to start - or what commands
I'd have to enter into the terminal. As far as I know, there is no script that
automates this process. Compare this to PHP, where most of today's shared
hosts support it right out of the box.

~~~
kiba
To me, it's more about "holy shit, several level of abstraction" that I have
to learn by heart in order to use rails, rather than learning the commands
that does a rails application.

It's a lot easier, in my opinion, to start from nothing but a few libraries
and then write a toy web application. However, you're left to write everything
yourself.

~~~
bphogan
There's that, but there's also the fact that many of the prominent Rails
tutorials tell you to start using a whole bunch of additional libraries that
aren't Rails. I've seen that confuse many people.

------
dysoco
So as someone who has programmed before in C# and Python, and has a knowledge
of OOP, what would you suggest to start in Web Development (Apart from HTML,
CSS and JS) ? I tried PHP, but I found the syntax extremely awfull and
verbose, any alternatives ?

~~~
mattbriggs
If you want to stick with a language you know, ASP.net MVC and Django are both
great full stack frameworks for getting complex stuff done quickly and well.

If you want to go a bit more of a futureproof route, focus on learning
something like backbone or ember, and treat your server as an api. In that
case, what framework you choose doesn't matter so much, as long as it provides
good json serialization and easy data access.

