Tuesday, October 20

Pimp My Code, Part 17: Lost in Translations.

Introduction

If you’re developing commercial software, you’re going to want to sell it globally — for well-localized English-speaking software companies, for instance, I have seen between 20% and 25% of total revenue coming from non-English speaking countries. That’s, like, real money. You’ll want that.
Delicious Monster
Gross Sales by
Language of Country
English80.9%
German8.1%
French3.2%
Japanese2.6%
Unknown / Other2.2%
Dutch1.5%
Spanish0.9%
Norwegian0.8%
Italian0.5%
Danish0.5%
Swedish0.5%
Chinese0.3%
Portuguese0.3%
[Delicious Monster Oct09]
Omni Group
Upgrades by Language
English74.4%
German6.0%
French5.3%
Japanese5.0%
Spanish2.3%
Other2.3%
Italian1.9%
Dutch1.4%
Chinese0.7%
Portuguese0.4%
Norwegian0.4%
[Omni Group Oct09]

Note that the data from the above tables was gathered in different ways: Omni tracks what language a user has set in her preferences every time she upgrades any of her Omni software, whereas I tracked Delicious Monster’s total dollar sales by country, and then assigned each country a “primary” language. (For countries like Switzerland, obviously my approach is an approximation.)

Still, you can try to make some educated guesses from these two data sets, although obviously correlations aren’t necessarily causative when analyzing only two samples. But, for example, Omni has Japanese-language support and Japanese-only boxed versions of their products; their Japanese number is twice that of Delicious Monster, which doesn’t have a partnership like this (yet). On the flip side, I have a Norwegian translation in Delicious Library 2, whereas OmniGraffle does not; my Norwegian number is twice that of Omni’s.

My German number is a bit higher, which is surprising because in general Delicious Library doesn’t appear to have penetrated overseas as well as Omni has. Maybe Germans love to organize books? Maybe they love doodads, and they bought my optional Bluetooth scanner, which makes their gross sales number much higher? There’s clearly a whole post to be written about mining this data, but this isn’t that post.

Abstract

In this post I’m going to explain to you what internationalization and localization are, how Apple’s tools handle them by default, and the huge flaws in Apple’s approach. Then I’m going to provide you with the code and tools to do localization in a much, much easier way.

Then you’re going to think, “That will never work, because of blah!” and I’m going to respond, as if I can read your mind or I’ve already had this argument with a dozen developers, “It already did — I used these tools in Delicious Library and Delicious Library 2 and they've won three Apple Design Awards between them.”

And you’re going to think, “Stupid show-off… why does he keep mentioning those?” And I’m going to say, “Look, in this case I think it’s justified, because the Design Awards are given based largely on the interface of an application, and I’m merely trying to demonstrate that the compromises I had to make in interface design didn’t have a huge impact on the feel of…” and then we’ll go back and forth for a while in an imaginary argument while I try to convince you to do things my way, dammit, because I’m the daddy.

“Internationalization” vs. “Localization”

What is internationalization, and what is localization? Good question! I’m so glad you asked.

First, you should really read Apple’s documentation on it. I mean, seriously, this should ALWAYS be your first target of inquiry. Did you read it yet? How about now? Now?

Ok, fine… briefly, ‘internationalization’ is getting your app ready to be localized for different languages/countries, and ‘localization’ is the process of actually adding a particular language to your app. The two are obviously are very closely related (you can't localize until you internationalize, and there's no point in internationalizing if you're not going to actually do any localizations) but it's vital to understand they are two distinct steps.

For instance, as a developer, you don't need to speak German to get a German localization — you just need to do the internationalization part and find one friendly deutschophone to do the localization, and you're golden. (I mean literally golden, as in covered in gold — don't ignore the German market! It's 8% of my total sales!)

Apple's Localization Process

Ok, you’re sold on localization. But how do you proceed? Another good question! (Again, thank you for tossing me all these softballs.)

First off (as I’ve said many-a-time), when you are writing your source code you should surround EVERY string that the user might eventually see in the NSLocalizedString() macro (or a variant). This will enable you to later automatically pull the English phrases out of your app, for translation by people who actually, like, speak other languages. Errrr… whatchacallums. “Polyglots!”

But then what? Apple’s recommended process is:
  • You run Apple’s command-line tool, ‘genstrings’, over your source files (hopefully as part of your build process in Xcode), to pull out all the English phrases you marked with NSLocalizedString() and its cousins. See, I told you that’d be useful! And here’s it’s already paid off, only a couple paragraphs later!
  • You give the “.strings” files that genstrings generates, along with any XIBs and image files that contain English words, to a localizer, who is a native speaker of the language you want.
  • The localizer creates a new directory of translated “.strings” files, plus XIBs and images with English words translated as well.
  • You take this directory, and put in into a language bundle in your project, like “ja.lproj”.
Easy? Sort of. But you can already see problems:

Problem 1: Localizers Can’t Effectively Localize Images

You really really don’t want your localizers editing your image files. I mean, your artists spent a lot of time making your images really nice (since you’re not an idiot and you didn’t try to do your artwork yourself) and they used things like layers and paths and filters and stuff, and your localizers don’t know how to use Photoshop and aren’t artists, and furthermore you probably gave your localizers the final PNG or JPEG2000 files instead of PSDs and so they don’t have all those layers and paths and filters and they’d do a really crappy job if they even could do it which they can’t.

Also, your artists are going to keep tweaking the images right up until the day you ship (and after — and then they’re going to beg you to delay) and you could spend 100% of your time just sending out updated images to localizers for re-translation, and your localizers are either going to charge you a fortune or get pissed off and quit (depending on if you pay them or not, respectively).

Luckily, there’s a simple and obvious solution to this one: DO NOT EVER PUT WORDS IN YOUR IMAGES.

buyalbum.png
buybook.png
buysong.png
this is wrong, wrong, so wrong.

Yes, I KNOW Apple does it. I think it’s some bizarre hold-over from their Carbon days, when drawing actual styled text on a 3D button using actual source code was CRAZY TALK. Plus Apple has a huge in-house art staff, so it’s easy for engineers to say, “Hey, art dudes, give me a button in three different states that says, ‘Buy Album’ in our latest iTunes-only-style-that’s-not-quite-like-Cocoa’s-standards,” and the engineer is done for the day and didn’t have to write any code and can go suck down a mojito.

Never mind that every time Apple’s (separate-but-equal) iTunes UI team changes the look of their buttons, the artists have to redo several hundred images and then re-localize them, resulting in thousands of fiddly images. That’s certainly a lot more efficient than the programmer spending a couple hours writing code to draw the button border and inside and the shadow on the text, once, and then just modifying that code in one place whenever the look changes, right? RIGHT? (* see answer at end of post.)

Luckily, you don’t even have the option to do it this stupid way, because you don’t have an art department whose time you’d like to waste. So, use icons whenever possible on buttons, and if you must use text, then make it localizable. Luckily, this is pretty easy in Cocoa, since the button edges, insides, and the various shines and shadows are all done for you if you use the standard mechanisms, and they’re easy to subclass, once, if you want a custom look.

For button titles that require text, you can either type English words directly into Interface Builder, or if you’re not on an iPhone you can bind the button’s title some method in your code and use NSLocalizedString() to make sure it’s localized. Since you’re going to have to localize most of your XIBs anyhow (because of menu items, mouseover help text, explanatory text boxes, field titles, window names, etc.), I really only recommend the binding approach if your button’s title changes in a way you can’t model in Interface Builder itself. (That is, don’t write an extra method if you don’t have to. Less code is better.)

Problem 2: Localizers Can’t Effectively Localize XIBs

Asking your localizers to modify XIBs directly (using Interface Builder) is a huge pain: First, you limit your pool of potential localizers if they have to have the developer tools installed AND understand how to use them.

inspectorforlocalization.png
hope the localizer finds this "display pattern!"

Second, XIB files aren’t flat or self-documenting, so it’s VERY hard for localizers to find EVERY last English word in your XIB. Did they forget a tooltip? What about an alternate title for a button? What about a button’s title binding’s formatter string? Maybe there’s a hidden view somewhere? You’ll have to keep testing the localizations you get for complete coverage, and sending them back to be redone, and then re-testing them again. And again. Yuck.

Sure, there’s a cool command in Interface Builder now, where you can hit control-S and see all the strings in your interface — but that’s ANOTHER thing you have to teach each localizer to do. In addition to knowing how to use Interface Builder in the first place.

Third, XIBs are like source code: they are written by programmers and contain functional parts. If your localizers happen to delete a button, or disconnect a binding, your program stops working for that language. Remember, your localizers are NOT coders — they don’t have the same innate fear of changing XIBs that you’ve learned from years of boning yourself. And how fun is it to debug a program that works differently in different languages? Not fun.

Fourth, many language are not as compact as English: the French and Germans are particularly fond of using the descriptions with the lots of the words or compoundwordstodescribeasingleconcept, respectively. You’re asking your localizers to resize your buttons and titles, and then, if those don’t fit in their containers, resize your views and widgets and panels as well.

Let me restate that last point: you are asking your localizers to design your interface. If you’re making an application that catalogs users’ books, CDs, DVDs, and other physical media, then I urge you to go ahead and do this. For the rest of you, WHAT THE HELL ARE YOU THINKING?

Problem 3: Localizers Can’t Localize from Only Your App

In the old days, the NIBs we shipped were the same as the NIBs we used to build the app (and to localize), so any polyglot user in the world could just make a new language folder in our app wrapper by copying our English resources, and then start localizing the NIBs and .strings files, and at any time she could launch our app and check her progress. (Which is good, because it’s AMAZINGLY common for localizers to screw up the punctuation in .strings files, and Cocoa’s localization machinery will just silently ignore all strings after any punctuation mistake, resulting in mystery partial localizations.)

Sure, the user had to understand Interface Builder, but at least if she did, she had everything she needed.

Nowadays, Apple doesn’t want people mucking about CHANGING their programs, so we compile XIBs down into read-only NIBs, which means we have to give localizers our original XIB files (as well as our .strings) before they can start work.

Think about the difference between some user, somewhere, just deciding to start editing a folder full of files that she already has, versus her having to write you, you having to bundle up all your XIBs and .strings and send them to her, her having to edit them all without seeing ANY results while she is doing it, then bundle them up and send them back to you, then you have to integrate them into your build system and make a test release, and either look at it yourself or send it to her again.

Lather, rinse, repeat, lather, stab, stab, stab.

Even if this weren’t a horrible, time-wasting process (it is), this points to the final and biggest problem with localization:

Problem 4: You Have to Maintain Multiple Copies of Each Localized Resource

If you have nine translations and each has a localized copy of every XIB in your application, then you’ll have to manually maintain nine different versions of each XIB. The strings in XIBs don’t change super-often, but the connections, flags, layout, and other object properties change all the time. And every time you change a flag or layout or connection in one XIB, you have to do the same thing eight more times. And do it perfectly, or you’ll have a language-specific bug.

Of course, you can wait until all your XIBs are fully finished before you localize, but, if you’re like me, you are still fiddling with your XIBs until the day you ship your 1.0 code. So you’d have wait to localize until AFTER shipping 1.0, which stinks, or put off shipping until you’ve finished the product, sent out the localizations, AND gotten them all back — which stinks. And then you find have to change some buggy XIBs for your version 1.2, and you’d still have the exact same problem of having to edit nine XIBs to make one change.

(This is obviously also true of images that have been localized, but hopefully I’ve talked you out of EVER doing that, so I’m not going to discuss that further.)

Now, Apple has provided some tools in an attempt to make this all easier — they have something called “ibtool” (“nibtool” before Leopard) which can pull all the strings from a file, and then put new ones in their place, supposedly. In fact, it’s intended to allow you to look at the geometry and language changes between two localized versions of the same XIB, so you can generate, say, a Japanese version of your Main Menu nib with the latest changes from your English Main Menu nib, except keeping changes that you specifically made in the geometry of objects in the German version (since some words are longer and/or shorter in other languages, and thus XIBs sometimes require relayout).

Apple also has a tool called AppleGlot which sets up an entire “translation environment.” It apparently dates from Carbon days, and although it’s been updated to work with some versions of Interface Builder last time I tried it, it was a lot more trouble than value to me.

Finally, there are some third-party tools that attempt to simplify some of this: for example Polyglot, but it appears to have not been updated in a while, and I’m honestly not sure what all it does. (I’m providing the link so you can research it and other products if you want.)

I disagree with the entire approach of storing a bunch of geometry diffs to your XIBs — this seems INCREDIBLY fragile to me. What happens when you move a text field from one view to another? What happens if you even move views around? All those geometry changes turn to gooblity-gook.

The fundamental problem with every tool I’ve seen to fix your XIBs, however,is that you still have to maintain all the localized versions. You have nine extra copies of each XIB in your source code, you have to make sure they are all synced up, somehow.

Now, if I told you, “Look, it’s easy to localize your Objective-C files — just maintain ten copies of each! Every time you change one, you’ll have to change all the others… but don’t worry! I’ve provided some tools that kind of help with this… until they don’t…” What would you think?

You’d spit in my eye. And I don’t like spitty eyes. So, I came up with a better way, with exactly the same solution Apple used for Objective-C files.

An Almost Ideal Solution

Let’s design, in our heads, the perfect localization system, or as close as we can get without, you know, having to do a lot of work:

• First, we simply promise ourselves we won’t put words in image files. There, that solves a lot. This is usually Apple’s convention as well, although even certain Cocoa teams (-cough-iWeb-cough-) have used fully-rendered images of words like “PUBLISH” instead of using strings — hey, THAT’S not going to be resolution-independent, is it? (I keeed! I keeeeeeed!)

• For XIBS, what we’d like (as programmers) is to have and maintain ONE single English XIB, which will polymorph to the user’s chosen language at launch time, so we don’t have to ship with ten versions of the same XIB (they’re surprisingly big) or maintain ten versions of the same XIB in our source code (with the concomitant increase in errors as our XIB localizations slowly drift out of sync).

• If we (the programmers) change a string or the whole look of a XIB, we want partial localizations to still work — it’s fine with with us if sometimes we ship with one or two English words “peeking through” a localization, since in most countries (obviously not France) they mix in English words all the time anyhow. It’s certainly better to have a partial localization (as long as it is of high-quality) than either no localization or a corrupted one. (This goes against a programmer’s natural inclination to insist that solutions be provably perfect. Get used to it.)

• To make our localizers’ jobs easier, what we’d like to do is give them ONLY .strings files, so all localization takes is any text editor – localizers don’t have to know how to use Interface Builder or any developer tools.

• We’re forgetful, so we want to generate the strings files from our XIBs and source files every time we do a build, so we never give out-of-date versions to our localizers — if they have a build of the app, then they have the latest strings files, AND the means to test their localizations themselves.

• Since our app is going to ship with the complete set of .strings files needed to localize it, ANY customer who speaks another language can copy our English.lproj to TheirLanguage.lproj, edit the .strings files, and voila create a localized version of our app after a couple hours’ work.

Here's the Code

Now, as you might guess, I've already done this, and, if I may plug myself for a second, this code was already available to clients of Golden % Braeburn, which is my other company where I give my Delicious store source code (and other miscellaneous helpful code) to Mac developers for a paltry percentage of sales. (Yes, Golden % Braeburn has launched, and yes, one of Golden % Braeburn's clients, Acacia Tree Software, is currently selling its app with our store.)

The first step to slurp all the English strings out of your XIB files at build time, so your localizers have nice flat strings files to work with. Add two new build phases to your application target in Xcode using “Project ▶ New Build Phase ▶ New Run Script Build Phase”, set the shells to /bin/zsh, and have them look like this:

Internationalize Source Code Shell Script Build Phase

# -q silences duplicate comments with same key warning
genstrings -q -o ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${DEVELOPMENT_LANGUAGE}.lproj ${SRCROOT}/**/*.[hm]



