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.
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!!!!!!!!!!!!!
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.
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! 🙂
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.
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 🙂
Okay, I can totally see where you’re coming from. Perhaps what’s happened is that you’ve learned the facts of programming very well, but haven’t been learning enough of the theories behind software design. When you know a lot about programming itself (programming languages, algorithms, etc.) you can make a lot of effective programs that work, but without knowing more about the basic theories of software design, there’s always going to be some new situation that’s difficult to understand and hard to get out of.
I think one of the problems in working with software is that it’s so complex that it would take a lifetime or more for an individual programmer to derive all of the laws of software design by himself, just by working on his own programming tasks. Ultimately, to some degree we have to learn from the theories and experiences of others, although of course we still have to use our own judgment about what’s right and wrong.
Every programmer should understand what a register is, and how it is used. Some to the point of building a register out of simple electrical gates and clocking stuff into it.
Even languages like java, while not directly interfacing with cpu registers, are using a form or registers behind the scene.
More advanced users should be introduced to different types of registers. My favorite is the circular register. It fascinates me how it is efficient because of the way it maintains space due to the consideration of the common locality of functions and arguments.
I agree that programmers should understand what a register is, and they should understand how computers work underneath. However, I also would caution developers not to spend too much time thinking about how the computer works, when they’re writing or designing in a high-level language. Spending too much time worry about how the computer works tends to lead to premature optimization.
I actually don’t know what a circular register is, and Google isn’t being too helpful. Care to enlighten me? 🙂
I disagree, at no time have I needed to know or use registers..
this is for tooting ones horn and for stupid interview tests. Or bragging in blog comments
rockstar programmers work hard, are consistent, don’t mind doing the boring stuff, can retain a lot, yes they may be quick to learn or have great memories, but that sir is genetics…
rockstar programmrs, keep going when project managers are stupid or playing politics, rockstar programmers are slower as they are not taking the shortcut to impresss the boss,
rockstar programmers are often not recognized nor rewarded. “geeks by nature”
I transitioned from doing PC networking to .NET and SQL development, and I’d agree that low-level knowledge isn’t a core requirement for software development. It can, however, be helpful sometimes.
There have been times where my knowledge from other areas of the IT world have come in handy. I’ve been able to rescue some of my colleagues who were already focused on some task and had overlooked something that was obvious to me, but unclear to them, mainly because they were intent on solving the problem, but also because the nature of that problem slipped under their troubleshooting radar.
I’ve known some developers who have embraced and are fluent in the high-level design and architectural aspects of say WCF services, but don’t know what a command prompt is. While on the surface these seem unrelated, what if the WCF service is consumed by a console application client, and the creator puts the blame on the service? It helps to know well the platform that you’re coding for, including its various subsystems, in order to be better able to understand and do what you’re trying to do, as you suggest.
Thought provoking post! Bookmarked.
Yeah, thank you, I TOTALLY agree with you about all of these things!! You’re completely spot on, and those are excellent examples of exactly why it’s important to really have a broad range of knowledge! I came out of the IT field too, as a developer, and I’m always shocked at how some programmers don’t really have a deep understanding of how the computer actually works, or what sort of IT situations real people have.
Title is misleading. The article as well as the ensuing conversation points to THREE basic requirements: understand well, execute well, communicate well. Hey, hard to resist catchy.
You know, your point is interesting, but I actually disagree. Although I do agree that all of those things are important things to do (for “communicate well”, that’s more so in a team setting than on your own, but it can still be important), I would say that excellent execution comes from excellent understanding. That’s the point of the article. so it really is just understanding that is the singular secret.
Max, I disagree with again.
By definition, a rockstar is all about popularity with a particular audience. If you shine yet none can see you are more likley a hidden gem. Therefore a rockstar needs to “communicate” his/her awesomeness effectively. It’s what you’re doing with this blog, I’d guess. More time “understanding” the rockstar domain will get you there. Pun intended.
Hi Florin. You have misunderstood the word “rockstar” in this context. The phrase “rockstar programmer” is an idiom. The second definition here would be the one that applies:
Google search is the secret of rockstar programming.
Hahaha! At the very least, that’s certainly how I’ve come to many of my understandings. 🙂
That’s so interesting, Alessandro! I’m writing a book that I think could help you with your situation. The book is called Code Simplicity and it should be out later this year. I think one of the most important things, if you want to be a really great programmer, is to go back and understand the very basics really well. If there’s anything way back when that you didn’t quite “get”, it can be really valuable to go back and try to really understand that thing, until you fully get it. Not just “oh I sort of get this and I think I could copy it into my code,” but really, fully understand it. One test that I have for my understanding is “Could I explain this to somebody else if they asked me about it?” That’s not the only test for understanding (sometimes you just know that you “got” it) but it can be one helpful one.
Max, What are the basics? Now, you would say: shame on you, Alessandro! I agree. Which concepts or books could rebirth a programmer? How a rockstar coder is forged? Thanks, Max! I am waiting for your book!
[…] 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. (Source) […]
[…] 八 8 业界科技 本文是从 The Singular Secret of the Rockstar Programmer […]
[…] The Singular Secret of the Rockstar Programmer […]
[…] 本文是从《The Singular Secret of the Rockstar Programmer》这篇文章翻译而来。译文来自外刊IT评论《编程巨星的唯一秘诀》。 […]
it’s truth ! i like this article
But this article don’t tell us how to understand problem.I think the most important thing is the way to understand problem efficiently.
For starters you should know what _every_ symbol and token you are using in your chosen language actually means in that language.
My favorite example of this is quoting (single and double quotes) in shell scripts. A majority of people writing shell scripts don’t realize that by NOT using quotes, they are invoking word splitting and glob expansion when that isn’t at all the behavior they intended. https://unix.stackexchange.com/q/131766/135943
While there is an advantage in learning how the computer executes your instructions at a low-level, particularly for systems and microcontroller programming, a skill which the best programmers possess more consistently is the ability to abstract the complexities of a problem away and solve the problem at a higher level. Good programmers make things easy for themselves, because when you have to hold a lot of state in your head at once, you make mistakes which lead to bugs. Providing good abstractions also makes your code easier to maintain and expand by others.
As a poster also mentioned, experience matters. I work with the best and brightest in the field (disclaimer: I’m a Software Engineer at Google), and I can’t think of a single person here who has been coding for less than a decade. I’ve been coding myself for 19 years – the majority of my life. There’s no substitute for putting in the time and writing code. Reading books isn’t a substitute for writing code. Reading other people’s code can teach you valuable lessons and give you insights, but they will fade quickly unless you write code using them.
Ultimately, coding is an intuitive process. Mastery comes not from learning rules and patterns from books or others, but from internalizing patterns of thought required to solve a problem to the extent that you can devise most solutions without thinking. After a while, you just know how to do it. It’s the practice of writing real code and solving real problems which gets you there.
The better you understand what you are doing,
the better you will do it.
Enjoy it, understand it better, and to be a Rockstar Programmer!
[…] 来源：The Singular Secret of the Rockstar Programmer […]
Agreed and agreed badly! 🙂 That’s what I have understood programming recent years. Thank you very much to summarize it!
[…] the better you will do it.对所做的事情理解越深，你就会做的越好。——引自 The Singular Secret of the Rockstar Programmer / […]
[…] http://www.codesimplicity.com/post/the-singular-secret-of-the-rockstar-programmer/ […]
[…] the better you will do it. 对所做的事情理解越深，你就会做的越好。 ——引自 The Singular Secret of the Rockstar Programmer / […]
People have half knowledge which is not good and they don’t understand what exactly they are doing and what output they will get. very nicely written post.
[…] как на самом деле работает компьютер. Помните мой «Единственный секрет программиста-рок-звезды»? Вот где суть! Ведь если ты по-настоящему понимаешь, […]
[…] как на самом деле работает компьютер. Помните мой «Единственный секрет программиста-рок-звезды»? Вот где суть! Ведь если ты по-настоящему понимаешь, […]
What are the fundamentals? What should I study? Computer Architecture? Operating Systems? Computer Networking? Algorithms? Data Structures?
That really depends what you’re doing.
(Are you honestly asking the question, though? Or just making a point? It’s hard to tell.)