Archive for the ‘design’ Category

The iPod is missing one feature…

Monday, March 6th, 2006

...and I don’t think Apple is ever going to put it in.

I read an article on Wired that discusses where Apple’s entertainment division is going next now that there are no more features to be added to the iPod. Basically, the author says that since Apple hasn’t added a new feature to the iPod this year that is a sign that they’re slowing down, that they’re feature complete.

Nope. The killer feature that Apple could add to iPods is wireless connectability. I believe it is the killer feature. Imagine being able to put two iPods side-by-side and have the little beasties communicate and give their users the ability to swap songs. Easy as pie. “Select the songs you want to transfer.” “Click here to transfer.” “Transferring…” “Done!”

I understand the author isn’t saying that he thinks iPods don’t need features anymore… that it’s Apple that is saying it. Still… imagine how cool it would be to transfer songs with your friends! C’mon, Apple!

Of course the RIAA might have something to say about that… ( =

The Holy Grail

Tuesday, January 31st, 2006

...of CSS: A 3-column layout entirely in CSS that puts the content first where every column’s size is independent and, by the way, the layout has footers and headers.

Yup, “Holy Grail” sounds way better.

Truly the best part of the List Apart article is the step-by-step deconstruction of the effects of each CSS tag. Sweetness.

Unit testing UI thoughts (hopefully part I)

Monday, January 9th, 2006

I’ve been thinking a lot about how to [tag]unit test[/tag] [tag]UI[/tag]s in [tag]C#[/tag]. There’s this trope that I hear again and again from developers: “Unit testing a user interface is nigh impossible.” I think anyone who has worked with thick client UIs(user interfaces) should go and have a looksee at the programs available for testing the user interaction with those UIs. Most of them rely on pixel-interaction and, on Windows, sending fake Windows messages directly to the message pump of the application being tested. Both of these methods seem error prone and like deadweights around the neck of an [tag]agile[/tag] process. In a sense, these kinds of heavy user interface tests are a rigid kind of documentation of a UI and not a very expressive one at that.

One of the things I like best about NUnit is that the unit tests become declarative statements about the units being tested and, by extension, the program itself. The unit tests become a sort of negative space around the map of the correct functionality of the units and serve to document those units in a very expressive way. Each small test not only gives the assurance of correct functionality but serves to define what that functionality is and explain it to the reader. The tests play multiple roles: as guarantees and as documentation. That is fantastic.

I think a tool that could help test UIs would also serve multiple purposes. I think that it would not only help define proper interaction and proper states but also help keep UIs standard across far-flung organizations.

So why isn’t there a tool like that for testing UIs? I think, in part, because people become wrapped up in the presentation of a user interface and forget that there’s a logical structure underneath it all, waiting to be exposed. I’ve heard many times that, “If only the UI was built more as an MVC then we wouldn’t have this problem.” Wrong. An MVC exposes a model in a view whose interactions are externally controlled, sure… but I don’t think this particular design pattern is flexible enough to simultaneously maintain proper UI state, make a programmer’s job easier, and enforce UI standards across an organization. We need something that will address all those at once.

Maybe a correct approach is to think of most UIs as a kind of state machine (or maybe several interlocking ones if that is simpler). Each piece of the UI mosaic contains state (enabled/disabled, checked/unchecked, valid/not valid) that relates back to the whole and can be used to draw conclusions about that whole (user can enter text here but not here, user can click there but not there, etc.). I think this state machine is separate from the model and the view and shouldn’t be in the controller at all. It should express concepts about the UI, and contexts about the UI, without specifying “button this” or “menu that”.

To segue a bit… I’ve also been using Spring, a very cool IOC/DI(dependency injection) tool, which has taught me that a simple shift in paradigm can reap enormous benefits. Utilizing Spring has made my development life much more pleasant: my objects are more testable, my interfaces more meaningful… in general, the app is much more flexible. By using Spring and adapting the code just a little bit I feel like the codebase has greatly improved.

In that way it is similar to Rails. All that Rails asks is that you, the developer, shift your focus a bit and follow some conventions. The leverage that it provides as a framework creates enormous productivity gains while the models it provides engender a paradigm shift in what I think is the right direction: less grunt work, more concept work.

Which all brings me back to my pie-in-the-sky UI testing guy (Rhyming is Good): Who wants to hand check every UI that the team produces to make sure that it is pixel perfect in order to match UI standards for a company? Who wants to spend time adapting UI tests because usability tests indicated that the buttons should be a bit narrower and shifted down a few pixels thus throwing off the auto-clicker UI tester? Who wants to spend concept time doing the grunt work of tracking down why the damn “Save” menu item is enabled when the user hasn’t dirtied the editing window yet? Man, not me.

So here we are. I think good UI unit testing has to follow these rules:

  • Be a framework. Ask the developers to give up some ground and the maximum flexibility provided by their programming languages so that the framework can transmute a little prior knowledge into a big win at UI time.
  • Enforce a logical context separate from the view, model, and controller. Consider that most languages that define UIs in thick clients smash together the view and controller by default (Windows forms, anyone?) and you’ll see that if this isn’t made drop dead simple most developers will fight it. Enforce the idea that the user’s interface exists in a logical space that is separate from anything found in UI control libraries.
  • Declare and document functionality. Any UI tests should not just exercise the user interface but should also define it. Don’t just verify what it does, state what it does in a compiler-enforceable language.
  • Enforce arbitrary standards. I should be able to define any wacko standards that I wish easlily and declaratively. They should be in code just like the tests themselves.

Kickass Usability Site

Saturday, January 7th, 2006

Dive into Accesibility is one of the coolest web usability sites I’ve seen in a long time. It has great little gems like the Lynx viewer (what does your site look like using Lynx to give you an idea of what people with visual disabilities hear first?) and Vischeck, a neato interface for seeing what your site looks like for people with varying forms of colorblindedness.

Frickin’ sweet. So that’s what this guy did after writing “Dive into Python”. Heh.

Weird flash games and other cool designs

Tuesday, September 20th, 2005

Found this really weird set of Flash games that are surreal and strangely engaging.

Found it by going here (this guy hates the Kubrick theme… design your own, he says) which led me here and here (love the design on that last one) which finally led me to Eyezmaze.

Frickin’ cool.

God of War

Sunday, August 14th, 2005

God of War is hands-down one of the best video games I’ve ever played. Beautifully brutal, endlessly gory, with gameplay that is seamless (no loading screens!) and a combat system that just barely keeps it from being a no-brainer button masher… this game has it all. It even has a more-than-slightly engrossing storyline: the character of Kratos is well-conceived and pretty well executed within the confines of the game itself through a combination of flashback movies (nothing new), foreshadowing (very nice to see in a video game), and even some in-game mechanics.

The production designer deserves a big pat on the back, too: the game immediately creates this lush, decadent feel of Ancient Greece. Except for one easily overlooked flaw (Roman Legionnaires in Ancient Greece?) the games mood and theme are presented wonderfully.

Nice job, guys.

The coolest thing on the web ever

Friday, April 1st, 2005

Have you seen The Zoom Quilt? It is easily the coolest thing I’ve seen on the web ever.