Developing Truly Autonomous Software
Isaac Asimov imagines a world called Gaia. It’s a perfect world where the inhabitants communicate by consciousness. Through their collective consciousness they can heal themselves or even predict and avert a natural disaster. Science Fiction of a few decades ago tends to become technology in not far a future. So how far is the present day software from realizing Asimov’s Gaian hypothesis.
One of the foremost characteristics of an intelligent software is its ability to be autonomous. A system is autonomous to the extent that its behavior is determined by its own experience.
Service Orientation has taught us to think about software architecture and design in terms of actual business flows. But even as we try to take technology closer to business, one vital step we haven’t tried to address is the dynamism and uncertainty of business. For instance, a MoveItemToFolder service has no way of understanding the actual business need as to when and why the “item” needs to be moved to the “folder”. But like the humble slave, does its job whenever asked to do so.
Let’s assume the service knows a few good things about its business. And over a period of time, it keeps observing the items and where they are being moved. It begins to create patterns and actions out of them, and after a while begins to automatically move the “item”s to their respective “folder”s whenever required. Say, it observes that you always tend to move mails from “Barack Obama” into your Outlook archive named “Obamaniac” – it automatically creates a rule which does the work for you!
This might have been a very rudimentary example. But extrapolating this concept to a much larger level would enable us to create software which becomes more efficient and better performing the more you use it. That is, the larger its knowledge base (built out of observing its own behavior) the better is its performance, and hence its business benefit. It would also be a way of creating Predictable and Self-Healing applications – applications which can understand its own defects and take a corrective action if appropriate.
In the next post, we’ll discuss a very fundamental, but important aspect essential for developing such autonomous software – how do you make the software "understand" what you are doing.

