is someone JustaStudent
programmers glom onto (apprentice to) in order to learn deep programming.
Think of JediProgrammer?
obviously refers to someone who has achieved mastery of all aspects of software development. Here are some characteristics:
- Excellent understanding of how computer hardware and operating systems work.
- The ability to develop and debug software at all levels from assembly to very high-level languages.
- The ability to rapidly learn new languages or tools, facilitated by a good understanding of programming in general.
- The knowledge of the benefits and disadvantages of various development platforms and languages and an ability to pick the right tool or tools for the job.
- Uses solid software design principles such as iterative development, constant refactoring, etc. such as those embodied in XP.
- When given a base of code written with poor design principles, the MasterProgrammer will immediately wish to re-write it, and then figure out the best way to get from here to there given any existing time or other constraints.
- A good feel for smelly code and a compulsive need to figure out exactly what smells and to fix it. (If there is enough time, a master will fix anything which is unnecessarily complicated to use before he would deign to actually use the horrible code.)
- The ability to write programs in such a way that everything works the way you would expect; bugs are easy to track down; features are easy to add; every function is very simple; the code has very few comments, yet is fully documented. The master makes sure his design is the SimplestThingThatCouldPossiblyWork. It's not overly abstract and hard to follow, as tends to happen with people who are overly taken with UML or other BigDesignUpFront. But it's not lacking abstraction either. It's just enough to make sure everything is done OnceAndOnlyOnce.
- If under time pressure, a master has the ability to come very close to #8, given the time constraints, all the time realizing that the "just hack it in" mentality will quickly escalate in such a way as to erase any desired time gains from same. Also, as soon as the time pressure is over, the master's first priority will be to go back and do things correctly wherever they were not.
- A master believes that she/he is the best programmer in the world. They hate the way you program, unless of course you too are a master. (Some masters reject CodeUnitTestFirst believing their code is so simple that nothing could not work; therefore there is nothing to test!) Strangely, master programmers can produce good software without using a strict methodology. (Unfortunately, many master programmers do not work well with other non-master programmers.)
In my limited experience, master programmers don't believe they're the best programmer in the world. Paul Graham agrees in http://paulgraham.com/gh.html
Because you can't tell a great hacker except by working with him, hackers themselves can't tell how good they are. This is true to a degree in most fields. I've found that people who are great at something are not so much convinced of their own greatness as mystified at why everyone else seems so incompetent. The people I've met who do great work rarely think that they're doing great work. They generally feel that they're stupid and lazy, that their brain only works properly one day out of ten, and that it's only a matter of time until they're found out.
[Clearly this describes some, but more fundamentally Graham is talking about an aspect of QualityWithoutaName
, and so is understandably fishing around for the right words - not making the ultimate definitive statement on the subject, but rather pointing in the general direction of what he means.]
: I was going to put the following (unsigned) directly under the list, until I noticed and paid attention to the PaulGraham
Actually, I think most "masters" think they're nothing special; they're just continually disappointed by the horde of BadProgrammers that (in their world-view) surround them everywhere they go. (I know I have that attitude.) Or maybe this difference in attitude has something to do with the distinction between a MasterProgrammer and a GrandMasterProgrammer? (Although I don't feel so comfortable concluding that I should label myself as a GMP as a result!)
Personally, I would say 1,3,4,5,6,7 and 8 definitely apply to me (*especially* 6 and 7). I'm not up to the standard I'd like to achieve on 2 and 9, and 10 doesn't describe me at all (instead, the PaulGraham
quote, and my expression thereof apply). I also haven't applied 1 and 3 to the extent that I'd like to have done.
I am going to express a controversial opinion: I used to think that I was a master programmer. (I guess I felt this way because of the money I was earning and the respect with which my workplace treated me - I know, I know, not good indicators of ability .. nonetheless, it influenced my idea of my own worth.) Then I was exposed to Common Lisp. A most mind-blowing experience. Such style, grace and depth in language design and use. I felt like a intellectual dwarf strolling among giants. CLOS, the MOP, and even rarely used libraries such as SCREAMER were revelations to me. My personal feeling is that if you consider yourself a good programmer (considered as a narrow classification - not domain expertise, or knowing how to handle customers), you should have two skills under your belt: (1) A good working knowledge of mathematics; (2) An understanding of entire Common Lisp language.
Personally, I am nowhere near to accomplishing these goals; I can only consider myself as a "not a BadProgrammer
As the AnonymousCoward
who wrote this list many years ago, I would just like to point out that large portions of #10 are at least half-joking. Except that I do occastionally believe I'm the best programmer in the world. Ok, and I do hate your code. Well, and I can remarkably produce good code without a strict methodology. Well, I did say half-joking.
Much sympathy for the point above about my brain only working properly one day out of ten and that I'm lazy (certainly not stupid!) and that I always feel like I will soon be found out... But then that one day comes along and I get like three weeks worth of work done in a 30 hour push and I realize once again what a GrandMasterProgrammer
I really am. :P
See also: GrandMasterProgrammer