The weekend after I posted this article about the pitfalls hiding in a simple shell command-line, I had some free time and decided it might be fun to see what the same functionality would look like in Haskell.

My Haskell experience is limited to tutorials, book exercises, and reading other people’s code, so I wanted to go a little bit off the paved road for once.

So I grabbed System.FilePath.Find and hsexif off Hackage because they seemed to be what I needed, and set about making the type checker happy enough to run my program.

I didn't expect to just knock out a working program in an unfamiliar language in minutes, and I didn't. Nonetheless I was pretty impressed by how, once I had muddled through understanding the pieces I was working with, they joined together in a pleasingly logical way. (Although looking at the code a month later I can get what the various bits do—the types are informative enough for that—but it would take some unravelling for me to remember how.)

Then I ran my resulting program on a real directory full of photos and it instantly died, because the exif parser was built on lazy I/O, and my script was running out of available file-handles before it was getting around to closing them.

Leaky abstractions 1, Charles 0.

This is the kind of post that has a small but annoyingly non-zero chance of setting off somebody's "wrong on the Internet" buzzer. Please don't. It's an anecdote of how I encountered an unshaven yak on a lazy Sunday afternoon, as developers are wont to do, nothing more.


Twitter is a crowded bar. Most of the people who are there, are there to relax, hang out and chat with the friends or colleagues they showed up with.

Twitter is a crowded bar. You're having conversations in a public place. You are surrounded by people having conversations within your earshot. But none of that makes what you are doing or what they are doing "public debate" by any reasonable definition.

Twitter is a crowded bar, not an alternate universe, so try not to say anything that would get you in trouble if it was repeated outside the bar.

Twitter is a crowded bar. Sometimes you run into people you know. And if they're cool with the friends you went to the bar with, everything will be cool.

Twitter is a crowded bar. Some of the people there are being paid to promote a product. Some are there to network. Some are there because they're famous and it's a "place to be seen". You can hang around them if that's your thing, but they're at the bar because everybody else makes it worth them being there, not the other way around.

Twitter is a crowded bar. People can go to bars to meet strangers, to meet new people in a new town, or because they know it's where other people "like them" hang out. But it's never anyone else's responsibility to make sure a stranger feels welcome with them personally, or with their social circle.

Twitter is a crowded bar. If you hear something interesting from a nearby conversation there's nothing stopping you introducing yourself and joining in. But again, it's your job to make sure you're not an unwelcome interruption.

Twitter is a crowded bar. If you're that person who always ends up cornering a stranger who doesn't particularly want to talk to you in a one-on-one conversation, you're not fooling anyone.

Twitter is a crowded bar. If someone says "I didn't come here to argue with you about that", even if it's something they brought up in the first place, you should probably find another conversation. There's plenty of them around.

Twitter is a crowded bar. If you go there to pick fights with strangers, you're an asshole.

Twitter is a crowded bar, but they've kind of skimped on hiring bouncers.


The most educational part of this recent reiteration of the “your software should be like Unix pipes” trope isn’t that it shows how Unix command line tools are actually rather complicated, and can easily turn into baroque magical invocations. Although that's certainly true. The man-page for ‘find’ is 3,700 words. The manual for grep is a comparatively light 1,600 words, but that's because the 3,000 word explanation of regular expressions is in a different file.

The most educational part is the addendum:

Update: added -print0 to find and -0 to xargs to properly handle spaces in file names.

Firstly, this is a really dangerous class of bug. Unsafe handling of spaces in filenames is the kind of shell scripting mistake that will eventually end up deleting half the files on your computer when you just wanted to prune a directory.

It’s no accident that “The day I accidentally rm -rf /’d as root, but recovered because I still had an emacs process running in another terminal.” is the archetypal Unix admin war-story.

Secondly, this is the kind of bug that appears as an emergent behaviour of component-based systems. Every component in the pipeline is working entirely correctly, in the sense that they're all performing exactly the operation they were instructed to perform. The bug comes from the way the pieces have been joined together.

Joining simple components together doesn't guarantee you simplicity. Hook a machine that does three things to a machine that does three things, and you've got a bigger machine that does nine things. Any one of those nine paths could conceal a bug that doesn't live in either component, but in the assumptions made when those components are joined together.

The Unix pipe model, where complex operations are composed out of single-function pieces that consume one stream of bytes and emit another, is magically simple. Every component speaks the same language—bytes in, bytes out—and thus every component is compatible with each other. The components can be developed to a uniform simple flow of common input and output APIs. Complex things like flow control are handled for you: shells can buffer those bytes so if you send too fast your writes will eventually block until the next component is free to receive.

At this point I must defer to Jamie Zawinski:

…the decades-old Unix “pipe” model is just plain dumb, because it forces you to think of everything as serializable text, even things that are fundamentally not text, or that are not sensibly serializable.

For a program that produces or consumes a list of items, the problem of how that list is communicated doesn't go away by saying “everything is a stream of bytes”. All that happens is that each program producing or consuming lists has to pick a delimiter, and hope that the other program in the chain doesn't pick a different delimiter and delete all your files.

And then there are the assumptions about how a stream of bytes might map to text that are rooted in the 1970s. Or the way programs that want to support pretty-printing to the terminal must do so by silently varying their output based on the identity of the stream they are writing to.

Simplicity is prerequisite for reliability. — Edsger Dijkstra, How do we tell truths that might hurt?

