Nine to five

I remember a couple of songs from my childhood—Dolly Parton’s Nine To Five and Michael Jackson’s The Way You Make Me Feel—that featured the idea of working from 9am to 5pm in their lyrics.

Entering the professional world of work was, therefore, something of a let-down for me: the nominal hours were always longer, and no one ever left on time.

However, now, for pretty much the first time in my life, I’m working in a job in which I get in around 9 and leave around 5:30 (plus or minus about 30 minutes day by day) and, well, it’s great.

But here’s the thing: I’m getting more done than ever before. Because I know that I can leave at a sensible time, I don’t need to fill in the hours looking busy. I am busy. And then I go home, and I still have a whole evening to do whatever I want.

The only thing I don’t understand is this: how did things get so bad that getting up, going to work, doing work, and going home become something that I feel is worth celebrating? Is the software industry especially bad, or is the toxic culture of presenteeism and conspicuous workaholism more widespread?

If I ran a company, I’d be sending my employees home on time every day. I’m sure it’s good for business.

Pick and place

This is the story of the worst job I ever had.

I was reminded by something I read today about London taxis and Uber:

[E]ssentially [Uber] drivers are meat puppets who are paid because legally, you need humans to operate cars right now. As soon as we don’t need those pesky humans to operate transportation infrastructure, you can be sure they’ll be done away with.

I was a meat puppet. I didn’t operate a car, however: my job was to be the fingers of a circuit board assembly robot.

Every day, I sat on a stool in front of the slightly sloped console of a large workstation. The console was fitted with a metal plate with holes for the components of a particular circuit, and the matching unpopulated board was placed on top. At the front of the console was a large bar that could be pressed—somewhat like a space bar—and a well containing ten or twenty identical components.

Every time I pressed the bar, a light from above moved to illuminate a particular component position on the board. My task was to take a component from the well and place it in the illuminated position, matching up the shape or any orientation indication lines. I repeated this process until all occurrences of that component had been placed, whereupon the machine rattled a bit, drew the tray into its belly, and replaced it with a similar tray containing the next component. And so on.

Press—grasp—insert—press—grasp—insert—press—(rattle, rattle, shuffle)—grasp—insert—press—grasp—insert

When the board was complete, I lifted it off, put it into a rack, took another board, and started all over again.

Meanwhile, the radio played a local radio station. Their stunted playlist of a dozen or so tracks, interrupted by frequent and banal adverts, cycled pitilessly. Actually, maybe that was the worst bit of all of it: one of the songs on that playlist was Free by Ultra Nate. ”’Cause you’re free / To do what you want to do.” I didn’t feel it, and I didn’t appreciate hearing it six times a day!

It was 1997. Surface mount assembly was beginning to become more prevalent, but many (perhaps even most) electronic circuits still used through-hole components. Making circuit boards could easily be automated (it’s essentially photography), and you could solder an entire board by floating it briefly on a lake of melted lead and tin. (Well, you could back then; they don’t use lead any more.) You could even precision-bend the legs of resistors and diodes in bulk, just by cranking a handle.

The part that wasn’t so easy to automate, apparently, was putting the components into the holes. For this, they needed hands.

They didn’t need brains, though. The hands were only there because robotic dexterity and vision wasn’t advanced enough to make automating the component insertion practical or affordable.

That specific job has probably been automated away by pick-and-place SMT processes, but there are still plenty of jobs in manufacturing that rely on people to work as the dexterous fleshy appendages of machines. They’re probably not much fun, or much good for you.

Despite being repetitive, boring, and uncomfortable, it paid reasonably well. I earned £4.85 an hour (and time and a half for overtime). That wasn’t too bad for 1997: that’s equivalent to about £8 today, and compares favourably to the current minimum wage for an eighteen year old of £5.03.

The price of a stamp

Last week, I sent a postcard from Japan to the UK. It cost me ¥70, about 41p at current rates. Today, I sent a postcard from the UK to Japan. That cost me 97p, over twice as much.

