Software engineering is one of the hot careers that everyone seems to be talking about, but it can be a bit opaque from the outside. I’ve spent 15 years in various software engineering and engineering manager roles. Over that time, I worked at a huge range of companies, from a four-person startup to the tech giant Microsoft as well as several medium-sized startups.
So what exactly is my job? A software engineer is really anyone whose primary job function involves writing computer code.
That said, software engineers are first and foremost problem solvers who use code and technology as their tools. In fact, many software engineers will tell you that problem solving is their favorite part of the role. “It is immensely satisfying to go from a state of, ‘How in the world are we going to do this?’ to, ‘These are the pieces we need to build and here is how they will fit together,’” says Alice Fuller, a fellow software engineer and former colleague of mine who now works at Sensible Weather, Co.
What Is a Software Engineer and What Do They Do?
It’s easy to say that we’re solving problems, but what exactly does that look like? It depends, because there are many different types of software engineers. This is by no means an exhaustive list, but the most common include application engineers, product engineers, or sometimes just software engineers—which are all titles used interchangeably to describe the same type of role—as well as quality assurance (QA) or test engineers, DevOps engineers, and embedded engineers.
While there are differences between these roles, the heart of the job is often very similar. Most software engineers:
- Write code to implement solutions
- Design solutions to problems, taking into account tradeoffs in usability, cost, speed, and complexity
- Understand customer requirements, use cases, or pain points
- Document and communicate designs and solutions
- Write and run manual and automated tests
- Troubleshoot and fix problems
- Collaborate with a team
Application engineer, product engineer, software engineer, and other titles might be used to refer to engineers writing web applications or applications that can be installed on your computer, phone, or tablet. They typically take user requirements and figure out how to meet those requirements through code.
This group is usually broken up into front-end, back-end, and full-stack engineers:
- A front-end engineer focuses on the pieces of an application that users interact with directly. These pieces of the application are often referred to as clients and include both the visual elements and on-screen interactions. In other words, these engineers lay out what you see on the screen, and they control what happens when you click a button or drag something from one place to another.
- A back-end engineer typically does a lot of the non-visual portion of the application, or the behind-the scenes work. This includes creating and storing data, deciding what data to show to the user, calculating statistics on that data, and more. For example, in a retail application, the back end would include things like allowing a user to select an item to buy, processing payment information, sending a purchase email notification, saving the transaction history, and selecting item recommendations for what the user may want to buy next.
- A full-stack engineer works on both the front end and the back end. It’s common for people to move between front-end, back-end, and full-stack engineering until they find what they enjoy most.
QA or test engineers are primarily responsible for the quality of any software that’s released to users. They test out all of the different things that a user should be able to do and make sure that it’s all behaving properly and nothing goes wrong. They may do this by actually going through the actions or by writing code to simulate a user going through portions of the application. A friend of mine who was a test engineer described the difference to me as “software engineers are people who like to build things, and test engineers are people who like to break things.” (To be clear, their ultimate goal is to make things less breakable for the user!)
DevOps engineers are newer roles that have really gained traction in the last 10 years. DevOps is a set of practices revolving around bringing software development and IT operations closer together, ideally within a single team. IT operations can include a full, varied, and separate set of roles, but at a high level, they’re the ones responsible for making sure that the correct code is running, that servers are up and working, and that applications are available to customers. A DevOps role can be vastly different depending on the company, but it will include both software engineering (writing code) and operations (actually running that code on servers). DevOps is also sometimes used to refer to roles in IT that are expected to write significant amounts of code for their job including automation of repeated tasks.
An embedded engineer works on code that runs directly on hardware as opposed to code that runs on software (for example writing code that runs directly on a MacBook as opposed to writing code for an application running on MacOS Catalina). They write the lower levels of code available on a computer, phone, car, or any other device with software. Traditionally, embedded engineers needed to understand a significant amount about hardware, but with the recent growth in the number and variety of embedded devices (even lightbulbs connect to the internet now), an increasing amount of this base-level code is already available, and embedded engineering is becoming more and more similar to application engineering.
There are also a host of software engineering–adjacent positions—including sales engineers, solutions engineers, implementation engineers, and technical consultants—that can range from no programming to large amounts of programming depending on the company and the exact role. While these jobs are rarely housed within engineering departments and usually aren’t considered software engineers, they can be great stepping stones to becoming a software engineer.
Key Facts About Software Engineers
Your actual job duties are part of any job, but so are your day-to-day environment. Where do you go to do your job? What does that location look like? What are your hours?
How Much Do Software Engineers Make?
According to PayScale, the average salary for a software engineer is $86,803 per year, while the Bureau of Labor Statistics lists $107,510. The reality is that compensation can vary a lot depending on the exact role you have, your location, your seniority level, and the size of the company. Older, established companies will pay much better than early stage startups. These startups typically offer stock options, which can really pay off if the company does well or can be worthless if it fails, as most startups do. According to BLS, employment for software engineers is expected to grow by 22% between 2019 and 2029, which is a much higher rate than most occupations. So the jobs aren’t going anywhere.
Where Do Software Engineers Work and What Is the Work Environment Like?
The real beauty of software engineering is that every industry is becoming a technology industry—almost every company now has a website, an app, and more. We buy food, read the news, check the weather, watch movies, and even do our banking online, so every industry needs coders. This means that you can work almost anywhere as a software engineer—at tech companies, banks, retailers, entertainment and media companies, schools, hospitals, defense contractors, nonprofits, and more. Some organizations that hire software engineers will be primarily software companies and others may only have engineering as a much smaller part of the whole.
As you might expect, given the variety of this list, the work environments can also be very different. Even within a single large company, the culture, standard hours, and office setup (open floor plans, offices, cubicles, etc.) can vary significantly between teams. A software engineer’s job can often be done from anywhere. As such, a number of companies have fully remote software engineering positions and more and more organizations are warming up to the idea and advertising fully remote roles.
What Hours Do Software Engineers Work?
Most engineering teams are also very flexible with hours, but based on both my own experiences and from talking to colleagues about their experiences at other companies, there’s typically an expectation of being available for meetings for some chunk of the day (11 AM to 3 PM PT is most common, but it may vary depending on where team members are located). Starting between 9:30 and 10:30 AM is common, but that’s by no means a requirement and can vary a lot by company and team. In my experience, ending times vary more than starting times. Most software engineers work later hours, but some people will work until sometime between 5:30 PM and 7 PM and others stop even earlier—perhaps as early as 3:30 PM—and then work an hour or two more in the evening after dinner or after their children are in bed. Engineers at very small companies, and especially startups, are more likely to work long hours, but at most other companies, they typically work 40 to 50 hours a week.
How Can You Become a Software Engineer?
The most common way to become a software engineer is by getting a bachelor’s or master’s degree in computer science or a related field, such as math. That said, a related degree—or any college degree—definitely isn’t necessary. It’s also possible to get into software by teaching yourself and doing independent software projects, by going to a coding bootcamp, or by completing an internal job transfer training program. If you don’t get a degree, you’ll want to build up some example projects demonstrating your coding skills to show potential employers. If you’re considering a bootcamp, make sure you do your research before enrolling. While some bootcamps have really good programs and a high placement rate, others are a waste of time and money.
The most obvious and universal skill needed to become a software engineer is the ability to code. While companies use specific programming languages, most good companies will hire based on general coding ability, not experience with a certain language. It’s usually easy to pick up a new coding language once you’re already good at one. That said, the type of software engineering job you want to do will dictate which languages are most relevant. For example, for a front-end web position, HTML, CSS, and JavaScript (including React and Node.js) are very common. For a back-end position, it’s hard to go too wrong with Java or Python, and it’s useful to know at least some basic SQL. It’s worth noting that some languages, such as Python, are faster to write out than Java or C++, making them easier to use in technical interviews.
In addition to coding, most companies will expect familiarity with the concept of version control—the most popular being Git. They will also expect some familiarity with coding using an IDE, or integrated development environment, such as IntelliJ or Visual Studio. Most companies use Agile or Scrum methodology for their daily processes, but don’t expect entry-level engineers to know anything about it.
To be successful, an engineer also needs to have a number of soft skills, including strong communication skills and the ability to work well in a team. “A lot of people imagine being a software engineer is just being alone at your computer all day coding,” says Samantha Paras, a software engineer at Nova Credit and former colleague of mine. “However that is not the case.” Because the role involves a lot of problem-solving, critical thinking and analytical skills are also important. Finally, because technology is always changing, companies often look for people excited to learn new things.
What Are the Possible Career Paths for Software Engineers?
In software engineering, there are two main career paths that most people take: the management track and the technical track. The technical and management tracks are usually considered parallel, and both require increased leadership, mentorship, and people skills as you move up. I personally tried management and decided I hated it and have since moved up on the technical track. Both are great paths to success. For both tracks, you start as either an associate software engineer or a software engineer. From there, you advance to a senior software engineer.
If you move to the management track, you progress through engineering manager (manages one to two teams), senior engineering manager (usually a manager of managers), director of engineering, VP of engineering, and SVP of engineering. At a high level, the management track focuses on people, projects, and teams. How do we set up a team for success and allow them to do their best work? “I switched to be an engineering manager since I realized I can amplify problem-solving by supporting and empowering engineers,” says Natalia Vinnik, a former coworker of mine who’s now a senior engineering manager at Google. “It’s a great combination of technical problem-solving and organizational problem-solving.”
If you stay on the technical track, instead of moving to management, you could become a staff engineer, senior staff engineer, principal engineer, architect, or technical fellow. The technical track is about making sure that the teams you’re on are using the best technologies available, building in ways for tech to still work if the number of users increases tenfold, and generally thinking broadly and long-term about how features are built. While you don’t directly manage anyone in one of these senior technical positions, you still need to be able to convince people of your long-term vision and lead teams in the right technical direction. For more in-depth insight, take a look at my blog post about what a senior staff engineer does.
Some companies use titles I haven’t mentioned in this section—especially on the technical track—and even the same title doesn’t always map to the same level; Levels.fyi is a useful tool to compare roles across companies.
Should You Become a Software Engineer?
I’m going to be honest: Being a software engineer can be tough. Learning to program and writing code is hard for most people. While most of the time the hours are great, if your application or website is going down a lot, it can be stressful with a lot of sleepless nights. Traditionally, software has also had problems with diversity, equity, and inclusion. In recent years, a number of companies have started talking about and working on DEI and some improvements have been made, but there’s still a lot of work to do when it comes to DEI in tech.
All of that said, there are also a lot of really great reasons to become a software engineer. As I already touched on, the job itself is typically very flexible, with the ability to work remotely occasionally or even all of the time. The hours are also typically extremely flexible. Even when a company has general guidelines, I’ve rarely seen them strictly enforced. Additionally, it’s extremely well paying, especially for the amount of schooling required, and the jobs aren’t going to disappear any time soon. And if you eventually decide being a software engineer isn’t for you, there are related roles that are much easier to get if you have a software background, including technical writer, developer advocate, product manager, program manager, UI/UX (user interface/user experience) designer, and much more. But those are really just the surface reasons.
The real reasons most software engineers stick with it and love their jobs are more related to what they do rather than the pay or the flexibility. Many of us love the collaborative nature of the job. “What I love about [software engineering] is it is truly a team effort to build something great together,” Paras says. “You are working closely with other engineers to figure out solutions to problems. You are learning how to make a UI that is easy to use from your designers. You are collaborating with product managers to make sure you are making the right solution for your users.”
Some of my own favorite software engineering moments have been time spent in a room with other engineers working together to figure out how to tackle a seemingly impossible problem and coming up with a solution that was much better than what any single one of us would’ve found. Software engineering “is a form of problem-solving that is engaging and is ripe for interesting conversations with coworkers,” Fuller says.
On top of all of this, software engineers have the ability to make an impact. Software affects all of our daily lives, more and more as time goes on. For example, apps like Slack and Zoom help us all stay connected to both coworkers and loved ones. Winnie supports new parents as they navigate the confusing landscape of daycare and preschool, and even helps them find a changing table when they’re out and about. Countless education applications work to improve and augment education techniques. Companies like One Medical are trying to make healthcare more accessible and healthcare records more standardized. I recently had a friend who’s homebound due to a multiyear illness talk about how great it is that he can order restaurant delivery, groceries, and more to his door and do his banking online without risking his fragile health.
Even though I’m not currently working on one of those applications directly, I’m working on an application that helps make other software engineers more productive and therefore, I’m in a sense helping the efforts of many applications at once. By helping to write that software, I am ultimately working to improve our lives.