Avoiding Anti-patterns
Last modified on Fri 29 Mar 2024

We have encountered various practices over the years—some good and some not so great. This chapter will delve into some common antipatterns, provide examples, and better understanding of why certain practices are not ideal and how we can improve them. By doing so, we aim to equip ourselves with better decision-making skills and enhance our ability to identify and avoid ineffective practices in the future.

Time management

Filling out those daily timesheets might feel like a drag, but it's actually quite important, especially in a large company like Infinum with many clients. Keeping good track of our time benefits everyone in a few key ways. Logging our hours ensures clients are only charged for the work we actually do. Tracking our time helps everyone see how projects are progressing. If things are taking longer than expected, we can adjust and avoid any nasty surprises later.

Imagine you haven't been keeping track of your time on a big project for a whole week. This might make it seem like everything's going great to the client, the project manager, and even your teammates. But what if it's not? If you wait to log your time all at once, it can hide any problems you might be facing. This can make it tough to catch up and meet deadlines. The project manager might not know you need help if they don't see how much time you're spending on things. This can lead to everyone being overloaded with work. Also, if you don’t log your work for a week, it will be hard to remember what you did, when, and how much time you spent.

The solution is simple: track your time each day. This way, any issues can be spotted early on. By letting everyone know what's going on, we can adjust tasks or talk to the client about any potential delays. Keeping everyone informed builds trust and makes it easier to collaborate as a team.

Remember, tracking our time isn't just about following the rules. It's about working together to ensure our projects run smoothly and our clients are happy. We're all in this together!

Updating tickets

When working on projects for clients, it's essential to manage time and keep tickets updated. Clients are often involved in our projects and need to be kept informed about progress.

For instance, let's say you're working on a large feature. In such a case, creating a ticket and dividing the work into smaller sub-tasks is always best. This way, you can track your progress and keep everyone in the loop. By breaking down the work into smaller tasks, you can avoid scenarios where a client or a project manager thinks that no work has been done on a feature for a week, even though time has been logged. If you put yourself in the project manager's position, you can determine what information you would like to receive if you were not a developer. This way, you can ensure that you provide relevant and informative updates.

Tickets time entries

Logging your work on individual tickets can benefit you, the client, and the company in the long run. By logging your work on each ticket, you can better understand how much time you have spent on that specific task. This knowledge can help you measure your progress over time and provide insights into your productivity levels. Furthermore, when you get a similar feature or task in the future, you can use the previously logged hours as a baseline to provide more accurate estimates.

In addition to individual benefits, project managers can benefit from time logged on tickets. By knowing exactly where the project budget was spent, project managers can provide accurate reports to the client. This level of transparency can also help clients better understand the workflow, leading to better relationships and trust.

Lastly, if you are a client, knowing how much time and effort was spent on your project can provide you with a great deal of transparency about our work. This helps build respect and understanding towards our company, which can lead to better collaboration in the future. Therefore, logging your work on individual tickets can bring numerous benefits, from individual growth to building better relationships with clients.

Knowledge sharing

At Infinum, we place a high value on knowledge sharing and people. Open communication, individual growth, team growth, and better client outcomes are essential. Knowledge sharing also facilitates problem-solving by allowing team members to learn from each other's experiences and expertise. This collective wisdom is invaluable for troubleshooting issues or solving complex problems. Moreover, it increases efficiency by enabling the sharing of best practices, tips, and tricks. This helps team members avoid reinventing the wheel and leverage existing solutions, saving time and effort. When team members freely share their knowledge and expertise, it creates a positive environment that encourages collaboration, innovation, and a sense of belonging.

Furthermore, it helps mitigate risks by spreading awareness of potential pitfalls and providing insights to address them proactively. In conclusion, knowledge sharing is critical for fostering a collaborative and high-performing team environment. It enables developers to work together effectively, learn from each other, and ultimately deliver better results for the project.

You should never be afraid to share something that interests you because you never know what the other person knows/doesn’t know.

Not my job

This is a tricky situation we don't come across often, but we can handle it better when it arises. At Infinum, we place great importance on teamwork and excellent interpersonal communication that promotes growth for everyone involved. Occasionally, you may find yourself in a situation where you're not responsible for a particular task, such as when a client is unhappy with the design, but you're a developer and not accountable for the design aspect. In such cases, you could respond to the client in one of two ways: "This is not my job, ask the designers," or "This is not my area of expertise, but let me talk to our designers and see if we can come up with some alternatives." The second response is preferable for a client because it fosters a better relationship. This applies to all other scenarios as well - if it's not your job, point the person to someone who can assist them since you may find yourself in a similar situation one day. Be empathic and helpful every time.

Not investigating potential solutions before asking for help

