A couple years ago I learned of what is now one of my favorite quotes from one of our senior developers, Gil Moskowitz. I asked him why a particular development resulted in so much code and complexity. He referred to a quote from Blaise Pascal: "I would have written a shorter letter, but I did not have the time."
As many of you know, we've been hard at work on our new Mobile Web client. For much of this year the plan has been to base the client on Blossom, a fork of SproutCore, that we sponsored to evolve that framework to a mobile-ready platform. We debuted our new client running on Blossom at the OSBC and FluentJS conferences in May. A funny thing happened on the way to fame and fortune at those conferences. We discovered a better framework called Enyo.
Enyo 2.0 is a HTML5 framework based on Hewlett Packard's WebOS platform designed to work in any web browser environment including all popular desktop and mobile browsers. The first beta was released about a month after we started on our Blossom project. Having invested heavily in SproutCore and Blossom by May, we were more than a bit skeptical about yet another framework, but after seeing some impressive demos we thought it was at least worth a closer look. First what we found is Enyo is about 90% smaller than SproutCore. While SproutCore clocks in at around 300K lines of code and Blossom at 200K, Enyo is around 30K. As a result it is easier to learn and understand, so coding in it is a dream. It also comes with a set of widgets in its "Onyx" library that look great in all environments. Plus it's fast! Finally, Enyo is being actively developed and documented by a team of full time professionals. This was just too good to ignore, so we continued looking even closer.
One thing Enyo was missing was a strong data management layer, which is important to us because our application is so data intensive. For this we pulled in Backbone.js and a corollary project Backbone-Relational.js. These two libraries add up to about 1,500 lines of code and do more than the SproutCore datastore does in 6,800 lines of code. I was able to read the code and understand the APIs for these two projects in about a day.
Finally, we never quite got Blossom to work in all environments, such as phones. We found, however, that Enyo truly did work everywhere: on phones, tablets, even the Kindle Fire! We decided to spend a couple more weeks coding in Enyo with Backbone and see where it would lead. In about a week I had re-written our entire model layer in Backbone and unbelievably didn't run into a single bug. In two weeks our new Enyo based application started to look very much like what we showed off in May.
The most important factor in our decision to change was usability. Because SproutCore and Blossom are so large and encumbered by so much indirection and a complicated run loop, the learning curve to use them is very steep and debugging is difficult. By comparison these other frameworks are a breeze to use. Enyo and Backbone are case studies of "Less is More," as neither are over burdened with features and code bloat like so many application frameworks in existence. So we decided to take a little more time and write a "shorter letter" with Enyo and Backbone. The outcome is a new client that is turning out to be a much simpler and more reliable product. We feel a few weeks of delay will pay huge dividends for our development team, customers and partners for years to come.
The Enyo team just released 2.0 final last week, and we are currently on target to release a beta of the new xTuple Mobile Web client running on xTuple 4.0 in the next few weeks as well... so you all will be able to see and judge the results for yourselves. In the meantime I will leave you to ponder the relationship between features and the size and complexity of software with this excerpt from Douglas Crockford's "JavaScript the Good Parts":
"We see a lot of feature-driven product design in which the cost of features is not properly accounted. Features can have a negative value to consumers because they make the products more difficult to understand and use. We are finding that people like products that just work. It turns out that designs that just work are much harder to produce than designs that assemble long lists of features.
Features have a specification cost, a design cost, and a development cost. There is a testing cost and a reliability cost. The more features there are, the more likely one will develop problems or will interact badly with another. In software systems, there is a storage cost, which was becoming negligible, but in mobile applications is becoming significant again. There are ascending performance costs because Moore's Law doesn't apply to batteries.
Features have a documentation cost. Every feature adds pages to the manual, increasing training costs. Features that offer value to a minority of users impose a cost on all users. So, in designing products and programming languages, we want to get the core features 'the good parts' right because that is where we create most of the value.
We all find the good parts in the products that we use. We value simplicity, and when simplicity isn't offered to us, we make it ourselves. My microwave oven has tons of features, but the only ones I use are cook and the clock. And setting the clock is a struggle. We cope with the complexity of feature-driven design by finding and sticking with the good parts.
It would be nice if products and programming languages were designed to have only good parts."
Amen.