Programmer Competency Matrix
starling-software.com
starling-software.com
http://news.ycombinator.com/item?id=232192 (indiangeek.net) 75 points 4 years ago 33 comments
http://news.ycombinator.com/item?id=554338 (indiangeek.net) 83 points 3 years ago 33 comments
http://news.ycombinator.com/item?id=1022394 (indiangeek.net) 67 points 2 years ago 40 comments
http://news.ycombinator.com/item?id=1949915 (starling-software.com) 155 points 1 year ago 106 comments
http://news.ycombinator.com/item?id=2823912 (indiangeek.net) 12 points 1 year ago 1 comments
http://news.ycombinator.com/item?id=3434350 (starling-software.com) 2 points 9 months ago 0 comments
Discussions like this can be of value, and no doubt some of the newer people on HN may have points to add. OTOH, many points will already have been made, so seeing the past discussions may be of benefit.
Thanks for the heads-up - much appreciated.
Added in edit: Now fixed - points and comments. Thanks again.
Ah, we have a level 0 on the HN matrix here apparently.
Don't think I'll bother again, I get enough grief and hate-mail just from trying to point people at earlier conversations.
I wonder if a bot could be written to automate this? There are lots of horrible reasons one could have for writing a HN comment bot, so I'm hesitant to even suggest it, but this seems like a really useful/good bot.
So don't let negative comments (perceived or actual) speak for us silent appreciaters!
Some people I know are great at fixing bugs but have narrow language experience. They're damn valuable. Others integrate well into teams and provide great product feedback. Where's that on here?
Experience isn't measured in years but in knowledge gained. You really start seeing it 4-5 years in, some people move forward, some don't.
There are so many holes in this. I feel like whoever wrote this has a strong desire to reduce people to a number. It's not only terrible, it's a great way to fool yourself.
Do not fall into the error of the artisan who boasts of twenty years experience in his craft while in fact he has had only one year of experience — twenty times.
Most probably Trevanian has drawn upon some other source, tough I've never been able to track that.
If you haven't read this fantastic book I strongly recommend it.
It's also impossibly incorrect politically -- so transparently so that I think it's essentially harmless. But if you don't understand why some people would feel that why you really should watch your step.
But the rest… I assume it's a matrix for a reason. Someone isn't a level log(n) programming mage, but he or she might be a level log(n) data structure and algorithm wielder, a level n^2 systems programming apprentice, and a level n requirements gatherer, or some other combination of strengths and weaknesses. It's still a lossy abstraction, but significantly less so taken that way.
I'm ~40 and going back for a CS degree isn't very appealing / practical. But if I knew what things to study... I could start on my own.
I'm advanced in my career, but its been mostly advanced level support and system administration work. I want to get into programming.
I say all that to make the point that a degree track isn't the best fit for me.
The side projects don't even have to lead anywhere, but they get you to the point where you can say "ya, I can write a node.js server" and then you can do it on the job, and a few years later you're an expert.
This is definitely not the only way to acquire skills. I'm sure some people dig through books, or just focus on doing their job and still grow. But for me, side projects have always been the driving force.
You can also always program on the side if you want to maintain the stability of an established career.
Everyone in the programming world knows programmers (often intelligent, educated, and experienced ones) get caught up in silly details of perfecting their code and are completely unproductive without an experienced manager (or tutor) guiding them. I can't help but laugh when a bushy tailed non-programmer steps in, and produces something quickly and effectively using seemly simple tools.
I can't help thinking when I read these lists, though, that they probably favor the author's particular skill-set and experience. Maybe not necessarily the author's current state, but perhaps where they'd like to go or what skills they aspire to have.
Since I'm not a programmer (I'm a chemical engineer), I don't instantly know all of the orders of various algorithms (which according to this article makes me "incompetent"). But you can bet that when it comes to implementing something, I'll research and figure out the most efficient algorithm available and use it.
I'm not sure being good at programming has much to do with having a whole bunch of CS knowledge; rather, it's being able to figure out what knowledge you need to know -- when you need to know it.
professional coding is about something different
And I don't know where this "random info on the internet" came from. My knowledge comes from algorithm textbooks or papers from university websites.
Why the vitriol?
you can ALWAYS achieve your target in a better way
What I often tend to find valuable is not so much knowing what I need to know (although that's good too), but knowing what's possible. For example, there's really little need for me to be able to rattle off the code for a splay tree off the top of my head, but knowing its characteristics (and those of other data structures) is very useful - it allows me to match potential solutions to problems. All I then need to do is read up a bit more on the specific solution I have in mind.
I've found that this approach stops me reinventing the wheel too much, although it has also given me a slightly depressed view on many innovations within the computing world :-).
Level 0: Saw the post title and didn't think he needed to look at it because he was so confident in his abilities already.
Level 1: Read the post, noticed a lot that he didn't know but didn't intend to do anything about it.
Level 2: Read the post and went out and learned everything in it that he didn't know.
Level 3: Read the post, figured out which things from it he didn't know but might need to or want to, and learned those.
Oh, and a special level -1: Read the post, noticed a lot of things that he didn't know, and decided the post was stupid because clearly he's an amazing programmer and the post didn't agree with that self-assessment.
Is there a level for "Skimmed the first part of the post and then went back to working on his/her startup" ?
Meh.
Professionally, I've never set up version control. It's there when I start the job, it'll be there when I leave. I've branched and merged but a lot of times this is handled by a build manager. Build automation I have never expressly done - a shop that needs continuous integration is typically one where it is already set up.
Seriously, unless the job is 'Build Manager' then the question should be just used to gauge what you might have to teach them. 'Have you used source/version control software? Which ones?' 'Do you have experience with build automation tools?'.
I'm not sure how they couldn't be. True, they are not a part of computer science, but both are very helpful to be able to build software efficiently (i.e. software engineering). The places I've worked tend to not have build managers (and the one time there was one, the person wasn't technical and needed 'help' from engineering, to have sane policies and organization). Both skills are also important if you want to launch something -- either a personal project (open source or otherwise), or on a small team at a startup.
It's not hard to start a Git repo you know, it's something you can pick up in under a day.
Let me get this straight, you do not know how to set up version control, therefore knowing how to set up version control is useless?
What I said:
Professionally, I've never set up version control.
I also never said it was useless. In fact, I use it at work AND at home on my own projects religiously.
However, I don't feel a need to ask about it in an interview. If you haven't used one you will be soon and if you know how to manage one it's just gravy. I might not even ask it's so inconsequential. Continuous integration is the same.
And no matter how you spin it, it's not software engineering. Not in the ballpark, not even the same game.
As far as I'm concerned, this table is purely for working out a programmer's education, not competency. Experience and passion are the only ways I chose to judge my colleagues.
- can the candidate do the job? (github projects, portfolio, hands-on test)
- when they talk, do you understand?
- when you talk do they understand?
- do they sit all day and read HN / Stackoverflow?
- on the other hand, they never heard of the above
- do they get the job done or try to make it perfect?
- do they fit the culture of the company
- can they learn a new skill quickly
give 1 point for each of the above and you got a much better matrix (if you want to hire people you won't need to fire)
Attitude section?
For example, on attitude: Learning to be patient. Patient with planning the right solution, selecting the right libraries, fixing bugs, dealing with other developers who may not be as experienced as you, etc. I think patience is an overlooked "programmer's virtue."
Maybe what you mean is that impatience is more of an accepted thing among programmers? I can get behind that.
And to make matters worse, those features tend to be baked into the system such that you can't disable them.
Impatience is no virtue.
Excuse me but did you just present attitude, communication and other soft-skills as an absolute bare minimum and a total given that pretty much anyone "existing-in-modern-society-as-a-human-being" would live up to anyway? Where is this dream world and how do I get there?
Need I remind you of examples like geeks practically sexually harassing girls at conferences in this day and age? Or the insane amount of social-anxiety / communications / soft-skills related cries for self-help all over the net? We are FAR from any of this being a standard.
I didn't pursue being a professional developer so I've lost most of these things, but I remember having worked on almost all of these things (such as they were at the time). Some of these things I haven't heard mentioned since my undergrad!
Interestingly, we never studied functional languages, but did cover Prolog. This has definitely created a deficit in my thinking and consideration about certain problems/languages. If that's any indication this matrix can give insight into the abilities of people who simply haven't covered certain topics.
If programmers spent half the time they spent evaluating others on being better programmers we wouldn't have any problems.
Alternatively, if I were in a rush to learn a specific item, the tree would give me a roadmap for getting there.
I'd be interested in a wiki-like interface for building such knowledge graphs, so that they could be built quickly and completely.
Wait, I just finished code complete, and it told me that you specifically _don't_ check all arguments throughout your program. Instead, you choose a list of classes at that will check arguments for input as a firewall, and assume all classes behind those logically will receive the correct, sanitized input.
Did I misunderstand this?
Let's distinguish "checking" invariants, preconditions, and postconditions from blithely propagating logic errors as error codes all the way up the stack. If you're programming in "paranoid mode", as it were, and you detect inconsistent state, you should abort the program. If you don't, you're in uncharted territory and you have no idea how your program will act. If you abort the program and restart the system, you'll probably end up back in a useful state.
Many, many times, I've seen code like the following:
HRESULT hr;
hr = DoComplexThing();
if (FAILED(hr)) { RaiseFailFastException (...); }
Say someone passes a NULL pointer to a function somewhere deep inside DoComplexThing's implementation that doesn't expect NULL. If this function helpfully "checks" all parameters, detects the NULL, and returns E_POINTER, E_POINTER will probably propagate all the way up the stack to the top level, where we'll abort the program. Now you have a crash report, but you have no idea where the problem actually _is_.If this function had instead not checked the NULL pointer and crashed or explicitly asserted its preconditions instead of treating contract violation as a runtime error, the problem would be a lot easier to diagnose.
In general, you can separate problems into two classes: logic errors and runtime errors. Logic errors are indications of the program being written incorrectly. Your program should blow up when it detects one. Runtime errors are errors that could conceivable occur at runtime due to reasons outside the program's control (e.g., removing an SD card). Only runtime errors should be propagated using your error reporting mechanism of choice.
It's kind of generous in its rating for advance though. May be there should be a level for expert. But good work.
Sounds pretty accurate. :)
I love how they non-chalantly squeezed "automated testing" in there... because to really do well in that area you need so much more than the average handful of junit-or-whathaveyou tests and the whole "comes up with good test cases" is just extremely shallow. While developers do well to implement some simple unit tests, automated testing includes SO MUCH more they just left out. It is a whole software project and includes a lot more people than just "programmers" and "testers".
Another personal pet-peeve of mine are those endless suggestions of how to pick and hire developers, how can you get the very best of the best for the likely average salary you are offering to begin with - yet we have a continuous stream of coding-related horror stories.
It doesn't take any magic, it doesn't even take a catalog of weird questions that might work for google. Ideally go with recommendations, people who know people that are good. Or pick the interesting CVs and cover letters, avoid the buzzword rally. Then interview them and talk about what they have done so far and go into some details there, scratch on the surface, get a feeling for what they got going on. By now you should have quite a good idea. Then hire them on a temporary contract and see how they do. Be ready to give the new-comers and graduates a chance and be ready to invest in them, both in trainings and compensation.
IF you are in a position where you just cannot afford to put good faith in a common sense choice for a candidate then you should not be hiring in the first place because that means you either don't have the money for one more hungry mouth anyway or your project is so far into the death-march that another pair of hands is not going to rescue the sinking ship even if you get a true kernel-hacker to work on it.