There is a small window between learning and knowing where it’s possible to surprise yourself with a good design. Sometimes you are confronted with a new set of technologies and a new problem domain, and armed with a solid background in the fundamentals software engineering. You lay out the plans and begin work taking the best things from your previous experience, but only some of it applies. The rest is subject to your intuition and inherent skill, something that has nothing to do with experience with toolkits and successful or failed projects.

You trudge on almost blindly, building the system to match the “requirements” as well as you understand them. Gradually the behavioral nuances of the new technology bubble to the service, and little by little your skill set rises to meet them.

You proceed conservatively and test thoroughly, hoping for the best on the big day when you’ll pull the switch. But your experience keeps tugging at your sleeve with the reminder that no matter how hard you design and test, the fact is that you simply can’t be completely sure until it’s all over.

But, the system rolls out and you move on. You’ve done well. Clients are happy, and minor bugs roll in. Your hard work is rewarded with service requests that fall well within the realm of fixable flaws. You charge for them, and a wish list grows.

Then some day down the road you finally have a chance to look back and get a feel for the process. “Wow,” you think, it’s kind of amazing how all of this works. Amazing how easy it is to get caught up in the confusion of the process while it’s happening. But all in all, well done. Hard work always pays off.