Internationalize XIBs Shell Script Build Phase

foreach nibFile (${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/**/*.nib)
stringsFilePath=${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${DEVELOPMENT_LANGUAGE}.lproj/`basename ${nibFile} .nib`.strings
xibFile=`basename ${nibFile} .nib`.xib
xibFilePath=`echo ${SOURCE_ROOT}/**/${xibFile}`
if [[ -e ${xibFilePath} ]] {
ibtool --generate-stringsfile ${stringsFilePath}~ ${xibFilePath}
${BUILT_PRODUCTS_DIR}/xibLocalizationPostprocessor ${stringsFilePath}~ ${stringsFilePath}
rm ${stringsFilePath}~
}
end


Now comes a slight hitch — under Leopard and beyond, the “ibtool” command idiotically outputs a new format of .strings file that looks like this:

/* Class = "NSButtonCell"; title = "Get iPhone & iPod Touch App";
ObjectID = "1401603"; */
"1401603.title" = "Get iPhone & iPod Touch App";

/* Class = "NSTextFieldCell"; title = "Remote Libraries:";
ObjectID = "1401604"; */
"1401604.title" = "Remote Libraries:";


Instead of the standard file format (output by the older “nibtool” and the current “genstrings”):

/* Class = "NSButtonCell"; title = "Get iPhone & iPod Touch App";
ObjectID = "1401603"; */
"Get iPhone & iPod Touch App" = "Get iPhone & iPod Touch App";

/* Class = "NSTextFieldCell"; title = "Remote Libraries:";
ObjectID = "1401604"; */
"Remote Libraries:" = "Remote Libraries:";


This new format completely violates the whole .strings file paradigm and obviously makes it impossible for us to use this to localize XIBs on-the-fly, because when we load XIBs on our own, we don't have those ObjectIDs so we can't match objects up to the strings they need. Nice going, Apple.

So, I wrote a little program to post-process “ibtool”s output to make it like “nibtool” and “genstrings”, you should add this code to your Xcode project and add a new “tool” target for it and make sure your main app depends on this tool being built, and all will be well:
xibLocalizationPostprocessor.m: Post-processing ibtool output
// xibLocalizationPostprocessor.m
//
// Created by William Shipley on 4/14/08.
// Copyright © 2005-2009 Golden % Braeburn, LLC.

#import <Cocoa/Cocoa.h>


int main(int argc, const char *argv[])
{
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init]; {
if (argc != 3) {
fprintf(stderr, "Usage: %s inputfile outputfile\n", argv[0]);
exit (-1);
}

NSError *error = nil;
NSStringEncoding usedEncoding;
NSString *rawXIBStrings = [NSString stringWithContentsOfFile:[NSString stringWithUTF8String:argv[1]] usedEncoding:&usedEncoding error:&error];
if (error) {
fprintf(stderr, "Error reading %s: %s\n", argv[1], error.localizedDescription.UTF8String);
exit (-1);
}

NSMutableString *outputStrings = [NSMutableString string];
NSUInteger lineCount = 0;
NSString *lastComment = nil;
for (NSString *line in [rawXIBStrings componentsSeparatedByString:@"\n"]) {
lineCount++;

if ([line hasPrefix:@"/*"]) { // eg: /* Class = "NSMenuItem"; title = "Quit Library"; ObjectID = "136"; */
lastComment = line;
continue;

} else if (line.length == 0) {
lastComment = nil;
continue;

} else if ([line hasPrefix:@"\""] && [line hasSuffix:@"\";"]) { // eg: "136.title" = "Quit Library";

NSRange quoteEqualsQuoteRange = [line rangeOfString:@"\" = \""];
if (quoteEqualsQuoteRange.length && NSMaxRange(quoteEqualsQuoteRange) < line.length - 1) {
if (lastComment) {
[outputStrings appendString:lastComment];
[outputStrings appendString:@"\n"];
}
NSString *stringNeedingLocalization = [line substringFromIndex:NSMaxRange(quoteEqualsQuoteRange)]; // chop off leading: "blah" = "
stringNeedingLocalization = [stringNeedingLocalization substringToIndex:stringNeedingLocalization.length - 2]; // chop off trailing: ";
[outputStrings appendFormat:@"\"%@\" = \"%@\";\n\n", stringNeedingLocalization, stringNeedingLocalization];
continue;
}
}

NSLog(@"Warning: skipped garbage input line %d, contents: \"%@\"", lineCount, line);
}

if (outputStrings.length && ![outputStrings writeToFile:[NSString stringWithUTF8String:argv[2]] atomically:NO encoding:NSUTF8StringEncoding error:&error]) {
fprintf(stderr, "Error writing %s: %s\n", argv[2], error.localizedDescription.UTF8String);
exit (-1);
}
} [autoreleasePool release];
}


Finally, add this class to your main project. Whenever you load a XIB file now, this code will be invoked, and it’ll run through all the displayed strings in your XIB and see if there is a localization in the correspondingly-named strings file. (Eg, if you load “MainMenu.xib”, it’ll automatically be localized with strings from “MainMenu.strings”.)

DMLocalizedNibBundle.m: Run-time Localization of XIBs

// DMLocalizedNibBundle.m
//
// Created by William Jon Shipley on 2/13/05.
// Copyright © 2005-2009 Golden % Braeburn, LLC. All rights reserved except as below:
// This code is provided as-is, with no warranties or anything. You may use it in your projects as you wish, but you must leave this comment block (credits and copyright) intact. That's the only restriction -- Golden % Braeburn otherwise grants you a fully-paid, worldwide, transferrable license to use this code as you see fit, including but not limited to making derivative works.


#import <Cocoa/Cocoa.h>
#import <objc/runtime.h>


@interface NSBundle (DMLocalizedNibBundle)
+ (BOOL)deliciousLocalizingLoadNibFile:(NSString *)fileName externalNameTable:(NSDictionary *)context withZone:(NSZone *)zone;
@end

@interface NSBundle ()
+ (void)_localizeStringsInObject:(id)object table:(NSString *)table;
+ (NSString *)_localizedStringForString:(NSString *)string table:(NSString *)table;
// localize particular attributes in objects
+ (void)_localizeTitleOfObject:(id)object table:(NSString *)table;
+ (void)_localizeAlternateTitleOfObject:(id)object table:(NSString *)table;
+ (void)_localizeStringValueOfObject:(id)object table:(NSString *)table;
+ (void)_localizePlaceholderStringOfObject:(id)object table:(NSString *)table;
+ (void)_localizeToolTipOfObject:(id)object table:(NSString *)table;
@end


@implementation NSBundle (DMLocalizedNibBundle)

#pragma mark NSObject

+ (void)load;
{
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];
if (self == [NSBundle class]) {
method_exchangeImplementations(class_getClassMethod(self, @selector(loadNibFile:externalNameTable:withZone:)), class_getClassMethod(self, @selector(deliciousLocalizingLoadNibFile:externalNameTable:withZone:)));
}
[autoreleasePool release];
}


#pragma mark API

+ (BOOL)deliciousLocalizingLoadNibFile:(NSString *)fileName externalNameTable:(NSDictionary *)context withZone:(NSZone *)zone;
{
NSString *localizedStringsTableName = [[fileName lastPathComponent] stringByDeletingPathExtension];
NSString *localizedStringsTablePath = [[NSBundle mainBundle] pathForResource:localizedStringsTableName ofType:@"strings"];
if (localizedStringsTablePath && ![[[localizedStringsTablePath stringByDeletingLastPathComponent] lastPathComponent] isEqualToString:@"English.lproj"]) {

NSNib *nib = [[NSNib alloc] initWithContentsOfURL:[NSURL fileURLWithPath:fileName]];
NSMutableArray *topLevelObjectsArray = [context objectForKey:NSNibTopLevelObjects];
if (!topLevelObjectsArray) {
topLevelObjectsArray = [NSMutableArray array];
context = [NSMutableDictionary dictionaryWithDictionary:context];
[(NSMutableDictionary *)context setObject:topLevelObjectsArray forKey:NSNibTopLevelObjects];
}
BOOL success = [nib instantiateNibWithExternalNameTable:context];
[self _localizeStringsInObject:topLevelObjectsArray table:localizedStringsTableName];

[nib release];
return success;

} else {
return [self deliciousLocalizingLoadNibFile:fileName externalNameTable:context withZone:zone];
}
}



#pragma mark Private API

+ (void)_localizeStringsInObject:(id)object table:(NSString *)table;
{
if ([object isKindOfClass:[NSArray class]]) {
NSArray *array = object;

for (id nibItem in array)
[self _localizeStringsInObject:nibItem table:table];

} else if ([object isKindOfClass:[NSCell class]]) {
NSCell *cell = object;

if ([cell isKindOfClass:[NSActionCell class]]) {
NSActionCell *actionCell = (NSActionCell *)cell;

if ([actionCell isKindOfClass:[NSButtonCell class]]) {
NSButtonCell *buttonCell = (NSButtonCell *)actionCell;
if ([buttonCell imagePosition] != NSImageOnly) {
[self _localizeTitleOfObject:buttonCell table:table];
[self _localizeStringValueOfObject:buttonCell table:table];
[self _localizeAlternateTitleOfObject:buttonCell table:table];
}

} else if ([actionCell isKindOfClass:[NSTextFieldCell class]]) {
NSTextFieldCell *textFieldCell = (NSTextFieldCell *)actionCell;
// Following line is redundant with other code, localizes twice.
// [self _localizeTitleOfObject:textFieldCell table:table];
[self _localizeStringValueOfObject:textFieldCell table:table];
[self _localizePlaceholderStringOfObject:textFieldCell table:table];

} else if ([actionCell type] == NSTextCellType) {
[self _localizeTitleOfObject:actionCell table:table];
[self _localizeStringValueOfObject:actionCell table:table];
}
}

} else if ([object isKindOfClass:[NSMenu class]]) {
NSMenu *menu = object;
[self _localizeTitleOfObject:menu table:table];

[self _localizeStringsInObject:[menu itemArray] table:table];

} else if ([object isKindOfClass:[NSMenuItem class]]) {
NSMenuItem *menuItem = object;
[self _localizeTitleOfObject:menuItem table:table];

[self _localizeStringsInObject:[menuItem submenu] table:table];

} else if ([object isKindOfClass:[NSView class]]) {
NSView *view = object;
[self _localizeToolTipOfObject:view table:table];

if ([view isKindOfClass:[NSBox class]]) {
NSBox *box = (NSBox *)view;
[self _localizeTitleOfObject:box table:table];

} else if ([view isKindOfClass:[NSControl class]]) {
NSControl *control = (NSControl *)view;

if ([view isKindOfClass:[NSButton class]]) {
NSButton *button = (NSButton *)control;

if ([button isKindOfClass:[NSPopUpButton class]]) {
NSPopUpButton *popUpButton = (NSPopUpButton *)button;
NSMenu *menu = [popUpButton menu];

[self _localizeStringsInObject:[menu itemArray] table:table];
} else
[self _localizeStringsInObject:[button cell] table:table];


} else if ([view isKindOfClass:[NSMatrix class]]) {
NSMatrix *matrix = (NSMatrix *)control;

NSArray *cells = [matrix cells];
[self _localizeStringsInObject:cells table:table];

for (NSCell *cell in cells) {

NSString *localizedCellToolTip = [self _localizedStringForString:[matrix toolTipForCell:cell] table:table];
if (localizedCellToolTip)
[matrix setToolTip:localizedCellToolTip forCell:cell];
}

} else if ([view isKindOfClass:[NSSegmentedControl class]]) {
NSSegmentedControl *segmentedControl = (NSSegmentedControl *)control;

NSUInteger segmentIndex, segmentCount = [segmentedControl segmentCount];
for (segmentIndex = 0; segmentIndex < segmentCount; segmentIndex++) {
NSString *localizedSegmentLabel = [self _localizedStringForString:[segmentedControl labelForSegment:segmentIndex] table:table];
if (localizedSegmentLabel)
[segmentedControl setLabel:localizedSegmentLabel forSegment:segmentIndex];

[self _localizeStringsInObject:[segmentedControl menuForSegment:segmentIndex] table:table];
}

} else
[self _localizeStringsInObject:[control cell] table:table];

}

[self _localizeStringsInObject:[view subviews] table:table];

} else if ([object isKindOfClass:[NSWindow class]]) {
NSWindow *window = object;
[self _localizeTitleOfObject:window table:table];

[self _localizeStringsInObject:[window contentView] table:table];

}
}

+ (NSString *)_localizedStringForString:(NSString *)string table:(NSString *)table;
{
if (![string length])
return nil;

static NSString *defaultValue = @"I AM THE DEFAULT VALUE";
NSString *localizedString = [[NSBundle mainBundle] localizedStringForKey:string value:defaultValue table:table];
if (localizedString != defaultValue) {
return localizedString;
} else {
#ifdef BETA_BUILD
NSLog(@" not going to localize string %@", string);
return string; // [string uppercaseString]
#else
return string;
#endif
}
}


