David Allen’s 2002 book ‘Getting Things Done‘ (GTD) certainly struck a chord with programmer types.

Unfortunately the classic GTD system espoused by Allen seems to fall apart over time. The biggest culprit for me was an ever growing ‘Someday / Maybe’ list – the list of things you plan to complete in the future but not immediately.

Initially this is great, as it gets certain items out of your main todo list, allowing you to focus on what matters today. A few months down the line though don’t be surprised if your ‘Someday / Maybe’ list is scaling over a hundred items.

Why is this an issue? A core principle of the classic GTD system is the Weekly Review – a blocked-off time each week where you go through your GTD lists, including Someday/Maybe, reviewing and moving items as appropriate, but who wants to scan a list of 100+ items every week?

Despite this shortcoming I soldiered on for years with GTD – but skipped the ‘Someday / Maybe’ check  from the Weekly Review.

So stuff was Getting Done but I was left with a gnawing feeling that my system was broken.

Fortunately in 2010 I came across another productivity book, which acknowledges some of the successes of Allen’s system but adds its own twists to overcome the main issues.

That book was the rather bombastically titled  ‘Master Your Workday Now!‘ by Michael Linenberger. It shares the same ‘capture everything’ and weekly review ethos of classic GTD but after 5 years use it hasn’t let me down.

In Linenberger’s system, the ‘inbox’ and ‘next action’ list of classic GTD are replaced by an ‘Opportunity Now‘ list. This should be reviewed daily and contain a maximum of around 20 items that you plan to/could complete within the next week.

Where do there other items go? That’s the magic part – more detail can be found in his book, but essentially you have Weekly, Monthly, Quarterly, Biannual and Annual lists.

So, for example, if you plan to ‘Research Pensions’ but not until next month, it would get shoved in the ‘Monthly’ pile.

Each of these timed lists gets reviewed as appropriate, i.e. the Weekly list gets reviewed every week, the Monthly list every month, and so on. I recommend setting up calendar reminders for this.

Essentially you are managing the dreaded ‘Someday / Maybe’ pile, but with a semblance of priority so that the lists don’t overwhelm.

When reviewing timed lists you go through each item and ask yourself am I happy for this to remain here? i.e. review again in a week, or move it to a lower priority (e.g. Monthly) or higher (e.g. to the ‘Opportunity Now’ list).

The beauty of this system is that it is clear when you have too much on one plate, e.g. if the number of items in the Weekly list is creeping up to one hundred items it’s a good indication that the list needs pruning during its next review by pushing things down to Monthly or Quarterly as appropriate.

That said I usually try to limit the “size” of the jump a task makes between lists to one, e.g. from Weekly to Monthly is OK, but not Weekly to Quarterly. I do this to mitigate the chances of something that might be important being moved too far out on a whim.

For example during a review of the Weekly list I might be coming off the back of a bad Javascript day, so learning that new framework might be hard to stomach and I may out of malice push it too far back, perhaps to the Biannual review pile, despite it being The New Hotness.  By limiting the jump to the Monthly pile instead it reduces the amount of time before it is review again – if I still feel the same way in a month then I’ll bump it down the Quarterly pile.

Tasks that manage to percolate all the way down  to the Annual pile, checked just once a year, have a strong chance of simply being deleted when reviewed.

I’ve used this system for around five years now and find it far superior to the traditional GTD system. It’s well worth a try, particularly if you have stumbled with Allen’s approach.

Using the ‘after_party’ gem with Capistrano 3

One of my long-term client projects involves frequent data migrations (as opposed to the classical schema migrations one typically runs).

Up until recently I’ve been creating standalone rake tasks to perform the data migrations and executing them manually when deploying to Staging and Production.

Of course, the dangerous word in the above paragraph is ‘manually’.

This isn’t too much of an issue for Staging as I’m coming fresh from developing the rake task and it at the forefront of my mind. No, the real danger is that by the time Staging gets shunted over to Production I’ll invariably  forget to run the data migration, regardless of however lurid the colour I mark the task with  in a Trello label.

Enter the ‘after_party’ gem by Steve Mitchell.

With this fantastic gem I still get to write the migrations as tried and tested rake tasks, but these tasks are registered in a ‘task_records’ table, similar to schema migrations when executed, so they are only launched once.

The only issue I’ve had is integrating it with Capistrano 3. For those with similar struggles below is how my config/deploy.rb file is setup.

namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      execute :touch, release_path.join('tmp/restart.txt')

  after :publishing, :restart

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, 'after_party:run'

My Daily Routine as a Remote Freelance Developer

Since 2007 I’ve been living my personal Holy Grail – that of a freelance developer working remotely from home.

This, like most worthwhile things in life, has taken a large dollop of discipline, reliable broadband and at least one pair of decent pyjamas.

Over the years I’ve honed my Mon-Fri routine to the following :

06:00-07:30 – Get up and start working immediately on my “side-project”.

I find doing this non-client work a great way to prevent the inevitable build up of resentment that comes from always working for other people.

It also edges me closer to a very long term goal of living off the profits of my side-projects whilst sharpening the saw as I use these projects to experiment with things outside my comfort zone.

07:30-08:30 – Shower and breakfast.

Probably not a good time to multitask.

After breakfast with the family we’ll usually watch a tiny bit of TV together before they set off for school, largely so we know that they are (a) appropriately dressed and (b) locatable at a moments notice.

Time permitting I’ll do a quick “Morning Surf” of RSS feeds and Hacker News, with the longer reads shunted off to Pocket for when I have more time, finishing up with a quick scan of my Inbox for anything urgent and important.

08:30-10:00 – Work Block 1/4

Here is where the “real” working day starts. I work 6 billable hours per working day divided into 4 blocks of 90m. This is the first block.

Normally i’ve got a good idea of what needs to be done as a lot of my work is for regular clients, but if it’s a new client and a short project this first block is usually the boring setup of a local copy of their environment, getting access to code, etc.

During a ‘block’ I’m totally focused on the client’s project – I turn off all notifications except email messages from the current client via judicious use of’s VIP settings,

10:00-10:30 – Reading Break

A small break from client work spent reading programming/business type books.

It’s been a long time since I read any fiction but it’s something I’m looking at getting back into.

10:30-12:00 – Work Block 2/4

Probably my “peak performance” block due to my usual morning influx of caffeine. One day I’ll prove that time undoubtedly speeds up during this interval.

12:00-12:30 – Lunch with my wife.

Highlight of the day – a  peaceful, at least during term-time,  half-hour catching up with my better half.

12:30-14:00 – Work Block 3/4

It’s all downhill from here. In a good way.

14:00-14:30 – Rubbing Virtual Shoulders

30 minutes of watching screencasts, YouTube programming videos, etc.  away from my regular desk.

One thing that petrifies me about remote work is that of of slowly becoming obsolete – and worse still, would I even know?

Catching up with the latest conference talks and technical trends makes me feel part of the community. In the absence of rubbing shoulders daily with other developers in an office this is a vital part of my day.

14:30-16:00 – Work Block 4/4

The home stretch, the final 90m client block of the day.

The last 20 minutes or so will be spent constructing an email to the client summarising the day’s events / next actions, although this is sometimes not required for regular clients who know to check up on Basecamp/Trello to track progress.

16:00-17:00 – Shutdown Tasks

Client work is over, so now I start on my time boxed  “Shutdown Tasks” to cleanly bring closure to the day. Currently these are :

  • log Invoice data for work done today
  • clear Inbox to Zero
  • plan tomorrow
  • scan personal To Do list for Tasks / Do Anything Urgent
  • check Job Boards for Remote Work opportunities (fortunately I haven’t had to do this for quite a while as I’ve been living off referral / repeat work, but this was a time-sink, and took up the majority of this shutdown task time)
  • if time left, work on some small To Do items

After 5pm I’ll generally not use a computer again unless absolutely necessary until the morning, and try to focus on relaxing/spending time with my family. This can cause pangs of guilt that I should be doing something more “productive” but Planet Burnout is not somewhere I like to visit too often.

So there you have it. I’m sure it seems highly regimented to some people, and the ‘free’ in freelance might be somewhat lost along the way, but I find the rhythm of the 90m blocks followed by a 30m break suits my energy levels well.

One obvious improvement would be the consistent introduction of exercise and/or getting out of the house on week days. I’m still searching for the best approach here – I’ve tried many methods but none have stuck, so I’m mindful that I’m currently a few tweaks away from an ideal schedule.

Anyway, I’m overly curious about other people’s routines, so would love to hear about your system, especially if you are a fellow remote worker.

