What an idea is worth

Recently I’ve noticed an interesting phenomenon. Someone starts talking about a new idea or group or practice or strategy or improvement, and someone else says, “hey, I thought of that six months ago, but no one seemed to think that it was a good idea.”

In the past I read about the value of something being a function of the quality of the idea and the quality of execution. This makes a lot of sense to me. You can have the greatest idea in the whole world, but without effort and execution, there is no value. Even a medium quality idea done moderately well is useful.

I have about five hundred ideas right now. Some of them are pretty good, some are a little questionable, some old, some recent. Unfortunately, I am currently making $0.00 (that exchanges to 0.00 Euros) off of those ideas. That’s $0.00 worth of value that has been created by these written down ideas. They certainly give me a sense of excitement when I look at them, so I guess they’re worth something. I look back in fond admiration, and still think they’re pretty good. Hmm… maybe I’m attached. :)

But like the day when I sadly realized that I could never know everything there was to know, I have come to accept the idea that I will never have the time or energy to implement every idea that I have, even if (or perhaps, especially if) they are all five-star ideas. It wasn’t easy to accept.

Steve Yegge realized one day that he only had so many projects left in his life. He writes really long posts, so I’ll give a short quote from Rich Programmer Food, which is about why knowing about compilers is good for you:

Unfortunately, writing a compiler creates a living thing. I didn’t realize this going into it. I wasn’t asking for a baby. It was a complete surprise to me, after 20-odd years of industry experience, that even writing a simple interpreter would produce a lifetime of work.

Go figure.

I credit the phrase “a lifetime of work” to Bob Jervis, a friend of mine who happens to be the original author of Turbo C (with which I myself learned to program), and a damn good, even world-class compiler writer.

He gave a tech talk recently (Google does that a LOT) in which he pointed out that even just the set of features the audience had asked for was a lifetime of work.

This phrasing resonated deeply with me. It was similar to my realization about 18 months back that I only have a small finite number of 5-year projects left, and I have to start choosing them very carefully. After writing my own “production interpreter”, I realized that the work remaining was unbounded.

I mean it. Unbounded.

So from one perspective, I suppose I should just release what I’ve got and start marketing it, so other people will jump on board and start helping out. On the other hand, I started this particular side-project not to create a lifetime of work for myself (far from it), but to make sure I knew enough about compilers to be able to rant semi-intelligently about them, after a few glasses of wine, to a quarter million readers.

Sometimes ideas are ahead of their time by a couple of weeks or a couple of years. Sometimes they just aren’t expressed in the right way to the right people the first time. But you can’t give up if you believe in the idea. And it’s a lot easier to get traction for something when you start working on it.

What I’m trying to say here is that seeing a solution to a problem is not going to make a difference in the world. Applying your efforts and making your voice heard to make that solution a reality can. And even if you don’t succeed, if you’re smart you will learn how to do it better next time, and you may find something more valuable along the way.

Indianapolis Conferences

Mike Kelly posted to the IWST news group about two upcoming group meetings that are taking place in Indianapolis. I listed them in order of perceived relevance. The first one is free, and is a day long, similar to the excellent IWST that I attended in September. The second one is not free, and lasts two three days. The first one seems particularly useful, although the second might be as well.

I’ve edited liberally, so here goes…

Workshop on Regulated Software Testing

May 15, 2009

The WREST is coming to Indianapolis again in 2009. The topic for the workshop is “Beyond Scripted Testing.” You can learn more about the workshop here.

Major Questions of Interest

How can we better test software in regulated environments while retaining processes and documentation that will pass regulatory audits?

How can we prove the value of implementing progressive test approaches within the context of the necessities of regulation (FDA, SOX, CMM, etc.)?

Workshop on Performance and Reliability

April 16-1716-18, 2009

Through much arm twisting and whining, the WOPR 12 organizers are hosting WOPR next year here in Indianapolis. The theme for the workshop is “Resource Monitoring During Performance Testing.”

You can find more details here.

The ultimate goal of performance testing is identifying and fixing performance bottlenecks before production deployment. While a large percentage of bottlenecks are ultimately traced to the application code, they may also occur in servers, system software, and network components. Critical to identifying their source and diagnosing their root cause is monitoring the “bellwether metrics”. Let us define “bellwether metrics” as the “key indicators of future developments or trends”, and thus the minimum set of system vitals that we should be measuring for each hardware and software component.

