Blue Sky On Mars

Thoughts on Building Software Products

Month: January, 2010

CommonJS: the First Year

by Kevin Dangoor

A year ago today, I posted “What Server Side JavaScript Needs”, inviting people to come and turn JavaScript into a competitive platform for applications on the server. Quite a few people answered the call. While the focus of the group has been on JavaScript in non-browser contexts, we’re ultimately shooting for as much of a standard that can cross between server, browser, GUI and command line applications as possible. That’s why we changed the name to CommonJS in the second half of the year. Ironically, most of my own personal use of CommonJS so far has been in the browser. I’ll come back to the personal perspective, though.

The Original Goals

As laid out in my original blog post, we were seeking to create:

  • A module system,
  • A cross-interpreter standard library,
  • A few standard interfaces,
  • A package system, and
  • A package repository

Note that the idea here is that this group creates specs, which will have multiple implementations.

The goal is to have these things working across as many operating systems and interpreters as possible. There are three major operating systems (Windows, Mac, Linux) and four major interpreters (SpiderMonkey, Rhino, v8, JavaScriptCore). Plus there’s “the browser”, which is a unique environment unto itself. That’s a fair bit of surface area to cover.

Oddly, I think the one of those eight “platforms” with the poorest implementation support is Windows. Most of the CommonJS developers are using Macs or Linux machines, so I’m not sure how much time has really been spent on Windows. I would imagine that JavaScriptCore on Windows is probably the least supported combination.

The good news, however, is that there are projects using all of those JavaScript interpreters and platform compatibility issues will ultimately be ironed out.

CommonJS and the ECMAScript Standard

The CommonJS group is a grassroots effort, and not some formal standards body. In some ways, however, it works like a standards body in that the people working on the standard are also implementing the standard-in-progress and using it to build real applications.

We have no control over the ECMAScript language, which is managed by the TC39 working group. However, there are a few people involved in CommonJS who are part of TC39, and I have firsthand knowledge of others who are keeping an eye on how things are going with CommonJS.

The CommonJS standard-in-progress is designed to work on a subset of ECMAScript 5 that can be made to work on today’s ECMAScript 3 interpreters. ECMAScript 3 is the standard that is running in all of the browsers. In other words, in a CommonJS application you can count on Array.prototype.forEach to be implemented. Obviously, applications can do whatever they want (array destructuring? knock yourself out, but your app will only work on SpiderMonkey and Rhino).

One certainty about CommonJS is that inventing new language syntax is out of scope.

The Module System

The CommonJS group has been remarkably good at avoiding bikeshedding. While there is discussion about names of things, there isn’t heated discussion about it. People are far more interested in issues of functionality and ease-of-use. This is a very good thing, and it allowed us to get modules out of the way early on.

Of course, the lack of bikeshedding doesn’t mean that everyone agrees on things. The CommonJS module system has its controversial aspects, but I think it does well given the constraints:

  1. must work with ES3 syntax (destructuring could actually be useful, but we’re not going to do it)
  2. modules should have self-contained namespaces and be explicit about data the want to export
  3. it should be possible to make modules tamper-proof, though this is not a requirement
  4. using a module should be competitive with using modules in languages like Python and Ruby

TC39 had considered adding modules to ECMAScript 4 and there are module proposals on the table for ECMAScript Harmony that would add some syntax to JavaScript that would look similar to CommonJS modules. Here’s a short module to give you an idea of what CommonJS modules look like:

var sillymath = require("extramath/silly");

exports.addTwo = function(num) {
    return sillymath.add(num, 2);
};

Personally, I find this to be reasonably concise with a nice level of explicitness. Some syntax sugar would be good, and I hope we get that in ES-Harmony. But, this syntax works fine today.

Of course, this syntax is not without controversy. The biggest controversy has been that require() is synchronous – the “extramath/silly” module has to be available as the module above is loaded. However, there are a couple of reasonable ways to deal with this problem and I am happily working with CommonJS modules in the browser which is the environment that is least tolerant to synchronous loading.

Controversy or not, this basic module system was ratified last winter and has been implemented on all target environments of CommonJS.

Discussion is ongoing for a tie-in to the module standard: the module transport standard. Without additional help from the browser or some additional scaffolding running in the page, the module syntax above doesn’t work via a <script> tag. By standardizing what that scaffolding would look like, it is possible for a variety of build tools, servers and client side libraries to come into existence to provide many options for loading modules in the browser. There have already been several implementations of CommonJS module loading in the browser, but a standard will make it much easier to mix-and-match client and server.

The Standard Library

I had hoped we’d get farther on the standard library than we have, but it can indeed be a long process. system and unit testing are the only ones that have been ratified at this point. We have come a long way on file access.

“What!?!?”, I hear you say, “there’s no standard for accessing files yet?” That’s right. And there are a couple of reasons that it’s been challenging to get there.