git svn clone/fetch yet no files? This might help…

I’ve just spent some time wondering why a “git svn clone <repo>” followed by a “git svn fetch” was producing no files in the target folder.

This was puzzling, as the Subversion repository was upto version 423, and poking through the .git metadata I could see that the version information and URL of the SVN repo was all present and correct, but yet it would stubbornly refuse to pull down any files, merely presenting the following message :

Initialized empty Git repository in /Users/martin/src/projectname/.git/

Long story short – this particular repository had a non-standard layout where there was no trunk subfolder, so adding the -T option to specify the trunk location as the root like so :

git svn clone svn+ssh:// -T

did the trick and the files started flowing again.

XCode Project Template bug on Snow Leopard

After a gap of almost six years I’ve been grabbed by the sudden urge to start doing some Cocoa development again.

Rather than get my old battered copy of Hillegass’ seminal Cocoa Programming for Mac OS X out of some long forgotten cupboard I’ve been refreshing my fading memory by reading the new Cocoa Programming title from the Pragmatic bookshelf, which, although still in Beta, is so far a nice breezy ride (back) into the world of Mac development, and more importantly for me these days, is available as a downloadable PDF – unlike the Hillegass title (sort it out, man!)

Everything was going well until I hit a chapter that claimed that I should have an application delegate class automatically created when starting a new vanilla ‘Cocoa Application’ project.

I didn’t.

Fighting my ‘this is obviously a Beta book problem’ mentality, I slowly discovered that my XCode installation is doing very strange things, even after totally wiping out my current installation and replacing it with the latest download from the Apple site (v3.2.1) creating a new basic ‘Cocoa Application’ would not give me the delegate files (and instead of the newer Xib Interface Builder format, I had the older style Nib format).

Very strange indeed.

Digging deeper into the mysterious world of XCode templates (i.e. poking randomly around the contents of /Developer/Library/Xcode/Project Templates) I discovered that yes, my Cocoa Application template folder, which is used as the basis of new projects, looked a bit suspect :

drwxrwxr-x   9 root   admin         306 May 18  2009 Cocoa Application
drwxrwxr-x   9 root   admin         306 May 18  2009 Cocoa Document-based Application
drwxrwxr-x   4 root   admin         136 Sep 24  2007 CocoaApp.xcodeproj
-rw-rw-r--   1 root   admin         157 Sep 24  2007 CocoaApp_Prefix.pch
drwxrwxr-x  10 root   admin         340 May 18  2009 Core Data Application
drwxrwxr-x  11 root   admin         374 May 18  2009 Core Data Application with Spotlight Importer
drwxrwxr-x  10 root   admin         340 May 18  2009 Core Data Document-based Application
drwxrwxr-x  11 root   admin         374 May 18  2009 Core Data Document-based Application with Spotlight Importer
drwxrwxr-x   4 root   admin         136 Sep 24  2007 English.lproj
-rw-rw-r--   1 root   admin         849 Sep 24  2007 Info.plist
-rw-rw-r--   1 root   admin         596 May 18  2009 TemplateChooser.plist
-rw-rw-r--   1 root   admin         263 Sep 24  2007 main.m

i.e. what the blazes are those “Core Data…” folders doing there? They are Project Templates in their own right and shouldn’t be within this folder.

Throwing caution to the wind (well, backing up the folder first) I pruned out these folders, plus the “Cocoa Document-based Application one” and the “TemplateChoose.plist” for good measure. Leaving it looking like :

drwxrwxr-x   9 root     admin         306 May 18  2009 Cocoa Application
drwxrwxr-x   4 root     admin         136 Sep 24  2007 CocoaApp.xcodeproj
-rw-rw-r--   1 root     admin         157 Sep 24  2007 CocoaApp_Prefix.pch
drwxrwxr-x   4 root     admin         136 Sep 24  2007 English.lproj
-rw-rw-r--   1 root     admin         849 Sep 24  2007 Info.plist
-rw-rw-r--   1 root     admin         263 Sep 24  2007 main.m

and all seems well within the XCode world again.

I’m afraid I have no idea what could have caused this, and the only other reference I can find to the problem is here which ties up exactly to what I was seeing, and proves it’s not an isolated incident.

Interested to learn if anybody has had a similar problem, and what the possible cause(s) are as I’m sure if it affected all Snow Leopard / XCode developers it would be more widely known about.

