while cleaning out my email i found this old response to an interviewer for the now defunct cre@te online. he asked me what i thought of jacob nielson's 99% bad article (told you it was old...). here's what i wrote:
ah, you know, i'm not that interested in it and i don't really have any formal usability expertise. i'd rather not make an official statement...but as far as i'm concerned, usability is a habit, not a hard set of rules. it's about behavioural patterns, not correctness. if i'm the first person to walk across a field, i blunder through tall grass. if i'm the 500th person, i follow the path that others have created because it's the most usable way to traverse the field. the people's use of the environment forms a collective habit. if someone makes a paved road around the field that's longer than the path, you can call it the "correct way to cross the field", but most people will still use the path. in other words, usability evolves naturally...all you have to do is observe the patterns, document them, and implement them if you want the majority of users to have an easy time with your content. hence, most sites use a familiar textbox-with-go-button for searching. most doors have a knob at a standard height that opens the door in a predicatble way. but these patterns are not "right", they're just the most common solution to a particular problem. for proof, take an american to europe and ask her to turn on the lights...the light switch is different, and probably unusable for the american, but perfectly usable to the european. but once the american understands the system, the habit forms, and it's usable to both. "usable" isn't inhernet in a technology, it's a correspondence between a tool and the habits of the person that uses the tool. furthermore, "easy to use" isn't even a goal of many expressions on the web. sure it's important and worth discussing if you're selling books or staplers to the masses, but that's not really a keen interest of mine. i'm not really sure what all the fuss is about.
remember, most automatic bank teller machines have the worst interfaces in the world, and yet, everyone uses them happily every day because they want what's inside--so they form a habit to get it. once they cross the field a few times, the path forms...
andries odendaal, now famous for his isometric conjurings in flash, has developed one of the best flash games i've seen in ages: WhizzBall! play it here:
http://kids.discovery.com/games/whizzball/whizzball.html
in WhizzBall, you have to figure out how to roll a ball from point A to point B by placing tubes, jumps, teleports, etc around the playing surface. trick is, you can only use the specific pieces provided for each level. you even get to create and publish your own levels! last i checked there were 20, 000 levels. OMG! congrats andries...it's a work of art.
* update: the MovieClipLoader class is now a bonafide part of flash player 7. for complete information on the new class, see: Help > ActionScript Dictionary > MovieClipLoader. the new class requires flash player 7.
* update: ralf bokelberg has posted a flash player 6 implementation based on the class proposed in this petition. [download LoaderClass | read docs]
--
anyone who has tried to create a generic preloader for .swf files or .jpgs will almost certainly have horror stories to tell. if you do have such a story, please tell it here. this log entry's comments will constitute an official petition to macromedia to improve the state of content preloading in flash. i propose that a new api be created to make preloading generic and easy to use (see below). anecdotal evidence is good, real code examples are even better. please post your experiences.
here are just a few of the problems i have encountered:
1) when loadMovie() appears in a script, it doesn't execute until the end of the frame. this means preloading code must either wait a frame before it starts or try to detect whether the loadMovie() call has actually executed. neither workarounds are pretty.
2) there's no support for http server responses such as 404 (not found) or 403 (forbidden).
3) empty movie clips created at authortime have a byte size of 4. empty clips created with createEmptyMovieClip() have a byte size of 0. empty levels are undefined, and have a getBytesLoaded() return of undefined. hence most preloaders have to guess at a magic number when checking for loaded content...usually something like (loaded > 4 && loaded == total). this is arcane knowledge that an average developer shouldn't be required to know just to do something as fundamental as preload some content.
4) _framesloaded, _totalframes, getBytesLoaded(), getBytesTotal(), onLoad()....which to use??? the current system seems confusing and random to new flash programmers. only experts know how to preload content properly.
5) the MovieClip.onLoad() handler is wiped out by a loadMovie() call. hence, there's no object-oriented way to handle movie loading. there's not even a callback to respond to movie loading.
6) getBytesLoaded()/getBytesTotal() return the uncompressed size of the movie, which is not actually what's downloading (the movie might be compressed). download indicators that display bytes or kilobytes are often inaccurate because they show uncompressed sizes.
7) internet explorer and netscape have different getBytesLoaded() return values, as follows:
after loadMovie() appears in a script, getBytesLoaded() in the Standalone Player and Netscape returns:
-first 0
-then the real bytes loaded or
-eventually -1 if the file is not found.
but in Internet Explorer, getBytesLoaded() returns:
-first 0
-then -1
-then the real bytes loaded or
-eventually -1 if the file is not found
8) no ability to cancel a load in progress (for loadMovie(), XML, Sound, and LoadVars)
i'd like the flash community to stop wasting so much time on preloading. it's an important part of every single project, yet it's one of the least refined aspects of actionscript. for a sense of the backflips required to create a generic preloader, see my copiously commented "image loader w/ pan and zoom" at the code depot.
here's just a quick idea for a preloading API. i'm not trying to dictate what the final API should actually be...i'm just trying to show that there's a better way.
MovieClipLoader.onLoadStart()
MovieClipLoader.onLoadComplete()
MovieClipLoader.onLoadProgress (bytesLoaded,
bytesTotal,
kbLoaded,
kbTotal,
percentLoaded)
MovieClipLoader.loadClip(target, url)
MovieClipLoader.addListener()
MovieClipLoader.removeListener()
macromedia, please relieve developers everywhere of having to hack together their own loading systems that very often only partly work. thanks!!
colin moock (and the undersigned...)
webassist has released a free extension for adding paypal transaction support to your flash content. looks like a handy little utility. for info on how to use the extension, see the quicktime tutorials.
a few years ago, my good friend dave luxton had this great idea to store all your data and desktop config on a ring that you actually wear. that way you could sit down at any box and have your info and environment. then, this week at flash in the can, kevin lynch and i corrupted a file needed for his keynote. we needed to transfer a back-up from another machine in a hurry. so kevin pulls out a swanky m-systems diskonkey, and transfers the file. dave, we're almost there!
the manitu group, creators of ActionScript Viewer, have been busy lately. ASV, which entered the scene as a simple sneak-a-peek-at-your-code tool, has matured into a very handy companion to flash, worthy of any developer's attention. in february the manitu group released ASV 3.1, which can now convert the outline of any flash shape to SVG or to raw data for consumption by actionscript's drawing api (thanks to peter hall's drawing class). ASV can also extract the sounds, bitmaps, and symbols of a movie (handy if you lost or corrupted your .fla file). and, for the ultra-geeks, ASV will let you look at your ActionScript code in Flash Player bytecode form.
recently, the manitu group started producing plugins for ASV, so their complete product offering now includes:
ActionScript Viewer - ActionScript and Flash decompiler
URL Action Editor - update getURL() calls in your .swf without opening flash
ActionScript Replacer - change a block of code in your .swf file without opening flash
ASV IE Cache SWF Browser - retrieve .swf files from internet explorer's cache
ASV Projector Creator - create compressed .swf files and projectors for flash player 4, 5, and 6 (i.e., reduce file size for your movies or projectors)
next week at flash in the can i'm doing a presentation on multiuser flash content (using unity 2). details:
wed. apr 16
2:50-4:00 pm (presentation)
4:00-5:30 pm (q&a)
there's also a book signing event i'll be at monday from 6-8pm.
mr virus himself hoss gifford has just posted a new "viral marketing campaign" [gag] targetted at who cares what. damn funny. try this one, courtesy of the sex-not-flash guru himself. man, and to think three years ago i was in a client meeting with Royale Facial Tissues discussing how to keep their fridge magnet app "clean" for their delicate customer base. at least i got away with the toilet flushing...
we're not going to be releasing the harmony alpha as planned this week. i had to do some emergency server updates, so work on harmony was deferred.
amit pitaru has some lovely soundscapes on exhibit over at pitaru.com
trust master-of-the-mask erik-with-a-k natzke to come up with the world's coolest flash page turning effect in his latest work for hp. (the page effect is in the dreamworks section. but other stuff in the site is nice too.)
todd yard has posted a really neat component to animate text on a path. (link via onrelease.org).