Top 10 Non-tech Skills You Need as a Software Engineer
I’ve been working for 15 years as a software engineer at top-tier tech companies and I’ve had to learn a much more diverse skill set than I could have originally imagined. For me, software engineering started as the passion to build small apps or to solve algorithmic challenges during high school. Little did I expect that those skills were only the tip of the iceberg in terms of what you need to know.
1. Diligence
When working on software projects you often try out new things that have never been done before. There is inspiration around but there is always novelty and challenges. It takes creativity to get the job done but most of all you need to be diligent (having or showing care and conscientiousness in one’s work or duties), to not give up when things are not working out as expected. Patience and sustained effort will get you through those milestones.
2. Ability to cope with failure
Failure is something you need to get used to when working on software. We often build things we will later throw away (prototypes). The output of your work from entire days, weeks or even months may prove useful only to decide what will not be the next steps or direction for your project. This is not something we are trained for, e.g. in school the emphasis is on success and not on learnings derived from failures. Software engineering may in a way be compared to playing video games where you fail often and try again.
3. Resilience
Depending on the type of software you develop, even after you overcome the failures that inherently appear during the development cycle and you successfully launch, you will still have to deal with small crises, emergencies, tight deadlines to provide fixes for the product or support and maintenance. Resilience (the capacity to recover quickly from difficulties; toughness) will help you overcome these stressful times and recharge for the next iterations.
4. Communication skills
It’s less likely that you will be developing software just by yourself without ever interacting with others. Code reviews, discussing designs and brainstorming about ideas are an integral part of a software engineer’s day-to-day activities. It pays to be concise and have a clear message. I’m grateful to one of my early managers for many teachings and for recommending On Writing Well: An Informal Guide to Writing Nonfiction by William Zinsser.
5. Negotiation skills
Project discussions may get conflictual with multiple people trying to prove their point. The discussions are positive because they allow bringing different points of view into the discussion that a single participant may not have considered. However, to move forward you need to reach consensus and gear the discussion towards finding the best possible solution. Mediation and persuasion skills are a good thing to have under your belt.
I’ve enjoyed reading Influence: The Psychology of Persuasion by Robert B. Cialdini and Never Split the Difference: Negotiating As If Your Life Depended On It
by Chris Voss.
6. Empathy
The people you work with may at times have very different opinions from yours. The first rule for having your opinions heard by others is to show empathy (the ability to understand and share the feelings of another) and listen to all the opinions. You need to encourage others to speak up about their take on the situation and be a good listener. The best leaders I’ve met in my career are not those that will talk and talk through your 1:1 leaving you with no opportunity to say anything. On the contrary, the best leaders are those that will ask the right questions to get you thinking and moving in the right direction. A must-read is Dale Carnegie’s How To Win Friends and Influence People.
7. Leadership
Even as an individual contributor, you will have to influence others to reach your goals (e.g. accept your code contributions or your new ideas). When working with a team, a good leader will be able to explain the goals of the team and project and motivate the team to achieve them. A good team lead will drive change without micromanaging (management style whereby a manager closely observes and/or controls and/or reminds the work of his/her subordinates or employees) the team members.
8. Empowering others
This goes hand in hand with other leadership skills like being a good motivator and summarizes as enabling others to reach their full potential. I have found that people work best when they are given responsibility for an area and are empowered (to give official authority or legal power to) to find the best solutions to make that area successful. That does not mean they are completely on their own, feedback from others and advice will still play an important part. It means the person who is responsible sees it as their duty to go and reach out for feedback, try out ideas and propose the direction without being hampered nor forced into following a dictated path.
9. Time management skills
There are many ways in which you can make software better. You can refactor it to use that fancy new technology. You could add those feature requests that clients have been dreaming about. You could fix that annoying bug that has been there since last quarter. Time, however, is a limited resource so you will not be able to do everything. Setting the right priorities (and sticking to them!) is mandatory. Thinking you can just put in a few extra hours to finish that one thing is naive and will only lead to unhappiness and burnout in the long run.
10. Kindness
Be kind to yourself: stretch your goals but make sure they are realistic (e.g. 70% of the goal could be reached), take care of your health, make plenty of time for your family and dear ones and make time for learning, relaxing and having fun. Be kind to everyone else as well, they are going through the same challenges that you are.