Old App Traffic Spike


Many moons ago (well, late 2006) I wrote my first Rails application, a dinky little GTD app named ZenLists.

Now, I haven’t given the app much though for the last eighteen months, and the shocking confession is I don’t even us it myself anymore (I’m currently using a dazzling array of windows instead which I may cover in a future post) so I was surprised when casually browsing my site stats to see that there’s been a large traffic spike and a surprising number of registration e-mails coming my way.

That got me thinking either I’ve been spammed or some web design guru has put me on a list of ‘when CSS designs go bad’ type list as the interface is pretty crude, even by 2006 standards, but no, it looks like the app has been briefly mentioned in a list from Mashable of GTD apps.

That got me thinking, I really should do what the Cool Kids do and stick the code up on GitHub or something, as there’s the kernel of a half-decent application there, even if the code is a bit crufty by modern Rails standards.

Hmm…maybe I should also open-source the ‘DigiGuide for Mac’ clone I developed whilst watching the Superbowl about 5 (!) years ago. I just dusted it down in XCode and I’m amazed to see it actually still works! OK, it doesn’t do much apart from download TV data and allow you see select a channel and see what’s on, but again, it could be the basis of a very useful app without too much effort.

Crumbs, makes me wonder how many unreleased apps are lying dormant on geek hard drives around the world, that with a little brush of the TLC wand, might be of use to someone.

Ioncube for Rails?

Having just completed my first mISV product, I’m already starting to think about potential new projects.

Despite Datafeed Studio being written in PHP, it is fair to say it is not my programming language of choice.

Datafeed Studio is a web application that is installed by the end user on their server, thus it made sense to go for for the language that has the biggest support amongst web hosting services.

Of course, now that mod_rails / Passenger has been released, hopefully it wont be too long before Ruby does some catching up in the widespread availability and ease of deployment stakes. I understand that major web hosting providers such as Dreamhost are already offering support.

The second reason I chose PHP is to do with script protection. There are several PHP solutions out there to encode scripts to prevent piracy such as Zend Guard, Code Lock and IonCube (I opted for the latter) but seemingly none for the Ruby world?

My previous Rails projects have been SAAS based so I’ve never had to worry about this – but I have a mISV idea that like Datafeed Studio, would require the customer to install the software on their server, but the lack of script encoding / protection does unfortunately put me off using Rails in this instance.

Has anybody else been in this position? What did you do? Am I worrying too much about piracy concerns?

A New Micro-ISV Is Born

Well, I’ve only gone and done it, folks.

I’ve finally become a bona fide Micro-ISV (mISV).

Today marks the launch of my first product, Datafeed Studio – a web application that allows affiliate marketeers to create price comparison sites, niche online stores and product compare pages from CSV datafeed files provided by online merchants.

Running my own business has always been a dream of mine, I’d like to take this opportunity to thank those people who have inspired me to take the leap from the lucrative world of contracting into the far riskier realms of being a one-man product making machine.

First and foremost I’d like to thank my wife and two young ones for their support and understanding this year as I’ve been developing Datafeed Studio.

Other influences include :

  1. Bob Walsh – perhaps the voice for the mISV community. Micro-ISV : From Vision to Reality
    is still the mISV bible – I guess now I better start reading this in earnest.
  2. Eric Sink – author of another mISV classic.
  3. Steve Pavlina – former shareware author and now a personal development guru, always challenging, always inspiring.
  4. Business of Software forum. Maybe I can stop lurking now that I’ve earned my stripes and got myself a product? :-)
  5. Joel Spolsky – great musings on software development, and for FogBUGZ, which I’ve only just started using but it looks like it could save me a lot of headaches.
  6. Andy Brice – fellow Brit and a great contributor to the mISV community. Thanks for the software and marketing tips on your blog, Andy.

So – what’s the plan from here on in?

Well, much as I’d love to make a full-time income from my product, I don’t think that’s viable just yet.

By the end of this year I’d like Datafeed Studio to make 20% of my monthly income (the other 80% coming from freelance web application gigs (Ruby/Rails, PHP, etc.), which, yes, I am still available for if anyone is interested in working with a reliable, hard-working developer type).

I am to increase this percentage by 20% each year, so in five years all my income is from my own products. Well, that’s the dream anyway. Only time will tell…

freelance web developer based in Cardiff, UK