#define DM_DEFINE_LOCALIZE_BLAH_OF_OBJECT(blahName, capitalizedBlahName) \
+ (void)_localize ##capitalizedBlahName ##OfObject:(id)object table:(NSString *)table; \
{ \
NSString *localizedBlah = [self _localizedStringForString:[object blahName] table:table]; \
if (localizedBlah) \
[object set ##capitalizedBlahName:localizedBlah]; \
}

DM_DEFINE_LOCALIZE_BLAH_OF_OBJECT(title, Title)
DM_DEFINE_LOCALIZE_BLAH_OF_OBJECT(alternateTitle, AlternateTitle)
DM_DEFINE_LOCALIZE_BLAH_OF_OBJECT(stringValue, StringValue)
DM_DEFINE_LOCALIZE_BLAH_OF_OBJECT(placeholderString, PlaceholderString)
DM_DEFINE_LOCALIZE_BLAH_OF_OBJECT(toolTip, ToolTip)

@end

Unresolved Issues

Issue 1: Not all XIB properties are localized

I didn’t have any NSTableViews with standard column headers in Delicious Library, so there’s no code to handle NSTableViews at all in here. I also don’t even attempt to localize bindings strings, I believe. So, that’d be a good thing to do!

I haven’t touched this code in, like, four years. Which says a lot about how well it’s worked for me, but, obviously, there’s room for improving it. So, please pimp *my* code, and send it back to me, and I’ll post your changes. (We’ll all be better off for it!)

Issue 2: You can’t use the same phrase with two different meanings in a single XIB

Imagine if you have, say, a button labelled “Wind” for “what you do to a watch,” and a text field labelled “Wind” for “moving air.” You obviously can’t localize ‘em with this method. Hasn’t proven to be a big deal with me, but this is clearly what motivated Apple to completely hose string the file format for “ibtool.”

Issue 3: iPhone limitations

I never got around to porting this to work on the iPhone, since Amazon made me destroy the iPhone version of Delicious Library, but it’d be pretty easy to make this work with hierarchies of UIViews and UIControls instead of their NSCousins.

I don’t think the swap-methods-at-load technique will work on the iPhone, either, so you’d have to manually call the translation method when you loaded a XIB, but I don’t think that’s a huge deal, since on the iPhone you typically are MUCH more conscious of when you load and unload XIBs.

Also, obviously your customers couldn’t simply get the .strings from your app bundle or add their localizations themselves, so you lose those advantages. Still, this is the technique I’ll be using in my future iPhone and apps.

Issue 4: You can’t change the geometry of XIBs depending on the localization

The method requires that we, as programmers and interface designers, agree to make ALL our text fields and checkbuttons wide enough to allow for the wordiest of languages, since we’re localizing on-the-fly.

Everyone raises this as an objection, but, seriously, the alternatives are MUCH worse — either you maintain ten sets of geometries yourself, OR you let your localizers be your interface designers. Both are horrible.

And, seriously, you’d be surprised how little people notice when you have extra space. With checkboxes, just always stretch ‘em to the edge of the screen. With text fields — well, the user can’t tell HOW wide they are, can she? The only problem one is buttons, and I think those look better with extra space around them. (Update: my German localizer wrote me to tell me he disagreed with this — that it was a huge pain for him to find short enough German words. I apologized to him for not telling him he could request more width.)

I’ve even thought up two ways around this issue: one if obvious, which is you could just store some geometry changes based on the container type & string in a separate file, and merge those changes at run-time. But, that’d be hard to maintain, for reasons I’ve gone over a bunch by now.

The other would be cooler: have your widgets re-lay themselves out at run time based on their resizing properties if their localized titles don’t fit. For example, if button “a” has a button “b” 20 pixels to the right of it, and both buttons have the stretchy spring to their right, then it’s a fair guess that if you grow/shrink button “a”, you need to do so from its right edge, and you need to move “a” by that many pixels, as well. The other combinations of stretchy springs can be assigned values, and all you have to do is use them consistently in your XIBs and you’ll be golden. (You do have to watch for accidentally localizing Apple’s XIBs.)

But, seriously, I haven’t really done either of these yet, and no English speaker has ever said, “Hey, you have too much space around this button!”

And, importantly, I’m able to integrate all thirteen localizations of Delicious Library 2 by myself, and still have time to program and run my company and drink lots of mojitos.

Footnotes

*No, it isn't.

Labels: , ,

Sunday, May 24

Welcome to the iTunes App Store!

This document describes our process for reviewing applications for iPhones and iPods touch submitted to the iTunes App Store. We’ve avoided using legalese in this document so that you’ll actually read the whole thing. Please do so before starting to write your application, so that you won’t waste a bunch of time writing an application that we cannot publish.

We hate having to reject anyone’s application, so we want to make it clear that we have very compelling motivations behind our acceptance policies, so you can adhere to their spirit. (Oh, our lawyers just reminded us that we should mention that circumstances, times, and social mores change, and we reserve the right to change these policies at any time for any reason, but we’ll do our best to update this document to always reflect the current state of affairs.)


FIRST, you must do no harm. We cannot allow applications that will mess up users’ iPhones, or interfere with their normal operation in any way. The iPhone is a vital communications device, and any downtime on it is unacceptable to Apple and to our customers.

While viruses, malware, and apps that can be remotely exploited are obvious targets of this rule, there are more subtle implications to this. For instance, we cannot allow applications that send too much data through the cellular network; not only would we be breaking our agreements our cellular carriers (who have priced their data plans based on an estimated average data use of customers without including your application), but overloading the network would make it unusable for everyone, and thus violates our first rule.

We also do not allow emulators or other computer languages right now, because those kinds of applications are notorious for having subtle security holes, and we must take the cautious path to ensure the iPhone remains stable for our customers.

SECOND, if your application is what a reasonable person would consider offensive, we require it to carry an “M” rating on our app store, which carries with it certain restrictions on who can purchase and use your app.

We do this because, to a certain extent (and despite our best efforts), users do not fully distinguish between third-party authors like yourself and Apple; if something runs on an iPhone and it is ‘bad,’ that is (at least somewhat) considered to be Apple’s fault. Apple abhors censorship in any form, but it also recognizes that even within a single society there are different ideas about what is acceptable and unacceptable, and we would like to warn our customers (yours and Apple’s) who might be more sensitive.

We realize that any attempt to categorize anything into “offensive” and “inoffensive” is a fool’s errand, especially considering that your application’s audience will encompass thousands of cultures around the world. Thus, we will use our “best efforts” to determine if an app might be found offensive: for example, if it is overtly sexual, if it contains slurs or curse words, if it has violent themes — these are topics reasonable men disagree on, and our goal is to flag anything that might be controversial so that, for instance, parents can review it with their guidelines before letting their children see it.

RESUBMISSION of your app can be done if you believe that it has been rejected in error — please include in your resubmission a description of what you’ve changed in your app, or why you believe the original judgment was in error.

Because in the end our judgments are made by humans, and humans are variable and fickle creatures, our policy is to always let resubmissions be judged by a different person at Apple, to get another perspective.

REFUNDS are opt-in for developers in the iTunes App Store: you can set the number of days during which Apple will offer a full, no-questions-asked refund to your customers, which number will be displayed prominently in your application’s listing on the iTunes App Store and on the user’s list of installed apps inside iTunes.

While the number is up to you, we generally recommend that the more your application costs, the longer a refund period you offer; if you are making a $20 application and your customers are “done with it” after two days, you may not be offering a good value for money spent. As well, customers will be inclined to trust software that offers a generous refund policy.

Please note that Apple’s checks to you will be delayed by the length of the refund period you offer; we will not act as your creditor to cover refunds.


FINALLY, note that these rules actually exist only in the fevered and every-hopeful imagination of one Wil Shipley. Consult the real iTunes App Store for its actual policies, not a blog. Dur.

Labels: , , ,

Monday, September 22

iPhone App Store: Let the Market Decide

Call me a proponent of free markets, but I think Apple needs to have a clearly-documented policy for approving submissions to the iPhone App Store, and it should be:

Publish all software submitted to Apple, as long as the software isn't actively harmful to users, illegal, and does not violate Apple's agreements with cell phone vendors.

Period.

--

The iPhone app store is, at heart, incredible. Every software developer's dream store looks a lot like this:
  • 100% of the devices that can run my software have a link directly to this store.
  • And only this store.
  • And the user can't remove the link to this store from the device.
  • There's no other way to buy software, so users are never confused as to whether they should go to some website or physical store or the online store to find software for their devices.
  • Users never wonder if there's some other, better software out there - if it's not on the store, it doesn't exist.
  • Users can buy with a click.
  • Software is instantly installed and enabled for users.
  • "Good enough" copy-protection is handled invisibly for all developers.
  • Apple hosts the software makes the pretty, professional website.
  • Credit card transactions are handled automatically.
  • Apple's percentage is MUCH lower than traditional distribution.
  • The store actually pays out the money it owes you, unlike the vast majority of physical distributors.
  • There's already a market of something around ten million users for iPhone apps.
  • The market is increasing by the day.

That's a LOT of plusses. A LOT. And it's working. Developers are reporting making thousands to hundreds of thousands of dollars every MONTH and the store is only a couple months old.

Some of this is likely because of the novelty of the device and the store itself — there's a mini-gold rush effect happening, and already I suspect that if you weren't one of the guys to get rich selling a flashlight app or sudoku, well, you probably shouldn't start writing one now.

So, yay Apple, and yay developers who are rolling in fat, filthy lucre. (I'm not bitter that I didn't get in on that first round. No, no.)

As with any pioneering effort that succeeds (c.f. Twitter's constant whale-fails when it took off), Apple is encountering problems it never anticipated, and having to make up solutions on-the-fly.

Which is fine, and good, except, well... maybe we developers need to give Apple a loving nudge, so the problems are solved in a conscious way that helps everyone, instead of being solved ad-hoc and turning into policies which punish us all.

--

Problem: Most Software is Crap

There's a LOT of crap out there for the iPhone. A LOT. And a bunch of neat apps. How does the the user tell them apart? Should Apple's model be like Nintendo, where Apple only allows software through that meets their rigorous standards for being fun and cool and stable? It sounds nice, except (a) it requires a ton of effort on Apple's part, and Apple's success or failure is determined entirely by the tastes of the people doing the vetting, and (b) it stifles innovation. (Look at the number of titles available for the Nintendo Wii, which has been out for years, vs. the number for the iPhone, whose SDK has been available for months.)

The other problem with Apple vetting apps for quality is that Apple gets blamed if crappy apps slip through the process. Once you appoint yourself censor, you've taken responsibility. If an App Store app crashes, it'll be blamed on Apple. If an App Store app has a bug, it'll be blamed on Apple. If an... well, you see where I'm going.

--

Recently Apple decided to go ice-skating on the slippery slope of censorship by removing the "I am Rich" application from its store. Briefly: some prankster priced an app at $999 that did nothing but show some text and a picture, congratulating the purchaser for being rich and stupid. Apple pulled the app after a few days, citing "not enough functionality" or some such.

Now, this application did point real problems in the system, but not in the app. The problems are in the App Store, and they are: it's not really clear how to get refunds, and it's a little TOO easy to click on something that says "$999" without realizing that, seriously, this is a grand you're blowing.

Let's solve the real problems so that we don't need to censor apps, and so that developers don't need to guess if their apps are "functional" enough to pass muster with whichever App Store censor they happen to get:

• Apple needs to have a clearly posted refund policy that applies across-the-board. They may already have a policy, but, honestly, I've bought 15 or so apps and I've never seen it, and I'm going to say that if users don't see the policy, you might as well not have it.

I'd suggest something like, "You can get a full refund any time in the first two weeks of ownership of any app." This would solve many problems: if the app turns out to be buggy, or have limited functionality, or insult your mom, or whatever... well, it's not Apple's problem any more. They refund your money and everyone's happy.

• For apps over some threshold ($30? $100?), Apple needs to add a click to the purchase process. Something like, "Note: this is A HUNDRED REAL LIVE SMACKERS, here, so MAKE SURE you really want this, OK?"

--

After that first rejection, there have been two more reports of rejections. I can't verify them myself, of course, but I also have no reason to doubt the reports. One of these applications had 'podcasting' as part of its functionality, and one had fetching mail from Google as part of its functionality.

Both were censored because of a new criterion Apple has invented, which is "duplicates existing functionality." Let me make my position on this perfectly clear: it in unethical and antithetical to the whole IDEA of an App Store for Apple to be censoring applications based on criteria they have never given to developers, and only told developers after the developers put in all the work of writing an app.

Even TV network censors produce a "standards and practices" document, so writers can tell if they are pushing the envelope. Apple's censors have acted capriciously and against the interests of all of its developers, its customers, and itself.

This situation is worsened because it's obvious that Apple is only worried about applications duplicating the functionality of Apple's iPhone applications — there are twenty "sudoku" apps and a dozen "flashlights" and a bunch of pokers and, heck, there's more than one racing game.

But it was only when a developer added functionality that Apple considered sacrosanct to Apple itself that she was censored. Apple wasn't worried about customer confusion, Apple was worried about getting some competition.

I have to be clear: it simply will not stand for Apple to prevent applications on the iPhone from competing with Apple's own applications. Besides chasing away all decent developers, besides hurting their customers by stifling competition and innovation, besides it simply being evil, it will, shortly, be illegal. This kind of behavior is illegal when you hit a certain point in market saturation for your product; Microsoft was slapped for it constantly in the late '80s. If the iPhone is the success Apple thinks it will be, they will find themselves the target of a huge class-action lawsuit.

--

I can see how the iPhone App Store could be some short-sighted Apple marketing dude's dream: "Hey, we can nip all competing applications in the bud and completely own any market we choose! Imagine how well Final Cut Pro would do without Premiere! Imagine iPhoto without Lightroom! We own it all, baby!"

Those of us who actually write software know that, in fact, killing your competition is a sword that's not just double-edged, but in fact has a blade as its handle, as well. Without competition there is no innovation. Apple needs competing apps. As they add features or speed or UI innovations, Apple can copy them and make Apple's apps better.

Competition is how nature has made strong organisms since literally the beginning of time. You simply won't get stronger if you don't have adversity. It is demonstrated in any system you can think of, from virus resistance in operating systems to the relative strength of the huns versus the northern Chinese.

There's a simple proof of why competing apps should exist: (1) If customers use the third-party app, it clearly provides some functionality Apple's version does not, and customers benefit and the platform is stronger. (2) If customer do not use the third-party app, that app withers and dies and nobody is hurt.

But, ignoring how Premiere actually helps Final Cut, let's imagine a world in which Apple DID censor Premiere and Lightroom for "duplication [Apple's] existing functionality." What do you think Adobe would do with Photoshop? Flash? InDesign?

If you voted, "Make those suckers Windows-only," give yourself a gold star. Now think about how not having those applications would have affected where the Mac market is today. (Remember the lag in selling Intel machines until Adobe made Photoshop "Universal?" Imagine if it didn't run at all.)

Now imagine the next revolutionary application for phones, and what platform it's going to be on if Apple doesn't cut this crap out. (Hint: rhymes with "manbloid.")

--

"What about all the crap-ware? Aren't decent applications getting buried be all the stuff that's just being dumped out there in hopes of a few pity clicks?"

This is actually surprisingly easy to solve. Eventually, there are going to be tens and tens of thousands of apps on the App Store. Just simply paging randomly through applications to find one is already far too onerous to be practical.

The App Store needs to think of itself as two different parts - it already implements these parts, but the people who run the store need to understand that these two parts are fundamentally separate:

• Part one is a giant warehouse, where every piece of software that is not actively harmful is kept in case someone wants to buy it (remember, users can always get a refund). This warehouse can be searched with titles and keywords or an item can be directly linked.

• Part two is like a traditional storefront, with limited real estate, so only the best or coolest applications are highlighted. It's a recommendation engine, that highlights popular, highly-rated, or innovative applications.

Everyone can get into the warehouse. Only the select few can get into the storefront.

Customers win because they can choose whatever software they like, regardless of whether Apple "approves" of their choice or not. Apple wins because developers aren't alienated and don't all go develop for Android, and so Apple has the device where all the innovation is happening. And developers win because the obviously cool apps will be featured by Apple and get tons of his, but even if their app isn't "blessed" by Apple, if it's a neat enough idea it'll become popular on its own, through word-of-mouth.

--

It's a huge mistake for Apple to appoint themselves arbitrator of what's cool, or to even appear to do so. It's an equally huge mistake for Apple to decide that all innovation must come from Apple.

Let's list a handful of cool Apple apps: Safari. iTunes. Preview. Mail. iSync.

Did Apple invent the ideas or protocols behind any of these? Nope. Did Apple write the first implementations? Nope. Did Apple even write the original code they are using for their versions? Nope. (They licensed them all from third parties, except for Mail.)

When the next cool app comes out, and the next one after that, is it going to be on the iPhone, or on Android? It's really Apple's call.

--

UPDATE 9/23: Apple's response is reportedly to put the rejection letters under nondisclosure, as well. That's, uh, not a solution, guys. In fact, it's the opposite. It makes you look more draconian. And it's a useless gesture.

Do you REALLY think developers are not going to talk among ourselves, or leak info to the press, after we've worked for months on an application and then had it capriciously rejected by Apple? All the press has to say is, "we've heard of several developers who have been rejected" and there's nothing you can do; you can't subpoena people who aren't under NDA, and you won't know who among your NDA'd rejectees talked.

Seriously, Android is open and free. The tighter you try to clench your fists, the more developers you are going to drive away. Yes, you have the nicest frameworks and the prettiest hardware. But that's only the first part of what you need.

Labels: ,

Tuesday, July 29

“The Mojave Experiment:” Bad Science, Bad Marketing

I guess I should first admit I hate the show Punk’d. I mean, here’s a guy who is famous for lying about his age so he seems hipper, telling us that his show’s purpose it to deflate the big egos on other stars, and show them what truly matters in life. So he sets up situations where anyone would get upset, and then laughs when he upsets people. I call *cough*bullshit*cough*. (Also *cough*jerkface*cough*.)

So I have to admit I’m not predisposed to like The Mojave Experiment, where Microsoft took a bunch of “regular folks” XP users who were afraid of Vista, and told them Microsoft was going to show them a secret new operating system — which was actually Vista.

UNSURPRISINGLY, these people mostly said they liked Vista.

Now, if you read this blog, you know I pretty much hate Microsoft, because of their incredibly shady business practices (moreso in the early 1990s) and their shoddy products, most especially their operating systems, whose crappy user experience and programmer interfaces hold back the advance of technology. However, I’m not going to rail on Vista here. Seriously, I’m not.

What I am going to rail on is this “experiment.” (I use that word advisedly.)

--

I hate bad science. Hate it. Hate. So let’s look at not one, not two, but FOUR, yes FOUR (ah-ah-ah!) key flaws in this experiment, any single one of which would render its results meaningless:

The Placebo Effect: Every time I do a software release, no matter how minor, even if I just change one word, in French, to another French word, someone will send me mail or post on a forum, “Thanks, this release seems a lot faster!” Do I make fun of them? Or videotape them and put it on a blog? No. Because it’s just human nature. If we are told something is new-and-improved, we prime ourselves to believe it (c.f. Blink by Malcolm Gladwell, which I’ll refer to again in a bit) and make it so in our minds.

This is why we have, for example, blind taste tests: because humans are proven to not be able make dispassionate judgments about subjects they already know about. So, if you say to someone, “Hey, I’m giving you a top-secret peek at a new operating system from Microsoft, you’re incredibly lucky and special, and I really value your opinion!” of COURSE they are going to like it. They almost can’t not like it.

The Pepsi Challenge Effect: “The Pepsi Challenge” was a blind taste test that Pepsi overwhelmingly won (again, from Blink). Yet, most people still drink Coke. Why? Gladwell’s thesis is that a single sip of a soft drink is very different from drinking a whole can, which is the smallest unit most people imbibe. Pepsi usually wins the challenge because it's a sweeter drink, and initially people respond to this extra sweetness. But after drinking a can, Pepsi becomes cloying.

So, here I am, sat down in front of Mojave-err-Vista, and all I've ever used is XP. Well, look, nobody is doubting the graphics are prettier in Vista. It looks nice compare to XP (it should — they hired the guy who designed Aqua for Mac OS X).

I play with Mojave, and, yes, some system tasks are easier. Again, nobody doubts there are things that work much better. When I plug my iSight camera into Vista it shows up as a device and offers to let me take pictures in the Vista Explorer thingy. That’s kind of cool! Hey, I kind of like Mojave-nee-Vista!

Except, those glossy features aren’t why people downgrade from Vista to XP. Those are not the reason people hate on Vista!

Now, again, look — I don’t use Vista or XP for anything but games. I liked using Vista better, until the new UFO (X-Com) game that I had played great on XP, and wouldn’t launch at all on Vista. Then I bailed. That’s my story. There are apparently hundreds of others.

You, personally, may never have encountered a piece of hardware or an app that didn’t work on Vista, and you might be perfectly happy with it. I’m not going to try to argue you out of that happiness. My point is that the problems that Vista has become famous for are not the kinds of problems you encounter in a few minutes of playing with it in a controlled environment.

Vista is known for people initially liking it, then after a while discovering it’s not working for them, and “downgrading” to XP. This study has told us exactly what we already knew: that, initially, people like Vista. (Initially, people like having sex without condoms, too... it’s simply not a very good criterion all by itself.)

The Perfectly Controlled Environment Effect: Microsoft set up the hardware. Microsoft brought the accessories. Microsoft picked the software. Microsoft sat people down with Vista experts driving the mouse, and walked people through Vista. What an INCREDIBLE SHOCKER that in this INCREDIBLY TIGHTLY CONTROLLED ENVIRONMENT Vista performed OK!

Microsoft had set up an environment with a philosophy similar to Apple’s: “Look, we work well with this hardware and software, and too bad if you want something different.” Unfortunately, that’s NOT why people choose Windows. They hack together their own machines, and they want their software to still run.

Did any of these customers bring in their favorite games and try to play them? Did they bring in their graphics tablets and discover they fail?

Did any of the test machines ever say, “Oh, I’m sorry, Windows Genuine Advantage has determined that you may be running an invalid copy of Windows, so please jump through these hoops or we’ll disable some of your hardware”? I’m going to guess no. But I’ve seen this message a lot. And I own three valid licenses to Windows.

The Personal Tutor Effect: If you sit anyone down with an expert in a particular program, and the expert walks them through the features and answers their every question, chances are good that person is going to report that she had a good experience with the program. Very good, indeed.

Personal training is so important to customer experience that Apple thinks of it as a key asset of its Apple Stores. But Microsoft doesn’t have Apple Stores in real life. Or any analog. It’s you and a box with a holographic sticker on it. Good luck!

--

Microsoft has managed to prove that if you have a friendly expert on a controlled machine (with Vista pre-installed) showing a carefully selected subset of Vista features to an ignorant XP user for a few minutes, the XP user will often say he finds Vista acceptable. Wow.

This so-called experiment of Microsoft’s is an insult to science, and to our intelligence. And I am dying to see the out-takes from their shoot. I mean, how many people do you suppose like being told, “Hey, this giant, unpopular monopolistic software company just made an ass out of you! Ha ha! Our leading scienticians just PROVED that you LOVE VISTA and WANT TO MARRY IT. You are TOTALLY GAY for Vista! Haaaaaaa HAAAAAAA!”

Vista may or may not be an upgrade in user experience for most Windows customers. I personally prefer the feel of Vista over XP when the former works as well as the latter, but Vista has failed me on several occasions, and I also don’t enjoy running games MORE slowly than XP.

I've got to imagine that the Microsoft customers who took all the damn time to upgrade their machines to Vista, determined it was unworkable, and then had to take all the time to go BACK to XP, probably did so for a reason, possibly even a valid reason, and not because they had been swayed by bad word-of-mouth. I further imagine that these customers are completely livid at having Microsoft not say, “Oh, sorry, we’ll get right on those bugs,” but, instead, “You’re just stupidly following the crowd, and if you’d just free your mind up, you’ll discover you actually love Vista... hater.”

Is “Our Customers Are Stupid and Have No Idea What They Really Want” really Microsoft’s new mantra?

Again, wow.

Labels: , ,

Saturday, June 21

Delicious Library 2 has Shipped!

Ok, well, actually Delicious Library 2 shipped like four weeks ago. Sorry I didn't tell you. It's not because I don't care. Honestly, I tried to tell the press, but I think they're pretty sick of me, so there wasn't much of a splash on the news sites.

Sales have been great, though, so I can't complain.

But, hey, enough about me... what's up with your life? (Use blank space provided.)

_______ ______ _______ _____ _____ _____ ____

Really? Wow. Well, you know, stuff changes. I think it'll work out.

Oh, also, I launched a new company down at WWDC last week, called Golden % Braeburn. I'm going to license out the store I wrote to sell Delicious Library, since it was a huge pain in the tush to write, and I actually would have licensed a store from someone else if there'd been a decent option back when we launched Delicious Monster.

I know, it seems kind of pretentious for one guy to have two companies. Even *I* blush a little at it. But, it kind of makes sense — Golden % Braeburn's only going to have customers in the dozens, and they'll all be Mac developers. I didn't want to confuse my Delicious Monster customers by saying, "Oh, hey, now that you've bought Delicious Library, would you maybe be interested in buying a store to sell software on the internet?" That doesn't pass the "mom" test. (Incidentally, as my mom gets battier I'm finding it harder and harder to write software that passes the "mom" test. I'll have to go back to using Matas' mom as the eponymous mom from the test.)

You can see how it kind of de-focuses my message, yes?

---

A lot of people have been asking about Pimp My Code... No, it's not dead, it's just that those entries take approximately a day to write, and when I was in the final months (and months and months) of Delicious Library 2 I really felt like I owed it more to my customers to actually write my dang software than to publish my vanity blog. (I know, I wrote about my cat and girls and stuff — those entries take like half an hour. I don't have to fact-check them or anything.)

So, we'll have some code pimping here soon... coming up first is the on-the-fly localization code that's part of what I'll be sharing with all Golden % Braeburn customers (one of the advantages of licensing the store is you also get all my helper code), and also the system I'm trying to get Apple to switch to. You can evaluate for yourself whether it's better than AppleGlot or FoobleBlot or whatever you are using.

---

On a personal note, recently my shrink said to me, "Hey, Wil, why don't you drop the pimp act? Nobody actually looks at show-offs and thinks, 'Oooh, I like him.' In fact, everyone resents them."

This made a lot of sense, so I'm officially renouncing my phony pimpitude. Honestly, I'm just a geek who stays up late and plays GTA and makes clumsy passes at pretty girls and tries to write software. That's me.

Labels: ,

Saturday, February 9

My C4[1] Talk...

Mr. Rentczchxh has posted my talk from C4, and if you would enjoy watching a talk without paying, you can watch it. It's on hype, and how I generate it, but it also touches on other topics concerning having your own software company, like making good software, bundling, getting into stores, having sex with cylons, &c.

Watch it!

Or don't.

Labels: , , , ,

Tuesday, January 15

MacBook Air Haters: Suck My Dick

I thought of a lot of titles for this post, but, really, the first one that came to me seems the best.

I've read nothing but whining about the MacBook Air on Mac news sites since it came out this morning. Honestly, I just want to shake these people. Not, like, shake some sense into them, but shake them like you're not supposed to shake a baby.

The criticism all basically goes like this: "It's not like a MacBook Pro!"

No, really? Seriously? I mean, they introduced this new product, and it doesn't have the same specs as the MacBook Pro? God, that is bizarre. I wonder why they gave it a new name, and continue to sell the MacBook Pro, then, if it's not going to be exactly the same. I mean, that hardly makes sense, does it?

Ok, fine, there are some people who want, like, an extra battery Pack. But let's admit amongst ourselves that the overwhelming majority of people out there have never pulled the battery out of their existing laptops, and didn't even know or care that it comes out. In fact, if something goes wrong with their battery, this majority -- whom we'll call "NORMAL PEOPLE" for convenience -- will just take the damn machine to the store and get it fixed, whether it's user-serviceable or not. Because we don't want to hassle with it.

And there are people out there who do video editing on their MacBooks and want FireWire. Great! I respect your choice! You should buy a MacBook! It's an awesome machine! If you want to do that! Which I don't!

I've read journalists complain that you can't get at the hard drive in the MacBook Air. What? I have no fucking idea where the hard drive is in my MacBook Pro, and even if you drew me a damn diagram with labels and numbers and gave me a replacement drive I wouldn't open my machine even in exchange for a year with Zooey Deschanel. Ok, yes I would, but you get my point. I'm sorry, Zooey, I didn't mean it, baby.

Some journalists get so close to the truth it hurts, yet miss the large print. "OMG! The unit is all sealed and self-contained like the iPod!"

Yes... the iPod. That huge failure. Also, the iPhone. Stunning disappointment that it was. I mean, jeebus, why would Apple make ANOTHER device incredibly simple? Clearly the market has spoken, and it wants tons of ports and screws and geegaws and flippers... no, wait, no it doesn't.

You guys are TECHNOLOGY JOURNALISTS. You are GEAR HEADS. There is no shame in this, but, come on, recognize that what you think is cool is NOT what my mom thinks is cool, or what an executive thinks is cool, or what a lawyer who just wants to write a deposition on her laptop thinks is cool.

I'm a programmer. I just want a machine I can write software on. Once, I loved gadgets, too, but now I really just want a gadget that (a) works, and (b) is beautiful and easy-to-use. Sure, my iPhone doesn't have as many raw features as my lawyer's Blackberry + RAZR combined (she carries both). But I understand my iPhone, and I don't have to learn it, because it's learned me. I can take a photo in three seconds, and so can she (we tested) even though she'd never seen an iPhone before.

I'm not the freak, here. In this one instance. I'm with the majority. All software developers should be hailing the advent of the computer-as-appliance, because it means we'll be reaching into markets that are afraid of self-service machines.

I can't take apart my Kitchenaid blender. If they come out with a new motor, I'm screwed. It's not upgradeable! And when the motor blows (as it DID... grrr), I have to send it back. I can't take apart my car. When Lotus came out with a bolt-on supercharger, I had to (gasp) take it to the dealer to have it put in. Somehow I survived.

I don't buy a laptop because I want to replace its drive in a year. I buy it because it seems great and meets my needs today. If my needs magically morph over the coming year, I guess I'll sell it on eBay. Or pay Apple to throw in a different drive, or something. Honestly, I think we need to admit that just because machines get faster every year, doesn't mean that the majority of people need faster machines.

In two weeks I'll be writing Delicious Library 2 on a MacBook Air, every day. Because it's simple and beautiful, and I crave those things.

And all you haters can... well, buy one in six months, when you realize how nice it is.

--

Update 2/4/2008: My MacBook Air with 2GB of RAM and 1.8 GHz cores and the SSD compiles Delicious Library 2 from scratch in 1:59.4. My MacBook Pro with 3GB of RAM and 2.3GHz cores and an HD compile it in... 2:04.3.

MacBook Air FTW.

Labels: , ,

Saturday, December 22

Are You a Genie in a Bottle?

Oh...
You feel your brain's been locked up tight
Writing good code at only at night
Waiting for a job
To challenge you


You're cracking your knuckles, trying to code my way
But that don't mean I'll hire you right away
Laddy, Laddy, Laddy
(Lady, Lady, Lady?)


Yo yo...
Your mouth's saying hire me
Oh woe...
But my brain's saying let's see C


If you wanna work for me, laddy
There's a price you pay
I'm a stickler for design
You gotta write code the right way
If you want an ADA
I can make your wish come true
You gotta make a big impression
I gotta like what you do


I'm a stickler for design, laddy
Gotta write code the right way, money
I'm a stickler for design, laddy
Add, add, add, and then cut out


The iPhone's coming and AAPL's so not low
One more release of Library to go
Waiting for someone
Who impresses me


Fingers racing at the speed of light
And not just because I'm in a Twitter fight
Laddy, Laddy, Laddy
(Lady, Lady, Lady?)


Yo yo...
I only have one engineer to go
Oh woe...
But I'm still going to hire slow


If you wanna work for me
And then Apple someday
I'm a stickler for design
You gotta write code the right way
If you want to get low pay
I can make your wish come true
Send me sample code, laddy
And maybe I'll hire you


I'm a stickler for design, laddy
Gotta write code the right way, money
I'm a stickler for design, laddy
Send, send, send your sample out

Labels: , ,

Thursday, October 11

Open systems, closed systems, and the future of Apple TV.

I own an Apple TV. (Yah, I'm the one.) I turned it on when I first got it, thought it looked really pretty, then turned it off and never touched it again.

BUT! I think Apple TV will be an amazing device, and a massive success for Apple... after they make a few changes.

Why did I turn mine off? Well, because in my TV room I also have a Mac mini hooked up to a 2TB drive. The Mac mini runs Front Row, just like the Apple TV, so it could be looked as a more-expensive version of the same device.

However, the mini also runs iTunes, so I can buy new shows on the same system on which I'm watching TV. With the Apple TV, I have to have my laptop downstairs and turned on, and buy and download a new movie on the laptop before I switch over to my Apple TV to watch it. Clunky! (The situation is worse if you have a Mac Pro with your media on it -- what are you going to do, run upstairs to the computer room every time you want to buy a song or show?)

And because the mini has a huge drive hooked up to it, it also acts as a content server to the rest of my house, so I can have a unified home for all my music and TV shows and movies, whether ripped or bought from iTunes -- it's my "Windows Home Server" without the Windows. Unlike with the Apple TV, which can't have an external disk, I never have to bring a second system into the equation, so the mini ends up being cheaper than the Apple TV, because the Apple TV requires a separate computer.

And now I don't even have to bother storing my movies on my laptop, which is great, because my drive is already pretty damn full of porn. Uh, I mean builds of Delicious Library 2. In fact, nowadays if I want to buy a new movie and I'm not downstairs, I remotely access my mini from my laptop using Apple Remote Desktop and buy it from the version of iTunes running on the mini, so it's right on my server where I want it. Again, possible because the mini is running a full OS, not just Front Row.

Note that a lot of the movies and TV shows I want to watch aren't from iTunes -- but since the mini is an open system, I can download Perian, an open source QuickTime add-on, and play movies AVI, FLV, MKV, DivX, and a billion other gibberish words. Hell, I don't even know what an FLV is. But, the point is, some of the content I want to play is in these formats, and Apple doesn't support them in QuickTime natively, so I can't play them on my Apple TV, since it's a closed system.

If a friend brings over a DVD, I just pop it in the mini and we watch it. The DVD player under OS X has a much nicer interface (and remote!) than any other player I've had, so I put my super-expensive multi-region player into cold storage. The Apple TV doesn't have a DVD drive, and you can't hook one up, since it ignores external USB devices.

For my personal DVDs, I can rip them using Handbrake and store them in my Movies folder, and Front Row magically finds them! No more pawing through stacks of DVDs! I finally have a DVD jukebox, the ultimate geek dream. The Apple TV doesn't allow me to install any third-party software. Heck, I can't even rip my CDs on the Apple TV, since it doesn't run iTunes and doesn't have a CD drive.

--

To sum up: Apple TV doesn't allow developers to get at its UNIX underpinnings. It doesn't allow for modifications of its system software. It doesn't allow people to hook up an external disk or a DVD drive. It's a completely closed system. And, as of right now, it's pretty much a failure.

Apple took a guess as to what features the market would want, and because Apple didn't allow for third parties to tweak and optimize what their system does, their guess had to be perfect the first time. It wasn't, and the Apple TV stays off in my house.

There appears to be a battle being fought inside Apple, on whether Apple will be a company that provides solutions or provides tools. iTunes and Front Row are solutions -- really great solutions, sure. They are very friendly and they solve very specific problems beautifully. But they aren't particularly extensible by themselves. We can't make new functionality with them. (Note that if we have access to the underlying machine, as we do with the Mac mini, we are given the tools to modify these solutions -- we can make Front Row play MKV files by adding QuickTime components, even though it was written before MKV existed. We can make iTunes play WMVs.)

Having a system be open, having it able to freely accept peripherals and new programs, turns it into a tool as well as a solution. Each customer can decide what she wants the system to be, and developers can create new solutions -- and if those solve compelling problems, the entire system will be that much more successful. And, at the end of this cycle, the makers of the original tool can integrate these third-party solutions, so the tool grows for everyone.

The amazing thing about the Mac mini vs. the Apple TV is it perfectly encapsulates the debate between providing solutions or tools to your customers. They are very similar boxes, from a raw-capability point of view, but one was closed and the other open. The Apple TV is a solution, and right now it's desperately searching for people who have the problem it solves.

With the Mac mini, Apple provided us with a mix of solutions (iTunes, Front Row, etc) and tools (expandability, compilers, access to UNIX, access to plug-in directories). And, as a set-top box, the mini is incredible. Now, obviously, I have no idea what the mini's sales numbers are, and Apple hasn't really pushed the mini as a set-top box, and it does cost more than the Apple TV, blah blah blah... but it's clear to me that if the Apple TV did what the mini does, the Apple TV would be a GREAT set-top box and home server. It would own the Microsoft Home Server so hard that Ballmer would wake up with a sore back.

--

Why doesn't Apple just fix their solutions themselves, you say? If we all want MKV movies so much, why doesn't Apple just include support for it?

Well, first off, they probably should, in this particular example. But Apple only has so many engineers on QuickTime, and besides it may not be particularly popular to add support for bizarro file formats from other companies, especially when Apple is pushing MPEG-4 (aka QuickTime) as the One True Wrapper.

Second off, third parties can afford to sometimes make very limited or kind of half-baked solutions to dip a toe into the water, and if those are popular they can be fixed up later. Open Source projects don't make headlines in the NY Times when they push a major release that has some bugs, so we collectively get to invent a TON of different things let the market figure out which ones are pursuing. Consider the original CoverFlow, which was originally just a (really cool) demo by a third-party, in search of a problem to solve. Now Apple's bought it and put it into everything it ships except for iPod socks.

Apple can't anticipate every change that is coming, or which changes will end up being popular. No, I don't think they should give up trying to do so, but I do think they should share the burden. For instance, I've never seen an "FLV" file. Let's pretend for a minute that Apple did spend a bunch of time writing an FLV component for QuickTime, instead of speeding up h.264 encoding or something. And then, it turned out basically nobody used FLV, and Apple wasted their time and lost other neat functionality because of it.

Now, the nice thing about FLV support being add in Perian is that Apple essentially has a bunch of suckers (I use the term lovingly) taking all the risk for them. If nobody cares about third-party movie formats -- well, Apple didn't spend any time on it. Shrug! If EVERYBODY cares about them -- well, there they are! Go download 'em! In fact, hey, these are open source -- Apple could just start bundling with them. No effort spent on Apple's part, but their marketshare just got a lot bigger.

This is the beauty of open systems. Apple has a ton of very talented designers and very smart engineers. But they shouldn't have to be the ONLY smart people in the world, who must anticipate everything every customer might ever need. It's asking too much.

--

This whole post is ironic because Apple pays its AppleScript evangelists to say exactly what I'm saying, but back to us developers: Add scriptability to your apps! You can't anticipate everything the customer will want, but you can make your app into a tool! Allow other vendors to tie into your system and everyone wins!

--

I expect Apple will rev the Apple TV soon. One thing they could announce is that you can now rent movies over the internet, or maybe they'll announce you can access the iTunes store from directly inside Front Row. Either of these would be nice, sure. But they'd just be more pre-made solutions -- maybe they'd be popular enough to make the Apple TV a decent success, maybe not. But we would never know what Apple TV could be.

What I want Apple to announce is that they are merging the Apple TV with the Mac mini, and making it a hybrid closed/open system - a machine that boots into Front Row but can be used as a standard computer if you press some magic keys. A turn-key solution that can be opened up by advanced users and developers. The first mainstream consumer device that is infinitely hackable.

The world is waiting for such a product. Apple's the company to do it.

Set me free inside an Apple TV, see what I do for you.

Labels: ,

Wednesday, September 19

iPhone & iPod: contain or disengage?

Back when we had commies to worry about, someone came up with the concept of "engage and contain": eg, rather than avoid them as we'd been doing, we should trade and talk and travel there, and by doing so be able to contain their evil.

Similar ideas exist today on China and Iran (And, honestly, people -- do we really worry about being attacked by Iran? Really? Is this even on our RADAR?) Google is infamous recently for installing government-censored Google in China, with what I think were the purest of intentions -- the idea that more knowledge naturally makes the country more democratic.

But even Google executives have recently said they think they've made a mistake, because by getting too close to the Chinese government, they've had to make compromise after compromise, until finally Google finds themselves an accomplice to evil instead of an adversary to it.

--

So it is with iTunes. Apple has engaged two of the most cock-thirsty and money-grubbing conglomerates in the United States -- the movie and record industries -- in what we all wanted to believe was an attempt to engage and contain them. And, initially, we all agreed Apple was doing good: they had, for the first time, made legal downloads more compelling than stealing music. For a single data point, I've personally bought 915 songs from the iTunes music store, and hundreds of TV episodes and dozens of movies. I own six iPods and have bought 18 iPhones to give away.

And we all took heart when Steve published that letter saying how much he hated DRM, and how he'd drop it if the labels would, and even if the rumors are correct and EMI was already planning to drop DRM and Steve just rushed in and took credit, it was still a bold stance for him to take; a challenge to the rest of the industry. And I immediately upgraded all the tunes I could to iTunes Plus, and bought a bunch more albums. And it was good.

--

But recently, well... the generous view would be that Apple's screwing up, and the non-generous view would be that they are just plain getting greedy.

No, I'm not talking about the iPhone price reduction. Honestly, I was happy to see the price go down, even though I could have personally saved $3,000 if I'd waited to buy the 15 phone I bought before the reduction. I mean, c'est la vie, it's technology, baby.

But why is the iPhone locked to a single carrier, so I can't travel internationally with it? There's really only one viable reason: Apple wanted a share of the carrier's profits, which meant giving AT&T an exclusive deal. Which meant, we get screwed so Apple can make more money. It's that simple.

And the iPhone is a closed system, like the iPods before it, so third parties can only develop software for it if they are EXTREMELY close to Apple. This is an incredibly frightening trend. As Apple gets more and more of its revenue from non-Mac devices, they are also getting more and more of their revenue from devices that simply exclude third parties.

I know Steve Jobs; he's actually amazingly like my old business partner Mike Matas. They both love closed systems, for a simple reason -- they both know they're smarter than anyone else on the planet, and they don't need anyone else mucking up their systems. Steve would rather have no third parties for Mac OS X if he could get away with it -- Apple, of course, would do a much better job on anything, but since customers insist on Photoshop and Office and other apps, he puts up with them. (Well, except, now Apple has their own office suite.) Steve knows that on a computer, having a broad spectrum of apps is more important that having them all be Apple-perfect.

But on iPods, Airports, Apple TVs, and now iPhones, Apple wants every app perfect. Which is nice, in theory. In practice, it means innovation only happens at Apple's pace. The marketplace of ideas is much smaller, and the devices are much poorer because of it. (Example: Why can't I stream music from my iPhone or iPod touch to my Airport Express?)

There are some third parties making money from the iPod -- hardware accessory makers. But even then, Apple is trying to charge them a "Made for iPod" sticker tax... for adding no value. And since Apple controls the stores in which iPods are sold, they have a pretty effective stick to use against those who don't comply - you won't be where the players are. But with the latest iPods Apple's gone a step further, and disabled some docking stations that don't have a special chip in them provided by Apple; forcing customers to use only Apple-approved accessories. Apple's emulating the most pernicious qualities of Nintendo and the Microsoft XBox -- you pay us a tax or you don't work with our systems.

But Apple's "approval" just comes from Apple getting a cut. It's a measure of greed, not quality. We're not talking about THX-certification here, we're talking about extortion. This kind of lock-in seems very appealing for the company doing the locking early on, but it always, ALWAYS ends up biting the company in the butt. Ask IBM with their ubiquitous 970 servers and their extortionist service contracts. Oh, wait, those don't exist any more.

Consumers suffer from this. We suffer from increased prices and decreased competition and innovation. We suffer so Apple can make a few more bucks, when Apple is clearly not hurting for money. The core of Apple users has supported Apple for years -- we were there when Apple was hurting, we stuck with it, we nursed her back to health. It's our money she has now, and she's turning on us now that she's rich off it.

Then we come to ringtones. Every phone I've owned in the last ten years has allowed to make my own ringtones. I could upload MP3s all I wanted. Many had little tune editors built into the phone.

But since Apple is so close to the record companies, and they are already so grumpy with Apple, Apple did a deal that benefits record companies and Apple. Not artists, certainly not consumers. In order to use a 15-second snippet of some random song, I now must buy it not once, but TWICE. The amazing thing is that I must buy it THREE times if I own the song on CD -- I have to buy a DRM'ed version from the Apple Store, then buy the the ringtone, on TOP of the CD I already bought.

Oh, but wait, most artists haven't given permission for their songs to be used as ringtones. The vast majority of my collection simply can't be put on my iPhone as a ringtone. I could, if I wanted, manually press play on those songs whenever I see a friend calling, but that single "if" statement it'd require for the phone to do it -- well, that's simply Not Allowed.

Not that, uh, we have to pay attention to what the record companies think is Not Allowed, because we have already licensed the song for playback on any device if we bought a CD -- we are allowed to play it on our iPhone already. Just not in response to someone calling us. The record companies have MADE UP some new, retroactive copyright and Apple is enforcing it for them. The result is, a million customers don't get to do something cool with their iPhones.

Because of greed.

Honestly, I can see Apple saying, "Well, you see, the record companies would have been upset with us if we hadn't charged anything for ringtones." Yah, well, that's the price you get for engaging. The price for owning the distribution of the content and the hardware and the software is that you end up making compromises in the hardware and software in order to protect the content.

These are EXACTLY the compromises Sony has been making for years -- and because Sony's music and movie arms have been telling the Sony hardware arm to never do anything new or interesting without building in a ton of customer-unfriendly restrictions, Sony is now completely in the toilet. They have gone from an incredibly respected brand to a complete joke. Every time they introduce some new, crippled standard the industry kind of looks away in embarrassment, like Sony is the oafish guy at the party who is parked in front of the meatballs tray eating directly from the dish.

Now we see that iPod owners who upgrade to a newer iPod must re-buy the games they've already bought, because the new iPods are incompatible with the old. No credit given for having already bought an identical game. Imagine upgrading to a new computer, and having to buy a brand new copy of Windows Vista for it... Oh, wait, Microsoft does that, don't they? MICROSOFT does.

--

What should Steve do? Well, for starters, give up on trying to control everything. It's only going to keep hurting Apple, more and more, to control content and hardware and software. It's going to make them into the kind of mega-monopoly that we always, ALWAYS end up hating. Absolute power corrupts absolutely. 100% of the time.

Apple should license FairPlay, or allow iPods to play PlaysForSure (ha! I love that doublespeak) music. Either one. Basically, Apple should allow other music stores to sell DRM'ed music that works on iPods and iPhones.

Why? It's simple -- then Apple could tell record companies "go fug yourself" if they don't like Apple's terms, but Apple would still have a full range of music to play on its iPods. Remember, Apple makes all its money selling the hardware, not the songs. All Apple needs to do is to make sure there is a broad range of content available for iPods, it doesn't have to sell all that content itself.

And, in fact, it hurts Apple to sell all the content itself, because it makes Apple a focus for battles between the record industry and consumers. If there were a range of stores selling iPod-compatible music, with a range of different DRM rights, then the market could decide what terms it liked best.

The iTunes store could be the white knight -- it would only sign deals with record companies willing to "give" consumers the same rights they've had for years with CDs; eg, we can do whatever we want with our music as long as we don't broadcast it or give it to others. Other music stores could sell restrictive DRM'ed music, and, well, if the record companies are right, people would go to those other stores, and we consumers would all get what we deserve.

But if I'm right, then those other stores would be soundly ignored, and the record companies would come crawling back to Apple with their tails between their collective legs (where their balls should be, but aren't) and agree to reasonable terms.

Sure, we've seen some of this with Apple's negotiations with NBC, but unfortunately this one is all-or-nothing for Apple, because there's no alternate method for NBC's content to get onto iPods. Apple needs to be able to say, "Look, NBC, you want to be dumb-asses and try to sell people crap they don't want, fine -- we're still going to sell iPods that'll play your programs, we just won't sell your programs on the nicest internet store in the world. Your loss, suckers, call us when you change your mind."

Second, Apple should announce that it's going to write frameworks so third parties can write applications for iPods and iPhones. No, it won't be easy. But, seriously, there's no excuse. I mean, with the iPhone they could hide behind AT&T wanting assurances people won't use their phones off-network, or behind consumers wanting their iPhones to never crash. Which are both reasonable points, I admit. And, for the record, I've never written a line of code for the iPhone, although one of my employees has (in his spare time). I don't like to screw with undocumented APIs, life's too short.

But with the iPod Touch, what's Apple's excuse for locking up the platform? Why can't I write programs for this device? Who might it hurt? Why is Steve announcing that he's playing cat-and-mouse with developers who intend to do so? Is Apple so far removed from its customers that even when the latter overwhelming votes for extending a device (by downloading iPhone programs in the hundreds of thousands), Apple's response is, "No, you can't do that. We know what you want, you don't. You want AJAX apps, you just don't know it yet."

That sure reminds me of the old, crappy Apple. The one that almost went bankrupt because of its hubris.

I don't write programs for Apple because I worship Apple. I write programs for them because they have the best development environment. But I've always said that I will move from the platform the day Apple starts acting like a monopoly -- trying to make money by using its marketing position to extort money from users, instead of innovating so quickly that users willing throw money at Apple.

Sure, Apple's still doing a ton of innovating. I love Leopard. I love iPhone (x19). I love my iPods (x6). And I love the engineers at Apple and all my friends throughout the company.

But Apple has to always remember that simply making money CANNOT be its point of existence. The point of any company should be to make customers want to give it money, NOT to get money from customers. It's a subtle distinction that is the difference between good and evil.

Labels: ,

Thursday, August 2

Insider info on AAPL!

I know you're all chomping at the bit or champing at the bitte or biting and chomping or some such for me to post some more code, but, honestly, I'm not allowed to post Objective-C 2.0 code here (I asked) and I don't really use Objective-C 1.stinky any more, so... tough it out a little while longer. I've got something great in the cooker, just waiting for Leopard's release and my ungagging.

Meanwhile, in the spirit of stock market crooks everywhere, I thought I'd post some Apple news that I'm privy to that has nothing to do with me wanting to buy more stock at a falsely deflated price.

1) Apple has decided that cell phones "are for losers" and won't make any more after Thursday. I have it first-hand that they've called their suppliers and told them, "good luck, suckers."

2) Apple is also completely abandoning their computer business, in a bizarre turn. My friends on the inside said, "Look, Steve gets bored easily."