The Unix pipe model is actually a great example of how a complex system can be made to look simple by pushing complexity downstream, and how doing so can give you a very narrowly defined kind of simplicity at the expense of reliability—the simplicity of a system that mostly does the right thing most of the time.

The New Jersey guy said that the Unix solution was right because the design philosophy of Unix was simplicity and that the right thing was too complex. Besides, programmers could easily insert this extra test and loop. The MIT guy pointed out that the implementation was simple but the interface to the functionality was complex. — Richard Gabriel, The Rise of Worse Is Better

If you only have to worry about mostly doing the right thing most of the time, your components can be simpler because they can pretend edge-cases don't exist or don't matter. For users, the default “happy path” can be simpler because they don’t have to cater to those edge-cases except when they happen and they either remember to insert that extra test for the unhappy path, or are left cleaning up the mess afterwards. And if things do screw up, it’s easy to blame yourself because you forgot you needed a -print0 in there.

There is an obvious analogy to programming language type systems, or pure functions vs side-effects here. Feel free to print out this blog post and scribble one in the margins.

Also, Simplicity isn't simple, a coda.


Going Clear

  • 5:25 PM

One of the great unsolved mysteries of my life is: “Who was the utter tosspot who gave my name to the Church of Scientology?”

I was sixteen-turning-seventeen at the end of my last year of high school in Western Australia, and I got a phone call at home. According to their records, I had purchased a copy of Dianetics, and did I want to take some of my time to maybe get together and talk to them about it?

Even in 1992 this seemed like a particularly silly idea. I didn't really know much about the organisation, but I had walked past the Scientology centre in Perth any number of times. There were rumours of cultish brainwashing. Also, my brother owned a few of the Battlefield Earth books and he told me they were kind of shit.

So I told them a polite “thanks but no thanks”, then went to school and interrogated all of the members of my nerdy, Dungeons-and-Dragons-playing social circle to find out who had let curiosity get the better of them enough to buy a book in my name. I had my suspicions, but none of them fessed up.

From then on, contact from Scientology became a regular, but not overwhelmingly regular thing. Every few months I would get a letter here, a phone call there. On one memorable occasion they invited me to their Summer barbecue. I would politely ask them to stop contacting me. They would assure me I was missing out on something really great, then let me go until next time.

In my first year of University I found a copy of Dianetics in the UWA library. Somebody had neatly printed “This is bullshit” on the first page of the first chapter. I didn't make it much further into the book than that myself.

Not long after, I discovered the Internet.

Reports these days will attribute the Internet’s awareness of, and activism against Scientology to Anonymous, but that’s just good marketing on anon’s part. Operation Clambake published the now-infamous Xenu documents all the way back in 1996, a direct consequence of the attention drawn to the organisation in 1995 by the death of Lisa McPherson, and the Church’s clumsy attempt to remove the alt.religion.scientology Usenet newsgroup.

As a Law student at the time, the leaked OT-III documents were one of my favourite legal Catch-22s. In order to make a copyright claim to suppress the documents’ publication, the Church of Scientology had to attest legally they were legitimate, and thus verify the Xenu thing was real.

So after a few years of occasional but annoying contact, I wrote a two page letter explaining in detail what I had discovered while investigating their religion, and why there wasn’t even the slightest chance I would show up to their barbecue even if they did have really tasty sausages. This being the early 90s I printed the letter out, put it in an envelope, put a stamp on it and walked down to the shops to put it in a mailbox.

And that was the last contact I had with Scientology.


Even in the late 90s owning your own domain was something of a novelty. I used it everywhere, even when I posted to Usenet. Which was probably a bad idea since I can also now count eighteen years during which my primary email address has been passed from spammer to spammer like an increasingly quaint heirloom.

At the time I had also discovered that Telstra offered wholesale dialup Internet. For the low entry fee of pretending to be a real company, you got a 24/7 dialup connection with as large a statically-routed IP block as you could justify by emailing them to tell them what you were planning on using the addresses for (a /29, was more than enough for me). The bargain rate was the same they charged ISPs for backbone traffic: 19c per megabyte downstream.

Yes, in modern terms that's a lot. For an Australian student in the 90s who was mostly using the connection for IRC and Usenet, and whose primary browser was lynx, it was actually pretty cheap. And it meant on months I was broke I could get away with barely paying anything. Also, because it was a dedicated connection there was zero modem contention and you never got kicked off.

Around the same time I was also volunteering on the K:Line desk of an IRC network, and even as late in the history of the Internet as 1997 there was still the assumption that when you sent an email to the abuse@ address of a domain, a human being would read it and at least tell you why you weren't important enough to care about.

Anyway, during that time I annoyed someone on Usenet enough that they decided to email my Internet Provider to complain about my terrible behaviour. By the above-explained strange twist of fate, that Internet Provider was me.

Sadly I don't have a copy of my response, but from memory it was something like this.

To: complainer@some.isp.example.com
From: abuse@pastiche.org
Subject: Your complaint.

This is in regards to your contact about the behaviour of one of our subscribers on Usenet newsgroup alt.irc.

I would like to reassure you that we consider it important to be good Internet citizens, and take complaints about our subscribers seriously. I would like to thank you for reporting this incident to us.

Having reviewed the material of your complaint, we agree that this behaviour should not be tolerated.

