What is Software Engineering?

Software engineers develop code to solve problems, create products, and power services.

Why Software Engineering?

  • Many people rely on the systems that software engineers are responsible for
  • Software engineers can create new systems to help people
  • Many organizations offer high pay, flexible hours, and career advancement for engineers
  • Software engineers constantly learn new things and work on interesting challenges

What is a Codebase?

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.

Software Engineering vs Programming

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:

  • Time: Code can change a lot over the lifetime of a project as new situations and decisions arise.
  • Scale: Sytems that serve many people or lots of data face new constraints and challenges.
  • People: When many people work on code together, they must build complimentary systems.

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.

Types of Software Engineers

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.

Software Engineering Skills

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:

  • Write Code: Clarify requirements, implement solutions, fix bugs, and test for correctness.
  • Deliver Code: Find solutions when you get stuck, communicate your work to others, get projects done on schedule.
  • Read Code: Understand code written by others, trace the order it executes in, integrate your code into existing systems.

Skills to learn as you start working:

  • Review Code: Provide feedback on code written by others and help them solve their problems.
  • Maintain Systems: Help monitor systems, solve bugs in code you did not write, and identify growing problems.
  • Design Systems: Create solutions for larger problems, evaluate trade-offs, discuss alternatives with others to get feedback.

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.

Resources