3) Basically, Apple is going to fold into itself and die. So, please, please, SELL SELL SELL that stock. Come on, be good little sheep, daddy needs a new Tesla. Seriously, you can trust me, because there's NO POSSIBLE WAY I could profit from Apple's stock price going down, unless I were to something incredibly complicated like buy it when it's low and then sell it when it bounces back again.

Labels: , ,

Friday, June 8

Wired.com: Yes, I had permission to talk.

Just in case anyone is wondering (especially people, say, at Apple), I got my entire interview with wired.com cleared with Apple PR before sending it off. (And, no, they didn't ask for any changes.)

In general, talking about the features of their unreleased OS would be a violation of my NDA(s) with Apple, but in this case Apple had already put up public web pages about the CoreAnimation features I mentioned, so legally speaking that creates an exception to my NDA.

But there may be other terms in the Leopard prerelease that I didn't notice, and, as you might imagine, I wanted to make EXTRA SURE I didn't step on anyone's toes, so I got explicit sign-off on my interview from the mother ship. Nobody can call me Jonathan Schwartz. (Interesting fact: Jonathan gave me my first contract when I formed The Omni Group, 16 years ago.)

--

I actually tried to get an exception for my blog, as well, so I could write a pimp-my-code article on how cool Objective-C 2.0 is. Sadly, no dice, so you'll have to wait until October. Not that I'm saying it's cool. Or not. I'm not saying one way or another. I offer no opinion at this time.

Labels: ,

Sunday, March 18

I ♥ spam.

William,"Wil."
I would like to introduce myself and our company to you."Our company?" Do you *also* have a frog in your pocket? Mine's name is Sir Jumpy!
We provide customized software systems to businesses like yours that allow you to control your brand more efficiently and disseminate your materials instantly.Businesses like mine? Exactly which businesses are like mine? Are there other monster-themed-independent-Mac-software-companies who are having trouble getting their brand in line and/or disseminating their materials? Also, why does that latter sound kind of naughty? Look, where and when I choose to disseminate is my business.
And can't I already disseminate materials instantly? I feel like I can. I've got this blog, I've got AdWords, I've got press releases going to major Mac sites... yup, seems like I'm rocking this "instant" thing.
Our system handles all mediums from print to broadcast and everything in between.I would assume that the word "from" in the phrase "from this to that" pretty much automatically connotes "everything in between." I mean, if someone asked you to recite the alphabet from a to z, you wouldn't say, "a, z" and be done, would you?
And how would I know if a particular medium is "in between" print and broadcasting, or is before print or after broadcasting, and thus is NOT included in your system. Would it have been so hard to just enumerate the media you handle? There really can't be that many. Plus, you've got the source code to your customized software, so you could, like, just copy and paste the list of media from the release notes or something.
By doing so, you will realize immediate savings that can free up even more money for your marketing efforts.I'm going to save money that I can then spend on the same activity? I have another idea -- why don't I start eating less so I can eat more?
And where exactly is this savings going to come from? Are you saying that I'm going to be able to fire my immense marketing department? "Look, guys, thanks for everything... I know it hasn't been easy for you... disseminating my materials, night and day... and you guys have tried, I know that. But there's this guy on the internet who says he can do it instantly. And, let's face it, I think we all know that recently our brand has been a little... well, out of control. I mean, c'mon, Bob, remember when you branded that sorority girl? Seriously, what were you thinking? You're lucky she was black-out drunk, or we would have been facing a hellacious lawsuit."
If you could spare 30 minutes, I would appreciate the opportunity to meet you and show you just how powerful our system is and how it can help your company in so many ways relating to marketing.If I could spare 30 minutes, I wouldn't own my own company. Seriously, I think you're going to have to be more specific on this custom software and what it does -- I mean, BESIDES dissemination and/or brand control, sure, I understand THAT perfectly.
I've not seen one person feel this is a waste of time yet,You can see feelings?
but rather literally be blown away with our system.Literally blown away? Really? You sure you're using "literally" correctly, here? Because, I've gotta be honest with you, this doesn't sound that inviting to me.
I look forward to hearing from you, thank you in advance for your time!Well, now you've heard, and you're welcome.

Labels: ,

Tuesday, February 20

"Piracy reduction can be a source of Windows revenue growth"

Thus spake Ballmer.

First off, someone kill me if I ever talk about "sources of revenue growth" intead of "making really cool products that people actually, you know, like and stuff."

Second, how freaking out of touch is this guy? He told analysts 'the company might "dial up" the intensity of antipiracy technology baked into Windows Vista as part of an effort to squeeze more revenue from China, India, Brazil, Russia and other emerging markets.'

Damn, that's a fine idea, Steve! Those freaking Chinese are sitting on piles of gold! They pirate your software because they are a greedy, greedy people, not because Windows Vista Basic costs $295 in China and laborers rake in about $160 a month.

It's perfectly reasonable to expect people to save up for two months to buy Vista, Steve. Really. You'd be willing to spend $150,000 of your money on Vista Basic, wouldn't you? I'm sure all you need to do is tighten those screws, and the giant Chinese turnip will start squirting sweet, sweet blood to sustain you.

--

Seriously, did Ballmer even look at the names of the countries he feels are under-performing in the business of making him stinking richer? These guys have poor citizens. Microsoft makes more than these countries do.

If "poor nations" is really your target market, you've got a problem. Why not make "Microsoft Vista / Homeless People Edition" as well, genius?

Meanwhile, Mac OS X doesn't have anti-piracy measures, and yet, somehow, it fumbles along, continuing to gain market share. Funny dat. Some might say it's actually BECAUSE Mac OS X doesn't annoy, limit, and intimidate its legitimate users with crappy activation codes and automatic degradation of the operating system if it feels you are a pirate, or you've upgraded your machine, or it's a Tuesday.

Here's my announcement for analysts, as the CEO of an international software firm: I'm NOT going to spend any time going after pirates in China, India, Brazil, or Russia. It's not worth my time and effort, and it's not worth alienating my real, paying customers with clunky copy-protection. I'd rather add cool stuff to my software than add anti-piracy cruft. And the pirates ALWAYS win, anyways. Always. If you fight hard enough, you end up with a situation like we have in the online music industry, where it's more convenient for consumers to get an unprotected, pirated song than to get a legitimate one, and then you actually DO lose paying customers.

So I'm putting pirates on notice: Meh!

Labels: ,

Wednesday, February 7

Steve Jobs v. Underwear Gnomes

"Eliminating online DRM appears to us to be an overly risky move that eliminates the potential for a future digital-only distribution model free of piracy," Deutsche Bank analyst Doug Mitchelson wrote in research note Wednesday.

"As easily as Mr. Jobs lectured the music industry on their DRM policies, he could have lectured the software industry (which includes Apple) for its complete unwillingness to pursue an industrywide DRM standard or make any effort to help music companies in their fight against digital piracy by working to make their media players recognize and not play pirated songs," Mitchelson wrote.
That's from an AP article on the record labels' response to Steve's call for them to stop requiring copy-protection on internet sales of music.

I told myself I was going to stay out of this, since everyone, his dog, and his dog's uncle are writing about Jobs' pseudo-blog post. Also, am I the only one who's a little jealous that Steve's first blog entry gets linked from the front page of Apple.com? Seriously, I suspect he pulled some strings there. My blog's never even gotten linked off Apple's "Hot News" page. (But, hey, I was once Google's Blogger of the Day, so I guess SOME big companies like me.)

Anywho, my point here, and I have one, is that this analyst is clearly an idiot. It's amazing, because he works for this huge bank, and you know he's making, well, bank, but he didn't even bother to read Steve's post.

Steve clearly said that every DRM scheme relies on secrets, which, eventually, someone either leaks or someone reverse-engineers. ALWAYS. There has never been a uncrackable copy-protection scheme, and, in fact, if you think you've invented one, I think some computer science professors would love to talk to you about the halting problem.

So, Doug, your first wrong assumption is this: there is no future of digital distribution that is "free of piracy." Period. If I can actually hear music, with my two ears, then I can copy it. You think going to analog and back is going to discourage pirates? Have you seen the handicam versions of Hollywood movies for sale in China, before they are released here? Also, who is this "us" that thinks the move is overly risky? Do you have a frog in your pocket, as well? (His name better not be Sir Jumpy.)

Ok, but that was just your first sentence, how about your second... oh, wait, you're wrong again. Twice. First, you say Apple should work with the industry to make a single standard, but Steve clearly said he'd be willing to license FairPlay to others, but he can't because of the music industry's terms with Apple that require prompt patching, and because the secrets that make DRM work at all would be broken and/or leaked all more quickly.

Seriously, Doug, you gotta use your noggin a bit. I want you to re-imagine your statement like this: "I think all banks should standardize the master combinations on their vaults, because that would make us all safer." Abitchanalystsezwhat?

But one dumb thing per sentence isn't enough for you, is it? Sure, those analysts who work for Credit Suisse may settle for less, but you're working for a German bank, dammit! So, go ahead, throw in some good old underwear-gnome-style magic, while you're on a roll: Apple should "help music companies in their fight against digital piracy by working to make their media players recognize and not play pirated songs."

Sure, right, you've demonstrated a real expertise in security theory, Doug, why don't you explain exactly how this system would work. I mean, it sounds great on paper — as does stealing underwear — but HOW should iPods detect pirated songs? You don't even have to code this; I just want to hear your theory, here. Broad outline.

I'll help... let's see... "recognize pirated songs"... so, the iPod would have to somehow recognize which songs loaded onto it were copyrighted and which ones weren't... so it'd need access to some giant database somewhere of every song and audiobook protected by the RIAA, so if you loaded a new song onto it, it could compare it to every song every recorded and see if that song is copyrighted or not, right? Ok, ok, this is all very do-able...

But, hmm, the nefarious user's computer may not be connected to the internet when she loads up pirated music onto her iPod, so the iPod itself would have to connect to this huge database — wirelessly, of course, because what pirate is going to willingly plug her iPod into the internet just so it can check up on her? So we need to build wireless transceivers into iPods — no problem, we wanted that anyways — and we need to have them programmed to automatically sign into any network they find. Maybe we should have them satellite-phone based, in case there are no 802.11 networks around? I'm just spitballing, here.

Of course, some of the DRM-free, copyrighted songs on iPods have been legitimately purchased by the iPod owners, and then legally RIPped into MP3s. So, it's not enough to just see if a song has been copyrighted, we also need a database of every tape, record, and CD every person in the world has ever purchased, plus whether or not they've ever sold or given any music away, so we can see if the particular owner of this iPod really has the right to listen to this song.

Nope, no technical hurdles so far.

Maybe I'm being to harsh on you. Maybe what you're saying is that iPods should detect songs that are currently protected by DRM and are loaded onto the iPod in violation of the terms of the DRM's license.

In which case, hey, guess what — iPods already do this. The "RM" part of "DRM," it is. So, don't you look smart for suggesting it.



Look, the computer industry is not holding out on you, OK, Doug? We've been fighting piracy of our wares for thirty-five years, now, and we've lost every round. If you want to be a pirate, you can go online right now and download enabling codes to all your favorite programs (including mine). Why do you think we can do better for the recording industry?



Seriously, why does the press keep calling analysts for quotes? It's pretty clear these chuckleheads don't know the first thing about computer science. Three major errors in two sentences... I feel like the AP could have made up facts and had a better chance at being correct. "The music industry feels that anyone buying an iPod should first give the RIAA some money, because it's pretty clear they are going to pirate music. I mean, just look at them... the way they are dressed... Also, the music industry feels all iPods should be made of candy, so that lime iPods actually taste like delicious limes, and we don't chip our teeth again."

Next time, AP, call me, I'll give you a damn quote. Here, the first one is free: "It's about time record execs pull their heads out of their asses, and, after the giant 'schloORK' sound is done ringing in their ears, they start treating valued customers like they are valued and/or customers, instead of like a seething criminal class. Yes, there will always be people who steal music. So either offer the rest of us a compelling alternative to being one of them, or die the dinosaur's death that you so richly deserve."

Labels: ,

Tuesday, January 16

Ad nauseam...

A couple years ago when I'd brag about Delicious Library (which I hardly ever do) I'd say, "All this without ever advertising!"

I stopped saying that because we do advertise now, and lying is bad. ("We" in this case is me and the frog in my pocket. I call him "Sir Jumpy.") I thought I'd share the little I've learned about advertising as a smallish software company. (Again, the Sir Jumpy and I incorporated a while ago, for tax reasons.)

- Advertising in magazines: pretty much sucks. Well, it might not suck, but you'll never know. First off, nobody reads magazines any more. Proof: what are you reading right now? Is it a magazine? No. There -- what more do you need? (If a single data point doesn't define a trend, then I guess our entire war on terror was a huge mistake?) Second, even if people did read magazines, you'd never know which ads of yours were effective, since there's no really good feedback mechanism of which I know. Third, magazine ads typically cost big bucks.

Magazine guys have told me, "Hey, advertising isn't to generate sales, it's to generate exposure!" OMGWTF?! If I wanted exposure I'd move the L.A. and go clubbing every night with Paris Hilton and her growing menagerie of hangers-on and/or venereal diseases. I WANT SALES, DAMMIT! I'm not paying for some squishy "exposure" thing. Give me money. That's what I want.

Also, magazine ads are really hard to compose, so you'll spend a bunch of time and effort trying to make one that looks all professional and shit, but you're a software developer, not a professional ad-making-type-person (hmm, there's probably a better word for that) so, if you'll forgive me for saying so, your ad is probably going to look like shit. And, you're probably going to forget to bring teh funny in your effort to look all professional, so you'll just end up alienating your core market of crazy independent thinkers with your attempts to look all sophistomicated. (Remember this is a community where the most remembered ads are a lady smashing a T.V. and "It sucks less.")

- Advertising on Mac-specific web sites: pretty good for me. My advice for this is the same advice I give for picking stocks: pick the sites that you yourself really like. (As opposed to "you notyourself" -- that guy has no taste.) I advertise on Crazy Apple Rumors because I think that guy is teh hilarious (that's two -- if I use "teh" one more time it's going to be funny, given the comedy rule of threes) and because it's a tiny site and he basically was willing to sell me the ad space for a hot dog and a cup of coffee.

Now, I don't get complete sell-thru data from C.A.R.S. (see next section), but I *do* get to track referrals from them to my site using the cool tools provided by my web host (in my case, it's called "Urchin"), so I can measure some of the efficacy of this, and I've found that, per dollar, C.A.R.S sends as many people my way as Google's ads. Since C.A.R.S. readers are also clearly Mac fans and have demonstrated their superior intellects by reading such a fine site, my estimation is they are more highly qualified customers than the generic Google referral, so this advertising was worth it to me, even though the total volume of hits I get is, of course, an order of magnitude smaller than with Google.

- Advertising on Google Adwords: good if you are VERY careful. For the two of you who don't know already, Google makes its zetazillion dollars a year by allowing advertisers to bid on placing ads on (a) search results pages, and (b) blogs and the like (called the "content network"). Because Google is made up of a bunch of well-massaged, well-fed, lovable computer wonks (seriously, Google employees are the Kobe Beef of computer programmers), they've designed an incredibly rich set of tools for setting up and monitoring your ads.

The basic idea is that the advertiser (me, in this case) says, "I'll pay up to 10 cents for Google to display my ad on a page that mentions 'Collecting' and 'DVDs'." If I'm among the top six or so bidders for any given page, my ad gets displayed. If my ad never makes it into the top six, or if nobody ever clicks on my ad, Google automatically disables it and tells me I better up my ante.

One of the coolest parts of their system, though, is that they automatically track customers who have used AdWords to get to my site, and I can tell Google if a particular "session" ended with a sale, so, for what I believe is the first time in the history of advertising, I can actually track exactly which ads, run where, cause customers to buy my product, not just "eyeball" it or be "exposed" to it or whatever. This is truly amazing.

There's a bunch of other factors in all this, but that's a rough outline of how it works. So, what's the problem? Well, the first thing scammers started doing was clicking on their competitors' ads; if you sell library software and you see an ad for your competitor, you might think, "Hey, I can just sit here clicking this link all day, and it'll cost him 10 cents every time! MUAH HA HA!" Now, I've set up a limit on AdWords on how much I'm willing to spend per day, but even so, if you false-click enough of my ads, they'll stop showing up for legitimate customers for the rest of the day, so you can essentially do a denial-of-service just by leaning on my ad, in addition to costing me money. CURSE YOU!

Sucks, huh? Well, Google claims they've figured out how to detect this, but of course isn't giving any details. In my experience, this kind of "click-fraud" isn't the primary problem with AdWords, but it's something to think about.

The latest form of fraud I've read about works like this: some unscrupulous site picks a bunch of words that are close to the words you'd use to advertise your product, but not quite (for example, common misspellings). They then bid, say, a penny for those words, since they are so uncommon. People who search for those words are led to a page on their site which contains Google content ads for YOUR site, for which you're paying ten cents a pop. Sure, it's not illegal, but it's kind of a sucky thing to do, in that it ends up getting around Google's automatic suggesting of similar, more successful searches, which would lead people directly to your ad and/or your site without your ad.

I don't know exactly of what kind of shenanigans I was the victim, but a couple months ago (November-December) I discovered that my cost-per-conversion (that's how many dollars I spent on advertising to generate a single sale) went from around $29 per customer to around $75 per customer. Yipes!

