2016 in review

I had a good run of year in review posts, but fell off the bandwagon lately. It's time to change that. Before I dive into 2016, here's a recap of the intervening years:

2013: Around the world tickets in hand, Misch and I worked, volunteered, and played Japan, Vietnam, Hong Kong, the USA, Finland, Germany, the UK, Spain, and Italy. An amazing time! Attended my first (and only) WWDC and had a blast. Started working on Decaf Sucks 2.0 (you'll hear more about that much later).

2014: Settling back in Canberra and realising we could live for a long time in our (large by world standards) apartment, we renovated a little: new floors, paint, curtains. Made it feel like a whole new place. Misch and I gave birth to Clover, our best and most satisfying team effort yet.

2015: Took our first with-kid overseas trip, and cruised through to Clover's first birthday and our first parenting anniversary (which we celebrated with a giant bánh mì party). Icelab gathered for FarmLab, and we discussed alternatives-to-Rails for the first time. Our grandmothers both passed away, and we spent time with the extended family. Jojo and I held Rails Camp in Canberra in December, where we got to eat cake for Rails' 10th birthday and watch Star Wars with 70 of our friends. Misch and I got pregnant again but sadly lost the little baby at 7 weeks.

Phew. That was some time. Now onto 2016.


At home with the (expanded!) family

Losing a baby at the end of 2016 was a big thing, but thankfully it came at a time when work and other demands scale back, so Misch and I spent some good quality time together and could regroup.

We got a couple of big things done in the beginning of the year. First up, we bought a car! After two years of mostly car-free life, it was time for another way to get around the place. Our little Škoda Fabia does just that, and is fun to drive.

Next, we renovated our bathroom! Knowing we'll be living here for many years to come, this was a big and worthwhile upgrade to our home amenity. We splashed out and got a Toto washlet, too. I regret nothing.

And in the last big thing for 2016, we became pregnant again and gave birth to baby Iris Persephone in October. This time around, the room at the Birth Centre was brimming with family. We wanted Clover there, so along came Misch's parents too. Clover's excited cry of "Baby!" upon seeing Iris come into the world is something I'll always remember. Iris' arrival brought another 6 weeks of time at home, which I enjoyed even more now that we're a family of four.

Decaf Sucks 2.0

With Misch's encouragement, I returned to my long stalled effort to release our all-new 2.0 version of Decaf Sucks. Turned out it didn't need all that much; with just a couple of weeks of effort, Max and I got everything wrapped up and released it to the world. It was a weight from my shoulders and I'm happy to finally have it out there.


2016 brought a seismic shift in how I write Ruby applications. After some experimentations with rom-rb and Piotr Solnica's rodakase experiment late in 2015, I knew this was my future. So I dove in and contributed as much as I could to the fledgling set of libraries now known as dry-rb. And we got a lot done. We released a whole bunch of gems, made things "official" with the launch of a website and discussion forum, and expanded the core team of developers to 5.

Along with sharing code, I wanted to start sharing some of the thinking behind the dry-rb style of Ruby app development, so I set about blogging, and managed to publish once a week for a good few months. This culminated with an introductory talk I gave at RedDotRubyConf in Singapore. This was my first conference talk and I relished the opportunity to really polish a particular message. Luckily, I was able to build upon this a repeat performance at Rails Camp in Adelaide and at a Ruby community workshop over in Perth. No doubt, you can expect to hear plenty more from me about dry-rb in 2017 :)


Icelab kicked off 2016 by celebrating our 10th birthday! I think we've built a remarkable little company and work-home to many good people, and I think the next 10 years will be even better.

For me, most of 2016 at Icelab was spent getting us settled onto dry-rb and rom-rb as our preferred stack for server-side applications. We shipped our first production app with these all the way back in February, launched our new website as an open source example app in June, and we have several more big sites that'll see the light of day early in 2017. It took a little while to get over the knowledge and productivity hump, but I feel we've hit a good rhythm with the stack now, and given we're the long-term maintainers of most of the things we ship, it'll be something that I expect will pay dividends for many years to come.

Open source was another big theme for the year. Along with our ongoing contributions to dry-rb, we took an "open source first" approach to any other standalone, reusable pieces of code we wrote. This small shift was a big help in making better design choices right from the beginning. You'll be able to see some of this bear fruit when we take our advanced form builder to 1.0 next year. It's already been an incredibly useful tool across our client projects.

I'm also proud that Icelab began contributing to the open source infrastructure that powers Ruby apps everywhere through our contributions to Ruby Together, which we joined in 2016 as Australia's first Emerald member.

And all the rest

And now I'll collect everything else I could think of into a few broadly categorised lists:

Computer life:

  • I've removed Twitter apps from all my platforms. It's helped me focus.
  • Said goodbye to gentlyremind.me, the little Rails app I've been running to email me my Twitter favourites. Now that IFTTT can do that same thing, I'm happy to have one less running thing I have to worry about.
  • Sometime in June I surpassed 250,000 all time Icelab chat messages.
  • Mulled many times with my co-workers on how we could run a better kind of tech meet-up in Canberra. Maybe this year!

Software development:

  • Continued my love/hate relationship with Docker, but I think now I've managed to find the right place for it in our development life: standardised production environments, and local dev only when we have to run something unusual.
  • After uncountable years, I'm finally looking away from Heroku as our production environment of choice.
  • Shipped a production iOS app built using Turbolinks for iOS, and it turned out rather nicely. I'd be happy to play with it some more.
  • We settled on Attache as a standard handler for all our file uploads. I feel it is a smart architectural choice (and I was happy to meet its affable creator Choon Keat in Singapore!)
  • We started to build Danger into our CI builds. It's already helpful, and I think we're just scratching the surface.
  • time_math2 is a great little Ruby library and a wonderful archetype for how "expressive" Ruby libraries can be made without Rails-style monkey patches.

Physical things:

  • The Mizudashi cold brew coffee pot I picked up to celebrate the launch of Decaf Sucks 2.0 makes amazing coffee and I've been putting it to good use ever since the weather warmed up. I'm aiming for 100% uptime of cold brew all summer long.
  • The Minaal daily shipped from their Kickstarter campaign and it immediately became my every day carry. A great companion to their larger carry-on bag.


  • After trying innumerable things and never settling, I've finally found a home for all my writing (pieces long, short, random or otherwise): it's Ulysses. What a great app.
  • Castro 2 came out with an ingenious new mechanic and I'm very happy to continue using it. It's helped my jump onto a few new podcasts without the worry of managing them.
  • CarPlay is great. I'll readily admit this was a deciding factor in our new car choice and I wasn't disappointed.
  • Paw is now my one-stop shop for all my HTTP requestin’. Super polished.
  • I'm back on good old Mail.app and happy to ignore all the we'll-host-your-mail-and-your-passwords offerings that continue to swirl around.

Books, film, TV, etc.

  • Ripped through quite a bit of fiction as I waited for Clover to sleep (happily now she does this on her own). Highlights: Seveneves, Proxima & Ultima, The Prefect, Aurora and the Wool trilogy.
  • I look at my Letterboxd profile and once again resolve to watch more cinema. Anyway, 2016's highlights were The Big Short, Hunt for the Wilderpeople, Easy A, Arrival, Crazy, Stupid Love and of course Rogue One.
  • Subscribing to Netflix has been great. And fits perfectly well with our no-TV household.


  • Cooked all the Filipino food I could think up. It was great to have this as a motivating theme behind all my cooking.
  • And I tried toast and yoghurt for breakfast for the first time. Guess there's always time for new firsts ¯\_(ツ)_/¯.

New podcasts

I've enjoyed a couple of new podcasts lately:

Slate's Working podcast finds people in interesting jobs and interviews them about their workdays. It's brand new. The first episode – with Stephen Colbert – was fantastic. The show is short and dense. David Plotz as the host (along with some helpful editing, I'm sure) gets the guest talking (they usually have a lot to say) and then gets out of the way. I've appreciated finding another non-tech podcast to keep in my roster.

I still have plenty of room for good tech podcasts, though. Thoughtbot have just launched another new podcast, called The Bike Shed, covering their general experiences in web development. This looks like it will be a discussion show with regular hosts Sean Griffin and Derek Prior. They seem humble and grounded, and the first show on Sandi Metz' rules was thoughtful, and directly applicable to my work as a web developer. I'm still thinking over what they shared. I'm also appreciative they've kept the show to under 30 minutes. This makes it easy to cover on a walk into work!

Our Problem with Boxen

Over a year ago, we started using Boxen at Icelab to manage our team’s development environments. It’s worked as advertised, but not well enough. I’m looking for something else.

Our problem with Boxen is that it contains hundreds of different components, all of which are changing, all the time. It needs constant tending. By the time a team is big enough to need something like Boxen, it’s paradoxically too small to look after it properly: to have someone whose job it is to be “Boxenmaster,” someone who knows how these intricate parts all interact and can run the regular clean installs needed to make sure that the experience is smooth for new people (we’ve found it typical for a functional Boxen setup to stay working over repeated updates, while clean installs end up failing). We need a tool that we can set up once for a project and then have it still work reliably 6 months later when we revisit the project for further work.

Boxen can be a trojan horse. If you don’t look after it properly, you risk creating two classes of developers within your team: those who were around to get Boxen working when you first rolled it out, now enjoying their nice functional development environments, and those who get started later, whose first experience in the team is one of frustration, non-productivity and a disheartening, unapproachable web of interconnected packages. And no one is safe: as soon as you want to upgrade that version of PHP, you could slip down there too.

So while Boxen can indeed work as manager of personal development environments, and while Puppet is a serious and capable configuration manager, my recommendation is not to commit to Boxen half-heartedly. In fact, you may not even need something so rigorous and complex if your team is still small. I’m looking into such alternatives right now. I’m not settled on anything yet, but it’ll likely involve virtual machines, and perhaps use Docker as a way to keep it lightweight while working on multiple projects at a time. Fig seems like it could be a good fit. I’ll keep you posted.

Decaf Sucks 2: A New Old Design

The iOS 7 betas are coming thick and fast. If we want to finish the rebuild of Decaf Sucks and ship it close to the iOS 7 launch, we need to be pragmatic with our design changes. We’ll look to change as little as possible, but we still don't want to release the same old app with a slightly different skin. We want to do a little more thinking than this and give people something to make the upgrade worthwhile.

We'll achieve this by focusing on one of the core principles of the new iOS 7 design: deference to content, through a user interface that highlights the content instead of competing with it.

Right now we don't do so well by this measure, even at our very first screen:

 The empty Decaf Sucks first screen

Unless our users want to stop and admire our search field and big green button, we can do a lot better than this. This isn't content. It's functionality, and it should be as invisible as possible. A much better idea would be to jump straight to the list of cafes, around the user's current location:

 A list of Decaf Sucks cafes in Berlin

When people open Decaf Sucks, it’s usually because they want to find coffee now. The alternative action, looking for a different location, is much less frequent and can be hidden behind a button in the toolbar. It doesn't need prime real estate on the first screen of the app. So what we can do is completely remove the first screen and start showing useful content right away.

This is a good start, but we can do better still, by thinking more deeply about what our “content” really is. It's not just a list of cafes, it's the user's context, their location relative to the cafes around them. It's not enough just to crave a macchiato and see some text saying a café is 200m away; you should also know where that café is and what path you might take to get there. This is where the map view shines. We've had a map right from the app's first release and for all these reasons it's one of the most useful ways to find cafes. But it's still hidden behind a button press. There's no quick way to get an immediate, at-a-glance understanding of the caffeine landscape that surrounds you.

We can solve this by combining the map and list views:

 A preview of the Decaf Sucks 2 combined list and map screen

After this, when the user launches the app, not only will it be already primed for their current location, they'll also see the nearby cafes both in a map and a list, and can choose to interact with whichever representation is most useful to them.

These are the main design changes we'll make for Decaf Sucks 2. We'll condense three screens into one and present useful content as early as we can. If this takes you to a suitably excellent coffee a few seconds earlier, then our mission will be accomplished!

Decaf Sucks 2: Starting Over

 Decaf Sucks 2: New Xcode Project

They say to avoid the big rewrite. Luckily, Decaf Sucks isn't that big.

Importantly, one of the app's key reasons for being is to give ourselves an opportunity to build something great for iOS. When it comes to great, a lot has changed since the middle of 2011, when we released the app for iOS 4. This includes the development tools, which have grown to include:

  • ARC (Automatic reference counting)
  • Modern Objective-C (literals, object subscripting, automatic synthesizing of properties, no need for private method header declarations, etc.)
  • Storyboards
  • Auto Layout
  • Collection views
  • OS-integrated Twitter & Facebook support
  • Cocoapods
  • And the much improved editing environment in Xcode 5

Getting our hands onto these will make the app more fun to develop and improve our ability to add great new features further down the track. Decaf Sucks was also our first major iOS app. We've learnt a lot since then and there's plenty we can tidy up.

The mobile app development world is moving fast; the list above proves it. For a small app like Decaf Sucks, it makes sense for us to build with the best and latest available tools, and not to handicap ourselves for the sake of the broadest user base (especially when new iOS adoption is so fast). So Decaf Sucks 2 will be built from scratch, and for iOS 7 only. Apple is taking their mobile user experience to a significant new place, and we want to do everything we can to arrive there too.

Check back for the next post, where I'll share some thoughts on our design approach!

Decaf Sucks 2 Is Coming, 2 Hours at a Time

If you know me even a little, you'll know I love drinking coffee. This is why we built Decaf Sucks, as a place to record and share our café experiences. It's turned out that it also offers a great way to travel: finding coffee is usually an interesting axis along which to explore a city. It takes you away from the tourist traps, to interesting neighborhoods, and injects you into the regular lives of the locals. This is how I've explored Bacolod, Tokyo, Hong Kong, and most lately, San Francisco.

It was also in San Francisco that I was lucky enough to attend Apple's WWDC event for 2013. It left me enthused for all the opportunities that iOS 7 affords to developers, and with Decaf Sucks being our biggest stake in the iOS marketplace, I really wanted to take the chance to ship something new.

It so happens that I've just started a 2-week holiday, the first real time away from work in this year's travels. But if you're anything like me, and your work is something you love, then it's unlikely you completely switch off anyway. So I've decided to make the most of this and spend a little time each day on developing Decaf Sucks for iOS 7. It'll start in the mornings: I've been waking up early lately, giving me a whole 2 hours or more before the day really begins. This is how I'll be developing Decaf Sucks: 2 hours at a time. It'll be an exercise of doing a lot with a little, of the bootstrapped side-project.

In the spirit of my last Decaf Sucks development sprint, I'll document my progress here, before slipping my iPhone into my pocket and setting off each day (likely in search of the morning's first coffee). Watch this space!