Three of a Perfect Pair

This post is about three approaches for remote pair programming that I recently learned to value a lot. They’re not perfect, but I like the King Crimson reference.

Come Prepared

Do all set up, check out, scaffolding or other basics, before you start pairing. If you’re debugging a complicated issue that needs a standalone reproduction, build that first, than use your pairing time to debug. If you’re continuing work on a feature, check out the existing or new branch first, start your development server, open the relevant files, start your unit test watcher, open the app, log in, or whatever else might be needed. Everything that is boring, where your pairing partner likely has nothing to contribute, should be done before hand. If you’re starting something from scratch, create the project (from a template first), initialize git and so on. Unless the point of the pairing session is to pick a framework or library, make sure that the new dependency is already installed and imported.

Use a Collaborative Editor

Use an editor experience where you can edit code at the same time. Something online like Glitch or repl.it, or some desktop setup like VS Code with Live Share. Use this to quickly change driver/co-pilot or suggesting single lines, not so much to work on different parts of the code in parallel. If you end up working in parallel, there’s a good risk you both make mistakes that are harder to find later, ruining the benefit of pairing.

Don’t be like me a week ago, thinking that Live Share doesn’t work for web development without a shared browser. Instead use the shared server feature and do (exploratory) testing in parallel.

When you’re exploring solutions to a problem you don’t yet understand well, consider using other collaborative tools, outside of code editors. With Excalidraw, Google Drawing or Miro you can sketch or scribble together (probably all more effective than sketching on paper and holding that in front of the camera).

Keep an ‘Improv’ Mindset

In improv (as in, improvisational, live theater/comedy), the “Yes, and…” rule encourages a positive attitude, accepting suggestions from others and building on top of them. When your pairing partner suggests something that sounds wrong, refrain from pointing out the mistake and try to roll with it. If it really is a mistake, they should realize that quickly enough. If its costly to try out, probe gently instead. There’s also a good chance that the suggestion is great, and you just didn’t quite understand it, yet.

In a recent pairing session, we were working on an image sampling task, trying to detect overexposure in video frames. At one point my pairing partner suggested to split the image into sectors and run the detection in each sector individually. At first I didn’t understand the point of that suggestion, but managed to refrain from rejecting it. After a bit more exploration we realized that these sectors would also provide much better feedback to the user – instead of saying “this frame is overexposed”, we could instead point to a specific sector. This improved the solution greatly, with very little code and runtime overhead.

A Bird Story

When the alarm rang in her truck’s sleeping cabin, Emily sat up and noticed the latest issue of the Bird Watching magazine sliding off her chest. She must’ve fallen asleep while still reading. Putting the magazine aside, she turned on the water cooker for some instant coffee, got dressed and checked out the leftovers from her last meal, a sandwich whose salad had turned into a brown goo. “Will have to do,” she muttered to herself while removing the expired salad. “How nice it would be to start the morning with some fried eggs.” She briefly turned on the CB radio to see if something useful made the rounds, but it was just the usual wankers. She had zero interest talking to those.

A little while later, she was back on the road, almost on schedule to make it to this day’s depot. It would still take some time to unload all those boxes that her 40 ton 18 wheeler was hauling. Traffic seemed fine, with only two construction sites on the next segment, promising an easy day.

Four hours later, it was time for the scheduled break. She briefly considered messing with the black box again to fake the break, keep going and for once get home a bit early, but her bladder suggested to play it by the book. When she got off the highway to turn into a small parking area, covered by trees on both sides, she wondered why there were no other trucks. At this time of day and place there should’ve been at least another four. Instead, there was just a station wagon with the trunk packed up to the roof. The dad, she assumed, was walking from the woods towards the car with a crying child in tow. By the time Emily turned the engine off, the station wagon was gone.