We have identified the user responsible, and had him taken out and shot.


The Pastiche Abuse Team.

The complainer, sadly, didn't reply.


There's been an awful lot of discussion the last few months around how much the Apple Watch Edition would cost, who would possibly buy an expensive piece of jewelry that would likely be obsolete in a year, and what clever trade-in or upgrade schemes Apple might put in place to make it worthwhile.

Today we know for sure that the answer to the first question is “US$10,000-$17,000, or possibly higher for models not yet on the Apple Store.”

I'd like to suggest the answer to the third question doesn't matter, because the answer to the second question is “people who don’t care about the third question.”

I think it was Gruber who pointed out that one of the interesting things about Apple products for us upper middle-class consumers is that the iPhone we buy is exactly the same one Beyoncé has. No matter how successful she is, she can't get a better iPhone than us.

Empowering for us, kind of annoying for Beyoncé.

At the time I'm writing this, Apple is the most profitable company in the history of everything. Selling luxury watches to that small population of people who can pay for luxury watches isn't going to make that needle move noticeably. Rolex's annual revenue is around $4.5bn. That's less than 10% of what Apple is expecting to pull in this quarter.

Apple isn't modeling their business on Rolex selling watches that will last a lifetime. They are looking at Armani selling couture that will be deliberately outmoded by next season’s fashions. And they are looking at it for exactly the same reason Armani does.

