jamie horgan
blog posts LATEST BLOG ENTRIES subscribesubscribe

I spend much of my time away from my office at various clients. Being able to effectively and efficiently work remotely requires a good personal infrastructure.  Here’s how I do it – YMMV.

Smartphone

It really goes without saying, but the most important tool for the road warrior is a good smartphone. Android, iPhone, Blackberry, Windows Phone, it doesn’t matter – it is a personal choice.  Personally, I love my iPhone, but I can see how some would prefer a different phone. The most important feature is that the IT group at your company supports connecting it to their email/calendaring servers. Well, actually, the most important feature is that it can get a signal when you need it, but that is mostly a function of the carrier you choose.

Notes in the cloud

I take two different kinds of notes: stuff that I need to jot down quickly (which I am usually using my iPhone to capture) and stuff like meeting notes that are more verbose and long term (which I mostly use my laptop to capture – though I usually use a Moleskine notebook to capture the notes during the meeting and transfer them to my laptop later).

For the quick notes, I use Evernote. It is a free, cloud-based note system that you can access via any browser or by using their desktop or smartphone applications. It supports tagging, folders, and searching (including images and handwriting). There is also a premium service that adds more features, but the free one works great for my needs. I use the iPhone app to jot down quick notes or, more often, take pictures such as where I parked my car in the airport or of a whiteboard after a good meeting. The photos, just like the text notes, are synchronized to the cloud and are available via any of the above mentioned means.

For meeting notes and the like, I use Microsoft Office OneNote 2010 synchronized to the OneNote Web App on Microsoft SkyDrive (free 25GB of cloud-based file storage). I can access any of my notes using a browser (and even add new notes via browser) and they are synched when I open OneNote 2010 on my laptop. 

I use an application called MobileNoter to synchronize my OneNote notes to my iPhone. The application is capable of two way syncing (i.e. you can take OneNote apps on the iPhone and sync them back to your desktop), but the experience of taking the notes on your iPhone is less than awesome, so I use it as a read-only way to access my OneNote notebooks when I don’t have my laptop available.  Evernote is way better for capturing notes on your mobile device.

Tasks in the cloud

I could create a whole post on task management alone, but suffice it to say, you need an effective way to manage tasks on the go.  I have tried a bunch of solutions (including perennial favorites OmniTask and Things) and the hands down winner for me is Remember The Milk.  RTM is a cloud-based solution that you access via any browser or through one of their smartphone applications.  They have a free version that permits syncing your mobile device to the cloud once a day, but I find the pro version well worth the $25 a year to enable unlimited auto synching between your mobile device and the cloud as well as push notifications to your mobile device.

Rather than forcing you to manage your tasks a particular way, RTM allows you to organize the way you want to through a combination of priorities, locations, lists, tags, and rules-driven smart lists.  Whether you are a hard-core GTD’er or just want a simple to-do list, RTM adapts to your workflow.

Important documents in the cloud

There are two different ways to think about cloud-based document storage: keeping your documents in the cloud, and synchronizing your local files to the cloud. The first method requires you to have access to the cloud to retrieve your documents, the other keeps the local copy of a file on your computer synchronized to the cloud and any other devices you sync to the cloud.  What this means is if you make a change to a document on your home computer, that change is automatically saved on your office computer or mobile device.

There are many free services that enable both scenarios. I personally use Microsoft’s free 25GB (!) of cloud based storage called SkyDrive to store files I want to be able to access, but not take a bunch of precious space on my local hard drive – eBooks fit into this category.  I use Microsoft’s LiveMesh which lets me synchronize 5GB of files between multiple computers and the cloud and Dropbox which lets me do the same with an additional 2GB of files (you can pay for more space).

Why both LiveMesh and Dropbox?  Well, besides the obvious 7GB vs just 5GB, LiveMesh doesn’t support the iPhone and Dropbox does. So, if I need to get a file from my computer to my iPhone or vice versa, I use Dropbox rather than the caveman practice of emailing it to myself.

My recommendation is to only synchronize documents you are currently working on (for example, I synchronize my blog post drafts and presentations I am working on for my clients) and periodically, move older documents from your synchronization folder to either the recycle bin if no longer needed or to cloud-based storage if you want to still have access to them.  Also, I recommend creating only a few top level synchronization folders (I only have two: work and personal, each with as many levels of folders as I see fit).  This lets me only sync my work folder on my work machine if I wish and keep all my personal documents off – I can still access them by browser if I really need to.

