Don't Worry, There's a Method to the Meeting

Everyone hates meetings.

Most folks think they’re a waste of time, with good reason. Meetings often happen just because someone put it on the schedule or a manager wants updates.

At thoughtbot, meetings tend to be short and focused:

  • Early in the week, we have an iteration planning meeting (IPM) to prioritize work, usually by grooming a backlog of tickets.
  • Late in the week, we hold a retrospective to reflect on the work we did and adjust our process for next week.

What makes a meeting useful? Talking about product development meetings at Basecamp, Shape Up author Ryan Singer says that “the output … is a cycle plan.”

Functional meetings

Like a useful method or function, a useful meeting should have known inputs and outputs. Here’s what IPMs and retro meetings might look like as JavaScript functions:

function ipm(ungroomedBacklog) {
  // what happens in the meeting
  // ...
  return groomedBacklog;
function retro(workweekExperiences, previousActionItems = []) {
  // what happens in the meeting
  // ...
  return actionItems;

Known inputs, known outputs. A retro takes in the team’s experiences over the past week, as well as any outstanding action items, and produces a new list of action items. When that’s done, the meeting ends.

By contrast, a typical meeting might look like this:

function arbitraryMeeting(...updates) {
  // what happens in the meeting
  // ...

With unknown inputs and no defined output, it’s impossible to know why a meeting is taking place, what should happen in it, or when it’s over.

Just as well-conceived functions are scoped to their purpose, a well-conceived meeting can be scoped with an agenda that states the desired output. Topics that don’t contribute to that goal can be discussed elsewhere.

Type signatures, which define inputs and outputs for a function, express the analogy even more succinctly. Here’s what our meetings might look like as Haskell type signatures (with the final example ‘stringly-typed’):

ipm :: UngroomedBacklog -> GroomedBacklog

retro :: [WorkweekExperience] -> [ActionItems] -> [ActionItems]

arbitrary_meeting :: String -> String

Apply a method to your meetings and enjoy many happy returns.

Thanks to Joël Quenneville for Haskell and type signature help.