Flying with atoddler

Catherine Webb recently pointed me to her outstanding 2008 post “Baby Holiday: SWAT Team special“. I felt it needed a little updating for the modern era. Here are our experiences from the summer. Not with a baby, but with a toddler.

If your toddler is under two, the airlines will try to force you to have the child on your lap the whole flight. Because your bollocks haven’t been kicked enough. However, you can call them and book a real seat. Well worth the extra cost.

If you read up on things, you’ll discover that you can bring your car seat. Be careful though – Virgin won’t let you bring a US car seat on the plane. They will let you check it and can give you a rickety leather seat of their own (reluctantly).

The reason why you want to bring the seat is so that you can have a belt he can’t escape from.

You’ll want to bring loads of baby stuff like food but remember the bastards at the security checks will have no sympathy for you. Low volumes of liquids in plastic bags only.

Once on board the plane, you may find the entertainment system doesn’t work in any of your seats. For eleven hours. Remember this is something of a nuisance for the cabin crew, who will become very unfriendly about it.

In the event of a trouser accident, the cabin crew will change the baby for you. Just press the button to ask them round and hand him over. It’s part of the cost of the flight, so insist if necessary.

Let me know how that goes.

Don’t expect toddler food for your toddler. Expect crap like crisps and sugar.

Don’t worry about the people in front, especially if they recline into your face the whole flight. Just smash and wallop their head. It’s payback time, and you have an excuse.

You can check a stroller at the door of the plane. But do remember to get it at the door when you get off, otherwise you can’t get back for it. It may also be at a different door, conveniently. The cabin crew will be oblivious to all of this so don’t worry them with it. They are probably very tired.

The simple solution to most woes is the iPad. Don’t leave home without it charged and loaded. Bring a few if you can.

Enjoy your flight. Chances are it will be mindnumbingly tedious. But, on the bright side, you’ll have a jetlagged toddler at the other end. Good luck with that.

Orange robots

Bought a new Orange Pay-as-you-go SIM.
Stuck it in the phone.
Tried to add credit.

ME > 450 (send)

“Welcome to Orange. Press 1 if you’d like to top up.”

ME > 1

“If you’d like to top up with a credit or debit card, press 1, …”

ME > 1

“If you’re topping up with a voucher, press 1 now to return to the start. Otherwise, hold on.”

“Ok, let’s top you up. What’s your postcode. Just say the post code.”

ME > “E17 7QW”

“Ok. And the house number?”

ME > “47″

“Ok. I’ve got 47 Penumbra Avenue, London, E17 7QW. Is that right?”

ME > “Yes.”

“Ok. Now, what is your last name? Just say it out loud into the phone.”

(stunned)
ME > “Kufluk”

“CUTNER. Is that right?”

ME > “Well, no, it’s not likely to be right is it – you’re just a computer”

“Ok, let’s try again. What’s your last name?”

ME > “KUFLUK”

“CLARK. Is that right?”

ME > “NO!”

“Ok, well, I can’t figure this out, so I’m going to have to pass you to customer services.”

“Sorry, I can’t ocnnect you to customer services because you don’t have any credit. Calls cost 25p per minute.”

“Would you like to top up now?”
“If you’d like to top up with a credit or debit card, press 1, …”

ME > ARGGGG!

I hang up.

When I called back later, I admitted to being Mr Elliot Clark. I confirmed that this was indeed the name on my credit card. I successfully added 20 pounds to my account.

To avoid confusion in future, I will be responding solely to this moniker. I would like to thank Orange for simplifying my affairs in this regard.

A day in the life of atest failure

I love my job. Fact.

But some days are easier than others. If you’ve been reading my tweets this week, you’ll have sensed a certain frustration.

Don’t worry. None of this is your fault.

But here’s what happened.

Over the weekend it had occurred to me, while I was asleep at about 6am – seriously, this happens – it occurred to me that I’d forgotten to submit my latest test fixes before I merged my branch. This would screw up the branch for the weekend, for the whole team, and delay the deploy on Monday. Bad news.

As soon as I woke up, I popped open the laptop, preemptively apologised to all and sundry – as is the English way – and proceeded the fix the problem. It turned out my fixes only fixed half the problem. And it’s the weekend.

