I agree with this fully.For me, each project I did in JSF got progressively easier and more pleasurable to deal with. Despite the books and tutorials I read about JSF from the start, the only thing that really made me like it was actually working with it and learning when and how to utilize different parts of the spec. And I mean really LEARNING about it; not hitting a wall and giving up. I cursed and became frustrated, but I kept going. Things seemed impossible at first because I was trying to do them incorrectly. Several subsequent projects taught me about phase listeners, validators, components, render-kits, and when/how to use them together--all things that I knew existed from the start, but not how they really worked in practice. And because of that, with each new project I was able to make better decisions and difficult things became simple. I've done five projects in it, start to finish, and I still probably have things to learn.
There are several obstacles that make it difficult to get going with JSF. The API may be very flexible, but is not designed for usage in mind. Writing jsp-based components is a mess. Documentation has still a long way to go: To figure out how to write a converter that can handle reference objects instead of value objects took me quite some time. Having two implementations of one specification doesn't help at all, especially when writing components: Either I use only classes defined in the spec, duplicating lots of standard stuff like, or I make myself dependant on one particular implementation, and can't switch to the other one. I hope that the JSF community can settle to provide only one single implementation for JSF 2.0, and make that as rock-solid as, say, Spring. I you'd ask me, I'd say anyway: Drop JSF managed beans and use only Springs container... Still, haven't finished yet the two projects I'm working on with JSF...