It’s the GUI stupid!
Many years ago, I consulted for a large semi-conductor company during the early stages of a software project. They had a highly detailed and fairly rigid process for software projects that started with a complete requirements document based on an extremely verbose and granular template. As the project progressed and I saw the size of the document balloon from 50 pages to more than 200 pages, I had the realization that this document would never be read by ANYONE from beginning to end. The business owners who were responsible for ensuring that the requirements fit their actual business needs were completely overwhelmed by the document’s size and complexity. Six months later the business users were given their shiny new software and they were disappointed that the software didn’t match their expectations.
In reality, the software was a very solid effort that met all of the requirements specified in the document. However, business users had no ability to read the requirements document and imagine what the user interface might look like for the requirements provided. I remember feeling that the business owners didn’t know what they really wanted and feeling resentful of that fact. In retrospect, I realize that almost nobody knows exactly what they want, until they see it. Why? Because to a user, the interface IS the software. Concepts like data models, middleware, rules engines, LDAP, and SSL have no real meaning outside of us techies.
So how do we avoid this? Is Agile Development the answer? Agile is definitely a step in the right direction. It codifies the practices that had evolved in the most successful and most productive software development teams of the 1990s. However, we need more. We need to enable our development teams to prototype the user interface quickly and easily so that users can actually see (better yet, use) the software EARLY in the process. In web 1.0 this was a fairly straightforward effort of building static HTML wireframes. The problem was that this work was largely throwaway b/c they had to be rebuilt as servlets, JSPs, ASPs, PHPs, etc.
As our web applications become more sophisticated this approach starts to break down even further. Today, rich internet applications include syndicated content, widgets, DOM manipulation, Ajax calls, and often a substantial amount of JavaScript. Static wireframes just cannot easily emulate this kind of rich user experience accurately.
What If?
What if you could build the user interface prototype in a matter of days or weeks without a single line of server-side code or even a datamodel? What if the business owner could not only play with this prototype, but also provide context specific feedback seamlessly while exploring the prototype? Finally, what if the prototype wasn’t a prototype at all, but was the actual user-interface of the final product (zero throwaway code)… even if you haven’t decided which server-side technology you want to use (Java, .Net, Ruby, PHP, Python, Perl)?
This is exactly how we develop software for our consulting customers today using the Appcelerator platform. We’ve been doing this for over a year now, but we haven’t really given it a name until recently. We call it “Interactive Use-Cases”. Essentially, we skip the entire functional requirements definition phase and move directly from use-cases to working prototype! This is only possible because of the advantages that the Appcelerator platform provides us. Let me explain.
Technological Enablers
First, Appcelerator’s widget library, web expression language, and message-oriented architecture were designed to enable web developers to build UIs with the minimal amount of code (read: JavaScript) possible. As an example, Ajaxian’s Dion Almaer posted a small interactive web page on his blog and invited people to port it to their favorite JavaScript framework. Compare the ViewSource of the Appcelerator version to those of the other frameworks. More app + less code = better productivity.
Second, the fact that you are not generating your HTML from server-side scripts frees you from the wasted effort associated with building throwaway static wireframes. Build applications as Ajax enabled .html files which dynamically pull data/content from the server and (re)render those sections of the page accordingly.
Third, our message-oriented architecture is ideal when prototyping because message subscribers in the browser do not care about the source of their messages (that’s the point of publish/subscribe architectures). So build the entire user interface with the exact messaging code that they will need for production use. But instead of building a datamodel, DAO objects, DTOs, business logic, and such to provide the actual service implementations, just add a single line to your webapp to include a single JavaScript file containing mock implementations of these backend services. In 90% of the cases you can mock that service with a couple lines of JavaScript that generates a JSON message with a mock payload.
My favorite part about this approach is that once you have gotten sign-off from the business owners, you can remove a single line from the application and all of the mock services have now been turned off. And the server-side programmers have a complete contract of every service which needs to be developed along with test data. Even better, they can choose to implement those services in any language they prefer because the UI is just producing/consuming JSON.
Fourth, thanks to a recent enhancement by Andrew Zuercher, we can easily collect user feedback on our user interface prototype by passing an additional URL parameter which highlights the border of any HTML control on mouseOver. By CTRL-clicking on any highlighted element a feedback dialog box appears that includes the specific page and HTML control being commented on. Users can see other users comments so that feedback effort isn’t duplicated. UI elements that already have comments are indicated with red borders.
Everyone knows that prototyping is a valuable exercise that improves the likelihood that the business users will be satisfied with the end-product. However, the limitations of web technology have made it prohibitively expensive and time consuming for all but the most critical web projects…… until now.
Popularity: 4% [?]













