Notes on technical team management with Pulkit Bhuwalka

Conversations · Self-Management, Startups

This is a summary largely taken for my own reference, and may contain errors. Mistakes are mine, credit for the good stuff is entirely Pulkit’s

Keywords

Team Management, Technical Processes, Scoping Problems

Pulkit’s background

Pulkit works at Google on the Tensorflow team as a Senior Software Engineer, and previously worked with a bunch of tech companies in India. He has managed teams for a while now and is quite believable as a technical manager.

General Approach

💡 Management is best learned as an apprentice or by doing it – no silver bullets to it

The greedy algorithm (with some constraints) is very hard to beat. Don't go into overprocess mode, but don't run a cowboy shop either. At the early stage, just try to figure out what’s the weak point in the moment and focus on fixing that sustainably

If your company is not burning at the moment, do some upfront design up to the level that you know the complexities and problems

Get into to the habit of creating a cost structure of what you want to want to create and the problems you want to solve

Testing is a great way to break down problems, and to keep your team accountable + on track

Two kinds of tasks: bounded (you know how exactly to do it) and exploratory (you’re trying to figure things out). Manage both differently (more on that below)

IMG_0239.jpeg

Structuring and communicating problems

For anything that involves user interactions, work out the UX steps on document first. Write down a simple doc that lists down the user flow. It'll help you throw away the ideas that are not great or important

At Google, you have design docs (applies to all kinds of design, including system design — not just UX design). You can go as deep as you need. You can use these for:

  • Early identification of design issues, when making changes is still cheap
  • Ensuring consideration of people across a team
  • Transferring knowledge of senior people to others
  • Form the basis of an organizational memory around design decisions. They’re going to be super helpful months or even years down the line

If you have multiple people working on something, you can use the design docs to create clear boundaries between them

Condense things down into a few important points

💡 Docs should be like a knowledge map, not a dump. These are the complexities ⇒ these are the tradeoffs ⇒ therefore this is why we designed this. Not just “this is what we did”

Think through testing very deeply – that will help you with everything else (more on that below)

Communication

1:1, human-to-human interaction is helpful when you want to excite people and give them a vision of what you want to do. But for following up and for scaling, write things down

Any doc should have a clear objective of what the job is trying to achieve, and connect it with the main org goal. It's okay if this is repetitive. You need repetition to get org clarity

Onboarding People

Create a ladder for people to start working. Start with easy things (easy, well-contained bugfixes) and slowly move them on to more complicated problems. This will help build up their confidence, and will let you see what they’re good at and what they need help with

At the start, assign “kind” tasks instead of wicked ones. One's that are small, contained, and where it's clear what the outcome is

Slowly onramp people to bigger and more complicated problems – particularly for more junior people so that they can build up their confidence and get more context

People might do a shitty job in the beginning but then get better. Expect that and help them get better. You want to keep growing talent.

IMG_0241.jpeg

Defining Tasks

In software, it’s very normal to be off in your calculations for how long something will take by a factor of 2. So have plenty of buffer time built in

Make it very clear to the people who are assigned the task what is most valuable, and why you're asking them to focus on that

IMG_0240.jpeg

Bounded tasks

If you know what exactly to build and how to build it, you can budget time +buffers accurately. Break down each task into its subcomponents, so you can a) make it very clear to the person doing the task what it involves, and b) create a “cost” for each subcomponent (in terms of senior and junior dev man hours) that you can use as a benchmark to check if the task is on track

That's a great way of breaking down a task, and it's easier to guide other people as well. Once these tasks are broken down, you should have some costing model that comes out of it

Focus here is on accountability and just getting the tasked shipped on time and in a manner that does not harm future tasks (write clean, modular code)

Exploratory tasks

When you don’t know how to go about something, create an artificial time box in which you must “finish” exploring to whatever level you can. Always start by writing down what are the questions you're trying to answer

But sometimes, you might not even know what the right questions to ask are. For something like this, understand that approaching experts is a lot better than reading 20 papers. Just approach well respected experts in the field to understand what you should be going for. If you’re going to do this frequently, have them on a retainer

Testing as a forcing function to clarity

If you try to think through testing very deeply, it'll force you to break apart them system and break down tasks into sucomponents. You don't have to be 100% precise in the delineation, but strive for as much as you can

Two kinds of tests: binary (pass/fail), and continuous (performance on some kind of metric)

For each bounded task, create a set of metrics to measure success. This could just be pass/fail for binary tests. For continuous ones it could be latency, paint time, error rate, user success rate for a task, or something else