Even within the UK, the cheapest (2nd Class) rate for sending a postcard is 53p. That means that it costs less to send a postcard to the UK from nearly ten thousand kilometres away than from the next village.

Now I’m wondering: is there a business opportunity in printing and sending business paperwork (bills and so on) from abroad? Or even just nice greetings postcards?

A song that reminds you of someone

Best bit about working with Paul was how cynical and dour he was. A bird of my feather.

We’d have gross-out conversations across our desks about weird surgeries, diseases or freaky insects (I was never sure if it was because we’re both morbid people, or terrible people actively trying to make our colleagues lose their lunch).

He’s a good egg. But I never imagined he could stand something so cheerful.——Frances Berriman

Everything changes, but sometime happy memories remain. This does bring back happy memories and breakfast-ejecting conversations.

I first heard Star Guitar by Shinichi Osawa on an Abraham L.A.O.S drum ’n’ bass mix that I downloaded sometime in 2008 and used to use as accompaniment when I wanted to shut out the world and concentrate. That mix has disappeared off the internet, but I still have a copy, so I’m going to host it until such time as someone tells me to stop: laos_mix_08.mp3

Yoghurt piracy

You will need a wide-mouthed insulated flask (actually, a normal one will do, but you might have trouble getting the yoghurt out afterwards), a saucepan, some milk, and a small sample of the yoghurt you wish to pirate.

Warm the flask by filling it with freshly-boiled water.

Heat milk to just below boiling, then allow it to cool to about 40C. If you don’t have a thermometer, just let it cool to the point at which you can comfortably hold a (clean!) finger in the milk.

Mix in a spoonful of the source yoghurt—a whisk works well.

Empty the flask of boiling water, fill it with the milk and yoghurt mixture, and screw on the cap.

Leave the flask for six to eight hours; I prepare it before bed and it’s done by breakfast time.

Although this is an analogue process, there’s very little generational loss: you can use the second-generation yoghurt to inoculate the third, and so on yea unto the N+1th generation.

Incidentally, if you think describing this as ‘piracy’ is ridiculous (and it is), you should read about seed piracy.

1 error(s) prevented this form from being saved

I think there’s a general human tendency to try to control others. It’s something to be deplored and resisted, but it’s always there. We see it in the school prefect or the inept manager, misusing their power, but we also see it in programmers and their unstinting efforts to impose order on a chaotic word. It’s a tragic and ultimately futile errand, but one that seems to be strangely seductive. Join me on a voyage into the mind of such a programmer.

Americans believe, as a matter of faith, that telephone numbers have ten digits. Three for the area code, followed by seven (hyphenated three-four) for the local part. American forms on the internet, therefore, where they require a telephone number, require it to have ten digits. If you’re a really talented programmer, you might allow the user to enter parentheses and hyphens; a deluxe version will even insert those automatically, in case the idiot had some crazy scheme of their own in mind.

This is, you understand, for their own good, to prevent them from Doing It Wrong. We don’t like Wrong; we like Right, and computers are good at keeping things Right.

Perhaps you have the uppity type of user who doesn’t want to give a phone number. Perhaps they enter all ones. Aha! You’ve thought to check for that. So they enter one of those 555 numbers they use on TV. That’ll work. Well, let’s hope that you don’t reject it unduly, because ‘[n]ot all numbers that begin with 555 are fictional’. Better improve that rule. If you’re in the UK, you might like to encode a list of telephone numbers for drama use just to be on the safe side.

The trouble is that knowing that a telephone number has the ‘correct’ number of digits tells you nothing about whether you can dial it. It might not exist. It might be connected to a fax machine (for the benefit of younger readers). It might be someone else’s number. But it gets worse: phone numbers are international, so that ten-digit constraint will reject a valid E.123 international-format telephone number, even though you could dial it. (I encountered this problem on a visit to the US: I had an address, but was roaming on a UK mobile number. I resorted to entering ten zeros and hoping that no one tried to call me.)

If you’re a particularly obsessive programmer, you might use Google’s libphonenumber to check that the number corresponds to some numbering plan somewhere in the world. I hope you keep it up to date, though. What’s the international dialling code for Sevastopol right now? For Edinburgh?