Internet access anywhere

While there may be a Starbucks or Panera Bread providing free wifi around every corner, sometimes you need internet access in a board room for a client that does not provide guest wireless access or permit you to plug into their corporate network.  For those times, you need to be your own internet access point.  Most smartphones and carriers offer an option (usually at additional cost) to at the very least tether your phone to use its 3G or 4G network on your laptop.  Other smartphones and carriers even let you use your phone as a wireless access point for everyone in the room to share.  If you can’t or don’t want to use a service tied to your phone, there are several other options to achieve the same effect.

Be warned, though, you may not be able to get the connectivity your smartphone needs if you are in the middle of a skyscraper or underground, for example.  Which leads me to…

Plan B

Always have a Plan B.  And, if it is important enough, a Plan C.  Giving a PowerPoint presentation?  Have a backup of the file on a thumb drive in both PowerPoint and PDF formats.  If it is critical, have printed copies as well in case the projector goes out.

Demonstrating something that cannot be demonstrated via screen shots?  Record a screencast of your practice sessions so you can play that back as a Plan B.  My favorite tool for this is Camtasia Studios, but there are other tools out there that are free.

Your bag of tricks

Finally, while you want to minimize the weight of everything you are carrying around with you, there are some items that are worth their weight in gold when you need them such as:

  • Swiss Army Knife (except when you are travelling via airplane)
  • Extra batteries for your wireless mouse
  • Several thumb drives (you really should have at least three)
  • An external USB hard drive
  • A pocket sized, un-ruled Moleskine notebook
  • Smartphone charger cable
  • Emergency battery for your smartphone

The title of this post is my favorite quote from Leonardo DaVinci and I use it all the time in design sessions and code reviews. We all know developers and architects who think complex solutions or bits of code are badges of honor to be strived for.  But, the more complex a system is, the more opportunities for failure there are.  Also, a simple solution is far easier to maintain and bring new people up to speed on how it works.

A small percentage of these people design and implement complex systems as a job security strategy – “if I am the only person who can figure this out, then they have to keep me around” goes their logic.  I don’t have time for people like this.  You don’t have a professional attitude, so stop pretending to be a professional; see if the comic shop is hiring.  I hate to tell you (well, not really), but someone realizes the grip you have on the company and is developing plans to get rid of you.  You might last a few more months, perhaps even longer, but eventually, you will be gone.  As with all things in business, your value is not in what you have done in the past, but what you can do in the future.  If you designed easy to maintain solutions in the past, you are likely to do so in the future and, therefore, will be kept around.  If you inject a dependency on yourself into the solution design, you are likely to do so again in the future, and therefore are a target for elimination.

Another archetype with less nefarious motives, feels that complex system design or cryptic code structures, showcases their intelligence or creativity.  You want to impress an executive?  Get on a whiteboard and explain your proposed solution and have him or her “get it”.  If you can explain your solution on the back of a napkin or during an elevator ride (and it, you know, actually solves the problem), you will be a hero.

But, the vast majority of people, just don’t know how to design for simplicity.  Simple doesn’t mean easy.  In fact, it is very hard to come up with a simple solution to complex problems.  Elegant probably captures the desired state better than simple.  In many respects, you can’t teach someone how to design elegant software solutions; you have to have a natural talent for it.  But, if you have the right stuff, there are some rules that can help you design more elegant solutions…

Single Responsibility Principle: Do one thing and do it well.

Design your solution (and your code) so that each component only does one thing – don’t make your floor wax a desert topping as well.

Design only for the functionality needed now.

Resist the urge to gold plate your solution by introducing functionality not specifically required for this implementation.  I know you think adding a left handed widget feature to your solution is of immense value to the business, but if it isn’t specifically needed, don’t add to the technical debt by adding it to your solution until it is needed.  Remember: YAGNI (You Ain’t Gonna Need It).

But Sometimes YADNI (You Actually Do Need It)…

Ok, so, it turns out, you are smarter than everyone else where you work and you know they really do need a left handed widget feature.  What to do?

Still don’t implement it.  That’s what.  If you are applying agile principles to your solution design and your code base, you will be able to easily add this functionality once the mere mortals in the business catch up to your obviously superior insight and realize, by golly, they need a left handed widget feature.  The fact that you coded to an abstract interface rather than a concrete class, for example, will reap immediate benefits when it is time for 2.0.

Don’t Design By Committee

This video says it all…

It is not necessary to change.  Survival is not mandatory.

