I've noticed that there are many different titles in Software Development and many different ideas about what each title actually means which leads to a lot of confusion for software developers searching for work and companies searching for employees. It's also been apparent that it's an issue with some companies not understanding the strengths and weaknesses of various employees and thus having trouble retaining high quality software development resources. I have some ideas about what the perfect development team means to me and how this structure would look. In order to outline this idea as best I can I wanted to create a post to explain various components of this concept, what each part does and how it all works together within a company.
A typical breaking point in communications is effectively handling task descriptions and delegating them to the people with the greatest strengths in the specific focus areas. Each task is usually split between many resources such as UI/UX, frontend, backend and testing where each resource type has varing levels of experience in specific sections of the code base or tools being used. It's difficult to effectively manage this break down from a non-technical background or from a background different from the one being used within the company.
Another typical breaking point in communications is estimating tasks and ensuring the flow of each item to meet up at various points throughout the process for example one overall task could be split between 4 teams and each team must converge at the end for testing, each task within this must be managed in a way that there is minimal down time but items are still being pushed through the pipeline. You could introduce many tasks at once to flood this problem and provide a no-downtime scenario but this leads to fragmentation of each individual task as it's usually not managed in a way that can understood down to each individual task level. Another way to look at this is to begin and finish certain tasks in line for another team to pick them up while the original team works on something else. Having a technical background will help delegate these tasks and keep them on track as they move through the team to completion keeping tasks contained while providing minimal down time as the software developer can typically understand the complexity of the moving parts for each item as it moves along the pipeline.
This structure is something I have been thinking about for a while using goals based on the shortcomings of various teams I have worked within or observed externally via friends and coworkers in the industry. To begin with the explanation it's important to outline the overall goals and reasoning for a team structure like this because of the large variation in industry vision and what different teams look like these goals may not be the same for all.
- Maximize Productivity - Above all else a company is likely to prioritize productivity to ensure that tasks are being completed and completed correctly as to not have to revisit items as much this means implmenting good practice for each team member and coaching new members to develop good habits.
- Maximize Employee Satasfaction - This goal is to ensure that everyone on the software development team is happy with their work and their career growth. In order to achieve this I believe that there should be clear focus on career growth, learning new skills and making productive contributions that are easily seen within the business.
- Enable Efficient Knowledge Transfer - Career growth and consequently employee satasfaction can be contributed to by allowing those with more industry knowledge and experience to teach more junior members in a way that's not frustrating for either party but opens the line for communication allowing employees to work more closely and transfer important information between them which utlimately contributes to higher quality work at a faster pace. This goal is about nuturing junior developers and giving them the skills to improve their work and move forward with this field even if they leave the company later on.
- Reward Career Growth - Using a structure that consists of various levels of software developers as a hirearchy all contributing knowledge to various other levels will enable the development team to be rewarded for growing in their career instead of focusing on non-essential goals such as rapid contributions of low quality. This will foster better employee satasfaction and effective knowledge transfer.
Senior Software Developer
This role contains highly experienced software developers typically with at least 10 years of programming experience including a vast amount of experience specific to what is happening within the company. This is also typically someone that has extensive knowledge of the entire company's code base and architecture. Senior Software Developers in this team have a more architectural and business related role as opposed to focusing soley on writing code.
The Senior Software Developers should be the point person for outside information so if new requirements for a feature or a bug are communicated with the development team they should be communicated to the Senior Software Developers who then gather requirements and put together the proper documentation for it to be passed along to the team. This is a vital role as Senior Software Developers can provide a high level of accuracy with documentation and being able to describe items to the team they effectively manage. This also includes being the point person to provide estimates and time frames to individuals outside of the software development team after further documentation and discussion with the rest of the team members. The Senior Software Developer can provide valuable insight immediately to those requesting features or fixes because of their breadth of knowledge on the subject which can be important for understanding the complexities of underlying tasks.
The Senior Software Developers should take the requirements and delegate them to the rest of the team members based on their current workload, their understanding of the code in question and their individual strengths and weaknesses. The Senior Software Developer should outline goals and time frames for each item with each person to understand the many moving parts and keep track of each of these items as they move along the pipeline. It should be the Senior Software Developer's job to maintain an outline with estimates and due dates for each item so that it can be presented to the requestor when questioned and they can recieve proper updates as the process moves along the pipeline.
The Senior Software Developers should be responsible for assisting with development, architectural and logical questions that may arise during the development process from the rest of the team. They should provide quick and concise insight to the team and as such will need to have direct communication with all members of the team. While that's a difficult task it fosters communication and knowledge transfer.
The Senior Software Developers should engadge in peer coding sessions with the rest of the team occasionally with a focus on the Junior Developers to help with training them to grow in their career and learn more about the inner workings of software development and refine their skills. Peer coding sessions can be 1:1 with Senior Software Developers in smaller companies as the need for this grows the company should employ more Senior Software Developers but I think that effective peer coding can be done with a 1:many ratio as long as it's not overwhelming and unproductive for the individual.
Senior Software Developers should review all code that is completed by others as it is moved along the pipeline this is essential for knowledge transfer because it allows them to communicate good coding practices to everyone else on the team which in turn helps others understand the platform and work and grow in their career.
Senior Software Developers sit at the highest level of the software development team and their insights need to be recognized by outside resources in order to be effective in their role.
The Software Developer is someone with mid level software development experience typically with at least 5 years of software development experience and a good thoruough understanding of the technoligies the company is specifically working with. The Software Developer in this team structure is where much of the programming work is done as they require less intervention and knowledge transfer from the Senior Software developers and are focusing specifically on programming tasks.
The Software Developer should be given the responsibility of a certain part of a feature, fix, etc. by the Senior Software Developers and focus on completing their individual task(s) to move them forward in the pipeline. Since the Senior Software Developer is responsible for maintaining the movement of tasks along the pipeline the Software Developer should communicate progress with the Senior Software Developers as they move forward with their work. This relationship should be 1:1 with the Senior Software Developer who assigned each task as to not fragment the work taking place at the Senior level.
The Software Developer should be responsible for the contributions they provide to the company and be receptive to feedback from Senior Software Developers on those contributions and improving their code quality. This is typically less of an issue at this level but it can and often is an issue that should be addressed.
This is the typical role for software development but it's very common that this role gathers responsibilities outside of what it is supposed to be capable of and this leads to frustration and often times leads to problems effectively working in a team enviorment.
The Junior Developer is typically someone just starting in their career or someone with less than 5 years experience in the industry and minimal knowledge of what is taking place within the company. The Junior Developer role is really important for individual career growth and as this role becomes more experienced it's common with good help that these people become very good at programming and quickly learn more aspects of the software development industry.
This role is nearly identical to Software Developer but it's a role that should recieve less complex tasks from the Senior Software Developers and more hands on training between code reviews, communications and peer coding sessions.
Providing this insight from the Senior Software Development team will make Junior Developers excited to learn and progress as it provides not just "a place to work" but a place to gather important useful knowledge of their work and improve it over time. I really think that from my experience good mentoring from Senior Software Developers can make or break careers it's really difficult when just getting started in the industry to really understand the ins and outs of programming because it's drastically different in many cases from what they teach in school or experience gained working on personal projects. It's so difficult in fact that many burn out and move to different careers or stay stagnant.
Testing simply cannot be done effectively without programming experience. Between using automation tools for automated testing and providing real valuable insight to the development team that you're working with it's really important to have a pretty good understanding of programming and the technologies used within the company. I would say that from my experience someone with at least 4 years experience in Software Development could run testing effectively. Many times this is actually delegated to the developer that is working on each feature as a part of their work and I think that's fine overall but if you must have a team for testing you should think about how much their work relies on technical knowledge and consult the Senior Software Developers.
Testing should be done in conjunction with Senior Software Developers if testing is a different team of people. They should communicate with the Senior Software Developers about their process and each item in testing as items move along the pipeline since the Senior Software Developer is the one tasked with tracking the various items as they move along.
Testing is a vital part of a software development team and as easy as it is to ignore this or not put enough resources into this it should be carefully thought out. All code should be reviewed before moving into testing phase as this will likely reduce the number of issues passed to the testing team.
What is your ideal team structure? What do you think of each of these outlined roles and responsibilities? What have you seen in your career that made you think it could be better or what have you liked about teams you have worked with in the past?