editione1.0.1
Updated August 7, 2023Once youโve determined who your audience is and how you should approach the conversation, the next thing to be aware of is the channel youโre using to communicate. Whether the conversation takes place in person or through a written form of communication such as chat or email will determine how you approach the conversation.
The first channel weโll dive into is written communication. As a programmer, youโll be reading and commenting on a lot of code reviews throughout your career, and how you communicate your thoughts and ideas in writing can determine how well those ideas are received by your coworkers.
Code reviews are often one of the poorest areas of communication between programmers, which is unfortunate because itโs also one of the most important. Constructive comments from senior developers are one of the best tools to help you become a better programmer because youโre receiving direct feedback on how you can improve your code and your logic. Whether itโs more concise syntax, bringing clarity to your logic, ensuring maintainability, improving performance, or handling edge cases you didnโt think about, the act of having someone else peer review your work will improve your technical skills.
Unfortunately, code reviews can often be intimidating experiences for developers because itโs easy to feel like the reviewer is criticizing the programmer and not their code. The wrong words or the wrong tone can do more harm than you may realize, so itโs important to be cautious of this when reviewing and commenting on anotherโs code. Itโs always best to stick to constructive feedback, and you should never personally attack the programmer for coding a solution a certain way, even if itโs wrong.
There are numerous ways to solve programming problems, and the best solution may not always be apparent to the person assigned to the task. While it may seem easy to disagree with someoneโs code because you believe thereโs a better way to solve the problem, criticizing their thought process or their implementation is the wrong way to go about it.
To build healthy relationships with your coworkers, itโs imperative that you stick to constructive criticism during code reviews. It doesnโt help anyone if your comment that the code is wrong or that itโs inefficient. Instead, explain why their solution is suboptimal and, more importantly, offer advice on how they can improve their code.
Letโs look at examples of two different types of comments you may see during code reviews, and why one is better than the other.
โdonโtโFirst, a bad example: โThis will cause a performance issue. Needs to be fixed.โ
This comment doesnโt help the programmer at all because it doesnโt explain why the code will cause a performance issue, and it doesnโt offer a solution for how to fix the issue. Itโs possible the programmer was lazy when writing their algorithm, but itโs also possible they may not even be aware their code is inefficient. The commenter comes off as abrasive, and the programmer who wrote the code may take their criticism personally, which could lead to indecisiveness and self-consciousness the next time they submit their code for review.
โdoโNow, letโs look at a constructive example: โThis is a critical part of the program and can cause bottlenecks if weโre not careful. Should we consider optimizing this? Maybe try caching the value from the previous iteration, which could save us quite a few database queries.โ
First, itโs less aggressive if you approach the comment as a question, rather than a statement. That way, youโre asking the programmer if they had considered your concerns, and it gives them an easy way to admit they hadnโt thought about that aspect when coding their solution, without trying to embarrass them.
Next, the comment offers a suggestion for how the programmer can improve their solution. Perhaps they were so caught up in getting to a working solution that they completely missed the opportunity to improve the efficiency of their algorithm. That doesnโt necessarily mean theyโre a bad programmer by any means, so donโt make them feel like they are.
Another aspect of this comment is that it avoids using the word โyouโ and replaces it with โweโ and โus.โ By doing so, youโre signaling to the programmer that they are part of a team and that youโre all in this together.
Senior engineers tend to focus more on the success of the team as a whole, rather than just themselves, and itโs the small details like this that go a long way if you want to show that youโre a team player. Try not to single out programmers when offering feedback on their code. Youโre all on the same team, and itโs everyoneโs responsibility to deliver the highest quality code possible. Itโs always better to stress the importance of the team and acknowledge that the code is owned by everyone and not a single person. In doing so, youโll build confidence in your teammates and theyโll take your feedback seriously.
Now letโs look at the next way in which youโll communicate with others through writing, which is in your project management system.
How to Deliver Constructive Feedback in Difficult Situations (productivityhub.org)
How to Review Code as a Junior Developer (medium.com/pinterest-engineering)
Thereโs a good chance your team is using some kind of bug tracking or project management system. These tools help teams plan, organize, and track new features, tech debt, and bugs as tickets make their way through the development process and into production. Ticketing systems can get complicated very quickly with multiple people moving tickets around, creating subtasks, setting deadlines, and marking certain tickets as high priority.
Many programmers seem to despise these tools because they are heavy on process and always seem to get in the way. There are complex workflows, planning meetings, and coming up with arbitrary estimations for ticketsโall of which sometimes feels unnecessary. While it may seem like these tasks take time away from actually writing the code theyโre meant to track, these tools are important for project managers to stay organized and even more important for the management team to track progress on larger projects and to plan out longer-term goals that align with the companyโs strategy.
Given the complexity of these tools, itโs important to make sure youโre communicating clearly on your tickets as you move them through the pipeline. When you create a new ticket, provide as much detail as possible. Donโt assume that other developers on your team will understand where to find the bug, how to reproduce it, or why a certain part of the code should be considered technical debt and needs to be cleaned up.
Software engineers can be lazy now and then; weโve all been there before. Thereโs nothing worse than pulling in a ticket to work on and finding almost no information to go on. There may be a title and a one-sentence description. How do you know how to reproduce the issue if itโs a bug? How do you know if itโs a high-priority feature request from an important customer? How do you know if itโs tech debt thatโs not really an issue but the developer who filed it felt like the code was just a bit messy? Itโs sometimes impossible to know these things when thereโs no information to work off of, and as a developer, itโs frustrating when you are assigned these kinds of tickets.
โdonโtโHereโs an example of a bad ticket:
Type: bug
Title: User audit logs export is broken
Description: (blank)
Acceptance criteria: (blank)
Priority: low
Thereโs almost no information on this ticket! Thereโs no context to work off of when it comes time to plan the next development cycle, except that a bug exists. Itโs not even clear if the bug still exists because thereโs no instructions on how to reproduce it.
Furthermore, itโs possible this particular report is complex, with multiple export settings, and the bug only exists for a specific configuration setting. If you pick up the ticket and try to reproduce this bug, the reportโs export functionality might work fine for you because you donโt have the application in the same state as the person who reported the issue.
Thereโs also no indication of any acceptance criteria, which is a set of predetermined requirements that must be met in order for the product owner to mark the ticket as complete. In other words, how will we know the bug is actually fixed? Itโs important to lay out this information up front, before the development work begins, so there is a clear finish line to know when youโre done. Doing this helps reduce scope creep and keeps the developer focused on solving the original problem instead of making additional unrelated changes in the process.
So, how would you improve this ticket so the issue is clearly communicated?
โdoโLetโs take a look at an improved example.
Type: bug
Title: User audit logs export is broken when selecting CSV format
Description: We are seeing a 500 status code from the server when trying to export the user audit log in the admin portal when selecting the CSV format. XLS format seems to work fine. The following stack trace is getting thrown on the server:
[stack trace snippet]
Steps to reproduce: (1) Log in to the admin portal and go to the Users > Audit log section; (2) Click the export button and select the CSV format; (3) Click download.
Acceptance criteria: I should receive a 200 status code from the server and be able to download the file successfully in the CSV format.
Priority: medium
You can already see that thereโs much more information in this ticket that will help prioritize this work during planning sessions and will help the developer reproduce the bug when they pick up the ticket. The ticket provides a stack trace to help the developer pinpoint exactly where the error is thrown on the server, as well as steps to reproduce the bug. Notice how the description states that the bug happens when exporting in CSV format, which is also helpful. Without that, someone may try to reproduce the bug and be able to successfully download the report in Excel format.
Lastly, the acceptance criteria are clearly defined so the project manager knows exactly what requirements need to be met in order to mark the story as complete. This helps the developer focus on fixing the actual bug rather than optimizing the code or cleaning up a part of the codebase unrelated to the actual bug itself.
Youโll be creating lots of tickets throughout your programming career, so itโs important to build good habits now. While they may seem trivial to you at first, these small details make a big difference. Junior developers tend to overlook this aspect of software development because theyโre focused on writing code. Sure, writing code is important, but keeping information organized in the issue tracking system is another piece to the puzzle when it comes to documenting, planning, and delivering software.
When writing tickets, itโs helpful to think of it as if youโre communicating with someone in the future. Whether youโre communicating with yourself or someone else, your goal should be for whoever picks up the ticket tomorrow, next week, or next year to have all the information they need to work on the task. If they pull up your ticket a month from now and thereโs no information except for a title, thereโs a good chance theyโll just close the ticket and move on to something else because they donโt know enough context to pull it into the next development cycle.
Which brings us to the next pointโclosing tickets. While your version control system acts as a historical record of changes made to your codebase, your project tracking system acts as a historical record of all implemented features, bug fixes, and technical debt that has been paid down over the years. It acts as a paper trail for the work your team has accomplished and also offers insights on how efficient your team was in delivering the work.
Leaving notes and details about each ticket (and updating any relevant documentation) as the work happens allows project managers and new engineers to look back and get important context for why some action was taken on a ticket. A new engineer may find a reference to a ticket number in a git commit or a comment in the codebase that they can pull up and get additional context around why a specific piece of code was written.
Itโs important to add comments and give good reasons when closing tickets, because other people may find that information useful in the future. Sometimes multiple developers will report separate tickets for the same bug, or there may be tickets that overlap in scope. Other times the change may be so low in priority that itโs closed to reduce the clutter during a ticket grooming session. Other times the ticket may not be relevant anymore because the bug has already been fixed or priorities have changed. Regardless of why the ticket is no longer a priority, itโs always a good practice to add a comment giving a reason for why youโre closing the ticket and choosing not to work on it.
Here are a few examples:
โClosing this ticket because it is a duplicate of BUG-394.โ
โClosing this because the issue is no longer reproducible. It looks like it may have been fixed as part of the refactoring done in ENG-1138.โ
โClosing this since it will no longer be needed once we migrate to the new ordersservice.โ
The worst thing you can do is to close a ticket without any context because whoever pulls up that ticket in the future will have no idea why this work was never done. It takes less than a minute to add a one-sentence comment about why youโre closing a ticket, so try to document why youโre doing something when making changes.
And lastly, not everyone will be able to monitor the comments and activity for each individual ticket, so itโs helpful to tag the relevant people when adding your comments. Itโs easier to keep track of ticket activities when you get email or chat notifications when things happen, rather than having to continuously monitor each ticket for new comments or movements in their status.
Following these few tips while working in your project management system may not seem like much, but your manager will appreciate good communication skills, even in asynchronous channels. In general, the more information you can provide, the better, especially when it comes to updating others on the progress of specific tasks in your tracking system. As you work your way towards a senior role, building good habits when working in your project tracking system will let everyone benefit from the knowledge and information you share.
Chat systems have been around for decades and have been adopted by companies of all sizes, from startups to public companies. Theyโve even become valuable tools for open-source projects with the rise of Slack, Microsoft Teams, Discord, and many others. While youโre probably already experienced with chat communications, here are a few things to keep in mind when using them a professional setting. It may be simple and obvious advice, but it goes a long way when exchanging information with others.
Asynchronous
Similar to tickets in your project tracking system, communicating over chat systems is asynchronous in nature. Although chat is much more real time, you may or may not get a response right away. Conversations can happen quickly in group chats, or they can happen over the span of hours or days. If you need an immediate response, consider other channels of communication. If youโre in the office, talking to someone in person is the quickest way to get the answers you need. If youโre working remote, try to get them on a video call or at the very least, a voice call. Recognizing which conversations are best held over chat and which ones are better off in a different channel will help avoid miscommunication and will get you the information you need in a timely manner.
Acknowledge requests
One habit that is good to get into is to simply acknowledge when someone asks you to take a look at something. You may need to ask someone to take a look at your pull request or to review a design document, and itโs sometimes frustrating if you need an answer right away but your request just sits there without any response.
When someone asks you to review something, give a quick response like โTaking a lookโ, โLooking nowโ, or โWill take a look in 15 minutes after this callโ to let them know that you saw their request when you will look at their document. When someone reaches out to have you look at something, itโs usually urgent enough to warrant asking for a review. This small habit lets the other party know that youโre working on it so they arenโt met with complete silence on their end.
Choose the proper channel
Different channels are meant for conversations around different topics. Your company may have a few different channels like #general, #marketing, #engineering, #industry-news, or a #random channel. The larger the company, the larger the audience in each channel, which is why itโs important to respect the channel topic when posting or holding a conversation with someone. Itโs insensitive to hold personal conversations with others in public channels. If possible, try to move those kinds of conversations to a direct message channel with the person youโre talking to.
On the other hand, sometimes itโs best to hold certain conversations in public rather than in a direct message. If itโs an urgent conversation or a discussion about a topic that multiple people should be aware of, then it would be helpful to discuss in a public channel, because it allows others to follow the conversation along with any decisions that are made.
By now, weโre all comfortable communicating over email, so I wonโt get too deep into details here. Similar to communicating over chat, try to determine if email is the right channel for the kind of information youโre trying to communicate. Before sending an email, consider other communication channels and determine if itโs better to ping someone over chat or hop on a video call. Sometimes a 15-minute video call is more efficient and effective than multiple emails back and forth with other people.
Urgency is also another thing to consider and may dictate which communication channel is best. Sometimes itโs best to pick up the phone or hop on a video call to discuss something time-sensitive. Alternatively, if the conversation isnโt time-sensitive, email could be a good asynchronous option.
Regardless, email is still widely used throughout the world, and there are certain conversations where itโs the best option, such as communicating with people outside of your organization. Unfortunately, email conversations tend to be slow, and important points can be easily misinterpreted. Letโs look at a couple of things you can do to improve your communication over email.
Use the subject line to get your point across. Lots of people scan subject lines when theyโre busy or in a hurry, so try to make yours specific and to the point so that someone scanning their inbox will know they need to open your email.
โdonโtโHere are some bad examples of subject lines that are vague and do not convey any useful information.
Subject: sync
Subject: follow up
Subject: (no subject)
Always try to be as specific as possible, while keeping the subject line concise. A good subject line should hook the recipient in and stand out among the clutter of an inbox.
โdoโHere are some examples of good subject lines:
Subject: Compliance presentation sync
Subject: Third-party integration follow-up
Subject: Production incident postmortem
Better subject lines are clear, to the point, and worth the extra few seconds it takes to think of something specific. They go a long way in helping make sure your emails are read and not skipped over by someone skimming an inbox.
Some people get hundreds of emails a day, which leads to email fatigue. When things are moving quickly in the office or when thereโs a time crunch to meet a deadline, not everyone will have the time to read every email they get. People frequently scan emails to look for relevant information, and a good way to guarantee your email doesnโt get read is to send a big wall of text to your recipients.
Keep emails short. The shorter the better. And try to get your point across in the first or second sentence. This helps people that are in a rush and gets them the relevant information they need. Not everyone will read to the end of your emails, so if youโre asking someone a question in the third paragraph, donโt assume they will see it and respond with an answer.
Additionally, a good way to make your emails easier to scan and make your most important information stand out is to use text formatting for your important points.
Use bullet points or numbered lists to make it easy to convey different options or lists.
Use bold fonts to stress importance. The bold lettering will usually be the first thing someone reads, so use it sparingly and only for the most important one or two points youโre trying to make.
If you have to write a long explanation, break it up into multiple paragraphs. Thereโs nothing worse than a huge wall of text, and multiple paragraphs makes it easier to read.
Consider underlining or using font colors to highlight the most important information. If you do this, do it consistently within a single email. Keep in mind that certain colors can be hard to read if they donโt contrast well with the background. And using colors to highlight some text can draw attention away from other parts of the text which may be overlooked.
Use red to highlight disclaimers or risks that are critical for people to know. You can even preface the sentence with โDisclaimer:โ or โImportant:โ in boldface or red to add more impact.
If youโre responding to an email and answering someoneโs questions, highlight your answers in a different color like blue. This makes it easier to differentiate between the original authorโs questions and your answers.
In group emails, if you need to direct a question to a specific person or direct specific people to handle action items, itโs helpful to use @ tags. Itโs usually a good idea to combine these with bold formatting to make sure your requests are seen.
@dave do you still have that infrastructure diagram from last quarter?
@allison can you coordinate with marketing on a release date?
When someone sees youโve tagged their name, youโre more likely to drive action or get a response from them, but as always, use them sparingly otherwise they lose their effectiveness.
Whatever you do, do not send the email immediately after you finish writing. Thereโs no undo once you hit send, so taking a few minutes to proofread your email could save you from embarrassment in the future.
Sending emails with grammatical errors can actually hurt how people perceive you and how much they trust your opinions, so itโs crucial to catch any mistakes before hitting send. There are tools, such as Grammarly, that can highlight grammar mistakes in real time and help you catch simple mistakes and clarify your writing.
Even if youโre using tools to help catch errors, you should still proofread your own writing. Reread your email, and then reread it again. Try to combine or remove sentences completely in order to shorten the email to just the necessary information. Only after youโve proofread your email multiple times should you hit send.
Now that weโve covered some things you can do to improve your written communication, letโs look at verbal communication.
Speaking in front of a group of people can be very uncomfortable, especially for programmers. In fact, public speaking is one of the most common and stress-inducing fears there is, regardless of which profession youโre in. Almost all people experience anxiety before they have to speak to an audience, so youโre not alone if your nerves get the best of you.
While you may never need to speak in front of your entire company, you may find yourself in one-on-one conversations, team meetings, or larger all-hands meetings where youโre asked to speak on a certain topic. Improving your public speaking skills has many benefits and will help you be more effective at your job.
Letโs take a look at some things you can do to improve your speaking skills, whether youโre talking to one person, a small group of people, or a large audience.