I currently work for a company named Sleepycat Software. We are a completely distributed company and we make our money by licensing and providing support for the Berkeley DB database system.
I'm going to use the word "focus" as much as "management". First, while it's not immediately obvious in many companies, the purpose of management is to help you get your job done. Better. Faster. Not get in your way. That's the kind of management I want to talk about. The kind of management that helps you determine what are the important problems to solve, and helps you focus on solving them. Second, well, people tend not to get so upset when I say "focus" instead of "management".
You joined this group because you cared about its goals. In fact, since you aren't getting paid, I know that you care more about the groups' goals than most people care about their "job". And, frankly, as a group member, my point-of-view is that I don't want my teammates getting off track, because it lessens my chances of reaching my goals, and maximizes my chance of having wasted my time. You need to understand the engineering management issues in your group if for no other reason than to defend your own self-interest in getting your goals accomplished.
As an example, consider a dot-com CTO working in a virtual group with a Japanese high-school student. The CTO is going to have a difficult time deferring to the student on technical issues. The student, coming from a culture with a strong power boundary, is going to have a difficult time telling the CTO that they're wrong. And, the whole group will feel the tension.
Email isn't anything like a reasonable communications protocol. The success of emoticons is an absolute indictment of the ability of email to distribute information. Speaking as a man who has broken off relationships because my SO dotted her i's with little hearts, I find the fact that half the world puts smiley's in their email to be one of the principle signs that the Apocalypse is upon us.
To keep the cats going in the same direction, you have to know where they are, and you have to know when they've wandered into the weeds. In a virtual company, replicating that simple 10-minute walk-and-talk down the hall requires hours or days of exchanged email, telephone calls and so on.
Even meeting physically once a week won't give you the kind of synergy that you get from a team working at the same location. And the technology for virtual meetings isn't widely available yet, and, even if it were, current indications are that it's not going to be a sufficient substitute for physical meetings anyway.
The kind of "meetings" that work best are the entirely unplanned opportunities for discussion in the hallways and coffee shops, or where you get dragged into a room with a whiteboard to work through a new idea.
At BSDI, we had a saying: "The best thing about a distributed company is that you never have meetings. And the worst thing about a distributed company is that you never have meetings." At the CSRG, if there was a policy decision to be made, everybody went into a room with a whiteboard, shut the door and in 20 minutes, well, there might have been unhappy people, but we had a direction in which to proceed. When working in a virtual team, I've seen 20 minute engineering decisions take weeks, and I'm not exaggerating even a little bit.
A book I read some time ago had some wonderful case studies of companies trying to create mission statements. My favorite was the company where an N-million-dollar business unit was actually split into two geographically separated parts -- it turns out the group really had two completely different goals, and resources and people were getting frantically shuttled around trying to keep things in balance.
We're all smart folks, right? And we all know what we're doing, right? There's a joke about the fact that every committee with N people has N - 1 agendas, because somebody has to take notes. Don't forget that, and don't assume that because all of the people in your group are bright, motivated people that they all agree on what the group is doing and where its going.
I want you to know that that I find it encouraging that nobody in the audience screamed and held up a religious object to ward off the forces of evil when I said "process". Usually, when I talk about increasing the level of process in an organization that's what happens, and somebody tries to shove a stake through my heart when I'm on my way back at dawn to sleep in my coffin.
And, fewer decisions to make should mean fewer ways to screw up. If there are fewer decisions to make, there are that many fewer decisions that can be made badly.
But, as part of doing it, I created a list of "OK words", that is, words that were used in each man page that were OK, regardless of what spell said. Then, I created a couple of simple commands: one that updated the list of OK words, and one that did a spell check and compared the output against the OK list, kicking out any words that it finds that weren't in the list. From that time on, I could easily spell check the system over night, and, what's more important, I could get other people to do it to -- there no reason not to check if it's easy to do.
We're all smart software developers and we like to think that we're good at elegance and precision. However, that's only true in our own areas. If you look at our projects, they're often sloppy globally. Features are released without documentation, significant changes are made in the code after initial release, code is only tested in the field, important fixes are backed out in later releases because the current developer doesn't understand why the change was made in the first place, and there's no test suite. Process can solve these problems.
The trick is, everybody has to take their medicine or it won't work. The group needs to set up simple processes, and once they're in place, everybody has to follow them. This means that there's an absolute requirement that the processes be simple enough to follow and that the advantages of following the process be clearly evident. Everyone in the group has to understand that process is good, and agree upfront to put it into place.
You also need to make the process part of the project infrastructure. People join and leave Open Source projects over time, and new members need to understand, abide by, and improve the processes that are in place. It's important for the leaders in the project to advocate process, to reward people for putting it in place, and to encourage everyone to use it.
One of the interesting things about the recent Verizon strike was that mid-level managers were on the streets, manning the phone trucks. Think about your organization: does everybody know roughly what everybody else is doing? Does everybody know where the important information can be found?
It's possibly apocryphal, but the story I've heard is that at one time, everybody in the phone company spent time on the trucks, so that in times of emergency, everybody could be used out in the field. And, the story goes that Dennis Ritchie has apparently spent time climbing telephone poles. So, ask yourself this question: can everybody in your organization climb your particular telephone pole?
I don't recommend that groups randomly swap jobs around, although some job swapping helps keep people engaged and learning, and happier with their assignments, not to mention more interchangeable. As a simple rule of thumb, I want to be able to replace anybody on my team, with someone else from the team that has at least a reasonably good idea where the bodies are buried. To do this you'll have to plan assignments and code review so that people can become at least passing familiar with parts of the code base other than their own.
I personally have spent dozens of hours, not even counting that DAT drive the FreeBSD SCSI subsystem was treating in some oddly blocked way. In every organization I've worked with, I've complained loudly about this, and in every one my complaint has been answered that there are too many device drives to convert, and finding the answer for any individual drive isn't *that* hard. That argument is certainly correct, but not particularly satisfying -- imagine if Version 7 UNIX had had this process in place, think how much better UNIX system administration would have been for the past couple of decades.
Put your process in early, and expand, or remove, it as necessary.
The longer you wait, the harder it is to fix. Another way to look at this is that you are, by definition, putting process into your organization. It may be bad process, it may simply be "Bang your head against the wall until it works", but it is process. It seems better to me to put in good process rather than bad.
The story goes that Bill Joy implemented multiple windows in an early version of vi, so, around 1980 vi had multiple window support. The code got lost when a disk drive crashed, and nobody had done backups. So, for lack of a single backup tape, the UNIX world lacked a significant feature in a significant tool for 15 years. ASPs are a wonderful way to solve this problem -- there are several that offer free or inexpensive software and marketing support to Open Source organizations..
It's hard to list many specific items, because each team has its own needs, but you know what I mean.
For those of you who are about to comment that I'm the guy always answering questions about Berkeley DB on USENET, well, parts of this talk should have a note saying "Do as I say, not as I do."
And, remember, experience is that thing that enables you to recognize a mistake the second after you've made it again.
Parkinson explains that this is because a power plant is so vast, so expensive and so complicated that people cannot grasp it, and rather than try, they fall back on the assumption that somebody else checked all the details before it got this far.
A bike shed on the other hand ... anyone can build one in a weekend. So no matter how well prepared, no matter how reasonable you are with your proposal, somebody will seize the chance to show that he is doing his job, that he is paying attention, that he is *here*.
Richard Feynmann gives a couple of interesting, and much to the point, examples relating to Los Alamos in his books, as well.
As decision making gets done farther down the chain, then there are fewer decisions that come to the attention of many people, and the group spends less time thrashing.
But, you say, what if my junior person, who I've given this decision too, messes up? It just doesn't matter -- I'll talk about that more in a minute, but the bottom line is that we'll fix it in the mix, we'll fix it next release. It just doesn't matter. And, your junior person will have learned a lot, and, over time, they will make better and better decisions. If they don't, get yourself a new junior person. That said, people that volunteer to do work rarely need replacing. They usually are motivated enough that they want to get the job done right.
The problem is that we're engineers, and we hate to give up control. We'd rather give up a kidney than let someone else make decisions about our code. And, in your groups, this isn't a job. These people are doing it *because* they like it, and that means they're going to care. Part of the reason that you've been stressing your mission statement (remember that?) is because it gives people something to focus on that allows them to agree that the details are less important.
People will find a goal to pursue, it's human nature. If you go home feeling like you've made a difference, you feel good about yourself and the project. If team members don't have an overall project goal, they will instead focus on the smaller engineering goals, and that's precisely what you want to avoid.
If you still can't give up control, keep reminding yourself that it doesn't matter how you solve most problems. I submit to you that in this room we have about ten people that have modified the source code for the UNIX utility "ls". And that's just wrong. Nobody out there could care less about the ls utility -- all of us could replace ours with the one from FreeBSD, BSDI, OpenBSD, NetBSD, GNU or Linux -- it just doesn't matter. Part of focus is understanding what the real problem is, and making sure that you're putting your time in where it matters.
As specific suggestion for this audience, I think that we should all adopt a single port/packaging mechanism, pick a junior-level maintainer for 90% of the utilities in the system, and start treating the standard utilities in the same way we do the "port" utilities. Because the bottom line is that it just doesn't matter if we get the ls utility "right" or not. People don't care, and it just gets in the way of focusing on what we're really trying to accomplish.
And let me be clear: it doesn't matter what you say in the status reports or at the party -- talk about your latest big deal that everybody knows about, some milestones that you hit, a terrific bug fix by a team member, whatever. The goal in both the status report and the phone conversation is to establish the sense of community and culture, and shared goals that are essential to a good software team. Everybody has got to feel like they're pulling toward the same goal and that a success for the team is a success for everyone on the team. I'm not going to go into a lot of detail here, there are a million books on management and team motivation out there. You know what you need to do here, and I'll bet you anything you like that most of your teams aren't doing it.
And finally, here's a quick organizational test: if you aren't doing status reports because "it's too much work", or, "it would take too long to pull together the information", that's a good indication that you're overloaded, and you need to start moving more decision making and tasks to other people.
One of the folks at Sleepycat, Mike Olson, has a great analogy for this. You've got people machining bolts, casting the engine block, and wiring up the starter motor, but at the end of the day, someone needs to be sure that the car runs. Good engineering practice is to do unit and system testing. Everyone hates writing tests, and so many pieces of software don't get adequately tested until the car is on the freeway doing eighty miles an hour with a family of four inside. Failure is cheap at the factory and expensive on the road. It's important to make sure that you fail at the factory.
I want to use this as an example for my earlier comments on process. Various groups, mine among them, have been threatening to write man pages for the BSD kernel modules for the past 15 years. What if it was standard practice in 1980, that adding a new kernel module to the system caused a man page describing it to be written, as we do for new utilities?
Would the world be a better place right now or not? Would your programmers be better off or not? The reason it's happening only sporadically now is because doing it well would take 6 months of a senior engineer's time, and it's not going to be much fun. Putting process into place early can involve putting in process that you didn't really need, but getting process into place early will pay off in tremendous ways ten years down the road.
If you code for simplicity, you get your product out the door faster, you spend less time debugging, and it will run as fast as it needs to run.
It's easy to find projects where this didn't happen: they're the projects that are perennial failures: once a year some subgroup in the virtual team tries it and gets nowhere, or makes a little progress but get bogged down, or, actually get it "almost" done but have to mothball it because there's a release coming up and they can't quite push it out the door.
Part of this bullet item is recognizing your strengths. You have a lot of man-power, but it's intermittent man-power, and it's geographically distributed. What are we good at? Writing Perl modules, internationalizing software, building inherently modular software like the C library and most of the UNIX kernel. What are we bad at? Writing a new kernel virtual memory. Writing database software, or other places where algorithms and a long software debugging and maintenance cycle does matter.
Manpower, the Open Source project's greatest resource, has a fatal flaw. It doesn't scale. In your groups, you need to concentrate on ways to turn what you're bad at into what you're good at. Have two of your best engineers create the framework and everybody else fills it in. You have a million device drivers? Invest your good people's time creating better abstractions for device drivers, not in writing the device drivers themselves.
Finally, do everything that you can in a scripting language -- your programmers will be far more productive that way, and scripting languages are fast enough now that we need to start the conversion, at *least* enough that we're driving the design and evolution of the scripting languages to be sufficient for our needs.
For example, Linux and BSD systems are making inroads in the Windows/NT and Solaris server market. Now, this is something I know something about: Sleepycat Software makes its money from high-performance, heavily-threaded database engines on 4, 8, 16, 32 processor systems. Applications trying to move as much data as possible. And Solaris is better than Windows at both base and threaded multi-processor performance. Regardless, Windows is penetrating the Solaris market. And, both Solaris and Windows are better than BSD and Linux systems in my type of high-end server applications. And it doesn't matter: both BSD and Linux are penetrating those markets.
And, the statement "engineering doesn't matter" leads to the corollary: "marketing is everything". As you consider your Open Source team, as you write your group's plan, you have to focus on who your target users are and how you're going to get them to try your ideas. You also have to think about who your target developers are, and how to get them to join your group.
First, I'd like to tell you all how impressed I am with how the BSD groups are executing in general. Most of the things that I've talked about are done better, I think, by the BSD groups than by their competitors. That said, I'd like to talk very briefly about some of the specific issues that I think Open Source organizations and groups using Open Source software need to focus on.
Most of the folks in this room are well-informed and fully convinced one way or another, and I don't think that I'm going to change anyone's mind. However, there are a couple of points that I've already made that I think reflect on the larger question of which developmental model is appropriate for any single project. However, as more companies consider what parts of their business should be Open Source, and more Open Source projects consider how to get revenue from their work, it's an important issue.
The quality of the source code written by small, well-focused, well-managed, group of programmers working in a single location is generally better than that written by a large, amorphous group of geographically distributed programmers. You can have quality code come from Open Source projects or proprietary vendors: the question becomes, in which environment can you create the right group to write the code?
In general, it's easier to create a small, well-focused group in a proprietary environment, mostly because you get them 8 hours a day, and you get to be firm when telling them what they're going to focus on. In particular, that means that you get them to do the boring stuff, for example, documentation and testing.
The only point of which I'm absolutely convinced is that we should expect the future to be wildly different from the past. I've been typing the command "ls" for roughly 20 years, now, and I think that should be enough for one lifetime. We *are* going to see more powerful, more intuitive desktop models. The Web took everybody by surprise, and I don't see any reason to believe that we'll see the next set of changes coming, either. That said, I think that if we keep our heads about us, if we create focused development groups with structure that will allow them to thrive, those new applications will be developed on BSD systems.
I have always thought that one of the obvious choices for an Open Source group would be system administration, because I believe that it's a problem best attacked by creating a good framework and then having a large number of people contribute within that framework -- and, as Open Source, once available it should not be difficult to convince other Open Source maintainers to create their new application releases in the context of that framework.
Thank you for listening.