For the first time ever, I've received some feedback on a blog post that even I thought was geeky. I was writing about the creationist vs the evolutionary ideas in terms of product development. To reiterate, I was looking at the Agile idea that we should aim for short incremental improvements when we develop the product towards some goal. In this approach, though we might spend a few minutes with a program that doesn't work, or has some odd loose end, we only ever aim for an easy-to-achieve working and slightly different program. Conversely, the creationist approach (as I'm defining it) says that we can spend time working on a component without surfacing it as part of a working program. In other words, we can create a huge complex thing in completeness between increments.
Here is was my correspondent (an old friend who has chosen this moment to renew our acquaintance) thought:
By definition all computer programs can be reduced to small lines of code and in the process of writing code you are adding these pieces one by one, although you usually have a clear 'vision' of the required end-state. The only question is when to release the product to market. Usually we wait to release until the functionality is fully usable by the customer, but there are many occasions where we may wish to introduce semi-functioning capabilities into a product, possibly with a beta designation.
With a computer program, having extra pieces of code that is not used does not hurt the product (but the same is true for organs that are no longer of use to us - why have humans not stopped having appendices -people who suffer from appendicitis should have died out long ago, leaving only humans without an appendix). Sometimes although we are carrying around extra parts that appear to be of no use, this is not a problem unless there is an alternative that is in direct competition available in the market place.
This is indeed food for thought. Let's have a quick look.
The smallest unit of the program is a line of code
True enough, but not all viable changes can be done in terms of single lines of code. I've just spent all morning writing a series of things which are interreliant and which cannot be surfaced to the user yet. No single line could do the job. So, if the unit of "mutation" is a single line, then the whole idea of evolving programs just ain't gonna work. However, if the unit of mutation is "that which I could do in a few hours", which is the sort of approach I think makes practical sense and which Agile seems to look at, then evolution still seems possible.
Clear vision of the end state
No way Jose. I have never have a perfect or unambiguous view of the end result. Indeed, I've only ever discovered this fact afterwards, so doing little increments and getting feedback (on something which won't break because it's incomplete) seems like a good idea.
When to release to market
This is what Agile tries to make possible more easily. The idea is that every day (or iteration, at least). There is a fully working piece of software with all the latest changes, none of which make the program unviable. Like evolution, which can only allow for the survival and propagation of a creature that doesn't have some horrible fatal flaw (at least compared to its ancestor), so incremental development needs to result in working increments as we go along. If someone has decided to rip something important out, or work on something huge, then this incremental delivery doesn't happen.
Semi-functioning capabilities. In nature, these would not survive, and I think that's what Agile is trying to say about them in software engineering. If it's only half working, then it's not working. If, however, it only does half as much as we would want it to, but is totally working, then that's still an improvement on it doing none of those things. In addition, half of what we wanted it to do might actually be enough for someone to get use out of it and, therefore, make them want to pay us for the privilege of owning it right away.
Extra stuff that is not used does no harm
I agree. In fact, this morning's work has resulted in exactly that situation. Nobody except me and my team will know that my new stuff exists. It hasn't been surfaced in any way a user could discover. This is where the computer programmer can deviate from the evolutionary analogy a bit. Evolution would only favour a mutation which improved the creature's survival. A computer programmer can add something which the programmer knows will benefit the program later on. Such things include back-end improvements or refactorings. These may well be totally invisible to the end-user. However, again it should be stressed that doing this adds inventory to the process. In other words, I've put effort in, so where's the reward? I should be able to see the benefits as soon as possible (in terms of surfacing something to the user). The reason for this is that it's better to do a small thing end-to-end and be able to show a user it, then do a lot of preparatory work and then demonstrate the end result in a big bang and discover that it's well off the mark, or discover that I've gone out of business while I was working on the beautiful creation.
So creationism vs evolution
Again, it's an interesting one. Sometimes, I think the programmer has to put his faith in his own abilities to make the perfect solution in one go, rather than evolve a solution. Yet other times, I think we are far too overoptimistic about our understanding of what is really required to make the perfect creation. Doing little steps in the right sort of direction can take slightly longer, but can provide so much more feedback and guarantees that if we had to stop, there'd still be a viable product. Given that my experience of product development has largely occurred in situations where I was always months away from a product which could do everything available from all of its menus, the idea that we could keep the product releaseable seems to be the ideal.
I think it can be done.
Why humans don't evolve
My correspondent has brought up an interesting thing that has been bothering me of late. I've dropped the whingeing about programming now. The thing which I've realised is that we humans pretty much defy evolution and natural selection. Why? Because we have come to the conclusion that life is sacred and we must do whatever it takes to preserve it.
Nature is a harsh environment. Creatures get killed by other creatures, or by their own inability to look after themselves. It's exactly this process that reduces the likelihood of weaker alleles being prevalent. It also emphasises the stronger versions. To survive, one must compete and improve. That's what gives us the huge diversity of creatures, adapted to their environments.
Humans, however, are sentimental and life-preserving. No natural selection for us. We'll favour the underdog. If someone has a congenital condition which hampers their survival, we'll keep them alive and someone may even fall in love with them, possibly having children with them. In nature this doesn't happen. In humanity, we defy nature. I don't know if it's right or wrong.
I do know that there is evolution occurring in some ways. Our culture is evolving. Instead of physical survival traits, we're developing cultural ones instead. Who can be the most famous? Who can be known by one name, instead of their full name? That's a sort of propagation. It's shallow, but it's there.
Look at the recent celebrity Big Brother. Take a bunch of unimportant people, who have a fake status of "celebrity" cast upon them through stuff that they have or haven't done. Add an underdog (we love an underdog) in the form of Chantelle, some exceedingly unimportant nobody (in the grand scheme of things, we all are) and see what happens. The public choose the nobody over the other nobodies and then the nation's attention is bestowed upon that person who, in the absence of any discernable ability to do anything, gets her clothes off for the tabloids, because it's easy money and she may as well cash in on the only natural thing she's got.
Maybe if we were constantly fighting for our lives, or had to watch our loves ones die because of lack of medical science, we'd be more keen to have real things in our lives than all of this.
Changing the subject this morning, I had a fairly odd journey into work today. It's interesting how these things go. I was offered a cup of tea before I left, but declined. Had I remained, I might have left 5 minutes later, which would not have been the end of the world. However, I chose to leave when I did.
I spotted a dead rat in the road on the way to the car. It was completely flat. A white rat, it looked quite odd. For a second I wondered if it might not actually be one of my girlfriend's guinea-pigs. One of them is white. It might have escaped in the night and been run over. Except guinea pigs don't have tails - well, not rat's tails at least. This musing delayed me and so I went over to my car. I reversed it out of the parking space and headed off down the street. All of the events leading up to this drive had taken time from me, or given me extra time to get to work. I had the sat-nav telling me to turn left into a minor road, I made the turning and was then hit by a car that had decided to ignore the combination of the give-way junction opposite the road I was turning into, and the presence of my car.
If I had been a few seconds delayed or sooner, the accident would not have occurred. If the person driving their car had been PAYING ATTENTION then the accident would not have occurred. I saw her slow down for the junction and I had right of way. I even clocked her out of the corner of my eye (as she idiotically rolled out into the road) and tried to get out of her way. It was not to be. Now we have to go through the process of getting her insurance company to pay up. This may be complicated by the fact that my insurance company's first stab at finding the details of her company has not been wholly successful.
My poor car.