John Sonmez is a Pluralsight author of over 25 courses spanning a wide range of topics from mobile development to IoC containers. He is a frequent guest on podcasts such as DotNetRocks and Hanselminutes. John has created applications for iOS, Android and Windows Phone 7 using native tools, HTML5, and just about every cross platform solution available today. He has a passion for Agile development and is engaged in a personal crusade to make the complex simple. John is a DZone MVB and is not an employee of DZone and has posted 88 posts at DZone. You can read more from them at their website. View Full User Profile

The 4 Most Important Skills for a Software Developer

  • submit to reddit
With the vast array of technology, language and platform choices available today, it can be very difficult to figure out where to best invest time in training your skills as a software developer.

I’m often asked advice on how to be a better programmer.

Most often the question someone asks is based on whether or not they should invest their time in a particular programming language or technology versus another.

I’ve been giving this quite a bit of thought lately and I’ve come up with what I think are the most important and timeless skills that a software developer can attain which will give them the best career opportunities and make them the most effective.

Skill 1: Solving Problems


I’ve talked about the need to learn how to solve problems before and I’ve even given some steps of how to learn to solve problems, because I believe this skill is critical to any software developer.

Software development is 100% about solving problems.

Without problems there wouldn’t be a need for software.

All software is designed to solve some user problem and within that general solution is a wide array of smaller problems that make it up.

It really doesn’t matter what programming language or technology you use, if you can’t solve problems, you won’t be very good at developing software.

It is amazing how bad most developers are at solving problems.

I constantly hear complaints about job interviews that are too hard because they ask the developer to solve some difficult problem.

I’ve talked about why hard interviews are good and part of the reason is because they test a developer’s ability to solve problems.

I know that many developers still disagree with me about this point and don’t see why a site like TopCoder would improve their development skills so much, but I know from personal experience that it was the practice of solving problems on TopCoder that was the turning point in my career.

Think about a carpenter.  If you want be a successful carpenter, you should probably be good at cutting wood.  You should probably have practiced doing all kinds of cuts and using many different tools to cut wood.

It doesn’t matter how many years experience in carpentry you have had or how well you can design furniture or cabinetry if every time you try to cut wood you struggle with making the cuts.

Cutting wood is a base skill of carpentry, just like problem solving is the base skill of software development.

Skill 2: Teaching Yourself


There is probably no more important skill in life than learning to learn.

This skill is especially important in software development, because no field I know of changes more rapidly than software development.

You can’t know everything about everything.  You can’t even really invest the time it takes to be a master of one particular framework or technology—things are moving way too fast!

Instead you need the ability to quickly acquire the knowledge you need for the task at hand.

If you truly want to have a skill that will propel you through your software development career, learn how to teach yourself.

The only way to develop this skill is to put it into use.  Go out and learn a new programming language or technology, even if you think you’ll never use it.  You’ll be surprised how quickly you may be able to pick it up because of the foundation you will already have in what you know.

If you can quickly adapt to the rapidly changing software development market and technologies and platforms associated with it, you will have skills that will always be in demand.

Although I am a bit skeptical of some of Tim Ferris’s claims, he has an excellent book called the 4-Hour Chef which has some great techniques about how to learn things rapidly.  (I was wanting to write a book about this very subject.)

Skill 3: Naming


When people ask me what I do all day, I mostly say “read things other people name and name things.”

Ok, no one really asks me that and I wouldn’t really answer it that way, but I certainly could.

Software development is all about describing the metaphysical.  Most of what we are building can’t be seen. 

We have to construct in our minds an entire world with authorization managers taking authorization requests and spitting out authorization response alongside user repositories using user factories to assemble new users.

Every time you are writing code you are naming things.  When you read code that you or someone else has written, you are gaining most of your understanding about that code from the names of things in that code.

Most of the time I can accurately predict a developer’s skill level by looking at how they have named methods, variables and classes in code they have written.

A developer who lacks the ability to give good names to concepts and data in their code is like a mute translator.  It doesn’t matter if you can understand something, if you can’t adequately explain it, the moment it leaves your head it is gone.

The best way to improve this skill is to always put it into practice.  I’ll often rename things in code I am just reading to get an understanding.  As I start to understand what a method is doing, I’ll change the name to match that understanding.  I’ll do this while I am reading the code, not even making any logic changes to it.

The more you focus on giving good names to things, the better at it you will become.

