My Remote Mob Programming Experience
blog.t-systems-mms.com
blog.t-systems-mms.com
For certain fiddly things, it can help a lot to have several eyes. "Spot the bug" type issues, perhaps. Also "let's design and agree this interface" seems like a thing that might work, eg if you're all implementing the interface in separate backends on your own time. The big one is probably "let me show you how it currently works" which probably a lot of people have done as an intro to a new team.
But just generally coding as group I think could get tiresome. You'd have to think about how to navigate things socially, ie how do I get the shy person to bring their ideas if they have any, and not let the domineering one keep talking over everyone? Plus you tend to think faster than you can implement, and that impedance mismatch would need to be dealt with across people.
Finally there's the cost of it. Four devs could easily cost the company a million bucks a year. 250 days of $4000 8 hour days -> $500/hr. Seems like a lot, you'd better have some quite scalable income to make it worthwhile. It's definitely not impossible, but chances are you want to sometimes use the $500, sometimes work separately.
Also there's tools to make this a lot easier these days. VS Code lets you share itself online, that's pretty useful.
You are absolutely right. We also don't want to work like this all the time.
As always this is a tool which is suited for specific circumstances. We found it really helpful for implementing things that need a lot of discussions or for distributing knowledge. These are instances where you need a lot of time talking with your team anyways so the mob is a combination of implementation and the separate discussion, reviews or knowledge transfers that you do regardless.
Opposed to this, the mob is absolute overkill, if you write boilerplate or uncontroversial code the whole time. Also in situation where nobody has knowledge and all members of the mob are struggling to continue it might be better to quit and choose one or two scouts to gather knowledge before continuing.
What I recommend is increasing the rotation time to 25-30 m, especially initially.
The approach I'm experimenting with now is using vscode remote (ssh) and working with a shared remote workstation (running on EC2 and GCP).
Pros:
- no need to worry about sharing the same environment (all of you work off the same workstation after all)
- less infra: no need for external CI (you can just run the build scripts on the workstation, via commit-hooks).
PS I wrote a quick, practical overview of different pairing/mobbing patterns: https://sonnet.io/posts/snakes/
Anyway, I have a few mobbing tips that I use daily (have been consistently mob programming for 2+ years every day, and my previous job was pair programming all day for 2 years, as well):
- No heroes in the mob. If the mob cannot function without a specific person, then you are not mobbing. The only exception may be when a mob is first brought together to work on a new problem where only a single person has domain knowledge, but that shouldn't be relied on beyond a sessions or two.
- Respect the timer, but be flexible to finish ideas. Strict timer adherence can sometimes kill the mood, but when someone takes over, it can also kill it. Always acknowledge if the timer is up, and if you need to finish something, ask the mob if it's okay. Don't continue if people disagree.
- Prefer high level intentions. Don't tell people "make this variable, call it foo, and use it fetch from this endpoint" if instead you can say "can you fetch this data and store it?" - people can always ask for clarification, but they should be free to figure out the problem on their own.
- Ask for corrections after your coder is done writing an idea. If someone has the right idea, but is writing the wrong code, let it play out for a moment. Maybe the code being writing is considering a problem you haven't, or at the very least, the person writing the code can explain it when it's done so the team can decide if it's good or not. Trying to throw in corrections as someone is typing is a lot of cognitive overload.
- Reflect often, and honestly. After you're done a session, see how it went. It's okay to call someone out for being too bossy, or highlight if someone isn't being heard, as long as it's done for the sake of being a better team. Maybe the timer is too long, maybe there are too many people, maybe not the right people, and all these sorts of things should be thought about as a team.
Basically, staring at the same code with a group of people is a great way to spread knowledge in a casual way while actually solving some issues. The issue solving is a nice bonus but it's the knowledge spreading that really counts. You pull people slightly out of their comfort zones by making them work on a topic that isn't necessarily their specialty so they learn a few new things. And they pay attention to how others work.
One surprisingly useful thing is that the way people use tools; or even which tools they prefer can provide learning points for others. Somebody will use some neat key combination or some arcane editor feature (e.g. multi selecting bits of text) and you see multiple people doing that some time later. So, this is where I disagree with the article: the last thing you want is everybody using some uniform development environment. Let people use what they want to use show what they can do with those tools. And in case they are being clumsy, somebody will tell them "why don't you just ..." and end up learning something.
And finally, they get used to solving stuff together instead of being lone wolfs. I love it when I see people spontaneously decide to hop on discord for an hour or so to solve an issue. Often all it takes is just the realization that help is a chat message away and you can just share a screen and look at stuff together and figure it out.
We based the sessions roughly on the book https://pragprog.com/titles/mpmob/code-with-the-wisdom-of-th... - having some kind of system is highly recommended.
While I haven't got the chance to do mob programming ever since, I'm looking forward to change this in the future. It's such a great tool for mixed-experience teams (especially good for onboarding new hires or junior devs) or cross discipline teams (having a product manager in the mob really helps removing boundaries).
This seems to be an example of how mob-programming would encourage a "put a hammer to it" approach rather than something more delicate and flexible (e.g. using a meta-build system like CMake to account for platform specificity).
I'm not saying that's always a bad thing, but if this is how many/most problems end up being handled then I'm not sure I like it.
However in this session we already spent considerable time just to make us all productive and I agreed with the solution to use Docker.
Was disappointed....
I'll go Bartleby: I'd prefer not. The entire reason I ever got into programming is because it was a refuge from dealing with people. Working alone on a technical problem is energizing; working with other people on the same is frustrating and makes me want to do violence within an hour or two.
Some developers really like to be left alone, and it's terrible for the business, but it's been an unspoken thing (or spoken, i.e. Maker Time) for so long that any attempt at disrupting the freedom triggers a substantial backlash.
This looks like a lot of fun, I hope I'll be able to implement it someday...
Personally I don't mind pair, live collab, etc., but I cannot really justify it productivity-wise. I just don't get as much stuff done as when I'm alone.
And it goes without saying that we developers love our freedom because it means we can work at our own pace. Often I find when I'm pairing all day I'm putting in way more focused time than when I am soloing.
If devs consistently react negatively to a practice, in itself that’s evidence to be wary of the practice.
If yes to both, then there are apparently developers -- at least one developer! -- who decide what to develop.
And if you are capable of doing that, then why should every other developer in the world be incapable of doing it?
Additionally, for a dev to directly learn what to build, they’d need to work two full time jobs. Most prefer to do just the one job.
It's just two separate jobs, why would anyone sign on to doing two jobs when they can specialize in one or the other, unless they're in a situation like mine, which nearly nobody is.
I occasionally enjoy live streaming code when I'm in the mood, but social things are draining and I'm usually not in the mood.
My process is personal and doesn't come on demand.
And on the other hand, there are people that, after having tried it out, like it so much, that they are strongly for this way of working.
I think teams will form around both ways of working, and this might become a deciding factor on joining a team.
My point was to give my perspective from someone who would not like it, and how much I wouldn't like it.
I would definitely look for another job if forced to do this type of coding, as it would be very uncomfortable.
If it's optional that's great, but since it involves a team as its premise someone may be forced if the majority or the more influential people want it.
In that case the minority can go find a place that respects their process, but the manager should know of that potential unintended side-effect.
Everybody is invested as everybody had (probably) their say and was part of the decision. Institutional knowledge is high across the whole team.
This for the cost of single threading the team. It is a business call and might be a valuable and valid approach in some cases.
I think it is a tool. A tool with a specific problem it solves. And if you use it all the time you are the worker that only has a hammer so that every problem looks like a nail (not you personally, but generally speaking).
Being a data analyst I remember great sessions of pair and team analysis of a specific data problem. Some sucked and were unproductive but most were great if facilitated well.
I had the impression some are advocating it as a default way of working though, and that seems so alien to me
This is a vague generalization, so it's hard to argue against.
The truth is, to accomplish anything difficult, developers need to be left alone to work on it. Ideally for a particularly difficult problem, you put one developer on the project and just wait for results. Of course, businesses don't like that, so you're usually forced to put several developers on the project (which makes it take longer).
As a developer, I think I speak for all of us when I say that we've experienced needing to focus intently on a difficult problem, but management keeps interrupting it by demanding progress reports and giving you the "gift" of more junior developers to "help you out".
The problem is sharing credit. What is the incentive for a good developer to share credit with a bad developer especially when the don't like each other?
If you do mob programming how would you know who is making contribution and who is slacking and how to rate the performance.
> The amount of outright hostility I've faced professionally for suggesting mob programming was staggering.
For a good reason. In my experience great developers don't mind helping out but they expect to be recognized which is fair.
But after really using the technique, most people found it great.