A month or two ago I wrote a post titled “Every Programmer Should Understand This“. I received a bunch of comments on the post, some of which were from people agreeing with the article and some which thought I should be hung for suggesting such an insane idea! Some of the biggest critics of the article wrote that the problem that I introduced was too specific to a field in computer science and that many great programmers might not understand that particular area and shouldn’t need to.
After contemplating about what the nay-sayers had to say, I have to agree with some of their points. Although the article was targeted for more traditional computer science based programmers, there are many other type of developers out there that don’t nessasarily fit into this category.
With this article, I want to provide a more general list of skills that I believe developers and programmers of any specialization should be well versed in. Most of these skills center around the broader skill of “problem solving”.
As software developers, we do not learn to program, we learn to solve problems. It’s not about which are the top five to memorize how to solve, it’s about building the best toolbox of knowledge and methods so that you can solve ANY problem that comes your way.
With that said here are the 5 most important skills to have as a software programmer/developer/engineer:
1) Practice questioning your assumptions
When you run into a bug and you aren’t sure why it is breaking, you need to be able to take a step back and question all of your assumptions about what is happening and what should be happening. Whenever another programmer asks me to help them find a bug, and they explain, “The code is doing X, then processing Y into Z, but Z has the wrong value.” I will ask them, “Ok, please show me that the code is doing X.” They’ll usually say, “That part is working fine, the bug is somewhere in Y to Z.” I’ll respond, “That’s fine, but something isn’t working and we need to question our base assumptions.”
9 times out of 10, the problem was with X and that’s why the other person couldn’t find it, because they didn’t question their assumptions.
2) Know your data structures and when to use which ones
Higher level languages such as Java or C# are excellent languages to use when practicing this skill. Let’s say you need to store a list of items… whether you use an ArrayList or a LinkedList can dramatically impact the performance of your code. An ArrayList is very fast for accessing arbitrary elements in the list, but it’s very slow for inserting elements into the middle. LinkedLists are vice versa.
Also, did you practice skill #1 and question your assumptions? Is it really a List that you need? Perhaps the elements in the array are guaranteed to be unique, so you really should be using a Set instead of a List. Does it matter what order the items are in? No? Then a HashSet will work just fine, but if you need to keep them in a repeatable, consistent order then you’re going to need to use a TreeSet.
The hardest problem to solve is the one where you don’t know where the problem is! This is the mechanism that helps you do (1) Question Assumptions. Learn your debugging tools that allow you to step through the code, line by line, and watch how your variables are changing so that you can where things go awry. However, sometimes simple logging statements are the way to go for debugging. Perhaps the problem exists in a section of code that is going to run 1000 times, but doesn’t start failing until the 900+ time, you don’t want to step through that many. Or perhaps you aren’t exactly sure why a certain calculation is wrong and being able to print out the results at a 1000 different iterations will help you detect a pattern in the errors which will help you hone in on the problem.
Being able to use the Internet, browse StackOverflow, look up documentation, and find solutions online is definitely one of the single most valuable skills a developer can have. It’s amazing how many people struggle with this aspect of programming and assume they need lots of formal training and book reading before writing a line of code or trying to install something. (This is not to knock formal training, which has its place, but formal training is not something that should ever be a prerequisite to experimentation and self-learning).
You have to take a problem that is too complex to understand in its entirety, extract a common set of elements from it, and represent it a different way. The ability to to perform abstraction is key skill set for any programmer. Examples of this are being able to reduce complex problems into a set of unambiguous procedures, boolean logic; how to turn a real world condition into a set of true and false statements, and good solid algebra. You need to be able to reduce something in the real world which is complex to something simple that you can solve. Math is a very powerful tool for doing that.
To recap, I don’t think there are any problems that can successfully tell you whether you’re a good programmer, but I would say that any problems I would use to identify a good programmer would involve opportunities to judge all five skills above.
I’ve known a fair number of people that are quite familiar with design patterns, complex algorithms, etc., that I would not want anywhere near my code. There is nothing wrong with knowing and understanding these concepts and at some point in your career it will probably be required. However, these are not the fundamental building block of a great developer by any means.
With the skills listed above, an individual would be able to provide an effective solution to almost any problem and that’s what we as software engineers should be able to pride ourselves on.
Thanks for reading, and if you liked this post please subscribe to my blog at JasonRoell.com and leave any comments below! I would love to get everyones views on the most valuable skills for a programmer to have in the industry today!