I love this quote by W. Edwards Demming.  Read it again and absorb its Zen-like awesomeness.  Don’t get married to your solution or code-base.  Refactor.  Refactor. Refactor.  And, then, refactor again.  This is why it is extremely important to have a good test suite (unit, functional, and integration) built as part of your solution.  You need to make sure the major change to your solution that you wish to make will not break any other part of your solution.  Without a good test suite you introduce risk with each refactoring.  And, with tools like Resharper and Refactor! Pro (my personal preference – in tandem with its sister product CodeRush) available, you really have no excuse not to keep that code base tidy and intuitive.

Stay DRY, my friends.

While The Most Interesting Man In The World would have you stay thirsty, I suggest you stay DRY (Don’t Repeat Yourself) when implementing your solution.  If you have two lines of code or two subsystems that do the same thing, you have gone down the wrong path.  Copy and Paste inheritance (yeah, there actually is a Wikipedia entry for this), is not a good way to build out your solution.  This one should be obvious in concept, but it is super easy to fall into the trap for even the most senior developers and architects.

I hadn’t really taken blogging seriously since I started in 2007, though I wanted to want to.  I figured a good way for me to get some skin in the game was to write my own blog engine. 

I had been running my blog on BlogEngine.NET which is a good blog engine, but, it is always fun to have a side project you can do just for yourself and then there was this: I design and build custom software solutions for a living!  How could I expect my clients to trust hundreds of millions of dollars of revenue to rely on code I wrote if I don’t even trust my own blog posts to code I write?

Firefly
I branded and versioned it so I treat it like a product, but it isn’t for sale and is not an open source project (if you want an excellent open source blog engine, check out WordPress).

I am taking a huge step backwards with regard to functionality by deploying this engine.  For example, I am going live without even a capability to search my posts.  I also don’t have a tag cloud and my visual styling isn’t exactly where I want it to be.  But, I am delivering.

More to come…

Articulating a proposed interface through a wireframe representation as opposed to a prototype has many advantages.  Chief among them, in my experience, is that the client can concentrate on the actual interaction and layout of information rather than getting hung up on the color or font scheme that they don't like.

I have tried many approaches to creating wireframes and have found that the more polished it looks, the less effective it is as a tool to get to the best design.  Your goal in wireframing should be to interactively flesh out a desired interaction design, not to produce a specification. 

There are many software options for producing wireframes.  One popular (and free) option is Gliffy.  Here is an example wireframe from their website:

This looks like a specification to me.  It clearly isn't the final product so that makes it way better than an HTML mockup, but it looks like someone spent a lot of time putting it together so, while one would be encouraged to make tweaks, one would be reticent to start making wholesale changes to the design.

That’s why I usually do interaction design using a whiteboard with a digital camera, or a Tablet PC, or the back of a napkin and a scanner.  The sketches look like ideas, not specifications.  Sketches invite discussion and re-sketching.  The problem for me with this approach has always been that I suck at drawing.

Enter Balsamiq.  This program makes my sketches suck less.  At its core, that’s what this application is: a sketching program.  It has ~75 pre-drawn sketch widgets such as grid views, combo boxes, browser interfaces, even iPhone elements, which you drag and drop, resize, move around, and configure much like you might a Visio stencil.  These are smart widgets, mind you.  For example, if I drag the breadcrumb widget on to my design surface, all I need to do is change the text and separate the different levels of the bread crumbs with commas (as in Home, Music, Genre, Artist) and it will render the bread crumbs appropriately.  Here is a mockup I did in Balsamiq of the above wireframe from Gliffy's site:


(click to enlarge)

To me, this says "Hey, this is just an idea.  Let's make it better if we can."  In fact, it said that so loud to me that I couldn't resist making it better:


(click to enlarge)

This isn't to demonstrate my mad skills as an interaction designer, rather it is to drive home the point that a good wireframe should be a means to get to the essence of the desired interaction.  It should facilitate the iterative design process, not inhibit it.

