Spend More Time Talking to Humans | Honeycomb

A few months ago, I noticed something happening. I would spend all day working with LLMs—prompting them, reviewing their work, and correcting them—and when I wasn’t working on my own code, I was reviewing LLM-generated code. By the end of the day, I was exhausted. This was a very unusual thing for me: I’ve been a software developer at startups for 30 years, and while sometimes I might have gotten stressed out, I had never been exhausted by the actual act of writing code.

And I noticed that I wasn’t the only person. My peer staff engineers were also tired. The junior engineers on my team were stressed out and worried. LLMs were doing more of the work that they would have normally done themselves and they weren’t sure that they were learning the right things to continue to have a career. On top of that, they didn’t even have a real idea of what that might look like.

It felt like, overall, the team was shipping more, but understanding less. We were worried about the quality of the code that we were shipping, worried that the next time something broke in production, there wouldn’t be anybody able to understand it and fix it. We also had less and less of an idea of what was going on outside of our team as well; everything was moving faster and it was harder to keep up.

Read our O’Reilly book, Observability Engineering

Get your free copy and learn the foundations of observability,

right from the experts.

Download Now

What was happening, and what could we do about it? Well, LLMs have drastically changed how software engineering is done. I’m going to elaborate on my observations on what those changes are. As for what we can do about it, the title of this blog post gives it away. But it’s important to know why we should be spending more time talking to humans, who we should be talking to, and about what.

LLMs have changed the core work of software development

The root of what’s happening (and why we’re seeing so much more exhaustion and stress) is the fact that LLM-driven coding is changing core parts of the software engineering lifecycle and of the day-to-day work of a software engineer. To understand these changes, we need to go back to first principles and remember what it is our teams are trying to accomplish.

What is the core of software engineering?

For me, the core of software engineering involves the following four functions:

Typically, this has been treated as a loop (note: this is also known as the Plan-Do-Check-Act cycle in other domains. I like DIVO because it’s a cooler acronym). Design up front, implement by writing code, validate through code review and testing, and then operate in production and deal with the fallout. We’ll call this the DIVO loop going forward.

A pre-LLM workflow

How did this high-level core manifest itself? A typical medium-sized project might involve this work:

For the most part, it meant that there was a rhythm to the day. For example:

What has changed?

LLM-based development is different in a few specific ways that have cascading impacts:

Instead of a single long DIVO loop covering multiple days, you’re doing dozens of small DIV loops inside a bigger DIVO loop.

Overall, less time is being spent on implementation, and more time is spent doing design and validation.

What hasn’t changed?

It’s also important to know what aspects of software development LLM-based development don’t change:

Another important result of adopting LLM-based development broadly is that you can expect that everybody else is shipping faster, not just your own team. This means that the amount of cross-team collaborative communication needs to increase.

What is the impact on individual engineers?

Let’s look at the impact of these changes on senior and junior developers (I’m not referring to traditional senior or junior engineer levels. I’m referring to senior and junior on the relative experience and responsibility scale).

As a more senior engineer:

As a more junior engineer:

Recapping:

Senior engineers are exhausted by spending more of their time doing high-skill, high-effort work, which involves lots of context-switching and loading new context. They feel like they are the bottleneck for the output of their team/company.

Junior engineers are stressed because they feel like they are being replaced. They want and need to improve their design, validation, and communication skills, and the best way to get these skills is by working with more senior engineers. But the senior engineers are busy because they are the bottleneck for the team.

In addition, everyone is feeling stress simply due to the overall uncertainty that AI as a new technology introduces.

How do we solve these problems?

Reduce parallelism and context churn

Explicitly fight against parallelizing and fragmenting work at an individual and team level. Fight the instinct to try and use AI as “efficiently” as possible by doing more and more work in parallel. You’re not necessarily getting more work done that way, you’re just generating more context churn for everyone on your team.

If you do parallelize to try to move faster, structure the work in ways that allow you to reduce the amount of context that you need while you’re working on them. If you’re going to do side quests, make them related to your main quest, or have them be related to each other.

Pair (but don’t pair program)

Reduce parallelism and the need for context switching and transfer between team members by having pairs of developers work together. In particular, consider having pairs of senior and junior developers work together in a master/apprentice setup. This doesn’t have to be a long term thing—it can be just for an individual small deliverable—but you want to avoid changing out who’s working on something if you can avoid it.

I’m not advocating what you might stereotypically think of as pair programming. LLM-based development means pairing is very different, and arguably much more beneficial than it used to be.

In traditional software development, pair programming often meant that you were doing implementation (writing code) together. This was strictly a consequence of the fact that most time spent in software development was doing implementation.

While beneficial, it wasn’t necessarily as meaningful as it could have been. Oftentimes, implementation didn’t lend itself as well to transferring critical skills that characterized being a senior engineer.

LLM-based development is much more focused on rapid design and validation cycles as opposed to implementation. This means that there are more opportunities for the junior engineer to learn valuable senior-level skills of design and validation, as well as to transfer critical context on what’s being worked on between participants.

In these rapid design, implementation, and validation loops, pairing compresses what might have been weeks worth of learning about how to design and validate systems in a pre-LLM world into hours. You can level up your junior engineers much faster than you used to be able to, as long as you create the right environment for learning.

Focus on:

Communicate with other teams

Remember that your team is part of a broader organization and everybody moving faster means that there needs to be more overall coordination and communication. It’s important to spend more time keeping track of the broader context of what’s happening around you.

Use the same principles of spending more time talking with each other with other teams. Spend more time talking about what projects you’re working on with each other. Think about embedding engineers from your team in other teams you’re working with.

Conclusion

As AI coding continues to accelerate the pace of software development implementation, it has become increasingly important to understand its impact on the people and the human systems that surround software development.

Those impacts can be good rather than bad, but only if you proactively change how you work in a way to adapt to those changes and focus on what the people on your teams need.