Resources for Teamwork

Forming a Team

When first forming a team, it is important for all members to get to know one another as this will allow each member to feel more comfortable communicating while working together. It is highly recommended that teams meet prior to starting the project to simply get aquainted with one another. Although this meeting should be more personal (i.e. unrelated to the project), it can also be used to establish the group’s goals and expectations to ensure everyone has a similar mindset going into the project.

It is also extremely useful for team members to identify the specific skill sets that they can bring to the team, including any relevant soft skills and technical experience. These strengths should be shared with the team to help with the decisions making when delegating roles and responsibilities.

Project Management

Working as a team effectively requires a lot of planning and organization. Projects as a whole are often very complicated and overwhelming, so it is very useful to break down a project into smaller stages/tasks. There are many ways in which a project can be managed; two commons project management practices that software engineering teams user are the Waterfall and Agile methods. Details on these can be found in Resources for Software Engineers.

Team Communication

During the early stages of forming a team, the group should also establish general expectations for how the team plans to communicate with one another. This may include setting up a team communication channel on a specific platform (ex. discord or slack) and establishing regular check-up meetings (including when these meetings are and where they will be held - for example, in person or online). These general meetings can be used to outline general expectations and project requirements, update one another on individual progress, delegate new reponsibilities, and set project deadlines.

Time Management

An important part of team communication is in communicating tasks, deadlines and progress. Each team member should have good knowledge of the general progress of the project. This will give each team member a deeper understanding of the current state of the project so that they can more adequetly allocate their time. Perhaps even more importantly, the project manager will be able to have a deeper understanding of the progress of the project, and the team member’s working habits and they will be able to manage the team more adequetly.

With a deeper understanding of the project progress, project managers will be able to assign more realistic dates and deadlines, and keep team members on task and on the right tasks. With a deeper understanding of their team member’s working habits they can also more adequetly update stakeholders amd allocate budget. This will help avoid unforseen issues while approaching deadlines. For instance, if a project lead notices that their team is lagging behind on a task for a specific deadline, then they will be able to correctly reassess the deadline, and the deeper insight will allow him to more accurately set future deadlines.

In general, when setting goals for your team as a project manager, there are many things to consider, such as the clarity of the goal, the fact that it is a realistic goal, and that the goal is relevant and important to your project. Proper communication with your team members will aid in acheiving each of these goals, and correctly following these tips will help your team reach their goals and provide a better product to your client. In this process, organization is key, and a project manager must try to leverage all the tools available to him to improve his ability to manage the team. When it comes to deadline-setting and task prioritizing, one of the most powerful tools that a manager can use is a todo list or project board/roadmap.

There are many useful options for this, such as Notion and Trello. Both of these tools allow a project manager and their team to create a page, that they can all access to check important tasks and notes about those tasks.

Here is an example progress board given by Trello: Image You may notice that there are several states for each task, from ‘To Do’ to ‘Done’ or even ‘Blocked.’ This allows the team to understand the progress of all their tasks, and even if a task was stopped. You will also notice that there are team members assigned to some tasks which gives clear communication to the whole team about who is working on what. As you can see, there is a lot of information that a project manager can gain through this kind of tool, and it will all help them with being able to guide their team as described above.

Getting Clarification

You always want to ensure that all team members are on the same page when working together. If you are ever unsure about something that was said during a meeting or have any confusions in general, ask your team members with specific and explicit questions. It is helpful to reiterate your understanding back to the team to confirm your understanding is correct. Some example phrases you may use (taken from Week 8 Lecture Slide 12) includes:

Giving Feedback

When team members are working on different components of a project, it is useful to have meetings where each member can share their work with the rest of the team. During this meeting, constructive feedback can be given to make improvements and offer new insights or perspectives. Feedback should be given regularly and early on, to allow for flexibility in ideas. In a professional working environment, always ensure feedback is being given with the purpose of supporting the team’s goals and improving the project rather than being influenced by any negative emotions. Effective feedback allows the team to develop better habits and succeed together. In the long run, it helps the team learn together and make fewer mistakes while also building trust and collaboration. Without good feedback, the team may not be able to reach their full potential and will suffer from the same detriments repeatedly.

