How GitHub Works

Ryan wrote a really great comment over at rc3.org in response to an interview Scott did talking about how we work over at GitHub. Since I can’t seem to link to the comment directly, I’m reproducing it here:


Having worked in this environment for a little while, I’m not sure I agree that these are really prerequisites, but I’ll try to comment on each:

 

Your developers must be users of the product.

 

This is probably the key to everything. Seriously. Take everything below with a grain of salt.

 

Your developers must be able to iterate without relying too much on other members of the team.

 

We rely on each other quite a lot, actually. When somebody starts pasting screen caps of some concept into the campfire and they’re really good, people want to jump in and be a part of it. Sometimes you’re working on something and are totally content and loving it but you see that somebody else is really close and they could use a hand and so you make a decision to drop what you’re doing and switch over to that because, hey, let’s just ship that real quick because it’s close and it’s amazing and it’s not like the thing you’re working on has a deadline.

There’s a tremendous amount of freedom and flexibility. More times than not, that results in people using that flexibility to work together in ways that may not have been foreseen or planned.

There’s also times when people don’t jump in on a new concept. Those things may move more slowly. Maybe they should move more slowly. There’s times when something is worked on for a couple of days and then people lose interest for whatever reason. Maybe it’s not interesting.

I think this is part of what Scott was referring to when he said, “open source software style of business”. In an open source project, it’s hard for bad ideas to gain a lot of support. The maintainer doesn’t really get to tell other contributors what to work on. They can set a vision and tone, but an idea sinks or swims largely on its own merits and whether the people contributing feel it’s worthwhile as a collective.

I guess conventional wisdom is that team planning meetings (in whatever methodology you subscribe to) can be used to get the same results in a more orderly fashion. You get everyone in a room and you ask them, “do you think this is interesting? Should we prioritize X over Y?” And everyone says, “Hmmmm. Yes, let’s do Y first and then X but definitely not B,” and there’s debate and eventually everyone comes to an agreement and starts working on whatever was decided. There’s a lot of thinking and talking and committing involved.

The problem with the planning approach in my experience is this: what people think/say they want to do and what they really want to do (or what they’re capable of doing) are often wildly different things. It’s kind of like: “put your money where your mouth is.” Say you show me some thing and ask me whether I think it’s cool or valuable and I say, “yeah, it’s great and I’d totally buy it, yeah.” And then you say, “give me $100 and you can have this thing,” and now I’m not so sure. The act of actually having to take money out of my pocket and trade it for this thing is a powerful device. All the bullshit is distilled down to a very simple binary event: I pay or I go do something else. There’s no hypotheticals at that point.

I think time is kind of like that. It’s hard to tell how it’s best spent until a real person is faced with a decision to actually spend it or not spend it. At GitHub, we have a very simple voting/prioritization system: whatever people decide to work on is a priority, by definition. If something is interesting, more people end up working on it. This doesn’t mean there’s no priorities. It just means we find out about them instead of deciding on them.

And I want to stress that there’s more than just this selfish I’m-intellectually-curious-about-X-and-so-X-is-all-I’m-going-to-work-on thing going on here. You want to ship. You want to make money. You want people to love the shit you put out. You want to kick ass. You want your coworkers to kick ass. You want the site to be stable and fast and reliable. All of those things are at work all the time and they play into what you decide to work on at every moment.

 

The business must not have customers who are promised certain features by a certain date. Customers of every software company I’ve ever worked for have requested features that no developer wants to work on, but they pay the bills, so we worked on them anyway.

 

I’ll agree that dates are hard with this kind of setup, but dates are always hard. We’re just honest about it. I’d say the only difference between GitHub and most other places I’ve worked at in practice is that I apologize for being late a lot less. The same work gets done in the same amount of time, there’s just fewer estimation errors because there’s less estimating. Actually, I feel like I get more done “on time” because I have more freedom to take things that really aren’t time critical and shift them around because I wasn’t forced to put an artificial deadline on them in the first place.

As for working on stuff that’s tedious or maybe not immediately gratifying, that happens all the time. Again, the goal isn’t always to just work on what’s intellectually interesting. Things can be interesting for all kinds of reasons. Money is certainly interesting. Helping somebody out in a jam on a support request is interesting, even though the work might not be all that fun. Plugging a security vulnerability 20 minutes after it was reported is interesting. Fixing a bug that’s flooding your exception notification system is interesting.

I want GitHub’s availability and reliability to be unmatched. The steps required to get there aren’t all intellectually stimulating. Some of the stuff is a real chore. But I want to get there dammit. Getting there is interesting.

Also, most things are interesting to someone. There’s a few areas right now that no one has a particularly strong interest in. When things become neglected, they’re very quickly obvious. They don’t have a chance to fester. They just pop and are ugly and everybody has to look at it all the time and it’s annoying. At GitHub, those things are taken as a sign that we should consider hiring somebody who is interested in that thing. The more everyone is forced to take time away from what they would rather be doing to deal with the thing, the more pressure is created to find the person that’s going to love that thing and fix it for good.

I didn’t realize I had so much to say about this. I guess I feel like I’ve already learned a ton from these guys and am anxious to share. I’m still trying to figure out how it works so damn well myself. I doubt anyone really understands the thing. We’re all pretty good at rolling with it.


Ryan’s right that we’ve never really sat down to discuss how our process works, short of us all agreeing that we like it. I’m curious to see in the upcoming years as we continue to hire additional people how our setup evolves.

Hiring talented developers like Scott, Ryan, and Kyle lead me to believe that as long as we’re hesitant and selective about who works for us, there’s no reason we can’t carry on this way without implementing bizarre solutions to problems that shouldn’t exist in the first place.

I jotted down some notes on hiring people a while ago, perhaps it’s time to actually write the post.

你可能感兴趣的:(Security,UP,Go,idea)