Coding Horror

programming and human factors

Where the Heck is My Focus?

The web is quite mouse-centric. Ever tried navigating a typical website without your mouse? I'm not saying it can't be done-- if you're sufficiently motivated, you can indeed navigate the web using nothing but your keyboard-- but it's painful.

There's nothing wrong with the point-and-click navigation model of the mouse, although it can degenerate into mystery meat navigation if you're not careful. I don't expect web designers to create keyboard-centric websites; the mouse is a natural and intuitive enough way to navigate web sites. But so is the keyboard, in certain circumstances. What frustrates me is when web developers fail to pay attention to the most rudimentary of keyboard support in their designs.

Let's pick on eBay. Here's the eBay signin form.

eBay sign in form in Internet Explorer 7

This form is a perfect example of keyboard navigation trumping mouse navigation. Done right, it reduces user interface friction to a minimum:

  1. Type your user name
  2. Press Tab to advance to the next field
  3. Type your password
  4. Press Enter

Of course, that assumes the user knows how to use the keyboard. In my experience, this is not a safe assumption. I've seen many users log in using the excruciatingly slow mouse way, and it's not pretty. At the risk of creating a legion of back seat drivers, I suggest that when you see coworkers users using the mouse to log in, you should gently-- gently-- let them know that they might be able to save some time by sticking with the keyboard for these little online forms. I'm not saying you should go commando, but a tiny bit of keyboard expertise will serve you in good stead.

This is an incredibly simple little login form. And yet there are at least three ways web developers can screw this form up for keyboard use. That's why I added the caveat done right, above. It almost never is, and keyboard users always seem to get the shaft. To make this HTML form work properly with keyboard input, the eBay developers have to:

  1. Set the focus to the first field so I can start typing in my user ID.
  2. Structure the HTML form fields so that when I press the Tab key, it advances through them in a logical order.
  3. Ensure that the HTML form submits when I press the Enter key.

You might expect the tab order on the eBay login form to proceed in the same order you read the form (in Western cultures, anyway):

eBay sign in form, expected tab order

If so, you would be wrong. I guess two out of three ain't bad. The tab order, for some unknown reason, goes directly from Password to the Sign In button, completely skipping over the "remember me" checkbox directly under it. This is a mild omission, to be sure. I've seen far worse, web forms with tab orders that resembled a Rubik's cube. But tab order on a login form is so fundamental -- when web developers screw up basic tab ordering on a form with four fields, that's veering dangerously close to "I don't give a damn about my craft" territory.

All the developers you know remember to test their web forms using the keyboard. Right?

But even if developers do remember to test for basic keyboard behavior, there's a deeper problem here. Keyboard navigation relies heavily on the focus. In order to move from one area to the next, you have to be able to reliably know where you are. Unfortunately, web browsers make it needlessly difficult to tell where the focus is. Can you tell which field has the focus in Internet Explorer 7?

eBay sign in form, IE7, closeup

I think it's fair to call that incredibly subtle. Let's see how Firefox 2 does.

eBay sign in form, Firefox 2, closeup

Wow. Good luck with that. Now how about the same form in Safari 3?

eBay sign in form, Safari 3, closeup

No wonder users rely on the mouse so much. Most browsers do an embarassingly bad job of making the focus obvious, so users feel compelled to click on fields to orient themselves.

The focus behavior is just as bad when the focus moves to the sign in button. It's technically an image masquerading as a button, but this is still a fairly common technique; it should be handled well. Is it?

focus-button-ie7 focus-button-firefox2 focus-button-safari3
Internet Explorer 7 Firefox 2 Safari 3

Of the three, only Safari really gets focus right in my estimation. Here's hoping the next versions of Firefox and Internet Explorer copy this more obvious focus indicator. If users can orient themselves using a clear, unambiguous focus, they're a lot more likely to warm up to a little time-saving keyboard navigation.

Discussion

The Years of Experience Myth

I recently received an email from Andrew Stuart of the Australian firm Flat Rate Recruitment. Andrew related their technical phone screen process, which is apparently quite similar to the one outlined in Getting the Interview Phone Screen Right. I'm glad to hear it works. A proper phone screen is critical. I completely agree with Andrew: you should be 95% certain that a candidate would be a great hire before they ever set foot in an interview room. Anything less is a colossal waste of everyone's time.