It is important to note that feedback can be both constructive and destructive. Constructive feedback helps the team improve and is well thought out to in its delivery. On the other hand, destructive feedback may not be given with the intention of hurting the team, but it is nonetheless unhelpful. It is important to avoid giving destructive feedback, as it can be detrimental to the team’s morale and productivity. Destructive feedback may be taken as a personal attack and can lead to defensiveness and a hostile working environment. An example of feedback that is destructive would be a statement such as “You are unreliable”. This statement specifically calls out the recipient while providing no evidence or data points. Not only that, the statement lacks objectivity and can easily be taken as an attack on the person’s character. When giving constructive feedback, it is beneficial to follow a four-part formula. The first part involved initiating the feedback giving process. This can be done with a simple query that signals to the other party that feedback is incoming. This question is mainly a pacing tool and allows the recipient to buy-in to the feedback process and respond positively. An example of this question would be along the lines of “I have some ideas for improvement on X subject matter, can I share them with you?” The second part of this process involves providing specific data points that support your feedback. This should include concrete examples with a lack of ambiguous words. A neutral tone is necessary in this step, as it allows the recipient to see the situation objectively. In addition, specificity and actionability are key in this step. Provide as much objective detail as possible and pick points that will be what the recipient should increase or diminish. For example, one can say “You said that the pull request would be done by 3PM yesterday, but it is still not done yet.” The third part of this process should include an impact statement in which you explain how the data points provided affect you specifically. This should include using “I” statements that explains how the recipient’s actions have affected your work or emotional state. Furthermore, this step is the time for subjective or personal statements. In giving the recipient a window into how you feel, depth is added to the feedback, in the form of a layer of empathy. This adds more purpose and personal meaning to the feedback, which allows the recipient to connect the logic behind the feedback. This can be done by saying something along the lines of “Without your pull request, I could not fix the merge conflicts we had discussed. I was blocked on my work which was a frustrating experience.” Finally, the feedback should end with a question that allows the recipient to respond and engage with the feedback. This question should be open-ended and should not be a yes or no question. This allows the recipient to respond and engage with the feedback, which allows for a more productive conversation. In prompting a response, this question will encourage commitment to improvement, rather than compliance to the feedback. You can pass off the conversation by saying something similar to “This is how I feel, what do you think?” or “What are your thoughts on this?”

5 ways to deliver effective feedback

Giving feedback

The secret to giving great feedback

On the other hand, it is also beneficial to practice being open and receptive to feedback - understand that everyone has different experiences and opinions and feedback is not meant to be a criticism but a suggestion that you and the team can benefit from.

Communication

Communication is one of the most essential parts of a successful software engineering team. This is because software engineering teams are often composed of multiple individuals with a diverse set of skills, experiences, schedules and responsibilites. Clear communication helps team members divide work efficiently, ensuring that each member has a clear understanding of their responsibilities and deadlines. This helps to avoid misunderstandings and leads to smoother collaborations and faster delivery.

How to avoid misunderstandings in the workplace

Communication is essential for positive collaboration. In software engineering different problems can arise and effective communication is key to resolving them quickly. By discussing issues openly and honestly, team members can brainstorm solutions and use their collective expertise to work together and resolve issues in a timely manner. This leads to the development of high-quality software products.

Some examples of effective communication include active listening, timely communication, clear messages and honest feedback.

7 tips for more effective communication in the workplace

Team members must update each other on their ideas, progress and any obstacles they might be facing in their work. Otherwise, there might be a drop in productivity and even a delay in the project. If a team member is facing issues it is important for them to discuss these with their co-workers as they might be able to help resolve the issue.

Communication is integral for voicing your concerns to your team members. Team members should express their concerns with each other respectfully and resolve these concerns in a professional and constructive manner. This maintains an important sense of accountability between the team members.

