communication for developers - estimates code reviews and other hard problems

Abstract

Shannon communication model:

sender -> encoder -- channel --> decoder -> receiver
what you want to say -> what you say -> what they hear -> what they understand

The communication goal is to have what you want to say == what they understand.

Communication in estimates

Most important question: why do you need estimates? You can’t communicate effectively without understanding the other side.

What to explicitly mention

When estimating a release date:

  • scope: what will be released an to whom
  • num of dev-days: how much work-time it will take
  • uncertainty factor: how confident we are about the work
  • assumed dev assignment: how many devs will work on this
  • assumed dev availability: how much time a single dev can devote
  • end result: what will be delivered
  • final date: by what date we expect the release

Example:

Quote

  • ~55 man days of work
  • uncertainty factor: 1.2 (domain is well known but provider is new)
  • 4 work days a week (as usual, meeting and operations taken out)
  • 1 dev
  • 55 * 1.2 / 4 = 16.5 weeks = ~4 months = 1st December Usual disclaimer: closer we get to that date, the more precise the estimate will be.

Estimate vs commitment

Be clear:

  • estimate = prediction
  • commitment = promise

Code comments

It’s a message into the future.

Humor is valuable!

Error messages

Another message into the future.

Tips

  • Leave breadcrumbs behind: pieces of context that will help in future investigations.
  • Build in the open: you can never know who might be interested, who might be affected, and if it’s not you who misses some context.
  • Keep people in the loop.
  • Coordinating releases:
    • It can be really complicated, when multiple parties are involved (mobile, backend, marketing, legacl, …).
    • release != deployment
    • Threads & emojis can be enough

Pull requests

Author

  • Find reviewers:
    • Concrete people, not groups.
    • As many as you need, but not more.
    • Diffusion of responsibility: the greater the number of bystanders, the less likely it is that any one of them will help.
  • Put a deadline: explicit date by which you want to merge.
  • Make it reviewer-friendly.
  • Make it small.
    • If not possible:
      • description: what the PR is about
      • highlights: the most important places to look at
      • remaining TODOs: to know what is not done yet
  • Don’t force-push, the reviewer won’t know.

Reviewer

  • The LOGAF (Level Of Give A Fuck) scale.
    • Not all comment are equally important.
  • Use conventional comments.
  • Don’t be a jerk.
    • Propose solutions (e.g. new names).
    • Offer help (e.g. pair programming).
    • Show empathy (e.g. no one wants to fix stuff ad infinitum).
    • Pick your battles (not every issue is important, perfect doesn’t exist).

Everyday communication

  • Don’t just “hello” in asynchronous communication.
  • Repeat, repeat, repeat: people will forget, miss messages or misinterpret. This is normal.
  • How to get a response?
    • Target your messages.
      • No explicit @mention no response.
      • Ping someone even if you’re not sure if they can help.
    • Explain why you need something.
    • Explain when you need it.
  • Give the responses you want to get.
    • If you don’t know the answer bu you know someone who might, ping them.
    • If you don’t have time, say this.
    • If you plan to look at it later on, say this.
    • If you started looking
  • Adjust the tone.
    • Over-enthusiasm can be worse than grumpiness.
    • Don’t be a pushover: some messages need to be harsh.
  • Adjust the formatting.
    • Messages should be easy to scan.
    • People are busy, most of them won’t read a wall of text.
    • Put a TLDR at the top.
    • Bolden the essence.
    • Use bullet points.
    • Don’t over-do it.
  • Call or message:
    • Meetings are costly, inconvenient, annoying. And effective.
    • Threads with more than 10 messages sent in an hour should be a call.
  • Be gentle with @pings.
    • Use as little as possible not less.
    • When pinging from long thread, summarize, don’t be a jerk.

Principles

  • Understand.
    • Try to think why the question is being asked.
    • Don’t take the message at face value (but sometimes do).
  • Ensure the message was understood.
    • Don’t stop at saying what you want, make sure the audience got it.
    • Don’t be the UDP.
  • Adjust to the audience.
    • Try to imagine how your message will be received.
  • Don’t be a jerk.
    • Formalities, conventions, smiles matter.
  • Language proficiency is less important than you think.
    • Sophisticated language is an enemy of efficient communication.
  • Brevity matters.
    • The shorter the message, the bigger the chance it will be read in full.
    • Where brevity matters the most: in code comments, in documentation.
  • Communication in the open.
    • It’s easier to ignore a message than to become a telepath.
  • Effective communication is hard and costly. It’s not always worth the effort.