Thoughts

The process for applying to share an experience report was pretty easy. Just have some relevant experience and know enough about it to share. Come up with a presentation. Kind of like a brown bag really. If either of these two are similar in size to IWST, they are enjoyable because you get to know the people at the meeting. If you’re jazzed about this kind of stuff, you should totally do it, for both the knowledge and the experience.

Review: The Drunkard's Walk

Title: The Drunkard’s Walk: How Randomness Rules Our Lives Authors: Leonard Mlodinow Published: May 2008 Length: 272 pages

After taking two quarters of statistics and two of probability, I wasn’t sure that I would learn much by reading The Drunkard’s Walk. Fortunately, the history of the evolution of thought regarding chance and the ramifications of randomness on everyday life were explained to the point where I gained new insights into this area. It reinforced and clarified existing views that I had as well.

The most important point that was made is that there are a large class of things that humans typically see as being based on skill but are more likely based a great deal on luck. While CEOs and Hollywood film producers are paid top dollar for their skills, there seems to be little correlation with actual skill for their positions. Many events that involve human decision are unpredictable to the point that they can be considered random. I enjoyed the discussion of reversion to the mean presented throughout the book. Essentially, we tend to praise someone and see them as smart or skilled when they succeed, and then tend to disparage the same person when they do not appear to succeed. Mlodinow explains that our approval or disapproval often has little to do with someone’s next attempt because often the performance in the event is somewhat random. When I yell at someone, it is likely that they will do better than before. When I praise someone, it is likely that they will do poorer than before. Likewise, a mutual fund manager is likely to be lauded when she does well, and given the boot when she does poorly, even though picking stocks is a mostly random process.

The book discusses famous probability paradoxes such as the Birthday Paradox, Boy or Girl Paradox, and the famous Monty Hall Problem. These examples highlight how our intuitive grasp of probabilities does not necessarily accord with the actual probabilities. Understanding these better allows us to use reason instead of trying to us intuition, which is ultimately inferior in this realm.

In my opinion, this is similar to how people in economic experiments behave “irrationally”, or out of line with predicted economic theory. Examples of economic paradoxes can be found in books like Thaler’s The Winner’s Curse: Paradoxes and Anomalies of Economic Life. One of the tenets of traditional economics is that people are rational agents attempting to maximize their happiness. However, I feel that this assumption is flawed because that people do not always act rationally even when given perfect information.

I appreciated hearing about the history of thinking about probability because it was a perspective that I had not encountered in prior learning. The mathematics were nice as a refresher of probability and statistics.

One thing that the author talks about considerably is cognitive biases. Brains are essentially pattern-finding mechanisms, so they are bad at determining when something has been produced by a random process. People tend to spot clusters in dots that are sprinkled randomly because that is their instinct. Patterns may appear from stochastic processes, and conversely, we may not be able to detect patterns in deterministic processes. We also continually suffer from the myopia of confirmation bias.

The most profound implication for my life is that the best way to ensure that you succeed is to keep trying. Although I had a general idea that it is important to be persistent, this book reinforced the idea that trying multiple times is the only reliable way to boost your chance of success. Mlodinow states randomness is “why successful people in every field are almost universally members of a certain set-the set of people who don’t give up.”

A huge caveat of this view is that it assumes that the event that you are trying to have success at is random or that you do not learn from past experiences. It seems like in certain cases there is not an accurate model for agents to determine what will cause success or failure (stock market, predicting blockbusters from scripts.) I had some problems accepting that people are not successful based on their ability, but almost solely on luck. But if the results starting a company or creating a new product are somewhat random, why not try doing it many times? It should work out in the long run.

Overall, was an interesting read.

Here is an outline of the chapters.

iPhone Tech Talks: Part 2 - Interface Design

The first breakout session I attended was the most interesting. It was titled “iPhone User Interface Design.”

The first point the presenter made was that the percentage of time that you spend on portions of the development cycle is quite a bit different for a successful iPhone app than most software applications. He showed a diagram that looked way cooler than this:

Difference between normal development and iPhone development

What this means is that you need to spend a lot more time in the design aspects of your app throughout the life cycle than you normally would. This set the tone for the rest of the presentation.

He defined “design” as mapping out requirements, doing the art and layout, and figuring out how core features and navigation are going to work. The cycle for developing a new product should typically go: familiarize, conceptualize, realize, finalize. Executing these well will take your application from average to excellent.

