The hard problem basically comes down to having a system in the largest sense of the word that can actually be aware and learn, because you cannot necessarily teach it what to do when something happens a priori. We
don’t do that with human education and human training. You can’t prepare your children for every single eventuality that’ll hit them in life. You hit the high points to give them the tools to make their judgment calls when the time comes. I think that’s the big chasm that we have to cross from the very literal, almost naïve, approach of, “teach the computer these 12 steps and it will do them forever” to having a system that can actually learn and apply the basics, the principles you’ve given it to novel situations.
Ed: Jumping from a really hard problem…You might find my next question easy, but I’m quite certain our readers would still like to hear your answer. When you’re working on an existing system as a maintenance programmer and you make performance optimizations to the code to make it go faster, for example, what are some effective ways to avoid introducing bugs and fostering maintainability?
Andy: That’s a simple answer compared to the Star Trek computer thing. That’s the combination of what we’ve always called a safety net. [It consists of] having the basic technical practices in place of version control so that you’ve got an ability to roll back changes to be able to compare and contrast and test the system at any point in time from before your changes, after your changes, months and months before any of that even started, when it was peak load, whatever, to be able to just dial the old time machine to any point in time and work with the system as it existed then.
And that’s a little bit beyond what most people can do with version control. You roll the system back a certain amount. Suddenly, you don’t have the right libraries to work with that version. You don’t have that same compiler anymore, so there are some potential issues there, but, ideally, what you want is to be able to re-create the system as it existed at any point in time. That’s on the one hand.
[On] the second hand, you need the fairly comprehensive unit tests so that you can prove this is exactly how it functioned then. For example, you can say, “I’ve made these changes, and guess what, it still functions exactly the same or these things have changed but we can migrate that and have a plan for that.” So you have to have version control, you have to have unit testing, and you have to have automatic artifact creation.