When kicking off a new software development project, naturally we all intend for it to be a success. But for the project to succeed the most important element is a good team. Surprisingly a huge amount of projects do fail due to poorly defined team structure. While it is an undeniable truth that there is no formula for the perfect team mainly because different projects might require different roles and skills, there are some common roles to every team. Despite the project, there will always be a need to understand the business problem, convert that problem into an architecture, convert the architecture into a solution, test the solution, and deploy the solution. Although each of these processes may change to some extent based on the programming models and tools being used, fundamentally there are some roles, which every process has in one form or another. One person may be filling all the roles or a handful of the roles, or one very specific role. Despite this there is a need for all of the roles --- each serves a purpose. There are a series of roles that exist in most software development projects like Developers, UX Designers, Product Owner and a Quality Assurance Engineer. However, as I said, the project dictates which roles are required, a project without a User Interface might not require a UI or User Experience Designer, where a more complicated project might require an architect or a tech lead. Software is not some commodity that is manufactured, it is used to solve specific business or scientific problems.
Building a software team is a hard task mainly because there are so many parameters to look for before structuring one, like team size, team type, define roles and responsibilities. However, my goal on this article is to explain what are the most common roles in a development team and I will describe the skills of each role. Although there are skills that every role in a team must have such as communication, collaboration, passion etc, I will focus mostly on the technical skills of those roles.
Every software development team is likely to have a Product Owner (PO), a Quality Assurance Engineer (QA), a certain number of Developers and a User Experience Designer. Some projects might require some other specialists depending on the nature of the project but those four main roles are the most common ones.
The Product Owner
A product owner (PO) in a software development team is responsible for "maximizing the value of the Product". The way the Product Owner maximizes value is by continuously making choices about what to build and what not to build in the product. He/She is the one that has a clear understanding of the client's perspective and needs and strives to achieve the vision and requirements.
Communication across all team members is the most important skill for any project to be successful but it is particularly critical for the Product Owner to have good communication skills since he/she needs to work with the business to understand their vision and transfer this vision to the development team to bring it to reality.
POs should be great storytellers, they should know how to slice the user's story into the product backlog and convey it to the developers. The PO is responsible for translating the ideas from the stakeholders into user stories that are describing a feature told from the perspective of the person who desires the new capability. He/She should also be able to prioritize needs. In other words, they must juggle the triangle of scope, budget, and time, weighing priorities according to the needs and objectives of stakeholders. Another must have-skill is domain expertise. A product owner should know the business and the driving KPIs to perform effectively to plan the roadmap and deliver features which in turns provides "business" value.
POs have to be able to work in an unstable environment where things are constantly in flux due to changing conditions, requirements and plans.
A Software developer has extensive knowledge of programming languages, software development practices and principles, software design, different technologies, version control systems, data structures and algorithms, and he/she applies engineering principles to software creation. By applying these engineering principles to every stage of the development process, from requirements analysis to the software process, they can create customized systems that match the view of the client.
The knowledge a software developer needs doesn't stop there though. Nowadays a lot of teams are cross-functional and companies are pushing more to a full-stack development instead of having developers focusing on just one area.
First of all, developers should know how to test their code. Before sending code for review, they should make sure it does everything they`ve coded it to do. Testing ensures errors are flagged early and faulty output is avoided wherever possible. Testing comes in many forms and developers need to understand them all to effectively test their output and ensure they're meeting the necessary standards.
They should also have a certain amount of knowledge in DevOps.
DevOps is the combination of cultural philosophies, practices, and tools that increases an organization's ability to deliver applications and services at high velocity: evolving and improving products at a faster pace than organizations using traditional software development and infrastructure management processes. This speed enables organizations to better serve their customers and compete more effectively in the market.
The benefits of DevOps are really important. It enables you to shorten the software development cycle, increase the frequency of delivery, scale better, and deliver more reliable software through CI/CD, monitoring and logging.
Last but not least, they should know Cloud platforms. Back in the old days, companies had to build and maintain their servers to store their databases to make their websites run. This was very expensive and time-consuming. In 2020 companies of all sizes and domains are now shifting their environments into Cloud. Cloud services help in decreasing the overall operating cost, and it can help you in running your operations more effectively and efficiently, which means developers should know at least one cloud platform to help the business succeed in their goal.
The Quality Assurance Engineer
A QA (analogous to "quality assurance" in manufacturing) is responsible for helping the team toward the goal of baking quality in. The idea of building quality into their products is at the heart of how agile teams work. Agile teams work in short iterations in part to ensure that the application remains at a known state of quality. Agile teams are highly cross-functional, with programmers, testers, and others working side by side throughout each iteration so that quality can be baked into products through techniques such as acceptance-test driven development, a heavy emphasis on automated testing, and whole-team thinking. Good agile teams bake quality in by building their products continuously, integrating new work within minutes of its being completed. Agile teams utilize techniques such as refactoring and a preference for simplicity to prevent technical debt from accumulating.
- A Good QA Will:
- Be a champion for quality throughout the development lifecycle
- Encourage the whole team to think of quality on every dimension
- Pair with developers to understand
- How they are implementing stories
- What tests they are going to write to verify the story and CFRs
- Discuss how the code may break
- What edge cases may exist in the new code
- Lead the shared ownership of the quality of the product
- Be aware of and contribute to the QA strategy of the organisation
- Good QA Is NOT:
- By hand "regression scripts" before each big bang release
- "Automation testers" who write large numbers of (usually flaky) "End to End" UI driven tests
- Testers that only get involved when things are "code complete"
QA should pay attention to detail. This ensures all the tasks are completed to the business' specifications. Getting seemingly minor details correct every time can prevent major problems occurring further down the supply chain. It also prevents tasks from needing to be redone or revised to meet requirements later.
Also, they need to have great domain expertise. Professionals working in quality assurance need at least a rudimentary understanding of the technical processes of their organization, to help determine whether or not a product is up to standard.
The User Experience Designer
A user experience designer's main task is to care about users' experiences when interacting with the final product. User experience (UX) design is the process design teams use to create products that provide meaningful and relevant experiences to users. This involves the design of the entire process of acquiring and integrating the product, including aspects of branding, design, usability and function.
Because design is highly graphic, UX designers need to be competent in visual language. Proficiency in visual communication includes an understanding of concepts like layout, colour, typography, icons, images and design theory. Another skill a UX designer must have are wireframing and UI prototyping. Prototypes allow designers to test functionality. They help designers to ensure there is a match between a system and its users before construction on the final product begins. Prototypes allow designers to test both page functionality and overall navigation. UX designers must also have user empathy. Being able to put yourself in someone else's shoes means understanding their problems. When you understand someone's problems better, you're more equipped when it comes to finding a solution to their problem. UX designers should also have analytical skills to determine how well their design is performing. Analytics are great for this. So, understanding numbers, percentages and ratios are a real must when you want to get your head around the performance of your design. Finally, coding is another skill that they should acquire. This is quite a useful skill to have as a UX as their job deals with technology, so they know what are the technological constraints, and the limitations of a development budget.
When starting a project, make sure you have all the required personnel for the project. Define each person's key duties and responsibilities and then communicate so the whole team knows exactly what is expected of them. Building a software development team is like putting puzzles together. You have to establish clear roles and responsibilities for each member, ensuring clear communication.
The roles described in this article are not set in stone. There may be some variations depending on the type of your project. Those are just labels to roles that are helping us communicate better in our industry. Moreover, the responsibilities and the skills mentioned in this article are not strict, too. It's possible that a team could have different responsibilities in different roles if they find it helpful.
Blob is also posted in Codurance.