Before all the laws of software, before the purpose of software, before the science of software design itself, there is a singular fact that determines the success or failure of a software developer. This fact makes the difference between the senior engineer who can seem to pick up new languages in a day and the junior developer who struggles for ten years just to get a paycheck, programming other people’s designs and never improving enough to get a promotion. It differentiates the poor programmers from the good ones, the good programmers from the great ones, and the great ones from the “rockstar” programmers who have founded whole multi-billion dollar empires on their skill.
It’s not anything complicated, and it’s not something that’s hard to know. It’s not something that you can only do if you’re born with a special talent or a “magical ability to program well.” There is nothing about the nature of the individual that determines whether or not they will become an excellent programmer or a poor one.
There is only one, singular fact:
The better you understand what you are doing, the better you will do it.
Rockstar programmers understand what they are doing far, far better than average or mediocre programmers. And that is it.
All you have to do in order to become an excellent programmer is fully understand what you are doing.
Some may say that they already understand everything. The test is whether or not they can apply it. Do they produce beautifully architected systems that are a joy to maintain? Do they plow through programming problems at a rate almost unimaginable to the average programmer? Do they explain everything clearly and in simple concepts when they are asked for help? Then they are an excellent programmer, and they understand things well.
However, far more commonly than believing that they “know it all”, many programmers (including myself) often feel as though they are locked in an epic battle with an overwhelming sea of information. There is so much to know that one could literally spend the rest of his life studying and still come out with only 90% of all the data there is to know about computers.
The secret weapon in the epic battle, the Excalibur of computing knowledge, is understanding. The better that you understand the most fundamental level of your field, the easier it will be to learn the next level. The better you understand that level, the easier the next one after that will be, and so on. Then once you’ve gone from the most fundamental simplicities to the highest complexities, you can start all over again and find amazingly that there is so much more to know at the very, very bottom.
It seems almost too simple to be true, but it is in fact the case. The path to becoming an excellent programmer is simply full and complete understanding, starting with a profound grasp of the basics and working up to a solid control of the most advanced data available.
I won’t lie to you–it sometimes is a long path. But it is worthwhile. And at the end of it, you may find yourself suddenly the amazing senior engineer who everyone comes to for advice. You may be the incredible programmer who solves everything and is admired by all his peers. You might even come out a “rock star” with millions of dollars and a fantastically successful product. Who knows? I can’t tell you what to do or what to become. I can only point out some information that I’ve found to be truthful and valuable. What you do with it is up to you.
-Max
Subscribe in your feed reader
Also they really have to love their craft. Admit it, they LOVE it. They live it and breathe it. It’s their whole beingness. haha. But yeah understanding more.. and understanding the game of the sofware industry… really contributes to the rock star.
Nice. Okay more than nice. Genius!!!!!!!!!!!!!
Thanks!
-Max
I totally agree; that is why I believe compilers and the inside of an OS are one the most important courses on any software development education. Because really understanding how your code is executed in the end (knowing about flipflops may be a bit too much detail), how an instruction in the end does memory allocation, how bytes are being transmitted via the network… Every piece of code comes down to that level and once you understand how that works, it’s easy so mirror different approaches into that basic knowledge.
Unfortunately most education are taking out such “raw” courses in favor of for example GUI design techniques. Also relevant, sure, but not instead.
Yes, it’s important to know how the computer works. I suppose I had that advantage when I came in to the development world, since I was in IT for a long time before that. But there are even more important fundamentals, and that’s something I’m going to talk about in my next blog.
-Max
Wait… there exists a beautifully architected system that is a joy to maintain?? There is someone that can explain something clearly, with simple concepts?! Wow, well I guess I know where I stand.
Hahahaha, fear not, my friend. There are very few people who create such systems or could do such explanation–that’s one of the reasons that I have this blog in the first place!
-Max
I’ve been programming for the past 11 years of my life.
At this point I can say this:
1. Yes, experience does count
2. I write better and more beautiful code now, but despite that, as a whole I haven’t become significantly more effective
3. Programming doesn’t get easier
Huh, wow. I’ve actually found that programming has gotten easier–at least, I consistently get faster at it. I think it’s easy after a long time in a field to start to stagnate a bit, though–I often go back and read up on the fundamentals and principles of software development, just to see what more I can learn from the basics. And of course, I always try to learn new technologies, and so forth, which I think really helps me even with my understanding and ability on the technologies I already know.
-Max
Perhaps, I should have written “the job doesn’t get easier”.
I might be a better programmer now. But I still make bugs. I can still have moments of huge doubt about my decisions. And I still have to think really hard at times. I’ve become more laid back, but the job as a whole certainly hasn’t become relaxing
I’ve got this project of mine where I want to create an organisational platform for businesses to run a lot like social networks, building on peer coordination and remuneration. The program compiles and runs stable. But it still doesn’t work satisfactory, in terms of working for the potential users. This is, I learned, the ultimate measure of a working program. Not the bug count or whether it builds. So now I’m in the middle of a rewrite and hoping that next time I’ll get it better