Software engineers develop code to solve problems, create products, and power services.
A codebase is all of the code a team of software engineers maintains to power their systems.
In school projects, you might write all your code in one file or a few files. In a larger organization, everyone needs to share code, understand code written by others, and build on the existing code.
What makes software engineering different from programming? As Titus Winters, Tom Manshreck, and Hyrum Wright explain in their book Software Engineering at Google, Programming becomes more difficult when these three factors are introduced:
Learning to code is a big step towards learning software engineering, but there are many more approaches and tools you will learn as your career progresses.
Software engineering has principles and practices that will continue for a long time as well as many new tools, techniques, and ideas that change and grow much faster. This means you will need to combine both learning in school and learning outside of school to grow as a software engineer.
Software engineering has a wide variety of roles. Here are examples of different job titles and specialties you may encounter. Search online to learn more.
Frontend Engineers develop interfaces, websites, and apps that people use. They might use programming languages such as HTML, CSS, or JavaScript and frameworks such as React or Angular.
Backend Engineers develop services that power websites, apps, and other services. They might use programming languages such as Python, Java, JavaScript (Node.js), Go, C++, or Ruby.
Full-Stack Engineers work across the frontend and backend. They may use the skills of both frontend and backend engineers.
Feature Engineers are engineers in any part of the codebase who focus on building new features that users and customers want. They may make use of multiple systems within the codebase.
Infrastructure Engineers are engineers who build systems to provide new capabilities to other engineers. Their work often supports teams of feature engineers. Also called Platform Engineers.
Build Engineers are a specific type of infrastructure engineer who build systems to enable other software engineers to compile and run their code quickly, correctly, and repeatedly. In large organizations, their efforts are crucial to maintaining productivity and scale.
Data Engineers create pipelines and apps to extract, transform, and load data. They may also create services to support other members of the organization, including non-engineers, who need to do things with data. They may use programming languages like Python, SQL, or Go and use libraries like Spark, Hadoop, BigQuery, or Airflow.
Security Engineers ensure that systems are protected from malicious activity, preserve the privacy of user data, and find solutions to risks.
Reliability Engineers monitor and improve systems to reduce the risk that they will crash or create other problems. They are crucial in organizations that support large scale systems.
Solutions Engineers help customers develop specific projects using the organization's main systems. They are comfortable both using their organization's technology and consulting with customers to help them achieve their technical goals.
App Engineers build mobile, web, and other kinds of applications to help users accomplish specific tasks. They may specialize in a particular platform, such as web, Android, iOS, Flutter (cross-platform), wearables, TVs, or even displays in vehicles.
Systems Engineers work on software or hardware used by other engineers. These can include operating systems, embedded systems, or servers.
Test Engineers design plans to verify whether software works correctly. They form an understanding of the system and how users rely on it. They may write code to conduct automated testing and build systems to support testing. Test engineers may hand-off issues to other engineers or fix them directly. Also called Quality Assurance (QA) Engineers.
DevOps Engineers develop systems to handle code deployments and other parts of the engineering process. They may work on builds, testing, continuous integration, release, monitoring, logging, and developer tools.
Because there are so many different kinds of software engineers, there is a huge variety in skills as well. For students learning software engineering, we created a list of six skills that many software engineering roles have in common, regardless of what specific programming languages and tools they might use:
Skills you might learn before you start working:
Skills to learn as you start working:
You can be a successful programmer by writing and delivering code well. To be a successful software engineer, you also need to work well with other software engineers and contribute to systems. That is when other skills like reading code and designing systems becomes more important. That is also when you will need more ways besides coursework to grow your skills.
Scarlet Data Studio created a self-rating system based on these six skills. You can use this to determine your current level of progress and pick an appropriate way to learn more.
Stage | Description | Advice for Growth |
---|---|---|
Stage 1 | Learning to write code. | Take classes and self-study through online resources. Try personal projects to become more comfortable with a programming language. Try out new language features or libraries. |
Stage 2 | Learning to write and deliver code. | Come up with project ideas so you can learn how to plan, implement, and communicate your work. An internship may also help you learn more about delivery. |
Stage 3 | Learning to read, write, and deliver code. | Read code in codebases or libraries to understand how they work and try to contribute to them. An internship may help you learn how to read code in larger systems. |
Stage 4 | Learning to contribute to systems. | Find an internship or job where you can be a software engineer in a team that asks you to take ownership of part of their system as well as review, maintain, and eventually design. |