On Working Remotely
codinghorror.com
codinghorror.com
I have no need whatsoever for a "coding buddy." I'm considerably more comfortable working on a project solo. Even with a good team, I hate the coordination overhead.
I can, of course, and good team skills are important. I'm not saying that. But the coordination costs of software development increase super-linearly, so I tend to prefer using the minimum number of people that can possibly do a job. The break-even point is around 4-5 - after that, adding more people makes things slower, unless you can split the project into autonomous chunks.
Even though he's not universally popular around here, I'm going to admit to liking Seth Godin's "Let's call it the talent department" argument: http://sethgodin.typepad.com/seths_blog/2008/02/marketing-hr...
Working with better programmers than me > Working solo > Working with others
I guess it is a common preference
1: http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
For me, it's about experiences and perspectives. When I work with other programmers who have unique approaches to problems that help me work more efficiently, I enjoy working with them.
I also enjoy working with less experienced programmers who are willing to learn and practice new, more efficient methods.
I really dislike working with programmers who think they are awesome, but are really clueless. I try to help them, but their pride gets in the way. It's funny when they try to school me on stuff. I just don't have time for that. I feel bad for their clients.
But sometimes I run across people who know little tricks or constructs and I'm like, Wow, that's awesome, teach me more!
And i think it's great to be able to dictate code out loud. And it's a lot easier on your wrists.
We all have headphones that we wear as a "do not disturb" signal. I feel most productive on days when I can dive in and wear my headphones for most of the day.
I think I'd like working by myself if given the chance, but I've always worked for fairly traditional companies.
I can of course work on a team when the project is beyond the scope of a single developer. I prefer to work alone, since that entails exactly zero coordination overhead.
It's easy to get into the trap of thinking it's all about code, but there are lots of ways to add people. Sometimes, coders don't want to add people, because it's one more person asking them to code something. Coders often don't know how to push back and say, "This is what I'm working on, this is what I need you to do."
Every answer to an IT problem is "It Depends." In this case, the question of "Does adding more people make the project go faster or better?" is "It depends."
This question can't be answered with a general absolute.
That sounds awful. That's three people who have to coordinate in order to display a new data element, and a fourth if the new data element has any kind of interactive functionality.
It's much better to break the project up into functionally independent pieces, and have developers who can work with all of the technologies each piece touches. You're much more likely to lower coordination overhead that way.
As far as the actual programming, yes, I'd prefer to do it alone. I love being able to make major decisions (think: changing an internal API) without having to consult with someone.
At my current work, I am the only programmer in an office of designers and sales. We (I) make CMS and other custom systems for clients. We really want to move to a generalized platform instead of one-off custom systems, but due to a number of issues, we can't.
One of those main issues is that there is no one like a programming buddy to "talk shop" with. I feel I am an OK coder, but everyone gets those times when they think "Should I implement this with A, or use B? Does this need to be extensible, and if so, to what degree?"
These are questions that usually cannot be answered by someone who is not deeply involved in the project, and someone who knows what the resource costs are for implementing features, as well as the cost for needing to implement those features down the line.
Funny, I have trouble working any other way.
I was unmoored, directionless, suffering from analysis paralysis, and barely able to get motivated enough to write even a few lines of code.
I am totally grounded with tons of work and a million ideas of what to do and how to do it. I'm having so much fun, my biggest problem is finding time to triage all the possibilities in my head.
I understand OP, but that's just not my experience. Programming can be a lonely lifestyle. I have my code and my cats to keep me company. I love them both.
[EDIT: I don't want to leave the wrong impression; I am very social and used to find it challenging being alone. Not anymore. I just bury myself in my work, which is something that has to be done anyway. Now I don't want to be bothered when "I'm busy", but I do want to be bothered at most other times. Dinner with SO, time with friends & family, and visits to the hn virtual water cooler fit in perfectly. Now back to work - see you in a few hours.]
People make me feel empowered. I enjoy the watercooler talk, I feel depressed when I lunch alone (really, really down. For days). I like to talk, I like to make people laugh.
I think the lesson is to know who you are. Jeff and me like social, you and lukev like more lonely. Don't rely on blog posts telling what's better, find what works for you and go for it.
I recommend both eating alone and also eating with company of course but pls. don't pity yourself. If you do then it will be easy for others to think there's something to pity about you.
So, relax, slow down, and enjoy your meal. Because you're not busy talking, you can appreciate your food better.
The Myers-Briggs indication that Extraverts gain/draw energy from socializing, and Interverts find socialization to be an drain on their own energy, could be readily applied here.
By definition, I suppose, since a one-man shop has nobody to be remote from.
I disagree though. I'm self motivated enough to run with stuff on my own. I've built a lot of big successful things with a team size of one, and I find it the perfect team size during the prototyping and buildout phases of a project.
Sure, once you hit maintenance mode it's nice to have another person along to share the pain and help generate the discipline needed for months of refactoring and slow iteration. But when you're actually building something, I'm all about small teams.
So now we have two datapoints. If I were the author, I would have gathered a few thousand more before publishing this article.
I think you really just have 2 basic types of people: those who want to get their work done(and do it well) and those who arent really committed.(for whatever reason, incompetent, lazy, bad work ethic, not interested in the work, etc...) If you have a team of the first type, you will get things done, if not, you wont. A less experienced developer with motivation to get things finished will not let distance get in the way.
Regardless of skill level there are people that work well from home and others that don't.
One extreme, private offices for everyone, works pretty well in that you have quiet when you need it and you can also collaborate verbally without disrupting others.
The other extreme, a bunch of people in one room, works pretty well in that you can get a peripheral sense of what everyone else is doing, talking to the person next to you doesn't require hollering through 3/4 height walls, and you can always put on your headphones to signal "leave me the heck alone".
The middle ground, cube farms, tend to eliminate both useful silence and useful noise.
Personal preference matters, too. Some people just can't function in a noisy bullpen environment, while others tend to just "go dark" and run in the wrong direction if left alone.
My company is planning on moving into a new office space divided into just two sections, one speaking-in-normal-tones-is-OK bullpen, and a distinct shut-the-hell-up fishbowl space to accommodate the different work styles. I'm eager to see how it works. I actually see myself shuffling from zone to zone depending on the nature of what I'm working on.
I find it works well if the 1-2 other people working in the same space are working on the same thing, ideally as a cross-functional team, (i.e. don't have an office full of "UX" people down the hall from an office full of "DB People")
Most of the communication with my teammates is done by phone and a request tracker. If someone develops a new feature or a customer has a demand, everything goes over the rt. It works pretty well, you can always see what your teamates are working on, and how they solved a problem.
Guess I am one of those introverts too.
The part that was missing was: your mileage may vary.
I love hearing about how teams make it work. But over and over again I see a team do things one way that worked wonderfully well for them and then everybody else just copying that. Then it doesn't work.
Every project is a new game.
It's a well-worn anti-pattern
I did a presentation for EclipseCon 2010 about our challenges that you can find here (with links to a slide): http://www.eclipsecon.org/2010/sessions/sessions?id=1156
Great article though. Today it's nearly impossible to avoid a distributed team to get stuff done!
I worked as a remote employee in a group where we had half the team (couple dozen folks) in an office in Toronto, and the remainder of us scattered about in remote sites across the US.
We had a mailing list for questions along the line of "Hey, this question is important but not enough so to bug anyone in chat." It wasn't persistent in any usable manner; it archived to an Exchange shared folder hosted in the main office, and I learned that searching these folders over VPN was an exercise in futility.
Basically then you'd have new people hiring on and not having the organizational knowledge pent up from all the decisions made in the past. They'd make bad decisions in their work because either a) they couldn't search the list for help and just decided to cowboy it, or b) they mailed the list, got blown off for asking a question that has been asked dozens of times before they showed up, and will just cowboy it the next time.
Edit: Forgot to add my agreement that Google Groups-style search and archiving is key as the parent poster asserted.
But I agree, if you're working by yourself, you definitely need a very structured workplan, and it's very good to have someone to "report" to, even if they're not coders, but just as a grounding point for feedback and a passive nag to not slack off and get things done.
My group at Mozilla is distributed across seven cities (I think) on two continents. We use all of the techniques Atwood listed. At Mozilla, where a large portion of the staff is in Mountain View, it helps that my manager is working remotely just like me - so I'm not more remote from him than anyone else is.
One tip I would add is pair-programming on complex parts or sticking points through screen and vim, we have an ec2 instance dedicated for pairing which everyone has access to.
Mostly it was to deal with communicating little graphical changes to remote designers without resorting to MS Paint and email, but it does chat and voice too, so it pretty much wraps up the whole "tools you need" section in one thing.
Twiddla has its strengths but it failed when we tried to share a dynamic website. It only excelled in sharing static websites so we were unable to share websites that required a log-in or a form submission. We ran in to a lot of time consuming problems when using Twiddla so we abandoned it because we just did'nt have the time to play around. I guess it is more for communicating with remote designers and it definatly is way better than MS Paint.
Shared culture and vision plus trac with several plugins (or code.google.com) are enough.