You know those gossipy websites that show photos of celebrities without their makeup and fancy hairstyles? At Sparkplug we have a similar dirty secret — underneath the sexy exterior and suave feel of our websites lies a series of ugly, puffy, just-rolled-out-of-bed iterations that would make the paparazzi shriek for joy.
Getting the feel of a web application right – that careful balance of design, functionality and gleeful first impression – takes a lot of sweat, and often a number of false starts. If your final release looks anything like the first draft you doodled on a cocktail napkin, chances are you’re not putting in the time to get it right.
In this article we’ll look at the process we went through to design just one screen of our TeamSnap web app – and the long journey between “it functions” and “it feels right.”
In the past we tried wireframing websites to show our clients what we had in mind, dutifully drawing in little boxes to indicate what “pieces” would appear on each page. This turned out to be borderline useless:
- Our clients couldn’t look at a wireframe and imagine anything resembling an actual website.
- Actually, neither could we.
- What we thought should be on a Web page and what actually fit from a visual perspective often turned out to be completely different.
- It’s hard to get excited by a wireframe. (Don’t discount this; passion counts when you’re building something great.)
Pretty quickly we learned that the best way to start designing the look and functionality of a website was to actually start building the website. Sure, we end up doing a lot of redesigning, but experience has shown that we’re going to have to redesign anyway, so why waste time in the beginning trying to plan what we’ll inevitably end up throwing away?
Version 1: Ugly and Unusable
TeamSnap is a Web service that helps you to manage your recreational or youth sports teams. It came about because several people at Sparkplug play recreational sports and wanted a way to manage their own teams. The application lets you keep a roster and schedule, post and send messages, store and view game photos, assign who’s bringing refreshments and track player availability for each game. We’ll look at the Availability feature in this article, because it seemed exceedingly simple at first, but turned out to be quite complex once we dove into it.
Here’s what the Availability screen looked like in our very first design mock-up:
The concept is pretty simple: List the games, list the players, provide checkboxes to indicate who’s available to play. (Note that we’re showing Manager mode here, where the team manager can edit everyone’s availability. An individual player would only be able to edit their own availability.)
Right away you can see some serious problems:
- Edit mode yields a sea of checkboxes inside table grid boxes. The whole page is visually unpleasant, boxy and difficult to read.
- On submitting this form, the database is going to have to make a server-munching 160 or more updates to save all of this data.
- There’s key information missing, such as the times of the games or a way to display availability for practices.
- We hadn’t even figured out yet what to call this feature. (“Participation” was our first stab at a title, but it sounds like a ribbon you’d get for displaying a slightly-irregular sheep at the state fair.)
Version 2: Better, But Problems Remain
After a few more iterations, and a wholesale redesign of the top banner, we came up with this version:
There are several notable improvements:
- We only allow for editing one player’s availability at a time. This prevents the sea of checkboxes and cuts down on the database hit every time the manager makes an update.
- We break down availability by gender (for co-ed teams only).
- We added in availability tracking for practices and added subtle background highlighting to differentiate practices and games. We also added highlighting to show which player is currently being edited and included game and practice times.
Smugly, we started showing this version around to our early testers. Unsmugly, we returned to the drawing board after we discovered that problems remained:
- Visually, this is quite monochromatic and doesn’t subjectively “feel” very pleasant. To put it plainly, it’s kind of blah.
- We’re worried that users are going to forget to save their changes after clicking on the checkboxes. As a precautionary step we’ve disabled all the other navigation on the page so the user can’t click away, though we suspect this may be confusing.
- This screen is going to get very wide if a team has more than eight games and practices.
Version 3: A Prettier Face
Another few iterations later, after some heavy-duty design work and some re-jiggering of features, we came up with this version. We were pretty sure we had it perfect:
There’s a lot to like here:
- Better gradients and shading to break up the monochromatic feel, plus a distinctly shaded “Manager” column to distinguish the manager functions.
- Paging in the upper right to handle an unlimited number of games and practices, plus a filter in the upper left to allow the user to show all events, just games or just practices.
- Removal of some grid lines to open up the feel of the page and prevent it from being composed of nothing but tiny boxes.
We felt pretty good about this version. So good, in fact, that it became our operable template as we began building the Availability back-end in Rails. Soon, however, programming ground to a halt as we launched into what became known as The Great Debate.
The Great Debate
Our Creative Director felt very strongly that there should be only two states for Availability. Either you were available (green dot) or unavailable (no dot). He didn’t care if you were a “no,” a “maybe,” a “don’t know” or a “have to check with my spouse.” As a manager, he simply wanted to know: Can you commit to being at the game?
Our Development Director felt equally strongly that it was important to know if someone couldn’t be there. Without being able to distinguish between “no response” and “no,” you had no way of knowing who might show up and who wouldn’t.
After debating this internally for several days we did what we should have done in the first place: We called up a few team managers and asked them what they wanted. The results were unanimous. They wanted to know if someone wouldn’t be there. They wanted a red dot.
Victorious, we began to add this to the system, only to realize something very troubling: We now had three states (yes, no and unknown). Unfortunately, an HTML checkbox only has two states (on and off), so there was no way to represent the three possibilities. If a checked box meant “Yes, I’ll be there,” what did an unchecked box mean? It couldn’t both mean “I won’t be there” and “No response.”
For three-state choices, you need drop-down menus.
Bring on the Drop-downs
Frankly, we hated this next version. From a usability standpoint, drop-down menus require a lot of finicky pointing, clicking and dragging, which makes them slow to operate. They also require reading instead of iconic recognition, which makes them slow to parse. Functionally this worked. Feel-wise this was less than ideal:
We also explored the possibility of three radio buttons for each event, but rejected that as being absurdly cluttered, or in designer’s parlance “butt ugly”.
The Obvious Solution – Finally
Even better, by hooking the checkbox code directly to the database with some fancy AJAX wizardry, we completely eliminated the modal editing state. Instead, you are always in edit mode with no need for an Edit or Save button. Every time you click a checkbox your availability for that game or practice is immediately recorded to the database. It’s much simpler and goof-proof for users, yet these always-clickable checkboxes are so visually pleasing that they never feel overwhelming, even with many on the page.
We also use AJAX to immediately update the total available players count in the footer, adding a subtle blinking effect to visually confirm that the change has been recorded. Alas, a static screenshot can’t give you the emotional satisfaction of actually poking the AJAX widgetry yourself; if you want to try it out you can sign up your own sample TeamSnap team (for free) and give it a whirl.
This final version also has a few more visual tweaks:
- Player thumbnail photos, which make it much easier to visually parse who you’re looking at for each row.
- Some more visual and typographic changes to the list of games and practices in the header row, including colored flags to differentiate between games and practices/events.
- The inclusion of a help tip that appears when the user first visits the page (hidden in the screenshot above, but triggered by the blue “i” next to the paging icons).
Happy as we are with this version, we know that in the coming months we’ll continue to tinker to improve this screen further. There’s no such thing as being “done” in a Web application. Our users have already suggested ways in which Availability could be improved, including:
- An additional state for the checkbox, to differentiate between “Not Sure” and “No Response.”
- The ability to use the information from this screen to set game lineups, allowing the manager to “lock” availability close to game time and assign positions, as well as export a printable lineup card.
- Allowing players to set their availability by clicking on a link in an email, bypassing this screen altogether
These are all good ideas, and in the coming weeks we’ll be evaluating them to decide which can be implemented without making the basic functionality of the Availability screen too complex. Before adding any feature we look for the right balance of simplicity, power, utility and feel. Because no matter how handy a feature is, if it doesn’t feel right people won’t use it.
Getting from functional to “feels great” can be a long process, and sometimes it’s frustrating to tinker with existing features when you want to be adding new ones. But the payoff – a page that just looks and feels right to the user – is worth the time spent on each revision.