11
Dec
2009

Apple vs. Lean Startups

apple_vs_leanRecently, Andrew Chen has been mulling over the differences between Apple’s approach to product design and (a) the typical corporate approach and (b) the “lean startups” approach. In a recent post, he proposed the idea of a “minimal desirable product” to try to blend Apple’s approach and the lean startups approach.

I kind of agree with him, but his formulation makes my head hurt.

Apple’s design strategy is to work behind closed doors to build kick ass products that blow you away. They make design choices (like killing sub-par projects) that would make other companies cringe. By working behind closed doors, they are counting on their own design and vision instead of letting the market do the design. Sometimes, they succeed (iPhone) and sometimes they fail (AppleTV so far). When they get it right, they build stuff that is so desirable that people cannot believe their eyes.

The lean startups approach is to build the minimal thing that can possibly sell, get it out there, and then to iterate quickly. The lean startups philosophy says that no central planner can ever outsmart the market, so it’s dangerous to try to design behind closed doors. Instead of wasting time trying to build the perfect product, lean startups get it out there quickly and spend their time listening to the market and iterating.

Both approaches make sense. And it makes sense to ask what one approach might learn from the other. However, the middle ground between Apple’s approach of building the “most desirable product” and the lean startups approach of building a “minimal product” is not to build a “minimal desirable product.” That formulation doesn’t even make sense. So I should only somewhat kick ass? Or minimally kick ass? Could the iPhone have been “desirable” without animation? Probably. Would it have been as successful? Probably not.

Why is “minimal” important?

Building minimal products is important because product teams are notoriously bad at building good products.

Featuritis: Given more resources, a team will typically add more features instead of polishing the features they already have, on the theory that more features = more market share. “Hey! We have more time so let’s make our microwave play CDs. People like to listen to music while cooking, right?”

Listening to customers is hard: You must listen to your customers to understand what their problems are, but you absolutely cannot trust them to tell you how to design a solution for it. They’ll tell you that your product should automatically scan their inbox, and when you build exactly what they told you to build, they’ll hate it.

Killer features are counterintuitive: When we were working on Dreamweaver, we got some things really right and some things really wrong. Round trip HTML was really important. Layout Table view wasn’t popular, and we spent a lot of time on it. It’s really hard to distinguish between killer features and phantom killer features that look good on paper but don’t end up being killer features after all.

You may have the wrong market in mind: When doing design in a closed room, you have a specific market in mind. Meanwhile, your product idea may be best suited to a slightly different market. Spending months and months refining and adding to a product with the first market hypothesis in mind may actually put you behind the eight ball in pivoting to your actual market.

Minimal products means quicker iteration: This is an obvious statement, but this is one of the most important benefits of building a minimal product. Large products with lots of features are like battleships, and while there is a time and place for battleships, they are hard to steer. Smaller, more nimble products may outrun you.

Why is “minimal” dangerous?

Starting with a minimal product and iterating have a lot of advantages, but this approach also has a few disadvantages.

The MVP -> iterate process may not lead to joy: When you play with a well designed product, you are filled with a sense of joy. The whole mindset around minimal+iterate may lead to that sense of joy, but more likely than not, it leads to prioritizing function over design. Capability over joy.

Minimal products may not be a good test of the market: Sometimes, doing something minimal is the best way to dip your toe into a market. And sometimes, you may get a false negative because the thing you build “minimally” tells you that the market isn’t there.

You may end up cutting corners you wish you hadn’t Best summarized here.

Proper minimal design: Build half a product, not a half-assed product

This advice, of course, is from 37 Signals. It seems like just yesterday that these guys were the supposed gurus on building great products and now it’s other people who are the gurus. We should take everyone’s advice with a grain of salt, of course, but in this case, I think the 37 Signals guys have it right.

Focusing on design is not right for every lean startup. It really depends on the market you’re going after and the problem you’re trying to solve. But if you do need to focus on design, then I think it’s even more important to focus on the core essence of what you have and discard everything else. Be ruthless in cutting functionality to boil your product down to its core essence (no cut and paste in iPhone, right?) but then hone and polish and rethink the crap out what’s left until it elicits joy. And then follow the lean startup model to find customer fit.

Making a small product is hard (“I would have written less if I had more time”) but polishing a small product is easier than polishing a big product with a bunch of extraneous features. And when you get it right, you will have a thing of beauty.

11
Dec
2009

State of the design economy?

Mike and I have had our heads down for most of the year working on our next project (which we are INCREDIBLY excited about, but not yet ready to talk about publicly).

We’re at the point where we need design help, and we need help with everything: branding / identity, usability / UX, CSS / HTML production, etc. As a side effect of looking for great designers, we’ve gotten an interesting look into the state of the design economy.

For UX and identity, we started by looking for the designers we really want to work with (mostly high end) and going down the list. These guys are busy! Every firm we’ve contacted is working at capacity, and if anything, they are looking to staff up in order to deal with the workload. Even though that makes our job harder, I like the fact that these guys are busy.

For CSS / HTML production, we went the opposite route. Because of the nature of our product, we will probably need to work with multiple designers of this type and we put out an open call for submissions on Craigslist. After posting last night (at around 9pm) I found my inbox filled with seventy responses. Some of them were terrible, but some of them were great.

It’s been a while since I’ve posted a Craigslist job listing, so I don’t have a good baseline. Is getting 70 responses overnight for a design gig typical? And what’s the best explanation for the disparity between how busy theUX and branding guys were vs. the HTML / CSS guys? Is it the difference between looking at high end firms vs. doing a craigslist ad? (probably). Or is it that these two design disciplines have different economics?