Familiarize

One solid suggestion was to read through Apple’s Human Interface Guide. Apple has spent a lot of time thinking about how people will interact with the iPhone and iPod Touch, so you don’t need to duplicate their work. What’s more, there are many conventions that you will be unaware of and unwittingly break. For example, Apple intends all buttons to have rounded corners, so if you have something that’s not a button, don’t make it rounded. Likewise, buttons should look like buttons because users have a model of what a button looks like and what it does.

The presenter reiterated considerations voiced in the general session, such as thinking about where the user will use the application and considering general properties of the iPhone and how it differs from the web and from a desktop computer.

One significant suggestion was to design for the thirty-second use case. You need to consider that the user wants to open your app and get what they need within thirty seconds. If your app has a bunch of meaningless screens or has poor performance, it will significantly hinder your ability to help them. If it takes twenty seconds to navigate where they need to go, you only have ten seconds to please them. If you can save any time by remembering or determining data (zip code for searching for restaurants, for instance), you should do that. It takes a lot of time and mental effort to type things in on the iPhone, and it would be very annoying if the user has to type something in multiple times.

The Pareto Principle must be invoked at least once per usability discussion, so here goes. You should design for the 80% use case. Make the most common functions be dead simple. With the limited screen space that you have, consider eliminating ancillary functionality. Make your apps hyper-specialized and super-focused. Apps that do everything do nothing. I liked this approach because it reminded me of something that the folks at 37signals would say (review forthcoming.)

Conceptualize

The key to conceptual design is to define a solution not a collection of features.

Consider the example the speaker presented: you are an interior decorator and you learn about the iPhone. You see something that makes you think of creating an interior decorating app. Your mind whirls at how this will make your life so much better. You grab a piece of paper and a pen, and scribble as fast as you can. “Wow, I can take pictures and store them in an album, and then upload it to my Mac. I can generate textures and hold them up to the wall. I can use the iPhone as a level to make sure that my wall hangings are straight. I can use this same app to make estimates of how much a room will take to redo.” The list grows to a page, then two pages.

This is exactly the wrong way to do an iPhone app.

You need to have a very lean feature set. If you start with an idea and brainstorming, or if you are modeling your app off of an existing app, you already have too many features. You need to prune.

A great way to prevent featuritis is to create an app definition statement. This statement summarizes the purpose of your app, and every key design decision that you make should be based off of it. With this much importance, it’s critical that all of the stakeholders buy into it. An example of an app definition statement is “Easy to use digital photo sharing for iPhone users.” Note that this definition statement clearly identifies who will be using the app and what they will be doing with it. Less is more with respect to features. Condensing your app is helpful for team morale and cohesiveness.

Realize

It’s important to understand your application type to make the correct design decisions. Apps live on a continuum of [serious..fun] and [entertainment..tool]. If you have a serious tool, you need the UI to be out of the way as much as possible. The user is just trying to get something done quickly, so there should be few frills. If you have a fun tool, you can get away with more graphics, but not at the expense of functionality. In other words, users will tolerate some distractions. If you have a fun entertainment app, it should be interaction driven and intensely graphical. This would mostly correspond to games. There also exists serious entertainment. This concept might seem silly at first, but could be something like a movie player. In this case, you would want the app to be more data-driven, and have a minimal UI.

These are the extremes, so you should consider to what degree your app is serious or fun and made for entertainment or utility. In conjunction with the app definition statement, this will help you decide what design elements should be used for your application.

As far as aesthetics go, you should remember to avoid having too much stuff on the screen at one time. Ask yourself: does this really need to be on the screen? Could it be hidden instead? Also: what’s important right now? Could this be shown later or on a different screen? Avoid layout cramming and make sure that your padding is consistent throughout the app. This is a professional touch that will separate you from the crowd. You should use built-in controls where appropriate because users are familiar and they are well tested, which saves you a lot of time. If you have options that aren’t commonly changed, put them in the global options file so you don’t have to keep showing them.

The biggest message to me of this section was to do paper prototyping or “iterate with paper.” Many fewer resources need to be expended to create a paper mock-up of the screens you are going to have, and getting the flow down is critical to the end user experience. You need to solve for all of the edge cases up front and see where your metaphors break down. Doing this on paper lets you experiment with several ideas and see which one fits your target user the best. One recommendation that made a lot of sense was to actually Xerox your iPhone or create a stencil to create a template that has exactly the right dimensions.