So, I cheated. I knew this code was in a hidden section, and wouldn’t be live when deployed. I could just comment out the tests, ensuring the branch would pass even if the code didn’t work properly.

First thing Monday morning, I returned to the problem. I looked back over the logs to find the faulty test and dutifully kicked off a test run.

And this was the start of my problem.

It passed.

I was a little surprised. There were failures last week, I could see there were failures. Maybe somebody else fixed it. I check the logs. Nope. I run the tests again.

It passed.

I should mention that running the tests isn’t instantaneous. It’s a complex test suite we’re running here. We’re currently migrating our server code away from Ruby (we’re always migrating to faster systems). In the interim, we’re running tests against both systems. The various compilation and startup sequences, combined with the real browser used, and the queues of other developers waiting on the system, gives us an average runtime of about 15 minutes.

It’s optimised to run a suite of tests, rather than individual tests, so both cases take around the same amount of time to run. In fact, we have some excellently comprehensive test suites with thousands of tests, and they can all be run in about 15 mins. Running single tests is still slow, because the task can’t be distributed.

From this point on, I’ll indicate the test timings like this: (15).

I can of course run a test locally. Again, this can take time. Usually less time – let’s say 5 minutes or so. It takes less time because I already have the servers running locally.

So my tests are passing. Usually, a cause for joy. In this case, a worry. Why did they fail last week? I dig out the code from last week, and run the tests (15).

It fails, as expected.

Well, that’s something. I diff the code. And here I win the Goof of the Week award. Prize chump right here. The tests are passing because I commented them out.

Duh.

I go to lunch and try to apologise to my own brain cells for letting them down.

I kick off a real test run (15). It fails. Good. But weird – I swear these were working once. I test the Ruby code instead (15). It passes.

Interesting. So I’ve found a difference. This is weird because I haven’t actually changed any of the server code. It shouldn’t be possible to be different here.

What’s worse is that we can’t easily test the new code locally. It takes longer. I run them (10). They pass. I run the Ruby tests (5). They pass. I run the new tests again, to be sure it’s not random. Pass (10). Pass (10).

I spike the code full of debugger statements. Run the tests (15). More debugging (15). Add screenshots (15). Everything is the same between systems, except that the new tests are failing.

” is not true”. Thanks, error messages.

Hmm. I look back at the screenshots. While the systems show the same screens, there’s something I didn’t expect. When you’re a new user on Twitter, we show a little helper module at the top of the page. I’d forgotten we did that. It also loads asynchronously.

Aha. Here it is. The new code runs so much faster that this module loads earlier. This explains the difference. I go home, happy that I’ve established the problem.

Next day, I make allowances for the helper module. I pull out the debugging code, happily run the tests (15) one last time, and prep the branch for shipping.

It fails.

Bollocks. I unprep the branch and put the debugging code back in. I run the tests (15).

It fails. Same debugging result as before.

That’s weird. I was so convinced the module was the problem. I hack the code and remove the module entirely. Another run (15).

It passes.

Ok, so it’s the module. No question. I just got the allowances wrong. I tweak them, and run (15). Fail. I add debugging (15). Nothing. And again (15). No.

This is crazypants. I am so not happy.

I try to reproduce locally. Passes (10) every (10) time (10). No amount of debugging and breakpoints will help if I can’t reproduce the error.

I look back to the screenshots. Aha. No images in the module.

I knew the error was caused by an bad height calculation. And the missing images are (whips out an onscreen ruler), yes, the images are 137px – exactly the difference.

Eureka.

Our images don’t load on the testing machines because they’re insulated against the outside network. That makes sense. Locally, we can access the images, which must be why they pass. It’s perfect.

Furthermore, our testing machines are using Firefox, which won’t render broken images, while I’m using Chrome locally – which does. This would account for the height difference.

I curse and laugh, since this quirk of Firefox has bitten me many times in the distant past.

To fix the test, I simply break all the images – to be consistent. I prep the branch for shipping, throw it out to the test cluster one last time, and go and get a fifteenth cup of coffee.

It fails (15).