{ 9 comments… read them below or add one }
this is really sweet
I definitely agree this is the right approach to requirements exploration and prototyping, however, it’s not at all true that Appcelerator has somehow enabled this pattern (”…until now”).
People have been doing this with SmartClient for years, only in much, much more sophisticated form. SmartClient has a concept of a clientOnly DataSource, which can be defined in just a few lines of code with mock data, and can be plug-replaced later with a DataSource that actually contacts the server (any kind of server) without changing any GUI code.
http://www.smartclient.com/index.jsp#localDataSource
So, connect a client-only DataSource to SmartClient’s visual components, and you’ll have, say, a complete master-detail editing interaction, all in on .html file, with just a few lines of highly declarative JavaScript.
But years ago we took this to yet another level of power, deciding to let the business analysts build the prototypes themselves with a drag and drop GUI builder (called Visual Builder). Again, same concept, super-rapid prototyping where the prototype is real, production ready GUI code connected to sample DataSources that are plug replaceable.
Anyway, great article on getting rid of cruft in enterprise development processes, but yeah, Appcelerator didn’t exactly enable this
@Charles, thanks for the comment. I’m glad to know that we’re not alone in the fight to bring back prototyping to software development. It looks like our products tackle many of these issues in similar ways (e.g. stop generating HTML from the server).
I should clarify that our intention isn’t to mock datasources, but rather to provide mock implementations of the Services (SOA) that will need to be written on the server-side to enable the UI. I’m sure that this was clear to you, but when I re-read the original post and your comment it occured to me that some readers may be confused on this point.
As for the “enabler” comment, I’ve seen pieces of this solution evolving for a while, but Appcelerator was the first place I saw it all come together (including the ability to easily collect the user feedback from the iterations directly in the webapp itself). That’s a big part of the reason that I joined Appcelerator.
Best of luck with SmartClient… great minds think alike, and apparently so do ours
SmartClient DataSources can likewise easily represent any kind of service. That’s the easier case.
On SOA, our viewpoint is that a RIA should be able to consume the same set of data services that are exposed to other types of applications (eg installable Java clients). So, SmartClient can directly consume WSDL web services from the browser without the need for something like Axis or a Java Server. This results in far fewer services, a simpler deployment model (any kind of server; no server-side UI code needed), and a more responsive & scalable application (less server trips). I don’t mean to bash your product, but having the server listening to UI events seems like a step back from this architecture.
Your comments feature is interesting & cool, but how about enabling someone with a product management or business analyst skillset to go ahead and *actually modify the UI* (now that’s new!).
Just keep in mind – comments and the like are typically tracked through through integrated tools that are extremely comprehensive (think versioning, user roles & approvers, BPEL integration, etc) – so just be aware that your simple comments feature is on a slippery slope to heavy duty enterprise collaboration!
“Server listening to UI events”
I think you may be confused on this feature. The server isn’t listening to UI events… it’s listening to application events that just may be the result of the user’s interaction with the UI (e.g. it’s listening for process_order not for orderButton.onClick). Think of it more like message-oriented middleware instead of GUI event listeners. The server doesn’t have access to every message generated in the UI (go read about Appcelerator messaging basics look for l: and r: for an overview).
The comments stuff is specifically designed to avoid the traps of heavy duty enterprise collaboration. Notice it even uses a twitter-like log of comments. That’s kinda the whole point… the value is in the simplicity!
I’ve been down the “business users writing software via drag-n-drop” before with varying degrees of success/failure (Powerbuilder, Interwoven Workflow, etc.). I haven’t used your stuff before, but you’ve gotten it right… kudos.
BTW, I didn’t take any of your comments as “bashing”, just constructive feedback… but I also didn’t intend for my blogpost to become a competitive anlaysis for another vendor. If you’re going to be at any of the upcoming RIA events I’d love to get together with you to learn more about the concepts behind SmartClient and I can share a more in-depth tour through Appcelerator to see if we can benefit from each other’s ideas. I’ll be at ZendCon, TAE, and AjaxWorld if you’re available. Email me at mquinlan at appcelerator d0t c0m if you’re interested.
re: application events: I see what you mean, I can’t think where that would simplify things I’ve done in the past, but I’m glad Appcelerator isn’t using the JSF model of server-processed UI events
re: simple comments: I quite agree, and 37signals seems to be making a good business out of this philosophy
re: business users writing software with drag-n-drop: this would be interesting to discuss (I’ll be at TAE and AjaxWorld) – I think the key is to never settle for a tool that generates actual code, but only generates declarations (XML or JSON). If there seems to be a need to generate code, make the declarative format more powerful and expressive instead. Applications that succeed will eventually have requirements that move beyond what a business user can do in an drag and drop environment, so the artifacts the tool produces need to be clear, easy to understand and easy to extend.
looking forward to meeting you at TAE and Ajaxworld.
Cheers! Quin’
The message approach in Appcelerator is really innovative and forces you gently to think SOA. But to get rich quick with RIA prototyping, Appcelerator still misses two main parts, which is odd considering the message foundation.
The first thing is “runtime agnostic”. E.g. make the widget/ui controls adapt their behaviour and presence based on their message payload. Today, the behaviour and presence definitions must be defined upfront and can’t or are hard to change during runtime. Second – like Charles already mentioned – a visual designer that allows you to build your prototype interactively or make use of reusable templates / best practices.
This video shows a nice example of these two parts. Especially take a look at the cool data viewer that adapts to the message payload automagically!
http://www.evernote.com/pub/focusfriend/focusfriend#9124565c-4810-40fe-9fcd-73a619597ce3
@Ivo
You will be happy to know that we have just hired the JBoss Developer Studio project lead (Marshall Culpepper) to drive our tooling strategy. The goal is to make the platform as simple and intuitive as possible to ensure that tooling is a nice-to-have rather than a strict requirement (from a productivity perspective). This way VI ninjas & VB coders can be equally comfortable using Appcelerator. Join the RIA Developer group on the community site and make your voice be heard.