But there's one aspect of the recruiting process that often goes awry, even with a great phone screen in place. Andrew presented an excellent anecdote in his email that explains it better than I can:

I had a client building an advanced security application. I sent them person after person and they kept knocking them back. The reason was almost always because the person "didn't have enough low level coding experience." The people I sent had done things like design and develop operating systems, advanced memory managers and other highly sophisticated applications. But my client wasn't interested. They required previous hands on low level coding experience in a particular discipline. Eventually I got an application from a very bright software engineer who almost single-handedly wrote a classic computer emulator, but had little or no low level coding experience in the particular discipline they required.

I told the client, "I have a great guy here who has no experience doing low level coding and I think you should hire him." They were extremely skeptical. I pushed hard to get an interview. "Look, this guy is a superb software engineer who doesn't have low level coding experience in the particular discipline you require now, but if you employ him, within 3-6 months you will have a superb software engineer who does have the low level coding experience you're looking for."

They interviewed him and gave him the job. Within a matter of weeks it was clear he was the smartest programmer in the company. He quickly mastered their low level coding and his learning went well beyond that of the other coders in the company. Every time I talk to that client he raves on about this employee, who is now the technical backbone of the company. That company no longer focuses its recruitment on candidates that exactly match previous experience with the required technologies. Instead they focus on finding and employing the smartest and most passionate engineers.

This toxic, counterproductive years of experience myth has permeated the software industry for as long as I can remember. Imagine how many brilliant software engineers companies are missing out on because they are completely obsessed with finding people who match-- exactly and to the letter-- some highly specific laundry list of skills.

Somehow, they've forgetten that what software developers do best is learn. Employers should be looking for passionate, driven, flexible self-educators who have a proven ability to code in whatever language -- and serving them up interesting projects they can engage with.

It's been shown time and time again that there is no correlation between years of experience and skill in programming. After about six to twelve months working in any particular technology stack, you either get it or you don't. No matter how many years of "experience" another programmer has under their belt, there's about even odds that they have no idea what they're doing. This is why working programmers quickly learn to view their peers with a degree of world-weary skepticism. Perhaps it's the only rational response when the disconnect between experience and skill is so pervasive in the field of software engineering.

With that in mind, do you really want to work for a company that still doggedly pursues the years of experience myth in their hiring practices? Unlikely.

Which leads me to my point: Requiring X years of experience on platform Y in your job posting is, well, ignorant. As long as applicants have 6 months to a year of experience, consider it a moot point for comparison. Focus on other things instead that'll make much more of a difference. Platform experience is merely a baseline, not a differentiator of real importance.

In turn that means you as an applicant can use requirements like "3-5 years doing this technology" as a gauge of how clued-in the company hiring is. The higher their requirements for years of service in a given technology, the more likely that they're looking for all the wrong things in their applicants, and thus likely that the rest of the team will be stooges picked for the wrong reasons.

I'm not saying experience doesn't matter in software development. It does. But consider the entire range of a developer's experience, and realize that time invested does not automatically equal skill. Otherwise, you may be rejecting superb software engineers simply because they lack "(n) years of experience" in your narrow little technological niche-- and that's a damn shame.

Discussion

Extending Your Wireless Network With Better Antennas

When I set up my new Xbox 360, I also connected it to my existing wireless network. It's about 50 feet from my access point, with approximately 4 or 5 walls in between. I was able to get online, but barely. The signal strength indicator was at literally one bar of strength, and the signal graph was about close as you can get to no connection while still having a connection. That marginal WiFi connection was enough to get me to Xbox Live. But I also wanted to take advantage of the impressive Xbox 360 media extender functionality – to connect to my existing Vista Media Center home theater PC to listen to music or watch videos. That definitely requires a better wireless connection.

I've already positioned everything as optimally as I can; the only thing I could think of to improve the signal even further was to upgrade to better, more powerful antennas. Note that my Xbox is in an outside room that is not physically connected to the house, so a wired connection isn't practical.

I did some web searching, and I found that wireless networking feels more like an art than a science. There are just so many variables:

  • the physical layout of your equipment
  • the environment
  • interference from other wireless networks
  • the firmware and configuration of your networking hardware