After prepping another cup’o’black, she found the magazine again and tried to remember where she left off. But before she could find her page, a quiet, deep hum distracted her. She checked the mirrors to see if it was coming from another truck or car coming into the parking area, but there was no one. Yet the hum only got louder, until it seemed to come from above. As she was leaning to the left window, she noticed a bunch of leaves flying away from the truck. “What’s making that wind?” she wondered aloud, as she pulled down the window and stuck her head out. Above her was a swarm, not of birds, but seemingly of mechanical devices, with lots of propellers. Like those toy drones at the store, except that there were so many at once. At least that explained the noise and wind. Emily was fascinated with their seemingly random formation. The swarm moved, but each member kept just enough distance to the others to not crash into them, like flocks of migrating geese. After watching them for a while, she noticed two long lines hovering below the swarm, the top one being a bit inside the shape of the swarm, the bottom one somewhat smaller. Just when she was starting to replace her fascination with anxiety, she heard loud clangs, like metal attaching to metal, from all around the truck. “Shit shit shit, what the hell,” as she scrambled for her phone. No signal. She turned on the CB radio, but all she got was static. “Are you jamming me?” Emily asked in the direction of the swarm above, trying to suppress her oncoming panic. “For what?” An answer came in the form of a sudden pull upwards. The whole truck was lifted off the ground, slowly, but steadily, turned, and then started moving to the woods. It kept rising until it was just above the top of the trees. Emily felt like she had to do something, but all she could think of was “Don’t panic!”. It was too late to get out and she couldn’t contact anyone. She kept her eyes on the ground ahead, which seemed to drop off slowly into a valley. She remembered that place – it had been a big lake, a reservoir, until the dam burst and nature reclaimed the valley that used to be inhabited a long time ago. “Where are you taking me? There’s nothing here!”. As they moved into the valley and her view of the horizon stayed the same, the ground below seemed to fall away further and further. Through a moment of calm, Emily remembered something she had read last night in the magazine, about birds of prey dropping their victim from some height, like a crow opening walnuts or a bald eagle cracking a turtle. As she felt the panic make a comeback, she put her seat belt on and stowed everything in reach. Just in time as she felt the truck tilting forward, giving her a look at the ground below. In the midday sun she saw twisted metal shimmering in a huge pile of tires, colorful containers and boxes. Something snapped loudly around her, and she could feel the seat belt cut into her chest and neck as the truck dropped away below her. At least the deep hum finally went quiet.

When Emily regained consciousness, she felt strangely calm, even though she couldn’t see anything. Her right arm didn’t seem to respond, but her left arm was okay and after a little struggle, she managed to wipe her eyes enough to see something. By the smell it seemed like blood, likely her own. As she slowly observed her surroundings, she realized that she was hanging down in her seat belt, the front window mostly crushed on the ground before her. There was plenty of light coming from the left window, which she had opened not that long ago. The hum had now turned into a much more irregular buzzing. She could see individual devices flying away into the distance, with small colorful packages underneath them. “Like birds returning to their nest, feeding their young,” Emily marveled to herself, “with batteries and solar panels.” She kept watching them, mostly going alone, but some transporting bigger boxes in groups. As the last few went on their way, she started feeling her right arm again, and as she was screaming in pain, she almost missed the crackle of the radio.

“Hello? Got your ears on? This is Scooter. Beep.” said the other voice, in a slightly wavering, but pleasant baritone. Emily still had no idea what was wrong with her right arm, but it hurt like hell, as it was hanging limb down towards the broken window, so she had to bend over to reach the receiver with her left arm. That took some time and some pain, but at least “Scooter” couldn’t hear her, yet. Eventually she managed to press the send button and tried to speak up, “hello?”. At first nothing happened, then she remembered that she had to let go to receive an answer.
“Hey driver, you’re breaking up, can you repeat? I only got ‘hello’. Beep” said the other voice, including the ‘Beep’.
“Err, sure, hi Scooter. Why are you saying beep?” Emily had talked to truckers who’s radio beeped when the other party stopped sending, but this was the first time someone actually said ‘beep’.
“Dunno what you’re talking about. What’s your handle? I’m Scooter, I’m stuck in the reefer, or what’s left of it. I only stopped at the pickle park to throw in some high speed chicken feed, and then all those spies in the sky, or so I thought, showed up, and suddenly I found myself in this situation, shiny side down and motion lotion all over the place. Sorry, I’m probably walking all over you. Beep.”
At least all that blabbering distracted Emily for a moment from her dangling arm. She also regretted a bit that she avoided the radio, or she would’ve picked up some more of the slang. “My handle is, I mean, I don’t have a handle, the name’s Emily. I’m hurt pretty bad and I’m not sure if I can make it out of the truck. I didn’t get all the other things you said.”
“10-4! I mean, copy. Well, I got that, Emily. Sounds like we’re in the same fucked up situation. Though I’m out of those pills that are keeping me awake. I tried plenty other channels and could not reach anyone. Phone’s dead. You? Beep.”
Emily looked for her phone and remembered stuffing it in the door on her left. Keeping the receiver hanging on her seat belt, she went for the phone. Still working, still no signal. “Shit, must be the valley. No tower in a lake.” To the radio: “My phone is still working, but I got no signal. I do have one idea though.” She hesitated. “It was supposed to be a gift.” It took some stretching to reach the package, still wrapped in orange and teal. Sticking it between her thighs, she managed to rip the paper off and open one side. “Oh man, this is going to be really hard.”
“Whatever it ish, I preeshaydit if you can shomehow get ush out of hee. Ah shing my pillsh are wearin’ off and ah won’ be ‘wake much lon”