Consider that JavaScript does not even have a standard object to deal with binary data. That is a basic prerequisite to working with files. JavaScript strings are not the same as a binary data container. So, there’s binary data to handle, streams to figure out and then file functionality built on top of that. There’s also the consideration of whether file access is synchronous or asynchronous. We’ve made tons of headway on this, and there are certainly implementations of some of the specs. It’s just a matter of finishing them.

I’m hoping to see promises become a part of the standard, because some form of that interface is very convenient to use for asynchronous operations.

Standard Interfaces

We do have a very useful interface with implementations and people actively using it: the JavaScript Gateway Interface (JSGI). That spec has not yet been ratified, but it is getting closer and there are apps being built against it today.

Database access has not yet been standardized. It will be interesting to see if we can come up with a good interface that can usefully target SQL and NoSQL databases alike.

Package System

We have a recently ratified spec for packages of CommonJS code. I hope this will bring about a collection of good package managers with different focuses and targeting different environments. There have already been a couple of attempts to create package management systems, and the most fleshed out one that I’ve seen is Tusk, which is bundled with Narwhal. Once a few more specs are ratified, Tusk should be able to run on other CommonJS implementations.

Package Repository

Tusk is using GitHub as a package repository, and that is working okay for the time being. A couple weeks back, we got word that the jQuery plugin repository is going to provide a CommonJS package.json file for the ~5000 plugins in their database. This is exciting, because this infrastructure could prove to be very useful to us going forward.

JavaScript: Bubbling Up

2009 was a terrific year for JavaScript. In the browser, we’ve obviously seen tons of growth in increasingly sophisticated applications. I think the interest is steadily building to use JavaScript more and more outside of the browser. The two JSConf conferences (in Washington DC and Berlin) were great successes by all accounts I’ve seen. PhoneGap, Titanium and Palm’s WebOS have created ways for people to use web tech to create installable apps for mobile phones. node.js has been a huge driver for people to check out building scalable, asynchronous JavaScript apps on the server. And, of course, CommonJS is finding its way into more and more applications.

My Personal View

I had hoped to personally have more time to devote to CommonJS in 2009, but I am delighted at how a great collection of people have stepped in and carried the specifications and implementations forward through a lot of hard work and force of will. More than 5,100 messages have gone across the mailing list, and more than 10% of those have been from Kris Kowal. Kris has done a ton of work in ironing out many of the specs and deserves a good deal of credit for where CommonJS is today. He and Tom Robinson even stood in for me when I had to cancel my trip to JSConf.eu (thanks, guys!).

Taking a look at the top posters on the googlegroup, you can see how many people have put so much into CommonJS. More than 10 people have contributed more than 100 messages a piece and, for many of those people, there was a lot of time spent in the email discussions, IRC chats, spec writing and implementation of those specs. Plus, as early adopters, they have the joy of tweaking things as the specs have changed over time. Thanks to all of you for the dedication and the will to get it done.

Bespin‘s client side JavaScript code is all CommonJS modules now, partly thanks to the efforts of Charles Jolley to migrate the SproutCore framework to CommonJS and creating the Tiki module loader. From that standpoint, I’m already using more CommonJS now than I did in 2009. I’m also hoping that 2010 will bring a Bespin server “reboot”, where we start migrating server functionality to CommonJS.

On the whole, I think that 2009 was a great year for JavaScript and CommonJS and I think 2010 is going to be even bigger. I hope to meet more enthusiastic JavaScript hackers at JSConf.us in April!

Comments?

You can direct them to the thread on the CommonJS googlegroup or email to editor@blueskyonmars.com.

SlowNews: Sikuli, Letters.app, Pintura, Firefox 3.6

by Kevin Dangoor

SlowNews on BSOM: An Experiment

This is my first SlowNews issue. Read What is SlowNews?, if you’re curious about it.

Sikuli: Picture-Driven Scripting

Sikuli

The Sikuli project out of MIT has to be seen to really get a feel for it. The short of it is that it’s a scripting language for controlling applications that works by taking screenshots of the various controls that need to be clicked on or otherwise manipulated. Sikuli uses computer vision techniques to find a matching part of the screen at that point in the script. This is seriously cool.

Firefox 3.6: Speed, Personas and Video Controversy

Disclosure: I work for Mozilla. My opinions are my own.

Firefox 3.6 was released last week, representing a lot of work from a whole lot of people. JavaScript performance is faster still than the already fast 3.5 and there have been a number of other areas of the UI that tightened up, performance-wise. Personas made it into the main product (before they were available only as an add-on).

Unrelated to the 3.6 launch, there was some controversy as YouTube and Vimeo both announced support for HTML5′s video tag. Firefox supports the <video> tag, but not the H.264 codec used by both YouTube and Vimeo. There are some very good reasons for this, which Mozilla’s Mike Shaver went into detail on. Chris Blizzard went into even more detail, and provided an interesting historical comparison with gif. Those are worth reading if you produce any videos for consumption on the net, because the issue extends not just to browser manufacturers and sites like YouTube. Even people producing videos encoded with h.264 may find themselves with a bill to pay come 2011.

