# Software Engineering

## What is software engineering?

> Software engineering is the job of designing, developing, testing, and maintaining software applications and systems.

It involves applying engineering principles to the [software development lifecycle](https://resources.github.com/software-development/what-is-sdlc/) and the use of various tools and techniques to create high-quality software products. This process is informed by engineering techniques, which help define, implement, assess, measure, manage, change, and improve the software over its lifetime.

Software encompasses a wide variety of applications, including operating systems, desktop programs, games, and mobile apps. Every industry uses software apps in some way—data management, customer interfacing, and operations can all be managed using software apps.

Engineering software requires not just the development of the application but also the maintenance as hardware, related software, and user needs evolve over time.

### Types of software engineers <a href="#types-of-software-engineers" id="types-of-software-engineers"></a>

There are many different types of software engineering roles, each with its own set of responsibilities and requirements. Some of the most common types of software engineering roles include:

* Application developer: The person in this role creates software applications and programs using tools designed for development as well as programming languages—such as JavaScript, HTML/CSS, SQL, Python, and Java.
* Architect: The person in this role designs and develops software systems and applications at a high level. They determine project requirements and build technical standards for tools, platforms, or software coding. A development team then uses these designs and standards to develop software.
* Project manager: The person in this role handles the process of software development from start to finish by organizing workflows, assigning tasks, and monitoring progress to meet benchmarks or deadlines.
* System developer: The person in this role builds the operating system that underpins all backend computer functions. These systems are the foundation of not just desktop devices but also mobile devices, automobiles, IT networks—anything that relies on a computer to operate.
* Tester: The person in this role designs tests to help ensure that software applications meet certain standards of quality and performance. They also run these tests and analyze the results to make improvements or recommendations.

### Software engineering roles and responsibilities <a href="#software-engineering-roles-and-responsibilities" id="software-engineering-roles-and-responsibilities"></a>

The roles and responsibilities of a software engineer can vary depending on the specific job, industry, and company. Some common day-to-day responsibilities include:

* Designing and developing software systems and apps: Designing and developing systems and apps involves writing code and debugging errors. Software engineers also design ways to test new code—either their own or code written for other programs that might be used with their systems—to ensure quality and performance control.
* Collaborating with other engineers and stakeholders: This type of collaboration includes working with other software engineers, project managers, and clients to ensure that software products meet their needs. Collaboration takes place throughout the project from the outset (when software requirements are defined) through completion (when the product is evaluated to make sure it meets its defined goals).
* Maintaining software systems applications: This involves fixing bugs, updating software, and ensuring that software products continue to function properly over time. The dynamic nature of evolving technology requires software engineers to continuously check on the health of systems and apps.

### Popular software engineer skills <a href="#popular-software-engineer-skills" id="popular-software-engineer-skills"></a>

To become a software engineer, you need to have a combination of both technical and non-technical proficiencies. Some of the most important skills for software engineers include:

* [Programming languages](https://github.com/resources/articles/software-development/what-is-a-programming-language): Software engineers should be proficient in one or more programming languages, such as Java, Python, or C++. Programming fluency is essential for not only writing code but testing and maintaining apps over their lifetime.
* Computer science: Through a combination of education and experience, software engineers need a strong foundation in computer science. Knowledge of operating systems, databases, and networks is essential for software engineering.
* Project management: [Agile software development](https://github.com/resources/articles/devops/what-is-agile-methodology) frameworks—including Scrum—are frequently used by organizations. While essential for software project managers, these frameworks are also good to know for any software engineer.
* Problem-solving: Problems can arise in any area of software engineering, including code writing, testing, and maintenance. Software engineers should be able to identify and solve complex problems related to software development.
* Communication and collaboration: Software engineers should be able to effectively work with other engineers, project managers, clients, and non-technical stakeholders about various aspects of a project, including scope and requirements, progress, testing, and maintenance.
* Attention to detail: Software engineers should be detail-oriented and able to identify and fix errors in code. This piece is essential at all stages of a project from initial design to testing to maintenance.

### Common software engineering tools <a href="#common-software-engineering-tools" id="common-software-engineering-tools"></a>

There are many different tools and technologies used in software engineering, including:

* Integrated development environments: These apps provide a comprehensive environment for software development, including code editing, debugging, and testing.
* [Version control](https://github.com/resources/articles/software-development/what-is-version-control) systems: These software tools help software engineers to manage changes to source code over time.
* Quality assurance and testing frameworks: Software engineers use testing frameworks to help automate the testing of software applications and programs.
* Project management tools: These applications help software engineers manage development projects, including scheduling, resource allocation, and task tracking.

### Career opportunities and salaries for software engineers <a href="#career-opportunities-and-salaries-for-software-engineers" id="career-opportunities-and-salaries-for-software-engineers"></a>

The salary and career opportunities for software engineers can vary depending on the specific job role, company, and location. According to [Indeed.com](https://www.indeed.com/career/software-engineer/salaries), the December 2023 average salary for a software engineer in the United States is $118,000 per year. That figure increases with experience—an American software engineer who's worked for more than 10 years could earn on average $148,000 per year.

Popular job titles for software engineers include:

* Application developer
* Architect
* Project manager
* System developer
* Tester

### The future of software engineering <a href="#the-future-of-software-engineering" id="the-future-of-software-engineering"></a>

The future of software engineering is likely to be shaped by emerging technologies such as AI, machine learning, and the Internet of Things (IoT). These technologies are expected to revolutionize the way software is developed, tested, and maintained, and to create new opportunities for software engineers.

Many organizations are already using AI and machine learning to supplement some of the day-to-day tasks of software engineers, with the goal of freeing up their time to focus on high priority projects that require their skills and expertise.

The [U.S. Bureau of Labor Statistics](https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm) expects demand for jobs related to software engineering to increase over the next decade. In particular, demand for software developers, quality assurance analysts, and testers is expected to grow by up to 25% through 2032.

***

#### More Reading:

{% embed url="https://github.com/resources/articles/devops/what-is-agile-methodology" %}