How to Approach a Co-Worker

Effective communication is crucial for any software engineering team to work well together and achieve their goals in a timely and organized manner. It can, however, be difficult to communicate with your team due to a number of challenges. In a globalized workplace, where employees come from different cultural backgrounds, language barriers can pose significant challenges and can lead to misunderstandings and misinterpretations.

Letting your emotions overwhelm you can also hinder effective communication in the workplace. Emotions such as anxiety, stress, and anger can all negatively impact communication and professional relationships. It is essential for team members to work together on overcoming these challnges to maintain a productive and healthy work enviornment.

Statistics on why effective communication is important in the workplace.

Asking For Help

With a Coding Problem

A new environment produces new challenges. It may be the case that you are lost and are unsure of how to proceed. Here is a list of things you can do, as an individual and as a team member, to get yourself back on track.

1) Attempt to fix the situation

Before you ask for help, you should try to do it yourself. Software engineering, whether it is in this course or in the real world, is a field where you will be constantly learning. Learning cannot exist without attempting it yourself. There are a variety of resources that you can use to gain more insight on your situation, from documentation to online forums such as StackOverflow.

2) Isolate the specific issue

If you still cannot fix the problem, then the best you can do is hone in on the problem. Find out which specific part of the code that is not working or the specific part of the problem statement you cannot understand.

There are various methods to find where the issue lies. Writing test cases is an effective method to catch errors, as these test cases will continue to ensure that certain functionality of your code will always be correct throughout its development. If an error causes the code to not execute, reading the error message will provide the exact line where the error occurs. To understand why the error is occurring, the use of a debugger will help you inspect variables and hone further into the problem. Lastly, if all else fails, it is better to use print statements than do nothing at all.

3) Explain the situation

It is important to remember that you have the most experience with your own code. When asking for help, it is unwise to assume that your peer will instantly understand what you have attempted to do. So, the best first step is to explain the situation. Explain the general concept of the task you are trying to achieve, while keeping in mind their level of expertise on the subject. Doing so will ensure that you will both be on the same page when they give their assistance.

4) Ask a specific question

With all the previous steps complete, you can now ask a well-defined specific question, if you have not already solved your problem. With a fresh set of eyes on a small amount of code, it will be much easier to find a solution compared to asking for help combing through hundreds of lines of code.

Remember, asking for help is not a sign of weakness. With different individuals at different levels of experience, a hard problem for you may be an issue that another individual has already experienced. So if you are stuck, it is better to ask for help than to do nothing at all.

With Getting Started

A related but different issue that may arise is that you do not know how to begin. Your initial attempts may be futile and you do not know how you should proceed to contribute to the overwhelming task at hand.

1) Do not waste time

Most likely if you do not know where to start, it is still early on into the project. This is a very important time as ideas and plans are being created that will affect the entire outcome of the project. So it is especially important to get started on learning the things you will need for the project to be successful. One of the very first things that you can do is to ask your peers for resources to get a better understanding of the material.

2) Attempt to learn what you can

With the internet at your disposal, there are many resources to find help. Try searching through youtube tutorials, online forums, this software engineering repository, and even use any AI-powered large language model of your choice. Break down the problem into smaller instances and try to tackle these challenges one at a time. Try to dig deeper into the topic that you do not understand so that you can at least articulate what you do not understand.

3) Ask for clarification

With the ability to articulate what you do not understand, you can now ask your peers for further help. Explain the parts of the problem that you understand, and ask questions about the parts that you do not understand. Maybe your task is something that another individual has already experienced, in which case they will be able to guide you through the process. Or, it may be a learning experience for the entire group.

Remember, early on in the project may be the least stressful time. So, it is the best time to ask for help and learn the skills needed to thrive on your project. By starting, you gain the ability to understand where you went wrong once you ask for help, rather than being confused when your peers try to help you learn.

Things to Avoid

1) Do not ask questions in an attempt to be lazy

