A couple of years ago, I put together a large system and was punished for my mistakes by having to maintain it. Now, I've been tasked with accomplishing almost exactly the same thing with a brand new system. After only a week of work, it's stunning to see how completely different the design is on the two of them. I have a variety of reasonably designed and well-separated layers to handle what needs to be done. The only significant lack is that work-flow is handled procedurally, but (as usual) I'm on a relatively short timeframe and don't have the time to put in all of the bells and whistles that I would like. The nice thing is, once this part is finished, we have quite a number of clients who are ready to purchase it. Money Good.
Another positive experience is that I'm lead on this project with a new co-worker who didn't write many tests. Because we're working together (though not pair programming), he has no choice but to write tests and he's actually done a great job of it. With only a week of work, we have well over 300 tests between the two of us.