Head In The Cloud

The Skills of Software Engineers

Category: webdev
Tags:  Code

Skills

Misconceptions about how software engineers create value cause people to believe the darndest things. For instance, the public seems to believe machine learning will reduce the value and demand for software engineers, while competent software engineers seem to view machine learning as a new tool that makes them even more productive and versatile. Part of this is that people believe the actual writing of code to be a large part of the value of software engineers. I would argue that there are people who just write code for a living, but they are generally paid poorly and are not doing the same work as the new labor aristocracy that tech giants have formed.

I am attempting to categorize and outline the skills that I have found to be necessary to improve myself and to progress in my career in software. I can’t guarantee that I will agree with this post in a few years. If you are considering a career in software or want to understand what this line of work entails, this article may be useful to you.

Coding Skills

This is the obvious part. This is what you learn in 100 level Computer Science courses. Competent software engineers have reached a certain level of knowledge to the point where they can quickly get to work maintaining a new code base in any coding language. This includes understanding general syntax and style rules, compilers, memory allocation, garbage collection, algorithms and data structure.

The less obvious part about coding skills is understanding how to use tools to stay productive. The people who get things done know when and how to read documentation, find libraries to import, search StackOverflow or ask openAI. Not understanding the necessity of this skill leads to imposter syndrome because you feel like you should be memorizing these things yourself. The reality is that the depth of knowledge here exceeds human capacity by so many orders of magnitude that beyond a general understanding, you need to accept that Google is your post-frontal cortex.

Knowing how to code includes knowing when not to write code. Before starting any code change, you need to make sure you have a solid understanding of what the change is going to be. You also need to distinguish what you need to build from scratch from what can be easily imported and worked from. You also need to think about the implementation options you have. There is a huge difference in productivity between people who can write code and people who can write code.

Interviews often test coding skills by presenting a problem and watching a sweaty nerd talk their way through the logic of the problem while frantically writing pythonic wingdings. The code that is written is only a fraction of how interviewees are being evaluated here. The decision making processes they go through while deciding what code to write and how is far more important to competent interviewers.

Technical Skills

A wide breadth of knowledge in a variety of technical areas becomes mandatory. When servers are inexplicably failing, understanding how to use command line tools to ssh into and troubleshoot a server becomes crucial. Knowledge in areas like system architecture, operating systems and networking enables software engineers to come up with innovative solutions to business problems.

A Bachelors of Science will start developing your technical skills, but a code bootcamp will opt out of this in favor of getting the foot in the door into an entry-level job. The bootcamp strategy is valid insofar as employers are willing to let a new hire gradually flesh out their skills while being assigned the company’s technical grunt work. Most jobs by volume are probably entry-level jobs where you can get by with only coding skills and slowly developing technical skills. These jobs don’t tend to pay salaries worth bragging about but they are a good and common start in a career. Some people do stay in these jobs when they decide they prefer the comfort of repetitive grunt work over the constant challenge of engineering that lies above them. Moving on from these roles often involves switching to your second job since many tech companies avoid promoting internally.

Once you move on to the level of engineering, you will be assigned to solve problems or reach goals. It will be up to you to work out what the solutions look like, how they will be built and communicate effectively the reasoning behind your decisions. At this point, you need to rest of the skills below.

Learning Skills

I am lumping together every skill related to learning. This includes reading comprehension, your self awareness of how knowledgeable you actually are in a field and your understanding of how well you learn in different ways. Despite what the Dunning-Kruger Effect myth may have you believe, you can learn to be self-aware of what you do and don’t know. You can also learn how to identify the unique ways you learn to do so faster.

This is actually the single most crucial skill and in general the one that I would recommend focusing on first, even before coding if you intend to pursue this career path long-term. In fact if I wanted to gauge a software engineer’s skill level, I would focus on gauging their learning skills. The AWS interviews I went through did this pretty well by drilling into past experiences by questioning how you followed through and learned from mistakes.

Getting good at learning means you progress at everything else faster. The single psychology course I took at uni was one of the most valuable. History and geography 101 courses were also instrumental in putting a cultural context to my current knowledge and where my gaps are bound to be. Granted I am still a slow learner. I am a painfully slow reader and I spent a solid ten years focusing on building the skills needed to work at a tech giant where some people are entering fresh out of uni. You don’t have to be the best learner out there, just competent enough at it.

Soft Skills

Google famously found that STEM skills are not the most important skills for software engineers. It turns out that there are diminishing returns to additional coding and technical skills beyond a threshold of broad competence. This revelation changed how the industry evaluated and conceptualized the value of its software engineers. The focus on soft skills leads to employers talking about things like psychological safety.

