The Team Organization defines how to group people in a software development organization, by taking into account their skills and competences, as well as the organization’s needs. It also defines the communication channels, their number and the type and amount of flowing information. The goal can be defined as the definition of cohesive groups with high internal communication and low inter-group communication. Actually, an analogy with the goal of good modularity (Software Design).
Software development organizations create descriptions which ultimate goal is to be executed in a computer. Although the final description uses a formal language, the problem is often described using a natural language (Software Development as a Formalisation Process), and there are several other intermediate descriptions that use different kinds of languages.
Different languages require different skills from people using them. Some languages are mainly oral, whereas other are written and are checked for their correctness. Communicating with other people is different from communicating with the computer. Therefore, software teams require people with different skills, both technical and non-technical. In particular, because software is about languages and transformations between descriptions written in those languages, the communication skills of software engineerings are frequently emphasized.
On the other hand, associated with the different kinds of descriptions and their transformations, the software development organizations define types of roles that establish their required competences and responsibilities. Although these types of roles may vary from project to project, common roles are:
- requirements engineer, which is responsible for the description of the problem
- software architect, which is responsible to map the problem description into a solution description
- developer, which is responsible to concretize the solution description in terms of code
- tester (quality assurance), which is responsible to verify the quality of the descriptions, usually the code, but any description can be the target of verification
In some software engineering approaches different responsibilities are merged in a single role whereas other approaches stress a high separation of responsibilities. The former approaches follow a human-centric view of software development while the latter have a process-centric perspective (Software as Art and Engineering).
The structure of the software team intends to manage the number of communication channels. The organizational structures vary from a flat structure, where there are communication channels among all members, to an hierarchical structure, where the groups are isolated and the communication channels between them have a unique entry point that is controlled. Human-centric views tend to recommend a flat structure to take advantage of knowledge sharing while the process-centric perspectives emphasize the reduction of communication channels and the creation of highly standardized activities; the communication occurs between the activities instead of the people performing the activities.
It is known that it is impossible for large organizations to have a flat structure, but there some discussion on how to have several flat structures inside a large organizations.
In Annotated Readings is discussed the relation between productivity and organizational structure (Patterns of Productive Software Organizations), and the differences between Functional and Technical organizational structures.