If you try to enumerate all the possible valid phone numbers you’re going to accept, you’d better get it right. It’s embarrassing to reject all sign-ups from London because you thought that UK phone numbers have a maximum of ten digits, when they’re always given with a leading zero that makes it eleven. Not that that would ever happen, of course (cough) and even if it did, you wouldn’t care, because no data is better than Wrong data, isn’t it?

Requiring a specific number of digits doesn’t guarantee that you’ll get a valid phone number, but does guarantee that you’ll exclude some valid phone numbers.

So why do it? Perhaps you’re worried that someone might accidentally enter their email address into the phone number field. (Is your UI that bad?!) If so, you could check for the presence of a digit. If you really want to check that the number is valid and belongs to the person who entered it, however, you’ll have to send an SMS or call the number.

What about email addresses? You could use a really complicated regular expression to check that it matches RFC 822. That proves nothing. will match, but it’s not much good for sending your valued brand outreach emails/spam to. The only way to test that an email is right is to send an email and to wait for a response.

You decide to ensure that people enter ‘real names’ into the name form. You check that the name is at least three letters long and contains a vowel, eliminating the common Cantonese name of ‘Ng’. You require that the name contains only ‘standard’ letters, preventing Finns from subscribing. But at least you didn’t get any bogus information, right? Right? Besides, everyone knows that every person in the world has a first name and a surname. Well, except Hungarians and Japanese and Indonesians and Tamils and over a billion other people outside your narrow frame of reference.

You impose an arbitrary length limit on address fields because long street names are anathema. (Or maybe just because you suck at database design.) You check every address against a master database that you update a few times a year, rejecting anyone who recently moved into a new house. You require a State/Province even in countries that don’t have those, because yours does. You require a City and County field in England even though not everywhere is in a city (and did you want the nearest town or the Post Town in that case?) and some cities (e.g. London) are not in counties.

To summarise: you can’t guarantee that you’ve got a usable phone number without calling it. You can’t guarantee that you’ve got a usable email address without writing to it. You can’t guarantee that you’ve got a name without asking the person. You can’t tell whether an address works without sending something there.

So what is your form validation for? And is it actually solving a problem or just adding to the hassles of your users and support load when it rejects perfectly reasonable inputs?

I’ve seen a lot of effort go into dealing with false rejections and into improving validation rules to try to reduce those false rejections. In most cases, though, this has been solving a problem that didn’t exist, causing hassle, and taking away attention from what actually matters.

I’m not saying that you shouldn’t check anything, just that the world is not nearly as amenable to codification as some might think, and if you try, you’re going to spend a lot of time battling edge cases. You might need to validate some information some of the time, but it’s equally possible that you’re just making a rod for your own back. So why not save us all a bit of wasted effort?

The sound of one person chatting

When you log into a Campfire account, you end up in what they call the Lobby, which shows you who is currently online in each room.

If there are three people, it says “3 people currently chatting”. If there’s one person, it says “1 person currently chatting”.

Screenshot of Campfire Lobby

Well … that’s correct, insofar as person is correctly (or at least conventionally) pluralised to people, but I’m not sure that one person on their own can ever properly be described as chatting.

It amuses me every time I see it, but it also shows how hard it can be to communicate the state of a system. One can be right and still somehow be wrong.

The right to fall in love

As the British political and media machinery do their best to whip up hysteria over the extension of free movement rights to Romanian and Bulgarian citizens, this seems like an excellent time to point out a right that those migrants have that you, dear British citizen, do not: the right to fall in love with anyone. And it’s all because of the demonisation of immigrants.

Under Directive 2004/38/EC, a citizen of an EU country (in fact, of an EEA country or Switzerland) has the right to bring their spouse to join them:

If you have a right to live the in the UK, your family may join you here. Your family is defined as:

  • your spouse (husband or wife) or civil partner;
  • any children or grandchildren of you, your spouse or your civil partner who are under 21 years of age or who are dependent on you; and
  • the parents or grandparents of you, your spouse or your civil partner.

