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.
You're right, this applies just as much to Django. I should really have said, "Frameworks aren't for beginners". A framework allows an expert to get going without dealing with the trivial details; but to the beginner there are no trivial details.
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.
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.
Thank you, this is really helpful feedback. I can learn any technology I want to, but since programming is not part of my daily professional work I often have a hard time knowing what pieces are worth my time to learn. I've been thinking about Flask and Pyramid for a while, so I will check them out with an eye towards sharing them with students.
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.