Remember that software engineering is a field where you must constantly be learning. If you are lazy and do not want to work, you will not learn. Without tackling challenges by yourself first, you will not pick up on the skills that will help you become successful in the field.

2) Do not rush your peer for an answer

Remember that your peers may be learning this for the first time as well. Be patient as they devote their own time to provide you the assistance you may need. Everyone is learning and trying their best, so do not let the stress of the situation manifest into uncooperative actions.

Summary

In short, navigating the challenges of a new environment, especially in software engineering, demands a proactive approach when seeking help. It is important to recognize that asking for help is a strength, not a weakness, and a learning process for all parties involved. It is a chance to foster patience and collaboration, which will ensure will ensure the most optimal growth and success

Conflict Resolution

Working effectively in a team setting is a crucial yet often overlooked aspect of software engineering. Conflicts can arise in any team, and how they are resolved can have a significant impact on the team’s success. Effective conflict resolution fosters a collaborative and supportive team environment where everyone’s contributions are valued, and disagreements are handled constructively.

Avoiding Conflicts

An important first step towards conflict resolution is learning how to avoid them in the first place. This article details possible steps to avoid many common conflicts that arise in a team setting, including managing expectations by setting clear goals and proper training, and maintaining healthy lines of communication between team members.

Resolving Conflicts

It is not always possible to avoid conflict. In work environment when people are exchanging ideas and working towards goals, a difference of opinion is inevitable. However, if handled properly, these conflicts can be resolved while keeping the negative impacts at a minimum, and even help create a better solution for the project at hand. This article covers ways that the parties in a conflict can help each other understand their own points of view, while keeping discourse respectful. It emphasizes ways that team members can help each other work towards a common goal.

Handling Non-responsive Team Members

Handling a non-responsive and unmotivated team member in software engineering can be especially challenging due to the importance of collaboration and communication in the development process. There are several steps that can be taken to increase the chances of the conflict being resolved peacefully:

  1. First, the team leader or manager should schedule a meeting with the team member to discuss their concerns and understand the root cause of their lack of motivation. It could be due to a variety of factors such as workload, personal issues or lack of interest in the project.
  2. Once the root cause is identified, the leader should work with the team member to develop a plan to improve their performance, such as redefining their role, providing training or mentorship or reassigning tasks.
  3. Additionally, the team leader can try to increase the team member’s motivation by setting clear goals and providing feedback, recognition and incentives for their contributions.

However, if the team member continues to be non-responsive and unmotivated despite efforts to help them, the leader may need to consider alternative solutions such as disciplinary action or reassignment to a different project or team. This, of course, is the worst-case scenario. And while this should not happen frequently given that all the team members are mature enough to resolve the conflict without getting to this point, it does still occur — both in work placements and school courses.

How to be an Effective Leader

First, let’s start by asking “What does it mean to be an effective leader in the first place?” Being an “effective leader” may mean delivering projects as fast as possible in one situation, but it may mean building a cohesive, trusting team culture in another. It could also mean doing both of these things at the same time, or any number of other things at the same time. Every leader will find themselves in a different situation and what it means to be an effective leader may differ greatly in these various contexts. One of the first steps to being an effective leader is to acknowledge this, and then try to ascertain the best paths towards success, whatever that may look like in your environment. Thus, due to the variableness of what being an “effective leader” can mean, in this guide we simply note some approaches that we believe are widely applicable across a large range of environments. Also, note that we aim our guidance and examples at leadership in the software engineering space, but many of the concepts are naturally applicable outside of this sphere as well.

Be open to feedback, and seek it out

