Dec 292009

How many times have you heard something like this?  You know the drill:

Stakeholder: “We need to fix sort order.  Let’s make sure that results we can’t show an image for are deprioritized.”

Developer: “Can do.”

Time passes.  Software is written.  Then:

Developer: “I’m finished.  The results without photos are at the end of the list.”

Stakeholder: “I don’t understand.  Why are they showing at the end of the list?  Shouldn’t they be in their usual places in the list, but greyed out, like we talked about?”

Gadzooks, we’ve fallen into that trap… AGAIN!  It’s the mother lode of assumptions:

When we agree to something, that something we’ve agreed to is the same thing for you as it is for me.

“One good analogy is worth three hours discussion.”

– James T Mccay

The problem of creating a shared concept crops up all over software development, from requirements, through testing, implementation, documentation, and on out the door into the hands (and minds) of users.  The problem pops up between stakeholders and developers, developer and other developers, between accounting and customer support and users themselves.  It’s stamped all over everything.

I won’t delve too deeply into the metaphysics of this problem, but trust me, just below the surface seethes a pit of linguistics, semiotics, ontology, questions about quantum mechanics, psychology and the nature of the mind.  Nifty stuff, if you’re philosophically inclined.

“An idea is a feat of association, and the height of it is a good metaphor.”
– Robert Frost

I’ll try to stick to the more pragmatic concerns, here, and start with the notion of a mental model.  Without thinking hard about it, make a note of the very first thing you think of when you read this word:  Apple.

Ok, which was it?  A red fruit?  The computer company?  A particular computer, perhaps the one you’re using right now?  Or was it a particular apple, the one you shared on the grade school steps after school was over with that blonde girl that you had a crush on?

You have a notion of what “apple” means.  I might have a different notion.  That notion – the set of associations, memories, ideas, and so on, we call a mental model.  It’s mental because it’s in your head, and it’s a model because it isn’t the thing itself.  So, it’s a mental construct, a mind-thing that represents some slice of the “real world”.  Without even being aware of it, we construct and use mental models all the time, to help us function in the world.  They provide us with information about how something in the world will behave.  What we can expect as we interact with it.  They’re mind tools that help us understand phenomena, make inferences, and experience events by proxy.

You might view a mental model as a graph.  I imagine it as a web of connections between some notion and a set of associated notions.  For me, apple connects to “fruit”, “red”, “an apple a day”, etc.  Apple also connects to experiences, memories, emotions, and so on.  Some of those connections are strong and some aren’t so strong.  I label this graph as the “apple” graph – my mental model of “apple”.

“The world is emblematic. Parts of speech are metaphors because the whole of nature is a metaphor of the human mind.”
–Ralph Waldo Emerson

I won’t delve too much into why our mental models differ (my “apple” isn’t the same as yours) in the first place.  Instead, I’m intrigued by the problem of how to get the models running around in different people’s heads to refer more-or-less to the same thing.  One cause of that problem is that mental models they’re transmitted across a very lossy medium – human expression via language, be it visual, spoken, etc.

Here’s where meaning comes in.  When I tell you about “apple”, I am trying to move a copy of the “apple” in my head into yours.  I do that by trying to create the same set of connections in my head into yours.  I do this by trying to convey connections between my “apple” and your “apple” by relating my “apple” and its associations to your “apple” and your associations.  That act of linking bits of experiences and thoughts and sensations and emotions (ie., models) to one another is called meaning.  When I say, “This is apple: …”, I am trying to upload a small piece of my internal representation of the universe into your mind.

Meaning is heavy stuff.  And, as it turns out, difficult to transmit using language.  Why?  Because language (words) sits one level of indirection away from the models themselves.  Follow me, here.

We have the thing itself.  We’ll stick with “apple”.  Out there, somewhere, is the apple we’re talking about.  Then, one level removed from that, are the sensory experiences associated with that apple.  (Level of indirection: 1).  Aggregated in your head is that sensory input, memories, associations, etc — the mental model of that apple.  (Indirection now 2.)  Then there is the word I slap onto that model – “apple”.  Note that the word represents the model, but isn’t the model itself.  (Indirection: 3.)  Phew.  We’re three hops from the damn piece of fruit, and just getting rolling…

Now I try to talk about the apple.  I use the word apple, and a bunch of other words that are intended to connect the dots – make the same associations for your version of “apple” as I have attached to mine.  Again, add a level of indirection.  (4.)  You aggregate into your “apple” model.  (5.)  You slap the word “apple” on that model.  (6.)

