While studying Cairngorm, staring at the Cairngorm Explorer Diagram, it only took a few minutes to understand what Cairngorm does. But it took several months for me to fully understand what you're not allowed to do with Cairngorm.
Though I've covered the ground rules here, it's important to make a clear case in point about why the common things that I did before Cairngorm are considered to be self-defeating in the Cairngorm world.
What Not to Do Example #1: "View Locator"
I had previously written an application that had named views, and each view would register itself with a ViewLocator singleton. There is a text-box parented by one set of UIControls, and a submit button for that textbox that was a distant cousin. Of course I didn't want to require every aunt and uncle to have to pass the textbox data to the submit button, so I registered each UIComponent with a central component registrar. Then, the submit button could gather the data from the textbox, and send it to the controller. Sounded like a good idea at the time, and I figured that since the controller was separated, and the model hadn't yet been updated, that it still worked as an MVC architecture with "smart" views.
This does not work well with Cairngorm because the views are basically "telling secrets to each other", and the command object can't control what it doesn't know. Too much of this programming style, and debugging becomes a nightmare because when something changes on the screen, I the programmer don't know whether it's changing because of a secret communications within the view, or if it's changing because the command changed it. It adds many more steps to the debugging process, and I have to look through every single view that's "passing notes in class" to find out why a view has changed.
The Cairngorm philosophy is that when a programmer sees something changing on the view, there is one and only one place the programmer needs to look to find why the change happened, and that is in the model locator. Views should be designed so that they are unaware of each other, and very view changes soley based on data changes in the Model Locator.
(other examples coming soon)