Comedian Louis CK had the bad luck to book a New York comedy show on the same night that a hurricane is bearing down on the east coast.
I like this guy a lot – his gutsy, $5 DRM-free download of his show at Beacon Theatre was a textbook example of how to build and grow a long-term relationship with a 21st-century fanbase while still getting paid. So I’m not surprised by how he’s handling this situation (all bold emphasis mine).
Dear New York ticket holding folks….
Okay. I thought about this very carefully and I really started to worry about making 4300 people come into midtown manhattan on Sunday night, which is just when the stormatron 5000 is supposed to crush our empire. new york state has ordered the sutdown of all mass transit (subways, buses and commuter trains) as of 7pm Sunday night.
Before getting into the nitty gritty of his announcement, CK takes a moment to get everyone on the same page. There’s an important reason he’s asking for your attention. There’s a reason he’s about to give you some bad news. Good communication makes no assumptions about the audience’s facts.
Deliver the Bad News
I know that a lot of people are excited to come and they are fine with taking the chance but I really don’t want a pole to smash your face in because you saw some comedy.
So i asked the City Center (where the shows are supposed to happen) if we could find another date for Sunday’s shows and they gave me March 2nd. The City Center, being really cool, has agreed to let us do the shows on that night and your tickets that you now hold will be honored on that night. the same seat, same everything. If you can’t come on that night, we will either do another show soon after that, or find another show for you in the area in the future. Or you still have the option to get a full refund for your ticket. If you already asked for a refund, we can reinstate your ticket if you want to go to one of those shows.
Accept Responsibility, Acknowledge Frustration
Listen. I know that probably it’s going to be a starry clear night and the trains are going to be just gliding up and down the traks and a baby zebra is going to whinny as he trots by the City Center on a night that is going to break records for being placid and perfect for a night of comedy. And I’m going to feel like an asshole. And I know that some people had their plans set and are going to be pissed off at me. I know. but I also know that some of you are struggling with whether to come in or miss the show and this is the closest I can get to a solution. You don’t have to take a chance and you don’t have to miss the show. Just come see me in a few months.
CK spends this paragraph acknowledging all the frustration his fans might feel as a result of his decision. He also owns that it’s his call to err on the side of caution. His starry clear night imagery leaves him naked here – he hasn’t chosen to pretend that his hand has been forced by terrible circumstances beyond his control. If he’s wrong, he knows he’s the asshole – no one else.
With this openness, it’s very easy to continue trusting and liking the guy. It sucks you can’t have the night you were planning on, but it’s hard to begrudge Louis for trying his best to do the right thing.
Invite Further Discussion
If it’s any consolation, I’m eating a pretty staggering fee for cancelling the show. But I can take it. What I can’t take is the thought that there’s a CHANCE 4300 people will be in danger trying to get home from my stupid show.
Please email email@example.com and tell us what you want to do, and ask any question you have.
So that’s that. Cancelled. Rescheduled. Please forgive me. Please be safe.
Your dumb friend
Louis acknowledges the personal hardship that this situation creates for him but crucially does not seek pity for it. He “can take it.” Mentioning the cancel fee isn’t whining or group therapy – it’s Louis pointing out that this isn’t fun for him, either. Knowing his inconvenience is even greater than your own further builds trust, but only because it isn’t a pity party.
One of the most frustrating customer service situations is feeling like your voice isn’t being heard. Too many corporate bureaucracies congeal their worlds in “policy,” ignoring customers with unique cases. Louis CK wants you to feel comfortable talking back. The invitation to ask any questions seals this as a great moment in customer service. The sincerity and humility of his letter would ring hollow if he was indifferent to pushback from the fans affected by the decision.
It’s interesting to live in a world where a comedian is schooling other businesses on how to deliver great customer service. People with better understandings of the psychology of Louis’s profession can probably explain what mental muscles he’s built that make this style of authentic communication come so naturally. But whatever the source, Louis CK believes – rightly – that his success is tied to how much his fans like, trust and respect him. Even though it’s expensive in the short-term, he knows that the cancellation fee for the show is a tiny pittance for the long-term health of his fan relationships.
Almost everything good that has ever happened in my life can be traced back to my early experience with a Mac. The first family computer that ever lived in my house was a Performa 6116CD.
I absolutely loved that thing, especially by contrast with the rest of my life. School was typically dull: I spent very little time learning about anything that was important to me. I think I could count the number of friends I had with half of one hand – and they were certainly outnumbered by people who disliked me but couldn’t find constructive ways to express those feelings. My home life was no picnic, either.
Yet none of that mattered when I was at the keyboard of my Mac. It was, all at once, a second school, a conduit to another world, an infinitely deep toolbox and a magic wand of indescribable power – running at 60 MHz.
I thought it would be fun to venture down memory lane and revisit my Mac of 1995. Of course, the hardware itself is long gone. But through the magic of Sheepshaver, I’ve been cobbling together the scraps of my favorite childhood memories. Other kids had sports, comic books or Jesus. But the thing I believed in was my Mac.
My childhood experience with the Mac spanned System 6 through Mac OS X 10.2 but System 7.5 was easily the golden age. That would be the first time I had long-term access to a machine I could customize any way I wanted.
Once installed in Sheepshaver, even through an emulated PowerPC processor, System 7.5 is extremely performant compared to 16 years ago. On a Late 2010 MacBook Pro, loading from an SSD, boot time is about two seconds, compared to about 30 seconds in 1995.
The cheerful parade of Extensions and Control Panels marches at the bottom edge of the screen. Performance be damned, I loved collecting these.
Of course, the System 7.5 era was extremely long – an interminable wait for Copland, the next generation operating system that would make unicorns fly from your 4x CD-ROM drive. As time went on, the UI started to look pretty stale.
That’s better. Aaron adds a little flair and dimension to the otherwise flat and bland System 7-era UI and I liked it a lot better. Even at 10, I was starting to be curious about the nuances in UI design.
AOL was my very first taste of the internet. I believe our first bill came out to $80. So that didn’t last long. Luckily, their unlimited dialup service showed up about a year later, so I would be back in action. Sadly, but unsurprisingly, you can’t actually use the AOL client anymore. Still, I got to poke around with the modem configuration panel that was a frequent source of frustration once upon a time.
This little suite was bundled with the Performa. Very little to be excited about here but I spent so many hours cranking out school reports and other projects in its Word Processing, Paint and Vector Art modules.
The gravest of my youthful indiscretions was easily my voracious appetite for pirated software. Enter Hotline. Before Napster, before Gnutella, before BitTorrent, there was Hotline. Hotline let anyone set up a file server on their home computer. It included chat, BBS and persistent user accounts, too. Vibrant communities sprung up around these little amateur servers. They dedicated themselves to everything from religious evangelism to technical support to sharing anarchist/conspiracy text files. Of course, being the internet, there would be plenty of pirated software in the mix.
To my utter delight, the mid-90′s version of Hotline I got started with so many years ago not only still works, there’s even a handful of servers still in operation. Back then, I was lucky to pull down files at 2.8 KB/sec via dialup. A limitation of either Sheepshaver or Open Transport, the aged TCP/IP stack Hotline uses, now caps me at 60 KB/sec, but that’s a big improvement I’d have killed for as a kid.
Hotline is a major hinge in my history. With access to so much software, I dedicated myself to learning how to use it. I rarely had access to any documentation beyond what was built into the apps so it was often an exercise in trial and error. It was also fun beyond words.
This began my life-long study of interfaces and user experience. If this hadn’t happened, I have absolutely no idea what I’d be doing with my life right now.
Hotline could be extended with customized icon sets. If one of the two dozen included user icons didn’t strike your fancy, you could create your own. The trouble was that only other users with your custom icon file could see your handiwork.
Of the thousands of active Hotline servers in operation during its golden age, two emerged as dominant tribes vying for the loyalty and patronage of the masses. Known as BadMoon and SoSueMe, the servers collected thousands of customized user icons and then distributed them as authoritative custom icon sets.
Of course, I wanted to get in on this. ClarisWorks’s Paint module really wasn’t up to the task, so I had to find and learn Photoshop 3.0. This little head-start on graphics tools ended up being important – years later, I’d be able to design my own UI elements thanks to this early noodling.
It meant days of downloading but it was worth it.
One striking thing about Photoshop 3.0 is how very little has changed after all this time. The color picker is identical. There are the many cluttery pallets for layers, brush diameter, colors, and channels. Later versions would introduce layer styles, which were awesome but a little rigid, and endless other bits of junk. The overall workflow, aside from crappy Save For Web, remains much the same. (This is why I now use Opacity to design UI – it’s built for how I actually work.)
I loved ResEdit when I was a kid. Apple’s resource editor let you poke your nose into most system files and applications, revealing image assets, icons, interface elements and plenty of other technical goodies I didn’t really grok at the time. It was surprisingly deep, including a little MacPaint-like editor for the icon files along with a drag-and-drop interface editor. At the instigation of David Pogue and Joseph Schorr, I recall using it to make the bloated trash can look filthy and overflowing.
No exploration of Mac history would be complete without a look at some of the platform’s greater gems of gaming. PC’s may have had more games by volume but the Mac didn’t have any shortage of fun, either.
I sunk so many hours into EV, it’s not even funny. A nerd who grew up on Star Trek and other scifi, I found this game’s premise of space exploration, commodity trading, secret missions and interstellar combat extremely compelling. Entire Saturdays vanished into its gaping maw.
Before Halo, Bungie made Marathon. It was a rich story of treachery and tragedy among the stars. Crazy AIs and three-eye aliens all trying to get you killed while you blast things with enormous guns. No full-motion video cinematics here, though. If you wanted story, you had to read.
I was terrible at SimCity. My budget rarely balanced, my people always complained.
I loved it anyway. SimCity 2000 is still surprisingly playable, too. Definitely a timeless piece of work.
End of an Era
The way many expected the System 7.5 era to end was pretty bleak: Apple collapses, the Mac dies, and its software and hardware begin to decay into uselessness.
Of course, history went a different way. I’m glad that Apple survived long enough to ship Mac OS 7.6 and OS 8, that in the time since Apple has rebuilt itself into the juggernaut of its industry. Mac OS X beats the hell out of anything that came before it. I still remember picking up my copy of Macworld at the supermarket and learning how Apple bought NeXT – and hoping that the future would bring brighter days for everyone’s favorite “beleaguered” company. And it did.
Still, I’ll always look back with fondness on those days of innocence before a Unix shell was a keystroke away, before every UI interaction was beautifully animated, before we measured even the tiniest of hard drives in gigabytes, before collaborative multi-tasking and protected memory. When using the computer was new and exhilarating. When the Mac was more than just tool – when it was an escape to another realm of existence. Those were the days when a little boy, without coming anywhere close to realizing it, laid the groundwork for all the wonderfully fun things he’d get to do years later as a man. I learned way more from my Mac than school ever gave me.
Thanks for the memories, Apple.
The App Store has over 100,000 apps available for purchase.
That’s a big number.
I can’t tell you the secret to success in the App Store. I haven’t discovered any magic formulas. The one thing I can tell you with 100% certainty is this: if you ship a product with bugs that genuinely piss off your customers or, worse, make them unable to use some portion of your hard work, the road toward success just got much longer and a lot more miserable. Even with “prioritized review” requests, once your buggy app is on the store, the review queue means you could be waiting a long time before your customers can enjoy your bug fix.
You will not sleep well at night.
The good news is that this problem has been solved a thousand times over. A thorough beta test can save you from this terrible outcome and the sleepless nights that come with it. With a bit of diligence, you can ship an app with awesome stability to match your great ideas.
I’ll share how I run my betas. This is about process — the technical side of Ad Hoc distribution is thoroughly documented by Apple and others. The tools I use are simple and free. They work. If you have suggestions for better ones, I want to know about them before my next test! Please share in the comments.
Gather Your Testers
You’re going to need testers. If you use a volunteer testing pool, figure that 80% of testing will be done by 20% of your volunteers. That means to have any hope of gathering meaningful feedback, you’ll need at least 10 volunteers. 15 or 20 would be the ideal minimum.
Next, you’ll need to start early — but not so early that your testers’ enthusiasm cools by the time you ship your first beta build. Try to get the word out between three to six weeks before you’re ready to test. If you have a particularly strong network, you may need less time. If you’re relying more on the kindness of strangers, though, make sure to give yourself plenty of lead time. Use your website, your blog and your Twitter to solicit volunteers but don’t be a pest.
Most importantly: if you have contact with existing customers from previous versions or perhaps other products entirely, send a quick, polite email explaining what you’re going to test and encouraging them to join up. Customers who have emailed you in the past with feedback or feature requests may be especially keen on seeing your latest work.
Understand Your Testing Pool
You need to know things about your testers. What kind of hardware will they be using? What version of iPhone OS? What’s their geographic region? (International testers are crucial for finding your screwups with localized formatting and other geographic issues.) Most importantly, you’re going to need to collect their UUID.
I use Forms for Google Docs to collect most of my feedback. It’s an easy-to-configure way to store structured data. Since you can designate required fields, you can ensure your testers don’t forget to include anything crucial when reporting issues. Best of all, you can embed the forms into existing web pages, allowing you to include them alongside testing guidance, version history or other information that might be useful.
Here’s the form I use to collect beta tester info:
It’s not short. The other benefit to using a form is to ensure you only get testers who are reasonably skilled at providing detailed information. Everyone who makes it past this filter has a decent shot at actually telling you everything you need to know later in the beta.
Betas Worth Testing
If your app doesn’t look somewhat close to the final product, don’t distribute it for testing. If you’re relying on a volunteer testing pool, you want them eager to use your stuff. If your overall UI is incomplete, you’re not ready to test. You’ve got a limited amount of time and attention with your testers. Don’t squander it on early builds you could easily test yourself. The closer you think your app is to shipping, the more useful your testers will be to you.
You do yourself no favors if the last bit of functionality you add affects previously-solid features that now need a whole new round of testing.
Distributing Your Binaries
So you’ve toiled away and you’ve finally got an app you feel is ready to be tested.
Don’t email the binary.
Depending on the size of your app, the attachment may not be properly delivered to the recipient, especially if they’re using Exchange-hosted email. Instead, host your app and the necessary provisioning profile on the web.
I also recommend a simple checkout system. When you’ve got a new build ready for testing, send your testers a link to a one-question form that asks for their email address. On the form confirmation screen, you can provide a link to the binary. This lets you get an idea of who is participating. It also lets you answer an important question: am I getting zero feedback because there are no bugs or because there are no active testers? With a checkout process, you’ll know for sure.
Use clear versioning with every distributed build. You need to be certain you and your users are talking about the same build when they give you feedback. Beta phases, version numbers, dates, whatever you need to make things clear for everyone involved. Make sure that somewhere in your app, your code pulls the version number out of your app’s Info.plist file and displays it in the UI. Here’s some code to get that string:
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Update your Info.plist’s version number religiously before distribution. Even better, update it automatically.
You need to communicate with your testing pool. Keeping them regularly updated, without being spammy, is crucial to keeping them excited about what’s going on.
When you send out a new build, explain what’s new. Give specific testing guidance so that your testers know where they should focus their efforts. New method of rendering cells you strongly suspect has a bug or two? Share your hunches. Built a new import subsystem you’re suspicious might break with legacy data? Provide an example data set or encourage existing users of the old version to give it a whirl. If you’re manipulating data that lives only on the user’s device, tell them to back up their iPhone before running your beta. And tell them why. Don’t be a douche on this: never take for granted the importance of your testers’ application data, especially if you’re lucky enough to have your existing customers helping you. Yes, we all know, betas are risky. Still, the iPhone isn’t the desktop and if you’re testing an upgrade to an existing app, your customers may have data they created before accepting the risks of a beta.
If it has been more than seven to ten days since your last build, send a quick update to the pool. Call out awesome testers and let them know they’re making a difference. Share the score of resolved issues you were able to fix thanks to the pool’s feedback. Most of all, thank them. Their efforts are helping you to not look like an idiot.
If you’re making an all-new app, you can skip this section. If you’re testing an upgrade to an existing app, read on.
Your early beta builds should use a different app identifier than your shipping app. This way, your beta will be installed as a distinct application alongside your currently shipping version on the user’s device, instead of overwriting it. This lets you ensure that no shenanigans happen to legacy data if you’ve got customers from previous versions in your testing pool. Toward the end of your beta, after much internal testing, you can start distributing builds that overwrite previous shipping versions. You’ll want to ensure that the app properly imports legacy data and preferences and, of course, ensure nothing otherwise disastrous happens when iTunes distributes your updated app to existing customers with existing data.
Gather Useful Feedback
You need to know things about how your application is failing. The forms I use are inspired heavily by what I saw once upon a time during the iPhone OS 2.0 Enterprise AppleSeed beta test. I think it covers the basics. Of course, don’t be afraid to add other questions specific to your application’s circumstances. For bugs, measure how well you can reproduce the bug and its overall severity while capturing the reproduction steps. For feature or enhancement requests, measure the tester’s impression of the request’s importance along with what they’re asking for.
However you gather your feedback, ensure that every single message you send to your testing pool includes brief instructions on how your testers should report their bugs. Never make them hunt around for it.
You haven’t added or changed anything for a couple of builds. You’ve fixed plenty of bugs and no one has reported regressions. You’ve sent emails to your top-performing testers and they’re giving you a thumbs-up.
Give it one last test yourself. Thirty minutes, minimum, actually doing things your users are likely to do. Is it kosher?
Then ship it.
Then, while you wait for approval from Apple, test it some more, informally, yourself. If somehow a show-stopping bug pops up while you await approval, you can reject your binary and submit a fix before it ruins anyone’s day.
I’ve had the product management bug since the early days of my childhood. While I have a stable of iPhone products that I spend the bulk of my time planning and developing, my need to make good stuff doesn’t end with software.
It extends entirely into the kitchen. I love cooking. It’s a creative act whose rewards are unrivaled by anything else. When you get it right, when the flavors and textures come together in a way that can satisfy and surprise, it feels incredible. Moreover, cooking is an important bit of empowerment. In today’s world of corporate food, unless you prepare it yourself, you’ll have no idea what’s truly happening on your plate. Cooking your own meals is the best way to understand your diet and cut out synthetic, unhealthy garbage. 90% of my meals come from my own kitchen prepared with ingredients that are as elemental as possible.
Cooking for me breaks down to about 25% experimentation and 75% refinement. That is, while I often try new things, I spend most of my time taking my established specialties and making them better. Of all of my kitchen products thus managed, I’m proudest of Turkey Tacos.
I love tacos: crunchy, savory and infinitely customizable. My favorite taco was always ground beef, but it had some drawbacks: greasy as hell yet the meat is paradoxically dry and crumbly. I don’t love ground turkey for many of the applications where it is recommended. Turkey burgers are odd, spongey, colorless things and turkey meatballs suffer from similar drawbacks.
Yet, for tacos, ground turkey is sublime. The meat breaks up into manageable, small chunks while remaining superbly moist and tender. The sponginess that is an indictment against turkey burgers is an asset for tacos, as the meat even after browning remains bursting with flavor.
The best part of turkey tacos: economy. They’re inexpensive to make and the prep time is less than 20 minutes.
Here’s my current, favorite formulation after over a dozen iterations. No sodium bomb flavor packet full of garbage, here. Just a tasty meal with ingredients you’ll look straight in the eye before cooking.
You will need:
- Half a pound of ground turkey
- A can of simple, smooth tomato sauce (or, if you make yours from scratch, about a cup)
- A 4oz can of Green Chile (diced green chile pepper is a delicious addition to any meal. You can usually find it among your other canned foods at the Supermarket or at Trader Joes. Sometimes it’s hiding among the ethnic foods. Use whatever temperature suits you. Of course, if you’re lucky enough to live in New Mexico, substitute canned for fresh)
- A few spoonfuls of Frontera Chipotle salsa (can substitute with another splash of tomato sauce and some crushed red pepper, but seriously, find this salsa — it’s incredible)
- Olive oil
- Black pepper
- Two cloves of garlic, minced or crushed
- Blue corn taco shells (I’ve found that Whole Foods’ house brand is the best of these and costs the same as nasty garbage from Old El Paso)
- Shredded cheese
- Optional: Frontera Chipotle Garlic Taco Sauce. Absurdly good as a topping at the end
In a skillet or electric wok, heat two tablespoons of olive oil over medium heat, then add your garlic. Keep the garlic moving so it doesn’t burn. Once the garlic has gone from white to light brown, carefully add the turkey. Try to avoid pouring in any of the water or other fluid that your turkey may be sitting in — your olive oil will spatter otherwise. Break up the turkey into small chunks while you brown it, again keeping it moving to prevent burning. As the turkey browns, add a light sprinkle of salt and pepper, according to your preferences. Better to be conservative at this stage — you want just enough to lightly flavor the meat and you can always add more later before you serve.
Take moment to preheat your oven according to the directions on your taco shells.
Once the meat is evenly brown, with nothing pink left in your pan, add the green chiles. Since turkey is so much less fatty, you won’t need to drain the pan of grease as you would with ground beef at this stage. If anything, your pan may be getting a little dry and sticky, especially if it doesn’t have non-stick coating. Add a splash of olive oil if necessary to keep things lubricated. After about a minute, once the green chile is cooked through, stir in the tomato sauce.
After everything has been combined and the meat has a light, even coat of tomato sauce, turn off the heat and have a taste of your taco filling. If you’re satisfied with the spiciness and overall flavor, great, you’re all set. If you want to ratchet up the heat, though, add a few spoonfuls of the Chipotle Salsa, then taste again. Repeat until it’s just as you like it.
Let the filling rest and cool while you toast the taco shells according to the directions on their box. Usually about a minute at 400 degrees F. While the shells cook, transfer your taco filling to a serving bowl. Set the table with your bowl of turkey, the cheese, your taco sauce and the salsa. Bring the shells to the table, then let the table take turns building tacos. Two or more spoons in the turkey bowl are a good idea. Fill with turkey, top with sauce, salsa and cheese, to preferences. Makes about eight tacos.
A couple of notes: Like I said, I try to build with the most elemental, simple ingredients possible. At the same time, the Frontera Taco Sauce and Salsa are outstanding shortcuts. Short list of natural ingredients, made in small batches, no scary garbage and really, really tasty. Besides all that, Rick Bayless is the man. Why blue corn? It’s a better shell. Crispy but firm. Your tacos won’t fall apart mid-way through eating.
Since Tallymander was made a Staff Favorite last month, I’ve noticed that there are more solutions to the tally problem in the App Store than when I began.
There are, of course, many ways to skin a cat. For me, Tallymander does the job best because I built it to my exact desires. Still, while many elements of design are subjective, there are good and bad ways to do things. Let’s look at some of the other approaches to the tally challenge.
A few things jump right out:
Inefficient use of space: The entire width of the iPhone’s screen is available to each tally cell, but the tally title is confined to a much more limited area. The title is the only element that the user can customize beyond the rails of your design — give it some room. More…