As engineers, it is important to embrace the value of self-sufficiency and resourcefulness. Before seeking assistance, it is crucial to thoroughly investigate the problems you are facing. This will allow you to develop your skills, increase your knowledge, and avoid unnecessary complications that could easily be resolved with a simple Google search. It is advisable to follow a few simple guidelines to ensure that you make the most of your time and the time of others.

First, allocate reasonable time to research and experiment with different approaches. Once you have exhausted all possibilities, you can reach out for help clearly and concisely. For example, you could say something like, "Hi, I am attempting to do XYZ and have tried ABC. Unfortunately, I have been unable to achieve the desired results. Could you please assist?"

This approach will ensure that you respect others' time, are efficient and effective in your problem-solving, and are well-positioned to succeed in your endeavors.

Not asking for help

Asking for help can be challenging, especially if you are used to working alone on a project, or you have never had a mentor before joining Infinum. However, keep in mind that there are no stupid questions here, but we encourage you to do your research and try to find answers first.

For instance, if you are working on a ticket and get stuck, it is okay to ask your mentor or colleague for help by presenting what you have done before asking for help. However, spending too much time before asking for help is not great, so try to keep it within reasonable timeframes.

Sometimes, ego can get in the way, and you may feel too proud to ask for help. But remember the saying, "Leave your ego at the door."

Not researching library licenses before adding them to the project

Software developers often rely on open-source libraries and plugins to help them work more efficiently and effectively. These tools can be incredibly helpful in speeding up our work and avoiding the need to reinvent the wheel. However, every library and plugin has its licenses and terms of use that must be carefully reviewed and adhered to.

If you need clarification on a particular license or term of use, please contact our legal team for guidance. They can help you navigate the complex world of open-source licensing and ensure that you're using these tools legally and ethically.

It's also important to keep our clients fully informed about the libraries and plugins we use in their products. By doing so, we can ensure that they're fully aware of any third-party components in their product and can make informed decisions about their use.

Generally, we follow the "MIT rule of thumb." This means that if a library has an MIT license, it's usually safe to use. Of course, reviewing the license and any associated terms of use is essential to ensure you're using the library or plugin correctly. Finally, this rule of thumb applies to other third-party resources, such as custom fonts and images from Google searches.

Rants about legacy code but does nothing about it.

Projects are dynamic entities that change and evolve, much like human beings. The market and clients' needs dictate the direction these projects take. Therefore, the code that underpins these projects must also be adaptable and transformable. However, when working with legacy code, developers often encounter challenges that can impact the development process. Legacy code can extend the time required for a task, exceed the budget, and make the work more complicated.

Therefore, it is imperative to recognize legacy code and assume that someone else will resolve the issue. When you identify opportunities to improve the code, you can categorize them into two categories: quick fixes or refactoring work. If the required fix is fast and you have the time on the ticket, you should address the code. However, if the code needs more significant investments in time and resources, you should inform the project manager and the client and create a ticket in Productive. This way, everyone is aware that something needs attention, and the team can allocate time in the schedule to address the issue.

The Boy Scout Rule is a well-known mantra in the development community: "Leave your code better than you found it." It emphasizes the importance of constantly improving code to ensure that it does not hinder future development efforts.

Afraid to accept ownership over work

It's not uncommon to feel hesitant about taking ownership of your work, especially when things become challenging. However, as an engineer, developing a sense of responsibility towards your work and taking ownership of it is essential. When issues arise, pointing fingers at others can make you look unprofessional and tarnish the company's reputation in front of the client, so working as a team to identify and solve problems is crucial.

Instead of blaming others, strive to improve your engineering and team-player skills. Taking ownership of your work, your colleagues' work, and your project is vital to ensuring that everyone is on the same page and working towards the same goal.

It's essential to understand that clients pay for the work done by the company, not by individual employees. Therefore, they don't care who made a mistake but rather how it affects their business. By taking ownership of your work, you're not only contributing to the success of the project but also improving your professional development. So, let's work together as a team to solve any issues that arise and ensure that we deliver the highest-quality work to our clients.

You don’t communicate with POs/PMs enough

As a member of Infinum's team, it's essential to understand the critical role of Project Managers and Product Owners. They are not just your colleagues but also the representatives who will face clients and Infinum management if something goes wrong on a project. Therefore, it's crucial to support them in their day-to-day work, which involves keeping your tickets updated, communicating effectively with clients, logging your time, and informing them of any potential issues you encounter during the project.

At Infinum, we have various project organization structures, and you may work on one or multiple projects with different PMs/POs. Thus, keeping everyone informed and working together efficiently is essential to deliver quality work. Please note that every project and client is unique, and communicating with your team members is necessary to find the most effective way to organize the workflow.