Now, even $29 per customer may seem high on a $40 product, but I like to fudge it in my head and think, "Sure, but think of the exposure!" I mean, there is a certain value in just having your name repeated, over and over, so I factor that in to how much I value AdWords. Also, there's a value to getting a customer for a 1.0 product at any price, because once gotten (gotten?) you don't have to advertise to her to get her to upgrade to 2.0.

But $75 per customer? So I'm losing $35 for each customer I get through AdWords? What am I, Sony?

So I started diving into Urchin, and the first thing I discovered is a VERY VERY high percentage of referrals to our site (ONLY during the months where I started losing money) came from some place called "www.losmejores-juegos.com/g-common2.googleadd.php". Take a good look at that URL... it just kind of sounds suspicious, doesn't it? I mean, a whole page just for "googleadd"? Why not just call your page "clickfraud.php"?

I went to that page (now defunct) and it was very much just a referral page full of ads. Hmm.

Then, on AdWords, I discovered that my ads on the "content network" were sucking up all of my ad budget every day, in just a couple hours, so I wouldn't run any ads for the rest of the day, in either the content network or for search pages.

Hmm and hmm, I say.

The smoking gun, however, was that these "content network" ads, while claiming to reach hundreds of thousands of people a week, were generating NO revenue. I mean, literally NONE. None of these "people" who were clicking through these ads (remember the user has to click on an ad for me to have to pay for it) to my site were ever buying my product!