A computer science degree can make a world of difference but further education would be better spent on other topics. The best engineers with higher education typically have their education split between computer science and a subject like literature, history or philosophy. Having a broader worldview and more developed communication skills gives them an edge over people who got lost in the depths of technical niches. Great engineers are often "T-shaped"; they have one area with great depth of knowledge and a great many areas with a shallow depth of knowledge.

Many computer science students have misconceptions about what skills they actually need. This can be seen in people getting both their Bachelors and Masters degrees in Computer Science rather than splitting their education between STEM and liberal arts. It can also be seen in people opting out of general Computer Science in favor of studying highly specialized niches like game programming or machine learning. I have worked with people who got game programming degrees only to find jobs maintaining vertical market software.

Soft skills encompass your ability to process feedback, collaborate with teammates, mentor peers, build customer trust and get others to understand your ideas. These are abstract skills that are generally not taught at all in schools or bootcamps. This is extra effort for which some people like myself need to dedicate enormous lengths of time.

I have seen other engineers be perpetually frustrated over their inability to even understand why they are not communicating effectively. This problem can grind your personal and career growth to a halt until you find a way to make this area “click” for you. I personally went through a first job at a low-paying vertical market company in part because I needed to develop this set of skills to be hired elsewhere, and it took me a few years to develop competence in soft skills.

As an aside, I want to note that soft skills are distinct from being friendly and charismatic. These traits can help you get trusted and listened to faster in certain environments, as can unrelated things like your background and skin color, but relying on charisma limits your opportunities and hampers your personal growth so I don’t recommend it.

Thinking Skills

Some of the skills that I frequently rely on don’t feel like they fit into the above categories so I’m making my own skill categories now and you can’t stop me.

By thinking skills, I am referring to critical thinking, awareness of your biases, problem solving ability, deductive reasoning and other nebulous concepts. Beyond having technical knowledge, learning abilities and soft skills, you need to be able to genuinely innovate. In order to work out the root causes of a new problem and come up with creative new solutions, you are going to need to develop your ability to think to a sufficient level.

For the most part, these skills are probably best developed by studying maths like algebra, calculus or proofs. I also recommend developing these skills by working through coding challenges like Project Euler, or finding other ways to practice puzzle solving. To some extent, I believe these skills can be developed with a broad education and diversified book reading in order to expand the ways you conceptualize things in general. You may also find value in learning about mental models.

Perspective Skills

From the above skills and years of experience, more advanced skills develop that in my mind are what set apart the principal engineers. There are some skills that I want to categorize as being related to having a strong sense of perspective.

The most competent software engineers have the ability to dive deep into solving the root of a problem while knowing when to step back and change course. It is frighteningly easy to lose sight of the big picture in a rapidly changing environment.

The most competent software engineers understand how to make decisions. This starts with being able to quickly know the cost of a decision in terms of how much time is lost if the wrong decision is made. When the cost is low, they make a decision quickly to deliver results faster. When they make a decision quickly, they are often correct because they have developed an instinct through years of diverse experience. This is a skill that can only be developed through diverse experience and failures. There is no shortcut to this.

The most competent engineers build with an understanding of their customer and the customer's experience. mediocre engineers will build services that are technically useable - and perhaps is even exactly what the customer asked for verbatim - without understanding the customer well enough to realize that they won't enjoy the experience of trying to use that service

In order to have these kinds of skills, you need an acute awareness of your position in your business and industry. You have to understand how you relate to your customers, colleagues, managers and industry peers. You have to understand what you know, what other people know better than you due to their experience, what biases your background gives you, and how urgent it is to get a product shipped. I posit that the common thread between these skills is how far you are able to see in every direction, from within yourself to across your industry; these skills are a matter of perspective.

Conclusion Skills

Just kidding, this is just a conclusion.

Software is not a field fit for everyone because of the extremely specific and broad set of skills the career demands. Software looks appealing on the outside due to the appeal of joining a labor aristocracy. Software is probably most similar to medicine in that you can be extremely valuable for society and rewarded for it, but you are constantly challenged, sometimes severely overworked and never able to start mentally auto-piloting your work.

The skills required for software engineers are also far from being automatable, probably in our lifetimes. Even if code that actually worked started to be automatically written – which is not the case in the stone age of GPT-3.5 – companies that try to forgo hiring software engineers will lose their ability to innovate and deliver greater customer experiences. Software engineers at Amazon had to work with quadriplegics in order to make their website accessible to people using a stylus on their forehead. I had to understand what humans do well or poorly when woken up in the middle of the night in order to deliver effective improvements to operations tooling in EBS. Automation only threatens to smooth out the grunt work.

If you do choose to pursue a career in software today, as long as you develop these skills, you should be highly valued almost anywhere for the rest of your adult life. It won’t be easy, and it won’t be equitable, but it can be a fulfilling lifetime of learning, growth and tangibly impacting the world.