What. The. Fuck.
What. Thefuck.
Whatthefuck.
Fuck.

How can this be? I had this nailed.

Worse than that, the tests is now passing occasionally. When I run the tests on the test cluster, I run them about sixty times in parallel. This ensures we don’t get “flaky” tests, which sometimes pass and sometimes don’t. Flaky tests are notoriously disruptive and hard to fix.

Sometimes, all you can do is try it yourself. I open a browser. I downgrade it to the exact same version as our test cluster. I’ve done this before, but I’m doing it again. I run the tests (10). I click around. I fiddle with the code. I break the images, to match. Refresh, refresh, refresh.

Hey, what was that?

I refresh again. And again. There it is.

Firefox won’t render a broken image – it hides it away completely. I knew that. But what I’m seeing here is a flash of broken image. There’s a flash of a broken image in this helper module, before Firefox hides it away.

If my code is making calculations just at that moment, it’ll get a different result than, say, half a second later.

I don’t get my hopes up again. I tweak the test. There’s actually a little css property:
-moz-force-broken-image-icon:1;
This will prevent Firefox from hiding the broken images. I run the tests. All the tests (15).

Pass.

I prep. I ship. I smile.
I move on to the next thing.

(btw, if testing tools is your kind of thing, and you want to help me make things faster, we’re hiring and I will buy you cookies)

Apple ideas

Here are my predictions for Apple products this year.

No, hang on. Not predictions. More like hopes and desires. Wishes.

1) Embeddable products.

I have just not bought a Honda CRV. I’ve been driving one as a zipcar, and I love how it drives. We need a family car, so it’s an obvious choice.

And then I saw the screen on the website.

Screen Shot 2013-02-16 at 19.13.10

No way. It’s 2013. I’m not using a computer system from 1980. I’m just not.

You should be able to slide in an iPad mini, and have it control all the car’s features. This shouldn’t be exclusive to luxury cars. This should be across all cars, all brands, all prices.

The same is true for aeroplanes. We took a Virgin America flight a few months ago. One of the seats was empty (which was awesome), but why? The entertainment didn’t work. If they’d used embedded iPads, they could have just switched it out. And we’d have apps. And the games wouldn’t be shit. And they’d be interactive adverts for Apple products, with a 100% captive audience.

2) Touchscreen laptops

Ok, I get it. A touchpad works better on a laptop. But, having used a Surface for a bit, I’d still say a touchscreen is useful.

It’s useful when pairing to be able to say “that word there”, or “push this button”.

It’s useful to scroll, sometimes, when reading. Your right thumb just flicks the content down. Feels natural.

And they seem to be both ubiquitous and inexpensive. So why not?

3) A radical design change for iOS

I have an original iPod Touch. The iPhone wasn’t released in the UK for about a year after the US, but the Touch was. I’m still blown away by the completely unnecessary brilliance of the device. It’s so slim, so solid. The screen is amazing. The touchscreen was unlike anything anyone had seen before. It had an accelerometer, even though there was NO USE FOR IT until the App Store arrived. It still works.

But it looks exactly the same as the new ones. I know great design is forever, but is forever really longer than five years?

4) iTunes

Just break the videos out of iTunes. Call it iVideo or iView or something. It doesn’t make sense where it is.

While we’re there, let me opt into iCloud fully. I *do not want* to download everything. Ok? Ok.

5) TV

Jus do something amazing. Typing using a remote control is madness. Give me Kinect.

Don’t give me Siri. I don’t want to shout at my TV. Seriously, the tech pundits are idiots. Don’t go there. Let it go. Put it in a watch, where I don’t have to care about it.

6) Buy Sonos

Simply to acknowledge that their system is awesome in a way that Apple showed us was possible. And it needs iTunes.

That’s it. I’m happy with the products as they stand. They don’t need another iPad/iPhone/iPod idea. They make money. We love the stuff. Keep it going.

Oh, and I’d love a phone the size of an iPod nano. Now that would be amazing.

Common courtesy

Remember at the end of the 19th century, when we all got together and agreed to stop bowing and curtseying and saying “good heavens, whatever is the matter child?”

That was progress.

