Yield Thought

it's not as hard as you think
formerly coderoom.wordpress.com

image

"I never thought I’d write a blog post in Microsoft Word, but here I am doing just that," begins my first blog post on the Surface. Written lying on a rabbit-shaped bench overlooking the sea, with a gentle breeze cooling the heat of the sun on my skin, all is well. A week later when I come to edit and upload it, I discover that Word has lost it[1].

Act One: All good things come to an end

This story begins back in January. I’d been curious about trying a Surface + Linode combination instead of my 2 year-old iPad + Linode setup. The allure of a full-fat browser that can run Gmail and iPython Notebooks, combined with a keyboard-centric OS has long tempted me. I hadn’t switched, though. Somehow, I had been waiting. At the end of that fateful January amidst the snow and the cold, everything changed.

I was promoted into a management role.

Overnight I find my entire interface to the rest of the company changes. What used to be IM and Mercurial is now emails with attached Word and Powerpoint documents. Within a fortnight the iPad + Linode setup collapses; neither iOS nor Linux nor Google Docs offer credible alternatives for reviewing, editing and returning Office documents and I grit my teeth, install Windows 8 and Office on my laptop and get to work.

Fast forward to April, and I’m wandering through a cherry-blossom filled Washington, exasperated by two months of being tied to a laptop, with all the power, size, screen, weight and fragility restrictions that go along with one. I’ve mostly stopped working in cafes and outdoors, but I miss it. As I walk I weigh up the alternatives. A 13” Air would be a massive step back towards the freedoms I’ve grown used to, but the fanless, robust silence of a tablet continues to attract me, and I don’t want to go back to managing local storage any more than I can help.

image 

Reaching a decision, I drive to a cathedral-like mall and walk out again a few minutes later with a Surface RT and type cover. The time to try a Surface has come. If anything can let me work as flexibly and freely as my iPad in this new corporate world, the Surface can.

Act Two: Flashback

In the following glorious three months of summer and sunshine at my new home by the sea, I get to know the Surface, its glory and its shame. It works, I use it every day. Yet something is missing, something isn’t right. I just can’t fall in love with the Surface.

image

Back in primary school, my class made Christmas cards for our parents one year. My artistically-gifted friend, who knew the difference between a B and HB pencil, drew out a simple, bold cracker design with a simple twist - you can pull apart the cracker to see the message. No more, no less, but somehow he managed to spend the whole hour working on it.

I thought the pop-up idea was great. My card had a cracker too, and when you opened it there was a fireplace and tree inside and there were extra tabs to pull to make the fire go out and Father Christmas come down and you could open one of the presents under the tree to see my name and I’d fitted most of the words in without squashing them and when I showed the resultant sticky, thumb-printed mess to our teacher he asked me what on earth that was and told me to throw it away and make another.

I didn’t make another, but I did take a long, hard look at my friend’s card. Mine did more; why wasn’t it better? In that moment, I first learned about the relationship between elegance, simplicity and beauty, and my card with all its features and messy edges had none of these things.

image

Using the Surface gives me the same feeling. I can do more with the Surface, but it is not beautiful, nor do I enjoy using it - or being seen using it. It’s so obviously a business device that putting it on the table in a cafe feels… awkward. Like an imposition, doing office work in a leisure place.

The experience is often disjinting. Rotating the device results in a weird “pop” animation that often leaves desktop windows or even the start screen itself distorted and out of place. It persists in referring to itself as my “PC”. The keyboard doesn’t auto-appear when text fields have the focus in desktop applications. Metro IE sometimes decides to reload all the old open tabs when clicking a link in a mail switches to it, stealing the focus from the new page I just tried to visit. The kickstand is at just the wrong angle for everything and the keyboard, while fine on a table, is spongy and occasionally misses keypresses when used on a lap. Word doesn’t save your work unless you click on a 3.5” disk icon regularly. There are a hundred small things that make the whole experience feel fragile, confused and unsatisfying.

No, I cannot love the Surface. But neither do I discard it. Despite its failings, it does what it claims. It works, and it lets me work, flying through my Gmail with keyboard shortcuts, effortlessly opening, reviewing, changing and reattaching Office documents to emails. Sometimes, it even feels incredibly cool - using an iPython Notebook running on my Linode to graph and explore data from the tablet is absolutely great, even if it’s only possible thanks to the single-click jailbreak.

Act Three: Surprise

You see, there’s something else, something that changes things in ways I never expected: I can read the Surface’s screen in direct sunlight.

image

While I can just about work on my iPad in the shade of a tree, the Surface screen is clear and bright lying in direct sunlight in the hammock on my balcony, on a pier at the beach, outdoors in a café or on a rug in the garden. This changes the game again. Working in a natural environment can be both beautiful and liberating. It’s just a shame it’s coupled to a device that’s otherwise somehow disappointing.

