Thursday, September 17, 2009

Metawidget Elevator Pitch


I've been having fun lately drawing an Elevator Pitch for Metawidget.

I was inspired by the style of the Google Chrome Book, though clearly I'm no Scott McCloud!

Check it out here: http://metawidget.org/elevator.html

As always, your feedback is much appreciated.

Tuesday, August 11, 2009

GWT Metawidget takes a walk on the client side

The latest release of Metawidget upgrades our GWT support to 1.7 and includes a new example of running pure client-side GWT:

By default, GwtMetawidget inspects business objects server-side. This is because client-side JavaScript does not support reflections or annotations.

However if you don't need reflections or annotations, and have your own way of retrieving inspection results, you can plug in your own Inspector and keep everything client-side. This example retrieves inspection results from a textarea and generates the UI.

Download the example here. More documentation can be found here.

Metawidget on ICE

The latest release of Metawidget includes support for the ICEfaces component library.

Metawidget's philosophy of not 'owning' the UI, of integrating with existing UI frameworks and component libraries, means it can easily take advantage of awesome component libraries such as ICEfaces and all the AJAX-goodness they provide.

The Metawidget distribution includes an example of Metawidget and ICEfaces working together to deliver a rich, AJAX-driven UI with minimal code:


All the input boxes and command buttons in the screenshot are generated at runtime by Metawidget, and update dynamically using AJAX.

Download the example here. More documentation can be found here.

AJAX User Interface Generator: Metawidget v0.8

Version 0.8 of Metawidget, the AJAX user interface generator, is now available. This release includes:Special thanks to Ted Goddard for his help with this release!

As always, the best place to start is the Reference Documentation:


Your continued feedback is invaluable to us. Please download it and let us know what you think.

Monday, August 3, 2009

Geek mid-life crisis

I recently completed my 'geek mid-life crisis' and joined the ranks of those who attempt to recapture their youth and relive by-gone days by building their own arcade cabinet.

I was inspired by watching The King of Kong and considered purchasing a professional cabinet, but installing something bigger than a fridge freezer in the living room is a tough sell for a family home: I needed something more slimline and less obtrusive, which is when I came across the awesome job this guy had done, so I decided to have a go myself.

Here are the initial plans (they changed a little bit during construction):


The work in progress (this was my first time with a router, or even a drill for that matter, so I asked a grown up to help me):


And the finished product (a few months later):



Costs (in Aussie dollars):
  • Joystick and Encoder board (incl shipping) - $203.85 - Replay Arcade

  • 20" L200P LCD monitor - $172 (incl shipping) - eBay

  • Coin buttons - $18 (incl shipping) - OzStick

  • Wood - $120 - Bill's boards

  • Artwork - $170.50 (incl shipping) - MAME Marquees

  • 1L Black paint - $30

  • 6mm laminated glass - $40 - JB Glass

  • 2 perspex sheets - $20

  • 2.8GHz 1GB P4 PC - free (a local school was getting rid of one)
All up about $800 Aussie dollars, plus a bunch of sweat and tears and, yes, even blood (I cut myself a couple times). Sincere thanks to the many people who either helped or were inconvenienced during this hair-brained project!

Saturday, August 1, 2009

Home office

I thought I'd post a couple snaps of where I've been spending my working day for the last 18 months:


I'm a big advocate of multiple screens: two is definitely better than one; after a while with two you start thinking you need a third; and if you go three you need 2 video cards so you may as well have four! What do I use four screens for?
  • Far left: e-mail, reading PDFs of specifications etc

  • Middle left: running version of whatever application I'm developing

  • Middle right: my IDE, spread over two screens, with this screen being a full screen of source code (bliss :)

  • Far right: the rest of my IDE, including server console, debugging tree, folder navigator etc
It took a little while to get used to, but now I'd never want to go back.

Friday, July 17, 2009

On the value of reflection

The research methodologies of Action Research and Reflective Practice instruct that 'reflections' (as in contemplation, not as in type introspection) from a previous software development phase should drive the planning for the next phase (much like the industry methodology of Iterative Development). It is perhaps worthwhile to reinforce the value of this reflection. After all, reflection is expensive. Conducting experiments, interviews and case studies consumes valuable time and resources, and it is legitimate to question whether its benefits outweigh its cost.

One of the most important factors in software development is scope: deciding what to include and what to leave out. Scope creep and feature bloat are recognised risks, impacting development costs and release schedules. Good architects carefully apply rules of thumb: every design decision should 'carry its own weight', and strive to 'kill several birds with one stone'. But an implicit difficulty in evaluating this is knowing what the 'birds' are. Once out of its initial planning phases, software development has a tendency to lurch from immediate issue to immediate issue, dealing with each new requirement as it arises. Considering new requirements in isolation invariably means the burden of large-scale redesign to satisfy any one requirement will seem onerous: a smaller-scale, less impactful alternative will always seem the better option. Reflection, on the other hand, allows the practitioner to consider many weeks worth of problems in a holistic light: he can see all the birds at once, and an approach that once seemed over-engineered now appears justified. Surfacing all the issues at the same time clears a path forward that otherwise would have seemed prohibitive.

This phenomena is analogous to neural networks. While progressing to solve a given problem, a neural network may get trapped, still short of the best solution, in a local minima. The local minima itself does not represent the best answer, but none of the immediate ways out of the minima are enough of an improvement to overcome the walls of the valley. It takes a combined push, a sort of disruptive excitation, to escape the trough so that a better solution can be found:

So much for the theory - is it demonstrable in practice? Here I will give personal testimony. One of the themes from Metawidget's alpha cycle reflections was support for 1-to-M relations. In itself, this seemed a corner case: difficult to support within the current architecture without a slippery slope of requirements around sorting, pagination and summary-to-detail navigation. Another theme was support for third-party UI components. The most challenging case study indicated this would have improved adoption, though it was not a primary factor. A third issue was around supporting the SWT library: the current design of 'return null to render nothing, return a dummy Metawidget to trigger nesting' was backwards for SWT's purposes, though this was being worked around in a sub-optimal way.

Individually, none of these requirements seemed enough to justify a significant reworking of the widget creation subsystem. Indeed, the theme of 1-to-M relations gnawed at me for months with no obvious solution within the existing architecture. It was only reframing it within the context of the additional requirements of 'supporting third-party components' and 'turning widget creation inside out' that a new path presented itself (see WidgetBuilders). Looking back, I realise I was probably especially resistant to seeing this path because it was in an area I had already considered and decided against.

In summary, I have found explicit reflection to be an enlightening and worthwhile use of a project's time. It is easy to skip this phase in the heady rush of pumping out release and release, but when one takes the time to properly pause for breath important insights can be gained.