Well, I know from earlier statistics (back before I was getting boned by los dickheads) what ratio of people normally buy Delicious Library after clicking through to our site, and it was WAY more than, say, 0%.

What was the solution? Well, in this case, I did two things: one is, I assumed that losmejores-juegos.com was up to no good, and added them to my AdWords list of sites that are simply not allowed to run my ads any more. Screw you guys, I'm going home.

Second, I discovered that historically, "content network" ads on Google really kind of suck -- they suck down the majority of my ad budget and almost never generate conversions (sales). So, to hell with them -- I lowered my bids on the content network down to almost nothing.

Result? My cost per new customer averaged $13.20 for the first ten days of January, instead of $75. Hooray for Zoidburg! Everything's coming up Millhouse! And other Groeing quotes!

I also wrote Google about all this (twice), but received a stock responses that basically said, "If you decide you don't want your ads on a certain site, just exclude them" and then "We watch for clickfraud in general, we're not going to look into this particular case."

So, to summarize: Google AdWords can be really good, but don't depend on Google to make sure you don't get boned. Concentrate on the search ads, and don't bid high for any ads on the content network right now. Honestly, the content network never really paid off for me even when I wasn't being actively defrauded, and recently it made me not only waste my entire ad budget, but also made me thus miss advertising to legitimate customers on the search side, because my budget was drained.

