A dialog of thoughts and ideas about software, usability, and products, with random science and wacky ideas thrown in for good measure.

When you search for "lightbulb" using a free stock photo site, you get no-frills pictures of lightbulbs that could have come straight from a hardware catalog. When you do the same search on a premium stock photo site, you find pictures that communicate the metaphors that a lightbulb represents. (Either way, I'm just looking for images to break up the text, although even better would be to have my own pictures that describe what I'm communicating)

On my bike ride to work, I pass over railroad tracks that have been inoperative for years. I noticed that the transit buses stop at the tracks, open their door, and look before crossing the track. Of course, the driver need not fear an oncoming train; the only thing he will see is a rickety track sinking beneath overgrown brush.

I thought about this. The driver is required to stop at the track because that's what he is trained to do. If he didn't stop at the tracks, he could probably get fired for not following protocol. But as long as he acts consistently at any railroad track, he reduces potential risk, and his boss will never be confused about what his driver will do when he comes across a railroad track.

However, this has some obvious inefficiencies. There is no reason for a bus to stop at a clearly unused track; this delays the passengers and other traffic behind the bus. And given enough buses with enough routes over this track, someone could probably calculate the maintenance cost that these stops require.

In the transit organization, drivers act according to their training, and bosses can predict how their employees will react in these situations. The transit organization works based on documented practices. But what about an organization that is based on knowledge of ideals instead of strict documentation -- and from these ideas, bosses can still predict how their employees will react, without specifically encoding those reactions in documentation?

I'll call such an organization an intuitive organization. In an intuitive organization, everyone can accurately predict how their teammates will act, without those actions being specifically encoded in a strict document.

Good sports teams are intuitive organizations: players know they can rely on the skills and abilities of their teammates, without knowing precisely how their teammates will execute a particular move (but with a certain degree of professional understanding and knowledge of best practices).

I think a good software team can be an intuitive organization. If I know my team well enough, I can predict how they might design a piece of software, or how they may have addressed particular technical challenges. This is about having confidence in my team and knowledge of how they work; the past is the best predictor of the future. (It should be noted that this isn't about signing up my team for work they can't possibly commit to!)

This is quite powerful. The ability to know how a teammate will act, without explicit communication and without constraint to some particular set of rules, gives an organization a dynamic, agile edge over other teams that are more by-the-book.

I sometimes hear that social sites like Facebook and Twitter will be heavyweights in the future of recommendations (or of search itself), the idea being that your friends can give you better recommendations for things like books, movies, music, and travel than random strangers can. I respectfully disagree.

First, it's hard to imagine this being the future when searching on sites social network sites is so abysmal. On Twitter, searches only go back 7 days. And while Facebook lets you search for friends, it has no decent way of searching the content of wall posts. I had to dig around pretty hard when I wanted to re-find an awesome song that a friend posted months ago.

Technical feasibility aside, there are conceptual issues with relying only on friends for recommendations. Social networks don't have the "long tail" that other sites on the Web support. For example, I have about 300 friends on Facebook, and these people tend to come from similar backgrounds as me: for the most part, we attended high school or college together, or we've worked together. Or we're related. I might value my friend's opinions on good books for summer reading, but if I'm trying to stretch my horizons, my friends are a terrible source of input, since we're so homogeneous.

Relying on Facebook or Twitter for recommendations will only benefit the socially rich, those who have thousands of diverse connections. For the rest of us, we'll have to rely on the diversity of people who aren't connected to us, but who can still influence our decisions: the people on Amazon, TripAdvisor, and other sites who tell us how good a certain book is, and what's wrong with that hotel.

The other thing that makes social network sites unsuited for recommendations is the fleeting nature of posts. On Amazon or TripAdvisor, other people's recommendations are associated with the desired object itself. But in social networks, your friends' recommendations are associated with your question. If you post a question when no one is looking, no one will answer it. If you post a question a few days after a friend posts a similar question, you won't benefit from those recommendations unless you're somehow aware of them.

I'd like to see improved search capabilities in Facebook and Twitter (why can't I search my friends based on location?), but it'll take a lot of work to rend recommendations from these sites.

