A couple of weeks ago Roger Alsing made a genetic algorithm that manages to draw La Joconde using a disturbingly low number of translucent polygons. Very impressive but it reminds me of an annoying thing with demos of genetic algorithms. Most of them do things that aren’t truly impressive. If you want to see Mona Lisa, go to Paris or at least look at a true reproduction. If you want to see the the power of evolution, go to a park and look at the birds. Both can be surprising eye openers. However: there is something missing in between. The power of natural, or in this case hopefully, synthetic or possibly quasi-natural selection is that it can solve very complex sets of changing requirements so who dares throw one at it?
I for instance live my life by the side of iTunes. I find it to be a very sleek and well designed piece of software and every now and then it actually enhances my experience of music. However, as with any piece of Apple software, or any software for that matter there are those who don’t quite agree with me. Typically, they hate it. Now these kinds of problems are quite common, user interface design is admittedly hard. The trade offs are really complex and any good designer must constantly measure his ability to practice the More-is-less paradigm in a hailstorm of friendly and not-so-friendly user input.
This is, I believe, the perfect setting for applying evolutionary design.
Do my two weeks of horrible horrible usability class qualify me to make such a claim? Of course not, but on the other hand that usability professor of mine was retarded and would probably not even the consider the design aspects of natural selection unless you asked him to so I am clearly more qualified than him.
So would this work? We want a UI design process that evolves, easy enough claim but it doesn’t take long to realize not so simple in practice. Since this is philosophic blogging and not science, let’s have a go at it!
Firstly we would need a Genotype/Phenotype system. A genetic coding for the interface. I’m guessing getting this really good is ridiculously hard. One could of course create a crude variant where the building blocks consists of a set of normal UI components such as a button, a slider, a knob and a text window. The coding would then consist of a linking of these to each of the functional aspects of the program: play, pause, rip, mix, profit and so on. Now that is all well and good but the opportunity to come up with truly revolutionary solutions probably lies behind the tricky task of creating a more general set of design principles. How can we enable the creation of new controls and widgets? What about linking operations into highly complex systems. That sounded more abstract than intended but to clarify the biological counterpart to an operation would be to use a muscle to turn a limb and the system would be say, dancing. How would you like a dancing media player? I would.
Ok, so let’s say someone pulled an all nighter, the code is checked in and she’s all that. We have our Genotype to Phenotype connection. Our synthesis, it’s gin and juice for the lot? Not quite. What about selection? Here is what has always annoyed me about genetic programming. Matching your phenotype against the Mona Lisa is like numerically solving differential equations by chewing bubble gum and running matlab. It just isn’t impressive anymore, but here’s the kicker: You should be able to solve much harder problems! How do you know a user interface is good?
The answer is: You don’t. You don’t even have to. The only thing you need to decide is how any two individuals compare to each other a great many times. With some faith in the right decision being made more often than the wrong one, the rest becomes statistics.
Natrual selection happens when an individual dies before it manages to carry on its genes and I imagine that process can be reproduced. If your algorithm is aiming for a fixed target such as the Mona Lisa, the process is easily handled by the computer. Is this more or less like Mona Lisa? is not a trivial question but it is certainly a fixed target. In our case however, the final judge of the process will be human users so the selection must be performed by them. The simplest solution would be simply to let users kill single individuals and get a new one. Let’s say something like this: Each time you start the program, it spawns a new individual user interface by sexual reproduction of two random individuals from the internet. Don’t like it? Kill it and start anew.
This process has a number of interesting properties, especially if you add a reproductive age property where only running programs actually used for a while will be used for reproduction. On top of this, one can imagine all sorts of user input possibilities to speed up the process but selection always needs to be at the heart of it.
The last problem(well, not really but the last one I care to write about) is evolutionary speed. No one would enjoy using all those really bad intermediates so creating an acceptable starting point and getting the process to move fast enough from there for users to notice the improvement would be paramount. For this, I have no good solutions. Do you? Creating an initial state is clearly doable, speeding up evolution is probably not so easy. In the biological sphere, we humans share a couple of nucleotides here and there with peas. With peas! That is from what I’m told something like a quarter of a billion years worth of selection since our evolutionary paths split and the best information preservation known to man. So no, I don’t expect magnificent results in six months worth of say a thousand people trying to play their Peter Björn and John-tracks.
Dammit, it would have been cool though. I so would have liked to see the product from the genetic mix of iTunes and Winamp.