I know we’re more than a dozen years into the 21st century now, but it’s not too late. We can make a little progress of our own. Can we all just agree to stop acting out bollocks door-holding courtesies like anyone gives a shit?

It may be ok, if you’re out on a date. Open the door with a flourish. This is fine, don’t get me wrong. But it has no place in an office or on the street. Stop giving way – you are actually getting in everybody’s way.

And besides, everybody knows the only reason you’re doing this is to check out their arse. Definitely not an office thing.

It’s not even about women. I was in a lift the other day with seven other men. And somehow I had to push my way past all seven to get off, even though it was the last stop and they all had to get off too. Why? Because they were all trying too hard to give way to everyone else.

No, they weren’t looking at my arse. Shut up. They weren’t.

You know that awkward moment when someone’s holding the door for you, and you have to skip ahead at half a run, just to get there in time? Who is this helping? I am a grown up. I can open a door. Let. It. Go.

Every time there’s a fire alarm, you’ll see the insanity. As we all crowd through those emergency exits, the guy in front will hold the door for you. When you get there, you take it off them. But that’s not enough – he’ll want to hold it for the guy behind you too. And even the next guy behind is already reaching over you to try to hold it for you. And before you know it, your hands all end up touching, and then nobody can ever look each other in the eye again.

So, from this day forth, hold no doors, except for the following allowances:

  • person behind holding something with both hands
  • person behind in a wheelchair, or on crutches, or conspicuously pregnant
  • the door happens to be one of those truly lethal fast-swinging ones
  • person behind less than ten years old
  • you’re on a date
  • your front door.

As an additional note, that person who always shouts “there’s room for one more” in the lift, when there are plenty more lifts and honestly no room, shall henceforth be committed to the lift shaft without remorse.

White guys

I hate white guy jokes. I find them deeply offensive. I don’t understand why it’s considered ok to group “white guys” when the same jokes about “black guys” would probably get you fired.

Because they are the same. No, that’s not true. They’re worse. When people say “black guys”, it no longer means uneducated poor people. It’s changed, and usually refers to people who dress a certain way, act a certain way.

But “white guys” is back to the old definition. When you make “white guy” jokes, you’re playing on the stereotype of white guys being wealthy, educated and family oriented, and by your definition “black guys” or anyone else, is not.

The more you say these things, the more the stereotype is enforced.

I’m disappointed that in the recent election, it was only the democrats bleating about “white guys” for Romney. Why do that? I thought you guys were supposed to be above that kind of thing.

Don’t say “white guys”. Don’t tell “white people” jokes. Don’t tell me that’s “the whitest thing you’ve ever said”. It’s offensive to white people, black people, asian people, australasian people, gay people, straight people, tall people, small people, average people, weird people, male people, female people, all the people. We the people.

Rise above it.

Amazon

Amazon has a strange lack of an affiliate programme. Yes, I know they have a very well known affiliate programme. Yes, I know I spell programme with an extra m and an e, but I’m English. Live with it.

They don’t push the affiliate programme any more, probably because they feel they don’t need it. They have no real online competition in the online shopping marketplace. Even when we see products elsewhere, we turn to Amazon for value and reassurance.

But if I worked at Amazon, I think I’d resurrect the scheme. Supermarkets have shown that loyalty card schemes are valuable, because the perceived value is high even when the actual payback is marginal, so I think it’s still worth it.

A low rate of payback will let us incorporate more affiliates into the scheme. Let’s start with … everyone. Everyone. No sign up required, we’re all in.

Ok, now for my blog, I want to get some Amazon points. What I really want is a one-click buy button. No need to go anywhere else, no popups, just one click buy. A bit like a tweet button. And hey, that could be used for anything, from buying some baby supplies to a blog subscription.

Ok, that’s the obvious bit. We’ll put the code for that in an ‘embed’ link on the Amazon site, under the existing one-click buy button.

Next, we’re going to tweak all the site urls. Every URL you see on Amazon, in the address bar, will contain your affiliate code. That way, every time you paste a link into a tweet, or a Facebook page, or anywhere, you get affiliate points. Don’t need the dumb grey affiliate bar. Just cut paste tweet. Cash.

