«    »

The Core Skills All Software Developers Need

Software development spans a wide gamut of technologies (e.g. C, Java, and Ruby) and environments (e.g. embedded, desktop, enterprise, web, computing infrastructure, and scientific). Despite all the variation, I believe there are core software development skills that you must possess in order to be an effective developer across most, if not all, of these different scenarios.

More specifically, I believe that your level of ability as a software developer is in large part determined by your mastery of these core skills. Intermediate-level developers should have used all of these core skills and be competent in most of them. More junior developers will likely have gaps where they lack familiarity with some of these core skills and need to increase their competency with the others. Senior developers should have achieved mastery of most of these skills, be competent in using the remainder, and should be able to coach less experienced developers in the use of these core skills.

These core skills can be used both as an evaluation tool and as a professional development guide. Obviously these skills should be assessed in job interviews, but I also find it beneficial to assess developers joining the team, especially the more junior, and assign tasks and provide training opportunities based on this assessment.

The core skills needed by all software developers are:

Core Skill Description
Read Code The ability to understand an existing code base in order to analyze its behavior and make fixes or enhancements to it.
Write Code This does not include any significant amount of design – just the basics of coding. An example is being able to write a method given the desired behavior (inputs, outputs, pre-conditions and post-conditions).
Design Software The ability to determine what code is necessary to achieve some specified functionality, particularly the higher-level structure or organization of the code.
Awareness of the Software Development Life Cycle This is an awareness of the 'big picture' of software development beyond just writing code - how the other life cycle stages (requirements, design, testing, and maintenance) impact coding and vice-versa. This includes an understanding of the types of methodologies (e.g. Agile or Waterfall) that can be used to progress through this cycle.
Use of Libraries and Frameworks This skill could also be called "Reuse Existing Code". This skill includes the ability to search for and evaluate libraries and frameworks based on how effectively they meet your needs and the ability to integrate the chosen package into the software you are writing.
Debugging The ability to analyze the behavior of code to diagnose a problem and find the underlying cause. This includes but is not limited to using a debugger.
Use of Integrated Development Environments The ability to effectively use modern IDEs and an understanding of their strengths and weaknesses.
Use of Version Control This skill includes basic use of a version control tool as well as a general understanding of software configuration management.
Automated Unit Testing This is the ability to unit test code by writing automated tests.
Refactoring The ability to revise existing code without impacting its functional behavior.
Use of Build Automation This goes beyond simply writing a build script to include other related automation like continuous integration, automated deployments, and static code analysis tools.

I have deliberately excluded skills that are not specifically about software development. Some of these general skills are very important to software developers (as well as other professions) and are necessary in order to excel as a developer. Examples of such skills include the ability to communicate verbally and in writing, the ability to work well with others in a team setting, self-discipline, and personal organization.

I expect this list to be contentious. I may have missed a few skills you feel are core or may have included skills that you feel do not belong. Let me know via a comment below what skills you feel should or should not be core.

Update: I revised the description of the skill "Debugging" based on Jacob's comment below.

If you find this article helpful, please make a donation.

21 Comments on “The Core Skills All Software Developers Need”

  1. Jacob says:

    The only thing I would disagree with is that I think the skill of debugging (which is certainly core) need not have anything to do with using a debugger. Debugging is the skill of quickly searching out and fixing bugs — the most important part of that skill is being able to rapidly isolate (based on the context and the bug description) what component is causing the bug. The debugger can be a useful tool but a senior developer should not be dependent on it. Just my opinion of course.

    I’d also make a broader argument that in many cases what makes a senior developer is not skill but habit — sure, it’s important to know how to write unit tests, but it’s far more important to _actually do it_, for every unit that makes sense to test. Similarly, refactoring is not simply an ability but a habit; the tendency to always leave code better than you found it. You can’t have (and shouldn’t have) the habit without the ability, but the ability by itself doesn’t help much.

  2. Great points, Jacob. I’m going to change the definition of debugging in my article as a result. I particularly like your point about habit being key, although I prefer the term disciplined.

  3. Danny says:

    Excellent comments Basil Vandegriend. I’m a Computer Science student in my 2nd year and I found your comments very useful.

  4. YongYong says:

    This is Brilliant!
    I am from Electronics Engineering and doing a Final Year Project on the Computer Engineering.
    The lack of many skills mentioned made my progress very very slow.

    Thanks a lot.

  5. Post over a year old and I’m still finding it the best point to start self-assessment. I’m quite experienced programmer and found it extremely difficult to evaluate myself as software developer. Your post made me aware of my weaknesses and strengths. I can’t wait to share the link with my team. Man, I wish I knew this all 5 years ago! Many Thanks.

  6. Hi Wojciech. I’m really happy you found this useful and I appreciate the kind words. Best of luck in applying this.

  7. Jim says:

    Technical skills are important in the software development industry. I think the desire to constantly learn is even more important. I wrote a post about it on my own blog after read this post and a few others. For all that are interested: http://www.theblogaholic.com/2011/01/22/most-important-software-development-skills/

  8. younis says:

    Very good article indeed and a very nice comment by Mr. Jacob, and mr. Jim

    Hats off

  9. Parthi says:

    I am having all those skills(I am B.E Computer Science Graduate)but not in good job, still I am lacking.

  10. krisinte guido says:

    Found your article the most helpful one of the 20 I reviewed. I do not have a technical background, but needed to help a client with a job description for software developers. Your article was great for that purpose. Thank you. I also quoted your website as the source on what I provided to my client.

  11. Krishan says:

    Very clearly mentioned basil. I am a software developer and have started working since few months only.
    I knew just coding wont be enough and to excel as a software engineer you need to be good in everything related to software develepement.
    Most of the stuffs mentioned are helpful. Understanding old code is kinda boring though and working with tools like ut automation tools, new compilers and searching for existing library functions always play with my patience.
    But these things need to be improved. Thnx a lot!

  12. Habib says:

    Very helpful. I think you have covered the core.
    I was self-assessing my skills as developer and your article allowed me to pinpoint improvement area

    thanks

  13. alex says:

    Isn’t having strong math skills a strong requirement?

  14. @alex, it helps but I wouldn’t call it a requirement. Strong analytical / logical thinking abilities are more important.

  15. disha says:

    My logical skills are good but my analytical thinking isnt that great … so is it ok for me to pursue a career in software development? Please help.

  16. @Disha, if it is something that really interests you then give it a try. Analytical thinking skills will improve with experience.

  17. Ebenezer says:

    Excellent post. you really cleared my doubts. i am a third year student in computer science and Engineering. Will be chosen my stream from next academic session. This has really helped me now my strengths and weaknesses when it comes to software development.

  18. Riyaz shaikh says:

    nice 1 for those who just begin to study of software developement

  19. Anzen says:

    Thanks. A good summation.

  20. arti sinha says:

    hello i m a student of computer sciences its my 3rd year.ur post helped me but still i m a little confused that from where should i start learning to be a good programmer.plz take me out of this confusion.

  21. Arti, I would suggest reading the book Pragmatic Programmer by Dave Thomas and Andy Hunt as a good place to start.

«    »