Considering that Emily knew Scooter barely more than a few minutes, and only by his voice, the gradual slowdown, cut off at the end and especially the lack of the ‘beep’ hit her much harder than she would’ve expected. Like losing a good friend she barely knew she had. “Scooter, you’re still there? Please copy.” But there was no reply. She waited another moment and tried again, but still got nothing. So she got back to work. She wanted to rush, but knew that dropping any pieces could be catastrophic, so she went about as carefully as she could. She got the remote out and managed to insert the batteries. Next she got the drone itself, inserted its battery and placed it on top of the package that she carefully put between the door and steering wheel. She remembered the sequence the slightly condescending guy in the store had explained to her and followed it step by step. And the drone really came to life, with the display on the remote showing her a different perspective of the world outside. The first thing she noticed was another truck, mostly in pieces, but she could identify it as having a refrigerated trailer. “Maybe that’s the ‘reefer’ Scooter was talking about?” She very very carefully tried to launch the drone, focusing on what the drone could see, show on the screen in front of her, instead of her direct line of sight to the drone itself. The opening in the window was rather smaller, now that the top had been crushed, but still big enough for the drone to go through. Going very slowly, she flew the drone through the window. Outside, she had the drone fly up a little and turned it slowly clockwise. From here, the place looked so much worse than what she had seen from above. A graveyard of trucks, some with the remains of shipping containers, but mostly solid walled trailers like hers, or that of Scooter. She didn’t spot any covered with tarps. “Maybe they have other means of attacking those?” Emily could feel her curiosity about the swarm coming back and decided to focus on that, and not her miserable situation. “If you pretend to be birds, do you also build a nest?” She looked away from the screen for a moment, outside the window, and focused on the few things she could recognize from her position. Back on the PoV view, she turned again until she found those things again. Some wreckage, some trees in the far distance. She changed the drone’s altitude until she could see it roughly at the height where the other drones had flown away. “Off we go!” she said to herself, as the already light hum of the drone faded away. On the screen she could spot what might’ve been a village once, razed to the ground before the dam was built and the area flooded. Beyond that, in a small valley, were the leftovers of some fishing boats. Beyond that, just when a range warning started flashing, she spotted the nest.

After a moment of stunned silence, she reached for her phone, found the voice recorder and started it. “If anyone ever listens to this, I found the nest. I really want to call it a hive, since it looks much more like something ants might build, than a bird’s nest. It’s incredible. It seems completely chaotic, yet also well structured. There’s little ramps everywhere, apparently used to get bits and pieces to lower levels. There’s something resembling a lift, but working more like a catapult. They don’t open the packages like they opened the trucks, so they must be clever enough to understand that the packages are much more brittle. I spotted a repair station, where broken propellers get replaced. There’s charging stations on the ground levels – I guess on low batteries it’s easier to land there than on the top levels. There’s wires all over the place. I think they use lots of batteries to store the solar energy overnight. The top of the hive is all solar and it looks like it might rotate with the sun. I can’t be sure, since my drone’s battery is starting to run out. Gotta get it back to replace the battery and scout again.”

She stopped the recording there and focused on the drone again. After a little while the range warning turned off, but the battery warning got more intense. Just when she thought the drone wouldn’t make it back, she could hear the hum of the drone again. Quiet at first, then louder. She even spotted her own truck on the display and carefully aimed for the little window. The hum got louder as the drone got closer. She almost missed the opening, then bumped into the steering wheel. “Good enough!” Emily exclaimed as she turned the motor off. But as she was enjoying that the drone made it back, she noticed that the hum hadn’t stopped when she turned off the drone. It had only gotten louder. And massive. And heading directly towards her.

Cologne 2050

Wer Visionen hat, soll zum Arzt gehen.

