Why build your own framework when there's one already there? Already well-used, well-tested, well-extended?
Sure it may be easy enough to do, but is it really worth it?
I, for one, would much prefer to be spending my coding time writing application logic than Yet Another Validation Library.
Suppose someone is familiar with Java Servlets and JSP, basic JDBC and SQL, and the tomcat container (with connection pooling). If I have a simple database driven application, I can choose to hand code some of my application logic, or use a framework.
So I'm choosing between, say:
No framework: container managed security, hand coding my ORM layer, writing my own server side form validation, writing my own MVC (or just not bothering, if it is just a few pages).
Framework: Spring Security, Struts for form building and validation, Spring for the MVC tier, JPA and Hibernate for ORM.
These are slightly extreme - you don't have to use all those tools, of course.
But let's say we do get something out of the framework. The code really is easier to maintain and understand, provided someone has read a 300 page book on spring, another 300 page book on hibernate, and a 150 subsection of a book on Struts, along with doing all the exercises.
Even if the framework based code is better, that's not enough to justify the complexity. I need to justify taking an application out of the realm of someone who understands the basic servlet spec and putting it into the realm of only those who have read and digested an additional 600+ pages of Framework complexity.
Thing is, I like frameworks. You can read and digest 100 pages about Rails and really get going. So the bar for justifying the "added complexity" of a framework in the Ruby world is much lower than it is in the Java world. I don't use Python, but I'd imagine it's a similar situation - it's much easier to justify Django than the Java framework stack.
Good frameworks are the same way. I've already extended the hell out of Kohana to make it more useful to me. This is work I would have had to have done if I weren't using it, sure, but all the basic stuff is there all the same.
Would you rather build a porche, or try to convert a clapped out old volvo into a porche?
Tidying up rubbish, bad architecture choices, stupid coupling etc isn't fun. It's twice the work - fixing all the stuff they did stupidly, and then implementing it how it should be done.
Why learn woodworking when you can buy furniture at Walmart? Some people like craftsmanship and others like frozen dinners.
For many developers who toil in the same language all the time, or who have spent many hours in whatever language they're currently in, that's the case.
For me, I avoid Rails because it makes me feel like a failure. ActiveRecord, for one reason or another, hates me. I like Rails, and I like the Framework concept (however limiting it might be) -- because I feel that it gets you started more quickly. At the end of any significant project, I feel like you will have likely massaged enough elements of the framework to make it work for you that it's hardly recognizable, but it still got you something to show people that much faster.
That said, ActiveRecord is the showstopper for me in Rails. It seems like I've either never properly wrapped my head around it, or there are fairly low limits to what you can do, or I'm doing everything wrong. What that's always meant for me is that instead of using ActiveRecord to its fullest, I'm building SQL queries manually. And if I'm deviating from the framework's toolset, why am I using this framework in the first place.
This is NOT a knock on Rails, I'm probably just doing it wrong. Rails and I can still be friends... just not in that way.
I've always liked the 'middle ground' that Zend offers, in that it abstracts away the connection and handle, and gives me a convenient place to start building the model code. It's not 100%, but it doesn't make me feel guilty in the morning either.
I find it's just way, way easier to get up to speed with a framework as a base, and if your framework is any good, then it should be easy to shove aside later when you need to special-case things for performance or whatever.