21
Oct
2009

Worth a read

James Polanco of DevelopmentArc has a great post on Flash Player internals. Worth a read.

http://www.developmentarc.com/site/2009/10/flash-player-internals-101-recap-part-one/

9
Oct
2009

JavaScript performance optimization, take 1

For the last several months, Mike and I have been working on a new project, which is nearing closed beta. That means we need to start battening down the hatches, and today was the day to start tackling client-side JavaScript performance.

I’ve actually done quite a bit of performance work in my life, but not with JavaScript, so I though I’d take some notes along the way.

Firebug is your friend

In my mind, there are really three ways to a significant dent in performance:

  1. Find bad algorithms and replace them with fast ones
  2. Find code that doesn’t actually have to be called and skip it.
  3. Optimize the code that gets called most often

And you really can’t do any of the three without a profiler. You might think you know what the problem is, but you won’t know until you profile it. In my case, I started out thinking that I had event listeners hanging around that weren’t letting go of their events, but the profiler (in this case, Firebug) told me I was completely wrong.

To get started profiling in Firebug, go to the console tab, press the ‘profile’ button, do some stuff, and hit the ‘profile’ button again. That’s it.

You’ll then be presented with data that looks like this:

Firebug

For my money, the two most important columns are ‘own time’ and ‘time’. ‘time’ is the total time spent in a function including any functions that are called by that function, and ‘own time’ is the same thing minus the time taken up by other functions.

Problem: $$(’.class’) can be SLOW!

I created a test where I did the same UI gesture 8 times, and this is what I discovered. Looking at ‘own time’ told me that most of my time was going to DOM traversal via the $$ function.

Looking at ‘time’ told me that the methods responsible for calling $$ were all central functions that were called in many places throughout my code, so it was worth making them as efficient as possible before figuring out whether there was a way to avoid calling some of them altogether.

Phase 1 — replacing traversals of the entire DOM tree (via $$) with smaller traversals

Roughly speaking, this corresponds to strategy (3).

What total time %delta
from prev
%delta
from base
Baseline 2812ms
Replace $$(’.class’) by $(’section’).getElements(’.class’) in critical sections 2345ms 20% 20%
Chage getElements(’.class’) to getElements(’div.class’) in critical sections 2094ms 12% 34%
Found more places to do the above optimizations 1723ms 22% 63%
Replaced getElements() with getChildren() where possible 1641ms 5% 71%

Along the way, I tried all sorts of other optimizations, but none of them yielded much benefit. Now that I was reaching the point of diminishing returns, it was time to see if there were chunks of code I could safely skip.

Phase 2 — skipping handler functions when possible

I knew that there was almost certainly code I was running that could be skipped (strategy 2). Why?

I find that when writing UI code, it is often easier to use brute force to make sure that everything is working consistently. For example, if an AJAX call updates a certain part of the screen, it is often easier to blow away all event handlers from everything and re-add them where needed, rather than just patching up event handlers for the portion of the screen that was updating.

My rationale is that you can always fix this at the end. And well, it was now time to pay the piper.

My test case involved doing the same UI gesture 8 times. And most of the time was going to the following functions:


add_panel_handlers_if_needed(): 8 times
add_content_handlers(): 16 times
add_panel_handlers(): 8 times
actually_do_drag_cleanup(): 8 times
remove_content_handlers(): 24 times
fix_detail_handlers(): 8 times
handle_click(): 8 times
fix_toggle_rte_handlers(): 8 times
add_drag_handlers_and_start(): 8 times
add_insert_handlers(): 8 times

You can see that some functions are being called 8 times and some were being called 24 times. As it turns out, this was just due to programmer laziness. By adding a few checks, some of those redundant calls could be safely avoided.

The other thing that was causing extra work is that only certain interactions caused screen updates that needed event handlers to be reattached. By writing some code to check for that, I was able to avoid many of these calls altogether.

What total time %delta
from prev
%delta
from base
Baseline 2812ms
End of phase 1 1641ms 71% 71%
Remove redundant calls to remove_content_handlers and add_content_handlers 1389ms 18% 102%
Skip certain fixup calls when content is determined not to have changed 1073ms 29% 162%

(P.S. there is some small part of my brain that tells me that instead of manually worrying about these event handlers, I should just bite the bullet and switch to JQuery. But I’m not there yet.)

Summary

So, what’s the moral? First off, doing $$(’.class’) is slow. Second, large performance boosts usually come from a combination of skipping code that doesn’t have to run and optimizing the code that does. This was no exception.

One more thing. I just have to say that Firebug is amazing. I expected it to have trouble giving useful timings in the face of inconsistent UI gestures and garbage collection, but it did the “right thing”, which many desktop profilers don’t manage to do. If I had one wish, I wish I could get it to bundle up calls from specified library files and allocate the time spent in them to the calling function.

Ok. Back to more optimizing.

11
Mar
2009

YAWR – Yet another watchmen review

Ok. So now I’ve seen the Watchmen movie. It’s about as good as I could imagine the movie being, and I followed Scott Knaster’s advice: I enjoyed it for what it is.

Yes, the movie had faults, but it’s hard to imagine how those faults could have been corrected without major departures from the source material, which would have been devastating in its own way. Rock, meet hard place.

Now, for my take. I’ll try not to cover ground that has been beaten to death elsewhere. (mild spoilers ahead)

More »