Skills for Programmers

Skills and Passion

Over the past couple of weeks, I have been writing about software careers, including career values and characteristics of a good programming job. This week: types of skills used in a programming job.

Soft Skills

No discussion of programming skills would be complete without addressing how non-technical skills contribute to software career success. So I’m going to put it right up front: soft skills are important. Programmers need to be able to communicate with people, work effectively in a team, and market themselves to employers and managers.

But I don’t find, as some people claim, that soft skills should be emphasized more in discussions of programmer skills. In fact, I think coding skills are often underrated, perhaps in an attempt to over-correct what is seen as the obvious path to software career improvement (improve your technical skills).

One reason that some people emphasize soft skills has to do with the definition of success they’re using. In my “Coding as Underrated” post, I quote three famous commentators arguing for an emphasis on non-technical skills:

  • Jeff Atwood questions whether you have “really accomplished anything” if your code doesn’t ship or is otherwise ignored.
  • Steve McConnell reports on survey results showing that projects rarely fail for technical reasons.
  • Dale Carnegie claims that only “15 percent of one’s financial success is due to one’s technical knowledge.”

These are all good points. If your job is to write software products or services for a business, you want them to be used, not sit on the metaphorical shelf. If you are the person responsible for a project’s success, it’s important to know what aspects of the project are most likely to derail it. And if you’re trying to increase your income, you may want to consider jobs that involve less coding than you’re currently doing.

But if your goal is to be a hands-on programmer and technical expert, and your social skills are close enough to the middle of the bell curve, I submit that it’s not a terrible idea to focus your self-improvement time on learning another programming language or brushing up on computer science fundamentals. Someone on your team needs to make sure that you’re building the right features and shipping at the right time, but it doesn’t have to be you. If there’s already a competent person taking care of those things, go ahead and dig into the technical issues if that’s what you’re interested in.

And if you do want a review of soft skills for programmers, John Sonmez wrote a book on the subject.

Algorithmic Problem Solving

I write a lot about the benefits of programming puzzle practice, so I won’t belabor that point here. In summary:

  • Software development is about solving problems with code.
  • Programming puzzles bypass the difficulties associated with configuring specific platforms and technologies, allowing you to focus on pure problem-solving and coding.
  • Puzzles are an efficient way to develop coding fluency, a practical skill that allows you to focus on the core of a programming problem rather than how to express the solution in a programming language.

For more on the benefits of this type of practice, see The Puzzle Approach to Coding Mastery.

Computer Science Fundamentals

Companies that hire programmers often have no formal requirement that candidates begin their career the traditional way, with a Computer Science degree. But there are some topics that you’re less likely to encounter without that background. For example, non-CS majors may not have taken classes on compilers, database theory, computer networks, theory of computation, or computer architecture. While a programmer may not use these topics directly on the job, they provide background knowledge and a way of thinking about software problems. For example, knowing the theory of relational databases can help you understand the techniques required for tuning slow SQL queries.

Once you get beyond the basics that all CS undergraduates learn, it’s not as easy to make use of more CS knowledge. As you get more education in a field, what you learn becomes more specialized. For example, if you do original research for a PhD, you’ll need a more specialized job to make good use of it. When you’re looking for a job in your specialty, you’ll have fewer options to choose from compared to someone looking for a general programming job. On the other hand, if you do manage to find such a specialized job, it can be very rewarding. You’ll be able to work in an area that you have specifically prepared for, and you’ll have a better chance of developing new technology rather than just using someone else’s.

Programming in the Large

Writing software professionally usually means working as part of a team on a system that is divided into a set of modules owned by multiple developers. Software engineering researchers call this “programming in the large.” This type of programming requires different skills compared to solving a programming puzzle or writing a small app.

Given the ubiquity of software in scientific work, it’s common for technical people in other fields to find themselves writing code to solve problems. In Software Development Skills for Data Scientists, Trey Causey identifies a number of skills that such accidental programmers need if they find themselves on a traditional software development team:

  • Writing modular and reusable code that can be maintained over time.
  • Documenting their work and writing useful code comments.
  • Using version control.
  • Testing.
  • Logging.
  • Providing and receiving code reviews.

In addition to the soft skills required for contributing to a group project, professional programmers need to have specialized skills for working on a large system. This is in addition to the challenge of remembering where all of the code is.

Knowledge of a Specific Technology

Even the simplest program needs to be written in some language. And if you want to actually run that program, you need computer hardware and an operating system. Professional programmers have to learn even more specific technologies, and keep up with new ones as they arrive. Or they could take the risk of focusing on a long-lived technology like COBOL or Java that always seems to be in demand.

The point is that general programming skills like the ability to solve problems are only practical if you apply them to a specific task. And if you’re going to build software for people to use, you need to pick specific technologies to learn. With luck, those technologies will still be required when you start your next project, so you can get a long-term return on that learning investment.

General Skills and Habits

General skills like organization, persistence, and focus are sometimes categorized with other soft skills. But for programmers, I think it’s worth putting them in their own category. The nature of programming work requires certain types of work habits, like the ability to concentrate on a complex problem for an extended period of time without getting distracted. Even if you’re not interested in such skills as remembering everyone’s name at a party, you probably need to keep working on a smaller set of general skills.

Like the ability to solve programming puzzles, the ability to concentrate or organize your time is formed through a combination of innate ability and practice. While some people are naturally more focused than others, anyone can learn to concentrate better by putting themselves in the right surroundings and making an effort to avoid distraction. There is some controversy about whether willpower is a limited resource. Whether it is or not, setting up productivity habits is an easier way to avoid distraction than just trying harder. The same approach applies to other good habits.

Choosing a Skill Type to Focus On

All of the skill types I just mentioned have some benefit. But you aren’t likely to distinguish yourself by spreading your improvement efforts across all of them. So you’ll need to prioritize. This is where you have to consider your career values and what you’re looking for in a job. Those priorities will tell you which type of skills you should spend more time on.

Soft Skills

You may hear that developers should focus less on technical skills and more on soft skills. I don’t agree with that emphasis. But soft skills are appropriate if you’re looking for a programming-related job like technical management or program management.

Algorithmic Problem Solving

You can spend a lot of time working on your algorithmic problem-solving and coding fluency skills without running out of things to learn. While they may not be practical in isolation, these skills can be applied to any programming task. Many programmers are weak in these area (as shown by the widespread fear of coding interviews). So you can distinguish yourself by understanding the techniques required to solve programming problems on the fly.

Computer Science Fundamentals

Most programming jobs don’t require a deep knowledge of CS fundamentals. So there’s some risk in dedicating a lot of time to learning them. But if you develop the right background and find a job that requires it, it can be worthwhile, especially if one of your career values is to invent new technology.

Programming in the Large

Some aspects of programming on a team, like using source control, you can pick up as you go. But others, like navigating a large code base involving many developers, take some effort to learn well. And these skills are eminently practical.

Knowledge of a Specific Technology

Spending time studying a specific technology is a risky proposition. You have to do it in order to accomplish anything, but which one do you pick? The best approach is to learn technology just in time to use it on a project.

Another way to approach this skill is to become unusually good at a specific technology. Like becoming an expert in a CS fundamental, this reduces the pool of jobs that you can choose from, but offers a potentially rewarding opportunity to make a deep contribution.

General Skills and Habits

General skills and habits don’t do anything on their own. It’s best to continually tweak them for best results, but not get so caught up in them that you neglect your more specific skills.

(Image credit: Aurimas)