Reading Broadly: A List of Good Books
This morning I gave a keynote at the O’Reilly Software Architecture Conference called “Roaming Free: The Power of Reading Outside Your Field”. Several people asked me to post a list of links to the books I talked about, so here it is.
Books Others Have Read
The first part of the talk gives real examples of non-software books that have been the source of interesting ideas in our field. Here are those books:
- The Timeless Way of Building by Christopher Alexander
- A Pattern Language by Christopher Alexander
- The Design of Everyday Things by Donald Norman
- How Buildings Learn by Stewart Brand
- The Death and Life of Great American Cities by Jane Jacobs
- “The Revolutionary Bridges of Robert Maillart” by David Billington (Scientific American, July 2000)
- Engineers of Dreams by Henry Petroski
- To Engineer is Human by Henry Petroski
- What Engineers Know and How They Know It by Walter Vincenti
- Definition of the Engineering Method by Billy Vaughn Koen
- The Design of Design by Gordon Glegg (not the one by Fred Brooks, although that one’s great, too)
- Warfighting by the United States Marine Corps
- The Mangle of Practice by Andrew Pickering
- The Buzz About Bees by Jürgen Tautz
- Better by Atul Gawande
- Complications by Atul Gawande
- The Checklist Manifesto by Atul Gawande
Books, Talks, and Essays
I also mentioned three resources that are (at least partly) about software, but reflect insights gained from other fields:
- Programming with Hand Tools, a talk by Tim Ewald
- Pragmatic Thinking and Learning by Andy Hunt
- “Tacit Knowledge” by Brian Marick
Suggestions for Your Own Reading
I concluded with a challenge to the audience to each read two serious nonfiction books that aren’t about software this year … and to jumpstart that, I provided some suggestions. Here they are:
- Mountains Beyond Mountains by Tracy Kidder
- A Truck Full of Money by Tracy Kidder
- Cognition in the Wild by Edwin Hutchins
- Chaos: Making a New Science by James Gleick
- Genius: The Life and Science of Richard Feynman by James Gleick
- The Information: A History, A Theory, A Flood by James Gleick
- Time Travel: A History by James Gleick
- Emergence: The Connected Lives of Ants, Brains, Cities, and Software by Steven Johnson
- The Ghost Map by Steven Johnson
- Where Good Ideas Come From by Steven Johnson
- Farsighted by Steven Johnson
- The Coming Plague by Laurie Garrett
- Betrayal of Trust: The Collapse of Global Public Health by Laurie Garrett
- Draft No. 4 by John McPhee
- Irons in the Fire by John McPhee
- Uncommon Carriers by John McPhee
“Real Software Engineering”
Almost eight years ago, at a conference in San Mateo, I presented a new talk that I thought had some potential: “Real Software Engineering”.
Since then, I’ve given updated versions of the talk 18 times. Each time I give it, I assume it will probably be the last; talks get stale after a while and the world moves on, and it’s best to retire old talks and develop new material.
But people still keep asking me to give this talk, and nearly every time I do, a funny thing happens: someone in the audience finds me and tells me about some book, paper, or bit of engineering history that I didn’t know about — one that sheds new light on the subject of the talk, allowing me to deepen the talk just a little more. For example, the last time I gave “Real Software Engineering” as a keynote address, Michael Keeling (author of the wonderful Design It!) introduced me to the delightful works of Gordon Glegg, which touch on numerous aspects of the talk.
Most recently, I spoke at the Melbourne offices of Zendesk as part of their really good Software Art Thou? lecture series that they host for the Melbourne development community. I’m excited about the result: they have a good audiovisual team and put in some serious post-production effort on the videos, and the result is by far the best video of “Real Software Engineering”. The talk itself is improved in numerous ways, and the video is really well done. (And sure enough, during post-talk discussions I got some valuable new pointers to relevant material.)
If you’ve never seen this talk, or are interested in revisiting it, this is the one you should watch. If you show the talk to classes or meetups, please use this version.
I’m grateful to Zendesk (and especially Jeffrey Theobald) for the opportunity to speak to so many great developers in Melbourne, and for the excellent video!
Software Art Thou: Glenn Vanderburg — Real Software Engineering
Building Trust
[Part of a series on Managing Distributed Teams.]
When are you the happiest and most productive at work? For me it’s when I feel part of something meaningful. That my work actually matters. When I work with people that I respect and value, who show equal commitment to and appreciation for my work. When I actually look forward to going to work because I know that no matter how tough is the problem I have to deal with, I’ll still enjoy working through it with my colleagues. Some of my fondest memories are actually some of the most grueling days of my career. I find that my best work happens when I can be myself and don’t have to second-guess people’s agendas or intentions. When I trust that what I’m doing is what I should be doing and I trust the people I do it with implicitly.
I’m a firm believer that the foundation of any healthy team is trust. So as a manager trying to build a cohesive team, most of your efforts should focus around building trust. And trust is important in several different directions—between:
- you and your team—that is, you as an individual and also as a representative of the company
- you and the company leadership—without trust in the company leadership you will find it impossible to do your job
- team members
- your team and any other teams that interact with or depend on your group (internal or external to the company)
When people ask me about the first thing they should focus on when joining a new team, I tell them, “Focus on building connections and earning their trust.” I clearly remember those colleagues that helped me through my first few months at every single one of my jobs, and what an impact they had helping me get up to speed, building my confidence, supporting and encouraging me.
You build trust by being:
- present or visible
- responsive and accessible
- honest and open (saying what you think—in a constructive way—and raising your hand when you make a mistake)
- reliable (doing what you say you are going to do)
- consistent
So far, I haven’t said anything that is specific to distributed teams. But clearly a lot of it is related to communication: how you communicate, and how others can communicate with you. So this is all an application of Rule #1. You have to communicate deliberately, clearly and predictably. Out of sight should never be out of mind.
In my experience, there are two key areas to focus on that will produce the best results for a distributed team. First, set very clear expectations with team members from the moment they consider joining the team. If the team is interviewing a candidate or someone who wants to transfer to the team, be very explicit about how the team works and what will be expected. This is important on any team, but especially on a distributed team, because the situation might be quite different from what the candidate has experienced in the past.
Second, commit to improving communication and creating opportunities for employee engagement regardless of where they are located. It’s very important to be mindful of the different personalities, backgrounds and skill levels in the team, because those differences will have a considerable impact on how team members might prefer to engage. If you manage a truly distributed team you will face some other serious challenges: how to communicate across time zones and how to effectively communicate with people from different cultures, or for whom the company language is not their first language.
So with that in mind, how do you go about building a communication plan for you and your team that will help you build that trust and keep everyone engaged? In upcoming posts, I’ll share some of the approaches I’ve found most useful. I’ll group them around three different goals:
- Collaborating on day-to-day work
- Building team identity
- Developing and promoting an engineering- and company-wide culture
Distributed Teams Rule Number One
[Part of a series on Managing Distributed Teams.]
Distributed teams and colocated teams are similar in some ways, and different in many others. But there is one underlying difference that is so basic it has an impact on everything else:
Rule #1 of distributed teams: Communication doesn’t just happen.
In a colocated team, there is a lot of communication that happens naturally, without anyone ever thinking about it or planning it. Some of this is really obvious. Team members go to lunch together, or grab coffee, or sometimes share drinks after work, and conversation naturally includes work topics. Employees overhear nearby conversations (and join in if they feel they have something to contribute, or want to learn more).
But there are also things you might never have considered. People notice when people are sitting together or meeting together, and from that collaboration they infer that something is happening. They see interesting information left on whiteboards. They notice reference books left on desks, thereby understanding what tools or technologies are being considered for other parts of the system. They see expressions of stress, excitement, or confidence on the faces of peers and managers. They think out loud, or ask nearby coworkers for help in working through ideas.
All of those things are passive forms of communication. People are quite good at communicating with each other and drawing conclusions from the patterns they see—so good, in fact, that it’s almost as natural to most people as breathing. That means that a lot of valuable communication happens in a colocated team implicitly, without anyone ever planning it or even thinking about it very much.
You can’t depend on that kind of thing happening on a distributed team. I mean, sure … people still communicate, and ask each other for help, and have conversations in chat rooms where people can “overhear”, and so on. But there’s more friction, more overhead, and so unless you’re deliberate and intentional about it, it won’t happen as much.
At this point, you might be thinking, “It sounds like distributed teams are inherently worse for communication.” But colocated teams have their own issues with communication, often directly related to how easy and casual it is. Think about it: you’re relying on a lot of accidental communication. It’s great that it all happens so easily, but it could actually benefit from being planned and considered a little more. People will learn important things the hard way, and then not take the time to communicate that to the rest of the team. Or an impromptu gathering will make an important decision, but forget to validate the decision with important stakeholders (or to communicate it to everyone who must follow through with implementing that decision). And background information, such as the rationale behind a decision, is frequently lost.
Those things happen in distributed teams, too. But a distributed team typically does much more of its communication in writing, and can have more opportunities to review, disseminate, index, and archive team communication. Plus, as with anything else, focusing on something and giving some thought to the best way to do it can pay important dividends: people become more conscious of how they’re communicating, and of whether the medium is the appropriate one for the kind of information involved. They are more deliberate and careful about how they communicate.
Because this is rule number one, several of the posts in this series will be about communication: the different tools, styles, and techniques that are required to make sure that the right communication is happening both within and beyond your distributed engineering team. Start paying attention to all of the kinds of communication that happen in an office, and ask two questions about it:
- How could a distributed team get some of the same benefits?
- How could we make this communication more valuable by taking it a little more seriously?
Terms: “Distributed,” “Remote,” and More
[Part of a series on Managing Distributed Teams.]
One of the earliest challenges we faced in building our team at LivingSocial was eliminating “us and them” attitudes between the “locals” and the “remotes”. That sentence should give you a clue about the problem: the words we use are important, and they affect the way we see other people and ourselves. Therefore, one of the ways we solved the problem was to rethink our choice of words.
The opposite of “remote” is “local.” At least in terms of associations and connotations, those words carry value judgments. Used literally, “remote” describes places, and means that the places are challenging and time-consuming to reach. But we also use “remote” in reference to people: those who are withdrawn, cold, or hard to communicate with. Calling the on-site developers “local” and others “remote” helped to reinforce a class distinction, where everyone perceived the remote developers—at least a little bit—as second-class citizens. That affected how the “local” developers worked with the remote folks; perhaps worse, it also affected how remote developers saw themselves, causing low morale and a sense of isolation. The result was reduced productivity and retention.
Additionally, apart from the cultural issues, those terms encouraged two different sets of communication and coordination patterns. Teams comprised mostly of “local,” on-site employees would naturally adopt a culture and communication style appropriate to a colocated team (impromptu conversations, mostly voice communication). Teams of “remote” developers would depend much more on email and chat. This meant that we effectively had two teams: the developers who worked at headquarters, and those who worked remotely. That wasn’t what we were aiming for.
We chose to start emphasizing the term “distributed.” Rather than a team with some local and some remote developers, we were all on a distributed team. The words “remote” and “local” aren’t forbidden, and in some contexts they’re still the right words for a legitimate distinction. But the emphasis—especially when speaking about the whole team or our work style, collaboration techniques, and communication patterns—is on the word “distributed”.
It took a while to change the vocabulary throughout the organization. But after that, it didn’t take too long before we started seeing the positive effects. In this series we will talk about several specific ways that on-site and remote employees can choose to work in the same way, easing communication and collaboration across the organization. For now, it’s sufficient to say that adopting this vocabulary was a big morale boost for the remote employees, and helped to build a more unified team.
There are other terms that some people use, and that we considered. You might call a team that emphasizes satellite offices rather than working from home a “multi-site” team, and many teams that engage in offshoring fit that model. Multi-site teams have some of the same challenges, plus some additional problems; in our opinion, choosing a multi-site strategy sacrifices many of the benefits of a fully distributed team.
Two other terms are found in the titles of the Wikipedia pages that address the issues we’re discussing: Virtual team and Telecommuting. While there’s nothing necessarily bad about those terms, they didn’t resonate as well with us. I doubt that anyone on the team at LivingSocial would say there’s anything “virtual” about it: it’s very real, with a vibrant, dynamic culture. To say that a team like ours is “virtual” implies that the most important thing about “real” teams is that they sit together, and that’s silly. And “telecommuting” seems to describe tools and techniques rather than the team itself; at best, just like “local” and “remote,” it refers to individuals on the team rather than saying anything about the team as a whole.
Words can divide and belittle, or they can build up and unify. And even neutral or positive words, chosen poorly, can distract us from what’s important. The right words can make a huge difference. We saw things start to change for the better at LivingSocial when we focused on the term “distributed” as a word that included all of us. That’s why we’ve titled this series “Managing Distributed Teams”.