Sir Jumpy says: Google content network == teh suck.

Labels: ,

Sunday, December 17

Marketing Irony.

Those of you in the Mac community may have noticed a bit of a kerfuffle happening over the last week concerning MacHeist and whether it is good for small developers. I won't recreate a laundry list of links for you here, if you've missed out just follow this google search. As well, I've already stated my opinions, on Ars Technica, so I'm not going to go over them again here in my little vanity blog.

However, I did want to mention one ironic point that gives me a chuckle. Several of the independent developers who are complaining how unfair MacHeist is treating the software companies that have participated in their bundle seem to be, well, almost disgusted by marketing. Marketing is this nasty thing that lessens the value of whatever it is you're trying to sell.

I, obviously, don't mind marketing, and in fact some might call me (without malice) a marketing whore. This is a difference of opinion, though, and I am not going to try to evangelize my position on this. If you think marketing is dirty, well, ok. Nobody is getting hurt with your opinion, except possibly you. It's not like you're saying, "I think we can't tax oil because grandmothers would freeze in New England," which statement I would feel compelled to refute.

So, the irony here is that EVERYONE is making out like bandits because of this controversy. Every day this week another blog or journal or tech site has written about the controversy, and it makes headlines on the various meta-sites, and more people click through the stories to MacHeist and the individual sites of the various software developers in question, and all of our sales increase. The guys who participated in MacHeist, the guys who objected to it -- we're all getting paid now. And we're getting paid to keep arguing with each other. Seriously, if I were a crasser man (yes, there is a limit, thank you) I would be writing other developers right now, saying, "Ok, now you call me a stupid-face, and then I'll call your mom fat, and then..."

When you're a small developer, eyeballs == sales, because your biggest problem is simply that people haven't heard of you. It really is the case that any publicity is good publicity. I don't care if you came to my site because you heard a rumor that I like to keep a goat and a chicken in my bathroom, you're still going to end up reading about my product, and about one in ten people who read about it try it out. Ka-ching.

Extremely cynical viewers might even assume this entire scandal was cooked up by the indie community as an attention-getting measure. Personally, I doubt the original objectors were that scheming, but I do get a chuckle out of the idea that they have, accidentally and unwittingly, used the basest form of marketing (scandal and controversy) and increased their sales, in their effort to decry the evils of marketing.

--

Imagine you spotted someone who was yelling in the middle of the street for some damn reason, and you approached them and asked them to keep their voice down in public, and someone else walked by and said, "Good point! Here's $1,000!" With that boost, that vote of confidence, wouldn't you, maybe, start looking for other arguments you could make in public? And if you got paid $1,000 again, don't you think you'd maybe take that positive feedback and eventually spend all your time arguing in public, maybe even standing in the middle of the street yelling?

I wonder if they'll give away this dirty money, or let themselves be infected by it. I'm going to keep it, myself -- I didn't start this argument, I just signed up to be in a bundle I thought would be a lark. But, hey, thanks for the extra customers, guys. If you'd like to debate, say, politics next time, I'll be right here.

-W

PS to other developers: Your mom really is fat. Seriously. She's so fat she has a trash bag for a sock. When she hauls ass it takes two trips. She's so ugly you could press her face in dough and make monster cookies. She's so hairy it looks like she has Don King in a headlock.

Labels: ,

Sunday, January 15

Thinking, boxes, & what kittens can do to them.

Recently a fifteen-year-old developer wrote me:
Quite often I find myself outside lighting left over sulfer-powder mixes from the fireworks last 4th of July and thinking of product ideas. However I just can't think of a single unique idea that would actually turn out to be a hit. Everyone just tells me to think "outside of the box." Honestly, that never works for me.

Do you have any suggestions on how I might increase my developer creativity?

Delicious Library is what mostly sparked my mind, this is probably the most unique and yet still useful application released for Mac OS X.
Aw, I'm blushing. No, wait, I'm hungover. I get those two confused.

First off, left me discourage you from playing with homemade fireworks. My earlier advice notwithstanding, as a programmer you'll need your fingers and sight.

Second, my inclination is to tell you to think INSIDE the box. Because, honestly, when I think back to ideas that have changed the world, they aren't really that crazy. They're pretty normal when you think about it. It just took someone to put the pieces together and DO A GOOD JOB OF IT.

Let's take the canonical example, the iPod. Now, portable music players have existed for a long time. So that part was obvious. Digital music was completely taking off, led by iTunes. That part was obvious. Portable hard drives were very common. Obvious again.

So someone at Audible says: Gee, people like music to go, they have music on their computers, and we now have tiny hard drives that are portable... hmm, I could come up with a new device here. And Audible makes the first MP3 player. And the world yawns, because it's not that amazing and because it doesn't have a great user experience for downloading all the music you've stolen from the net. And Audible marketed it for audible book downloads (surprise!), which is frankly not nearly as exciting to our nearly illiterate, constantly gum-snapping country.

Then someone at Apple says, "Hey, we can deliver the whole experience, and make a device that's really beautiful, because we've got iTunes and we've got good engineers and we've got Jonathan Ives who is good at making things look sexy and is bizarrely muscular himself and was recently knighted but we don't have to call him sir."

So Apple makes the iPod, and everyone says, "Wow, they totally invented the MP3 market," which they totally didn't. They just did a good job of it. Hell, to this day Creative still sells some P.O.S. MP3 player called the Bedouin or some shit and nobody even acknowledges their existence. Creative is like that ugly guy who shows up to the party with bizarre, wispy, patchy facial hair and parks himself by the food table and everyone pretends not to notice him so they don't have to actually talk to him. (Note to ugly guy: sorry, man. Try shaving and eating right.)

THAT is the key. (No, not shaving.) The key is taking an idea that the world obviously wants and doing a GOOD job of it. This is how I've made my living.

I've only had like seven truly original ideas in my life. Three of them are in OmniGraffle 3 (see if you can find 'em!) and a couple more are in OmniWeb. (iSight barcode scanning is one, as well.)

All the others are just refinements of other people's ideas. I stand on the shoulders of giants, which weighs them down a ton, and frankly they probably resent it, but it works great for me.

Delicious Library was not an original idea. It was a new approach to an idea that's been around for as long as computers. Hell, longer. I think the first cavemen carved on rocks when they lent out their, uh, sticks to other cavemen. Which wasn't efficient, but still worked better than Microsoft Windows. There are many other shareware programs that do approximately the same thing as ours, in theory, they just kind of bite. We took the idea of a media cataloging app and we made the friendliest, most fun version of it we could. But the basic idea was NOT ours. We don't ever claim it was.

So, think inside the box. Look at what people are using right now. Can you do a better job? Is there any chance people will switch to yours, or is there a market leader that's so entrenched you're going to get killed? Or can you write a simple version of what is now a program only for professionals? Can you do the converse? Can you adapt an idea from one market to another, like making a word processor for screenwriters? (Don't really do this, it's been done.)

I mean, sure, don't write a generic word processor, even if you think you are a super-genius. Word is a de-facto standard, and you don't want to mess with that. And don't re-write Excel. But, for example, when the Excel product manager got up on stage at MacWorld several years ago and said, "We've found that 85% of our customers use Excel just to make lists and outlines," we (Omni) said, "Shoot, that'll be our next product. We can do a GOOD job of making lists and outlines, and sell it for a lot less." And OmniOutliner was a pretty decent success.

Use all kinds of software yourself. Play with Final Cut Pro even though you don't make movies, because there are metaphors in there you need to know. Talk to people about what they do with software. Watch everyone around you and what they are doing, and not doing, on their computers. If there's a solution out there to some problem, but it's so complicated that most people don't use it, then there effectively IS no solution; it's a wide-open market. In my experience, programs don't get simpler in subsequent versions. You can kill your competition if you come out of the gate with something simple and friendly and cheap, even if they have a head-start with a crappier program.

Labels: ,

Monday, December 12

Sock Puppet Marketing...

Just today I was taught the wonderful term "Sock Puppeting," which is when someone creates extra accounts to post in online forums and agree with themselves: "Oh, man, I totally support Bob's crazy position... he's so smart!"

Well, I'd like to introduce the term "sock puppet marketing," which is when someone from a company reviews his own products and fails to disclose he's not a neutral party.

I started noticing that every time I see Delicious Library mentioned on any site on the web, someone inevitably posts a comment about MediaMan, which is a program for Windows that completely ripped off our interface. Like, enough so that we should sue. I mean, go ahead, go to their site, and look at their shelves. Tell me that's not copyright infringement. And I should mention, as it will come up in a bit, that MediaMan used to be free, but now costs $39.95. (Seriously... they even copied our price.)

Now, sure, some mentions of competitors are to be expected, but we have several competitors on Mac OS X and several more on Windows and Linux, yet the one I keep seeing mentioned in the comments, over and over, is MediaMan.

So let's look at some web forums I found that wrote articles about Delicious Library, and the comments left on those sites by user(s):

From Delicious Construction Kit | B.Mann Consulting
Delicious Idea!
Submitted by Christoph (not verified) on July 4, 2005 - 6:45am.

Very interesting thoughts, Boris. The idea of creating new libraries is really good, and so is the "post to blog" feature.

BTW, did you know that there's a similar software for Windows users? => MediaMan at www.imediaman.com.

Best regards

Christoph

Hmm. Sure, Christoph could just be a fan of MediaMan. I mean, hey, people recommend Delicious Library all the time, so people could be recommending MediaMan.

Wait, though...

From Vestal Design Blog: Deliciousmonster, not Delicious Monster

1 Comments:


Christoph said...

There's a similar software available for Windows users - MediaMan. Just in case this is of interest to you.

5:12 PM

Wow, that Christoph likes MediaMan so much so that he was the only person to post a response here. It seems like now matter how little the site, Christoph is the man on the scene if they mention Delicious Library...

From VMUNIX Blues » Delicious Monster and Delicious Lattes
Christoph  |  June 29th, 2005 at 5:20 pm

Just in case you’re interested, a similar piece of software is available for Windows:

MediaMan

I think it looks & feels so good, you could think you’re using a Mac. ;-) And it’s free, BTW.

Boy, you can't beat that free price, can you, Christoph! I mean, if it were true. And you were one of only two people who left comments here! But, I wonder, did you catch that mention of Delicious Library in "Richard's Notes"?

From Richard's Notes >> Blog Archive >> Delicious Monster
Christoph says:
June 29th, 2005 at 8:25 PM

Richard, David,

there's a similar piece of software for Windows called MediaMan. It works with all available Amazon stores US, UK, Germany, Japan, France & Canada. And it's even free! :)

Regards

Christoph

Free! Wow! That sounds great, except it's not.

--

Now, I invite the reader to click on Christoph's name up there, to see what Christoph set as his home page in Blogger. It's a live link that I copied from the actual web pages. Christoph's home page is imediaman.com. Notice he doesn't mention any affiliation with that company in his text, when he was gushing over how great the look and feel of MediaMan is.

