Vincent Gable’s Blog

July 10, 2008

Money and Sales are Not a Metric for Good

Filed under: Programming,Usability | , , , , ,
― Vincent Gable on July 10, 2008

Sergey Solyanik recently explained why he left Google for Microsoft.

The second reason I left Google was because I realized that I am not excited by the individual contributor role any more, and I don’t want to become a manager at Google.

And I don’t know enough about Google or Microsoft’s management culture to offer any insight on this point.

I can’t write code for the sake of the technology alone – I need to know that the code is useful for others, and the only way to measure the usefulness is by the amount of money that the people are willing to part with to have access to my work.

He goes on to say that Microsoft measures everything in money, but at Google there are “eye candy” projects that are free, so he does not feel successful making them.

Now I feel the same way about writing code for the sake of technology alone. It is ultimately unfulfilling. And I have great respect someone who knows what they want to do, and does it. But I strongly feel that sales and profit are not the right metrics to measure how useful something is. There are several reasons for this

Customers and users are not the same thing.

Maximizing profits is distinct from, and often antagonistic to, maximizing quality.

The marketplace is too chaotic and relative to measure quality.

Ironically Microsoft Office 2008 For Mac is the perfect example. It’s the best selling version of Office for the Mac ever. If sales are a metric, it should be the best version of office. But it’s not (v5.1 may have this honor, at least for Word). Why it sucks is it’s own series ; I won’t go there for now. There are two big reasons why Mac Office 2008 sold so well in spite of it’s poor quality.

Firstly, there are more Mac users now then at any point in history. And Mac market-share is still rising. When 2.5x as many Macs are being sold today as 2 years ago it would be very difficult not to sell more copies of a popular Mac software package!

Secondly, 3 years ago, Apple switched from PowerPC to x86 microprocessors. Non-x86-native versions of office run excruciatingly slow on x86 computers. Microsoft made a “business decision” to not support Mac Office customers by denying them an x86-native update for versions of Office prior to 2008. There was a two-year period when the only Macs Apple would sell you had x86 processors, and the only version of office you could buy was not x86 native. This really sucked for users. But it paid off for Microsoft. They saved money by not supporting customers (which means higher profit, which is the only metric of good software, right?). But more importantly, it crippled older versions of office, which forced people to upgrade. People who would normally say “Well, I paid $500 for my copy of Office, and it may be old, but it does what I need, so I’ll skip the ‘upgrade’ and stick with ‘ol reliable, thankyouverymuch!” now had a horrible reason to upgrade. It isn’t that Office 2008 is so much better then other versions of Office, it’s that older versions of Office stopped working!

Customers != Users

I am a Mac Office 2008 user, but not a customer. Personally I think it’s is a shitty product, and I hate using it. But my employer’s IT department bought it for me, since it’s the only way to get Entourage, the lame Outlook clone for the Mac. And Entourage is the only way to get notifications from the company’s Exchange server whenever I get an email or calendar update, so I have to use it every work day.

You can’t look at the sale of Mac Office that I use and say “Vincent thought it was worth $500”, because that’s not what happened! What happened was that “Some company that Vincent works for thought it was worth $500…. because it played nice with their email server“. I hardly enter into the fucking equation at all! It’s more about the email servers then me, and I have absolutely no input on how the email servers were set up 10 years before I was hired.

Chaotic Market

And about that $500 figure ($499.95 is the estimated retail price of “Office 2008 for Mac
Special Media Edition”, and $500 is a nice round number so I’m sticking with it). Pricing is a black art. (That article is 5000 words, but I do think it’s worth reading). The only Office 2008 product I use every day is Entourage. But you can’t buy just Entourage, you have to buy it as part of an “Office 2008” bundle. And Microsoft loves to segment it’s pricing

So it’s unclear what you are buying, why, or how much of the money you give Microsoft is because of a clever pricing system, not clever software.

$1 does not mean the same thing to all customers. Obviously rich customers, say corporations, CEOs, etc. can pay more for something then the average Joe. Software that targets corporations or governments obviously will have a sticker price orders of magnitude higher then, say, a blog-authoring tool. But it is a mistake to conclude that just because a blogger can’t part with more money, that blogging software is less useful then “enterprise” email clients. Both fundamentally are communication tools, and both have changed the way that people interact.

Measuring “Good”

So how do you measure quality? There are several ways. User satisfaction, though hard to quantify, is probably the best. I recently attended a Red Cross training session on how to use AEDs. The teacher highly recommended the Zoll brand units we had purchased, and told us a few war-stories about how well Zoll-made equipment held up in the field, even after being dropped off the back of ambulances, and run over with a fire-engine. You only get high praise from your users by doing things right. (It’s possible to get praise from your customers by being cheap)

Another measure is productivity — how much more have people been able to do by using new software? This is quantifiable as time-to-complete-a-project or projects-completed-per-unit-time. However, it may be expensive to measure.

Unfortunately there is no silver bullet. Measurement is always difficult to do well — especially outside of a laboratory. Profit and sales are a data point. And they can tell you something — but they are not a good proxy for utility, satisfaction, or quality.

July 7, 2008

Getting OS X Icons

Filed under: Design,MacOSX,Programming,Reverse Engineering,Usability | ,
― Vincent Gable on July 7, 2008