That way I get more serendipitous referral points, which will bring me back to Amazon, to buy another book, another Kindle, or whatever. Each time I get points, I’ll get an email. This will make me happy.

Actually I believe I earned about five bucks this year through serendipity. No idea how. I think if the referrals worked across countries, I’d get more. Drives me crazy that the UK and US stores are different. I’d fix that too.

So, in summary, more affiliate payments. I’ll admit right here right now that I’m not going to spend much more – I really only shop online at Amazon or Apple already. But a few kickbacks will probably make me feel better about doing so.

How to present something really boring and get away with it

Some wise person once taught me the correct way to present. You must structure your talk, and follow these three simple rules:
- say what you’re going to say
- say it
- say what you’ve said.

Now I’m not an expert in giving talks. No.

However, over the years I’ve built up a lot of experience at listening to mind-numbingly dull talks, whether lectures at university, technical demonstrations at the office, or the worst ever, wedding speeches.

The rules given above are an excellent way to give a REALLY BORING talk.
Please, do not follow them.

An awful talk usually goes like this:
- a pointless introduction “my talk today is about bananas”
- slide of contents. You read out all the items, often explaining the obvious. For example, “first I’m going to talk about peeling, which is the process of peeling a banana.”
- many slides follow, usually full of too many words and uninteresting facts
- finish up with a reiteration of the contents.

As an audience member, I would like to request that you stop. Just stop.
Here are three rules for a FUN structured talk:
- tell me why I should listen
- tell me a story
- give me something to think about.

This is actually a bit harder to put together, because you’ve got to start thinking. Why SHOULD the audience listen? What should they get out of it?

If you cannot answer this, do not give the talk.

But let’s say you’ve been told to give a boring talk. Hmm, lets pick something really dull for an example: your team has saved 10% bandwidth in the reverse proxy cluster.

Why should I listen? Well, maybe bandwidth is a real constraint. Maybe bandwidth is holding up feature launches. Maybe it costs money? There must be a simple layman’s explanation. If not, maybe you shouldn’t have done it!

So we’re saving money. Ok. And we’re the team lead. We have experience. This is getting better. Start there.

I like to start with some intrigue. “I’m Ralph, I’m the head of proxy reversals, and I’m going to tell you how we saved a baby giraffe.”

Now tell us a story. Add some jokes. Our story is that we’ve been trying to fix this for ages, but we were looking at the flange panel, when really the flux lever was jammed. Oh, how we laughed! Take us with you. Don’t rush.

Use one or two big numbers, if the numbers are impressive. Our reverse proxy cluster is the size of six elephants. We’ve saved bandwidth equivalent to downloading six thousand copies of Bohemian Rhapsody.

Now we just need to finish strong. A final slide, a final sentence. What was the lesson? Be rigorous, get it right? Ten percent savings means ten percent more bacon? If you can, revisit the intrigue from your opening. How did you save the giraffe? Give us a statement, say thank you, and never ever trail off with “and so that’s about it…”

Finally, practice your talk. Even if you’re alone, in a cupboard. It will help you pace yourself, to practice the timing of your jokes.

The greatest feeling ever is the stretch between setup line and punch line. The longer you leave it, the better the result. Trust me.

Next time you give a talk, look out at the audience. If they’re all checking tweets on their iPhones, you’ve failed. If they’re all hanging on to hear more, you’ve won.

And winning is everything.

Education, education, education.

I’ve been reading newspapers online from back home. People in the UK are always tinkering with education. Like others, I judge them on their ideas, call them crazy, and laugh about how little they understand about anything.

What’s odd is that we always compare the proposed changes with our own education. Which in my case began some thirty years ago.

I’m a computer programmer. And this is the kind of education I had.

Primary school was divided in two: infants (5-7), and juniors (7-11).

Before that came nursery school. I never understood nursery school. You turn up, you play with other kids. Where’s the schooling? Years later, my mum told me that there was teaching, but that I’d been emphatic about playing. School was for playing I said. Home was for learning.

I learnt a lot at home, from an early age. Having a brother 18 months ahead is a great way to just naturally learn.