Could this Christoph be none other than Christoph Janz, whose e-mail is <cjanz@imediaman.com>, according to this now-deleted, Google-cached Word document I found from iMediaMan site? (And is this the same Christoph Janz of the blog Christoph Janz on Web 2.0)?

Honestly, that's not a rhetorical question... it seems likely to me, but I can't know, of course. And it's not like I'm accusing Chistoph of doing anything illegal here, although if he were working for iMediaMan back in June or July, I believe what he did highly unethical. Some might find it just to be a clever marketing, but they'll certainly never get a job with my companies.

--

But, hey, the phrase "Sock Puppet" is funny, like, "Monkey" or "Galooly."

Labels: , ,

Saturday, November 19

Failure is Success.

While I hate to lend credence to the current Republican habit of double-speak ("Fighting is Safety", "Dissent is Terrorism", "Religion is Hate"), there are some dissonant clichés which actually make sense.

So it is with, "We have nothing to fear but fear itself," for example. Now, obviously, we DO have other things to fear, like, say, having our democratic government completely co-opted by corrupt, tiny-minded men whose only interest is in gathering and preserving wealth and power, at any cost.

Wait, where was I? Oh, that's right. Fear. I think what our friend was trying to warn us away from was something I've been trying to fight all my life, which is a fear of failure which is greater than the consequences of actually failing.

I mean, if someone asked you to jump out of a plane, you might rightfully say, "Uh, if this fails, I'll be a thin layer, so, no thanks." And I'm not going to take you to task for that.

But if I say, "Hey, if you want to design games, you should look at modding some current games and then put them out there on the web," and you say, "Well, I could, but I'd probably suck at it, so it's easier to sit here and watch Blind Date," then I'd have a problem, and I might even give you a stern lecture during that extra-long commercial break that comes after the second date wrap-up and just before the "Hall of Shame," which is never really very good anyways.

Irrational fear of failure is endemic in our society; I think it's the primary factor keeping most people from doing the great things they're meant to do. I've personally never met anyone who worked hard and fearlessly at a field and did NOT succeed. I know there must occasionally BE people who fail despite their best efforts, because I've heard "the stories," but there are SO MANY MORE who simply won't try because they've heard that you can't win.

Failing is to be strived for! If you aren't failing, you aren't at the edge of the envelope of your abilities, and if you aren't at the edge, you aren't stretching yourself, so you aren't learning, so you're just wasting time. Failing is how nature succeeds. Evolution works through failure of the poorest (they get et) more than survival of the fittest. Muscles grow because you work them to failure, and they then respond by getting stronger. Your spinal cord learns not to touch fire by getting burnt. Failure is not just handled gracefully by nature, it is critical.

So, seriously, have you failed today? If not, why the heck not? I mean, think of the consequences of failing, and if they aren't deadly and/or permanently disabling, then go ahead and bite off more than you can chew. Try to cook something that you just made up. Take a bike ride that's too far. Take your car into an empty parking lot and do donuts until you learn where the tires give. Start a project that might be too big for you.

What's the worst that's going to happen? You'll get laughed at? By Erin Martens, that cute girl you had a crush on in 11th grade? And she'll say, "That's why I never went out with you, you stupid idiot, it's because you're such a failure all the time"? And you'll die alone and unliked, and they won't discover your body until it's half-eaten by your cats, who actually had enough food, they just ate you out of spite?

You're right. When's Blind Date on?

--

Blog redesign: You may notice my blog looks a wee bit different. I'd like to thank everyone who sent me entries; there were many lovely ones. 20-year-old Spaniard Alex Bendiken's struck me the right way, so he gets 15 seconds of fame (from me, at least), and his iPod will be sent off as soon as he sends me his address. Congratulations, Alex!

Labels:

Friday, July 1

Student Talk Reloaded: The Podcast

So, my WWDC slides have been downloaded 26,000 times since I put them up a week ago. Yipes!

A number of people asked me to post a podcast of the talk, as well, so last night I stayed up for an extra hour and a half and tried to replicate what I said when I originally presented the slides, so if you're a glutton for punishment you can now have an extra sense filled with Wil goodness. [This is actually an expanded version of the talk, since I had lots of time.]

Here's a smaller version of the slides (same content, exactly) that a nice reader sent me, to save my bandwidth:

Slides of the talk

And here's the exciting podcast:

Podcast, to go with the slides

Labels: ,

Saturday, June 25

Piracy...

Some people on the arstechnica forums asked me to weigh in on piracy, and I posted this in response. It's something I meant to include in my main talk.

The basic deal with piracy is simple, and I wish I'd remembered to put this in my talk (I think it's on the O'Reilly roundtable MP3 that's on the net somewhere)...

Don't worry much about piracy. If you spend more than a couple days a year worrying about it, you're fooling yourself.

Here's the simple facts: pirates steal applications. They don't pay for them. It doesn't hurt you to have something "stolen" that (a) is virtual and (b) wasn't going to be purchased. In fact, it helps you in a small way, as pirates usually are also young, loud, early-adopters. Which is to say, if pirates love your stuff, you've got a bunch of advocates on your side.

Look, I used to steal games when I was a kid. Thousands of dollars worth. I didn't have any money then, and I loved software. I felt a little guilty about it, but I told myself when I struck it rich, I'd repay 'em. (Note to Bill Budge, Free Fall Associates, and Nasir: I owe you guys $$$. Please write me if you'd like a check. )

Nowadays, I won't steal software even if someone offers it to me and I am just about to buy it. I'd rather (a) have the manual, (b) reward the author, (c) spread the love, (d) get the karma, (e) get a discount on the next upgrade, (f) know I have the latest version, (g) get tech support, (h) not wonder if it has viruses, (i) be able to re-install from the CD (or net) if needed, (j) not get fined $50,000 per piece of software on my laptop if a disgruntled ex-employee tells the BSA on me.

Here's the deal: 15-year-old boys with no money pirate software. The harder you make it to crack the software, the more elite they'll feel when they do it, so the harder they'll work to publicize their feat.

But, and let me stress this point, IF YOUR BUSINESS MODEL IS TO SELL SOFTWARE TO 15-YEAR-OLD BOYS, YOU ARE SCREWED ALREADY.

The ONLY point of licensing schemes is to remind honest people that you'd like to be paid. That's all. Most people will NOT actively take steps to pirate software -- it's a line they won't cross. If they do cross that line, they're not your customer any more; they're pirates, and you no longer care about them one way or another.

So, yes, you should have some minimal license checking. It ideally should have the person's name embedded in the license, so that when you give a license to a legitimate customer she's not tempted to just "loan" it to her friends, because there's that SCARLET LETTER on every copy that gets passed around that points back to her.

But don't spend any time trying to block hackers from cracking your license scheme. There's not a scheme in the world that can't be cracked. I can list half a dozen ways to get around our licensing.

Now, shareware isn't very effective because people find it too easy to just click "later" every time and ignore the message. They tell themselves, "Oh, I should license soon," but they put it off and off and off. I know, I really, really meant to buy LaunchBar but I kept putting it off until Spotlight finally came out. (Note to LaunchBar guy: see above about e-mailing me if you'd like a check. Sorry about that.)

Labels: ,

Friday, June 24

Student Talk from WWDC 2005.

So, some innocent Apple employees asked me to talk to their "scholarship" students the Sunday before WWDC proper started, as their sort of "celebrity" speaker. Well, that's the word they used with me, but it may have just been to induce me to fly down early. Certainly, I hope the students weren't told they had a celebrity, because if you're expecting J-lo and all you get is W-il, you're p-ssed.

I spent three or four whole days working on this talk, and I was really tickled with how well it was received. One guy afterwards told me I'd inspired him to join the priesthood. Seriously.

A lot of the students (that is, more than one) asked me to put my slides online, and I found that old-skool PDF is the most compact way to do this. Sadly, without the audio portion you're missing most the jokes (and it's harder to tell what lines on the slides are jokes and which aren't), but I don't really have the time right now to make a huge multi-media presentation. Maybe I'll make a podcast later.

WWDC_Student_Talk.pdf

I should also mention that if you look at the slides you'll see another picture of my Ardent Red Lotus Elise. This bears mentioning because I actually agonized about whether to show off my car at all, ever. I decided that, in this context, it was OK, because essentially the whole talk is about how if you follow your dream you'll not only be happy, but you'll also be financially secure, and it's easier to believe that kind of advice when it's given to you by someone not LIVING IN A SHACK DOWN BY THE RIVER. I asked some of the students afterwards if they thought the car thing was totally pretentious and they said no, it came off the right way.

None-the-less, if you're a blog reader this will be the second time, for you, that you see a red Elise. For me, the second time I mentioned the Elise was the first time you saw it in the blog (the first time was in the student talk, weeks ago), and I figured the cork was already off the bottle and I can use it in jokes. Seriously, I'm not one of those people who is all about how cool he is because he drives a funny-looking car. (I'm cool because I'm so dang handsome. Snap!)

--

Because many sites are linking directly to this post and not the newer one with the podcast, I've added the podcast here, too:

Podcast, to go with the slides

Labels: , ,

Friday, March 4

Becoming a programmer for Windows is like becoming a dentist for a Tyrannosaurus Rex

I wrote this in 1998. It's funny how much less controversial it seems now. I just read it again and, frankly, I'm still proud of it. So, here it is again, complete and unchanged. Basically, the only thing I'd take back at this point is that I'm not that president of Omni any more.


Wil Shipley, President, Omni Development, Inc.
May 5, 1998

Over the last year and a half since I was transplanted into the community, I've occasionally heard Mac developers on various forums cry out, "Why don't I just become a developer for Windows?" This is in response to various perceived injuries perpetrated by Apple, including possibly dropping QuickDraw GX, changing the Mac UI, embracing UNIX, and increasing the price of some developer support options.

Usually, I assume this is a rhetorical question, like a pouty teenager asking, "Well, why don't I just go jump off a bridge, then?" But, I feel that too many innocent observers may have heard this question too often, and asked, with all sincerity, "Why don't all programmers use Windows? The Windows market is bigger, after all."

Lots of small programmers have a vision that working with Microsoft is like being one of those little toothbrush birds for crocodiles -- sure, the crocodile is the one eating the zebras and gazelles, but there's plenty of crumbs left in the cracks between his teeth. The crocodiles don't hurt the birds, as they appreciate clean teeth, and the tiny birds can live very well off the morsels that the 20-foot crocodile deems not worth bothering with, so everybody wins.

The problem with this analogy is toothbrush birds never grow up to be crocodiles -- they spend their whole lives just living off the gunk in crocodile's teeth. Most people don't set out to create a tiny company; they want to create the next killer app, and become, if not the next Microsoft, maybe the next Adobe, or the next MacroMedia. Nobody wants to stay a tiny bird forever, but that means giving up the gunk and going for the big game.

A better simile is that becoming a programmer for Windows is like becoming a dentist for a Tyrannosaurus Rex. Sure, the market is big (lots of seats, lots of teeth), but both Microsoft and the king of dinos are vicious carnivores, and both will snap their jaws shut as soon as share their leavings with you. Rexes don't distinguish between symbiotic birds and predators -- it's all meat to them.

Microsoft is deathly afraid that now they are a huge company they won't have creative ideas. This is a good fear, because it's true: how much has Word changed in the last 8 years? How much has Excel changed? I'm not talking about adding a feature here and a feature there, I'm talking about really changing the way people use software.

Microsoft doesn't know how to innovate any more. The problem is that when Microsoft looks at new ideas, they don't evaluate whether the idea will move the industry forward, they ask, "how will it help us sell more copies of Windows?" (This is an actual quote of Bill Gates in The Seattle Weekly, April 30, 1998).

So, their business model has come to this: wait for young companies to create new products, and if the product starts to be successful, crush the company and take its market. Some examples, by no means complete:

In 1995, Netscape pioneered web browsers, but Microsoft simply bought some code, hired a bunch of programmers to duplicate Netscape's work, and now gives away Internet Explorer. They paid Apple millions to bundle Internet Explorer instead of Netscape with Mac OS, and Microsoft is planning to bundle IE with Win98. Microsoft even claimed (in a letter sent to Wall Street analysts last week) that it'll severely impact the economy if they can't include a web browser in Win98, even though the economy ran just fine before 1995, when Netscape brought the first commercial web browsers to market.

The code Microsoft licensed was from Spyglass, who had written a web client. Microsoft only gave them a couple hundred thousand dollars up front, but promised a percentage of sales to Spyglass. Well, since Microsoft gives away Internet Explorer, they didn't pay Spyglass anything. Spyglass sued. According to PCWeek (April 20, 1998), Spyglass had to abandon that market and moved into embedded applications, which Microsoft moved into as well. So, Spyglass switched to making "integrated offerings for Microsoft products" in order to, in the words of Spyglass VP Mike Tyrell, "not be 'Microsofted' again".

In 1996, Netscape decided the money was really in servers, and started selling their first commercial web server. In response Microsoft wrote their internet server and bundled it, free, with Windows NT.

In 1994, Microsoft started to license compression technology from a company called Stac, which invented the original disk-doubler. But, after Microsoft had looked at Stac's source code, Microsoft said, "Nah, we're going to write our own and crush you. Thanks anyway." Stac sued Microsoft, but Microsoft counter-sued Stac, and Microsoft got an injunction against Stac preventing them from shipping their disk doubler until the suit was resolved. Then, since they had tied up Stac's revenue source, Microsoft just sat back and waited for Stac to run out of money as the legal system slowly cranked away. If you can't guess who won, check out the DoubleSpace utility that ships with Win95.

Perhaps the best example of Microsoft's voraciousness is their dealings with Intuit, creators of Quicken, which was at one point the best-selling PC software of all time. Microsoft first came out with Money, to compete with Quicken. Nobody wanted Money. So Microsoft reduced the price -- offering 'special deals' on Money for as low as $10. (This is a practice called 'dumping', and it's supposedly illegal in America -- it's what we accused Japanese semiconductor makers of doing with memory chips years back when we put a huge tariff on such imports.)

Even at the low, low price, nobody bought Money. So Microsoft made an offer to buy Intuit, which the government, in their very first stirring against Microsoft's monopoly, blocked. Microsoft then started teaming up with banks, paying them to advertise that transactions could be directly downloaded into Microsoft Money, conveniently overlooking the fact that the file format was the Quicken format, and therefore Quicken would work just as well. Finally, Microsoft started giving away Money with subscriptions to MSDN.

Do I have to go on? Microsoft wants total domination of the software market. If you create a mildly successful program on Windows, Microsoft will attempt to kill you. They've already got a stomach full of the severed heads of other innovators just like you.

Yes, the Mac market is smaller. But it's been a long time since Apple had the kind of clout to say offhandedly, "We can't decide whether to become your customer or to put you out of business," as a Microsoft executive said to a friend of Robert X. Cringely.

It comes down to a choice: do you want to support Microsoft, the monopoly whose only goal is to increase their market share; or do you want to support Apple, the company that is trying to move technology forward?

Put this way, it sounds like a moral dilemma, and many people believe companies should be amoral and market-driven. But in truth, it's not a moral dilemma, it's a question of whether you want to help make Microsoft stronger (so they'll be that much more powerful when they decide to crush you), or you want to fight them now.

The beauty is that it's actually easier to succeed when fighting than when giving in. My company made millions just servicing the NEXTSTEP market, which was a tiny fraction of the industry even when compared to the Mac market. It was easier to advertise in a small market, easier to reach customers, and NeXT, like Apple today, was eager to help us rather than crush us. Writing code for Yellow Box is ten times easier than writing Windows code. Three programmers at Omni have written a web browser that has the features of Netscape, IE and more, which runs on Rhapsody, NT, 95, and (soon) Mac OS.

Microsoft isn't invincible. They won't be around forever. Dinosaurs are huge and hidebound, and some global change always comes along for which they aren't prepared. We little birds just have to stay out of their mouths in the meantime.

Labels: ,