This is also the most visible thing about your code.  It is hard to know if your code is correct or efficient by looking at it, but if I read it and can understand it, I am going to assume you know what you are doing.

Skill 4: Dealing with People


I list this as last, but in many cases you could say it is the first or most important skill.

Everywhere you go there are people.

Unless you work alone and develop software just for yourself, other people are going to influence your career as a software developer.

I’ve talked about why you might not want to criticize someone else before, but there is much more to dealing with people than not pissing them off.

I always go back to the famous book by Dale Carnegie, “How to Win Friends and Influence People,” because this book is so important in learning how to be a successful human being.

I’ve said it before, but if you want to develop people skills, read this book!

The basic problem is that humans are not logical creatures, we are emotional ones.  Sure, we like to pride ourselves on our ability to reason, but the reality is that most decisions we make are more influenced by emotion than reason.

What this means for you as a software developer is that unless you can effectively deal with other developers, managers, and even customers, you will constantly face trouble despite how good your ideas are or how valuable your skills are.

Being active and involved in the software development community in general can also help you immensely in your career.  It is not just about networking, but getting your name out there and building good Karma.

Doing this successfully hinges directly on your ability to deal with people.  (Want to take a big shortcut in learning how to deal with people?  It’s simple.  Be nice!)

What about practical skills?

Notice I didn’t include anything in my list about a particular technology or even as broad a skill as web development or mobile development?

It is certainly important to have a solid foundation in a couple of technology areas, but what those areas are is not nearly as important as the 4 skills I mention above.

If you can solve problems, learn things quickly, name things well and deal with people, you will have a much greater level of success in the long run than you will in specializing in any particular technology.

With that said, of course it is important to thoroughly learn a programming language or two and to have a general area of specialization, but as long as you don’t go too far off the beaten path with those choices and you focus on these 4 important skills, you will be ok.  (You could even learn C++Winking smile)

Published at DZone with permission of John Sonmez, author and DZone MVB. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)


Stephane Vaucher replied on Mon, 2012/12/10 - 11:01am

Good write-up. I cannot stress the importance of understanding the problems you are trying to solve (their nature and their complexity). How do you map a problem to an acceptable solution (this is described in several points above)? For example, I analyze lots of graphs representing relationships between business concepts, so I need to translate business questions to things like intelligent traversals (e.g., avoiding NP-hard problems). This implies learning the business terms and managing expectations (learning to say: we cannot do that, or sorry, we need to use an approximation).

Paul Kofon replied on Mon, 2012/12/10 - 6:53pm

 +1 for "Skill 3: Naming". I always strive to produce clean, self-documenting code so I spend a considerable amount of time naming and renaming stuff. Sometimes it feels like it is way too much time but it's time well spent in my opinion. The benefits are immense especially in a non-trivial project.

Ewald Horn replied on Wed, 2012/12/12 - 2:39am

Great article, I couldn't agree more : These are critical skills for any developer to move beyond the very junior level, especially the Dealing with People skill.

Gabriela González replied on Wed, 2012/12/12 - 6:52am

Great list!

I'm just starting at software development, but I think you are completely right. Those abilities are the basis of our work (or should be). 

Ewald Horn replied on Wed, 2012/12/12 - 7:11am in response to: Gabriela González

 Fantastic! Being aware of these skills from the start will give an advantage. It's highly competitive industry, and everything you can do better than the average developer counts in your favour. Best wishes forward with your career.

Tanya Ruttenberg replied on Wed, 2012/12/12 - 7:37am in response to: Paul Kofon

I'm with you on this one! I had a co-worker who had a real knack for naming things and it was apparent how much this skill added to the projects we worked on.

Overall very good article.

Mike Klaene replied on Wed, 2012/12/12 - 8:12am

 Problem solving is important but you also need to ability to analyze things and <b> see </b> the problem. The company where I applied for my first programming job in 1969 ( I AM that old ) required all applicants to take the "IBM Programmer's Aptitude Test". I must have done well on it as they hired me even though I was lacking a degree at that time.

People skills are a must. How many techno-nerds have you come across who say that they do not like working with the users? If you do not get with the users then all of the information that you get is second or third hand.

One criteria that is not listed is the you must <b> ENJOY </b> this type of work. If it is not fun then getting up and going to work is a chore - plus you will never be good at it.

There is a difference between someone who just wants to code and is a good programmer and someone who has good analytical skills in addition to being a good coder. The later is well suited to be the Analyst-Programmer.

