A good place to start any discussion of software development may be the various roles needed to achieve success. How many of each role will be determined by the needs of the project. Sometimes one person may fill all of the roles, creating a highly individualized solution. More commonly, many people will be required to achieve a desired outcome. Below are some of the most common roles.
A business analyst could also be called a "requirements engineer." No one uses that term, but it probably describes the role more accurately. Technical knowledge is required, as well as an ability to express technical details in writing and gather information from a variety of sources. Every software project/product starts with a set of requirements. Perhaps those requirements are just in someone's head, or perhaps the information needed to produce a particular software system resides in many people's knowledge base. The requirements engineer (business analyst or BA) will gather all of the information needed to define the system in writing, pictures, models, diagrams, and any other method that will be understood both by the people defining the system (the business team) and the people who will implement it (the technical team). The business analyst role is incredibly important and can often determine a project/product's the success or lack thereof.
A more common term for coder is "developer." I prefer to think of everyone defined on this page as developers and will avoid using developer for people dedicated to writing the code. Because software development (or software engineering to use a more formal term) requires a multitude of roles and responsibilities, limiting the use of the word developer to someone who writes code is a disservice to the rest of the team and to the profession in general. All of the roles described on this page are contributing to the software development process and should be considered software developers.
Coders are people who specialize in writing the code that implements the system. They often participate in the requirements, architecture, and design processes and also perform testing on the software. But a Coder is someone whose primary job is to create the code that makes the system work. This is a highly skilled position with specialized knowledge of the language, tools, libraries, processes and more required to make the software work. A coder's skills will increase over time, and there is no substitute for someone who can write clean code quickly and efficiently. This may be one of the most difficult roles to master in the software engineering profession.
The critical role of testing is often overlooked in organizations new to software development. Everyone assumes that whatever code gets written will work as expected. That is far from true. Testers are needed to ensure product quality, and multiple rounds of testing are normally needed on any large release. We will speak more about the test cycle in the section on software process, but just be aware that quality assurance is required in any product-oriented organization, and software testing is a viable profession with many different aspects. Because software development is so difficult, software testing is a critical function for any software organization.
The software architect role is normally a senior role that some coders evolve into. Software systems often contain millions of lines of code. They are developed over many years by many teams of individuals each of whom may be writing hundreds of lines of code per day. The bulk of the code base is enormous. In order to give it structure and make it understandable, the code is broken up into smaller pieces. How those pieces are arranged and fit together is the job of the software architect. After many years writing code, some people become what is essentially software planners. They plan out software systems and components before they are developed, and they often replan those systems as new knowledge is gained. A good software architect helps keep the software system understandable and manageable. They also participate in estimating the effort it will take to create a new system or component.
DevOps itself is a profession. People who specialize in DevOps often stay with it exclusively. It's essentially the art/science of taking code that others have written and deploying it for people to use. This includes deployments to test environments and production environments. It includes automating the processes and testing, as well as enforcing strict rules to avoid embarrassment in publicly facing software. Just as testers provide an invaluable service to a software organization, so too the DevOps engineers. There are many unsung heroes in software - with Coders and Architects getting the lion's share of praise - but anyone who has been saved by a good Tester or DevOps engineer will attest to their importance in making the software process work. We'll take a look at the magic that the DevOps people perform in a separate section, but here's a funny story from DevOps gone bad for now.
The User Interface (UI) of any software requires an artistic eye that many Coders do not possess. Therefore, a specialized profession has sprung up around making the UI more attractive. These UI experts are also trained to improve the User Experience (UX). UX design requires stepping through different types of users' journeys through the software and making those experiences as intuitive as possible. Employing UI/UX experts to participate in design of the software system, developing the user interface, and advising developers on various decisions to be made in designing the user experience of the modules they are developing will make a big difference in how well the software product is received.
Project Manager is also normally a somewhat senior role in software development. As coders, business analysts, and testers evolve in their careers they may choose project management as a viable path if they are good at managing projects. This means making sure that everyone on the project has what they need to succeed, developing and maintaining the timelines for the project, replanning the timelines whenever needed, and interfacing with other teams to ensure that dependencies are met. Because there are so many dependencies between different teams and departments, each of whom may only vaguely be aware of the needs of the other teams and departments, the project manager plays a crucial role in making sure that all of the pieces of a software project come together to form a viable software product. For more info on project management, please see PMI (Project Management International, the gold standard in project management).
The primary difference between a project manager and an engineering manager is that the latter has people reporting to them. (I use "they/them" to indicate a person of unknown gender rather than "he/she.") Different organizations treat the manager role in different ways, and the terminology varies greatly from company to company, but what I call engineering managers are the people who manage the people in the other roles. In addition to managing people, they manage the budget of their department or some aspect of the software delivery process, but the defining aspect of the role here is that someone needs to manage all of the above people. This is what I'm calling the engineering manager. This is an extremely difficult job because managing people is difficult, and there is no proven formula for success. Engineering management is a highly individualized profession which depends more on the experience of the individual than on training or education. Becoming an engineering manager is a logical step in one's career progression if one aspires to going into senior management of a company, as many of the skills acquired in engineering management scale to the company-wide level.