Why services should offer marginal features (with apologies to 37signals)
zencoder.com
zencoder.com
This advice might be good for user-facing web applications. But if you’re building XaaS, marginal features are awesome. That’s because when you’re a service, what’s marginal to one user might be core to another.
I don't think this is any less true in user-facing applications than it is in APIs. It seems to me that the main difference is that user-facing apps tend to be solving higher-level problems (eg. project management vs encoding video).
Our job is to provide powerful tools and let our users decide what options matter.
37signals also listens to users, but the total number of users per revenue dollar is higher, the scope of the usage is wider, and the cost profile (development, maintenance and cognitive overhead) tends to be different. In either case any new feature requires a cost-benefit analysis.
But APIs are different. An API with 60 options makes for longer documentation, certainly. But if the options are well-chosen and well-documented, an API with 60 options is barely more complex than an API with 20 options.
This is certainly true for options that are simply wrapping command-line options of open source components. However if you're implementing code on the back-end, these options can easily add complexity to the whole system.
It's true that a checkbox in a GUI is a much higher burden on the user than an option in service API documentation, but then again a service already starts with an order of magnitude higher usability burden than a GUI. This is of course because APIs are designed to be coded against, so the amount of user effort expended is amortized over hundreds or thousands of compute hours.
I'm sure the author understands all this, but it just didn't quite come out of the article.
If anything, Highrise hasn't grown in years. It's now feeling the plateau effect, and we are looking for alternatives to Highrise because it hasn't grown with us.
I agree that "Less is More," but when something as simple as paginating the deals can't be implemented, it makes me wonder why we pay 37signals every month. If it's not going to improving the software and improving workflow, customers will leave to a business that understands its customers. Even Apple, while they don't exactly ask for their customers' input, know what problems their customers face every day. 37signals looks as if they are becoming out of touch with their users.
We agree that the deals page needs pagination, but most people don't have 5000 deals. So while you're scenario is very real to you, it's not a common case. That's not to take anything away from your experience - we agree it's bad and we want to make it better - it's all just a matter of priority. We're currently working on optimizing for the common cases so we can improve the product(s) in areas everyone can enjoy.
Our development log is public, if your curious about the improvements we're making every day: http://highrisehq.com/changes
We have heavily integrated our business app with Highrise, including our Quote to Invoice app with the REST API. We've built reports around the Highrise data. And we love Highrise, for the most part, since it simplifies the sales process. And it's great to track where our sales are at.
But what made us love Highrise was that it was fast. And when we lose that speed, we are reminded of our experience with Salesforce.
The loss in productivity with Salesforce was why we came to 37s in the first place, because you offered us real value in simplifying our sales flow. But right now, we are fiddling with speed, and we understand while you have different priorities, going through our deals nimbly is important to us.
So we went over to Zoho. In the time it has taken 37Signals to hem and haw over task lists, Zoho has created an entire ecosystem of apps, integrated it with Google App Engine, associated tasks across their apps, etc.
Sure, the apps aren't pretty, but they work. Jason would probably argue that our needs aren't the norm, that we've outgrown Highrise, but a counterexample is FreshBooks: we've been using FreshBooks since day one in our business, and we continue to us it because it's a great app that is growing with us. It focuses on simplifying things that are ordinarily complex rather than simplicity as an end goal.
It sounds like the point you're making is that, if well-organized, marginal features can add value without encumbering users that aren't interfacing with them. That makes a lot of sense, and I agree with your approach over the 37signals approach. Marginal features can be core features to some users. It's just important that we keep the interface/API organized in a thoughtful manner, so that unused features don't distract people.
Both APIs and UIs can be poorly designed. I think the point is that UIs have an additional constraint -- that of being interactive. At least filling out the poorly designed Windows API signatures only has to be done once, at design time. After that, the application does it for you and never gets tired of it.
Also, the audience for APIs is developers, who are far more tolerant of necessary complexity, especially when considering an infrastructure to build off of. I mean, intuitive APIs are nice, but I appreciate a proper design (respects orthogonality, minimize leaky abstractions, etc.) even if intuition is sacrificed.
Users have neither the luxury of automation (i.e. no application layer on their side that can "pave over" any warts or tedium) nor the tolerance for violated intuition.
They can afford to scale up their complexity more than graphical designs because textual reference lets you bury stuff very deeply, but the user still has to deal with the "conceptual load," which in a big API can be pretty intensive.
There are indeed other product strategies, but they're all fraught; as Apple's competitors discovered, you can even lose users who use your "marginal" features if the real core features in competitors offerings are better executed.
You need to make sure all these code paths work; and you need to make sure they don't interact in unexpected ways. You need to test not only the well-used paths (which your users will test for you - you'll find out quickly enough if commonly-used functions fail!) but also all of your less-commonly used paths, which will bit-rot if you're not on top of them all the time.
The art of good API design is entirely different, but just as hard, as good UI design. Bolting on a bunch of new features does not a good API make - you need to ensure that you add features sensibly, orthogonally, and matching your user's expectations.
Expanding your API also means you need to make sure you have a good understanding of the load profile of all your API calls, both individually and in combination.
In short, I think the OP is underestimating the complexity involved in designing and managing an API - just because the problems arising aren't the same as those in UI design doesn't mean they're not there.
From the article: "But APIs are different. An API with 60 options makes for longer documentation, certainly. But if the options are well-chosen and well-documented, an API with 60 options is barely more complex than an API with 20 options. You should be able to safely forget about features you aren’t using, and just use the features that matter to you. Done well, incremental features in an API only increase complexity by O(log-n) or even O(1) – virtually no complexity increase at all."
This is true, but how is this different from a UI that's done well? With a great UI you should also "be able to safely forget about features you aren’t using, and just use the features that matter to you." Isn't that just good information architecture combined with a design that prioritizes and encourages accomplishing the most common tasks?
A poorly designed API adds just as much complexity and frustration as a poorly designed UI. But I doubt that a UI "done right" still increases complexity by O(n) or O(n-squared).
In UI design, you're working with platforms that have limited display space, and you're working with users who have limited attention spans. To be great, you have to know what to leave out. Sure your inherent abilities in design are important, but as the number of features approaches infinity, so do your chances of designing a shitty UI.
APIs are a different story. Whether you have 10 features, 100, or 1000 is almost totally irrelevant. It doesn't affect the user experience.
I've never developed an API but the difference between 10 and 1,000 features is huge for the consumer of an API. With big enough APIs, even if the individual calls are beautifully simple and well-documented, I always wonder if I'm ever using the right parts just because there's so much there.
Good point, but I'd say that (1) any well-documented API call should discuss its alternatives, and (2) any well-designed API in general should try to minimize unnecessary overlap between functions.
You're right that a well-designed UI can decrease the complexity of additional features. That said, I think it's usually true that additional features have a larger impact on the complexity of a UI than the complexity of an API. Not as a universal rule, but as a general guideline.
The developer can be as confused as a GUI user when faced with a myriad of choices.
1) "what’s marginal to one user might be core to another"
2) APIs can afford to have more marginal features than UIs because the complexity is largely hidden. Done right, there's more API documentation but the main interactions aren't affected or made more complex.
Everything you put in your API documentation is a promise. Facebook gets away with frequent, breaking API changes because they have a monopoly. Until you can say the same, it might be a good idea to keep your API stable.
Those are just the default audio filters in mplayer. At least it can't have cost much to implement.
In this case the name-space is the API.