The presenter demonstrated how several apps evolved through time and it was clear that spending time with design was crucial to get their apps working optimally.

iPhone specific

This section is pretty specific, you can skip it if you aren’t interested in some nitty-gritty details. However, there’s one more section after this one.

For navigation, the standard is to move from left to right as you progress through the app. You should have a navigation bar with a title to give users an idea of what they are looking at. There should also be a back button. You should provide controls to filter data down.

A de facto standard is to have any kind of element addition be in the top right-hand corner of the screen. The same is true of edit controls.

Although you should have a title for context, you should avoid breadcrumbs and home buttons. Breadcrumbs are not scalable due to screen real estate, and both breadcrumbs and home buttons provide the possibility for a state change that is dangerous to the user’s mental model. If they accidentally tap one of the links in the breadcrumbs or hit the home button, they will become very confused and frustrated. This works for the web, but not on the iPhone, based on what Apple has seen in apps.

When you use lists and pickers, try to group similar items if possible. Associate an icon, as the eye typically sees icons first, then words. If you do have icons, try to make them minimalistic. If you have multiple screens with tables, try to switch the formatting up a bit to let the user feel like they are making progress. One more note on pickers: they are optimized for 12 items, which happens to be three swipes of a finger. :)

Finalize

You can (and should) enhance your application with photos and imagery. This aids in quick recognition of your app. Your icon is really key, as it is the first thing people will look at when they are evaluating whether your app is worthy or not. One thing that I probably never would have thought of is that users actually appreciate expensive-looking textures. If you can get some mahogany or marble or polished chrome textures, these will make your app look more valuable than other apps with standard backgrounds or textures. Don’t go all out and then skimp in the finalizing section. While your app will have great value, people often judge the book by its cover.

You can add excitement with animations, but be sure not to go overboard. You want them to give feedback so they are functional. A great example is how the iPhone home icons jitter when you are trying to move an application around. Functionally, this shows the user that they have entered a different mode than the standard mode. Emotionally, they see that some of the icons are excited because they might get to move to the front page, and some icons might be shaking because they are worried that the might get deleted! :) So it is fun and entertaining and also gives insight into the current state of the system.

I think that communicating application modes is a very important topic. My own example is when you start typing something in Microsoft Word but you keep overwriting characters that they have already typed. Because the ‘insert’ mode is not shown well, you might have no idea what the heck is going on, and can be extremely frustrated or even lose data.

Once you release, you can’t rest on your laurels. You should keep iterating and use customer feedback if you can get some. Better yet, if you can somehow track which features users use and how they use them, you can use this data to improve it empirically. That’s something I just thought of. But overall, you need to make sure that every release you have is high quality. Users don’t have patience with this kind of stuff. They will just uninstall your app without waiting for updates.

Let’s summarize: familiarize, conceptualize, realize, finalize. One more post to go-and that’s a lot of -izes!

You can see the first part of this series here.

iPhone Tech Talks: Part 1 - Overview

Last Wednesday, I went to a one-day session in Chicago titled iPhone Tech Talks. I am currently taking the Cocoa Academy course, and thought that this would be a nice way to get some additional information. The conference had probably about 400 people or so. I was a bit worried because I have neither an iPhone nor a Mac, so I thought that I might have been out-teched. :) However, it seemed like most people did not bring their laptops, and some of the people that I talked to had as much or less experience developing for Apple platforms.

I took like fourteen pages of notes, so I will probably break it up into a few posts. This one, which gives an overview, one about usability (I was writing the entire hour and a quarter session) and one about performance and using different libraries.

What’s in it for you?

Hmm… Well, maybe you are doing or planning on doing some kind of iPhone development. That would be nice.

But I was talking with someone who has the G1, and the features are pretty much the same aside from native multi-touch, so most of the design principles and considerations will be present there. Indeed, any mobile device has at least some of the constraints that you need to think about when creating an iPhone app: usability, market reach, battery life, screen real estate, interrupts, performance, and more.

I would say that this was my first foray into mobile development, so it was definitely an eye-opener. If you have developed for a mobile platform before, then some of these comments will be old hat, but there still might be some gems in there.

Overview

