|Think about Loose Coupling|
++, but at some point I have to disagree:
Programming is like rocket science - the more familiar you become with programming the less like rocket science it seems.
The more I learn about programming, the more it seems like rocket science to me.
Sure, at some point I had that "I can code everything" feeling. And a few weeks later I thought about how I could possibly write a complex piece of software (think a good compiler, OCR, RDBMS, face recognition, an operating system that doesn't suck, ...) and I realized that it's not so easy.
And the more I learned about programming, the more I saw the complexity in seemingly simple programs.
Take a text editor as an example: it displays a few lines of text, allows you to scroll, to safe the files etc. Simple, right?
But wait! Did it ever occur to you that the editor has to handle multi byte character encodings? even graphemes that are made out of multiple codepoints? converting between different encodings? autodetect character encodings? That it has to support right-to-left for arabic texts? That it might contain a syntax hilighting engine, a script language for configuration? that all key strokes could be configurable? that it should support vertically split windows on the text console?
I think I could go on with my list of things that make a seemingly simple thing like a text editor a real challenge to program. (And fwiw vim supports all of the features above; and I think many other good text editors do).
There are hundreds of other pieces of software that I thought were simple before I got into programming. Now I'm glad that others wrote those incredible helpful (and very often equally complex) programs, and that I don't have to do it all by myself.