Sunday, September 28
Or, I Test-Drove a Tesla and All I Got Was These Lousy Adrenaline Shakes
Short version: Tesla.
--
Long version: I've had insomnia since I was a wee lad, and at night I often calm my brain by thinking up idealized objects. Optimal house cooling, unpowered water purification, the ultimate graphics card, the coolest car
ever. It's a good exercise, I think: if you don't have an idea of what you'd like something to become, you won't ever get it there.
Some of these crazy dreams have come true, which is particularly disturbing. When I was 10 or so I thought up a crazy idea for fonts that would be described by curves, and rendered in real-time by the graphics card at the best possible resolution, instead of having hand-tuned bitmaps. Of course, I was 10, so I had no idea what the math would be, I just figured, THIS would be the coolest, ultimate form of fonts. A few years later PostScript was in printers, and a few years after that Display PostScript hit the desktop, then TrueType, and now nobody even remembers bitmap-only fonts.
Also as a kid I'd try to think up the ultimate car... What if you had no gearbox - you just had one gear and an electric motor that could spin as fast as you wanted directly driving the wheels, so the mapping between the accelerator pedal and your speed would be practically linear — the way kids imagine
all cars work until they actually learn to drive and have to figure out gears and clutches and all that.
But, wait, this ideal car would have so much power, you'd end up jump off the road if you accidentally used the slightest bit too much pressure on the accelerator. Oh, I know, the car would have a computer controlling the wheels, and it'd detect when you started to slip and automatically compensate. But, hold on again, isn't the fun in driving being able to burn out and spin around and stuff? Maybe we need the ability to disable the computer, sometimes.
--
And, now, again:
Tesla. Here it is; the crazy dream-car that a kid might design in his naivety of how the world really works, except some engineers didn't get the memo on what's possible, and went ahead and built it.
Tesla.
It's crazy-fast. It handles like a jet fighter. It gets the equivalent of about 140 mpg. It has no gears. It requires almost no maintenance.e It's gorgeous. It's whisper-quiet. And, in Seattle, runs off hydro power.
--
So, yes, I test-drove a Tesla today, for five laps on a closed course in the parking lot of a defunct K-mart. Then I took my supercharged Lotus Elise around the same course. (The Tesla I drove was an engineering prototype but is said to be very close to the one I'll get next year.)
I expected the Tesla to have more power than the Elise (based on the Tesla's 0-60 of about 4 seconds, as opposed to the supercharged Elise's estimated 4.5-7-ish), and it didn't disappoint.
The first part of the course was a straight, wide-open acceleration towards two tiny cones, which were where you were supposed to brake "as hard as you can" so you didn't end up flying out of the lot and into the street. It turns out they were conservative on this by a bit; by my fifth lap I'd found the Tesla could brake down enough to make the turn in about half the space they'd given me. The car was nimble.
And, compared to the Lotus, the Tesla seemed faster to the cones; at first not by a huge amount, but the huge difference came when the Lotus hit the top of its first gear it started stuttering from the electronic limiter, and I had get out of gear and shift. The Tesla just kept accelerating the whole time, so by the time it hit the cones it was going WAY faster.
Remember: this car is NOT an automatic: there are no damn gears. It's not shifting for you; there's no annoying pauses where the car decides what gear you might want, right in the middle of your burn. The engine is basically hooked up directly to the damn wheels. It's amazing. It has that responsive feeling of when you are driving a normal car in first gear, except it has that no matter how fast you are going.
Taking the 'S' cones in the Tesla, on the second or third lap I was finally able to get the tires to chirp if I turned at the highest speed I could get out of the turn. But the car never slid out of control, even a little bit. The nose was always pointed where I wanted, and the back tires were always ready to accelerate.
This was a huge advantage of the Tesla; I'm not a race-car driver, and I admit that it's pretty hard for me to take a sharp turn at high speed AND be shifting in the Elise. Hell, it's enough hard to hold the damn steering wheel with
two hands at that speed. In the Tesla, at any point during a turn I could tap the accelerator and I was (a) guaranteed to be in gear, and (b) guaranteed to be in the RIGHT gear. Because, you know... there's only one gear, and it was "fast" gear.
Call me a wuss if you like, but I found it a lot more fun to be concentrating on just pointing the wheel and calculating the amount of slide, and NOT trying to shift and steer and clutch all at once. I'm just not that good.
The big surprise from the Tesla was when I took my Elise through the same course. The Elise is several hundred pounds lighter and has stickier tires on the front and the same on the rear.
And the Elise slid around the cones out-of-control. I'd take a cone at high speed and the Elise would start jump-skipping its tires sideways, and steering and acceleration were offline until it'd stop. I'd lose momentum and end up kind of off-course.

I don't really have a good explanation for why the Elise handled worse for me than the heavier Tesla. Maybe having precise control of the accelerator throughout turns enabled me to keep the tires spinning in the road-wise direction? Maybe the Tesla's slightly longer wheelbase or different weight distribution made a big difference? Maybe the traction control on the Tesla is really that good? I don't know.
I do know that, going around the cones as fast as I could, the Elise lost control sliding sideways for a little bit on both laps, where the Tesla merely chirped her tires and drove on.
Normally, features like "traction control" or "no shifting" put me off of a car, because they essentially translate to "low-performance-idiot-mode." You turn them on and you feel like the car is driving and you're a passenger. I've hated 'em in Ferraris and Mercedes SLs.
With the Tesla, these features are put in to allow you to drive
harder and
faster and still feel completely in command. *I* am driving. I feel the road. I feel the wheels.
--
The only drawbacks I found were: the Tesla seemed a little slow immediately off the line - full-throttle starts have a slight pause, and THEN you are pressed back against your seat. I guess this is the price you pay for the One Gear also allowing you to go 100 mph (or so). The other drawback is that, yah, the Tesla really doesn't want to maintain a speed above 100 mph for very long. It just isn't designed for that.
Sure, I don't drive about 100 very
often, but, you know — sometimes it's nice. Not a deal-breaker, though.
--
In Seattle, I've been told a law just got passed where we pay no sales tax on very efficient vehicles, so I avoid the ~9% extra charge. Also, it looks as though the president will sign into law a bill that gives a $7,500 tax
credit (NOT a deduction, but a full CREDIT), to people that buy a car with a battery at least as big as the one in the upcoming Chevy Volt, and the Tesla happens to qualify as well.
This doesn't make the Tesla exactly cheap, but it's sure nice to save $16,000.
--
The Tesla people were uniformly cool and
real and fun. During the open house there wasn't a single question they dodged. They offered up problems they'd found, troubles they'd had getting into production, issues that loom on the horizon.
They test-drove the car themselves because they still all love it so much. One guy turned off traction control (we were not allowed to) and demonstrated how much power the car really has — it was, frankly, daunting, and he got waved down after two laps because the guy in charge thought he was going to power-slide into the defunct K-mart. (A very real possibility.)
My friend commented as we left how nice the Tesla executives were. I am excited about this company, again. Excited to be little tiny part of a team that is so committed to changing the world AND having fun. Excited to have a dealer that is a "company store," where the salespeople aren't on commission, and really
want to help you love their product.
I like to spend my money with companies whose philosophies align with mine: in my life I've only made one purchase at Wal*mart, I don't eat Domino's pizza, I have vegetables delivered from small organic local farms, etc, etc, blah blah blah. My point is, I am *happy* to give these guys my money.
I am happy to have a chance to say, with my dollars, "You guys are doing the right things, and I support you."
--
For sale: Ardent Red 2005 Lotus Elise, with aftermarket supercharger. One driver, excellent condition.
Labels: random ideas
Monday, September 22
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 CrapThere'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: business, mac community
Tuesday, July 29
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: business, mac community, stories
Monday, July 7
Last week, a customer reported a bug to me in
Delicious Library 2: when he first launched version two, his version one data would start to be imported, but after waiting for tens of minutes watching the annoying aqua progress bar creep along, his entire machine would crash. Every time.
His collection was so huge it took me two solid days to download his version one files onto my machine. When I ran Delicious Library 2 on my Air in debug mode, it converted his data for about thirty minutes, then crashed with an exception that said the database file was 'corrupt'. I tried to look where it had crashed, but XCode was reporting that
all my source code files were gone. In fact, so were my iTunes songs, and everything in my Documents folder. I opened Finder and Terminal, and verified that the directories were indeed empty. No error messages, no residual files. Just empty. Panic.
A minute or so later, all these files magically came back. Everything. As if nothing had happened.
After thinking about this overnight (while staying away from the computer), I changed one word in my source code, and the customer's file loaded perfectly, in only twenty minutes.
Part 1: TriageIn my personal pantheon of bugs, this report was triaged at the top. Roughly, my triage order is:
- Data-loss bugs
- Unavoidable crashers
- Functionality-blocking bugs
- Avoidable crashers
- Avoidable bugs
- Misfeatures
- Performance issues
- Feature suggestions
- UI feedback
This is, of course, a rough ordering: obviously if a customer is trying to publish a single item to her website and it's taking a half hour, then I'm obviously going to bump that up the list over someone whose app crashes when she leans on the "a" key for a three hours in the "Actors" field. (For the record, neither of those are real bugs.)
But, note that in the first case, the "performance" issue has made the feature essentially unusable, so it's really a functionality-blocking bug. Further, if publishing is synchronous, then this bug is blocking access to the application for an unacceptable amount of time, and could be considered a crasher of sorts.
Weighing the bug my real user reported, we see that it's The Perfect Storm, a trifecta that crashes the app (and the
machine!), every time (on launch!!), blocks all functionality, and, to add insult to injury, it takes a long time to do so. (
The food wasn't very good, and the portions were very small.)
This bug was suddenly at the top of my list.
Part 2: Machine CrashersHow can machines crash due to user programs? The machine-crashing bug is exceedingly rare in shipping applications; in my experience, there are two primary causes: some system resource gets used up by the program, or the program confuses the window server (the graphics system) and the machine's primary interface locks up.
As an operating system matures, it's usually harder and harder to confuse the window server (I haven't seen such a bug in OS X in a long time), but resource over-allocation problems remain.
One of the goals of the operating system's designers is to not allow programs running in user space to ever crash the entire machine. Some would say it's a primary goal, even. But in real life, most operating systems can be brought to their knees (if not fully knocked-out) by user code.
Consider a simple application that just allocates memory in a tight loop. As the operating system runs this application and starts running out of free physical RAM pages, it starts throwing away the pages used by other applications, in a process that goes kind of like this: oh, you haven't used mail in a few seconds, I'll throw that away for now, and, uh, also this web browser, and, uh, damn, the window server's backing store, and, uh, this essential system font server, and, uh...
Pretty soon you've effectively locked up the system, just because it's going to take so long to page in any particular resource
the windowing system needs to run that by the time it's loaded off the disk your rogue process has caused some
other vital page to be unloaded.
Now, the internet is full of flames about how this is completely unacceptable, and OS designers are 100% to blame and yadda yadda yadda. These are, in my opinion, probably from computer science PhD students who believe in a perfect world of provable programming and the Easter Bunny.
Here in the realm of actually making money, if running your program causes a user's computer to crash, she doesn't care if it's Apple's "fault" — she's going to post all over the interwebs that
your program sucks, and ask
you for her money back. Now, since you're
not a PhD student, you like money, so this is bad.
And, honestly, why blame the OS designer? Your app was written incorrectly. It was going to crash or be killed by the OS anyhow. This is a bug you need to fix either way. And the user would be pissed at you even if the OS catches your app and says, "Sorry, this application has gone crazy, we're killing it."
You can see why OS designers don't spend all their time worrying about such issues. It's not as if a lot of real malware is written to crash machines — like biological viruses, successful software viruses don't
kill the host, they co-exist with the host and use a minimum of resources while replicating themselves. Viruses that kill the host go extinct very quickly.
Further, to allow programmers to get the most out of the hardware, OS designers
need to let us live right on the edge. The more blocks and checks they put between us and the hardware, the slower our programs are going to run. Imagine if the Apple said to programmers: "Ok, in order to not let you dominate the hardware, we will only let you use 50% of the CPU at any one time." Now imagine you're a user, running World of Warcraft on your brand-new $4,000 ultra-lux machine, and you're only getting half the framerate you
should be, and
would be under, say, Windows.
You'd be pissed. And Apple would lose a customer.
InterludeLook, I don't want to seem mean. I'm sure she's a very nice person in real life, and probably quite smart. And, she's a very handsome woman, I'm not denying that. But, honestly, Jessica Alba can't act. It's just not a skill she has.
It's OK. Not everyone was meant to be an actress. But you really have to admit your limitations to yourself. I know, for instance, I'll never be a supermodel. I'm OK with that. I'd make a lousy president, too. I accept it.
It's time to stop, Jessica. You're costing people money. And YOU would be happier doing something you know you're good at, that you could feel good about. There are LOTS of professions for preternaturally beautiful women out there. You could be one of my assistants, for instance.
Part 3: Diagnosis? Delicious!How do you even
begin to fix a bug where things are going great for a while, then your machine crashes and/or all your files disappear?
Remember that the very
first thing you do, when looking at any bug, before you even start thinking about it, and
long before you look at your code, is replicate it. You can't debug what you can't replicate, and user reports are usually lacking in some details that your trained eye will catch.
At this point, I'd already replicated the crash, and I'd seen a valuable clue the user hadn't seen: my files had disappeared. The key clue.
Next, in a case like this, you'd need to make sure you have a recent backup of your machine, because,
damn. I mean, I've been programming for a long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long, long time, and I've never seen a bug like that.
Ever.
Ok: your machine is crashing, so you suspect that it's running out of some resource. Memory is the most common resource to run out of and the easiest to find and fix, so you run your program under Instruments, with the leak detection tool. You really should have done this before you released your application, but you were totally burnt-out and you'd been in beta for months and didn't seem to have any major issues, so you failed to do everything just right. Now you're paying.
Your code will run slow as hell under Instruments, but in the end, like that hot gypsy lady at the fair, she will magically tell you, "Hey, you leaked this object exactly here and at exactly this time, so cut it out." It's a small miracle, and the team who wrote this has two to go and they're saints, bitches.
Sadly, at this point I had also already run Instruments / leaks weeks before, and although it had found a major image leak in 2.0 (whoopsie!) which had kept some users from loading very large libraries, and released it in 2.0.1, this fix didn't help our guy. In fact, my virtual memory usage was holding steady at 1.26 GB as I loaded his collection, which is really not bad considering every process on my system right now has between 0.5 to 1.18 GB of VM right now, under no load.
Not memory. Hmm. Now you think. Think think think. I think better if I distract myself from the problem and let my hind-brain take over. So I went and played Assassin's Creed, and murdered some fools who had waged war on their fellow man, or made the mistake of calling me peasant, or gotten in my way, or looked funny, or stood around yelling too much about how Salem Ali is a strong man. Honestly, once you start stabbing people in the neck it's hard to stop.
All the while, I'm swishing ideas around in my mouth to see if they taste right. Graphics memory leak? Often a window server will have its own mini-memory manager: was I overloading it as I converted 40,000 cover images from version one? Maybe, but... Instruments had actually found my leak of graphics memory before, so I kind of trusted that it would have found any others I might have had.
Stab. Stab stab. Gurgle.Also, my
files had disappeared. That doesn't
seem like a graphics problem.
Stab. Man, I love jumping from a tall building and landing with my blade in someone's throat. I am so bad-ass.What resources are related to files? Honestly, I don't know a lot about modern file systems; they are kind of a black box to me. When I went to college, we had integers which represented files. And we liked it!
But Mach had introduced a new kind of I/O, called memory-mapped I/O, that I was using extensively. A possible culprit?
Part 4: Memories of Memory MappingBack when NeXTstep 0.8 was first unveiled, one of its key revolutions was it was based on not just plain UNIX, but Mach UNIX, which was a really damn fast and clever re-write of the lowest layers of UNIX, with some extra fun added in, including cheap and fast inter-process communication. Avie Tevanian had been working on Mach as a PhD student at Carnegie Mellon, and Steve Jobs recognized he was a star and hired him straight away. (Microsoft countered by hiring Avie's old advisor to work on NT, which is kind of like Microsoft hiring my mom because I'm a good programmer.)
One of the great things Mach gave us was a new way to read files, which process was
really slow by default under vanilla UNIX, for reasons I don't fully understand. Mach introduced the metaphor of
memory-mapped files, which used the virtual memory system to map a file on disk onto an address somewhere in VM, without actually loading anything from the disk at first. The cool thing was your program could access any byte in this special VM region, and the correct part of the file would be paged in
on-demand, using the exact same mechanism that the VM system used to extend applications' physical memory by mapping their virtual memory spaces to a large reserved area on the disk.
This turned out to be very fast, because it had none of the overhead of normal UNIX I/O, which usually involved reading a byte or so at a time using a UNIX function, which involved an expensive system trap and had a lot of overhead (checking to see if enough bytes have been read in from the disk and if not reading in some more) compared to just fetching a memory location. In the latter case, once a page was fetched in you can fetch all the other bytes on that page for free, no system calls at all, just a standard memory access. Big win.
NeXTstep 1.0 gave us to memory streams, which were awesome, and NeXTStep 2.0 (new capitalization) used memory mapped files by default when you read files using its fancy new NSData class, and all new applications ran a lot faster and life was good.
Well, mostly good. One problem with memory-mapped I/O is that if the user deletes or moves the file on the disk, the OS can't get to it any more, but the programmer never really knows when this might happen, so she don't know whether to just go ahead and make a copy of the entire file into memory or not. So it's not a good idea to keep memory-mapped files open for a long time.
Another, more recent, problem is that virtual memory on 32-bit systems is capped at 4GB, which means the largest file you can memory-map is a lot smaller than 4GB (since your app is going to use, like, at least 1GB of VM itself). Nowadays, it's not uncommon for users to have 6GB movie files in their iTunes. Oops.
So, for a while now, Apple has been moving gently away from memory-mapping I/O. For example, you have to set a flag (CSResourcesFileMapped) in your applications' Info.plist if you want to memory-map the resource files that the AppKit and Foundation frameworks load for you; otherwise they are read using different (unknown) techniques, which may or may not be slower (see below).
Fortuitously, however, I'd just been part of a discussion on a developer mailing list about optimized file system access, and learned an important fact, which gave me the solution.
Part 5: Everything New is Old AgainI have exalted memory-mapped I/O for exactly twenty years now, but just a week or so ago an Apple engineer told me that the latest tests show that Apple's new-fangled "uncached" access method had at least as good of performance as memory-mapped I/O, with neither of the two big drawbacks listed above. It was The New Way.
Here's a bit from the
NSData page:
NSMappedRead- A hint indicating the file should be mapped into virtual memory, if possible.
Available in Mac OS X v10.4 and later.
Declared in NSData.h
NSUncachedRead- A hint indicating the file should not be stored in the file-system caches.
For data being read once and discarded, this option can improve performance.
Available in Mac OS X v10.4 and later.
Declared in NSData.h
Sadly, there's not a lot of guidance there when you should or shouldn't use either option. Also, there's no hint if the options are mutually exclusive. Why would you use NSMappedRead, and why not? Who knows?
But now I'd heard the Word, and It Was Good. I resolved then and there to look over my code, and see when I did and didn't need NSMappedRead. But I didn't want to just naively trust that NSUncachedRead was
always better (APIs so rarely work like that), so I'd need to do timing tests. So, in fact, I was in the middle of these timing tests (on iTunes importing) when I got this new bug report, so I had some experience with memory-mapped vs. cached access.
Part 6: I Love It When a Plan Comes TogetherOk, I'm reading in 40,000 image files as part of the conversion, and storing them in my database. At some point the filesystem goes on vacation and says, to hell with you, I'm not reading any more damn files, even if they are just directories. Hrmmm. Hrmmmmmmmmmm.
"Oh, please, spare my li-- gurgle!"Maybe the problem was there was some huge bug in Apple's Mach, where if you open too many files in a short period of time, the filesystem tried to, like, cache the results, and the cache blew up, and as a result the filesystem incorrectly just would fail to open any more files, instead of flushing the cache. This made a
little sense, since the problem had gone away spontaneously after a minute or so, like a cache problem would when the cache auto-flushed.
One thing I knew, KNEW wasn't the problem was that I had too many file open simultaneously. Because the way my code worked, I'd open the files using NSData's dataWithContentsOfMappedFile:, do a little massaging on the image inside, and then the files would auto-close themselves when the NSData was autoreleased, which I would correctly do every 100 files I read in.
I
knew this. Knew! I've also been around long enough to know that whenever I
know the operating system must be bugged, since
my code is correct, I should take a damn close look at my code. The old adage (not mine) is that 99% of the time operating system bugs are actually bugs in your program, and the other 1% of the time they are still bugs in your program, so look harder, dammit.
So I traced through the steps. First I read the image file into the NSData. Right. It's auto-released, so I'm not leaking it. Then, I set the CoreData object's data field to point to the same NSData. Still no leak. Then, the NSData is autoreleased, correctly, and the system resources should be freed up.
Wait a minute. Wait. It's autoreleased, but that doesn't mean it's
deallocated. It just means the reference count is decremented. But someone else might still have a pointer to it... in fact, I had
just assigned the same NSData to the CoreData object. Knowing it was an immutable data, the CoreData object didn't make a
copy of my data, it just retained the
exact same NSData object. The one that had an open memory-map of the image file!
CoreData's objects persist in memory until you flush them explicitly, which means anything they are holding also persists. So, I was creating 40,000 memory-mapped files and not freeing any of them. That, uh... seemed fishy. Like, five-course-sushi-dinner fishy.
Now, I could flush these cover objects explicitly using CoreData; I'd have to read in a batch of old objects, convert them, save everything, then flush the covers, then read in another batch. In fact, I was already using batches (following
CoreData's best practice guidelines, see "Importing in Batches"), but flushing would add a layer of complexity. I'd have to keep track of the objects I created separately, and loop through and flush them.
Sure, that's easy code to write. But I'm making a 2.0.2 release, and in x.x.y releases, I want to change as little code as possible to fix the bug, because my beta testers weren't going to be excited about testing a release that adds no features. I will test it myself, of course, and I'd ask anyone who reported the bug to test it, but doing something as heavy-duty as suddenly flushing a bunch of objects
could have side effects, and I wouldn't have enough people to test for those. Yes, in theory flushing
shouldn't have side-effects, but in that same world, no code should ever have bugs and communism is a really nifty idea.
But, I'd been told that NSUncachedRead was as good as NSMappedRead, without as many drawbacks. Would it also not tie up the same system resources? Certainly the word "uncached" seemed promising. I'd try it.
I kind of exaggerated on the "one word" in my preamble — it
would have been a one word change, but I'd used the older interface on NSData:
| NSData *imageData = [NSData dataWithContentsOfMappedFile:fullImagePath]; |
I replaced it with this line (which would say NSMappedRead instead of NSUncachedRead to be equivalent to the above):
NSData *imageData = [NSData dataWithContentsOfFile:fullImagePath options:NSUncachedRead error:&error]; |
Thus removing the memory-mapping.
Importing the large collection worked perfectly. The problem was solved, and now I could upgrade truly HUGE collections.
Part 7: Where Did We Go Wrong?We had tested Delicious Library 2 with importing an enormous sample file of 10,000 Delicious Library 1 items. However, it took so long to build up such a library in version 1 that we ended up building the sample library using a custom program, and as a result that test file didn't have any images in it. But beta testers were enrolled specifically because they had collections of thousands of items, and we had the largest closed beta of any program I've worked on. We also tested with our friends' Delicious Library 1 files, of about 3,300 items.
But this customer had over 4,400 items in Delicious Library 1. That, it turned out, was a few over a limit we had no idea existed. Damn it.
It's a bug we should have caught. We should have spent the time to get the images in the 10,000 item file. I messed up.
Software is written by humans. Humans get tired. Humans become discouraged. They aren't perfect beings. As developers, we want to pretend this isn't so, that our software springs from our head whole and immaculate like the goddess Athena. Customers don't want to hear us admit that we fail.
The measure of a man cannot be whether he ever makes mistakes, because he
will make mistakes. It's what he does in response to his mistakes. The same is true of companies.
We have to apologize, we have to fix the problem, and we have to learn from our mistakes.
Unfortunately, Delicious Monster has so much mail from releasing version 2, we're failing at responding to customers right now. We are a tiny company, and had one support person, and although we're bringing a second up to speed, it takes time to teach someone how to solve our users' problems. Our backlog of mail messages is finally going down — as of today, we're at 1,300, down from 3,000 a week or so after our release. We still get several hundred messages a day, though, and it takes time just to sort through and see which ones are bugs and which ones are customers needing help and which ones are people just saying, "Hey, that's cool, you know what else would be cool?"
When this customer finally got through to me, I apologized to him for the bug and the crummy response time, and elevated his bug to the top. I let him know what I was doing to fix it, and got the fix done in a couple days. I also gave him a free license to Delicious Library 2, since he'd been unable to buy it yet.
I had already known that when I launched 2.0, I couldn't immediately go on vacation; that I'd have to jump in to the 2.0.1 release for any urgent bugs that customers found. What I didn't realize was how much support e-mail would spike. That's the lesson I learned: I need to have extra people ready to do support when I do a major release. I'm not sure how to do this and not be paying people to twiddle their thumbs the rest of the time, but that's something I'll have to figure out. And I apologize to my customers for this screw-up.
The beta for 2.0.2 is out now, at
http://delicious-monster.com/downloads/Delicious%20Library%202%20Beta/DeliciousLibrary2.zip.
It'll load a ton of items.
Saturday, June 21
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: business, stories
Saturday, April 12
In 1987 I was a senior in high school and my mother was in the hospital with leukemia; a long, very painful experimental treatment would either cure her (but leave her changed for life) or she would die.
With the profits I'd made from my summer job, I had bought a $400 Technics portable CD player, one of the very first ones ever made. It was solid metal and heavy as hell, and the rechargeable battery pack was as big as the CD player itself and weighed twice again as much. It still plays perfectly to this day.
I was left with her lame car and a giant house to myself and not much supervision. It would have been many a teen's dream, but not mine, since I was truly alone; after I moved back to the States for the eleventh and twelfth grades I never once had a friend over after school, or went over to a friend's house, or went to a party, or a dance; I worked in my little computer lab from when I got home to when I went to sleep. I graduated with honors but didn't show up. I was programming at the time.
Some nights I would take my mom's (new-model) Chevy Nova out and just drive around the waterfront, listening to my little CD player. There were two discs in particular for when I felt most alone: Steve Winwood's "Back in the High Life" and Peter Gabriel's "So". Both artists were consummate musicians, at the height of their craft -- neither would ever make another album as successful. Both created incredibly rich soundscapes, and both talked about loss, and longing.
I don't share either album with people very often, these days, because I've discovered I am incredibly upset if my guests are anything below astounded by them. I require rapt attention, possibly sighs, if you hear the Blessed Two. I feel as if I am physically cutting away my skin and pulling it aside with tongs to show my viscera, the actual core of my being, and if my listeners are all, "Can we put on some GOOD music after this?" I just want to smite them.
To this day if I hear "Don't Give Up" I will cry. I may not bawl, but you can see little tears in my eyes. I can see the park on Lake Washington I would drive to. I can feel the slight cold of the wind through my not-at-all-fashionable windbreaker. I can see the giant CD player on its huge strap around my neck. And I feel the hurting, of wanting to not be alone. Of waiting it to be over.
--
The happiest and saddest part, I think, of liking someone of the opposite sex... really liking, as in, really admiring the person, thinking that she is, in fact, a really good person, a decent person, a person whose morals and smarts and sense of humor and accomplishments you actually think are amazing -- not just, like, "Damn, she got pretty tummy," which latter sentiment I have also fallen prey to -- the happiest and saddest part is that you become someone different when you feel this way.
I don't want to, and won't, use the stupid cliché from the stupid movie. But it's true. You make yourself into a better person, not to trick them into liking you, but because _they deserve it_, and _you want to be a person that deserves them_. The difference is everything.
It's the saddest part because when you lose the hope, the dream, the focus -- well, you want to hold on to that you, that better you, that you that you liked so much, the you that you were with her. It's inside you. Were you faking? No. You have it. Just continue being it. Just don't stop. Be more patient with people you see. Smile at them. Let tiny things go, ignore any little slight, be generous with praise. Be that person. You can still do it. Hold on to him.
--
An interesting, if bizarre, factoid about me is that I cry if I see kids under the age of 10. I also cry if I see child's toy aimed at under-10-year-olds. And, finally, I can remember only two or three scenes from my life from before I was 10: My dad reading "One Fish, Two Fish" to me to teach me what words looked like. (Read to your kids! It's more important than you think.) My parents in bed on a lazy Sunday and the kids coming in and hassling them. Running to get one of the Big Wheels in recess in kindergarden, because there were only a couple and if you didn't get one recess was lame. The other kids wanting to build a boat out of toy cardboard bricks, and me, the quiet kid who never spoke up, finally saying something: I have a plan. I can build a boat. Show us, show us, and I did, and for that one day, for that afternoon, I was the hero.
The rest of my childhood is gone. I don't know where that person is. He's very sad, though.
Yes, I'm in therapy, thanks for checking.
--
I listen to Steve Winwood again, on my expensive studio monitor speakers, the likes of which I couldn't dream of when I was 18. His album still sounds great to me, after all these years.There's a part of me that's conscious of all the time that's passed: that the rich, full sound I loved is now considered cheesy and overproduced, that nobody has heard of Steve Winwood in twenty years, Peter Gabriel is just another dude at TED, and that schmaltzy emotions are for angsty teenagers with zits and five-year-long erections.
But there is a little kid who has felt alone all his life, and he wants it to end. When will it be over? Will I die first? Why are you so old? What have we done with our life? Why are we alone? How did you manage to fail in this, the one thing that mattered.
Labels: stories
Monday, March 24
There is a moment when you are touching a woman, innocently, you say, innocently, she says, but you are massaging her back, stroking her hair, running your fingers lightly over her face.
There is a moment when you think to yourself, "I want to kiss her, I should kiss, I am going to kiss her."
And you know that if you are wrong, you will feel stupid. And she will leave. And you will apologize. And everything will be spoiled.
But the kiss is still hanging there. Evolution is stronger than you. It doesn't care if you feel stupid. Kiss the neck, it says. She smells wonderful, and you should kiss. Necks were created to be kissed. They crave it. They are empty without it.
There is only one thing worse than her rejecting you, and that is if you do NOT kiss her neck, in this moment, right now. You have lived your whole life for this. You dream of this moment every day.
There is a moment when you kiss her, lightly, on the neck, and instead of leaving, instead of being outraged, she breathes. You hear her breath, you feel her breath. And you have lived your whole life for that moment.
Labels: stories