Kuni Katsuya replied on Wed, 2012/12/12 - 8:27am

superb short list of the truly important fundamental skills to strive to master as a software engineer. actually, slightly generified, these skills are core to self-improvement in any job function, in any business sector: 

    1. problem (analysis/diagnosis &) solving
    2. continuous learning
    3. written communication
    4. interpersonal soft skills

anyone that completed an undergrad engineering or comp sci degree with even mediocre grades--like me!--can easily learn the specific technical skills, be it a programming language, design methodology, framework, etc.

however, these non-technical skills seem to escape many. most people, myself included, don't seem to even realize their importance until several years into their careers. (some never do)

and the more i learn, the more i realize i don't know...

non-continuous learning is like closing your eyes and pretending nothing else exists


Robert Casey replied on Wed, 2012/12/12 - 11:59am

Great article.  The one thing that struck me as backwards, though, was your analogy about the carpenter.  I think your point on problem solving would be illustrated better by turning it around.

Knowing programming languages, IDEs, and even concepts of software development is very much like learning to cut wood.  There are so many different ways you can cut wood, and so many different tools to do it.  But that's not what makes a good carpenter.

A good carpenter demonstrates excellent problem solving skills.  When we see a kitchen cabinet, or a desk with drawers, what the carpenter sees are wood thickness, direction of grain, dimensions of sides, joints on corners, beveled edges, squareness of cut, trueness of lumber, gap tolerances, and so forth.  All of this must be planned and designed to exacting specifications before the first cut is made.  Yes, the technique in making miter cuts requires know-how with the tools, but the real carpentry is knowing where to make the cut and how it fits to the overall picture.  Everything has to come together to form a coherent, and aesthetically pleasing, whole.

One thing that occurs to me in how software is different from carpentry in this vein:  for software, we can afford to cut once and measure twice...for carpentry, you must do this in just the opposite order.  In this light, software developers have the luxury of being able to test ideas and theories and see them fail in order to arrive at the right result.  This can be an effective form of exploratory problem solving.

Martin Feuchtwanger replied on Wed, 2012/12/12 - 1:27pm

Thank you for this article -- it's reaffirmed my sense of self-worth!

I have just two questions:

  1. How can we get the hiring managers and their HR gate-keepers to recognize the truth of what you write and hence tone down the requirements for N years of experience in technologies X, Y and Z?
  2. What is this article doing in a Java zone? I almost didn't see it!

Subodh Ray replied on Thu, 2012/12/13 - 4:52am

 Thanks for such a good article, keep posting.

Willie Wheeler replied on Thu, 2012/12/13 - 10:40pm

I really enjoyed this. The "Calling Someone's Baby Ugly" link is very good too.

Bruno Mendes replied on Mon, 2012/12/17 - 8:20pm in response to: Robert Casey

Very good analogy. I totally agree with you: we have a set of tools to use when the time come to cut the wood, but picking the right one and having the necessary knowledge to use it is useless, unless you know exactly where and how this piece will fit in the overall picture.

Tony Spence replied on Wed, 2012/12/19 - 2:34pm in response to: Mike Klaene

 Ah the good old days (yes, I'm that old too). I'd hazzard that people skills are more important than any specific technical skills. Over the years I've built a lot of teams and whilst it is possible to train anyone with the basic aptitude the asocial nerd, no matter how technically competent, is a liability to the team.

Valentin Maier replied on Fri, 2012/12/21 - 3:02pm

 Excellent article!

I already bought Dale Carnegie's book!

Noe Samuhel replied on Fri, 2012/12/28 - 5:00pm

It's important to learn a particular programming language, from my part, it's like playing a game - if the character has too many different skills, he won't be able to defeat a powerful enemy, because he doesn't have experience is any of them. As for me, my "skill" turned out to be technical writing. I'm trying to be as good as I can in my particular field.

Kelby Zorgdrager replied on Sun, 2012/12/30 - 9:32pm

 The best developers are the ones that are willing to learn and grow their own skill sets. You don't need to know everything about everything but having a grasp of the basics is a good start. You'll never know what information might come in handy.

Jaffa Wify replied on Mon, 2013/08/05 - 7:37am

This is because working with software is inherently virtual, as there are no moving parts, and all that is required to engineer a software application is contained on an engineer's computer. This means that the software engineer may perform multiple tasks that the non software engineer cannot afford due to the physical nature of other types of engineering.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.