This is what the Apple HIG has to say about icons. You should read it if you ever use icons. Even if you are not drawing your own icons, you need to understand how they should be used. (eg: icons in a toolbar should have a flat “head on” perspective, not the three-demensional look they have in the Dock.) You’ll find the icons you need faster if you know what they should look like.

Websites with icons you can use freely: IconDrawer, Iconfactory, Kombine.net.

SystemIconViewer (source included) by Noodlesoft is a useful tool. It lets you browse over 100 standard OS X icons that are available programatically.

For getting paths to private OS X icons, try poking around inside CandyBar.app — A commercial program that lets you customize just about any icon on your system. As of v2.6.1 /CandyBar.app/Contents/Resources/English.lproj/IconData.plist contains information on where icons are located. Icon locations do change completely between releases of OS X, even if the icon itself does not! I found CandyBar to be a better source of up-to-date icon locations then google. IconData.plist is pretty big and dense, but you can search it for keywords if you open it in Xcode, which helped me a lot.

(Although I haven’t used any of them personally, these are some design firms Apple recommends, if you have the cash.)

Bug Triage Priorities

Filed under: Programming,Quotes | ,
― Vincent Gable on July 7, 2008

Roughly, my triage order is:
* Data-loss bugs
* Unavoidable crashers
* Functionality-blocking bugs
* Avoidable crashers
* Avoidable bugs
* Misfeatures
* Performance issues
* Feature suggestions
* UI feedback
This is, of course, a rough ordering

Wil Shipley

I totally agree that data-loss / corruption is a higher priority then crashes. You can upgrade|downgrade a crashy program. But once data is gone, it is gone. Protecting users data should be your prime directive. I have always strongly disagreed with any bug triage that put crashes at spot #1.

Rands First Law of Information Management

Filed under: Quotes,Tips,Usability | , , , ,
― Vincent Gable on July 7, 2008

Rands’ First Law of Information Management: “For each new piece of information you track, there is an equally old and useless piece of information you must throw away.”

Rands in repose

So true.

Programatically Excluding Things from Time Machine Backups

Filed under: Cocoa,MacOSX,Objective-C,Programming,UNIX | , ,
― Vincent Gable on July 7, 2008

To exclude files/folders from a Time Machine backup, you can use the C-function CSBackupSetItemExcluded().

As far as I know there isn’t an official way to do this from the command-line or a shell script. As near as I can tell, the safest way to it without using compiled C-code is:

sudo defaults write /Library/Preferences/com.apple.TimeMachine \
SkipPaths -array-add "PATH-ONE" "PATH-TWO"

where "PATH-ONE" "PATH-TWO" are of course paths to items you want to exclude.

Credit to Ellis Jordan Bojar for this solution. (original article) Using defaults instead of tinkering with .plist files directly is really the way to go!

The Cost of Computing

Filed under: Programming,Quotes | , , ,
― Vincent Gable on July 7, 2008

But if you look at the history of the computer business, where we are at now in terms of costs is probably similar to where we were in the 80’s and early to mid 90s. Most of the cost was in manpower. That was the case then and it is the case now.

Hank Williams

See also, Jeff Atwood: Hardware is Cheap, Programmers are Expensive

July 6, 2008

Open Systems Can Be Built With Closed Systems

Filed under: Quotes | , ,
― Vincent Gable on July 6, 2008

Even the worst of our closed platforms, the telephone system, wasn’t closed enough that the internet couldn’t be built on top of it.

— Jack Shedd

Designers Don’t Solve Stuff

Filed under: Design,Programming,Quotes
― Vincent Gable on July 6, 2008

Designers are so low on the list of people capable of solving the problems we face … I don’t care how clever your layouts are, we, as designers, are incapable of solving global hunger, poverty or warming. We are what we have always been. The messenger, not the message.

Developers on the other hand …

Jack Shedd

Absolutely true, if “Designers” continue to limit themselves to style, and not how it works.

July 5, 2008

FourCharCode2NSString

Filed under: MacOSX,Objective-C,Programming,Sample Code,Usability | , , ,
― Vincent Gable on July 5, 2008

As I have written before, the best way to convert a FourCharCode to an NSString* for NSLog()ing is to use the NSFileTypeForHFSTypeCode() function. But for the life of me I can’t remember that name, even though I use it about once a month. It’s too long, and it has too little to do with what I’m using it for.

So I have added the line:
#define FourCharCode2NSString(err) NSFileTypeForHFSTypeCode(err)
To my prefix-files, because I can remember FourCharCode2NSString().

UPDATE: (2008-08-06) There is an even easier way.

-dealloc Warning

Filed under: Bug Bite,Cocoa,MacOSX,Objective-C,Programming |
― Vincent Gable on July 5, 2008

The only time you should call ever call -dealloc in Objective-C is on the last line of your own -dealloc method. This call should be [super dealloc];. The proper way to dispose of an object is to send it a -release message — -dealloc will then be called if appropriate.

Now when I was first learning Cocoa, I sometimes disposed of objects by calling -dealloc directly. This caused all sorts of problems. Truth be known, if I’ve been messing with several object’s -dealloc methods, I’ll sometimes dyslex out and type dealloc when I mean release, just because it’s more fresh in my head. This is very rare, but it has happened once, and will happen again. I’m fallible like that. Murphy’s law tells us that I won’t catch it every time.

So I humbly propose that GCC should warn you if you use -dealloc any way other then calling [super dealloc]; on the last line of your own -dealloc methods.

« Newer PostsOlder Posts »

Powered by WordPress