What skills should every software engineer have?

One part of my job at Bloc has become: make sure everyone on our engineering team is improving their skills. We like T-Shaped people (succinctly: generalists with one deep area of expertise), and part of growing that kind of culture means understanding what makes great software engineers.

I have friends at many different companies, of many different stages and sizes. I decided to ask my network: “What skills should every software engineer have?”. I must’ve struck a nerve, because I got a LOT of responses. And, notably, many of the skills were so-called “soft” skills.

  • Debugging Skills (21)
  • Empathy (20)
  • Communication (17)
  • Knowing your tools / picking the right tool (8)
  • Ability to throw away code (7)
  • Navigating a large codebase (7)
  • Foresight (6)
  • Listening (6)
  • Patience (6)
  • Product Intuition (6)
  • Focusing on solutions instead of problems (6)
  • Humility (6)
  • Reading comprehension (4)
  • Writing readable code (4)
  • Be receptive to, and receiving, feedback (4)
  • Learning quickly (4)
  • Ability to see the big picture (3)
  • Practicing the 80/20 rule (3)
  • Understanding layers 4–6, instead of just layer 7 (3)

Selected Responses

“Good debugging skills are somewhat underrated. Not in a ‘what is the problem with this line of code’ way, but how to systematically think about & approach a situation where it seems like the impossible is happening.”

“Being methodical when debugging and being able to navigate *any* code base go hand in hand. Often you can learn a lot by just stepping into software you take for granted.”

“They should focus on solving the problem and moving the product forward, not complaining about problems others created. Taking a constructive approach is far better than deriding others for doing it the wrong way. This allows for good learning opportunities, and keeps teams motivated.”

“Being able to rapidly learn and never give up on something you believe is possible.”

“I feel like the people who are best to work with are the people who let machines be the inflexible ones — the ability to realize there are several ways to solve a problem and the ability to embrace and understand a new and different way to solve a problem than the one you would have thought of. I find too often good projects die because people couldn’t pick up a different way of solving a problem than their own. Grow off of other people’s solutions, don’t just scrap it and do it your way.”

“The ability to scrap everything — if your legacy code is a constant source of pain, be able to throw it away; don’t force yourself and your team to stick with it just because things have always been that way; be willing to come up with new solutions to old problems.”

“Being able to decide the right tools & paradigms for the right jobs, not just sticking with familiar things because new is scary, but also not bandwagoning on new stuff for the sake of new stuff.”

“The ability to accept and receive constructive criticism without getting defensive or being accusatory, respectively. This is the only way someone can learn and grow effectively in a team environment.”

“ The ability to see the big picture and not get lost in the minute details. See the forest for the trees. At least as a Systems Engineer I find that to be a valuable trait in a software engineer who is implementing design/requirements.”

“You should master the tools you use. Mastery of tools means knowing both the interface and the inner workings. Once you know your tools, you should be able to pick the right tool for the job.”

“You should be able to explain your work at varying levels of abstraction. Once you can do this, you should use it to ask questions or Google.”

“Respect for the ideas of other engineers and also for non-engineers. Engineering is a collaborative art. Being unable to work with others makes the job very difficult.”

“A strong fundamental respect for simplicity. This directly translates into better architecture, tool usage, feature planning, product management, code quality, etc.”

What do you think are the most essential skills for a software engineer?