| |
|
Excerpted from Designing From Both Sides of the Screen By Ellen Isaacs and Alan Walendowski Finally, implementation begins! You've designed a UI Spec based on the Functional Requirements, you've designed the underlying architecture based on both of those, and you've worked out some of the engineering details needed to support the UI requirements. You've got a Feature List divided into priority categories, and you're ready to start the Initial Development phase. We make a distinction between the Initial Development phase and the Iterative Development phase. In the Initial Development phase, you build the features as they were designed. You start with the Core features (the ones you absolutely need to start using the technology in a meaningful way) but without the supporting features that make the application more interesting to use. Once you have the Core set, you start to use the system yourself and build whatever Important features you need to let other people start testing it. Once you start to get usage feedback, you begin the Iterative Development phase on those initial features, while you also do Initial Development on other Important features. So every feature has an Initial phase, when it is first built, and most go through an Iteration phase, during which they are revised and polished to make them smooth and cooperative. The first half of implementation consists mainly of Initial Development, and gradually you shift more toward Iterative Development of existing features until all the features are implemented and polished. This chapter focuses on Initial Development, and as you'll see, some of the examples took place after we had collected information from the usage study on related features we had already implemented. This phase is an exciting time when your technology starts to come to life, but it also involves a lot of heads-down development to get the basic system working as designed. It seems pretty straightforward, except that as features start working, you find that certain aspects of your design won't work the way you'd hoped, so you have to adjust. This phase is when collaboration between the designer and engineer becomes especially close, as you work together to resolve problems so that both parties' concerns are addressed as well as possible. It usually takes some work to understand the crux of each other's concerns, but once you do, you can usually find an alternative approach that is acceptable to both. If an engineer designed your technology's user interface, that engineer needs to play the role of the designer when issues arise. Of course, that can be difficult if the issues involve that engineer's features, which is why it helps to have someone dedicated to the designer role. If you can't manage that, perhaps another engineer on the project can play the role of user advocate on technical issues that arise in the engineer-designer's features. In the following sections, we discuss examples from Hubbub, focusing on unanticipated issues that affected the user interface and how we handled them. We describe some cases where we resolved the issues on engineering grounds, working around them in the UI, and some cases where we did the reverse. Sometimes UI issues arose that Ellen hadn't anticipated in the UI Spec. Other times Alan didn't foresee the implications of his decisions for the UI, but later we discovered unanticipated effects (not always negative, as it turned out). We discuss these types of examples and others, focusing on how we tried to resolve the issues by balancing the cost of engineering with the value of the usability improvement. These examples illustrate some lessons we've learned about managing this delicate balance, and about the process of collaborating to make these decisions. Issues Resolved on Engineering Grounds Initially, Alan and Dipti were able to get the Core features working as planned. After all, we'd spent a lot of time planning the UI design and architecture to make sure that these features could be implemented. But then a few issues started to arise issues that affected either subtle aspects of Core features or more obvious components of Important features (which got less attention during our planning phase). In the majority of cases, we were able to modify the UI to accommodate the engineering issue while still behaving like a butler.
Example: Edge Cases Versus Common Cases
This conversation was representative of many we've had. Alan is concerned about the edge cases someone having dozens of conversation screens open, each with thousands of messages in them, and never closing any of them. He's worried about having no limit at all. Ellen is thinking about the common case figuring that Palm users may have as many as five or six simultaneous conversations at the outside, with few of them going longer than, say, 50 messages. Neither of them says so explicitly. Instead, Alan just asks about scrolling back to the beginning of conversations, which Ellen thinks is important in her scenario. By getting specific about numbers, we realize that we're worrying about different orders of magnitude. Setting a high limit by Ellen's standards makes both of us happy because Alan gets his limit and Ellen handles the vast majority of cases. Remember, you might be able to construct a scenario of the rare case happening, but you don't have to design for that case, you just need to handle it. In other words, those cases shouldn't cause the system to break, but don't sacrifice the user experience in the common case to handle those rare cases.
We've seen many cases when a designer shows or describes a design to an engineer, who assumes it has to be implemented literally as described, and then declares that it can't be done. While it may be impossible to implement as described, you can usually find a design that would provide the important attributes of the feature. If the engineer can explain which aspects of the design they object to, and if the designer can explain which parts are critical for the experience they're trying to create, they can usually find a variation that works reasonably well for both. This is why it helps for designers to develop a general understanding of the relevant technical issues. If they don't, they will have trouble communicating their needs in terms the engineers can work with. On the other hand, engineers should respect the designer's judgment on issues relating to user behavior. Since everyone is technically a "user," many people are tempted to assume that they know how users behave, but it is the designer's job to know, so their judgment should prevail unless solid evidence indicates otherwise.
Example: Implementation Effort Versus Usability Value
The goal of the design was to let users see how they appeared to others at all times. The reason for this is that people are less likely to feel that their privacy is violated if they can see and therefore control the information others can act upon. The important thing was to make sure users could see their own entry, and the split pane had the nice attribute of making sure it never scrolled out of view. After a little while, Dipti showed Ellen an interim version of the client with the Self pane partially implemented.
Ellen: I noticed that the Self pane has a few problems. Do you know why it's gray instead of white? Also, I noticed that you can resize the pane, but it should stay a fixed size.
Here was a case where the effort was not worth the value of the design. Probably this design could have been implemented more quickly if Dipti had been further along her learning curve, but the engineer's level of experience is just another variable. We didn't know up front that this design would prove to be problematic, but once we found that it was, we modified the UI to avoid the engineering issue.
Effort versus value is a common tradeoff. It's often difficult to anticipate the problems you'll encounter, so it helps for the designer and engineer to stay in close touch so you can jointly decide to adjust the UI if the initial approach turns out to involve more effort than it's worth. Some engineers will take it as a challenge to make the software bend to their will, but it's more important to spend your energy on the work that is most likely to help users.
Example: Implementation Time Versus Usability Value
This example came up after we'd finished the Core features and were starting on the Important features. The UI Spec indicated that a user could turn off the sounds of individual bubs, and that those settings would be remembered across all of that user's clients.
Alan: How important is it that setting the mute state on one client sets the mute state on all of that user's clients?
As it turned out, during the usage study we found that it wasn't necessary to save per-bub mute status across clients. Although some people were surprised at first that their settings weren't preserved on another client, as Alan guessed, they soon found it handy to set them differently on different machines. For example, one usage study participant on the East Coast worked with colleagues on the West Coast, three hours behind her. On her work machine, she turned on the sounds of most of her colleagues. At home, she turned off the sounds of many of her East Coast colleagues, figuring she didn't need to stay in touch with them after work. But she did listen to the sounds of her West Coast colleagues because it helped her stay in touch with them while they were still at work. This is just the type of scenario that's hard to predict in advance.
In this case, we saved time by implementing the simple version of a feature, figuring we would build the more complex version if it became clear that it was worth the effort. We were fortunate that the code to do the simple version would still be needed for the complex version. It would have been a harder decision if the complex version would entirely replace the simple one, but it still might have been worth it.
This is also a wonderful example of the value of studying the system in use before releasing a product. Knowing we'd be getting real user data during the usage study made it easier for the team to reach agreement, and in the end, it saved us the implementation effort of doing the complex version of this feature. There were other cases when it turned out that we did have to handle the more complex case, but at least we knew that the time and effort were well spent. Still, it's surprising how often the simple version of a feature is sufficient.
Example: Expediency Versus Ideal User Experience
Alan: Why don't we just do the administration stuff on the Web? Otherwise, we'll have to do it separately on both clients. Everybody uses the Web for this stuff now. [Follow Conventions]
Time passed. We began the usage study, and a few months into it we needed to let the participants manage their accounts (add and remove bubs, change their passwords, and so on) rather than handling their requests manually. Still, we had more work to do to refine existing features, and an experienced Web engineer contacted us looking for contract work. We decided to implement the administration features on the Web for reasons of expediency. This meant Ellen had to design the Web site to handle those features, and then work with the contractor as he implemented them. Ellen is still not delighted that we used a browser to handle adding and removing bubs, setting permissions, changing account information, and so on, but it did allow us to release Hubbub sooner. It also allowed us to iterate and add new administration features without having to make people upgrade to a new client.
Issues Resolved on UI Grounds
In the previous examples, the engineers ran into a problem that made it difficult to implement the UI as specified, and we adjusted the UI to accommodate the concern. In other cases, an engineering issue arose but we decided to stick with the UI design and work around the engineering problem. Usually, the objection was not so much with the difficulty of implementation but with the amount of effort, usually tedious effort. Again, the engineers wanted justification that the effort was worth the usability gain.
Example: Tedious Work Versus Polish
Ellen: Did you notice that the messages are starting out at the bottom of the screen and moving up?
Example: More Tedious Work Versus Completeness
Ellen: I was playing with the offline e-mail feature and I realized that once you've written a sixth line, you don't get a scrollbar, so there's no way to scroll back up to the first line. Doesn't the toolkit automatically display a scrollbar when a text area extends beyond the space provided?
In both of these cases, Alan resisted because it meant doing tedious implementation work rather than more interesting features. Often, development toolkits handle things such as scrolling, but when they don't, the application engineer gets stuck with the duties. In these cases, we agreed that making the features behave cooperatively was worth the effort. (We wouldn't expect a butler to tell us that we can't edit the early part of our messages.) We also agreed to stick to our guns and not put off the work off until later.
In preparing to write this chapter, we made a long list of the issues that arose because of engineering concerns, and we were surprised to find that nearly every time, we resolved the issue by modifying the UI. It was hard to find cases where we stuck with the UI as it was, and those usually came about because the platform didn't include support for UI behavior that was just plain boring to implement. Nonetheless, Ellen is hardly known for being a pushover and she certainly felt as though Hubbub was being built as she had designed it. We realized this happened because the UI had been specified up front and the architecture had been built to support it, so the critical aspects of the user experience were built into the system. When issues arose, they involved features that were less critical to the system's usability and so there was room to compromise.
(continued...)
|
(c) 2002 Ellen Isaacs and Alan Walendowski