Google has unveiled their new Image Search interface. Doc Searls expressed his dislike of the new search (and his growing preference for Bing's image search) on his blog, and Dave Winer tweeted his agreement. I thought I'd check out Google's new capabilities to form my own opinion.

I tested Google Image Search by searching on my own name. In the new search results, images are shown on a page in a way that makes them visually strong - this looks less a sparse collection of images, and more like a montage of big, bold pictures. Instead of pages of search results, you can scroll down the page to see more results. Moving the mouse over an image may zoom in on the image if it's not already shown at full size, and displays additional information about the picture. This was helpful when I tried to understand why there were pictures of herpes in my search results (one of the world's people named David Koelle is a medical doctor).

When you click on an image to go to the website on which it was found, Google places an overlay on the site that shades the original page and shows the image you were looking for in the middle. I found this to be an annoying extra step - my intention in clicking on the search result was to go to the original page, so why should I be presented with another instance of the image, that I then have to close so I can view the page? It would be better to have a small copy of the image in Google's right-hand pane, with a button to "Find image in page" that would automatically scroll to (and maybe highlight?) the image.

So, what about Bing? It turns out that Bing is just plain wrong. Doing a Bing Image Search for David Koelle doesn't show any of the people I know named David Koelle. I can't find my picture in the whole list, and the first actual David Koelle doesn't show up until about 100 pictures down - but it's the only accurate hit for another 100 or more pictures. Instead, I see a few images that I'm familiar with: the JFugue logo; a picture of PragPub magazine, in which I once co-wrote an article; a picture of Michael Swaine, the editor of PragPub. Otherwise, I don't recognize any of the returned images, and very few of them seem to fit my search criteria.

I'm surprised at how dependent I've become on certain Windows 7 user interface features, and how natural they are to understand and use:
  • Searching within the Start menu (How did I ever find things before?)
  • Aero Snap: Moving a window so it fills the left- or right-half of the screen (I only rarely did this by hand, but it now feels so necessary)
  • Dragging the title bar of a maximized application to minimize it and move it around (Really? I couldn't do this before?)
  • And I haven't even started using Aero Shake (click and shake one window's title bar, and all of the other open windows will minimize) or Aero Peek (makes your windows transparent so you can see your desktop)
When I move back to the Windows XP machine I have at work, the lack of these capabilities is really frustrating!

I came to realize that the way I navigated my Start menu (which, despite my valiant attempts at cleaning up, spans at least two columns) was my physical location as opposed to logic: "I know WinSCP is on the top half of the second column." This knowledge became organic: as I added new applications to my system - WinDirStat (which is awesome), Google Chrome, and so on - they were added to the end of the list, and I became familiar with their physical placement. But on my new Windows 7 machine, I've installed so much new software so quickly (e.g., Paint.NET, LMMS, Synthesia (which is awesome), Blender, Boxee) that it's difficult to build up that physical memory... not to mention, the Windows 7 Start menu limits itself to one scrolling column.