By working closely with your PMs/POs, you are contributing to the project's success and our clients' overall satisfaction.

Reporting project issues to TL or LE too late

As you work on your project, it's important to remember that your Team Leader (TL) or Lead Engineer (LE) is responsible for ensuring that the code quality is at its highest level. To achieve this, they must be updated on the project's progress. Depending on your team, there are various ways to communicate with your TL or LE, such as a weekly Slack report or one-on-one meeting. These meetings are meant to help you when you face challenges implementing a specific feature or need someone to bounce ideas off. It's perfectly alright to ask for a sanity check from your TL, LE, or any other team member before you start implementing something.

Your LE conducts periodic project reviews to ensure that everything is up to the highest standards and to identify any issues that need to be fixed. They are there to ensure the project is on track and the team is working towards the same objective. So, feel free to ask for help if you need clarification. It's always better to prevent problems than to fix them later. By working with your TL, LE, and team members, you can ensure that your project succeeds and meets the highest standards.

Attending meetings that you are not needed to attend

Have you ever attended a meeting that you felt could have been handled through email? If so, you're not alone. Many people think that meetings can be time-consuming and sometimes unnecessary. To avoid wasting your time in a meeting where you are not needed, it is perfectly acceptable to excuse yourself. You can say, "I'm sorry, but I believe my presence is unnecessary for this meeting. I will be signing off."

It is important to note that having discussions in smaller groups can often be more productive than in larger meetings. If your input is unnecessary or the debate will not benefit you, it's better to excuse yourself and focus on other important tasks. Remember, your time is valuable, and you want to save it on productive meetings.

Not improving work from other colleagues on the project

This anti-pattern is typically oriented to senior members, such as team leads or tech leads, who are responsible for improving the team member's skills and team tech stack. However, as an engineer, one should also take the initiative to help their colleagues by identifying any issues or potential areas for improvement in code or other technical or soft skills. While the LE will primarily focus on educating the team and ensuring the technical stack is up to par, they will also be involved in project review and pull requests. This provides an opportunity for everyone to learn and grow.

Therefore, it is essential to communicate feedback or improvement recommendations to your fellow team members, regardless of their age or experience, respectfully. By doing so, the team can work together to collectively achieve their goals and improve their skills.

Neglecting mentorship and team development

As the lead engineer, you have an important role in the success of your team and the project. Your job is no longer solely focused on the project. Instead, your responsibilities are split between the project and team members. You must dedicate time to working on your team responsibilities, including mentoring, training, and guiding your team members.

Technical knowledge is integral to your team's growth and development. You should use your expertise to help team members improve their skills and knowledge. By doing so, you will not only help your team members grow but also improve the quality of work produced by the team.

You should communicate with your team lead and operations manager to ensure that you can effectively balance your project and team responsibilities. Together, you can schedule work that will address your LE role and help you be a more effective leader.

Inability to balance project work with their leadership and mentoring roles

When you are assigned additional roles or tasks, such as leading a team or project, managing multiple responsibilities can be overwhelming. It's crucial to remember that you are a human being and have a limited amount of time and energy. Therefore, you must prioritize your work schedule accordingly to ensure you are not overburdened.

If you're leading a project, you may be required to manage various tasks, including mentoring, project management, and coding. It's essential to communicate your work schedule with your colleagues, block out focus time in your calendar, and let them know if you cannot fulfill all the project requirements. This can help you avoid unnecessary stress and ensure your work is productive and efficient.

As a team lead or project lead, you should remember that some of your priorities include internal work and leadership tasks. These tasks include managing team meetings, providing feedback to team members, and ensuring the project is on track. Effective communication and prioritization are vital to meeting your work requirements and achieving success in your role.

Multiple communication sources

Working on large projects with multiple team members often involves numerous communication channels, and it can be challenging to keep track of all the decisions made. Establishing a single source of truth for all decisions is crucial to avoid any confusion or complications.

For instance, if you have a ticket on Productive, but the client is more active on Slack, it is important to ensure that all decisions made through Slack regarding the feature are documented on Productive. After making a decision, you should provide a comment on Productive and send the ticket to the client for approval. This ensures that the client has approved the feature or feature changes and makes it easier for other team members to stay updated on the project's progress.

Similarly, during online calls, such as Zoom or Google Meet, it is essential to document any decisions made and confirm them with the client. After the call, you should create a summary in the Productive ticket and send it to the client for approval. This written confirmation will help to avoid any future misunderstandings or conflicts.

While Productive is the tool of choice for Infinum, it is important to ensure a single source of truth, regardless of whether the client uses Jira or any other tool. By establishing a single source of truth, we can ensure that all team members are on the same page and the project progresses smoothly.