Pintura: CommonJS/JSGI Server-Side JS Framework

Kris Zyp introduces Pintura, a server-side JavaScript framework that keeps the presentation on the client side where it belongs. Kris also wrote a Getting Started with Pintura article that’s worth a read. Pintura wins bonus points for running on node.js, Narwhal and Flusspferd. For those keeping score at home, that means that Pintura can run on SpiderMonkey, v8, Rhino and JavaScriptCore. That’s what CommonJS is all about!

Amazon Kindle: There’s An Active Content For That?

Amazon has announced a development kit for the Kindle, coming in February. The SDK will allow developers to create “active content”. Active content will certainly be different from iPhone apps, if for no reason other than the refresh rate of the eInk screen. Still, it’s an interesting development. Amazon has never said how many Kindles they’ve sold, but you can bet it’s less than the tens of millions of iPhone OS devices out there. You can sign up for the beta now.

Letters.app: Concept-driven Open Source

The Letters Icon

Most open source software begins its public life with code. It obviously started out as an idea and was built up following some need or desire, but by the time it’s public there’s some code. The currently-vaporous Mac mail client “Letters.app” started off with NetNewsWire developer Brent Simmons saying he wanted a better mail client. Macworld commented on the literally hundreds of email messages that followed. John Gruber was elected president for the 1.0 release, and Gus Mueller has taken on the technical leadership. Gus has also started a GitHub repository for Letters.app.

This is a really interesting way to start an open source project, and I wish them well. As has been pointed out on the mailing list, creating a better mail client has been tried before and failed. But, the leadership of the project is encouraging and this is certainly one to watch.

Fusebox Gives You Safely Extendable JS “Natives”

JavaScript is cool in that you can extend String or Array to add many conveniences. It’s not so cool in that others may do it for you, and in ways that are not quite what you want. If you’re willing to suffer through a bit of inconvenience (like declaring an array by calling fb.Array() rather than just []), Fusebox lets you extend native objects without impacting any other JavaScript code.

LuaJIT Gets Funded

It’s news to me that Google uses Lua internally, but they apparently do count Lua among the languages they use. Enough so that Google has pitched € 8,000 into the development of LuaJIT. Add to that Athena Capital Research’s € 12,000 and a couple of smaller donations, and you’ve got a successful funding drive. It’s great to see open source development supported so directly.

Realism In UI Design

Realism in UI Design is an excellent article for anyone who might be contemplating just using photos from iStockPhoto for their icons rather than having a custom icon set designed for their app. For everyone else, it’s a good read with some nice visual reinforcement about striking a balance in realism in your user interfaces. Also worth checking out is Mike Rundle’s article from December which provides some tips for getting subtly realistic user interfaces.

Bill Gates Joins the Internet World

BillG seems to be going all-in with a new Twitter account and a bloggy sort of site (The Gates Notes). Whatever you may think of Microsoft and Gates’ driving of Microsoft, it’s impossible to deny that he’s a big thinker and one worth following. Speaking of following, after just a day on Twitter he has nearly 250,000 followers. The welcome from Ashton Kutcher (4.4 million followers) no doubt helped, though it’s unclear to me just how much overlap there is between Ashton Kutcher fans and BillG devotees.

Notable Releases

  • Firebug 1.5 was released ahead of Firefox 3.6 with a bunch of new features. This is notable, because Firebug would always lag Firefox releases in the past.
  • Cassandra 0.5 includes improvements to multicore performance, the bootstrap process and adds the ability to decommission a live node.

> list
11 goto 11

Top 11 Most Anticipated Product Introductions This Week

11. Microsoft Ribbon Hero for the Xbox360.

10. Google Sock Search

1. CrunchPhone

What is SlowNews?

by Kevin Dangoor

The move toward real-time everything is wrong. We have enough interruptions in our days without having random links and news sprayed at us 24×7. Not to mention that there’s no real thought that goes into real time, and generally very little thought that gets compressed into 140 characters. Length also does not guarantee quality, and too much text can be a waste of time. The trick is to be concise.

I’ve adopted my SlowNews newsletter-like format for sharing and commenting on what’s going on in the software world. A weekly post for software developers and technically minded product managers. This is a way to keep up with interesting things that are happening, but through the lens of a weekly view where the uninteresting is edited away, the more interesting is promoted to the top and a bit of commentary ties it all together.

SlowNews is a chance for me to gather my thoughts and to review the truly interesting things that are going on in software product creation.

Blue Sky On Mars SlowNews is published on Tuesday mornings at 9am Eastern time.

Watch this space.

by Kevin Dangoor

This is just a test post while I’m setting things up.