For British citizens, however, stricter rules apply, including, since July 2012, a minimum income requirement:

You must have an income of at least £18,600.

If you are sponsoring a child as well as a partner you will need an income of at least £22,400.

For each additional child being sponsored you will need an additional income of £2,400.

(There is a route around this: you can live in another European country for three months in order to assert your free movement rights. Whether this is practical for someone in a low-paid job is another question.)

So, why is this the case? It’s because the Conservative party, targeting the floating xenophobe vote, made a rather stupid pre-election promise to cap net immigration, and as the government can’t control emigration or European migration, they’ve clamped down the things they can, like letting people live with their spouses.

When you allow politicians to use the spectre of the Other for their own ends, it’s not just outsiders who lose.

So remember, if you’re unlucky enough to be British and not rich, take care who you fall in love with. Or start working to change the current toxic narrative on immigration in the UK.

Leaving Stripe

I just realised that last thing I wrote on here was that I had a job. That was six months ago. Well, I don’t have one any more: I left last week.

I’m not going to write too much about my reasons for leaving, except to say that I found being a developer in a completely different time zone extremely difficult – San Francisco is eight hours behind London – and I just found that I couldn’t be as productive as I wanted, or as I needed. It was the people at Stripe that made me want to join in the first place, and it’s the people that I’ll miss the most in leaving.

It’s been an interesting six months, though. I’ve been to San Francisco four times this year. That’s four more times than I’d ever visited the US in my life up to that point, and something I might never otherwise have got around to doing.

If I’d never been to the US, I’d never have realised just how disconcerting it can be to discover that one can be a native speaker of English and still not make oneself understood in a nominally English-speaking country. The American dialect is far more different from the British one than I’d ever realised, and it’s asymmetric: we understand the American idiom from films and TV, but the reverse is not true, and almost every word in everyday life seems to be different, from what you sleep under, to what you eat with, to where you walk, and to where you perform biologically necessary functions. Pronunciation seemed to be a barrier, too. On one occasion, I even had to resort to pointing at the menu in a restaurant.

In many ways, visiting San Francisco was much more of a culture shock than living in France, Germany, Belgium, or Japan ever was. The Mission in particular was unlike anything I’d ever experienced before.

As an aside, I’m happy to be able to say that I saw nothing of the SF tech stereotype of over-privileged brogrammers at Stripe. Indeed, I was consistently impressed by the level of awareness displayed by my colleagues.

I’ve no doubt that Stripe is going to be successful, and I’m a little sad that I’m not going to be part of that. I suspect I’m going to be jealous of my former colleagues in a few years!

Anyway, it’s nearly Christmas. Time for a break before I decide what to do next. On that note, if you’d like me to do something interesting for money, get in touch!

I seem to have a job

I’m not quite sure exactly how it happened, but I’ve got a job. One minute I was quietly doing some contract work at home on yet another Rails app; the next, I was halfway around the world, in a place I’d never been, interviewing for a job. Which I got.

Thus, as of last month, I’m working for Stripe. I’ll actually be working in the UK as part of the growing London presence, but, as the company is based in San Francisco, I’ve been out in California for the past three and a bit weeks to get to know how everything works.

It’s interesting. It’s different work from the kind of applications I’ve spent most of my time doing over the past few years, and that’s a pleasant change. There’s decent money to be made in CRUD apps, but I’d been finding that a bit repetitive; one of the things that attracted me to working for Stripe was the availability of new problems to work on.

I try to approach things in a systematic manner, so I’ve set myself a calendar reminder in six months’ time to ask myself six specific questions about whether the new job is everything I hoped:

  • Am I learning?
  • Am I enjoying work?
  • Am I happy with commuting?
  • Have I found time to work on my own projects?
  • Is it easy to wake up?
  • Do I want to spend another year doing this?

One month in, I’m feeling optimistic.

Living—albeit briefly—in San Francisco has been very interesting, too, but that’s a story for another day.

Oh, and we’re hiring, so if you fancy a change, get in touch.