Developing software is not only about programming. There are several skills that are applied through the process of delivering well done software. When you define a process using a model of development, it is called methodology. There also is a holy war about which methodology fits better to get the best results. From the very structured CMMI model, which fits better with the cascade development, to the evolutionary development model that is proposed by Agile methodologies. The cascade development model indicates that the problem should be fully analysed, specified and documented, the same applies to the CMMI specification. Most Agile methodologies feature an evolutionary development process, where all requirements are handled progressively using sprints to develop each component.
Depending on the kind of problems that face a company, it requires different methodologies. Where requirements do not change very often and they have rock solid basis, you can use cascade development, since requirements will not change, the specification will not face modifications, and developers will not double work developing components twice. Otherwise, you must use something that can handle requirements dynamically, like Agile, which can provide a well defined development process that can help on that case.
But no matter which one is your methodology, software development requires skilled people on each area that is participant of the process. Each role cannot work separate from each other. The project manager should be able to properly coordinate the team. The analyst should be able to understand the problem and provide that knowledge to every developer of team. And each programmer should be able to solve each problem that have assigned to his schedule. If any team member fails, probably the project will fail.
So, you can identify clearly five main roles facing the problem of building software, and we can enumerate them as follows:
Coordinator Role- Who can coordinate the team, as project manager, scrum master or any name that you can give to him. Is who can provide instructions to the team according to its skills on each members. His main role is to lead the team to successfully developed software.
Analyst Role- Who can understand and document the customer problem to be solved or automated, as analyst or product owner. He is very good communicating and have the particular skill of communicating problems from the customer perspective to the team perspective, mainly the project manager or scrum master, and all team members.
Lead Developer Role- Who can understand the customer problem to be solved or automated at higher levels, as lead developer or software architect. Also can design a generalized solution to the problems as main abstraction of the solution, and lead developers to find solutions at low level, due to his skills as programmer.
Developer Role- The programmer, or who can develop the software, his skills are based on good readings, understanding problems, representing the problem logic as software solution on a given language, as the main implementation of the solution specified as abstraction by the lead developer or architect. His is able to read an article and use that knowledge on programming tasks. He should not use copy-pasted code.
QA Role- The one who ensures that the quality of the delivered product will fit the needs of the customer. Depending on the delivered software solution, their skills will require some programming knowledge and platform knowledge.
On a well consolidate development team, you will see that each team member have skills that fits with each one of those roles, probably not formalised, but they are clearly visible on every development team. And probably your team can fail if it lacks any of those roles. There are also some successful teams where they members are like polyglot programmers, since they have skills that fits very well with various roles, meeting the requirements of the problem on the fly. Obviously having various skills to meet various roles is very valuable plus, not only from the business perspective, it can be an inspiring goal for many members as human beings.
Is very nice to work on a well consolidated development team. Mainly where all members can have a coherent approach on the problem solution, with a wide scope of solving further problems if they can work well on their roles, because they will identify common problems, and they will be able to use the reusability principle that comes from object oriented programming, reducing the amount of required work to solve future problems and shortening the schedule, but within a process of evolutionary and cumulative knowledge acquirement and developing a software base to provide software solutions based on team cohesion, rather than dependency.