Helmut Schmidt, “eine pampige Antwort auf eine dusselige Frage”, Wikiquote

“Someone with visions should go to the doctor” is a popular quote by a former German chancellor, in a way representing modern politics pretty well. While improving the world in increments has gotten us a long way, I miss positive visions in mainstream politics (too few like this or this). As Adam Curtis puts it in this Economist interview:

Politics gave up saying that it could change the world for the better and became a wing of management, saying instead that it could stop bad things from happening. The problem with that is that it invites all the politicians to imagine all the bad things that could possibly happen—at which point, you get into a nightmare world where people imagine terrible things, and say that you have to build a system to stop them.

The antidote to civilisational collapse, The Economist, 6th December 2018

How could the city I live in look like in 31 years, if we weren’t restricted by practical concerns, but could come up with a more free form vision?

Daily Life in 2050

Below I’ll describe five areas of daily life: Transport, Jobs, Shopping, Housing and Health. While those are separate topics, some of their viability depends on synergies between these areas.

Topics not covered can be assumed to not change that much in this vision. I also know even less about those potential other topics and don’t want to stretch this too far.

Transportation

Traffic within cities is running on renewable electricity, powered by small lithium-ion batteries, but individual transport is primarily human-powered, with electric motors enhancing various forms of small vehicles like bicycles. Lots of variations exist to support parents with babies or toddlers, people with physical disabilities, or people transporting bigger items. For trips across city quarters, these vehicles can be attached to bigger electric vehicles like busses (which are mostly running on software, with remote operators monitoring and supporting as needed).

Individual highway traffic in and out of the city is also running on renewable electricity, powered by hydrogen fuel cells. Vehicles are driven by software when conditions are fine, or remote controlled by trained operators when conditions are really bad. The amount of this type of traffic is pretty low, as most people live within the city quarter where they work (see Jobs belows).

Most vehicles are owned and shared by the public. They are stored in towers above or below ground, with most of the process of storage and retrieval automated. This in turn removes the need for massive spaces and buildings for parking large, combustion-engine based vehicles, giving way to a decent mix of small and big parks and living quarters.

Transport on medium distances is covered by a non-profit* train network with reliable schedules. Long distance travel is still the domain of airplanes and one of the last industries burning fossil fuels. Yet thanks to strict regulations, business travel, especially of the “cross an ocean twice a day” type, is massively reduced, resulting in a large decrease of air travel and related pollution.

Jobs

A vast majority of people (like lawyers, accountants, designers, programmers, engineers, architects, insurance agents) work from home, with their employer covering the costs of the home office, or work in the city quarter where they live (see Housing). A lot of jobs, that used to require people to stay in one location to offer services to other people coming to that location, are now much more flexible or don’t exist anymore. Doctors see their patients remotely or at their own homes (see Health). Most shopping is decentralized (see Shopping). Garbage disposal, while generally a much smaller concern thanks to all kinds of reusable containers and packaging (in contrast to still energy intensive recycling), is heavily automated, also with remote monitoring and operators. Deliveries are grouped per building and across orders, getting the amount of delivery traffic and related jobs under control.

Shopping

Grocery shopping in stores doesn’t exist anymore, instead groceries are delivered on an ongoing basis, per apartment block or street. Daily use items are subscribed to, with storage units (fridge, freezer) suggesting increases or decreases based on consumption, and recipe apps automatically ordering special items. Various seasonal fruits and vegetables don’t need to be delivered at all, since they grow on walls, balconies, and roofs. They’re mostly planted and maintained automatically, with interested residents helping out where needed.

Other food is also available according to the regional and seasonal options, avoiding shipping blueberries half way around the world. The amount of food that is inefficient to produce in huge quantities (beef, pork, salmon) is rarely consumed, with most of the population preferring other options.

Other shopping, for example for clothing, furniture or gadgets, is also heavily decentralized. Instead of people going to stores, designers come to their clients home, take the necessary measurements and recommend items to order. Customizations take longer, but can accommodate all kinds of particular needs.

Housing

To allow people to live well, close to where they need to, housing is now a non-profit public service everywhere, focused on providing decent living space for everyone. Moving from one place to another is almost trivial, as living spaces are both heavily standardized and highly customizable.