Visiting my friends in Munich is typical of my mixed feelings for the situation. It’s a 7 hour train journey and a 7 day trip. I take the Surface for working on but also pack the iPad for playing games, so now everything weighs as much as a small laptop would anyway. My friends in Munich consistently tell me how healthy I’m looking. I put it down to my suntan from all those mornings in the hammock with the Surface.

I prefer the experience of working on the iPad. The amazing, unexpected mental freedom of having all my state on an automatically backed-up, always-on Linode coupled to a simple, essentially stateless window onto that world that I could toss around like a paperback book. The ability to open and close it at will, let the battery run flat, leave apps open with the contents unfinished and never give them a second thought.

The Surface doesn’t persist application state. Every week it threatens to restart itself within 2 days to install updates. If I haven’t manually saved work when it does that, the work is lost. Some things are saved on SkyDrive, some on the local disk, which isn’t automatically backed up either. So now I am forced to be aware of this leaky abstraction, to manage the remote and local state and at this point I might as well just have a MacBook Air and be done with it.

It lacks a zen-like calm.

And that’s what this comes down to. If you’re mostly doing non-web development, go for an iPad+Linode. If that combination can’t do the work you’re doing - like the MS Office editing I need to do now - then it’s a choice between the Surface and a laptop, not an iPad. Do I recommend the Surface for working like this? I don’t know. It’s been months and I still don’t know.

I would miss working outside if I had to go back to my laptop full time. Cycling into nature and working in a beautiful spot is fabulous. But these are things the screen lets me do, not the things the Surface lets me do. I expect to see similar screens on other devices soon. A good screen is not fundamental to the form factor or the manufacturer. There are probably options out there already that I haven’t seen because I never thought to look before.

image

I do know that I almost never use the Surface as a tablet. I use it like a little laptop. Maybe I’ll find the perfect combination of powershell scripts and metro apps to recreate an elegant workflow, but I’m not really motivated to because while I could use shell scripts and python programs on the Linode to work around the iPad’s email limitations I can’t do anything work around the Surface’s deeper usability flaws.

Every time I use it I miss my MacBook a little more.

Update: HN discussion here (including my thoughts on Microsoft Phone).

Update: I forgot to mention my Working in the Cloud mailing list. Articles like this appear there first, sign up if you’re interested in how things go from here!

[1] Actually it autosaved a file, and when I next tried to open an attachment during a conference call I ignored the annoying little restore blah blah tab. I’ve since learned not to do that. But I shouldn’t have to.

Note: this is (most of) the content from the first post to my Working in the Cloud email list - more are prepared and will go out soon, so if you don’t want to miss the rest you can still join the list here.

About a week after I published the iPad + Linode: One Year Later post, my employer decided to buy me a shiny new laptop for CUDA (GPU) development - a Dell XPS 15 with 8GB RAM, a quad-core i7 CPU and a 512GB SSD drive. It was shiny!

And it was fast. Compile times dropped from 53 seconds to just 20. Test suites ran faster. With 8 GB memory I could run larger tests, or more concurrently. Disk space - always a limitation on the Linode 512 - was no longer a problem.

I’ll be honest: after the first day, I began to have doubts about my future in the cloud.

There were one or two cracks in the armor; a laptop keyboard just isn’t as nice as the Apple Wireless one. It gets unpleasantly warm and it’s just a bit too high off the table. I tried an external keyboard, but then I’m sitting too far away from the screen.

I also missed touch. I never expected to say this, but moving the pointer around with a touchpad or even an external mouse just feels slightly awkward now. It’s less immediate; one more thing for my subconscious to work on.

Having a desktop-class browser is really, really nice though. GMail is more responsive and I can use Google docs like a Real Person again. I can even attach things to emails! Hallelujah!

The one thing I don’t really notice while programming is the screen. Everybody asks me how I can work on such a small or low-res screen with the iPad. Really, I don’t notice the difference unless I’m doing a 3-way merge and need the extra horizontal space.

I spent a whole week working on the new laptop. It was a busy time at work and I was multitasking like an over-caffeinated rabbit, flicking back to my emails every few minutes to clear the next dozen that had arrived since I last looked. Meanwhile, my iPad lay in the corner quietly discharging its battery into the void. 

Until Thursday afternoon. It was a splendid autumnal day and as I stepped outside at lunch to pick up some fresh bread from the bakers something in the air called to my soul. You can’t sit inside on the last fine day of autumn, it whispered to me, come with me and be free.

I went back inside, packed up my iPad, some water and a rug into my rucksack and set of, into the great outdoors. Twenty minutes later I was lying in the dappled shade in the vastness of Munich’s English Garden, feeling the breeze playing in my hair as set up my 3G tethering. This is right, I thought. This is the life! And yet at the back of my mind was a guilty question: am I wasting time out here? Would I be more effective sitting back at home chained to The Machine?

I logged in and carried on hacking away at the same bug I’d tried and failed to track down the day before; a subtle problem that spanned several concurrently-running services in our system. I’d grown used to the rapid build/retest cycle of the new laptop and was finding the slower pace of the Linode increasingly frustrating. The air was beginning to turn chill and suddenly this wasn’t where I wanted to be or what I wanted to be doing.

I queued up another build and a set of offline tests to run and checked the time; it’d take a good five to ten minutes before the results were in. Time to move. I told the system to ping my phone when it was done then packed up and got back onto my bike, heading South to find a nice warm cafe to finish the afternoon in.

Back on my bike, gently coasting along the tree-lined paths, my muscles warmed up and my mind relaxed again. My thoughts turned back to the problem; not wanting to waste any more time I wondered how I could most effectively narrow down the scope of the bug. As I was crossing a small bridge I felt the buzz of the notification in my pocket; the builds were ready. Nearby was a small sunlit glade; I settled myself down between a small tree and the stream.

Before logging in on the iPad, I lay back, watched the leaves fluttering against the darkening blue of the sky and finished thinking about the tests I’d run; what the various outcomes might actually mean, and what my next step could be. Once I knew exactly what I wanted to try next, I opened the iPad, logged in and did exactly that - no more, no less. Thirty minutes later I’d solved the problem.

Riding back home, I realized I’d spent the entire afternoon thinking about and working on the problem. Not checking my emails, not writing a quick reply in some barely-related feature discussion. Not reading Hacker News. Just focused on the most important problem of the day.

The same thing happened a week later when I had to write a press release. I’d spent all week putting it off, finding ‘more urgent’ things to do in my emails, attacking small development problems. By Friday afternoon I’d run out of time. I closed the laptop and took my iPad to the window ledge, where I sat with a cup of tea and looked out across the grass, letting my thoughts come to rest.

Then I started typing. Typing on the touch screen is slower than a keyboard, just as compiling on a Linode is slower than on a quad-core i7. Yet again, here the bottleneck wasn’t my typing speed, but my thoughts. The slower pace became meditative, the lack of distractions absolute. An hour later I was done. Later that night our CTO replied saying that he loved it, calling it “quirky, refreshing, and extremely likely to get the coverage we need.”

I’m coming to the conclusion that the speed and generality of a laptop or desktop system is optimizing the wrong thing - it’s increasing the rate at which my brain receives distractions from the true bottleneck in my work: measured thought, repeatable inspiration.

Yet I have one more test left to try, and one that I think might interest you: what if I try to get the best out of both worlds and use the iPad to remotely connect to my work laptop? This is something you could try, too - after a little bit of setup you could take your tablet down to the building cafeteria, or library, or outside, or home, and get a taste for what working on it is like without having to sign up and set up and entire remote server.

I’ve now set this up myself using an iPad and Ubuntu 12.04 laptop and will send detailed instructions on how to do it in the next email. If you want to receive it, click here to join the list.

Thanks, and until then, happy cloud working!

A year ago I said goodbye to my trusty MacBook Pro and started working exclusively on an iPad + Linode 512. It was an experiment at first - one that I never thought would last.

Twelve months later and I find I’m still working like this. A combination of Vim and GNU Screen for development, Pages for writing, Keynote for presentations, Jump and VNC for unavoidable X windows work, Mobile Safari for web apps and a hefty dose of python scripts to smooth off all the edges. I use it for development, for presentations, for my side projects, for everything. 

I really mean everything, by the way. A high-speed baby bottle demolished my MacBook Pro screen months ago and I still haven’t got around to getting it fixed yet.

I love this setup, but it isn’t perfect. I’ll be making some changes for in the coming months. Before I get into that, I want to share what this extraordinary year has been like.

In my original post - just one month after I started - I was still using the setup as a light, silent laptop replacement. Now I use it in ways and places I never even considered using a MacBook. It’s no exaggeration to say that, this year, the cloud has set me free.

Freedom

It’s a crisp summer morning. The clear blue sky promises a hot afternoon, but there’s a hint of freshness on the breeze that ruffles my hair. I smile in the dappled shade of the tree and lean back against the rock. My fingers lazily stroke the screen, scrolling through the feature spec, but my mind is a thousand miles away weighing up design decisions for our new product.

I’m constantly surprised how readable the iPad screen is outdoors. Despite being glossy, it’s much better than the anti-glare MacBook Pro screen. It makes working outdoors not just possible, but enjoyable.

A fine mist of tiny droplets falls over the screen and I casually wipe it clean; working next to the fountain is refreshing but I doubt I’d have risked $2000 of hardware here. The iPad’s proven to be a rugged little thing; it doesn’t seem to care if it gets wet and as my files are remote neither do I.

A buzz from my iPhone tells me my build and tests are finished. I pull it out and glance at the push notification, courtesy of Prowl. New test failures. I finish jotting down my thoughts so far into the Pages document I’m using for the spec then swipe back to iSSH. The tethered 3G connection from the iPhone is great, there’s no noticeable lag as I flick to my Vim screen and hit a shortcut that opens and formats the test results.

Hm, the “quick fix” I came up with on the ride here this morning has caused problems elsewhere. I dive into the code for a while, effortlessly navigating around our million line codebase with an instant code search web app I hacked together using python and flask. Happily, iSSH allows me to forward ports through to the iPad, making it easy to securely use HTML for my scripts and helper tools without exposing any HTTP ports to the outside world.

I finish correcting the fix and push it to our main repository. Jenkins will tell me if it passes on the test cluster in due course. I glance at the time and realize I’ve been sitting here for two hours now. I find I can work almost anywhere for two hours at a time, but to stay in one place for longer I need more comfort than a jumper to sit on and a rock for a backrest! Our mid-morning devteam meeting will be starting in fifteen minutes so it’s a good time to go somewhere quieter for the call.

I throw the iPad and keyboard into my rucksack, wade back across the stream and hop onto my bike. A brisk ride later and I’m back on foot, strolling through trees and flowers with my hands-free headset on in a vast landscaped garden that cuts right through Munich. The call is taking some time to set up. As I’m on 3G, I asked the office team to call my mobile number, but one of our developers is at home and doesn’t have a landline in his study, only Skype. An unexpected hiccup - I feel bad; if I were in an office this wouldn’t have happened.

While waiting for him to start the call with SkypeOut, I discover a rose bush and spend a moment enjoying their rich scent. It feels almost like cheating, working in such a beautiful environment, combining meetings with summer walks through the park. And yet, it doesn’t seem to have affected my productivity at all.

I wish the rest of our team could enjoy walking and talking about the last and upcoming week out here surrounded by nature instead of being stuck in a drab air-conditioned box the best part of a thousand miles away.

Then it strikes me: they could. And yet I worked in that office for six years and I never did. There’s a beautiful castle near the office set in vast landscaped gardens; I could have switched to an iPad + server (one of the office servers would have been fine) and spent a day working there, or any of the other beautiful places I loved to be in.

Of course, back then I used a graphical IDE and the iPad didn’t exist, but surely it would have worked with a laptop, too. Well, unless I ran out of power after an hour or two of multi-core compilation. Or it got too sunny. Or it started to rain. And then I’d have had to worry about finding a nice cafe that also has a free space on a large enough table near a power outlet. So many conditions. So much to fear. 

The 10-hour battery life, 3G connection and small form-factor of the iPad + wireless keyboard combination frees me from so much; today I can work wherever I can sit.

A chime from my phone snaps me out my reverie and we begin the call. The wind has picked up, so I mute myself when not speaking and cup the microphone in my hand when I am. It’s not perfect, but the fresh air filling my lungs and the rustle of the leaves in the trees overhead are worth it.

After so much nature I feel like sitting down with a proper seat and table when the call is done, so I cycle down through the park until I reach the Chinese Tower - a beer garden with fantastic benches in the shade. The perfect place to finish my morning’s coding.

At 1pm I leave the park and cut into the city, spending 45 minutes chatting with Matthias from MunichBeta over lunch in a tiny little Chinese place he knows, followed by a visit to Munich’s best ice cream parlour across the street. Matthias lives much as I do, flitting around the city trying out new places to work with his trusty Macbook Air.

This afternoon I’m giving a webinar to prospective customers; I need a quiet conference room and a rock solid internet connection for Skype. My location of choice: Combinat56.

I find a change of scene and some exercise are perfect to ward off any post-lunchtime lethargy and when I arrive at the stylish Combinat56 offices fifteen minutes later I’m feeling refreshed and ready to go.

Running the webinar from the iPad works just fine - Cisco have an iOS app and in any case we’re only sharing slides and dialling in. Usually I just email people the deck and call them on the phone, though; it’s simpler for all concerned.

After the call I catch up with my friends from the Combinat over a cup of tea in the lounge area. You can’t explore on your own all the time; working from home and in cafes is isolating after a while and I enjoy the community here as much as the decor.

While I work, afternoon becomes evening and I sign off from our team chat servers. On a whim, I kick off another round of data analysis on the million song dataset for a side project, then close the iPad and drop it into my bag. Knowing the Linode will keep working away at it, uninterrupted, while I cycle home and enjoy dinner with my wife and children gives me a warm, fuzzy feeling - my tireless robotic assistant, working away out of sight.

Trouble in Paradise

And yet not everything is perfect. I love having my data on a remote server and I’m deeply happy with my indefatigable Linode. Surprisingly, the weak link in all of this has become the iPad. And not just because of what it by design can’t do, but because the internet is moving towards richer and richer web apps and Mobile Safari still feels like a toy browser. 

Using Google Docs has been a pain all year and it isn’t getting any better. 

Having used the fascinating LightTable on the desktop, writing Clojure without it feels like wading through treacle, but Mobile Safari doesn’t have what it takes. I’ve even looked at hacking the engine out of the source and integrating it with the console, for goodness’ sake.

Luckily, splitting my devices between the server and a client means that I am free to change devices whenever I wish. I can work just as well on the twisted remains of my Macbook, a 3-screen office desktop or anything else with a browser, a terminal and a VNC app. My switching costs approach zero. And switch I will.

You see, a surprising alternative has appeared: the Microsoft Surface.

Surface + Linode 512

For a while now I’ve been telling people that Microsoft will become the new cool, the inventive underdog, and I still believe that. Windows 8 may be a huge gamble for Microsoft, but Windows 8 RT is a clear win for me.

Microsoft understands the keyboard. I can start, switch and control apps without leaving the keyboard. The device even comes with one.

Sometimes it’s really nice to have two windows open, especially when using video output to a larger monitor. I think the Windows 8 side-dock idea will suit me very well.

Love or hate Internet Explorer 10, I have every expectation that we’ll see the real rendering engine on Windows RT. I don’t care what they call it, if I can run LightTable and Google Docs without gouging my eyes out, I’ll be happy.

Last but not least, the Metro vibe feels fresh and new and I’m intrigued by Microsoft’s choice to make Javascript + HTML5 a first-class way to develop for the system. I’m already looking forward to hacking my own tiles together to smooth my workflow and simplify my day.

Perhaps in a year’s time I’ll be switching to another client. It doesn’t matter, and that’s the beauty of this setup - its flexibility. For me, though, this coming year will be the year of the Surface.

The Experiment is Over

Last year I started this as an experiment, but it stopped being that a long time ago. Today the entire city is my office - its parks, its countryside, its cafes and its workspaces. I have worked on river islands, half-way up trees and on exclusive rooftop terraces.

My side projects are simpler, more flexible and more exciting now my development machine is connected to the internet by a big fat pipe, 24/7. Want to run statistics over 5 years of Gmail messages? Just do it! No need to worry about how long it takes or whether someone will reset the wireless router part way through. It’s simple. It’s pure.

Feeling free to set off into the unknown, assured that I will find a place I can work, to explore and enjoy my surroundings… no, this isn’t an experiment any more.

It’s liberating, rejuvenating. It’s a way of life.

I will not give it up.

Postscript: Intrigued and looking for more? Tempted to try it out one afternoon? I’ve decided to start a mailing list - I plan to write one or two emails a month about my experiences; the highs and lows of this desk-free lifestyle. I’ll also share more practical tips such as setting up a VPN or keeping in touch with the team. You can join the list here.

Breaking news: Today Allinea ordered me a high-end laptop with a massive SSD for doing CUDA development on. Stay tuned to see how the iPad+Linode combination stacks up against top-of-the-range hardware!

Last week I promised to share all the details about my cloud development setup - this is how I did it, in ten soul-crushing liberating steps:

Step 1: Get a Linode

I chose a Linode 512, which has been perfect for my needs. You get all phenomenal CPU power and an itty-bitty RAM. Surprisingly, this is enough as we’ll be doing most of our work on the command-line; you can always upgrade it later.

I also turned on the $5 a month backups. Zero-effort data safety for less than the price of a hot chocolate? Yes, please!

Step 2: Configure your Linode

Linode’s interfaces walks you through adding your new node. Pick a region close to yourself - you want to minimize the roundtrip time to the server. I spend most of my time in Munich, so I have mine in London and get a 30-40ms ping, which is great.

I also picked one of their default 32-bit distributions - if you’re not sure or don’t care then just choose the latest Ubuntu and you won’t go far wrong.

After a few minutes the machine will be installed and booted, ready for use! Time to log in and set things up!

Step 3: Build Vim

I found Ubuntu’s default vim didn’t have everything I wanted, but don’t worry! It’s easy to download and build it yourself:

install-vim

Step 4: Install lots of juicy plugins

I honestly can’t remember which plugins I installed and which ones I actually use. My currently-installed list is:

  1. acp.vim
  2. asynccommand.vim
  3. a.vim
  4. cctree.vim
  5. clang_complete.vim
  6. color_sample_pack.vim
  7. command-t.vim
  8. compview.vim
  9. cscope_maps.vim
  10. fuf.vim
  11. l9.vim
  12. NERD_tree.vim
  13. scratch.vim
  14. searchfold.vim
  15. taglist.vim
  16. tasklist.vim

You probably don’t want all of those; I wouldn’t be without command-t though. You can get them all from vim.org/scripts - you might want to install pathogen and get them that way; I just copied the existing .vim folder from my MacVim installation, hence all the cruft.

Note that command-t requires you to build a stub - follow the install instructions in command-t.vim and it just works.

To use the clang_complete plugin, you’ll need clang: “apt-get install clang” should do the trick. I had to play around with it a bit to get it working on my project, which included adding all the -I and -D command-line options to a .clang-complete file in the project directory.

Step 5: Create your .vimrc

Here’s my .vimrc - some of the things here relate to e.g. our internal tracker system and won’t be interesting for you, but it should be clear what most of these things do and which keys are bound to them:

.vimrc

Step 6: Configure GNU screen

I don’t recall where I got this from, but it works well for me:

.screenrc

You’ll also want to create a few aliases to connect to different screen sessions painlessly - my .bashrc contains:

.bashrc

You can probably change screen’s escape key in the .screenrc file too; I never bothered to look it up. Here, ‘s’ or ‘t’ will attach me to my work or personal sessions respectively.

Many people have recommended tmux - I haven’t tried it yet; screen hasn’t given me a reason to want anything else.

Step 7: Configure VNC

install-vnc

Feel free to pick a display that makes you happy but make sure it matches the DISPLAY=:5 line in your .bashrc!

Step 8: Get a super-sweet thin client

I chose an iPad2, (the 16Gb Wifi model). I haven’t tried working over (tethered) 3G yet, but ssh from my iPhone works well so perhaps that’s also an option if you’re often out of wireless contact.

If you already have a tablet that you like, use that instead - all you need is a good SSH client and a good VNC client. On the iPad I use iSSH and Jump for SSH and VNC respectively. I haven’t tried Prompt or Screens, if you already have them then let me know how well they work out.

Whatever you do, get an external keyboard. The Apple bluetooth one is amazing, I can thoroughly recommend it.

You’ll also want an adjustable stand / case for your tablet. Amazon offers plenty to choose from.

Step 9: Configure your thin client

The hardest part of setting up a SSH client on a tablet is getting your private SSH key on there without entrusting it to a third party. I split mine across multiple services and removed it after recombining it; maybe you don’t really care.

If you didn’t add the export TERM line into your .bashrc then remember to tell your SSH client to report its TERM type as “xterm-256color” - providing it supports this (iSSH does) then you’ll get to enjoy beautiful soft shades in your remote Vim sessions - joy!

To begin with I used iSSH’s VNC client, which worked perfectly well but was a pain to switch to quickly. Last week I started using Jump instead and love it, it’s a super-smooth experience with lots of cute little touches that make me smile. Swiping to it with the new iOS5 gestures is much easier than changing the view in iSSH and the next update will make it auto-reconnect after the 10 minute background timeout, making the whole experience seamless all the time.

I learned a lesson: take a bit of time and money and try out various different clients. You’ll be spending most of your working day in them; try to smooth out every aspect of the experience.

Step 10: Enjoy life in the cloud

There’ll be many other packages you want to install - Dropbox and Google AppEngine spring to mind - both can run in console-only modes.

If you’ve followed this far then you should have a fully-connected remote server and tablet client - welcome to the future!

Update: I’m still using this setup a year later - you can read on at iPad+Linode: 1 Year Later

On September 19th, I said goodbye to my trusty MacBook Pro and started developing exclusively on an iPad + Linode 512. This is the surprising story of a month spent working in the cloud.

It all started when I bought my first MacBook a couple of years ago. Frustrated by the inconsistent usage of ctrl/alt/option/arrow keys to jump words and screens and lines, I searched for a new IDE. Instead, I found Vim and fell in love. This isn’t another gushing post about Vim-oh-how-I-love-you-my-sweet-darling, but it’s important to the story - as we’ll see in a moment.

Although I like to use Python and GAE for my own projects, at work we write heavyweight C++/Qt code that runs on clusters such as the 200,000 processor Jaguar machine, so most of my time is spent in Linux and a lot of it on remote systems. Typically I’d develop in MacVim locally and run my code in VMWare Fusion or remotely.

One fateful day, VMWare and OS/X conspired to trash my shared filesystem, losing several days of uncommitted code in the process. I was angry.

While dd was recovering as much as it could, I started toying with the idea of giving up on local filesystems altogether. To my surprise, it seemed possible - even plausible.

I just had to try.

The Setup