Yep.  That’s lossy.  Your copy of the “apple” model that I’ve tried to convey to you sits about 6 hops away from the thing itself.  Maybe more, I’m not sure.  And there are no checksums.

If you want to make meaning-making work for you, use this tool called storytelling.

The art of transmitting mental models – of creating meaning – is storytelling.  Narrative, if you prefer.  Storytelling is the best practices way of moving a mental model from my head into yours, because it leverages biologically and culturally preset and reinforced mental models.  Stories have a well-known structure (think of XML).  They have conventions of characters and plot.  (Think REST HTTP verbs).  They are easy to persist, which makes them effective at moving mental models.

Which brings us to metaphor.  Compress a story down to its smallest, most compact and elemental form, and you will produce a metaphor.

A metaphor is a zip’d story.  (And, yes, for those of you still paying attention, that last sentence was a metaphor itself, but probably only useful to geeks.)

“But the greatest thing by far is to have a command of metaphor. This alone cannot be imparted by another; it is the mark of genius, for to make good metaphors implies an eye for resemblances.”

– Aristotle

Which returns us to that pesky problem of “I thought you meant…”.  At our disposal lie a wide array of tools for creating shared mental models: whiteboard diagrams hung in shared spaces, mockups and wireframes, requirements docs, etc.  But if you want to be really effective, use stories and metaphors.  Be shameless in assigning names and personalities to the actors, systems, modules and machines.  Give them personalities.  Talk about what they know and like.  Get to know them as a group.

Then, invent a defining, central story.  A system metaphor captures the essence of the system in the most effective communication tool we have – the story.

“The system metaphor is a story that everyone – customers, programmers, and managers - can tell about how the system works.” 
– Kent Beck, Extreme Programming Explained, p. 179.

 

Dec 202009

 

 

 

Charlottesville Downtown Mall At Night

Charlottesville Downtown Mall At Night

As CTO, I seem to be getting the recurring question, “Can you (hotelicopter) find the tech-savvy talent you need in Charlottesville?”  It’s a valid question.  Long gone are the days of Kesmai, EA, Mr. Goodbucks, and the beloved Value America.  These days, we have influx of spooks, a smattering of biotech companies, and in the IT/Internet world… a whole buncha nothin’.

 

Usually I give a good new / bad news kind of answer to this question.  I’ll run through the good part first so we can get to the juicy bad part.

The good news is that you can do alot more cool stuff with a whole lot fewer people than you used to.  And even though we’ll be quintupling the size of the tech staff at hotelicopter, in absolute numbers, it’s still a very small number of people.  Armed with the right package of cash compensation, equity, benefits, a really cool place to work, and seriously fun stuff to work on, I’m very confident we can find the team we want.

The bad news, though, is that once we’re done cherry picking the local talent, all that’s left will be tumbleweeds.  (And bookstores and coffee shops.)

I recently had it put to me that Charlottesville stands at a crossroads.  On the one side, the ‘Ville could evolve into the next Austin.  You know, the cool Austin: vibrant arts and music scene, burgeoning tech mecca, nifty atmosphere, lots of fusion restaurants.  Sounds pretty good to me.

Or… Our beloved city could turn into Aspen.  You know, frigid Aspen.  The Aspen where private jets land to deliver out of towners and transplants to their ostentatious homes, and everyone who actually works lives… somewhere else.  Somewhere cheaper.  Like Waynesboro, Nelson County, Greene and Orange.  Let’s face it, Charlottesville’s already looking alot more like Aspen than Austin.  We have a sharp housing gap (the current downturn in home prices not withstanding), a widening income gulf, and with each passing decade, a sharp decline in local industry… of any kind.  At the current pace we’ll be left with just fancy restaurants, coffee shops and riding tack boutiques.

Aspen… Great place if you can afford it.

Dec 152009

Quick shout-out for Geokit for Ruby, which is a most excellent and useful bit of Ruby code.  Installation is a snap, it’s easy to use, and you’ll love the expressive power of little things like this:

Store.find(:all, :origin=>'100 Spear st, San Francisco, CA', :within=>10)
Dec 142009