At junior school we had this great maths system based on boxes of cards. Each box was a different colour, and contained about three hundred cards. You could work at your own pace. It was fan-tas-tic.

The school probably had three computers. BBC micros, running old educational software like grannies garden. You could expect to use one of these about three times, total, only on special occasions.

Secondary school is 11-16.

Now, my secondary school was considered a good quality school. One of the best in the area. Not posh enough for local boys Beckham and Ive to have been to, but good nonetheless. When I got there it had a room (!) full of BBC micros. After a year, they were replaced with a room of Acorn Archimedes.

Never heard of that? Hmm, surprising. Or not surprising at all, because they were computers intended only for education. That’s right, some smartarse in government thought that kids should learn how to use one kind of computer, just so they’d be completely lost when it turned out the rest of the world used PCs. This is why we point at politicians and laugh.

Anyway, so we had computer lessons. No, I’m joking. There were no computer classes. THEY’D ACTUALLY STOPPED TEACHING COMPUTER PROGRAMMING. Gone. Kapoof. No programming lessons at all. They had them in the eighties, but had stopped them.

How? What? Why?

So what did we have? Well, for GCSE, I could take Office Technology. This involved learning to type. To music. Taking dictation. Writing letters. Oh yes, it was fifties secretarial school. I actually didn’t get the top mark in this. Why? Conversation went like this: me: “Do you think I’ll get an A Star?” her: “A what?” So, yeah, didn’t get one.

Somehow I got a B in English Language. Bastards.

On to sixth form (16-18). This was known to be a shitty school. I was tired of travelling on the train. Went to the local school. No friends. Didn’t care.

But they had PCs. They taught PCs. You know what? It was great!
Databases, programming, hacking.
Computing A-Level, ka-ching! Wonderful.

During this time, my brother borrowed the 1600baud modem from his school. You have no idea how slow this thing was. We couldn’t pay for AOL, so I spent hours online to various bulletin boards. Our monthly phone bill went up from 10 to 80 pounds a month. My parents were very forgiving. I upgraded to 14.4k. Wow. And then 28.8k, 36.6k, 56k. I loved being online.

Anyway, On to university (18-21). A prestigious one.

Oh my god.

Green screen terminals. Only. In the computer department. Some neck beard bleating about how they were better, if only you’d spend every hour of the day configuring it. How cursor keys that actually worked were a dumb idea.

I hated it. You know what, they had colour PCs in the library. I used those.

I really wish they could have caught my interest there. In retrospect the material was useful, but god they made it so hard to stay interested.

More lectures? Just kill me.

They assumed no computer skills at all to start with. Computing A-Level was not a prerequisite. So the first year was three quarters ignorable. Not a good start.

The Internet was taking off, but these guys did not care. I wasn’t allowed to install a phone line in my room to run a modem. It was so hard.

What an amazing waste of 150 energetic ambitious students, who could have done so much.

My education was terrible.

I imagine computer education now must be different because work life is so different. The Internet and OSS bridged the gap between abstract education and applied ideas. I imagine students these days are burning hours on GitHub. Brilliant.

My advice to them: you’ll never again have as much time as you do now. Try everything. Obsess over something. Get into Open Source in a big way, even if you’re just helping on the fringes. Make mistakes. Learn things.

And try to ignore us adults as we tinker with your education.
You see, we grew up in a very different world. No laptops, no mobile phones, no Internet.
And that’s how we imagine school is still.

What is the problem you’re trying to solve?

This is about the most useful question in engineering. I ask it a lot.
“how do I get to this private method?”
“hmm, you shouldn’t really do that. What is the problem you’re trying to solve?”
“I’m trying to find the tweet id”
“oh that’s easy, we have a method for that…”

I think it’s a common question at Apple too.
Their UI design is full of it.

Sometimes for the good:
“how do I get rid of this virus?”
“virus? why do you have a virus?”
“I downloaded this software…”
“ah, let me build you an app store”

Sometimes for the bad:
“why doesn’t this green button work?”
“what is the problem you’re trying to solve?”
“I want to maximise the window”
“ah, let me build you Spaces, a whole new way to…”
“just make the fucking button work”