It turns out you need a little more than just an iPad and a dream, but not too much more:

  1. iPad 2 (16Gb, WiFi)
  2. Apple wireless keyboard
  3. Stilgut adjustable angle stand/case
  4. iSSH
  5. Linode 512 running Ubuntu 11.04
  6. Apple VGA adapter

Total cost: around $800 + $20 per month

I Wandered Lonely as a Cloud

I typically start my day by catching up on the bug tracker chatter, mercurial diffs and other emails with the iPad in one hand while lying on the Combinat56 sofa.

I actually hate the Mail app for this; the stupid animation when archiving posts adds unnecessary delay and the archive button is uncomfortably placed at the top of the screen. More recently I’ve been scanning mails over IMAP with a python script instead.

Next, I lazily swipe to Safari and review my tickets for the day in our web-based bug tracker then return to the keyboard and fire off a couple of emails before settling back into coding - the new four-finger swipe gestures in iOS5 have really improved my life.

But we were talking about coding, which brings us back to Vim.

Vim: My Home from Home

Perhaps the only reason this transition has been so smooth was because my favourite editor / IDE looks and feels almost exactly the same running on an iSSH console as it did running locally on my Macbook. iSSH supports xterm-256color, which means you can still have pleasant colour schemes despite working in a terminal. All my plugins are there, my code-completion, quick navigation and so on.

In short, it’s a seamless transition from my MacVim envionment. If I were developing OS/X apps with Xcode, or used Eclipse or Visual Studio regularly this change would probably have killed me.

As it happens, working in the terminal on a remote Linode is even better than working locally, thanks to the magic of GNU screen.

GNU Screen is Magic

GNU screen is like a window manager for your terminal sessions, giving you multiple tabs, searchable history, activity/idle notifications and - best of all - persistence.

So I fire up iSSH, tap on my Linode connection and reconnect to the already running screen session. All my terminal tabs are exactly where I left them. Other SSH tunnels are still set up. My cursor is still in the same position. The clipboard is as I left it. It’s as if I never left, because for my side projects, I have a different screen session with a different set of tabs and editor instances running. Perfect separation.

It’s hard to overstate how pleasant it is to be able to return to exactly the same session each day; on a MacBook there’d usually be some other distracting programs left that I’d opened in the meantime, and of course any remote connections would have been dropped. At the very least I’d have used MacVim for something else in the evenings. It might be a largely psychological benefit, but it feels as if I can drop back into flow almost as easily as I left it.

The Good, the Bad and VNC

At work we develop a graphical parallel debugger, so I can’t spend all my time in the terminal. For hands-on tests and GUI work I need X. Luckily, iSSH has a workable, if not perfect, solution:

I tap on the VNC connection and up pops the GUI in shocking 1024x768 fidelity and a painful 256-colour palette. I could have 24bit colour, but somehow I prefer the extra speed to beauty. Although it’s a far cry from using a mouse to interact with a traditional GUI program, the on-screen ‘touchpad’ works better than I’d expect. And as it happens, being limited isn’t all that bad:

One good way to evaluate the usability of a program or dialog is to… try to use the mouse with just one finger.

Joel Spolsky

iSSH’s VNC isn’t quite as bad as pushing the mouse around with one finger, but it does make you consider users with lower screen resolutions, larger font sizes and mouse control that hasn’t been honed by countless years playing Quake and Starcraft. I’d be lying if I said I hadn’t wished for bluetooth mouse support some days.

Maybe It’s a Lifestyle

Today is not one of those days. I unwrap a chocolate croissant, make a fresh cup of tea and settle down to work; a quick hg pull -u && make to start the recompile, then ctrl-x to my editor tab and carry on coding while the rebuild happens. Ctrl-X is my screen’s ‘hotkey’; it defaults to Ctrl-A but on a wireless keyboard that leaves unicode characters in the terminal - I assume this is related to Apple’s support for some common Emacs key bindings in iOS. Strange, but easy enough to work around.

After a few minutes of coding the bar at the bottom of the screen notifies me that my compile has finished; I ctrl-x back, start a sanity test suite running just to be sure nothing horrible was broken overnight then carry on coding again. Compiling on the quad-processor Linode is around twice as fast as inside VMWare on my MacBook was. It’s also completely, blissfully silent. The only sound is the raindrop-like patter of the keyboard as I work. It doesn’t even get warm, a surprisingly refreshing change from the MacBook keyboard!

I swipe to the DuckDuckGo app and look something up in the Qt APIs, then swipe back. It’s becoming second nature, but I still miss a keyboard shortcut for task switching.

