What I experience when I grasp a subject or when I discover that I've achieved some level of mastery at something, that's how I percieve what happens. First contact with a software project or product is often daunting in my mind. There are so many details that your working memory rapidly becomes overloaded. After time, your brain manages to do what it does best; filtering the avalanche of data we're exposed to and effectively extracts only what's needed for the conscious part of the mind to make sense of the object of our interest. What is happening is that a complex environment is transformed into something more controlleable. For instance, when I first started to take an interest in computers and operating systems, the prospect of replacing the hardware in my server seemed infinitely complicated. Now, with the experience and filtering abilities that bestowed on me it seems a simple matter of adding some modules or choices in the kernel config and off we go replacing the hardware. Afterwards recompile the Gentoo system with some adjusted choices in the CFLAGS. The domain of software development is very much about handling complexity. The excellent book of Nicholas Rescher; Complexity: A Philosophical Overview illustrates complexity and the various aspects of it quite nicely. The above mentioned process of converting a set of data into something more malleable in the any indivduals mind it something I notice that many software developers simply ignore when they are to explain something for their peers. To be understood, you who have the knowledge will have to consider the experience level and knowledge about the subject in the recipient's posession.