It’s not learning your first language. It’s not learning your second and third languages either. It’s not learning Lisp, Scheme, Ruby, Python, Erlang, Haskell, Perl. It’s not knowing C back-to-front, upside down. It has nothing to do with Java, script or regular, nor is it anything to do with Objective C, C++, C#, or D. It’s not even assembly language.
It’s not grokking recursion. It’s not using functional languages. It’s not understanding things like function currying, and other fancy tricks.
It’s not knowing the hardware down to the bits. It’s not programming for embedded systems, or for giant mainframe clouds. It’s not getting a Computer Science degree. It’s not working for Google, or Microsoft, or Sun, or IBM, or anyone. It’s not working for yourself, either. It’s not managing your time, nor is it managing others’ time. It’s neither agile nor extreme.
The hardest thing in programming is that no matter who you are, and what you’re doing, most of the time someone else has done it, done it better, and then released it for the world to see and use. Instead of re-inventing the wheel, your best course is to close emacs, and spend some of that time you were going to spend creating the world’s seven millionth web framework scheme reading documentation, and learn to live with it.
Although I never really got the hang of that currying business.