Although we just discussed how different being an effective leader can look from case to case, a staple in almost every effective leader is their openness to feedback and reiteration. As said in a leadership principle from a famous company, “Leaders do not believe their or their team’s body odor smells of perfume”. This means that leaders should not view themselves or their team as perfect and above the need for feedback (smelling like perfume in the example), but should instead stay grounded and open to improvement. Leaders should certainly be prepared to give feedback to the people they work with, but it is just as important to be open to any feedback that comes back. After all, we just discussed how hard it can be to pin down what an “effective leader” looks like in each situation, so why not let the people you lead help you? In fact, we believe that not only should you be open to feedback, but it is something that is worth actively seeking out as it is a leader’s responsibility to not only strive for constant team improvement, but also improvement of themselves and any mechanisms that they employ. One simple way to seek out feedback is to directly ask the people you are working with for it on a regular basis (such as during your weekly check-ins if you have them), but it is important to do so respectfully and in a manner such that the other person feels comfortable speaking their mind.

Acknowledge people’s differences

From our discussion on how being an “effective” leader is different in every situation, part of that is because the people in every situation are different. Every person is unique, with their own strengths, weaknesses, skills, and everything else that they bring to the table. Effective leaders will assess these differences, and try to utilise them in such a way to get the best out of everyone. One way this could manifest is learning what tech stack each person you are working with is most comfortable with, and then assigning them to areas of the project that match their strengths.

Strike a balance between freedom and guidance

Although being a leader naturally entails leadership, guidance, and the like, it is also important to give the people you work with freedom. This allows them to feel a sense of individual control over their work, and will help them to grow and improve within their role which will benefit all parties in the end. Knowing how to strike a balance between giving guidance and giving agency is a key responsibility of an effective leader. For example, a leader would likely define what the product that the client needs is, and what the key requirements are in terms of budget, scope, timeline, etc., but the design and the implementation may be left to the discretion of the employee.

Be there for your team

A responsibility of being a leader that is simple in theory, but very important, is being available to people. As a leader, the people you work with will come to you for a plethora of issues, some relating to technical details, some relating to the higher level project direction, and other completely personal. Leaders need to hear out all of these different kinds of issues, and work to find a solution to the best of their ability. Simply being there is sometimes enough to make the person feel supported, and give them the sense that they can trust you. A common way that effective leaders try to be available amidst their busy schedules is to pre-emptively schedule weekly check-ins with the people they work with. This gives everyone a regular chance to present any issues that they have, and it does not introduce the fear of asking, or the need to be rushed.

Create a comfortable environment

While leaders can and should try to directly impart what they want onto the people they work with, an aspect that is equally important is the environment / culture. Regardless of the specific details of the work, people want to work in an environment that’s comfortable. A comfortable environment often means, among other things, one where people have high morale, and everyone feels that they are able to speak up with ease. If these things are lacking, it can easily reflect in the individual’s results or how well the team is working together. Therefore, effective leaders try to create an environment that allows everyone to thrive. Some ways to build this team culture include: leading by example and exemplifying the traits you want to see, setting ground rules regarding how people should be treated, and holding team outings and events where people can get to know each other and have a good time.

Encourage Personal Development and Recognize Success

Leaders should remember and value the personal development of everyone they work with as it is important to the individuals, and the team also benefits when its constituents improve. Also, people tend to remember who helped and encouraged them to get to where they are, so encouraging personal growth fosters a sense of loyalty and appreciation. In a similar vein, leaders should recognize the successes of the team and individuals, as people enjoy and deserve to feel credited for the effort that they have put in. This also helps the team morale, as well as infuses the idea that their work matters and is appreciated, which often leads to a more motivated and committed team. One method to help recognize the successes of the people you work with is to dedicate some time each week at the end of a meeting to call out any success stories that individuals or the team accomplished in this past week.

Sources with Additional Tips:
https://www.shortcut.com/blog/6-key-skills-for-leading-a-software-team
https://medium.com/the-andela-way/how-to-successfully-lead-a-software-development-team-6b9a6ffcf760
https://www.forbes.com/sites/allbusiness/2023/04/10/how-to-successfully-manage-a-team-of-software-engineers/?sh=789f48b513c3
https://www.shakebugs.com/blog/becoming-great-software-engineering-leader/
https://www.businessnewsdaily.com/4991-effective-leadership-skills.html
https://radixweb.com/blog/building-software-development-team