(Armani's annual revenue is a lot less less than Rolex, which is where the analogy falls down a little, but I think the general point is still valid. :) )

Armani Exchange prices its dresses in the low hundreds of dollars. Emporio Armani or Armani Collezioni dresses start to reach the thousands. But if you want something like the Armani gown Cate Blanchett wore to the Oscars, you might be talking six figures.

The number of people who are going to buy a $100,000 dress is vanishingly small (and I'm assuming Blanchett was, like most Oscar attendees, lent hers as a promotion). If you built a business making $100,000 dresses, you are likely be a cottage industry dependent on the fickle fancies of the very rich. But if you're in the business of selling $100 and $1000 dresses, having a $100,000 dress draped over a famous actress lends an enormous amount of prestige to your brand, and makes people start to think that maybe your $1000 dresses are kind of a bargain?

Apple already knows that with the right tech, it can make hundreds of billions of dollars selling $500-$1000 gadgets with a 24 month life-span. The difference is the iPhone models were differentiated by technical specs, not by appearance. If Apple had just released one watch that was priced around $400, and another that was closer to $1000, with identical specs and different materials, customers would have really wondered whether twice as much money was worth it just for a slightly prettier watch.

Through the simple existence of the Apple Watch Edition, the regular Apple Watch stops being the few-hundred-dollars more expensive model of the entry-level Apple Watch Sport. It becomes the one-tenth-the-price model of the Edition. When the Jay-Z version of a product is $10,000, and you know that you're getting exactly the same functionality as Jay-Z just in steel or aluminium instead of gold, the psychological effect is you're now deciding in terms of the—much less immediately grokkable—difference between 1/10th of the price and 1/20th.

If the Apple Watch is a product people want, and we don't yet know it will be, Apple are going to sell a lot of Editions. The world contains a lot of people who want to express their wealth by buying a better version of the thing everyone else is buying, and the Edition speaks to those consumers. But when it comes to their bottom line, Apple is going to make a whole lot more money from consumers who, just because the Edition exists, unconsciously see the stainless steel Apple Watch as the middle choice.



  • 7:25 PM
  1. Use Google (or just search Github directly) to find the Vagrant recipe for the thing you want to install.
  2. Clone the recipe from the only available tag: master.
  3. Run vagrant up
  4. Upgrade Vagrant, because it's been a few months since you did that last and nothing works any more.
  5. Upgrade VirtualBox, because that's a few months old too, and you know there's no chance the newest version of Vagrant will work with something so hideously ancient.
  6. Run vagrant up
  7. Return to Google to find plausible substitutes for the dependencies that have vanished off the Internet since this recipe was written.
  8. Cross fingers.
  9. Run vagrant up
  10. Return to Google to find the extra plugins you need to run this recipe.
  11. Follow the series of redirects to find where said plugins are hosted these days.
  12. Install plugins.
  13. Run vagrant up
  14. Run VAGRANT_LOG=debug vagrant up
  15. Hunt your way up through the pile of Ruby stack traces until you find the "undefined method" error.
  16. Sob quietly into your cup of tea.


In a world where every generation in recorded history has pored over the habits of their successors looking for evidence that the human race is getting lazier, stupider and more vain, it seems obvious that taking photos of yourself in front of interesting things is going to end up being Exhibit A for the prosecution.

Here's the thing though. I consider myself a decent amateur photographer. However with a few seconds on Google I can find a picture of the Eiffel Tower that is taken by someone far better than I, in better light, from a better angle and with fewer other tourists in the way than I would have ever been able to manage in the few days I was in Paris this year.

But none of them would have my wife and me in them, enjoying our honeymoon far more than two people have any right to enjoy anything.

It actually hit me when I was trying to put a website together for our wedding back in late 2013. Over the years I had taken thousands of photographs, documenting everywhere we had gone together, but because I was always behind the camera I could only find about half a dozen pictures of the two of us. It turns out that if you rely on other people to document your being a couple, you'll be left short. Starting on our honeymoon I set about correcting this deficit, one tourist landmark at a time.

Unless you're an artist, a documentarian or a professional, photographs aren't about having pictures of things, especially in an age when you can find pictures of almost anything you can think of without getting up from your desk. Amateur photographs are about capturing the memory of when, where and how the photo was taken. What it was like to be in a particular place at a particular time of your life, with the people who were there with you. So that when you go through that album you go back to that place in your mind and experience it again through the lens.

Isn't wanting to include yourself in that frame the most natural thing in the world?

Charles and Donna at Uluru


Happy birthday to me
Happy birthday to me
One year ’til I’m forty
Fuck fuck fuck fuck fuck fuck.


Imagine you decided to learn a new programming language. You navigate to that language's website and you discover the documentation consists entirely of:

  1. “Getting Started”: sample code for Hello World
  2. “Advanced”: sample code for a Hello World that does a few fancy tricks
  3. If you're lucky, a list of the more important functions in the standard library,
  4. A link to the source and native documentation of the compiler/interpreter

You'd think that was a pretty shithouse state of affairs, right? Good programming language documentation introduces its major concepts one at a time, building up to a full understanding of the power of the language. Then it gives you a tour of the standard library, usually task-oriented to show you how common tasks of varying complexities can be performed. Then in the appendix you get the formal definition of the language, and comprehensive documentation of the libraries.

Unfortunately, despite the trend towards Domain Specific Languages running rampant, developers almost never seem to get the point that if this is indeed a language, it should be documented like one. Mostly, the attitude seems to be "Stack Overflow is thattaway."

End result: I spend a little too much of my time like this whenever I try to learn a new library or framework (Scala is a huge offender here).

@carlfish on Twitter: Yeah, that String is magically coerced into one of a dozen possible types depending on context. But it reads like English, kinda!

Look, I get it. Domain Specific Languages are powerful. They create ways to express concepts in code that would otherwise be verbose or ugly. But with the power that comes from stepping outside the grammar and expectations of the host language, comes the fact that the tools and conventions developers are accustomed to in that language, the things they use every day to understand their code and the code of others, are also broken by your DSL.

If you're going to inflict a DSL on the world, at the barest of bare minimums you should:

  • Have a properly specified grammar
  • Fully document your keywords and operators
  • Fully document your “standard library” in a format that is designed for the DSL itself, not by referring to the generated documentation of the language it was implemented in.

Each of these things will not only make your users happier, they will make your DSL better. You'll uncover all the wrinkles in your grammar that will trip up developers, all those places where your keywords or operators totally change meanings in different contexts, and all those weird inconsistencies in your libraries that are there because you're so used to seeing them from inside the interpreter looking out.

And I will have more time on weekends to watch Doctor Who with my wife instead of swearing at a screen trying to work out how to do something that would have been Really Simple if the developer hadn't decided that it would be so much cleverer to build an entirely new language to express it.



I was eighteen turning nineteen in my second year at university, stuck between trying to distance myself from the person I had been in high school and utterly failing to connect with the person I wanted to be in my head. I had managed to isolate myself almost completely.

Then I discovered Usenet newsgroups, a place where who I had been no longer mattered. I could go in with a blank slate and stake my claim on the back of something I knew I was good at: writing. At the same time I made an almost immediate connection to the mythology of the Internet, and a deep interest in discovering how the hell it all worked under the hood. If you want to know how I went from being a disinterested law student to being the architect for a social software platform, there's your catalyst.

By chance I found a corner of Usenet to call home, a place of inconsequential arguments about shit that didn’t matter. It was technically a “flame” newsgroup, so these arguments got pretty heated and personal, but because it was about shit that didn’t matter, it didn’t… well… matter very much. A bunch of us bonded over our ability to throw the choicest insults, then fragmented over petty squabbles, then re-formed into two semi-connected groups, then got bored and moved on with our lives.

At some point during all this, I got into an argument with a complete stranger about some shit that didn’t matter. I wrote a scathing tear-down of their personality, their motives, their utter worthlessness as a human being, ending in a flat statement that the only worthwhile thing they could do with their life was to end it.

I showed this post to an online friend of mine, a fellow flame-war veteran, expecting her to be impressed by how completely I had defeated this particular foe. Her response was cold. “You don’t fucking say that to someone. Not even as a joke.”


At some point, my Usenet crowd made a second home on IRC, because real-time messaging was a little more convenient for casual chat than essays that, thanks to the fundamental uncertainty of Usenet, may or may not ever be seen by anyone else.

Somewhere else on the same IRC network there was a channel of people who had never been on Usenet, but by dint of the same Shit That Didn’t Matter, were our natural enemies. We took to casually raiding them when we were bored, dive-bombing the channel to have pointless arguments, or just trying out flood scripts or scripted ANSI bombs that hadn’t been effective weapons for years. For some reason I couldn’t fathom they would always un-ban us after a few hours.

Because I was in Australia, there were long hours in the day where nobody from my entirely American Usenet circle was online. Not knowing anyone else on the network I took to hanging out in the channel I had previously been raiding. I got to know some of the night-owl regulars there. Eventually I dropped the pretense we were enemies.

A year later when I backpacked across the USA for my 21st birthday, five of them bought me dinner, let me sleep on their couches, or both.


A little less than a year ago, I was cleaning up an unused corner of my Internet existence, and found a link to a comment I had left years before on someone’s blog. The topic was men and women. I had absolutely no memory of writing the comment, but my name was above it and my standard throwaway password was on the account that posted it.

And it was bullshit. A whole bunch of biotruth-y, evo-psych nonsense that I must have believed at the time. The blog's author quite rightly eviscerated me for my intrusion into her online space with such a load of rubbish, but I had never revisited the site after leaving my reply. I had just walked away and forgotten I had been there.

I spent the next hour writing an email to the author apologising for my comments, and thanking her because it was people like her, writing the sorts of things she was writing online that had turned the Charles-of-a-few-years-ago who wrote that crap into the Charles of today who understood how much crap it was.


A few months ago, a colleague of mine caused a stir online saying something he should have known better than to say. What happened is a matter of public record, but I’m not going to go over the details here because that part is not my story.

What is my story is that after a frantic day of diving head-first into internal discussions of what we did wrong and what we could do to make it better, I had the sudden realisation that two of the more popular posts on this blog, posts that got me many a hearty back-slap at the time, were written to the same conceit that had got my colleague in trouble, yet with an execution ten times as bad.

Those posts no longer appear on my blog.


I don’t believe that the problem with the Internet is anonymity, and that “people are just going to be like that”.

At no point in these stories did I identify as, or want to be an asshole, or be sexist, or be ignorant. We are always growing and learning, and along the way people came along who filled in gaps in my understanding, showed me what I needed to do to better fit into the shoes of who I wanted to be.

I think the problem with the Internet is that the feedback mechanism that would normally guide wanting-to-be-good but misguided people back to the mean has been broken, often by naive nerds with good intentions. Simultaneously, those people who could provide that feedback have been conditioned not to interfere.

Free speech is a good thing, so we create unsafe spaces where groups get to reinforce each others prejudices unchecked, and silencing abusers is censorship. Where arguing with racists is “mess[ing] with the normal function of the site” but being those racists isn't.

Anonymity is a good thing, so we create unsafe spaces where the maintainers wash their hands of responsibility for safeguarding against the real-world dangers that can emerge from it.

And in every case we lean back on the excuse that the Internet is just like that, and it’s just too hard to stop so why even bother trying (except when it threatens to cause the site to be shut down, at which point it mysteriously becomes enforceable).

It would be one thing if such places were well known as the arse-end of the Internet and admitting you were associated with one in polite company was the same as admitting you were a member of a White Power group. Instead, the rest of the world tacitly excuses these sites, partly because the principles (unmoderated speech, anonymous speech) are so easy to defend in isolation from their consequences, but mostly because they also produce most of our funny cat pictures.


The Apple Watch

  • 8:23 AM

I stopped wearing a watch when I started carrying a phone.

The problem Apple faces is that these days the wrist watch is far more a piece of functional jewelry than it is a thing people depend on to tell the time. Apple have gone some way to address this with multiple faces, sizes, metals and bands, but it will take a significant shift in taste for fashion to look past the fact that at heart it's an oblong block.

Donna predicted before the event that Apple would be getting fashion houses involved in making bands or faces for their watch. That seems even more likely since the reveal.

Much of the appeal of watches as fashion items are their retro-fetishistic throwback to precise arrangements of cogs and wheels, often made visible in the design so wearers can imagine some wizened Swiss genius putting the mechanism together with a loupe and tiny tweezers whenever they check their wrist.

The mechanical precision behind the Apple Watch is likely orders of magnitude beyond that, but it is sealed away from appreciation.

I will probably buy the first generation Apple watch because I am a nerd and I like nerd toys, but I would be surprised if it turned out to be more than a novelty I keep forgetting to put on in the morning.


In the news today, “Google has [allegedly -cm] signed a deal to buy game-livestreaming firm Twitch for $1 billion, confirmed sources familiar with the matter.”.

To state the bleeding obvious, Twitch's software and infrastructure isn't worth a billion dollars. The owner of YouTube could have made a strong expansion into game-centered live streaming for a tenth of that figure, most of the work focused around creating the right user experience for streamers and viewers, and making a few deals to broadcast key events and personalities.

And then we would have two strong players in the market competing with each other, forcing each other to improve. Twitch would have the established pool of streamers and viewers, the deals with console-makers, the first-mover advantage and the indie cred. YouTube would have the rock-solid infrastructure, deep pockets to expand their reach, and the billions of eyeballs that are already visiting their site to watch cats doing funny stuff.

Instead, with a billion dollars, Google buys itself a lock-hold on an exciting emerging market. Their presence will actively dissuade anyone new from making a serious bid to join in, because who has the resources to go against Google when they have bought themselves such a massive head-start?

It's a deal that makes perfect sense for both parties, but the consumers lose.

On set: director Duncan Jones, and actors Ben Foster, Dominic Cooper, Paula Patton and Travis Fimmel.

Director: OK, I’m pumped! Finally out on location shooting after all that time stuck in pre-production! OK, Scene 26. Ben? This is a crucial scene for you, as your character Medivh is succumbing to the influence of the evil Titan Sargeras, who wants to destroy all the livin…

Ben Foster: Is this necessary? Just start shooting already.

Director: But I feel it’s important we establish your motiv…

Dominic Cooper: This movie is going to take forever at this rate. Why are we only doing one scene at a time? We’re all experienced actors, we could handle four or five scenes at once easy.

Travis Fimmel: Go. Go. Go. Go. Go. Just roll the cameras and we’ll be fine.

Director: Er… Huh? OK… I guess we just go with this… Sound ready? Roll cameras. Dom? Walk to that mark and say your line.

Dominic Cooper: What’s my line?

Director: Er… Someone remind Dom what his line is?

Cast: Silence…

Director: Does anyone know what their lines are?

Cast: More silence…

Director: For the love of… You were sent the script a month ago! The least you could have done is read it before you showed up!

Travis Fimmel: I never read the script. I find I understand the film better if I just follow what the other actors are doing for a while.

Director: This is totally unprofessional, all of you.

Paula Patton: Don’t tell me I don’t know what I’m doing! I have an Academy award!

Director: No you don’t.

Paula Patton: …it’s on my other account.

Dominic Cooper: Wait a minute… Paula is a girl? For real? Where are you from?

Director: Oh God… I give up.

Any resemblance to real people is purely coincidental.


I spend a non-trivial amount of my time talking to students, junior developers and other newcomers to the industry, and one of the war stories I share goes something like this.

At its heart, commercial software development is soul-crushingly depressing.

As a developer, your working day revolves around everything that's wrong with all the hard work you've put in so far. When you come in to work, your primary interface with reality is the infinite list of shit that needs to be done. You have a list of bugs that need fixing. You have a list of feature requests, things your software is deficient for not doing, and every one of which somebody can't live without. Your job is to pick something off one of those lists and fix it, but when you come in tomorrow, the infinite list of shit will still be infinitely long.

One memory from the early days of my current job is a developer who got so mired in this mindset that the founders literally ordered him to fly from Sydney to San Francisco where he could talk to some real customers, the people who had bought his product and, while they might have the occasional gripe, mostly wanted to tell him how awesome it was, and how it was helping them.

One thing I've been trying to do in my daily life is to be less critical of other peoples software, especially in public places, and especially if I think someone who might have been responsible for that software might be listening. I sometimes let frustration get the better of me, but I'm trying.

There are plenty of official channels to report bugs and request features, but when you go outside them, there's a good chance all you're going to do is ruin someone's day for no real benefit.


Instant messages, last Thursday:

Charles: I’m spending the next two days at a terribly wanky-sounding seminar.

Charles: “Search Inside Yourself”

Vidya: Eek.

Charles: Someone else cancelled and gave me their ticket.

Vidya: You’d better not come out brainwashed and be like “It was great. I never expected it, but it’s mind blowing ladidah…”

Vidya: You’d better return a cynic.

Charles: I searched inside myself, and found a cynical bastard.

The Good

To my great disappointment, a decent chunk of what went on in the day and a half I was holed up in the Sheraton learning to be mindful was not an irredeemable load of wank. Much of the theory around self-awareness and self-improvement was prima facie plausible, and seemed backed by a non-trivial amount of peer reviewed science.

As anyone will tell you, paying attention to one thing at a time is not my strongest skill. In a recent hack day, one of the company’s CEOs went so far as to tell me I had “one of the biggest cases of attention deficit he’s ever seen” as I obsessively command-tabbed between the many windows that keep me with one leg on each strand of my spider-web of constantly streaming global information.

So as much as I hate to admit it, the “mindfulness meditation” exercises around controlling the focus of your attention, recognising when your attention was wandering and drawing it back to whatever you were originally supposed to be doing without falling into a downward spiral of judgement and meta-analysis were something I could use to good effect in my day-to-day life.

I even found myself paying more attention to the speakers than I normally would. It almost seems like cheating, when you start the day teaching your audience how not to tune out of what you’re saying for the rest of it.

The journalling exercises also reminded me of the power of putting one word after another. Whenever I write, I fight with the way what felt in my head like a linear narrative waiting to be transcribed verbatim turns out to be anything but. Turning ideas into written words forces you to fill in all sorts of gaps you didn’t even know were there until you started writing, and often you learn a great deal of what you really think by making yourself express it.

Other techniques, like the practice of recognising emotion in the physical effects it has on your body, and then distancing yourself from them enough to make rational decisions seemed promising, although I utterly failed to summon any triggers from memory during meditation.

It’s also worth mentioning the massive buffet lunch the hotel put on for us was nothing short of amazing.

The Bad

The first thing I wrote down in my notes on day one: “Amazing how you can prime an audience to say what you want them to, by describing something then asking people to describe it as if you hadn't.” If you have spent five minutes telling a room full of people what you think are important qualities for success, don’t pretend to be all surprised when you ask them what they value in a leader and have those points regurgitated back to you.

Despite the presentations being quite grounded in rationality and scientific evidence, the atmosphere in the room often verged on the revival meeting, and even if there was no “woo” on stage, you could hear the crystals’ faint clinking whenever the microphones roamed the audience. In the frequent feedback sessions, attendees competed to be the most earnest, to provide the most insightful reinforcement of the speakers, to gush at how the most recent five minutes of meditation had changed their lives.

By the second day I had started collecting examples of “common phrases that make me dismiss your statement”, including any comment from the audience starting with “Can I acknowledge…” or ending with “I just wanted to share that.”

A note from my end-of-first-day summary: “Boring people should not be given microphones.”

I hope they didn't think I was taking the piss too much when I volunteered that I had attempted to mindfully drink a beer, but wasn't sure I had experienced anything different because “the first beer after work is already a spiritual experience.”

The rare admission that some practice hadn’t been useful, or some enlightenment hadn’t been felt, was met by the presenters with a thoughtful “Well isn’t that interesting”, reminding me so much of the “That is such a great dream” that Quentin Watts, Triple J’s resident morning show dream interpreter in the 90s, would preface every one of her blatant cold readings.

A note early from the second day, whispered to me from a neighbouring seat during one of the many times comment was being sought from the audience: “I challenge you to think of the most absurd thing you can say and still get [the presenter] to agree with you.”

Even as the presenters pushed the science, they were careful to hedge their bets occasionally by pointing out that the field and much of the research was new and uncorroborated.

During the lunch break on day one, I asked an academic working in the field how you could possibly have a double-blind study when the subjects obviously knew which group they were in by dint of the fact that they either were, or were not taking a mindfulness course. His response: “It’s even worse than that. In [the study he was involved with], the evaluating therapists all knew which group each subject was in within minutes of starting their evaluation, just from the words they used to describe their progress.”

The Ugly

I suffer from a mild social anxiety. It manifests as an irrational but unescapable belief that aside from about half a dozen people—wife, immediate family, closest friend—everyone else in the world would be far happier if I wasn’t around. Amongst other things it’s why at University I was that guy who would always leave parties without saying goodbye, why I’m so bad at conferences and trade-shows, and why performance reviews turn me into an alcoholic.

Over the years I’ve developed effective ways of coping. Simple things like structuring social interaction around some activity like a game, or around alcohol, (preferably both) limiting my daily contact with strangers, or making sure I have scripts to deal with common social situations. (When I make a phone call, I’ll map the expected conversation out in my head before I dial the number. Which is why voicemail always throws me for a loop.)

Which brings me to the last four lines in my notebook, written just before lunch on the second day:

“Just like me” practice.
Kindness training.

Staring at someone - awkward as fuck.

The exercise… I mean “practice” was to explore the concept of empathy by staring intently at a complete stranger for what felt like an eternity, while the convener quietly encouraged you to recognise this person as another human being just like you, with all the same kinds of thoughts and feelings, memories, triumphs and pain as you, to connect with them.

At times it was hard not to giggle, but we got through it. It certainly created the illusion that somehow just by staring at someone for a while I had made some connection to them.

After the practice was over, as we debriefed in preparation for lunch, I felt this growing feeling of dread.

“Aha!” I thought. “A chance to use that thing we learned yesterday!”

I took a deep breath or two, tuned out the microphone-grabbers describing how their minds had been opened to the beauty of the world and focused my attention on the sensations in my body. Tightness in my chest. Tense muscles. Heightened senses. “Fight or flight” reflex.

It was the very familiar sensation of “human being overload”. Unlike all the previous one-on-one exercises which had been safely covered by my “talking at someone on a harmless predetermined topic” script, this unexpected, unscripted and unfamiliar interaction was something my brain was not prepared to process rationally.

I'd felt this often enough to realise the only reliable way to make it go away was to distance myself from anyone who might want to interact with me. So I gathered up my notepad and bag, avoided the Sheraton’s delicious buffet, ate a large tub of frozen yogurt in blissful anonymity in a food court, then went home.

Everyone’s mind is different. Some peoples minds don’t work quite as you (or they) wish they did. Introducing people cold to exercises designed to have a psychological impact, in an unregulated, highly conformist environment with no safe avenue to opt out seems… risky.


Sorry, this blog entry is all images. I fail at accessibility. If it's any consolation, you've only missed a lame Star Wars joke.

(Transcript of IM conversation)

Charles: We need this!

Donna: No.

Charles: Awwww…

Donna: It's fugly.

Charles: Yes, but… but…

Donna: You can put it in your study?

Charles: I don't have room. It would have to go in the living room.



Laura Hudson, writing in Wired:

Ultimately, online abuse isn’t a technological problem; it’s a social problem that just happens to be powered by technology. The best solutions are going to be those that not only defuse the Internet’s power to amplify abuse but also encourage crucial shifts in social norms, placing bad behavior beyond the pale. When people speak up about online harassment, one of the most common responses is “Well, what did you expect from the Internet?” If we truly want to change our online spaces, the answer from all of us has got to be: more.


I haven't seen the F8 session or used Flux. I've just vaguely skimmed some of the reddit comments. However…

Once upon a time, there was this thing called the Model View Controller architecture. It was a product of the Smalltalk community, but then so were Design Patterns and Extreme Programming. At its heart, it was the simple idea that Model classes should be responsible for representing the state of your application, View classes should be responsible for drawing your user interfaces and presenting that state to your users, and Controller classes should be for translating actions performed by your user into changes to your model, that were then reflected in your view.

In a typical screen for an MVC GUI you might have any number of widgets, each drawn by their own independent view objects, backed by different models, connected to multiple controllers. Almost forty years after the MVC pattern was formulated for GUI development it is still out there, albeit in obscure rarely-used frameworks like Cocoa Touch.

Then, twenty years after MVC was introduced to the Smalltalk world, along came the Model 2 Web Application. In an attempt to make Java web development fit into the growing J2EE spec, the Java community seized on MVC and mapped it almost arbitrarily to the web. Every HTTP request would be served by a single controller (servlet), which would collaborate with zero-to-many models (EJBs), and map the resulting data into a DTO (Pay no attention to the man behind the curtain!) that could be passed via RequestDispatcher to a single JSP view.

The sleight-of-hand was the assumption—baked into the servlet spec—that each HTTP request would map to a single controller which would delegate to a single view. A few frameworks like Tapestry tried to buck the trend, but a Java developer years later could literally replace servlets with actions, EJBs with dependency-injected beans and JSPs with the templating language du jour, and still deliver a not-unreasonable technology choice in most circles. This malaise even infected other undeserving languages like Ruby.

The problem is that even in a very simple web application, a single page contains elements that by rights should be the responsibility of different views, backed by different controllers and their own models. The single controller-per-request, or even the primary controller-per-request is a broken paradigm, and one that every developer has come up with some sub-optimal tower of contraptions to compensate for.

As a result, your average non-trivial Java web application ended up being a mess of controller implementation inheritence, servlet filters, interceptor stacks, view decorators and arbitrary objects placed in the template engine's context to allow the drawing of all the bits of the web page that don't belong to the increasingly impure controller.

Amusingly, the "Type 2" approach to web MVC isn't a bad fit for REST-based systems, (because a REST resource usually does have a single responsibility), but most pure REST systems figure it's overkill… because a REST resource just has a single responsibility.

A simple inversion fixes so much. Going back to the GUI paradigm and flipping the process around so the view comes first and then delegates to controllers and models as necessary is already the go-to strategy for single-page applications and frameworks like Backbone. This kind of "view first" is also a perfectly good strategy for server-side page generation, one that large distributed systems have been taking advantage of for years to delegate fragments of page generation to independent external services.

This blog post was brought to you by the Society for Sending Charles Back In Time Fourteen Years To Slap Himself.



Help! Stuck in Turbolift!
Reporter: Williams, D. Lieutenant
Priority: Critical
Version: NCC-1701


The Turbolift is not moving, no matter how many times I state my destination to the computer.

Comment from Bandt, G. Ensign

I am reducing the priority of this issue from Critical to High. While we appreciate the urgency of your situation, Critical priority is reserved for issues that may impact the integrity or spaceworthiness of the vessel.

Old Enterprise versions do not have a reliable voice control in the Turbolift. Have you tried twisting the cylindrical handle clockwise or anticlockwise?

Comment from Williams, D. Lieutenant

I rotated the handle anticlockwise and I am now in Engineering. Please close the issue, I will find someone here to show me how to get to the Bridge.


From: Cordova, M. Lieutenant Commander
To: enterprise-support@starfleet.gov
Subject: Auxiliary Power

It has come to my attention that many support engineers are reducing their “time to first response” by, on receiving a new case, immediately bouncing it back to the customer with the comment: “Have you tried diverting auxiliary power to the affected system?”

While diverting auxiliary power is often a good short-term fix, suggesting it in every case will only reduce the confidence our customers have in our service, and increase the perception that we are just making guesses instead of taking the time to understand the issue and provide informed advice.

As Starfleet officers, we should take pride in the service we provide, and not resort to cheap shortcuts to artificially boost our metrics.

LtC. Michelle Cordova
Team Lead, Enterprise Support


Starship adrift! Please Escalate!
Reporter: Picard, J-L. Captain
Priority: Blocker
Version: NCC-1701-D


It has been seven days since I opened my previous ticket re: having completely lost control of my Starship. The Enterprise is currently adrift in space, main power is dead as are the warp and impulse engines. We are locked out of the computer and all diagnostics and overrides have so far been fruitless.

Despite this dire situation we have found ourselves being bounced back and forth by a junior engineer who does not seem to appreciate the gravity of the situation, or even be able to provide us with an idea of how much longer our situation will have gravity!

We have approximately four days of auxiliary power remaining (Thank you for that suggestion, it would SO OBVIOUSLY have not been the very first thing we tried ourselves!) and would appreciate the attention of a more senior engineer before then.

Comment from Garvin T. Snr Ensign

Hi, I was assigned to help you with your case. I have reviewed the previous tickets and will be working personally with you going forward until we have found a solution.

Have you checked Jeffries Tube 194a? The problem you are experiencing could be caused by a crystalline intelligence having taken refuge in your substructure, using that location as a beach-head to control the core engineering functions of your starship.

As a higher form of life you may not wish to kill it, but short bursts of gamma radiation triggered manually from the deflector dish can make it uncomfortable enough to leave on its own.

Comment from Picard, J-L. Captain

That was exactly right! How did you know? Please close the issue.

Comment from Garvin T. Snr Ensign

It happens more often than you think.

Comment from System

Thank you for contacting Enterprise Support. Now your case is closed, we would appreciate if you took a moment to fill out the following survey:

On a scale of 1 to 10 where 1 is “never” and 10 is “always”, how likely would you be to recommend Enterprise Support to a friend or colleague?


From: Cordova, M. Lieutenant Commander
To: enterprise-support@starfleet.gov
Subject: First and last warning.

Everything in my previous email referring to diverting auxiliary power _also_ applies to reversing the polarity.

LtC. Michelle Cordova
Team Lead, Enterprise Support

Ideas shamelessly stolen from Chris and Conor. Also, Atlassian is hiring an Enterprise Senior Support Engineer, but I can’t guarantee you’d end up fixing warp core breaches if you applied.