[HN Gopher] Ask HN: What tone to use in code review suggestions? ___________________________________________________________________ Ask HN: What tone to use in code review suggestions? When writing suggestions in code reviews I have used all of these forms: * Should we extract this to a separate function? * Could you extract this to a separate function? * I would extract this to a separate function. * This could be extracted to a separate function. * This should be extracted to a separate function. * Extract this to a separate function. As you can see, these have very different tones and I would like to be more consistent and as constructive as possible. Is there some general best practice for this? Are you or your team using a set of rules or guidelines? Author : zorr Score : 213 points Date : 2022-06-24 07:09 UTC (3 days ago) | nailer wrote: | I normally say why - even if they're 'experienced' sometimes | people can sometimes come from, say in this case, cultures where | copypasted code is normal. So say why: | | * "We're repeating this in a few places. Could you extract this | to a separate function? It'll keep the codebase smaller and more | readable, and if we update it, there's only one place we need to | change." | anticensor wrote: | * This shall be extracted to a separate function. | aard wrote: | The tone of a code review suggestion reflects an underlying | assumption about what a code review is (or should be). Often | developers disagree on this point. It seems like we fall into one | of two camps. | | 1. Reviewing code is like proofreading a paper. Suggestions are | welcome, but there isn't an expectation that all suggestions be | followed. The author of the code makes the final decision based | on their objectives. | | 2. A code review is a gate that is closed until all comments have | been fully addressed. The author must comply to the liking of all | who choose to comment, or they are not authorized to continue. | | The tone of review comments will naturally follow from their | understanding. Understanding #1 yields comments aimed at | persuasion. (Should we, Could we, You might consider) While #2 | yields more compulsory language (Change ..., You should). Or | passive aggressive language that is meant to be compulsory but | softened to sound less aggressive (I would, Could you, shouldn't | you). | | It is my opinion that understanding #1 is most appropriate. It | prevents unnecessary bottlenecks and is more respectful or | differing opinions. If developers are peers, than #1 is the | understanding the most accurately reflects that. | racl101 wrote: | Your examples lack a reasoning or explanation as to why code | should be abstracted to a separate function. | | To a senior dev they might not need an explanation to justify the | action of extracting the coded. It could just be oversight. | | But to junior and intermediate you might need to explain the | reasoning for requesting code to be abstracted. | scrapheap wrote: | Personally it all depends on the rest of the comments in the | review, if you use one style all the time then you lose the | ability to indicate which changes are the ones you feel are more | important than others. | | I'd use the more question style comments for the minor changes, | and save the stronger comment style for those changes that are | really important. | | So I'd word a comment about changing a variable name to something | slightly better as a question. e.g. Would accounts be a better | name for this array? | | While a comment addressing a security concern would be a direct | statement. e.g. Use a parameterised query here, as it'll be | harder for someone to exploit. | | One thing to note is that when making the strong statements I | like to back them up with a reason, that way it helps me to think | through the comment itself, helps a more junior developer | understand why they should change it and helps more senior | developers to not take the comment personally. | | The other side to this though is that as senior developers we | need to set an example for our more junior colleagues on how to | take review comments. I always try to take them in a good mood, | make the changes when I agree with them and have a constructive | conversation about those that I don't agree with. | marstall wrote: | I wouldn't personally use any of these, but I'm a bit of a code | review heretic. | | I view (peer) code reviews mostly as an opportunity to discuss | and familiarize your team with your code, and I think they should | conform to the "social rules" that prevail in the rest of the | world. If a peer in the real world was sharing something with me, | I would very rarely command or strongly suggest they change this | or that thing about it. Instead I would strive to create a | collegial atmosphere by being receptive and supportive 90% of the | time so that 10% of the time a suggestion I offered would be | received gratefully and gracefully. | | None of this can happen in a github pull request. | | There was an alternative that I used to see before the PR | monoculture took over that I liked. It could look like a weekly | "code review" in-person meeting where a random developer would | put together a presentation about a new module they'd written and | project it on a wall. Mostly the other devs would listen and | learn, and any suggestions they made would be strictly optional. | The dev might leave feeling a bit embarrassed about something - | but never feel "under the thumb" of a peer who was forcing an | issue. | phyzome wrote: | Some of my coworkers have a convention of prefixing messages with | [request], [suggestion], [question], etc. in order to make the | intent extremely explicit. This is particularly useful if you | have people coming from multiple cultures with different levels | of forthrightness. | cs137 wrote: | I like, "I would extract this to a separate function." | | Unless you're asking a question, posing it as a question comes | off as passive-aggressive, even if it's not what you intended. A | simple declarative statement of, "I would do it this way", is | probably best. You don't know why he did it the other way, and he | might have had a very good reason (for example, to be sure the | subroutine would be inlined). | | The best tone to use is one that is neutral and efficient; prefer | active voice but avoid imperative mood unless you're 100% sure | you're right, in which case it's usually fine. | | It probably goes without saying, but you should assume the change | was made in good faith. It's possible that the other programmer | hasn't seen before what you consider to be good practices; it's | also possible that she's great at her job but just made a | mistake. It's also possible that you're wrong. So, for this | reason, it's always best to be conservative with tone and stay as | factual as you can. | AdrianB1 wrote: | Tone: if you write, cultural differences will always remove any | tone; the subtleties will be lost in translation. If you talk to | the people, the tone of the voice and the body language is more | important than the words. | cdnsteve wrote: | I feel like this is a problem ML could solve for assisted | feedback focused on positive tone, ml models scans your response | and offers suggestions on phrasing. | balves wrote: | I think the only correct answer is "it depends" | | It depends on the relationship with the person who's code you are | reviewing, it depends on the relative seniority differences, it | depends on the project, it depends on the rest of the team | culture, it depends on the rest of the company culture, it | depends on how long you've had a working relationship with this | person, it depends on who else might see the review. | | I've had working relationships with people where it was | beneficial/easier to be super curt and to the point, because | there was sufficient 2-sided trust that best interests were at | heart. I've had working relationships where I had to take having | "open-ended genuine curiosity" to the extreme because of fear of | feelings being hurt. | | That being said, by default I take a question-asking tone to the | code review process, with the intention of possibly learning | something. It opens up the door to "being wrong" and allowing | things to progress without incessant arguing. There are times | when this approach isn't appropriate, but I think it's a | reasonable default. Again, it depends. | aristofun wrote: | I wouldn't be happy working in the team where people constantly | consider #6 as rudeness. | | This looks so unproductive and unprofessional to care too much | about the tone vs content in programming business. | marcinzm wrote: | That's fair if you have the same stance for all social | interactions. If you don't then it's odd since nothing about | programming makes people less human and less impacted by the | usual social considerations. Although even if that is your | stance for everything it's likely not the stance of everyone on | the team. | izacus wrote: | I've seen people hurt by 1-4 versions though - it's not clear | for a lot of people (especially non-native speakers) that | those questions coming from Americans actually represent a | veiled command shrouded in faux politeness. | | I've seen junior devs from other countries get into trouble | because they ignored these kind of "questions" since they | actually thought they were optional questions and not | expectations by other developers. | swagtricker wrote: | People can go ahead mod me down for this, but I honestly don't | care at this point. Here's the best ways to avoid this: | | 1.) Quit doing PRs for feedback. Start doing pair or mob | programming. Bonus points if you ditch PRs completely and do | https://trunkbaseddevelopment.com/ instead while you're at it. | Asynchronous code review via PRs is waste (in the Lean sense). | 2.) If you still want PRs despite pairing & mobbing (or you're | about to tell me you've never done it, you're team won't and/or | whatever insert lame excuse here as to slam/dismiss it without | trying), spend a faster 5 min via screen share and audio AND | CAMERA! Do the PR like an old skool code review session | live/remote + camera, but have the author ANNOTATE for their own | notes what you've reviewed when they go back to revise. 80% of | human communication is non-verbal - interact w/ voice & camera. | Help them learn & build confidence, then you won't worry about | your writing tone. 3.) | withinboredom wrote: | I feel like this is often overlooked. | | One morning, I did a code review before having any coffee. I | basically used the latter two throughout the whole thing. I came | into the office to find my coworker literally crying. Later in | the day, someone else said it was the best code review they'd | ever read... and asked me to come to their team... | | There was so much drama from that code review. That code got | merged as-is to appease the author without a single one of my | statements addressed (including security considerations), and no | one else would review it. My manager was in a tight spot, felt | sorry for him. | | I was literally just my pre-coffee blunt self. I usually use the | first few versions in your list, which is probably why it hit my | coworker so hard. We chatted and made up, but our relationship | was weird after that. | | So, I'd say, just be consistent. Changing tones unexpectedly | might affect your coworkers and politics in interesting ways that | you might not expect. | rjdamore wrote: | People are sensitive. Directness is underappreciated. Inability | to take critique is killing code quality. Try going to an art | school. Critique is how we get better. Check your ego at the | door and you'll go far as a programmer | 59nadir wrote: | > I was literally just my pre-coffee blunt self. | | I have a co-worker who's socially retarded as well and I can | say that the vast majority of his comments that tend to rub | people the wrong way are just badly phrased versions of | legitimate opinions (that he sometimes should just keep to | himself because no one asked). He's a better reviewer than you | seem to be, though; probably because he can take the time to | type out better versions of things he'd normally just blurt | out. | | Edited to add: | | It's a massive chore to have a teammate that causes stuff like | this and I don't envy your teammates or lead (even worse if | you're the lead, obviously). | withinboredom wrote: | Considering this story is over a decade old, and I was in my | late teens ... I'd hope that I've grown quite a bit even | though you're using the present tense like you know me. | fknorangesite wrote: | The way you told the story it comes off as much more | recent. | | > I'd hope that I've grown quite a bit | | I hope so too, because "I hadn't had my coffee yet har har" | is a pretty thin excuse. | withinboredom wrote: | > because "I hadn't had my coffee yet har har" is a | pretty thin excuse. | | I'm pretty blunt/rude in the mornings, within half an | hour of waking up, even these days. Back then, I did not | know that about myself -- or rather, just how rude I came | across. | | Most people I interact with never see me like that, but | it generally takes me 10-15 minutes to get some coffee | going. Hence why I said "before coffee" since I assume | nearly everyone is a little weird within the first 30 | minutes of waking up, which also tends to be before a | morning coffee. | | People who wake up "ready to go" seem to be pretty rare. | Granted, my number of people I've had the opportunity to | be around when they wake up is only a few hundred people | (basic training, etc). | daveevad wrote: | > socially retarded | | I used this term all the time growing up and I'm trying to | stop because it's definitely offensive to some people. Have a | good day. | rjdamore wrote: | That's retarded | tayo42 wrote: | Crying? Did you leave some Linus Torvalds level feedback, like | tell them to find a new career or something? | ianmcgowan wrote: | You sound like a Dutch person. Working with different cultures | I've had to adapt to varying levels of directness but like to | think it's helped me become more up-front. I've learned to | appreciate people that say what they're thinking, so you can | avoid the 2nd and 3rd order analysis about intent and thoughts | about how other people will receive things. | withinboredom wrote: | Is it ironic I moved to the Netherlands and feel right at | home here? (this story is from when I lived in the US) | comprev wrote: | I found the Dutch directness a breath of fresh air when | working in NL. | mythrwy wrote: | Wow not excusing hurting people's feelings, but if you are | literally crying you have become too identified with your code | and possibly your job. Or else, you just cry too easily and | that's a problem when working with others also. | dominotw wrote: | Is this person working on his own. Why can't people pair and | give each other at the moment feedback vs doing code review. | | Person is already invested in his code by PR review time and | doesn't really want to do PR ping pong for their task. What if | you come back with more comments after they address your | comments. Will they ever get to finish their task or forever be | hostage to you subjective comments. | | Most of it is usually subjective too. you had to explicitly | mention 'security issues' which imply that you have a feeling | that most of your pr comments were your subjective | interpretation . | | People are more open to suggestions during pair programming | because people don't deliver feedback in cutting way ( with or | without coffee) and its easy for get a common understanding and | move forward. | withinboredom wrote: | > Why can't people pair and give each other at the moment | feedback vs doing code review. | | That was something we discussed at various points. We never | tried it when I worked there. | | > you had to explicitly mention 'security issues' which imply | that you have a feeling that most of your pr comments were | your subjective interpretation . | | Aren't almost all code review comments? I can't think of a | single one except ones that point out literal bugs. Most are | "do it this way because I think it will be more maintainable" | or "do it this way because that is how we do it here." In | this case, I mentioned "security issues" because they were | literal bugs that introduced new attack surfaces that didn't | previously exist. When I read comments on my code, I make | sure to read it without any inflection. Some people have | really bizarre code review styles, and some are totally | straightforward. Some people are lenient on whether or not | there actually needs to be a change, while some people will | not accept code until changes are made, no matter how little | the change request is. | | Knowing your reviewer is about as important as how you review | code, which is why I suggested being consistent. If you're | always straightforward, and then suddenly not, the reviewee | is going to wonder if something is going on. Vice-versa, if | you're suddenly straightforward, people are going to be | offended or feel like you are taking something out on them. | In my case, reviewing code within 3 minutes of waking up was | a terrible idea and I have never done it since because I'm | "grumpy-mc-grumpy-pants" for at least 10-15 minutes after | waking up and having some coffee. | | I feel like a lot of the conversation in this thread is about | how to review code, but the relationship between the reviewee | and the reviewer is more important than any of that and how | you review code _will_ affect that relationship whether you | want it to or not. | muzani wrote: | Yeah, I think code reviews strike deep for whatever reason. I | don't think being blunt works here even if you can be blunt | elsewhere. | dyingkneepad wrote: | The different ways you're expressing the question give different | meanings to your review. It's not clear to me what you want: are | you blocking the review on extracting the code? Does this have to | be done now or could this be on a separate patch? After or before | the series? Is there an actual good reason to extract it (like | you plan on using it tomorrow) or is this just about making the | code easier to read? | | - Try to make this not personal (opposite of how I started the | paragraph above!). Talk about the code, not about what the author | did. The code does this, the code does that, instead of you wrote | this, you wrote that. Also, it's our code, so "we should do this" | instead of "you should do that" in case you can't use "the code | should do that". | | - Be clear on what's just nice-to-have and what is really | blocking the review process. | | - Explain to them why you think this should be extracted to a | separate function. Maybe they have a good reason against it or a | good counter argument. | graton wrote: | For code reviews we try to automate as much of the nit-picky | things as possible. So for example in our Python code we run | checks using: black, isort, flake8, mypy, and pylint. For | reviewing. I try not to use the word "you" as I feel it can make | people feel defensive. So for your options above I would like: | | Should this be extracted into a separate function? | | As a code reviewer I may think it is obvious that it should be in | a separate function or something else that seems obvious. But | often times the author has already tried that and had issues with | doing that. Thus they did it the way it is because of that. | pclmulqdq wrote: | What do you mean to say when you want to review code? | | Personally, I have roughly three distinct levels of things that I | comment on in code reviews: | | 1. Does not need response, but is my personal opinion about how | the code probably would look nicer. In this case, I would do #2. | If you just say "no," that's fine. I can revisit the issue later. | Some people think these comments don't actually belong in a code | review, and I think it depends a lot on your relationship with | the code and the person asking for review. | | 2. Needs response, but is potentially open for discussion instead | of a change to the code. I would do #4 here. | | 3. You must make this change or I will not accept. I would | personally do #6. There is no need to use "non-confrontational" | language with many people when you mean to be confrontational. | There is a hard line about what you will and won't accept. If it | is a major comment, you need to explain your rationale here out | of courtesy to the person sending you code. | | Most things that fall into the third category are around code | style conventions and minor bugs. More substantive changes, like | changes to an architecture, often fall into the second category. | | Edit: Also, when I nitpick your code for one reason or another | (which generally only happens when I am enforcing a company style | guide), I will often say "Nit:" and then use the sixth style. If | you are new to the team, I will quote the guide to you. Most | people don't feel so bad about the nitpicks when you admit that | you are nitpicking, and that it is for a reason. | camgunz wrote: | Yeah I agree w/ you. I think there are three major problems w/ | code review: | | - reviewer ego | | - author ego | | - reviewer ambiguity | | "Solving" ego is involved, but easy: you have to encourage | trust amongst your team, and that can't happen in code review-- | it's too late. | | Reviewer ambiguity (being non-confrontational and wishy-washy | when you really mean "this is an XSS vuln, you gotta change | it") is an attempt to solve ego, but always fails. | | I'm not saying be a jerk, you have to act with compassion and | empathy always, which is a marathon and not a sprint. But | you're not gonna fix ego/trust/respect issues at code review | time, no matter how deferential you are. | mynameisvlad wrote: | > Edit: Also, when I nitpick your code for one reason or | another (which generally only happens when I am enforcing a | company style guide), I will often say "Nit:" and then use the | sixth style. If you are new to the team, I will quote the guide | to you. Most people don't feel so bad about the nitpicks when | you admit that you are nitpicking, and that it is for a reason. | | This. We do it on our team as well. Especially when it is | smaller things like spelling, indentation, etc, I might have | quite a few nits in one PR, so it makes it a little bit easier | on the receiving end when you see a dozen comments but they're | all marked as nit. | 3minus1 wrote: | +1 to the comment about using "nit:". I also don't think it's | fair to block code changes for style/quality/whatever that is | the same or better then the existing code base. If it's not | making the existing codebase worse on average than don't block. | exac wrote: | I prefix my nitpicks with the same, but with the 3rd style. | amalcon wrote: | My usual approach is to point out the problem I'm trying to solve | rather than suggest a specific solution. I also like to phrase as | a question about practicality. Sometimes the answer to that | question is "No", and I want to make sure that even someone very | junior is comfortable giving me that answer. | | - This code looks pretty similar to this other code; is there a | way it can be deduplicated? | | - I don't understand this code; I think it's because there are | too many conceptual steps. Is there some way to structure it for | better readability? | | - Is there a way to unit test this specific behavior? | | Sometimes this style doesn't work (e.g. correcting a comment that | has become incorrect due to the change), and in those cases I | usually just say "Please do this." I also try to point out things | I _like_ when they are present. | kevin_nisbet wrote: | There's definitely a lot to good code reviews. One addition | perspective I've started taking that I haven't seen so far in the | comments is a "Have you considered this alternative approach type | question". And to describe the alternative, show it, etc. And | this ensures there is an option to basically reject the | suggestion, a valid response is I've considered and rejected that | idea or approach. | weitzj wrote: | Should we, | | Could we please | MichaelMoser123 wrote: | Smatbear has a great article on code reviews | https://smartbear.com/blog/avoiding-the-politics-of-code-rev... | | He has the following suggestions: - "Ensure | that reviews are two-way. Never have people who only review and | people who only get reviewed." - "Always focus on the | code and not the person who wrote the code." - "Make the | reviews small, frequent, and informal. Marathon group sessions in | rooms make people defensive." - "Frame things as | questions and suggestions rather than orders and accusations. Ask | that others do the same." - "Automate as many checks as | possible so that reviews don't focus on simple details." | - You can frame the review as optional "asking for advice" | instead of a gatekeeper approach of "getting the code approved" | - Says that the potential harm of the bad approach is worse than | taking up the risks, that is taking the risks that come with the | policy of not requiring a code review for each and every commit. | hedora wrote: | It depends on who the corworker is, how well I know them and how | long the review is. My comments range from very polite to "???" | "delete this" or "don't copy paste this". | | Once I have worked with someone for a while (and perhaps have | gone out for beers / coffee a few times), I write shorter | comments. | | At that point, they've usually figured out that I mean well, but | am blunt. | | For new hires, I spend a lot more time spent on "why" and tone. | | If my team set guidelines for this, that'd be a strong signal of | much, much deeper dysfunction and I'd consider switching jobs. | no-dr-onboard wrote: | I do code reviews as the meat of my job and have personally | benefited from GitLab's handbook article on this topic [1] | - No ego (Don't defend a point to win an argument or double-down | on a mistake.) - Assume positive intent (If a | message feels like a slight, assume positive intent while asking | for clarification.) - Get to know each other | (Building a rapport enables trust.) - Say thanks | (Taking every opportunity to share praise creates a climate where | feedback is viewed as a gift rather than an attack.) | - Kindness (It costs nothing to be kind, even if you do not | believe someone deserves it.) - It's impossible to | know everything (You can't know how your words are interpreted | without asking.) - Short toes (GitLab is a place | where others can feel comfortable with others contributing to | their domains of expertise.) | | Specific to your situation, I'd focus on what others have said as | well. If they *need* to perform something as part of their job | role, remove the suggestion and place an imperative. Ex: "This | needs to be a separate function" vs "You should. . .". | | > Communicate assuming others have low context. We provide as | much context as possible to avoid confusion. | | It also helps to provide context, especially if you have a | particular fix in mind. "See this PR/MR for someone who | encountered a similar situation recently." | | Hope this helps. | | 1. https://about.gitlab.com/company/culture/all- | remote/effectiv... | EVa5I7bHFq9mnYK wrote: | Trying to never use the word "you", it seems a bit aggressive. | Using "we" or "one" instead, or rephrasing to get rid of pronouns | completely. | presidentender wrote: | I like "Consider extracting this to a separate function." | b0sk wrote: | second! | hcarvalhoalves wrote: | My rules for reviews (which influence the language used) are: | | * Criticise the code, not the author ("There's a bug here" vs. | "You inserted a bug here"); | | * Reach common agreement that people shouldn't cling to code | written ("sunk cost fallacy"). Code is liability, and it's okay | to throw things away and restart from scratch, the value is in | the learning; | | * Don't use questions that invite discussion if you're not | inviting a discussion, instead expose the reason you believe | something should be different ("Should this be like X?" vs. "I | think this should be like X for reasons A, B, C."). This avoids | wasting time and reviews that turn into long discussions. | | * Don't give orders ("Do this", "Do that") to your colleagues, | since they are not your employees, and it doesn't help promote | learning & growth by not exposing the reasoning behind the | demand; | | * Avoid bike-shedding about style/formatting/etc. If this is | important where you work, automate with tools; | | * Agree previously on what constitutes a non-passable review, if | there's such a process. | thewebcount wrote: | > Avoid bike-shedding about style/formatting/etc. If this is | important where you work, automate with tools; | | I'd love some suggestions for how to get people to avoid this | type of bike-shedding. While I'd love for us to use some tools | to automate this, we have a huge codebase with existing code | that doesn't follow the rules, and it's not in my ability to | implement said tools. (Big company, lots of overhead, will | affect a lot of people, don't have a lot of time, not my | department, etc.) | | One of the things I hate is having a different comment for | every single place where I misplaced a star or ampersand. My | natural tendency is to do it one way, but our style guidelines | prefer it the other way, so it's something I miss frequently. | Having 30 comments in a review that are all "move the star to | the other side" over and over again just makes me hate the | reviewer. (Particularly if they don't provide any useful | feedback.) A single comment on the first one that says | something like, "This doesn't match the style guidelines, and I | see several others that don't match. Please fix them all," | would be highly preferable. And if, god forbid, I miss one, | just get over it. It can be fixed later. It's not nearly as | important as having correct functionality in our app, and I'm | pretty busy! | woojoo666 wrote: | Set up the linters to only lint code that was changed. This | way legacy code doesn't need to be fixed all at once, but | will slowly get fixed over time | isbvhodnvemrwvn wrote: | Are you sure it's not in your ability? Whenever I introduced | something like that people were in general indifferent-to- | happy, as long as you did the majority of the job and they | could somewhat easily run those tools (e.g. anything written | in Java is more or less a lost cause because people cling to | their IDEs) | 0xffff2 wrote: | Sorry, but formatting is on you. If you don't like the | comments, don't commit inconsistent code. Set up a local | auto-formatter with the right rules. If enough of the | existing code you're working on doesn't conform, set the | formatter to only run manually and get in the habit of | running it before committing. | physicsguy wrote: | Tools are easy. You add it to the CI/CD pipeline, it fails if | it doesn't meet the guideline, people have to run the tool to | get the merge in. On first run it's painful, so if you're not | starting a project, use an autoformatter so it's not all | manual work. If you really want, you can even make your CI | pipeline push commits with autofixes | | Of course if you don't have a CI pipeline that's easy to | integrate steps like this, you've got major issues to deal | with elsewhere... | de6u99er wrote: | That's good advice! | notyourwork wrote: | I agree in general, though I find the second on clinging to | code difficult when people counter with timelines. It can be | difficult to express to juniors how to reason about taking a | bit more time to do it "right". | Morgawr wrote: | > * Don't give orders ("Do this", "Do that") to your | colleagues, since they are not your employees, and it doesn't | help promote learning & growth by not exposing the reasoning | behind the demand; | | I think this depends a lot. I do "readability" reviews at my | company to make sure people apply good coding standards and | adhere to the coding guidelines that we have. A lot of these | are very "mechanical" in nature and when I am reviewing changes | that have obvious coding standard mistakes I will write | comments like a "linter" would. One of the most common | examples: | | > Use descriptive ("Uses") rather than imperative ("Use") style | for function docstrings. See: <url-explaining-docstring- | guidelines> | | I think this type of "giving orders" in reviews is fine as long | as it's clear this is an obvious misuse/misunderstanding/miss | of the readability guidelines. For any other kind of comment | I'll phrase it differently ("Is there a reason why you did X? I | think doing Y might be more appropriate because <reasons>, what | do you think?", etc) but for stuff that linter should've caught | I don't think it's necessary to be verbose and "sweeten" the | comments too much. | theycallmemorty wrote: | Is this work you're collaborating on together (as peers) or work | you're supervising? Are you in any sort of relationship where you | could be considered to be 'mentoring' the developer? | | When collaborating, I like to provide my feedback in a way that | allows the person to provide their own perspective. | | "What do you think about moving this to a separate function so | that we can keep each functions in the class small and focused on | one specific purpose?" | | When supervising you of course want to allow two-way- | communication but you can be more direct, but make sure to use | the correction as a teaching moment. | | "Please move this block to a separate function so that we keep | the functions in the class small and focused on their one | specific purpose. See abc.js and xyz.js for good examples of | classes that follow this pattern." | ilrwbwrkhv wrote: | Consider extracting this to a separate function. | kelseyfrog wrote: | After reviewing my last few code review comments, this is my | most frequent phrasing too. I get that questions are a way to | soften the bluntness of a code review comment, but I've been | hugged to death by this sort of niceness in the past. It was | not fun. | | "Consider ______" has the directness I, myself, enjoy, and | whose response can take the form of a change, a reply, or a | jumping off point for discussion. It indicates some action | needs to take place without specifying exactly which one and | leaves me open to having my mind changed if the response is | "I've considered it and actually ..." | | Still, if there is ever a flaw so great that the code simply | will not work without a fix, I will phrase the fix in the form | of a command. | m3Lith wrote: | A bit related - do you ever go from PR comments to DMs? Sometimes | when discussions are needed, it feels much easier to just chat 1 | on 1. Especially if it's a small team and everyone's close. | Though that prevents others from experiencing the "interaction". | JamesSwift wrote: | If its not just asking for clarification on a comment then I | really try to stick to the PR, so that the context is captured. | If a back and forth is needed then I make sure to include a | recap somewhere in the PR. | ysavir wrote: | Remember to be _problem oriented_ rather than _solution | oriented_. If you just tell people "I think this should be the | solution" or "you should change it to this solution", you aren't | working with them, you're instructing them. And a key to | teamwork, especially reviewing, is a cooperative spirit, not an | instructional one. | | If instead of saying what you would do, or what you think they | should do, you express a concern about the code, the tone is | completely different. Now it's just saying something like "do you | think repeating this across files will be problematic?", which | allows the other person to be the determiner. If they agree they | may well do exactly what you would have suggested, and if they | don't, it can start a discussion that helps bridge together how | various team members code. It's win/win. | | It also helps people understand what you aim for when writing | code, which helps them keep in mind your needs in the future (and | vice-versa for you to keep in mind their needs). | quelltext wrote: | > "do you think repeating this across files will be | problematic?" | | If you write that you clearly think it's problematic but hide | it behind an unnatural question. Then either I do what you hint | at or you will push / discuss until I agree. I am not the | determiner. It sounds like you are schooling me with an awkward | back and forth. | | Honestly, to me this is beating around the bush and doesn't | actually make me confident we can have a real discussion (in | the context of that code review). | | "Do you perhaps think that doing this <tylically discouraged | coding practice> is problematic?" sounds like either you _want_ | to passively insult me, or you don 't consider me a peer with | whom to have an actual discussion on equal footing, or you | don't have the guts to share your opinion without contortions. | ysavir wrote: | The wording above could be improved for sure. But the | intention is to shift focus away from telling somehow how to | solve a problem to forming consensus on whether there's a | problem at all. And that starts with the reviewer expressing | a concern rather than immediately providing a solution. "Is a | change needed?" should come before "this is a needed change". | | A better example might be "I'm seeing this same code in | various places--do we benefit from keeping them distinct?" or | "you took an inheritance approach here, but I'm concerned | about the long-term impacts as the codebase changes. How do | you think this code compares with a composition approach?". | | If in doing so you would think that I'm being sly, that's | unfortunate, but there's not much I can do in how you | interpret stuff. I can't control for others assuming bad | faith. And if there's bad faith, there are probably | communication and/or trust problems amongst the team members | that are broader than code reviews, and is something that | should be tackled directly. | EuanReid wrote: | Obviously tone is hard in text, and it's worse in multilingual | teams. What's been very effective for my current team is adding | explicit context as a comment prefix with standardised terms: - | Nit for "it doesn't actually matter" - Suggestion for "this | approach might be better, what do you think?" - Question for | "help me understand this" - Requested Change for "this is | actually a blocker" | | We include this expectation in our working agreement, stick to it | rigorously for reviews where reviewer and reviewee haven't | established a strong rapport yet, and use it as appropriate | beyond that. So far we've had no confusion about tone in reviews. | agentultra wrote: | I think it depends on your teams' expectations for code review. | It seems like perhaps your team doesn't define what is | acceptable/constructive/valued, etc from reviewers. | | Personally I prefer the first one on this list: it gives the | author the opportunity to refuse the suggestion. Perhaps its a | frivolous request and the PR is already been open for far too | long. Maybe the author would prefer to leave the duplication | there until there's more justification for extracting it to a | function. Who can say? | | Not all feedback is necessarily good or useful. | | Personally I don't bother with suggestions like this where it's | more of a style preference unless there is a style guide to | adhere to where "extracting this to a function" would clearly | connect to a guideline. | | I tend to focus on verifying the that the author did their | homework: what evidence/proof did they submit that ensures me the | change is correct wrt. specs/requirements/tasks? If that | evidence/proof is sufficient that's all I care about: it makes it | easier to manage a higher volume of review requests. | | I have a pet peeve for suggestions that are "trivial" and based | on, "well I would have written it this way," as I don't find them | terribly useful most of the time. They rarely affect the | specification of the program and their claims to | readability/maintainability are often dubious and superficial. | Bike shedding is a huge waste of time in the review process. At | least when worded with, "Should we..." there's a chance for the | author to explain whether they had already considered that or | accept the suggestion as helpful and make the change. | radus wrote: | "Please extract this to a separate function" | DonHopkins wrote: | "Don't repeat yourself (DRY)." | Tade0 wrote: | I've learned that commands not phrased as such usually aggravate | people the most - especially #1 from your list or questions where | the one questioning knows the answer and wants to suggest | something. | | If I don't know how to phrase my comments I just schedule a call | and we go over the code together. Much less time spent than on | comment ping-pong. | | If the code generally works, but other aspects, like | maintainability, would benefit from some rework I use the phrase | "You can...", e.g. "The second argument to the `map` callback is | the element index. You can use it to create this range instead of | using an external variable incremented on each step." | | The recipient has the possibility, but is not actually forced to | do anything, just like with code suggestions. In the vast | majority of cases they follow my advice though. | | If there's an error or a kludge I use: | | -Code suggestions - no comment, so nothing to get upset over and | if the recipient is feeling particularly irritable, they can just | ignore it. | | -Direct language in imperative form, e.g. "make sure that X, | otherwise this won't work as intended", "avoid X in Y", "use Z | here (documentation link)". | [deleted] | Sjeiti wrote: | I mostly only ever use the form: "This should be ... " with a | possible explanation why. We're all mature enough to not take it | personally, so I'm not going to beat around the bush by writing a | lot of proza. The imperative of the last example ("Do this") | leaves no room for argument (because I might be wrong). | | Either that or I ask for clarification of a piece of code: "Why | did you do this instead of this?". | | Like already stated by someone else; your approach really should | depend on the team you're in. I'd take a less direct approach | with junior devs who tend to be a bit more insecure (and | stubborn). | mannykannot wrote: | None of the suggestions contain any justification for taking the | action. In many cases a reason may be obvious, but as it is not | the case that every opportunity for creating a separate function | should be taken (for one thing, doing so can make reading and | understanding the code more difficult), this becomes an issue of | judgement. | vsareto wrote: | There's basically two categories here: | | - you have an opinion on how things ought to be done and want a | dialog | | - you see some code that's wrong or violates an agreed-upon rule | and so it should be changed with no discussion | | I'd switch the tone based on what you're addressing. Giving a | rationale when you share an opinion or point out a mistake also | softens the tone (for the better IMO). | | >* Should we extract this to a separate function? | | >* Could you extract this to a separate function? | | These are essentially the same: opening a dialog over an opinion. | I'd suggest this when there's not an obvious flaw or rule | violation or you have a gut-feeling about how code should be and | want the author's input. | | >* I would extract this to a separate function. | | This is almost a command but isn't clearly one. It should be | followed by some rationale, at least. | | >* This could be extracted to a separate function. | | This one's the least useful. You could do a lot of things with | code. It doesn't resemble the command or inviting tones of the | other examples here. | | >* This should be extracted to a separate function. | | >* Extract this to a separate function. | | These are commands and are practically the same tone and best | when catching mistakes. Unless obvious, a rationale should be | given like a demonstrable flaw in logic or inconsistent | abstraction, etc. There should be a few sentences explaining | this. If there isn't a clear violation, I'd prefer the dialog | invitation tones. | ajross wrote: | > I'd switch the tone based on [whether you want a discussion | or are insisting on a change] | | I think that's a great example of where "tone" is absolutely | _not_ sufficient, especially in the modern world where many | readers aren 't going to share your first language and won't | absorb the nuance. | | If there's a situation where your disagreement is absolute, you | need to say that factually, ideally with a recipe for how to | resolve that included: | | "I can't approve this scheme, please do X instead." | | "This API isn't OK to use here, you have to..." | | "Under no circumstances will I ever approve of a feature that | does this." | | You can phrase those as nicely as you want, but it's imperative | that your disagreement be spelled out explicitly. | colonwqbang wrote: | It's sometimes refreshing to have people just write what they | want me to do, clearly and without embellishment. Even if | it's sometimes nitpicking, I know that if I just fix it I can | then merge my patch. I don't have to wait for a second look | from them because their comments were so direct "write this | instead". | jvanderbot wrote: | Another thing that people don't often consider is that while | some really appreciate being given a pointer to the rule as a | justification (these are in a wiki / code style doc usually), | many people will chafe at the "pedantry". In general, those | second group need a bit thicker skin, but it is something to be | considered. | kevinpet wrote: | There are different categories of things you might see: | | 1. This is wrong. I can tell from reading your code that it | doesn't do what the description of this PR or the name of a | test or some other indicator shows its supposed to do. This | should be communicated in a tone of "you must not merge this". | | 2. This violates our agreed-upon style or best practices. The | strictness of enforcement is part of that agreement and company | culture. At my current company, this would be communicated | along the lines of "this is not how we prefer to do this, so | unless you have a good reason why our standard method is wrong, | change it" | | 3. This is confusing to me, or I have a suggestion for | improvement. This should be communicated as a suggestion or | general feedback. If you're getting miffed about people not | taking the suggestions, maybe it's actually in a category | above, or maybe you need to adjust your own assumptions about | how much stylistic consistency to insist on, since it sounds | like you don't have a consensus. | | 4. You are new, either to software engineering or at least to | this company, and your style is inconsistent with how things | are done in this code. This is the same as #3 but should be | communicated more strongly and depending on your company | normals may be effectively a requirement. | jorgeleo wrote: | <sarcasm> I like your suggestions... I would add that they are | more effective if you keep a background noise with whips | cracking sounds and random screams </sarcasm> | edmcnulty101 wrote: | This is really useful. Thanks. | m3Lith wrote: | What about clarifications? In a sense when you're not sure if | this is good code, and would need to get more details. I | sometimes just ask directly ("Why is this there?"/"What does | this do?"), but other times I just don't bother and let others | review. | matsemann wrote: | I also think it depends a bit on the other person and the | rapport one has with them. | | At least I try to remember back to when I was a junior, and how | "personal" the feedback felt when I was just starting. So when | reviewing for others in the same situation I make extra sure it | doesn't come off the wrong way by adjusting my tone. | | But for someone I've worked with for years we're often a bit | shorter and to the point, and everyone's happy. | ginja wrote: | Yeah I remember being a junior and feeling like blunt | comments were kind of rude. So I make an effort to be nicer | to new developers - sometimes simply adding "what do you | think?"/"do you agree?" is enough to make those command style | sentences sound much less blunt, and also encourages them to | ask questions instead of blindly following my suggestion if | they don't fully understand it. | graftak wrote: | To me those questions could come off as condescending. I | say _could_ because I wouldn't think that's your intent, | but the tone is there. | kqr wrote: | That depends entirely on whether you add the question as | a formality or if you are genuinely interested in why the | other person might disagree. | eropple wrote: | The best way I've found to introduce junior developers to | code reviews is to pair on it. Just go side-by-side down the | diff and hop into an editor when necessary. It also helps | teach a developer _how_ to review code and what to look for-- | which has knock-on benefits of its own. | spacemanmatt wrote: | When you are reviewing, what is your authority level? Do you | enforce a checklist? Are you merely asked to give your | professional opinion? Are you a senior supervising a junior? | These are critical inputs for me to calculate tone. | | When I've done reviews, I had some seniority and an | organizational privilege to veto some code. I worked from a | checklist and a goal (with which the checklist was meant to | align, but we knew it was not possible to fully automate those | aspects of review). These are my takeaways from that arrangement: | | Language like "declined" or "REJECTED" or "can't approve" is | discouraging to the individual contributor. I replaced all that | with discussion of why I can't allow that, under the obvious | subtext of rejection. No need to just rub it in when there is | learning to offer. | | When indicating required changes, especially where I was more-or- | less handing them the replacement code, I always said please. | Always. | | Most importantly, I gave accurate feedback. I took the time to be | sure I was right before I wrote a review. Otherwise what's the | point. Even simple patches got tested. | livinglist wrote: | "Won't it be better if we did that instead of this?" "Do you | think it would be better if we did that instead of this" "I think | it would be even better if we do this instead of that" | | I usually use "we" instead of "you" in my code reviews, "we" | feels more friendly and comforting and way less judgy. | ratww wrote: | I agree. I tend to use "we" when for the negative stuff of | anything that has to be decided by the team ("we changed the | code here but it caused a regression", "should we refactor | this?"), however I also like to use "you" for positive stuff | and to give credit ("your change in b8e63dca also fixed this | bug, livinglist"). | r_harriso wrote: | "Obey!" | LocalPCGuy wrote: | Couple things I try to keep in mind when giving PR feedback | specifically. | | 0) Give feedback with respect and just like as if I were sitting | with someone face to face telling them these things. And keep it | about the code, not the author. | | 1) Remember that I could always be wrong (whether from misreading | something, not having the whole pictures, etc. - many reasons my | suggestion may not be the right one). | | 2) Communicate how strongly I feel about a change - I use `nit:` | to indicate opinions or annoyances that are basically "I wouldn't | do it this way, but up to you whether to change it", slightly | stronger language for things I think require changes, up to "I | feel strongly about this, let's chat about it" for things I would | not approve the PR before they (or my mind) are changed. | | 3) Phrase as requests and/or suggestions (could, would, prefer) | over command (do X) | | 4) As others have mentioned, give the reasoning. Personally, I | prefer request first, reasoning second, but I see many people | expressing preference for it the other way. My reasoning is that, | while the reviewee may read the reasoning once, the request is | what they may come back for when fixing things, so ensure it is | the first thing seen so someone doesn't have to parse through the | reasoning again to find the specific request. | | 5) Provide examples if it's clearer to communicate that way as | compared to writing it out. | jjdin14 wrote: | Depends on the situation. If it is a clear cut case or you're a | mentor/senior to the reviewee, a more direct tone is fine. If | it's a matter of opinion or it's a peer review then a more | considerate tone would come across better. | JamesSwift wrote: | Default to short, polite statements, but make it clearly | suggestive if its optional. | | e.g. "Extract this to a separate function please" if you aren't | asking. "Should this be a separate function" otherwise. | | This also assumes that theres a certain protocol to PRs in terms | of veto power. I've always followed the rule that the writer must | make all requested updates by reviewer unless explicitly | challenged. In other words, you can't silently not change | something they mentioned, but you can say things like "thats out | of scope for this update" or "I think this design is better | because XYZ" and the writer is able to mark as resolved at that | point. | | Sometimes this ends up with a conversation that needs to happen | where the reviewer disagrees with the writer, but honestly it | rarely does at least on the teams I've been on. It would really | have to be a contentious point to escalate to that level rather | than just being a difference of opinion. | noname120 wrote: | 1) State the specific reason that motivates you to ask for a | change. | | ``This code is duplicated several times.'' | | -- | | 2) State the change you'd like. | | ``I'd suggest extracting it to a separate function.'' | | -- | | 3) (Optional) Expand on why you suggest solving the issue with | this solution instead of another one. | | ``We could create a macro instead but it's not worth it as we can | just let the compiler decide whether to inline the function or | not.'' | softwarebeware wrote: | My favorite guide on this is https://phauer.com/2018/code-review- | guidelines/ | | There are also some great things in the book, Debugging Teams, | like the Humility-Respect-Trust (HRT) concept. | Galxeagle wrote: | In addition to other comments saying to add reasoning, I'm a big | fan of the 'MoSCoW' method (must/should/could/would) to remove | ambiguity around if things are a question vs a command vs a | thought. 'You must do x' sets a clear condition before you | approve a PR. 'I would have done y' shares perspective and | experience without blocking when you think you might be just bike | shedding. | | I'll usually link something like this page to the repo and align | on the meanings of each phrase. | | https://en.m.wikipedia.org/wiki/MoSCoW_method | k1ll3r wrote: | only suggest improvements, and provide reasons if possible, never | tell anyone they should do something in a certain way unless it's | an obvious bug. I fucking hate know it alls that confuse their | opinions and preferences with some absolute truth. | spiderfarmer wrote: | I'd say the last two are best, but I'm Dutch. | new_newbie wrote: | Don't forget a big part of this is the dependent on the image of | you the recipient has in their head. | _greim_ wrote: | Personally I have two tones I take in a code review comment: the | "Should ... ?" form for when I want to raise awareness but | otherwise leave it up to the other person, and the "I recommend | ..." form for when I think there's a real issue. Especially in | the latter case, I'll back it up with a real-world scenario of | how it could cause a problem; either a bug, difficulty reading | the code by future maintainers, or making it more likely to | introduce a bug when the code gets refactored later. Finally, | back-linking to documented standards if necessary to avoid the | appearance of a me-against-you type of thing. | symby wrote: | Perhaps, silence would be a good choice on this issue? | | To my view, coding is as much art as science, and it is | limitlessly fascinating to me how different people find different | ways of expressing ideas and solutions. | | Also, the code review process is fraught with opportunities for | insult, misunderstanding and unfortunate power dynamics. It is | inherently difficult regardless of the actual content being | reviewed. | | On the other hand, if there is a significant issue here "I am | having trouble following your thinking here. Perhaps dividing | this up into smaller functions would help?" Might be a good | review comment? | | The style wars are very tempting to engage in, but they virtually | never drive greater productivity, real quality improvements, or | positive team dynamics. | | If there are _real_ reasons that this wants to be broken out into | a separate function (reusability for instance), then make that | clear in your suggestion. | OJFord wrote: | I second guess myself and edit a lot, especially relative to how | much we actually do code review, so I'm interested to see others' | thoughts. | | I would say though that a lot depends on team dynamic & | hierarchy. For example, I have no direct reports, so I'm never | going to use the imperative as in 'extract this to a separate | function' - taken literally, I don't have the authority to tell | anyone to do that. | | Most often I think I favour 'I would', and give a reason. I.e. I | found this a bit surprising, because I would have done it | differently. | | Along the same lines I also ask (honest) 'is there a particular | reason' or 'why not' type questions. Something else seems most | obvious to me, but maybe they thought of (even tried) and | dismissed that. | alexashka wrote: | It's about power dynamics. | | You ask someone above you. You tell someone below you. You | discuss with someone on the same level as you. | | If you're smart, you'll quickly spot the assholes who think | they're above others - you probably shouldn't comment on their | code at all, other than 'great, looks good'. | | If you think someone is below you, you're an asshole. | | If you want to discuss, you need to include the word 'because'. | 'Hey, can we do X, because I/we will need it for Y?' is the way I | usually go about it. By the way, discussions are best had | _before_ anyone writes code, not after. So for me, I don 't do | code review - if someone's bad enough that they need their code | reviewed on a regular basis, I will be leaving soon anyway. | simonbarker87 wrote: | I've introduced Must, Should, Could at every company I've been at | (except the one where I picked it up myself) and it works | wonders. | | Prefix every suggestion with M, S or C and then just write the | suggested change as a plain statement. The prefix handles the | severity and importance without you having to worry about tone. | | Coulds can be ignored by the coder author with no explanation as | to why they are ignoring but if they have time or want to | implement the change then they can. Shoulds can only be ignored | with a reason and the reviewer has to agree or the change should | be made. Musts have to be implemented and should be used rarely. | The only person who can over rule a must is a department head, | lead or CTO type person. | | This massively reduces friction in the CR process. | | Article here: https://allthecode.co/blog/post/how-to-get-better- | at-code-re... | darekkay wrote: | We do something very similar: | | * NICE: Optional change. PR is approved. | | * SHOULD: Highly suggested change. PR is neither approved nor | rejected. | | * MUST: Must be fixed. PR is rejected. | | This also helps the PR author to know which of my comments have | to be addressed to resolve my rejection. | evsasse wrote: | Yeah, that is great. | | Learned something similar on a previous job. Prefix it with | "#must", "#should", "#could", "#would". | | We've also extended it with some other things that you may want | to comment, but are not necessarily actionable. "#wont", | "#idea", "#tip", "#question", "#risk", are pretty much self- | explanatory. | | "#fun": an ugly workaround that could've worked; some funny | situation that the change could cause; ... | | "#domain-knowledge"/"#debrief": really nice if you are working | with people that are more junior, or not that familiar with | this codebase in particular. May help other reviewers | understand better why the author made certain decisions. | [deleted] | glerk wrote: | I tend to be overly "nice" in code reviews and phrase things more | like suggestions and provide some justification for them: | | > have you considered x? It is standard practice in y to do z. | | > should we do x instead? I think it would be better in the long | run because y. | | If there is a more serious issue, I prefer DMing the author and | hashing things out synchronously. | | I think it is important to phrase things gently as much as | possible, as tone is hard to read from text, and being overly | harsh might discourage other teammates from taking risks and | asking for feedback. | kissgyorgy wrote: | All of your examples are wrong, because you don't state WHY you | think it would be better. Never give instructions without at | least a short explanation. | | Better tone of the above sentence, without "blame game": | None of your examples include WHY you think it would be better to | do something. I never give instructions myself without explaining | at least briefly why I think my suggestion is better, because | they more likely understand the problem or accept my suggestion. | | Even if you think something is better only because your taste, | it's still better to explain yourself, so you can agree to | disagree. I usually let go small things if something is readable | and functionally not different. | spockz wrote: | Typically I say something like: | | "What would be the advantage of using X instead?" If I'm not | entirely sure or fine either way. | | If I think X is really the way to go I'll say something like: | | "Doing X would have these benefits. The benefit of Y is such and | such. So X is preferred for ..." | lhnz wrote: | "How would you feel about extracting this into a separate | function? It might be better because the logic seems quite self- | contained, and we can then apply the extra business logic | immediately after this with a few if-elses." | | I try to give critiques in this way, as it gives the person that | wrote the code ample opportunity to defend their approach, but | also gives explanation of why your suggestion might be better. | melezhik wrote: | Code reviews are tough when people have strong opinions. I try to | ask questions rather then making statements, it gives a room for | discussion and makes the whole process less challenging | jdmoreira wrote: | "I think we should..." | | "Maybe it would be better..." | | "IMO we should do ..., what do you think?" | | You really want to be on this person side and help them achieve. | That's your job after all | koolba wrote: | Depending on the situation, one of the following three: | | > Should we extract this to a separate function? | | When you are not familiar with the codebase, potential reuse, and | want the submitter to clarify rationale for the approach. | | > This should be extracted to a separate function. | | When you are the authority but you're open to a discussion. You | should include the "why" aspect in this situation. | | > Extract this to a separate function. | | When you are the authority and there will be no discussion. If | you want you can include the "why" but it's a waste of time. You | are the law. | | The rest are sugar coated versions of the same thing. | | " _I think..._ ", " _I would..._ ", " _Maybe we..._ ", are | unnecessary additions. Clearly it's what you would do as you're | the one giving the review. | | If people are too thin-skinned to take direct feedback then they | should work on improving that before submitting more code. Life | is too short to waste time picking words that try not offend when | you can spend that time actually producing something of value. | magnusekdahl wrote: | When it comes to feedback, ensure that you give the engineer | recieving the feedback the maximum potential to grow to ensure | the engineer does a better job next time. | | Its not the tone but rather the feedback style according that | should be adapted to the knowledge/motivation of the engineer in | the situation. For example by using the | https://situational.com/blog/the-four-leadership-styles-of-s... | herustic: | | 1: Engineer is junior in the context and insecure/unmotivated: Do | X 2: Engineer is junior in the context and motivated/secure: Take | the decision for the engineer and explain why 3: Engineer is | senior in the context but insecure: Coach by open ended | questions: how large of a function do you think is appropriate? | 4: Engineer is senior and motivated/secure: From your perspective | how should the function be and how should we do this in the | future to reach our goals. | izacus wrote: | First decide what do you want: | | * Is the change mandatory for your approval? Then be polite and | firm with reasoning - "This is poorly readable and doesn't | conform to our code style chapter 5. Please extract this into a | separate function.". Don't mess around with "Should, Could, I | would" starters when it's not a question - be clear what you're | asking. | | * Are you trying to start a debate? Then ask a question properly | - "I think this is unreadable because of A, B, C. Do you think | extracting this will help readability?" Again, be clear it's a | question. | | * Are you saying an opinion and you're not very hung up on it? | Mark it as such - I tend to put "Optional" or "Nit:" (team term) | in those cases. "Nitpick/Optional: I think this isn't readable, | if you have a moment maybe extract the method?" | | The worst you can do is veil your intent (order/question/opinion) | into faux questions which will confuse people - especially if | they're non-native english speakers. Adding background / | explanation / context for your comment always helps too. | nsonha wrote: | isnt the first one good for everything, why even bother with the | other options? | corrral wrote: | > * Should we extract this to a separate function? | | Reads very passive aggressive. No. | | > * Could you extract this to a separate function? | | Yes, I could. | | > * I would extract this to a separate function. | | Good for you. | | > * This could be extracted to a separate function. | | This one's OK as a style suggestion that you won't block the | merge over. | | > * This should be extracted to a separate function. | | This is kinda, sorta OK, if you're going to block the merge if | this isn't fixed. | | > * Extract this to a separate function. | | This is better because the tone matches the intent: it's a | command. This gets addressed, or no merge. "This should..." is | indirect--you're not stating what you actually mean. This | phrasing is better. | | 4 is the best of these for optional suggestions, 6 is best if you | consider the fix a requirement for a merge. In general, say what | you actually mean--dancing around it leaves room for | miscommunication and can give all kinds of bad impressions. Of | course, that can also mean weakening language: don't _command_ a | change that you don 't consider a big enough deal to block the | merge. | | [EDIT] And, as others have noted in the thread, of course | expanding with justifications is always a good idea. "Do this" | without a "why" should be avoided. But lead with what you want | done, not the why--that follows. | spiderfarmer wrote: | I agree with everything you said. But I'm Dutch. | StellarScience wrote: | Based on a great article we read almost 15 years ago ("Effective | Code Reviews Without the Pain": | https://www.developer.com/guides/effective-code-reviews-with...), | we start most code review comments with "Did you consider...?" | This makes it non-confrontational and non-judgmental, as the | author can easily reply that, no, they hadn't considered that and | thanks for the suggestion. | | Everyone in the company knows it's sort of a gimmick, and we even | make fun of it a bit, but even so it still works! | | "Did you consider extracting this code into a separate well-named | function with clear inputs and outputs, to make the original | function smaller and easier to reason about and maintain?" | greazy wrote: | Never use should. It's confusing and inherently negative. It's | also not very clear. Compare should with could in your examples. | Could is very clear, a direct question to the read. | xwdv wrote: | How about | | * Why isn't this extracted to a separate function? | XorNot wrote: | Use number #6. If it's not necessary, then why say it at all in a | code review? Everyones got other things they'd like to do. | | All the "should" and "considers" are tickets that can go on the | backlog after a merge has delivered functionality. | | Then YAGNI will probably turn out to apply. | BoorishBears wrote: | To add to the other points, remember you can also leave positive | feedback. | | Don't force a compliment for no reason because it _will_ come | across as insincere... but if you see something well done | /implemented, don't be afraid to call it out. | | It helps balance the tone sometimes, and is especially helpful | with junior engineers who are well served not just learning | what's wrong, but what's right. | [deleted] | 960design wrote: | The clear declarative: "Extract this to a separate function." | Everything thing else can be misinterpreted as a suggestion, dig, | ect. | | Actually an interview question to work with us. We need code, not | egos. Write and be wrong, correct and continue. Do not sweat | errors. None of us are perfect, and neither is this review. | pydry wrote: | If it's negative feedback or something that feels controversial I | dont put it on a PR at all. | | I try to do it in person or (remotely) send a private slack | message. | | People can be sensitive to negative feedback and one way of | ameliorating that is not to give it in a public forum where | everybody can see it. | mytailorisrich wrote: | Code reviews are primarily a way to detect bugs and to verify | compliance with a set of rules. | | Most comments are therefore expected to be 'negative' in some | way. | dyingkneepad wrote: | If this is on an open source community, it's bad advice IMHO. | On open source communities, please make all feedback public. It | is really important to make the history of the project public. | There are many ways to write the feedback in a not-offensive | way, many of the comments in this thread have good suggestions. | pydry wrote: | I was assuming a normal working environment. | | OSS is a different kettle of fish. You dont have to worry | about bruised egos nearly as much & the value of public | feedback is higher. | Uptrenda wrote: | I'm sure this will piss people off: but almost all of the 'code | reviews' I've been a part of were a waste of time. People trying | to force stylistic changes to how a program works (OPs post is an | example) aren't contributing anything constructive. What is | worthwhile is trying to find critical security, logical, or | performance bugs and reporting those. If you have taste / style | concerns about how someone does something yet their solution is | still fine then I'd suggest not wasting peoples time. There is | nothing worse than nit picking. | yoyopa wrote: | last one... save people time. i don't need pleasantries. | siquick wrote: | You may not need them but what about others? | perlgeek wrote: | Code review is a form of communication, and thus depends very | much on culture. | | This can both be company culture and origin culture of the | developer you're communicating with. | | For example, sometimes I write comments like "I don't | particularly like this because" plus an explanation, plus "but I | don't see any significant better way, so I'm fine with it for | now". Some of my colleagues are fine with that, maybe they add a | code comment like "TODO: find a way to fix problem X", or they | just acknowledge and don't change anything. And then there are | developers I work with that come from a different country, and | they'll spend another half day or even two days coming up with a | better solution, or don't dare to click on "resolve thread". | | I think their culture is really geared towards avoiding verbal | criticism, and if I even bother to write something negative (and | maybe I'm also senior to them, in the org chart), it must be | really meaningful and _must_ be addressed. | | So for some of these "foreign" developers I only leave comments | where I expect something to change; for others that whose culture | I better understand, I sometimes leave comments that are more | conversational. | Toreno96 wrote: | Complementary to other answers, I would suggest introducing this | technique: https://dev.to/allthecode/moscow-the-best-code-review- | techni... However, share this w/ the reviewee first! | | I know some devs that are anxious if they don't fix _every_ | single comment in their PR, even if I'm just suggesting something | as "nice to have". This helped to mark which comments are actual | priority. | | Also, make sure you're using code formatter in your CI, to avoid | reviewing the code style, as this can start some unnecessary wars | and frustration. | | Also, I suggest sharing this article https://mtlynch.io/code- | review-love/ with your colleagues, especially step 8: | | > As the author, you ultimately control your reaction to | feedback. Treat your reviewer's notes as an objective discussion | about the code, not your personal worth as a human. | | To some degree, as a reviewer you can keep your tone friendly, | but ultimately _every_ sentence can be took as personal attack, | and you can't really do anything about that. Keep that in mind, | don't focus _too much_ on the tone, and don't let that prevent | you from giving a comprehensive review. | | One other thing I personally do, because I'm famous for giving | _really_ thorough reviews, is to make sure from time to time that | the other person is fine w/ that. Simple DM "I hope you don't | feel too overwhelmed by my CR?" helps, especially that often | people respond that they actually approve I'm so thorough. If you | worry people get offended, it is easy way to make sure if these | worries are valid or not. | 1-more wrote: | "if we extract this to another function we can then add a test | like this" with an example. Gotta say what the value add is. The | value add could just be that it's more like the rest of the | codebase! "In the past we usually extract functions like this | link optional second link" | justinram11 wrote: | [Suggestion] Use conventional comments[1] to flag how important | the comment is. | | Most of my comments end up being "suggestions", but then when I | put a [blocking] on it, it clearly communicates that I think this | should be fixed before merging in. | | 1: https://conventionalcomments.org/ | amrox wrote: | praise: I came here to suggest conventional comments as well! | imiric wrote: | thought: reading this style of sentence would get annoying | quickly. | | I don't get the point of these TBH. The usefulness of | conventional commits is that they can be easily aggregated to | get an idea of the types of changes that were made. | | Code review comments are purely meant for human | communication, so requiring a specific structure is both | annoying to write and to read. | | I tend to use one, at most two prefixes. "Nit", and rarely | "blocker". Though I'd rather specify if something is a | blocker once I make my case about what needs to be changed. | | Every other comment is assumed to be a suggestion, and | depending or not I block the PR by "requesting changes", it's | up to the author to either accept my suggestion or provide | reasons not to. | | Any other strict guideline about how to write prose is silly | to me. Especially the decorations section. C'mon now. | Deradon wrote: | Offtopic but related: | | Conventional commits: | https://www.conventionalcommits.org/en/v1.0.0/ | ra7 wrote: | Using conventional comments also forces me to rethink if my | comment is really blocking or is just an optional suggestion | and I can adjust the tone accordingly. | [deleted] | djadmin wrote: | I use conventional comments everyday. It just helps me | communicate clearly and concisely. | cubes wrote: | +1 for use of Conventional Comments. It's a simple lift for a | noticeable improvement in clarity, and guidance on what to do | next. | difflens wrote: | Across the different teams and orgs I have worked at, there's | always been 1 constant during code reviews: Each comment provided | an explanation of why some change was being debated. Every | engineer knew the review is not a judgement of their coding | prowess. Rather each discussion was purely on the merits of that | line of code. Sure, there can be disagreements, but it was never | judgemental. Usually folks are amenable when there is good | justification to the feedback in my experience. It goes both ways | too: I personally don't care if some of my nits are not fixed. | | Btw, since I think it is relevant to this discussion, we're | working on making code reviews deeper than text based diffs. | Check out (DiffLens)[https://github.com/marketplace/difflens] if | you're code base is primarily TS, JS and/or CSS to get language | aware diffs on your GitHub pull requests. We've found that it | makes understanding code changes much easier | harrisonjackson wrote: | All of this should be hammered out in a set of guidelines around | code review so that ego/feelings don't need to come into play. | Have style guides, code review checklists, and best practices | documented. | | The actual words used should be determined by the goal of code | review and the relationship between reviewers. | | Anything that can possibly be automated by CI should be. Style | guide and test coverage should automatically fail PRs before a | human needs to add any "nit" | | That means code review should be a teaching or question moment | (between a senior and junior, newer and veteran) or a discussion | between peers. | | From a junior to a senior -> why did you extract this? why didn't | you do it this way? | | From a senior to a junior -> typically, I would extract this | because X. Check our best practices doc for a longer explanation. | | Between peers or senior/junior (maybe one is newer) -> it isn't | in our coding best practices document, but normally we extract | this because X | | Between peers -> what do you think about extracting this because | X? Should this be in the coding best practices document? | | The last is important because ideally you're updating your coding | guide so this same review doesn't need to be done 10 times. And, | if you don't think it should be documented as a best practice | then don't bring it up in a review. | asimpletune wrote: | Personally, I think that the focus on on the phrasing itself, | which as you mentioned are all more or less synonymous anyway, is | letting the underlying challenge get away from you. You can | safely use any of them, but that there's other stuff that can be | done that's more important. | | Any time you can convincingly explain exactly why you're | suggesting something it makes the suggestion itself seem much | more reasonable, and it's a valuable check on your own reasoning. | From there, you can reword the explanation itself in creative and | valuable ways to give feedback. If you get really good at this, | then a lot of times you don't even need to ask for a specific | change, you can just turn the problem you're seeing (I.e. | 'explanation' from above) into a question. I'll give an example. | | Let's say you want to say "Extract this to a separate function". | Ok, now, ask yourself why? So you tell yourself, "Because we may | want to use part of this function again, but not the rest of it, | and the exact same behavior can be achieved with little to no | additional effort by function composition (or whatever you do in | your PL)" Ok, that seems reasonable, but maybe now it may be | perceived as a little too abstract to someone else, especially if | they're just trying to get their work done. But you can take | solve that by taking the above 'explanation' and make it | concrete. One good way to do this is to think of a counter | example, where it clearly doesn't work how we want. | | As an example, let's just pretend that they're doing something | like parsing a thing from a database into some strongly typed | thing, and then doing foo work on the strongly typed thing. You | can ask yourself then, well if we were unit testing this, we | won't care about the parsing part, we can just start with the | strongly typed thing as the precondition of our test, and then | isolate what we're testing to just be the foo functionality. Now | you have a simple example that you can rephrase into your | original feedback. | | This thought exercise all leads to the feedback going from | "extract this to a separate function" to "Does this mean that | unit testing the foo feature requires a parsing step for each | test case?" | | Maybe that's a silly, contrived example, but I've found that if | you even capable of going through this thought process then not | only do people receive your feedback much better, but also you | just tend to think of much better feedback altogether. After a | lot of practice you end up being able to think this way very | quickly and then you can focus on adjusting the wording based on | your relationship with that person. | | At the end of the day, it's not what we say that really matters, | it's how someone feels they're being regarded by one their peers. | If they sense contempt, then it won't matter how politely or | expertly you word things. Having extremely well thought out why's | in your back pocket, and being able to provide concrete counter | examples just makes it clear you're not wielding your review | power just to talk but to illuminate the problem to them. It also | solves the problem of when you're the idiot (as happens to all of | us from time to time), by forcing you to actually justify your | feedback before you share it. | | When I've done this, I've noticed that my reviews become faster, | and I focus on stuff that people don't think about. It makes the | code better and then people will actually seek out your review. | ulisesrmzroche wrote: | There's not a lot you can contribute unless you worked on the | ticket. Notice how the only example you came up with was | refactoring. | | This was more important back in the day but now linters and | formatters are mainstream. | | The best time to code-review is at the beginning. | mjfisher wrote: | Actually reaching a level of team culture where you can be as | brief, blunt and to the point as possible is a wonderful thing. | | There is no offence to be taken, because the deeply held respect | for each other as team mates is already there and taken as a | given. You trust each other to know that any comments are | addressed directly to the code, rather than to the person behind | them. All input is valued because everyone knows the goal is just | to make the code better and help each other out, rather than | criticise an individual. Discussion can be frank, open, unbiased | and non-confrontational. | | However, because that takes a long time to develop and is | somewhat of a rarity, I've had quite good luck with the phrasing: | | "Have you considered X here?" | | It has a number of advantages: | | * It doesn't imply that an author should have done it a different | way | | * It doesn't imply that an author has missed something you think | they should have covered | | * It's a good starter for a conversation, rather than a conflict | | * If the answer is "no", it provides a good prompt for an author | to come up with a suggestion first | | * If the answer is "yes", they can explain why they ended up with | the solution they did, which is visible to everyone who wants to | look at the PR. That can also be a good prompt to add a comment | omegalulw wrote: | Another method: prepend "nit: " to comments that improve the | code but are not calling for changing the main logic. As a | reviewer, you are simply acknowledging that this is a nitpick | :) | angarg12 wrote: | I keep a running list of articles I found useful over the years. | There are many great articles about Code Reviews out there. | Consider this a more general answer to your question: | | Feedback Ladders: How We Encode Code Reviews at Net-lify | | https://www.netlify.com/blog/2020/03/05/feedback-ladders-how... | | How to Make Good Code Reviews Better | | https://stackoverflow.blog/2019/09/30/how-to-make-good-code-... | | Best Practices for Code Review | | https://smartbear.com/learn/code-review/best-practices-for-p... | | Code Review Guidelines for Humans | | https://phauer.com/2018/code-review-guidelines/ | | Unlearning toxic behaviors in a code review culture | | https://medium.com/@sandya.sankarram/unlearning-toxic-behavi... | | How to Do Code Reviews Like a Human | | https://mtlynch.io/human-code-reviews-2/ | | Stop Nitpicking in Code Reviews | | https://blog.danlew.net/2021/02/23/stop-nitpicking-in-code-r... | whoomp12342 wrote: | Always friendly. Life is too short. | barbarbar wrote: | This one is nice. | sixothree wrote: | Static Analysis should be able to provide a "complexity" metric. | If the method reaches a certain complexity, certain tools will | consider it a bug. Refactoring is sometimes the only way to | address these issues. | some_chap wrote: | I typically go with something like "Have you considered | extracting this to a separate function"? | davidthewatson wrote: | My suggestion would be typical: concise, professional, and when | straight-forward, specific. The key is to remember that the | nature of a code review is first to improve product, and perhaps | secondarily to improve process (ops or procedure) and perhaps | thirdly, people improvement in the form of collective learning. | | Thus, if we're talking about refactoring a line-of-code then just | writing the refactored line-of-code is probably the most clear | and concise. If it's more involved than that, then it may be | worth taking offline. In the example you've provided here, I'd | suggest the best language is likely: Refactoring this block as a | separate function provides the following benefits: 1. blah, 2. | blah blah, and 3. blah blah blah and no side effects. The only | additional clarity that's helpful is to say whether it's | optional, required, or some other directive. | ratherbefuddled wrote: | The emphasis should be on clarity. Overall you want to leave the | requester in no doubt about what it will take to get approval | because the most frustrating thing for both of you will be ping | pong. | | Tone is very hard to judge in written form particularly when | there might be cultural and language divides, in my experience | though it doesn't really matter what style you use provided that | you also remember to comment on things that are good and do not | need changing. This is routinely forgotten and more than balances | any perception of negative tone the requester might inadvertently | infer. | mrfusion wrote: | > "Extract this to a separate function please" | | This sounds really bad. Even if you're their boss. You're dealing | with professionals and part of that is considering their input. | | I'd start with the assumption that they know what they're doing | and might have had a good reason and phrase it from there. Even | if not true it sets the right tone of respect. | emichelsx wrote: | I would extract this to a separate function. | hluska wrote: | There are three main categories of code reviews: | | 1.) Things are mainly bad. | | 2.) Things are mainly good. | | 3.) Somewhere in between. | | Within those, everything I see and flag as worthy of discussion | is either: | | 1.) Something that violates our rules/style. | | 2.) Something I have a strong opinion on. | | 3.) Something I don't understand. | | Depending on which main category the review falls into, I'll deal | with these differently. If things are mostly bad and I don't | understand something, I'll ask a lot of questions about | readability and naming conventions. If something is mostly good | and I don't understand something, I'll ask "Hey, can you explain | lines 71-104?" | | In general, I try to keep things friendly and positive because I | don't want people to dread the experience. Life is too short to | dread a big part of your job. | eof wrote: | I adopt, and appreciate when others adopt a neutral/brutal tone. | | "These lines have been repeated a number of places and probably | ought to be pulled into a function called something like xyz in | module zyq" | | Generally your tone doesn't matter as long as it's not mean. | "This is the 10th time I've told you declare constants FOR EVERY | MAGIC NUMBER," does not belong in a code review; it belongs in | feedback. | | However there is something a bit dangling here which is linting | and static analysis. If code has been repeated and genuinely | ought to be pulled into a function, static analysis ought to be | able to find this. | | If you have already dealt with the broad class of possible change | requests that can be caught by static analysis, the nature of the | reviews should get a lot more straight forward. It will stay at a | higher level and naturally tend toward verbiage like "I wonder if | we ..." or, "I was thinking if ..." | | In cases where static analysis would not find it for e.g. in the | middle of a function doing something, we have several lines of | code collecting data for some analytics event which is never | repeated, but still confusing; I would say something like "For | readability, could we pull the analytics bit into a separate | function?" | | Generally; if you can use "we" instead of "you" or "I"; I would | prefer "we" in any team setting. | dschuessler wrote: | Personally, I prefer "What do you think about extracting this | into a separate function?" | | Unlike in any of your examples, the subtext is: "I anticipate you | had reasons for doing it the way you did and I am open to | listening to them." It engages the author on the same footing, | leaves the door open for discussion but still communicates your | intent in a straightforward manner. | jeppester wrote: | My personal favourite is: "Have you considered X" | | I also like to often prefix my suggestion with: "It might have | missed something, but X", especially if it's a larger change. | pclmulqdq wrote: | I hate it when people say "have you considered X?" and mean "do | X or I will block your change." It's all about communicating | what you mean. | XorNot wrote: | I agree with this so much. | | IMO if it's not mandatory I don't think it should be said at | all in a code review. | jeppester wrote: | I absolutely get that. I was a bit in a hurry when I wrote | the above comment, and therefore didn't get around to better | detail how I use those sentences. | | It's all about understanding the context and not talking down | to the author. | | When I see obvious improvements I use the "order" style and | just state what needs to change. Because surely the author | can see that the change will be for the better. | | The other sentences are for bigger more complex changes where | I'm curious about a certain decision. Most often I don't | agree on the current design, but I would never write such a | comment unless I'm ready to be convinced otherwise. | | When someone has spend hours on some functionality and I | spend just 5-10 minutes skimming through the code, there is a | very real chance that the change I'm going to propose was | already considered. It would be arrogant and condescending to | just conclude that my idea is better, so I open the door for | the authors explanation. | tboyd47 wrote: | All of these are equivalent if you have showed your team that you | trust them and value their work. | | If not, then only the first version is acceptable. | jugg1es wrote: | This is a great question because I find that when I use soft | language like this, a lot of the suggestions get ignored. | Sometimes that is fine but other times, I have to follow up after | and explain that the 'suggestion' wasn't actually optional. I | find it hard sometimes to protect egos and quality at the same | time. | gspencley wrote: | My "formula": | | 1. Try to find something positive to say about the code. This | reinforces what is being done well and supports the notion that | everyone is on the same team chasing the same goal. | | 2. I like to go deep into the "why", being as objective and fact- | based as I can. Code style and "best practices" are sometimes | confused with personal opinions and preferences. I avoid words | like "I prefer". If I can't back up my opinion with strong | reason-based arguments for why my opinion is objectively better | then I keep it to myself and continue to ask myself if it's a | personal preference or if there's a good reason for favouring | that. | | 3. Tone must always be friendly, polite and constructive. Of your | options I often go "I would extract this to a separate function | because ..." and then I go into the "why" | | 4. Sometimes I have a lot of supporting information to explain a | position. I will often label these "Academic Digressions" and | then drop a TL;DR. Sometimes people don't have time to read them | right away but I'm often told that people appreciate them and | save them for later. | padjo wrote: | Pointing out the good in a PR is such an important thing to do, | particularly with juniors! | ssd8991 wrote: | Tainnor wrote: | I find that I rarely use direct commands in code reviews, even | ones expressed indirectly (e.g. "can yo do X" instead of "do X"). | | If there are blockers in a PR, I'll add reasoning for why it is a | problem (e.g. "this exposes us to vulnerability X", "in this edge | case, what would happen is that ...", "I tested it and appears | that there is a bug", etc.) If it's a team-agreed style issue | (that isn't caught by the linter), I'd rather say "we use | convention so and so in this code base" than "please change this | to this style". | | The reasoning is that I feel that I work with professionals and | while they may need _feedback_ , they don't really need commands. | I can make suggestions as to how they can fix the issue I raised, | but ultimately it's up to them to fix it and if they find an even | better way that I didn't think of, why should I limit their | problem solving capabilities artificially? | | I find that most people I've worked with use a similar style | (more centered around the code than around power dynamics), and | those people who used a lot of "please do X" style comments were | usually also pretty defensive about their code or ideas, would | get uneasy when you changed some of their code ("why did you | refactor this? please change it back") etc. | | Now there may be some people (inexperienced, or just idiots) who | really need some more forceful language, but you shouldn't | necessarily start out on that default assumption. | | That covers the blocker-style comments. Everything else should | probably be done in either a "I'm opening up a discussion here | and would be interested in your opinion" or a "this is just a | nitpick, feel free to ignore" kind of style. | | --- | | For the specific example, depending on the reasoning for why you | might want the change: | | - "The linter is complaining that this function is too long and | we typically stick to those rules. I think lines 20-30 could be | extracted into a separate function, for example." | | - "I found it a bit hard to understand this function initially | because it does a number of things at once (such as...). Maybe we | could split it up?" | | - "This section of code is repeated between here and that other | function and I think we should keep the implementations in sync, | so I would recommend extracting that common logic." | | - "We've actually had to do something similar in other situations | (see here and here) and your solution seems better than what we | came up with before, so what do you think about extracting this | functionality into a function and calling it from all those | places?" | | and so on (and it doesn't need to be as verbose if you know that | you have more shared context, for example). | collinvandyck76 wrote: | I always try to make suggestions as questions because it's less | threatening, gives more agency to the author, and oftentimes ends | up being a discussion on the merits. If the suggestion really is | a blocker, I'll be a little more direct, but always always | friendly. | IncRnd wrote: | Review: a formal assessment or examination of something with the | possibility or intention of instituting change if necessary. | | None of your examples provide feedback as to why you want a | change. That may be why you have been led to ask this question. | | Consider: | | * There is a potential overflow in this code. The library | function xyz already does this and can log when the app is in | debugging mode. | | * This portion duplicates the same set of processes as over | there. Refactor these into a single function, and we'll be good | to go. | | * While I don't have feedback yet on this function, it's too long | for me to follow. It would be easier to read and for future | maintenance if you refactor this part into a function. | | * Since we're in closedown we can only take certain types of | changes. If you refactor this into a separate function in the | library, this change can be accepted. | | * Or, I hate to be the process person, but the internal | guidelines for this team call for all code to be structured the | same way. Refactor this part into a separate function and I'll | approve the PR. | | There are lots of ways to provide feedback. I suggest stating the | problem with the code and providing a solution. If that's the | only possible solution to get past your review, state and don't | ask. You can also give a carrot with "do this and I'll approve | the merge." | | How would you speak when sitting next to the person face-to-face? | What tone do you want your boss to use when providing a | performance review during a 1on1? | jszymborski wrote: | Just wanted to chime in and say that I still remember the first | code reviews I received and while I didn't take any of the | comments personally, they certainly didn't feel great to | receive. (I should add that I don't begrudge the reviewers, | they were nice people). | | These example notes are wonderful. They feel like an editor's | notes, not a graded exam. Something you'd get from a colleague | who is collaborating with you and not some infallible black-box | oracle. | IncRnd wrote: | Thanks! | jsnelgro wrote: | These suggestions hit the nail on the head. Additionally, the | reviewer also becomes a better dev because they're forced to | really think about and articulate why they think the code | smells. | | Even if my coworker's code doesn't feel right to me, I'll | sometimes forgo commenting if I can't articulate why. My goal | is to avoid bugs and deliver features, not to force my code | style and opinions on others. | pfortuny wrote: | Yep: the operative word being "because", absent in all the OP's | sentences. | BeetleB wrote: | I've long wanted to write a blog post on applying what I | learned from effective communications books to code reviews. | | Your comment mirrored something I wrote in another thread about | the problems with the Socratic method in general[1]: | | "If you have a concern, then express the concern openly before | asking your question. This will make it clear to the recipient | what your intent is, and they will not have to guess." | | The worst comment I see in code reviews (and sadly, all too | often) is: | | "Why did you do it this way?" | | I have no idea why I'm being asked this. The answer is "Because | it solved the problem." | | Even this is problematic: | | "Why did you do it this way instead of X?" | | Possible (unhelpful) answers: | | "Because I didn't think of X." (I still don't know if you want | me to change the code and why). | | "Because it solved the problem." | | Your examples are good ones on how to ask this question "This | could have been solved via X, which has the benefits Y and Z | compared to your approach. I suggest changing this to use X, | unless your approach has advantages that I'm unaware of." | | Probably about half the times I get something like this: Yes, | my method did have advantages the reviewer is not aware of, and | we then have a discussion. | | [1] https://news.ycombinator.com/item?id=31889518 | adhesive_wombat wrote: | > Why did you do it this way instead of X? | | Argh, yes, that's one line that might make me just walk away | from a PR as a new/junior/casual contributor. | | You, the reviewer, are an expert in the system. Likely you | are the or one of the most expert people in the entire world | on this exact thing. You know X exists and why to use it. As | you should, because you put it there. You also should know | that people who _aren 't_ experts (like me) don't know about | it, simply because they didn't use it, in this PR, when they | should have. Why don't they know it? Probably because _you_ | haven 't used it consistently in your own code, or it's not | documented. This newbie has cobbled this PR together from | what sense I can make of this project. Probably 90% is | guessed from code I found in there already. | | What wouldn't wind me up? | | "I think a better way to do this is X. It's better because Y. | Or have I missed a specific reason for X?" | | Note two things: 1) explanation to a noob of reason Y, which | may well be valuable, not only to the noob, but also in the | record of the project in general. 2) The indication that the | noob might at least have had a logical approach, and they're | not an idiot, just a noob. | | Afterwards, if this seems like something the noob should have | known from the codebase, consider that you, the maintainer, | have failed to make it clear. | | Of course, if I'm also supposed to be an expert, e.g. a co- | maintainer, then it's different. I _should_ know X. Which | means either it 's a brain fart, or I actually do have a | reason. In which case _I_ should have commented on the code, | because if another contributor can 't tell the intention in | the PR, then they can't tell in a year when no one can | remember why it went that way. | BeetleB wrote: | > You, the reviewer, are an expert in the system. ... You | also should know that people who aren't experts (like me) | don't know about it, simply because they didn't use it, in | this PR, when they should have. | | While this happens, I find that it's very common that _even | a junior developer_ has some insights the expert reviewer | doesn 't by virtue of the fact that he/she has spent more | time on this _specific_ problem than the reviewer has. As a | reviewer, it 's always better to assume you are not the | expert. | | > Of course, if I'm also supposed to be an expert, e.g. a | co-maintainer, then it's different. I should know X. Which | means either it's a brain fart, or I actually do have a | reason. In which case I should have commented on the code, | because if another contributor can't tell the intention in | the PR, then they can't tell in a year when no one can | remember why it went that way. | | I disagree, and your example is a good case of not | considering all the possibilities. | | Yes, in certain cases, X may be the obviously better | approach, and a comment would be a good idea. In many/most | cases, there are N approaches, and you happened to pick | one. If your approach has advantages over X, I don't see a | need to justify it as a comment in the code because you | then should put comments to justify it over the (N - 2) | other solutions. | | At the end of the day, the burden is on the reviewer to | specify why he prefers X. Only if he presents a case ("X is | better because of reason Y") should the developer feel | obliged to justify the decision. | adhesive_wombat wrote: | > In many/most cases, there are N approaches, and you | happened to pick one. | | I'm not sure that's always true. A lot of the time, while | there might be, in a vacuum, many ways, in the context of | a specific project (or part of), there's usually one | "most right" way to do it, considering local style, | idioms, norms and conventions. Admittedly, this might be | more true in some languages and applications. | | Sometimes there are multiple ways. Usually this means | that one or more disparate legacy ways are extant, but | there's a preferred way to move towards. | | Having PRs storm off in "exciting" new directions, | technically correct or not, is usually a bad idea once | that merges and is now everyone else's problem. | | If all alternatives are equally valid logically, it's | likely they have practical implications that differ. | Perhaps one might consider a std::set better than a std:: | vector in the abstract for your task, but maybe you know | something important about the expected number of items or | memory access patterns. This is when you should comment | if that's not obvious to someone who isn't literally just | done writing the change. | | > At the end of the day, the burden is on the reviewer to | specify why he prefers X. | | If a reviewer _is_ going to pull me up on truly | equivalent things that have no impact on correctness or | maintainability, then I 'm probably not going to | voluntarily be a co-maintainer with them. If I've | consented to be a co-maintainer, then I have either | mutual respect for the others, or I'm being paid enough | to make it worth it. And indeed, I have refused | maintainership offers in projects with ":eyeroll: why | didn't you just magically intuit X" cultures. | lloeki wrote: | > "Why did you do it this way?" | | While the question is literally (and without any other | thought) what I have sometimes in mind, usually I ask | something like: | | _I feel I might be missing some insight or context, could | you walk me through your rationale?_ | | Because if I don't get some code change I may very well be | missing something. And in any case by talking we're only | going to improve our mutual understanding, both of the | codebase and of each other's thought process. | broast wrote: | I agree with this. Don't give demands, give reasoning and | examples. | sebastien_b wrote: | Agree with adding additional reasoning, regardless of the | actual tone. | | I've received some feedback along the lines of "LOL Wut?" on a | comment in code, which I really didn't know how to take or | respond to (suffice to say its meaning was vague, and generally | unhelpful). | somethoughts wrote: | Where possible it can also be useful to point out if there are | existing guidelines/checklists the submitter should be | referencing to understand these preferences of the project. The | more the contributors can code review themselves prior to | submitting a PR the better. | | And if such a resource doesn't exist or that topic is not in | the current guidelines/checklists - offering to take up the | task of creating or adding an topic to the list of things to | check before submitting a PR can be helpful. | | Eliminating nitpicky PR comments by having pretty verbose | coding guidelines as well as pretty strict settings for | automatic code linters/syntax checkers/static type validators | means the PR feedback cycle is a lot more focused. | | And for architectural discussion - draft PRs can be useful | early on for feedback on design choices for more challenging | features can be helpful. | drewcoo wrote: | This! | | Walking on eggshells because every comment chain devolves | into religious battles about style? Find a linter or style | checker that can automate comments/fixes. Talk about those | checks in your team meeting, get consensus (who cares what it | is, just consensus), and make the tools enforce it. Or | suggest your manager do this. | | If discussing actual code problems in code reviews rankles | people, just escalate to your manager. | | If you need a special code review human language lexicon | because people can faint or throw punches, it's a management | problem. Because that's the kind of thing that makes other | people, not the troublemakers, leave the company. | wayne-li2 wrote: | Great post! One quibble with your last point -- your guide is | probably most helpful to the devs that are too direct and | blunt, and expect others to be that way to them. | IncRnd wrote: | Haha! That's an excellent way to state the issue. | fossuser wrote: | +1 the reasoning is the entire point and all of these examples | are good. | | Just telling people to make changes without telling why doesn't | teach them anything - especially when sometimes what's being | requested isn't actually better (or is at least subjective). | convolvatron wrote: | my rule is to weigh whether or not its worth making a comment | very carefully. nothing without a clear justification. never | say 'I would have done it this other way' - unless its a good | friend who you often discuss style issues with. comment on | things that you feel would make a substantial difference on | schedule, maintainability, or function - and provide a clear | reasoning with which to argue against. | | wasting your peers time trying to enforce your style isn't | just non-productive, it sours everyone on the whole exercise. | samuell wrote: | These work and sound great, but stating them without a "please" | can come off as a little brusque. Please add a "please" before | the orders, and I'll accept the advice. | mmazing wrote: | .. and sometimes after going through that exercise you might | find you don't have a good reason for what you're asking for. | :) | [deleted] | mmcnl wrote: | I agree with the tone of your suggestions, but your suggestions | still take quite some time to read. They can easily be | shortened without losing any information. For example, no need | to to apologize for being the process person (being overly | apologetic decreases the value of apologies anyway). | | Also for me it feels like you're seeing code reviews as a | senior/junior thing. It's more than that, no? | [deleted] | fleddr wrote: | My tone normally is "I believe this should be extracted to a | separate function, and here's WHY". | | The WHY is to typically refer to some best practice, coding | standards, something as neutral as possible. | | I use the combination "believe" and "should" as it's friendly but | still has some hint of authority. Another tip is to not just post | negative review comments, I also comment on things that went | well. | | When I see somebody repeatedly make the same mistake, or very | severe mistakes, I schedule a session to discuss the topic, as | there's likely a knowledge gap or misunderstanding. Invest in | people like that and make it clear that this improves life for | both themselves and the reviewer. Win-win. | | People can be very diverse, of course. Still, if you need to | sugar coat feedback too much and are afraid of a possible | backlash or drama, that's unhealthy. The exchange of good faith | professional feedback is part of business. | tessgadwa wrote: | >> There are lots of ways to provide feedback. I suggest stating | the problem with the code and providing a solution. If that's the | only possible solution to get past your review, state and don't | ask. You can also give a carrot with "do this and I'll approve | the merge." | | Yes. This. Clarity is a prerequisite for tact. | | Also, be consistent in your tone and style across reviews in a | given project or org -- no matter who you're talking to. For | instance, on one development project I was informed that all new | tickets should use the language "shall" instead of "should" or | "will." Consistent language gives everyone a common reference | point and helps keep people from feeling "singled out." | Juliate wrote: | The tone also deeply depends on the culture of the receiver. | | Depending on whether their cultural background is North American, | Scandinavian, German, French, Italian or Chinese (to pick from | the very situations I have faced), and especially if they are | more junior, you cannot expect the same outcome from the same | feedback, without additional context/care in the communication. | MattGaiser wrote: | As someone on the junior end, the tone is less relevant here than | the content, and there is not a lot of content. Why do you want | it extracted? | | Will we re-use it? Do you just not like blocks of code bigger | than X (been given this reason many times)? Do you just feel the | need to comment (a lot of devs do and I appreciate it when they | are upfront about that rationale and I have done this myself to | show that I am paying attention)? Are you concerned about | readability? | | I need to know for future code reviews, so I can avoid the issue | in the future. | synu wrote: | I think none of those, one that is focused on teaching and | explaining your reasoning would be better. You can always do it | humbly because the author may have some info you don't that they | came across when implementing, which is why it is the way it is. | throwaway4good wrote: | Looks good to me. | feliksik wrote: | I have been looking for the tone too. Tone is important for | techies, too. I just think it's not the biggest issue. | | I think the real problem is the we lack a framework that makes | explicit: | | * What is the goal of a review, according to the team? Spotting | bugs? Prevent security flaws? Guarding the architecture? Making | suggestions to grow better as programmers? These goals partially | overlap, but are different. Are you aligned, as a team? | | * Encode your priority in each comment. We could use some | semantic prefix for a comment that categorizes it as, in | increasing order: 1.suggestion to share views and alternative | approaches, do as you please / 2. I think another approach would | be better, suggest you use it / 3. I think it's very important to | change something, let's discuss / 4. I'm not willing to approve | or compromise, but feel free to get approval from someone else / | 5. If anyone allows this to be merge, I will escalate. | | Then still we should use good tone, but it's more explicit what | to expect, now. Open communication is key to a psychologically | safe environment. But I'm Dutch :-) | aruanavekar wrote: | collaborative learning for all tone | mrweasel wrote: | While some people don't like hearing it: It is also partly up to | the author of the code to ensure that reviews are handled | professionally. | | If you're fluent in English, there's a clear difference in the | tone of the listed comment forms. If you're working with | colleagues that may struggle a little with English, you can | easily read to much into the tone of a code review. The reviewer | may not mean to come of direct or even aggressive, but because | they literally just translated directly from German or Finnish | the tone will be way off. | | It's also up to the author of the code to assume good faith, and | look beyond the language used. Try to be kind when reviewing the | code of others, and assume that the reviewers is trying to help. | mberning wrote: | The key is to understand the value and importance of what you are | suggesting. "Remove this SQL injection." Vs "consider moving this | functionality to the superclass". One is a must do and not doing | it is unacceptable. The other is something that may improve the | code, but isn't hurting anything if you don't. | mhh__ wrote: | Harsh but stick a joke in there so it looks like you aren't a | dick. | therealplato wrote: | I explicitly prefix Error: when I am requiring a change, Warn: if | I am suggesting a change, Info: if I have an unrelated comment | | Error: `< n` is an off by one error, the last element won't be | processed | | Warn: Consider dropping the loop altogether. We know there are | always eight elements. | | Info: Nice name! | tialaramex wrote: | Several other people made good points about the overall review | structure that might well be _more important_. But to answer your | actual question about tone: | | There are two axes I think about here when deciding on tone. Why | am _I_ reviewing this code? And why did this person _write_ the | code? | | For the me axis, at one extreme I'm paid to review this code, and | I designed or co-designed the software that's being modified in | the reviewed change. Architectural decisions were mine. At the | other extreme, I'm just another volunteer, this system I'm | presumably interested and somewhat knowledgeable about (otherwise | why review code for it?) but I may not even be an expert, and | certainly can't be said to "own" it in any way. | | For the other person axis, at one extreme they are assigned to | work on my project, this is their job, at the other extreme it's | some volunteer who has worked with this ten years longer than me | and maybe designed it and it's good of them to ask me to review | it, they could just push commit. | | #6 "Extract this to a separate function" is a command, so it's | not appropriate unless either they're an employee and I'm | supposed to be mentoring them, or they sent unsolicited | contributions to some project where I'm an expert and frankly I'd | rather not have their contribution than take it as it stands. If | it's a project that _invites_ contributions (even very | informally) then this is always the wrong tone. | | #1 "Should we extract this to a separate function?" is a | question, and so it's not appropriate if I am expected to provide | guidance (e.g. in mentoring or when reviewing code from a brand | new team member) but absolutely appropriate if I'm reviewing code | by somebody who knows the project much better. | | #3 "I would extract this as a separate function" is always | appropriate _if_ you are sure you would do that work. However, if | you are sure you would do that work, consider just doing it | instead. In the scenario where it 's a junior employee being | mentored maybe there's pedagogic value in _them_ extracting it so | write either #5 or #6 depending on whether they seem to need the | explicit instruction or whether it 's implied in the usual | workings of your environment. In the scenario where you're a new | volunteer maybe the author has a good reason it should _not_ be | extracted and so it 's worth asking. But in the middle case why | aren't you doing it? If it's just not worth your effort the same | is true for the author. | | #4 "This could be extracted to a separate function" is redundant | and so is #2 "Could you extract this to a separate function" the | answers are "duh" and "hopefully you can do so or else you should | learn this language". So overall I think I see three tones I | would use (#1 #5 and #6), but in quite different circumstances, | two tones I think are too vague/ redundant (#2 and #4), and one | tone which is probably never useful (#3) because it suggests I | should do work instead, in which case why not just do the work | and say you did it "also I extracted this as a separate function, | [link]..."? | Traubenfuchs wrote: | Easy: | | Start with "Consider..." in case it's not a must. | | If it's a must, start with explaining the consequences, e.g. | "this value must be kept in a request scoped context or there | will be race conditions and other concurrent misbehavior. | Consider putting it in a @RequestScope bean." | McNutty wrote: | Neither of the first two nor anything else ending in a question | mark unless you're really asking a question. | | Not #3 because you're still being coy. | | I'd suggest #4 or #5 when dealing with peers but they aren't | interchangeable, they mean different things. | | Save #6 for when you're giving tons of feedback to a junior. | | If you're worried about being perceived as harsh or unfriendly, | remember you can still be super friendly in the chatter on either | side of the review session. | tetha wrote: | A good way to package possibly negative feedback is to formulate | it as an I-message, or an observation and go from there: | | "I find this method to be overwhelmingly long and it's hard to | keep track through all of it. However, it looks like this, this | and this are rather isolated steps, they could be extracted to | make the overall structure easier to see". | | "To me, this, this and this look like duplicated code. Do you | expect them to evolve differently, or could they be extracted | into a common function / module?" | | And if the code goes against architectural or style guidelines, | it also softens the feedback to start with that reason and go to | the suggesting from there. "This class was designed to be | independent of that module to be testable. Please extract your | code into the foobar-interface and inject it" | lxe wrote: | Here's a trick: always approve the code review, unless it's an | actual bug, a security risk, or obvious quality issue. Then you | can use whatever tone you want without much damage. | | "approved, but I think this should be in a separate function" | poulsbohemian wrote: | You've done a good job here, but I might suggest stepping back | even a bit further. If you want reviews to work, they must be in | the spirit of "we all improve and learn together" rather than | "bad dog! bad!" The tone you set in _why_ you are doing them, who | is involved, how they run makes all the difference in the world. | What you want is to create a culture where it is _safe_ to point | out something that could have ramifications, and to promote a | culture where there can be dialog about what 's best for the | health of the team and products you support. More often than not | though, I've seen these meetings turn into "beatings shall | continue until morale improves" sessions. | | Just my $0.02. | sfink wrote: | Lots of good suggestions. | | I don't think there are simple answers, and it's something you'll | have to figure out separately for every reviewee, and sometimes | every review. | | You have to consider power dynamics, preexisting relationships, | your own time, the importance of the change, and cultural | differences. | | If the power dynamics are too far apart, the right answer is | often "don't". A high-level engineer or architect reviewing a | relatively junior coder's patch should not be commenting on | anything involving taste or stylistic suggestions. They should be | reviewing for functionality, security, compatibility, etc. And | only bring up maintainability or performance when it really makes | a difference. | | Some suboptimal code will get landed as a result, but it's better | than creating a culture where the senior's personal preferences | are always going to win out. When there's a power imbalance, | nuance gets lost--the junior either has to bend to the senior's | preferences even when they have a good reason to do things | differently, or they have to go to a lot of effort to justify | their position. Which is fine in some cases, but it's a waste of | time and effort for things that don't matter as much. (This isn't | about avoiding hurting people's feelings, by the way, though it | does serve that purpose as well.) | | I also agree that pointing out positive qualities of a patch can | make up for quite a few critical comments. Explicitly | constructive criticism (eg sketching out an alternative, or doing | some work to provide data or justification for a comment) can | also "buy" a smaller amount of more negative-sounding comments. | | And of course, if you're swapping patches with someone regularly, | there's no need to overthink it: state the problems you see, the | things you're not sure about that concern you, the suggestions | you have, etc., using as clear and concise language as possible. | | In all cases, do not make the reader guess your actual opinion or | intention. If you're couching a criticism in gentler language to | avoid making them feel bad, that's fine, but don't play games or | leave out important pieces. There's always a way to coach or | criticize honestly, and you'll do yourself a lot of good by | finding it. | unnouinceput wrote: | A - for juniors | | 1 - This / should / could etc etc make sense only if the code is | duplicated. If it's long, better to make a sub-function and use | those in main body of the function for better readability / | maintenance. | | 2 - As for tones, you are the senior. Don't sugarcoat juniors, | tell them the truth green in their faces. You'll be appreciated | more in the future by them because you're helping them grow, not | running for mayor office and you need to be PC. Also, don't be | rude / asshole, they still need your help though. | | 3 - I found out, the best is to talk to them like you talk to | your friends. | | B - for seniors | | No sub-points here, seniors who make blatant mistakes gets | treated like juniors (see section A). Those who make honest | mistakes, well I found out they only need you for rubberducking | because mid-review they'll realize and correct / change course on | the spot. | nickjj wrote: | I think setting team goals are important before anything. For | example if the goal is to create the most maintainable and best | version of the code in the long term I think this opens up doors | for feedback not being taken personally as long as the person | giving the feedback isn't dropping lines like "why didn't you | just do xyz instead?". | | I tend to provide more open ended questions like "what do you | think about ..." where "..." could be a few options to take. In | my mind I've most likely picked one based on personal preference | but I like proposing a few choices to spark some discussion | amongst team mates and give everyone a chance to contribute. | Often times throwing out a few options will result in someone | coming up with another option that only became apparent after | they've seen a few alternatives (which is a good thing). | | It also lets more folks make decisions and that's a very | important thing. If you keep making every decision then folks | won't feel like they can contribute anything because "why | bother". I remember an old TNG episode (S3E21) around this with | "Broccoli" when he was trying to integrate on the engineering | team but Jordi kept alienating him. Picard dropped some really | good life advice in that episode! ___________________________________________________________________ (page generated 2022-06-27 23:01 UTC)