In system design, generally I believe there’s no such thing as “premature optimization“, but life in a startup demands profound thought into exactly when we implement our optimizations.  Spending time and money up front on making things fast (and/or scalable) comes with a hefty little price tag we like to call “opportunity cost.”  We live in a world where stopping apparent forward motion for a few weeks may have deep implications on market positioning, traction / uptake, and ultimately, our ability to raise capital and execute on our strategic plan.

Partly this situation is a byproduct of having a tiny R&D team, and the ‘ole “10 pounds of shit in a 5 pound sack” problem.  With access to more resources, we could make progress on multiple fronts.  But, even if we had an army of developers, startup life throws optimization into a stark light.

Wait too long, and we piss off customers and hurt uptake.  Too soon, and we’ve missed out on implementing features that hurt uptake and also cause us to miss our window for strategic positioning.

As is often the case in the CTO’s role, if I get the answer right, no one will notice.  I’m reminded of the Tao Te Ching:

The Master doesn’t talk, he acts.
When his work is done,
the people say, “Amazing:
we did it, all by ourselves!”

Dec 132009

We’re currently investigating a spectrum of new technologies in the NoSQL realm, including Tokyo Tyrant, MongoDB, Amazon’s SDB, CouchDB, Voldemort, and more.  Tis’ a dizzying mix, and things are popping in the space.  From my point of view, they all end up relatively close to one another in terms of utility and applicability to the problems we need to solve at hotelicopter.com.  I’m waiting to see which one gains the most momentum — the sum being greater than the total parts of corporate sponsorship, commercial support, market traction, and a thriving community of developers.

Jun 272008

So like many others, I am developing iphone applications.  If it didn’t already seem perfectly clear to you that we technology people are just as lemming-like as say, commodities traders, or art collectors, well, I hate to break it to you.

Yeah, so I’ve gotten sucked into the iphone hype too.  Frankly, I can’t wait to get my hands on one, even if lil’ ole Charlottesville lags piteously behind the rest of the world with no 3G network.

I’ve been noodling about what location really means, especially in a user-pull application environment like the iphone. (I’m with the crowd that says, “Thank God iphone apps won’t run in the background – and dry out my battery in 15 minutes flat.”)

Rather than trying to come up with some New New Thing by smooshing together social networks, location and a handwave at a business model that involves trying to convince businesses to advertise “on the spot” sales to iphone users  (ummmm, nrme, anyone?)… I’m wondering instead, “What things are truly location dependent?”  I guess I mean something beyond just “Where’s the closest Starbucks?”

A few things have come to mind:

Hmmmm…. more ruminating is called for.

Jun 272008

Once upon a time, I p’shawed twitter.  “Who needs this goofy one-line blog thing?  It’s like an IM away message, only without any notion of presence… duh.”

Then for the hell of it, I signed up.  And it hit me.  “This is brilliant.  It’s like IM away status, only it’s syndicated!”

Now, I am a dishearted twitter convert.  When will our beloved twitter get its legs back under it?  Maybe their new financing will help.

Jun 102008

After the nausea-inducing trip to Myspace-customization-land, building a custom Facebook application (using Ruby on Rails and rFacebook) is a picnic.  Two and a half days to a working prototype.  Not bad.

On a incredibly geeky side note, why doesn’t IE support CSS selectors properly, even in IE7?  What year is it?

May 302008

My client needs to put up scalable and extensible social networking sites for his clients.  I need to suss out which platform is the current best of breed.  Heretofore, their choice has been Drupal, which has certainly been good enough.  I’ve half a mind to say “If it ain’t broke, don’t fix it,” but I hear anecdotal evidence that scaling Drupal is, ahem… challenging.

I’ve no experience firsthand with building Drupal sites, but the platform seems to have lots of community support, and appears to be evolving at a reasonable rate.

Questions to answer about each platform:

  • How hard is it to scale to 5E6 pageviews/month?
  • How hard is it to extend the platform?
  • Suitability of platform to CMS?
  • Suitability of platform to social networking?
  • Extensibility?
  • Ease of integration of 3rd parties; Flickr, YouTube, OpenSocial.
  • Suitability to hosting via EC2/S3.

Candidates so far include Drupal (PHP), Mephisto (Rails), SocialSpring (Rails), Joomla (PHP), OpenSocial, Typo3 (PHP),
All this begs a question for me, which probably misses the mark for my client’s clients… but… Why is anyone trying to build social networks anymore?  Don’t they realize that they should be building social networking applications, which ride on top of existing (now more-or-less open) networks?  (Eg., OpenSocial.)