… and so on. It's almost impossible to tell if an antenna will work until you buy it and run network strength tests in your particular environment.

There are a few recurring themes, though. One is the "cantenna"; there are many variations of this design on the market.

the classic cantenna WiFi antenna design

As you can see from the picture, the "can" in the name refers to the fact that these antennas can be built with the exact same kinds of cans you'd find at your local grocery store. This one looks like a Pringles potato chip can, and it's a very popular style. Lots of smaller vendors sell variations of this design. Reviews of the archetypal cantenna design show good results, but it is highly directional – you have to point it at the target, and it's only truly effective in that direction.

Part of the appeal of the cantenna is that you can build them quite easily yourself. This comprehensive homebrew antenna comparison showed that self-built cantennas can perform extremely well, if you follow waveguide theory when you build them:

The results surprised me! In our test, the Flickenger Pringles can did a little better than my modified Pringles design. Both did no better than the Lucent omnidirectional. Now this is just on raw signal strength, noise rejection due to directivity still makes a directional antenna a better choice for some uses even if there is no gain benefit. The waveguides all soundly trounced the Pringles can designs. I mean they stomped them into the ground on signal strength - as much as 9 dB better. Every three dB is a doubling in power - that's three doublings (8x increase)!

With these results, I'm convinced that the waveguide design is the way to go for cheap wireless networking. The performance is good, the cost is very low and the skill required is minimal. If you can eat a big can of stew, you can make a high performance antenna.

If you're interested in constructing a waveguide cantenna, I found this excellent detailed guide, with lots of step by step photos, a JavaScript size calculator, and recommended off the shelf cans you can buy to start with.

There are, of course, any number of commercial aftermarket WiFi antennas to choose from, too. If you're interested in upgrading, first make sure your router has a removable antenna.

router with removable screw-on antenna

Next, determine what kind of connector the antenna uses on your router. There's an excellent wireless antenna connector visual guide here; the RP-SMA and RP-TNC connectors are common, but it does vary. You'll want to make sure you have the right connector "pigtail" cable for whatever antenna you buy, unless it happens to use the same native connector type. My router uses a RP-SMA connector.

After you've gathered this essential information, your goal is to replace your generic, stock – dare I say wimpy – router antenna with something better.

a default wifi antenna

There are lots of aftermarket upgrade antennas to choose from, but I am a sucker for Hawking models. I've used their portable Hi-Gain Wireless USB adapter for years; its compact folding directional antenna is a marvel at picking out signal from the noise. They have a lot of antenna designs to choose from; let's compare:

hawking hai6sip antenna model
HAI6SIP
6 dBi 3" x 3" x 11.6" $32
hawking hai7sip antenna model
HAI7SIP
7 dBi 3.4" x 3.4" x 8.9" $40
hawking hai7md antenna model
HAI7MD
7 dBi 2.8" x 2.8" x 6.1" $38
hawking hai8dd antenna model
HAI8DD
8 dBi 5" x 5" x 5" $50
hawking hai15sc antenna model
HAI15SC
15 dBi 2" x 3.9" x 8.6" $45
hawking hao14sdp antenna model
HAO14SDP
14 dBi 1" x 3" x 9" $83

This is only a brief summary of the most likely indoor antenna models; Hawking has a bunch more antennas to choose from on their web site. Be careful, because customer reviews are all over the map on these things, which says more about the immense number of variables in wireless networking than it does about the antennas themselves. I chose to go with the HAI7MD model, which I thought had a nice blend of some directionality, compact size, and performance/price. I also like that it can be detached from its little stand and connected directly to the router in lieu of the stock antenna, if you don't need the positioning flexibility the stand provides.

Here are my results from the media extender network test. The test is a bit variable because I'm experimenting with the antenna positioning to see what produces the strongest connection.

Windows Media Center network performance monitor, positioning test

Before I added this antenna, that white line would have been just above the bottom-most black line on the graph. That's how bad it was. Upgrading my antenna increased my wireless networking connection strength by about 5x. Here's the final result as shown in the Media Center extender network performance monitor test screen:

Windows Media Center network performance monitor, final stable result

As fantastic as this improvement is, now I'm tempted to go back and buy that really huge HAI15SC corner antenna to see how much better it can get. At any rate, if you're looking to improve your wireless network performance, definitely consider aftermarket antenna upgrades. In my experience, a better antenna can make the difference between a completely marginal connection and a rock solid connection.

Discussion

DRM Ignorance is Expensive

I recently became the reluctant owner of an Xbox 360. Limping along with my ancient Playstation 2-- I remember buying that thing on launch day way back in 2000-- was no longer viable in light of my Rock Band addiction. I've been avoiding a new console purchase for as long as humanly possible, but the version of Rock Band offered on the PS2 is almost criminally crippled: it offers no downloadable content, no band customization, and a barely-there practice mode.

Although it was expensive, I've been quite happy with my Xbox 360 upgrade overall. I bought the Xbox 360 Pro value bundle, so I own the more modern, much quieter "Falcon" revision of the console along with two games. The optional VGA adapter works perfectly with my projector setup at 1024 x 768, and the Xbox Live internet experience is quite impressive and polished by now. I do wish WiFi was included in the box, rather than being yet another $90 accessory I have to buy, but hawking overpriced accessories is just the way the console economy works -- you have to factor the required extra controllers, memory cards, charging stations, audio/video cables, and so on into the overall cost of ownership. That's the way it has always been for every console I've ever owned, going all the way back to the Atari 2600.

Xbox 360

I've purchased lots of downloadable content on the Xbox 360 at work, primarily new songs for Guitar Hero 2, Guitar Hero 3, and Rock Band. I foolishly assumed all along that it would be no big deal to transfer that purchased content if I ever purchased an Xbox 360 for my home.

Big mistake.

I didn't realize how precarious my understanding was of Xbox 360 digital rights management was. If, like me, you believe that in the future..

  • most consumer devices will not be complex general purpose computers, but simpler fixed function devices
  • all content will be downloaded
  • the hardware will be tightly controlled
  • the delivery network will be private and commercially locked down

.. then for better or worse, products like the iPhone and Xbox 360 represent the future of computing. Apple has already taken us quite far down this road, with tremendous commercial success. Thus, it behooves us to understand precisely how the Xbox 360's mature, mainstream DRM model works. The Xbox 360 may or may not be around in five years, but it is quite likely that some form of its DRM will be.

Let me break it down for you, so you don't make the same naive mistake I did. All content you purchase and download on the Xbox 360 is keyed to two specific things:

  1. The hardware signature of the Xbox 360 you purchased the content on
  2. The Xbox Live profile that you purchased the content with

If you keep these two variables in mind, it's easier to understand why things work the way they do. Also, remember that any Xbox Live account is inherently "online". You're logging in to a secure internet validation server every time you buy anything through your Xbox Live account.

It's not quite as dire as it sounds, though. Pick your dongle:

  1. Xbox 360 hardware dongle

    All purchased content is available for use by any account on that particular console you purchased it on. You can share ownership of that content with anyone else who has physical access to your Xbox 360, whether their account is local (offline) or Xbox Live (online). Note that if your console hardware signature ever changes-- say, if your console fails and you get a replacement-- you're in trouble.

  2. Xbox Live profile dongle

    As long as you're logged in to Xbox Live (and thus by definition using an Xbox 360 connected to the internet), you can re-download purchased content and play it on any Xbox 360. How do you transport your profile? Through the removable hard drive or a memory card. The hard drive works best, as you'll save yourself some download time.

It is not possible to copy an Xbox Live profile; every login writes a unique key to the profile, and all subsequent logins validate the expected key. It is possible to perform an "account recovery" and move the account, but doing so automatically invalidates any other copies of the profile. The cardinal rule is this: there can only ever be one valid physical copy of an Xbox Live profile at any given time. Duplication is not allowed and rigorously enforced server-side.

The user penalty for hardware failure, however, is pretty severe; it sounds like iTunes has a better hardware failure recovery model for its song DRM:

Microsoft has every right to protect their content, but to punish those who have had their consoles replaced due to failure is unacceptable. I see threads appear daily on all the popular forums about this issue. Typically it takes three to four weeks to get consoles replaced by Microsoft. Little do these users know their [newly repaired Xboxes will appear to be someone else's Xbox to the DRM].

I don't intend to provide a solution to the problem here. I only want to bring attention to the issue. I am sure an iTunes like approach could be implemented where users can "authorize" and "deauthorize" the console tied to their content. I am just surprised that a software company like Microsoft cannot find a better solution than creating dummy accounts and asking users to call 1-800-4-MYXBOX time and time again in the hopes of getting their points refunded just so they can access their content offline.

Getting back to my specific problem: how do I transfer the licenses for all those songs I bought to my home Xbox? I experimented with Microsoft's recommended solution of storing my Xbox Live profile on a memory card, but this meant I'd be schlepping a memory card dongle back and forth from home to work in perpetuity. That's not practical or tenable.

In the end, I broke down and re-purchased 11,240 MS Points worth of Guitar Hero 2, Guitar Hero 3, and Rock Band songs through my personal Xbox Live profile on my home Xbox 360. If you're keeping score at home that's $140.50 in real money. To buy the exact same content. Again.

I have nobody to blame but myself, I suppose. DRM sucks, but it's unavoidable and arguably the future, in the form of ubiquitious consumer devices like the Xbox 360 and iPhone. I'm not asking you to like it. Nobody likes it. But at the very least understand how it works, because as I recently found out, DRM ignorance is expensive.

Discussion

A Lesson in Apple Economics

A new in box Apple //c system was recently sold on eBay. This is quite remarkable; a vintage computer-- twenty-three years old-- that has never been opened. The people who ultimately won the auction posted a beautiful set of unboxing pictures. For a brief moment, it was 1984 all over again.

On Thursday night, Kathryn and I unboxed my latest eBay acquisition: an Apple //c. There are many vintage Apple II computers available for auction, but this one is special: It's never been opened. Ever. It hasn't seen the light of day since before it was shipped on May 5th, 1988.

Apple //c love

I wrestled with whether I should open the box, or store it and let it accrue collector's value. In the end, I decided that the reason for my purchase wasn't financial. My very first computer was an Apple //c, and I can't see wanting to part with this computer, ever.

It also happens to be the first model of Apple computer I ever owned, so the nostalgia is pretty intense for me, too. The owner paid $2,553 for the the privilege of owning and unboxing this Apple //c. Another vintage computer enthusiast expressed some dismay over the final price:

When I encountered the auction there were 31 minutes left and the bid was at $920. Too rich for my blood these days, sadly. But I was racked with pain in being unable to bid. I felt a little better when I saw the final auction ending price.... $2,553.00. To lend some perspective, back in 1984 the retail price of the Apple //c main unit was $1299. A rare find that went for a rather exorbitant amount.

Exorbitant? Hardly. The $1,299 that an Apple //c originally sold for in 1984 should cost about $2,670 in 2007 dollars, after factoring for inflation. I'm not sure what AppleWorks and the monitor originally sold for, but it's amazing how precisely the final auction value tracked the adjusted for inflation value of this 23 year old computer.

It wasn't until the Macintosh line was introduced that Apple products got exorbitantly expensive. The original 1984 128k Mac model was $2,495, and the 1985 512k Mac was $2,795. Expressed in 2007 dollars, that's $5,100 and $5,700 respectively. Like all young geeks, I was instantly enamored with the advanced capabilities of the Mac line, but it was financially beyond the reach of my family. I'm not sure I knew anyone that owned one of the original Macs; that's how far outside the realm of possibility they were, at least in the social circles we moved in. Instead of upgrading from an Apple // to the prohibitively expensive Mac series, I convinced my family to buy me an Amiga 1000 for $1,295 in 1985. Even with the 256 KB memory upgrade and the color monitor, it ended up being about the same price as an Apple //.

So I guess this is my point: many pundits forget how expensive Macs really were in the 80s and early 90s. For a very long time, Macs were the exclusive province of the upper middle class. It wasn't until Jobs returned in 1997, and Macs began adopting more and more commodity PC technology over time-- culminating in Apple's reluctant 2005 adoption of Intel CPUs-- that pricing parity was eventually restored. Today's Macs are quite competitively priced, largely because they are (well designed) commodity PCs.

Discussion