I've searched in vain for Windows XP add-ons that can give my old windows the same side-of-screen, drag-from-maximize, drag-and-shake interaction that I don't know how Windows users have lived without for the past (almost) 20 years. It's clear that Microsoft doesn't have a vested interest in back-porting changes like these, but I hope some third-party developer will come around and do it some day (not me... I've got other projects cooking).

As I previously discussed, there are really only four types of energy: solar, nuclear, geothermal, and gravitational.

Some of our energy sources are actually the accumulated potential of these types of energy. For example, fossil fuels represent solar energy collected over a long period of time.

Let's say that by using fossil fuels, we can effectively put the power of 1 million years' worth of the sun's energy to work in supplying our day-to-day energy needs (probably a conservative estimate). Every day, maybe we use 10 months worth of collected fossil energy (the actual numbers are less important than my point).

Now, let's suppose fossil fuels run out.

Can the sun itself supply all of the world's energy needs in real-time? Is the amount of energy that we can collect and use per second greater than the total power consumption of the world per second?

If not, there's a lot of opportunity for scientists and corporations to improve devices that collect energy, and optimize devices that use energy.

I have a question for companies like BP, ExxonMobil, Sunoco, and so on:

Are you an oil company, or an energy company?

Because if you're an energy company, it's in your vested interest to honestly and thoroughly explore alternate forms of energy. You want to pour money into research and development, because you can see that we're heading away from oil and towards renewable energy sources. You want to be the first to develop facilities that can store solar energy for use at night; you want to be the first to devise ways to transport energy from the Arizona desert to Alaska during the winter. You - not GM, not Ford - YOU want to build the solutions that let cars run on something other than gas, so you can lock us into "HydroGen(TM) from ExxonMobil" or something like that, and license the engines to the auto industry. You see decentralization of energy on the horizon, as more homes and businesses generate energy at their location with localized solar and wind generation, and you want to tap into that market. Solving those problems will put you ahead of the competition. From a business survival perspective, you want to make sure that your company continues to exist if oil runs dry, if public opinion moves away from oil, if evolving national security concerns make it unrealistic to rely on foreign oil, and so on.

If you're an oil company, you're already a dinosaur. We'll see your demise in the coming decades.

As a software project manager, understanding risk and having risk mitigation plans to fall back on is extremely important to me. If someone said to me, "There's a 99% chance that we'll get this software complete by the deadline, but a 1% chance that, if we blow it, we'll lose our funding," I'm going to ask, "Okay, how to we manage that 1% risk? What are the warning signs, what do we do to prevent it, and if we happen to miss the deadline, what can we do so we don't lose our funding?"

Risk is a part of every project, and it must be recognized. Some semblance of an effective risk mitigation plan must exist.

Now, on to the oil crisis in the Gulf of Mexico.

"There's a 99% chance that our oil operation in the Gulf will go off without a hitch, but there's a 1% chance that if something goes catastrophically wrong, we'll fuck up the entire Gulf with thousands of barrels of oil a day spewing out of a hole that could take months to close up, followed by decades of clean-up. It will  severely alter the ecology of the area, and it will affect the livelihood of thousands of residents."

I'm going to ask to see your risk mitigation plan. And if it's not good enough, you're going to make it better.

It looks like there was no risk mitigation plan in the first place.

Nice job, guys. Way to be responsible. No triple bottom line for you, huh?

There are really only four types of energy: Solar, nuclear, geothermal, and gravitational. Every other source of energy we know of - fossil fuels, switchgrass, wind, waves, and so on - is based on one of those four.

Let's skip the middleman of fossil fuels and wind and get our energy straight from the sun.

(I'll even go so far as to suggest that the sun is really nuclear, and gravitational depends on the initial energy of something blasting the Moon out of the Earth's crust... so, I'll refine my list to two types of energy: nuclear and galaxial. And, yes, these both can be factored into "physics," but let's stay practical, people!)

I sometimes wonder if there could be a path for software engineers to become rock stars - not glorified engineers respected by the software engineering community, but actual stars that win over the general population, get their picture on the cover of Time magazine, get featured in ads wearing milk mustaches, and, when the world least expects to see them reappear, have a shot at Celebrity Apprentice or Dancing with the Stars. (EDIT: When I wrote this, I didn't know that Steve Wozniak was actually on Dancing with the Stars)

So what differentiates a software engineer from a rock star? (Perhaps the use of the word, "differentiates"? Or putting the question mark after the quote because it's not part of the string?) The irony of "Rockstar Games" is that there are no rock stars! Not by my definition, at least.

Music is about so much more than just the sound and lyrics that we hear on the radio. Successful musicians exhibit their personality and themselves through their songs, stage performance, and lifestyle. The popularity (or notoriety) of a musician is as much a part of their stardom the music they sing. Music is an extension of personality. Programming is not so directly related; it's not a physical expression that can be generated on the spot, but a mental expression that takes time to nurture. What would a software engineer in concert look like?

Music is about entertainment. The closest programming correlation to entertainment is games, but games are becoming more like movies than music. Many of the latest games even have tie-ins with books and movies. This makes me think that programmers are more like gaffers, best boys, set painters, and paint setters than musicians or even actors. They make the magic happen, but they're not the hero who the crowds want to see.

Classic songs and movies are respected. Casablanca is still a great film. Is Commander Keen still a great game? Of course, there's a cadre of people who enjoy playing classic games like Pac-Man and Asteroids on original devices or Mame emulators (or Microsoft's new Game Room), and I still love text adventures, but in general, games quickly become forgotten. And while songs can be listened to over and over again, playing the same game repeatedly gets boring. Our brains must process these things differently.

I'll leave you with a novel thought. Music and movies are both types of media, and within a medium, specific styles, instances, and stars are created: techno, "Baby Got Back," Taylor Swift; horror, "Star Wars: Episode I," Jim Carrey. Games are are a medium, too, but their stars, if any, are characters (Mario, Sonic the Hedgehog, GLaDOS), not people. Sure, there's John Carmack, but is he a household name? Maybe true programmer rock stars will only emerge when a new type of medium, independent of our current notions of entertainment, emerges. Perhaps this new medium can emerge on devices like the Kindle, iPad, and Droid Incredible. Maybe the medium will fit in a unexplored part of our daily lives that music and movies can't fill. And maybe, just maybe, programmers can emerge from this medium as rock stars.

(Epilogue: If this new medium does emerge, I think what will really happen is that everyday people will have a new, non-music, non-movie chance at stardom... and again, the programmers become the enablers. But, after all, that's really not such a bad place to be.)

I want to generate MIDI music for an electric guitar that sounds like this. Has anyone seen this done before? Is it possible?

(I found Magdalen Graal through Jamendo.com, a source for free, legal music downloads. If you like her work, make a donation at MagdalenGraal.com)

Life is amazing. Living systems have evolved to use anything and everything in the physical world to life's advantage. Living systems embody aspects of chemistry, geometry, chemical geometry, materials, physics, mechanics, hydraulics, pneumatics, electricity, magnetism, optics, light, sound, logic, sociology, behavior, and so much more. We're now discovering that quantum mechanics may have a role in olfaction, avian navigation, and photosynthesis. Amazing.

On March 15, 2010, Alan Skorkin wrote an interesting article, "The Difference Between A Developer, A Programmer And A Computer Scientist." While there are overlaps in our opinions, there are some shades of difference that I wanted to address in a post of my own.

Here's my take on the difference between a Computer Scientist, a Software Engineer, and a Programmer.

Computer Scientist
I'm with Alan on this one: a true computer scientist (as opposed to so many developers who have computer science degrees) is interested in the nature and theory of computation, the development of new languages and new ways to process information. People who are working hard to improve search engines, vision systems, and artificial intelligence techniques are likely a mix of computer scientists and programmers, or computer scientists and software engineers - particularly when such solutions are expected to work in real-world applications, like photo applications with facial recognition algorithms.

Software Engineer
A software engineer, also known as a developer, is an expert in developing, refactoring, debugging, and building applications. Software engineers need to have people-facing skills, so they can communicate effectively with managers, customers, and team members. They use software engineering tools, like Mercurial and Jira. They may share their knowledge with other developers, whether at lunch, on StackOverflow, or on their corporate wiki. They need to be concerned with the usability and utility of their product (whether the product is a UI, an API, or something else). A Software Architect is an advanced Software Engineer who can envision a complete system, and anticipate the pitfalls that may be encountered in its development. Some Software Engineers may become Project Managers.

I'd argue that there's a difference between an application (e.g., a full-blown product) and a program (e.g., a standalone piece of code). A programmer writes programs - perhaps quite amazing programs that do some remarkable things - but does not have the breadth or opportunity to develop a product. Programmers can learn how to program from a book in 21 days; advanced programmers can create awesome programs by combining their insights and imagination with their knowledge of programming. A programmer may be able to integrate existing software components together to solve a problem and produce an amalgam that works, despite some roughness around the edges, without a requiring a deep understanding of the components.

These are the connotations that I've become familiar with over the course of my career. I freely admit that the actual terms could differ based on one's locality, experience, or other factors.

Makers and Solvers
I also believe there are other dimensions to consider. For example, some people enjoy software because they're Makers - they like to build new things, explore new ideas, create something that the world has never seen. Others enjoy software because they're Solvers - they view a problem as a puzzle, they want to fix it, they want to know why something doesn't work and they want to make it work. These are two types of passions that I can think of; perhaps some other people enjoy software because of the money, but I think most of them left the industry after the dot-com bust.

When a software development team builds an application, the graphical user interface (GUI) is an important part of that application. Hopefully, the software design team has conducted extensive assessments with users to understand how users conceptualize, understand, and use the application. Unfortunately, it seems many applications (and websites, but that's a different matter) suffer from a severe lack of usability analysis or insight.

Regardless of whether a GUI is designed well or poorly, there may be situations in which the GUI does not support the workflow or needs of a specific group of users. For example, a team could develop a word processor, but people in a particular user community may have very specific needs that are not supported by the original application; or, the functionality they require may be built into the application, but based on their workflow, it's too tedious for them to use.

What does not exist today is software applications that can allow their user interfaces to be modified by end-users. Preferably, end-users who can perform usability assessments within their own community.

For example, perhaps I need the ability, in my word processor, to quickly and easily:
  • Paste in some text
  • Automatically convert that text to sentence-case (suppose, for example, it had been all upper-case)
  • Bold-face some keywords in that text
  • Pull out the keywords into a separate clipboard or document that I can copy from
All of these steps are possible in modern word processing applications, but they can't be rolled up into a single toolbar button. Some applications do let you customize toolbar buttons, and assign tasks to those buttons, but that capability provides no means of customizing parameters (for example, "select the first word from the pasted text, and search the document for that word").

I'm not sure if there's a compelling need for a capability like this, but isn't it an interesting idea? What if an application could be developed from the perspective of its capabilities, and anyone could develop a GUI for that application? To use a website analogy, it would be as if the design of the application were done in CSS, and the underlying functionality of the application were expressed in DIV's.

And, to take the idea further, what if there were an easy-to-use, end-user-focused "CSS Designer" for re-designing an application - for recombining the functional building blocks into new UI components that can be tailored to specific end-user communities?

Think, "Microsoft Word for Bioinformatics," or, "NASA WorldWind for Petroleum Geologists," or, "Adobe Photoshop for Rich Client Developers."

(And, to take this even further, a new market of application designers would emerge. These consultants would charge for their services to tailor applications to specific user communities.)

Remember 2006? That was a fun year. The airlines introduced discount carriers, like Song and TED (the airline, not the conference) and JetBlue, that had TVs in every seat (on Song, you could even play trivia with other passengers) and awesome snacks - I'm so thankful that JetBlue is still around. Also in 2006, SecondLife came to life. Virtual reality seemed a bit closer to reality. Companies like Adidas and Toyota, universities like Ohio U, and conferences like JavaOne would even create in-world representations to widen their appeal and reach out to new customers, learners, or attendees. Virtual advertisements were big, and people made real money from selling virtual goods.

I logged into SecondLife occasionally (before its software exceeded my video card capabilities - I can be such a Luddite at times), but I don't think I actually enjoyed it. There wasn't a whole lot to do. And the things you could do may have looked fun, but really weren't. I remember going to a dance club. To dance, you'd click on your avatar, select a dance script, and watch your mini-me jitter away. How fun. Another time, someone took me for a ride in their dune buggy. Had this been Real Life, that would have been very fun! But watching my avatar ride around was quite unfulfilling. I remember typing, 'Wheeeeee' without really feeling it.

But someday, SecondLife could be really exciting. What if to dance, you actually dance, and your Project Natal sensor bar (or something similar) converted your physical movement into your avatar's movement? Ooh, and what if you could get actual advice on how to improve your dancing, because an algorithm could see your movement, and recognize that you're not doing that twirl quite right, but if you could just time your arms slightly differently... there, now you can do it! You could learn all sorts of things: Dancing, tae kwan do, yoga, piano, guitar - the list is limitless. I'd like to call this idea Computer-Assisted Performance Instruction, or CAPI.

In the past, I would enter SecondLife, and leave minutes (seldom hours) later, not feeling any better for the experience. But what if I could enter a virtual environment and learn something, or perfect something, or (and this will require its own spin-off blog post) engage in meaningful relationships with people who have actual knowledge, experiences, wisdom, or friendship to share (and aren't dressed like 6-foot-tall furry squirrels)... now that would be something that could augment my life!

As a puzzle creator, I'm interested in what makes puzzles fun. Two things strike me as particularly important to a successful puzzle: The way that solved answers begin to reveal other answers, and the ability to solve a puzzle without resorting to guesses or brute force.

Crossword puzzles and Sudoku are two types of puzzles that demonstrate the progressive revelation of unknown answers - and these are two of the most popular puzzle formats around today! Every answer helps narrow down the choices for other answers, eventually leading you to a solution for the whole puzzle, followed by a feeling of puzzle-solving elation. There are other puzzle types that do not embody this principle, including word searches and anagram games; each answer is found independently of the others. When you're done with a game like this, there's less of a spark (that "puzzler's high") than in a game where the answers build off each other. There could just as well be 5, 10, or 20 more or fewer answers to the puzzle, and the puzzle wouldn't feel any different. In fact, a sufficiently large puzzle with many independent answers may start to feel boring pretty quickly.

Good puzzles also give the solver a starting point from which to begin finding answers. Maybe the starting point is some filled-in squares, a sample answer, answerable clues, or a limited number of starting positions. There are some puzzles, however, that lose a lot of points in the fun department by starting with too large of a space of possible answers. I have recently seen puzzles in which you have to spell a word, given the telephone keypad numbers that would be used to spell it if you were texting the word. For example, given 2 = ABC, 3 = DEF, etc., you need to find out what word can be spelled from "2478475223". Looks like "agr," "bir," "bip," and "chr" are all good starting points, but finding the right answer for the first couple of characters doesn't help reveal rest of the puzzle, aside from simply being the beginnings of words in the language (for example, solving 2 = 'a' doesn't mean the other 2's are also 'a'). Just because a puzzle reflects something people do today (texting, in this case) doesn't mean it's fun.

Do you remember playing with spiral graph toys, like Spirograph®? In those types of toys, you'd have fun drawing spirals with toothed gears that fit inside rings (or that sometimes rode on the outside of a ring).

What you probably didn't think at the time was, "Gee, I wonder what would happen if we create an abstraction of this toy, then extend it to simulate the combination of many gears, some of which don't even need to be bound by the realities of physics - they can be larger than the gears they sit in, or they can rotate in any direction."

It turns out that if you do think this way, and then develop a bit of software to test your ideas (using the hot-off-the-press HTML5 and ProcessingJS, in this case), you'd have an interesting new toy on your hands.

You'd also be able to create some pretty cool spirals:

Try my Advanced Spirals application, and see what you can come up with!

I believe that collaboration will be a foundation of almost all software in the near future.

I've used Google Docs, particularly Google Spreadsheets, in a collaborative manner as part a puzzle hunt competition. We'd have anywhere from 2 to 15 people working on a puzzle at any given time, and everyone is making updates to the spreadsheet simultaneously - entering answers to clues, arranging the clues, creating new columns for listing interesting aspects of the answers, and so on. After an experience like this, it can be almost painful to head back to the office and work on single-user document tools, like desktop word processing tools, when my team is all taking notes at the same event. Maybe I should get the team to use Google Docs more frequently.

I believe that collaboration is powerful and useful; once the genie of collaboration is let out of the bottle of our collective software experience, it will be impossible to push back in. There are many software applications that will benefit from collaboration.. I think that, for most types of software, the ability to support collaboration will be a critical piece of a software's architecture.

Welcome to the newest incarnation of idea2product!

I intend to use this blog to spread the joy of transforming fascinating ideas into outstanding software products.  I will cover best practices and new innovations in the software lifecycle, the ups and downs of business and marketing, and most importantly of all, the travails and the glee of the end-user. I'll also expound on the thoughts, ideas, and projects that keep my mind churning and make me who I am.

This ought to be a fun and informative ride!