Lamps can be exchanged with two simple motions, lightbulbs can all be adjusted to whatever brightness and color temperature are prefered. Bed frames are flexible in their dimensions to accept various mattress sizes and depths and can be decorated to anything from industrial to fantasy style. Wardrobes can eject their content into compact boxes ready for transport. Wallpapers don’t need any glue or scraping to replace. Couches can be reassembled to the preferred layout, the covers quickly replaced. The kitchen is pretty much the same everywhere, with energy efficient appliances being kept up to date by the building administration.

Grocery subscriptions are transferred when moving, though adjustments may be necessary based on local availability of some products.

Health

Most doctor visits are replaced by a self check up at home, supported by an app and a health kit. People are supported by the app in checking for common issues themselves, talking remotely to a doctor (that currently has a low workload) to clarify details. When that isn’t enough, doctors and therapists visit their patients at home, with schedules optimized for short wait times and by medical priorities.

When that isn’t enough either, non-profit hospitals provide all the other necessary care, focused solely on the health of their patients of employees. Since emergency rooms no longer have to deal with any non-emergencies, waiting times and work load are significantly reduced. Staff is hired based on the population and demography of the city quarter the hospital is located in. For uncommon conditions and diseases, experts from around the world can join discussions and operations remotely. Any mistakes or accidents are always captured and reviewed in a blameless post-mortem process (think of how air traffic has been doing that for decades). No one ever dies from an infection caught in a hospital.

Closing notes

This is obviously incomplete in infinite ways – zooming in on any of these topics will necessarily provides a fractal increase of details and issues, as with any complex system. And then there’s all the various topics missing.

I enjoyed this as a valve to process the many articles and podcasts I’ve consumed in last months and years. I might expand on some of these topics or others in the future.

I’m curious what others think about these ideas. Maybe some are already happening elsewhere? What’s missing? How much of this could (really) work in other regions of the world?

For feedback:

*) There’s several mentions of “non-profit”, while leaving it open if these are state or privately owned. I don’t think it matters that much, since there’s good and bad examples of both types. They need to be decentralized enough to be able to serve their community well.

Ideas for better data privacy usability

This morning I got an email like this:

Hi [customer],

If your inbox is anything like ours, it’s recently been filled with emails like this one: a company updating its policies. You’re probably going to receive many more before May 25 because of a new European privacy law called the General Data Protection Regulation (or GDPR). Companies are updating their policies to meet GDPR requirements, and are sending their customers notices about the changes. Today, we are releasing our own updated Privacy Policy, which provides greater clarity and detail about the information we collect, how we use it, and how we comply with GDPR. […]

Our new Privacy Policy has added some detail around what you can do with data we collect about you, and how you can exercise your privacy rights. It also provides increased transparency around the different purposes for which we use this data. […].

I don’t appreciate the meta comment about getting lots of emails like this. Its only a reminder of something I despise, hardly welcome.

Though it got me thinking: What’s so wrong with this? Isn’t it nice that companies are updating their privacy policies to the benefit of consumers?

The problem I have with this process is the asymmetric power and burden. As a consuming customer, the only leverage I have is to stop using their service. That’s an all-or-nothing game I don’t want to play. For example, I despise many things about Facebook, but I’m not yet taking the only leave-completely option, since there’s still too many things that I don’t want to miss out on.

Given that its a good thing for companies to pay attention to their data use and make their policies public, how could we remove the current burden from customers, and shift it somewhere else?

Here’s some ideas:

  • Companies have to provide a fact sheet, like insurance or investment products. On a single, well-formatted and readable page, list what data the company gathering, who its being shared with, how long its stored it and similar details. Optimize this for a quick read, in a standardized format (e.g., retention policy always in the upper-right box).
  • Companies have to submit their updated policies to a 3rd party, that they need to pay to have their documents reviewed. The contact details and review date are then added to the full public policy, so that consumers with doubts about the companies policies can contact the reviewer and have them confirm the review. This 3rd party could use a low-effort support system like Intercom (you can handle a lot of requests with chat), to provide free answers, with a paid phone support in addition.
  • Companies have to use standardized policy templates. ALL UPPERCASE LEGALESE IS STRICTLY FORBIDDEN. A clear and predictable structure makes it easy to find specific details.
  • Companies have to provide diffs when updating their policies. To keep the diff simple, the updates need to be kept under control, too.
  • Companies have to provide a machine readable version of the privacy policy, that your browser or a plugin can read and evaulate according to your preferences. The result could be displayed with an icon similar to the SSL-lock.

What I expect to happen instead: