18th
In response to my latest screed about Steam, Faruk Ateş wrote:
On the other hand, Valve’s first data from having Steam on Mac showed that it was already 5x as stable as Windows for Steam. Seems this is just early-stage growing pains; just make sure to bug-report it and give them some time, I’d say.
Well, that’s a possibility. But I think a stronger possibility is that this problem and all the others I’ve written about are an inevitable result of Valve having used a compatibility layer to develop Steam for Mac.
The job of a compatibility layer is to abstract the underlying system so that it’s less work to write code that runs on more than one platform. Your code says to the layer, for example, “Show an alert,” and the layer translates that request into the platform-specific code that displays an alert on whichever system it happens to be running on. Ideally.
But Steam’s compatibility layer seems to operate on a different level of abstraction from that. Instead of using OS X’s native alerts, menus, buttons, and so forth, it’s drawing them all on its own, and handling all the user interaction outside of the facilities the OS provides. Steam for Mac’s alerts aren’t normal OS X alerts; they’re just windows. Rather than allowing OS X to handle the modal behavior — which would automatically work right when, for example, a backgrounded app displays an alert — Steam’s compatibility layer just creates a window and then tries to enforce the modality on its own, which it does poorly.
What’s potentially worse is that this “faked” user interface can’t take advantage of any of the features real UIs on the Mac get for free, and which experienced users have come to expect. For example, the standard keyboard shortcuts for moving the cursor in a Mac OS text field don’t work, because Steam isn’t using standard text fields. And in other Mac apps, every word in every window is automatically accessible to vision-impaired users by way of VoiceOver, a text-to-speech tool built into OS X. But with Steam’s fake alerts, this fails, because VoiceOver can’t access the text. Play the above audio clip to hear VoiceOver trying to make sense of one of Steam’s error messages.
Compatibility layers are flawed precisely because of the abstraction that makes them appealing. Because they’re cross-platform, they can support only the bare-minimum subset of features that are common to each platform. They can’t provide the same level of control and sophistication that you could achieve by writing native code because the whole point is to keep you from having to write native code. But it’s precisely in that native code that good software excels. So by choosing to use a compatibility layer, you’re signing up to write mediocre software.
The process of building good software is that of making a million tiny decisions. Any reasonably sophisticated app will contain custom user interface elements; the challenge is integrating those custom elements in a sensible way with the rest of the platform. It’s a delicate balance between creating a powerful UI and one that doesn’t defy user expectation, and to achieve that there are no shortcuts. You need experience with the platform, and you need a kind of empathy that can’t be achieved by a piece of generic middleware.
That’s where Steam falls down, and I don’t see it getting up again anytime soon.