The session lineup can be seen here. I figured that I had a moderate understanding of Room A or could read about it online, so opted to stick in Room B because the C room sessions just didn’t really seem all that interesting. You could mix and match, but conveniently the ones that I wanted were in the same room. I did sit in on the “Using Advanced Web Technologies on iPhone” session, but it was after lunch and not that interesting, so I ended up just going to the other room after about forty-five minutes. It was a lot more engaging. It’s interesting making decisions with very little information on what the actual session will be about. I’d be interested to hear if anyone else has rules of thumb for figuring out which sessions are going to be useful, or what kinds to avoid.

So everyone went to the general overview session at the beginning of the day. They started out with some “get pumped” videos with the standard Apple music, showing off some popular apps like MLB.com and Urbanspoon. Then they gave a business update. The iPhone platform is very vibrant, with four million iPhones purchased in the first 200 days, 13 million to date (not counting iPod Touch), and over 200 million App Store downloads in only 104 days. These are impressive numbers that seem to imply that if you create a good app, you won’t have trouble getting it into people’s hands. The iPod Touch mentioned earlier is significant because it also runs App Store apps and has the same features (even screen dimensions), save for things like phone capability. So that’s another thing to consider.

Next they gave an overview of ingredients for success with an iPhone project. If you have a product in mind, it’s recommended that everyone who will be giving input has at least some working experience with using the iPhone. This makes sense, because there are some pitfalls if you don’t consider what you have to work with. There is no mouse, so there are no rollovers or scrollbars. The metaphor of clicking doesn’t apply because you are actually tapping on the screen. The mouse offers continuous input, while the finger is discrete. The interface is quite a bit different because of user expectations and use conditions. Text input is accomplished with a soft keyboard rather than the traditional one. The iPhone only runs one app at a time.

These are things that are clear if you use the iPhone on a regular basis, but imagine working with people that have never used it before. There would some difference in ideas that would not be easy to overcome.

Also, you want your app to feel like it fits the iPhone, so you need to consider things that are already built-in: microphone, camera, location awareness, ubiquitous internet access.

Typically you should envision that your user will be using the iPhone under a table in a poorly lit room at about arm’s length. This severely alters your approach to designing the user interface and visual elements. The screen needs to have high contrast. There was a discussion about whether white text on a black background was better than black text on a white background. The thought was that you should consider where your user will typically use the app, and go from there. If they would typically use your app in a poorly-lit environment, then you should make it white on black. Conversely, if your app is only used out in daylight, consider using black text on a white background for better contrast with the environment.

As a programmer, you need to handle interrupts gracefully. Because the iPhone is a phone, you should expect it to ring at any time, and should test the behavior frequently. You need to save the state of your app somewhere, cut out your audio, pause the game, and so forth. When the phone call or other interrupt is done, you should also resume in an orderly fashion. Just unpausing the game when the phone call is over will lead to your user being unhappy.

Attributes of a successful iPhone app

Your app should be delightful. This means that it is inviting, intuitive, engaging, exciting, and enabling. It should be a pleasure to use, and is something you would consider remarkable. If your users are to remark positively to others, it must be remarkable.

Your app should be innovative. It should be revolutionary, inspirational, or fresh. This doesn’t mean that you have to create something new, just do it better than what is out there in some way.

Your app should be designed. This takes support from all levels of your organization, and works best with small teams.

Your app should be integrated with the iPhone’s many rich features. One of the strengths of the platform is connecting to other services, so your app should probably be connected.

Your app should be optimized for performance. They made a suggestion that you automate performance tests so that when code is checked in, the performance tests automatically run. If the test fails, the build should break so that the offending code can be cleaned up for better speed. This was a nice idea, and I had not heard it before. But with the importance of performance, it’s almost as important to get it fast as it is to get it right. So this matches up well with continuous integration. Consider it ‘continuous performance.’

Other miscellanea

Over lunch and between the rapid-fire sessions, I actually ran into many people that either had ties to Indianapolis, or actually worked or lived there. So that was pretty exciting. I figured that I would be the only one. There were others from Bloomington, etc.

I enjoyed the tech talks, although I didn’t really enjoy the driving in Chicago. :) It’s quite different beast from Indy. There are like horses and bikers and pedestrians and crazy taxis all over the place.

They gave out a free shirt that had some interesting packaging, which you can see here.

You can see the next part of this series here.