Four recent articles in Business Week that – to my mind – all circle around a common topic.
The article Motorola: Left to Its Own Devices describes Motorola’s declining fortunes, largely because customers do not particularly like their cell phones. I own a Motorola Razr and consider their fate well-earned. In the article Sprint’s Wake-Up Call we see a multi-billion dollar company in trouble simply because service to customers was poor. The notion in The One-Guy Theory is that the right guy in the right position can make or break a business. The point touched on (but not well made) in Software You Shouldn’t Ever Notice is that the end user experience with many products is still surprisingly bad.
We see two multi-billion dollar businesses in deep trouble (Motorola and Sprint) because they lost sight of their core business – a customer making a phone call. We see that one guy in the right position can make or break a business – even a very large business.
How do these connect?
Things we buy and use need to work. Well done user-centered design is – or should be – at the core of customer’s experience. That end-user experience can make the difference between keeping or losing a customer. Getting that experience right can determine the fate of a multi-billion dollar business.
The Apple iPhone is a good example. The iPhone is a success simply because it is a better designed combination of software and hardware than any of it’s competitors. Looked at one way, the iPhone should not exist. The existing cell phone vendors should have long ago come up with something nearly as good.
But they did not. This is where the “one guy” theory would seem to apply on the design side.
The hardware in modern cell phones is almost absurdly powerful, yet I find the end result presented to the user is amazingly bad. From my background in software, physics, and engineering I have a pretty good idea about what should be possible, and so am especially annoyed to find products that – to my mind – are done so badly.
Have to admit that I am still amazed that the fate of multi-billion dollar companies can hinge on something so simple … but the evidence is pretty clear.
Just for the record …
If you are travelling on the I-70 in Utah there are two eating places I know of that are worth a stop.
One is the Subway in Richfield, Utah (Subway Sandwiches, 1325 N Main, Richfield UT 84701, (435) 896-8627). Yes, Subway is a chain with thousands of locations, and there are hundreds (at least) along the Interstates. Not sure what the difference is, but the Subway in Richfield is very, very good. The owners deserve credit. The Subway is right next to a gas station, near the Interstate, which is a logical stopping point before the long stretch east to Green River.
Another is the Tamarisk restuarant on Green River, Utah (the map is centered on the restuarant – the Google placemark is way off). Nothing fancy – just a nice place with decent fare, reasonable prices, and right on the Green River. Most definitely a good place to stop.
Inherited some code from a younger developer. Not real thrilled with the code, so went about cleaning up. This is the client side of a client/server application. Given this is at least my sixth iteration with a client/server application, the bits done badly are pretty obvious. From the general mash factored out much of the control and model code, but left the UI code mostly untouched. After getting much of the non-UI code cleaned up, started testing, then ran into:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicProgressBarUI.updateSizes(BasicProgressBarUI.java:470)
at javax.swing.plaf.basic.BasicProgressBarUI.getBox(BasicProgressBarUI.java:427)
at com.sun.java.swing.plaf.windows.WindowsProgressBarUI.getBox(WindowsProgressBarUI.java:225)
at com.sun.java.swing.plaf.windows.WindowsProgressBarUI.paintIndeterminate(WindowsProgressBarUI.java:279)
at javax.swing.plaf.basic.BasicProgressBarUI.paint(BasicProgressBarUI.java:392)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
at javax.swing.JComponent.paintComponent(JComponent.java:763)
at javax.swing.JComponent.paint(JComponent.java:1027)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
at javax.swing.JComponent._paintImmediately(JComponent.java:5070)
at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:723)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Though the fault is in pure Sun code, I doubt very much the fault is Sun’s. Rather somewhere in the mash of UI written by the local programmer there is most likely something not quite right.
The point is – this is a good example from which to argue for white-box programming. From Eclipse I cannot see the sources associated with the above stacktrace, and cannot guess what might be the root problem. Given sources I have at least some chance of figuring out the underlying problem.
Doubtless if I can obtain the Sun/Java sources there is some way to get Eclipse to pull in the sources (though getting and maintaining an exact match between libraries and sources may be a minor pain).
Or not.
Wasted at least a day tracking this down. It started with trying to run a PHP page and getting an error:
winsock.dll unusable. 1009
Clear as mud. Lots of red herrings: FastCGI versus CGI, differing PHP versions, directory permissions, metabase script maps, something not quite right in the application install. Was not any of those. PHP pages worked just fine in directories that allowed anonymous access. Add the requirement for authentication and get the above error.
Turned out the answer was the permissions on the registry key:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes
Needed to add “read” access for user IUSR_MERCURY (where “mercury” is the name of the computer) to the remove the error. Not exactly obvious.
Along the way found – once again – there are a lot of scummy sites on the web in popular places, looking to attract traffic with worthless information. Search on the above error – you will find lots.
What finally lead to the solution:
IIS5.0 “Invalid Default Script Language”
This error is usually caused by lack of permissions. Check the following:
1. Make sure the Users group has Read/Execute permissions to the
\windows\system32\inetsrv folder and \inetpub\wwwroot and any other content
folders for your site.
2. Make sure the anonymous account(IUSR_machinename) has Read permissions
to the following registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Classes and all
subkeys
3. Make sure the Users group has Read permissions on the following registry
key: HKEY_CLASSES_ROOT
Thank you,
Jackie Jaynes [MSFT]
Microsoft IIS
Something to add to the PHP installation (or the like) as a check, it seems.
Once again I am hosting the local polling place. This my precinct tends to be deeply conservative. There are lots of Republicans and very few Democrats. In some elections the Republican candidate lost out (locally) to a third party candidate, but rarely to a Democrat. Perhaps “conservative” is the wrong label. Might be that “libertarian” is a better fit. When Chris Cox was plucked out of the Senate to chair the SEC, local voters went for Jim Gilchrist over the (intensely boring) replacement offered by the Republican party.
This election is different. There are quite a number of former Republicans changing to non-partisan or Democrat – which for this area is amazing. No prior election has been anything alike (and I’ve been doing this for ten years).
If this area is so strongly affected, the Republican party is in very deep trouble.