Balsamiq is the sort of program that you are going to either love or find zero value in.  Personally, I love it.  Some minor suggestions for improvement:

  • Ink support for pen-enabled computers.  Using this software on my Tablet PC or UMPC should give me more features (especially for a sketching program), but is actually a less pleasant experience because everything has to be typed in using a keyboard.  The ability to at the very least, markup a sketch using ink would be welcomed.  More advanced ink-enabled features would be even better (see MindJet's MindManager ink features for inspiration).
  • It would be nice to be able to resize any element using absolute sizes typed in rather than having to resize everything visually using mouse drags. If you could select multiple items and resize them all at the same time by typing in the height and width only once, that would be even better.
  • Using ctrl-g to group is a nice feature, but it would also be nice if right-clicking on multiple selected objects gave you a context menu that let you group them.
  • When adding a control via quick search (pressing / and typing the control name), it would be nice if the control just added received the focus so I could just hit enter to change the text instead of clicking on it and then hitting enter.
  • You can export parts of sketches and import them into other sketches, but it all seems a bit unpolished.  With a little more love, I would suspect this capability could be a much better experience.  Perhaps we could create libraries of controls and incorporate them into the existing library of widgets.
Again, however, this program is awesome!  Go check it out.

I am not normally inclined to perform a drive-by fisking of another person's solution design, but I just had such a horrible user experience with an IVR system that it stirred me to write this post.  I won't mention the name of offending system other than to say it was a government system.

It started out with the normal "For English press 1", and followed that with "For Spanish press 2" (not "para español…") so I guess if you didn't understand any English, you were on your own.  Fair enough, but I would think telling the English speaking audience to press one in English followed by telling the Spanish speaking audience to press two in Spanish would be the desired interaction design.

Then, it got ugly.  I was told to find the 12 digit number located in the third line in the upper right side of my invoice.  "Find the third digit of the number.  If that number is one, press one.  For four, press two, for seven, press three. "  What???  Wait.  Ok, I have a four in the third position, so that means I press two?  Shouldn't I just press, you know, four?!!

Next up: "Find the fifth and sixth digits.  If 23, press one.  For 47, press two.  51, press three.  63, press four.  81, press five.  Press the pound sign when complete."

<laughs out loud>

Seriously?  Where to start?  First of all,  I could just enter the fifth and sixth digits rather than some crazy mapping of 1=23, 2=47....  But, all of the fifth digits were unique, so why even bother with the sixth?   Why even bother having a second step?  Couldn't we just enter the first 6 digits of the number instead of the third digit followed by another step to enter the fifth and sixth?  Better yet, make the important digits the first three, and only enter the first three?  And, what's with the "press the pound sign when complete"?  I guess non-geeks are starting to get that geeks call the "number sign" the "pound sign", but not everyone knows it as such (what if some poor bloke from London called and couldn't find the pound sterling symbol on his phone and overlooked his "hash key").  And, more to the point, why do I need to press anything to tell the IVR system that I just entered a number?  It heard it, right?  Wait!  Why didn't I have to press it in the first step, but I have to in this step???

This is a classic example of modeling the user experience around the technical model of the solution instead of a conceptual model abstraction.  The user interaction of any system (IVR, web site, telephone, alarm clock, sprinkler system...) should be modeled to the human, not the technical implementation.

The root of the problem in this IVR example is that someone instituted an Intelligent Key paradigm where 23 in the fifth and sixth digits means something to someone.  The problem with Intelligent Key paradigms is that they never contain all the information someone needs to act on something.  Eventually, they have to retrieve additional information from a database.

All of this is a long way of saying that a much better user experience would be to just have me enter the entire number and pull all the information the IVR system needs to know to properly route my call from the database.  Also, use a much shorter number (12 digits is crazy - your trillionth customer would be the first person to break the uniqueness factor).  How about starting with "1" and incrementing by one for each new customer?  Crazy, I know.

And, wouldn't you know it: once I finally spoke to a human, the first thing they asked me was to tell them the 12 digit code from my invoice.  <sigh>

twitterTWEETS
Loading...

contactCONTACT
Need someone to build your IT team? Have a project that needs architecting? Review my resume and contact me:
(832) 497-JAMIE
5264

Firefly

Luke made his own lightsaber. Brian May built his own guitar. Tolkien invented his own language(s). The least I could do was to develop my own blog engine - seeing as that's what I do for a living and all.

Firefly is not for sale, and it is not an Open Source project (you should get WordPress if you want a good open source blog engine). I developed it because I thought it was about time I applied my talents to my own benefit rather than using someone else's Intellectual Property to run my site. I branded it because "Firefly" sounds better than "the code that runs Jamie's site" and besides, that firefly is kind of cute, don't you think? My daughter loves it, which is more than good enough for me.

Its core technologies are: the ASP.NET MVC framework, SQL Server, and the Microsoft Entity Framework.

Current release: 0.9.1 (Beta)