After an hour or two of uninterrupted development the UK team wake up and the first instant messages arrive. Thank heaven for the iOS 5 update! I use the imo messenger app, which is fine but of course before the notification center each pushed message would interrupt whatever I was doing with a frustrating popup. Now, the new notifications center behaves much more like a growl notification would; it lets me know and it gets back out of the way again.

I finish the function I was working on then four-finger swipe to the chat app; it’s my boss reminding me about our 11am conference call.

Skype-based conference calls work fine on both the iPad and the iPhone; at least, as well as VOIP calls ever work, i.e. fine after a few false starts while someone reconfigures their linux audio drivers. I appreciate not to having to think about that any more.

During the Skype call my iSSH session timed out in the background; it’s only held for 10 minutes or so. Fortunately a single tap reconnects me, and through the magic of gnu screen I’m back at exactly the place I left off again.

As is always the case, while fixing one bug I encounter another, apparently unrelated one. Time to submit a quick bug report - in the past I took screenshots on the iPad and emailed them to our tracking system, to get around not being able to attach in Safari. Now, I’ve switched to grabbing them and any log files or stack traces with a command-line app on the Linode itself. We use the Best Practical RT tracker (for our sins), which conveniently comes with a perl script to interact with it from the command line. Doing this is actually quicker and easier than uploading via a browser used to be; one command noting the ticket number and the attachments and I’m done.

The Cloud is Always With You

Lunchtime already! I close the iPad and head off with the others. The remote rebuild I left going will still be there; no need to worry about any uploads getting interrupted, it’s all happening in on the Linode, after all.

During lunch I pull out my iPhone and connect to the Linode again; damn, the build failed early on - out of disk space on one of our office machines. The iPhone keyboard is somewhat painful to use, but for rm -rf /tmp/build-2011-* it suffices. I kick off a new build while waiting for dessert to arrive.

Now I’m feeling nicely fed and just a little dozy; to keep awake I move to a standing workstation and set off some longer-running performance tests on a remote cluster. I find I move around between a lot of different working configurations with the iPad; much more frequently than I when using a laptop. I’m not sure why; perhaps it’s something about having a separate keyboard and screen that makes it easier to find a comfortable typing position, or perhaps it’s just the novelty.

The tests will take an hour or so; I close iSSH and review the latest spec / schedule changes my colleagues have made to an upcoming spec, stored in Google Docs.

Oh, Google Docs, why do you hate me so?

In a bitterly ironic twist, the only part of working in the cloud that doesn’t work smoothly is using Google’s cloud-based MS Office replacement. The mobile word processor is a joke, frequently losing the cursor position and sizeable chunks of text. The spreadsheet version is better, but is still a pathetic experience compared to the desktop version. Of course there are no native apps, and the desktop versions of the sites simply report script errors. I’ve even thought of trying to convince my team to switch back to OpenOffice.

Maybe it works better on an Android - no, wait, that’d be anti-competitive behavior and Google would never do something evil, right?

The tests have finally finished and the results are in; I move to the lounge area and connect up to the big HD TV with the VGA cable; something about seeing console-mode VIM in giant HD makes me smile every time.

There are some oddities in the logs; I copy and paste a few snippets to a colleague and discuss them in chat. I’m glad copy and paste work smoothly, although having 3 different sets of buffers (iPad, screen, vim) does lead to confusion from time to time. Idly, I wonder if any of my colleagues have noticed I’ve been using an iPad instead of a laptop for the last month.

6pm rolls around and it’s time to head home for the day. Despite a full day’s intensive use, my iPad’s still showing 15% battery life. I never bring a charger to work and I’ve never needed one. That in itself is a taste of freedom.

At the End of the Day…

Later that evening I pull the iPad out and open up Pages to finish a blog post. The house is quiet; only the distant sounds of the city drift in from outside and mingle with the gentle patter of keypresses on this delightful wireless keyboard.

I started this experiment because I fundamentally believe that most people don’t want to rearrange windows, babysit their own general purpose computers or back up their data. Sooner or later, almost everyone will work like this and I wanted a taste of what that might feel like. I expected to find something that didn’t work, but as the days turned into weeks and the weeks gathered into a month, I found I hadn’t returned to my laptop even once.

I don’t miss the weight. I don’t miss the keyboard getting warm when I’m compiling. I don’t miss its fragility, both physically and virtually. I don’t miss running out of power. To my surprise, I find I am happy. Coding in the cloud isn’t for everybody, but for my workflow it’s a perfect fit and I love it.

After a few minutes the perfect peace is rudely disturbed by the twin jet-engine that is my MacBook fans spinning up to full power on the shelf behind me. I can’t believe I used to put up with this all day and night. 

Despite that, I leave the MacBook running - it’s doing the only thing I still need it for on a regular basis.

It’s ripping DVDs.

Update: I’m still using this setup a year later - you can read on at iPad+Linode: 1 Year Later