The sight of an autonomous vehicle with cameras and real-time feedback roaming within the Google Campus, some years back, made me pause to reflect on the advancing technology, converging to provide immense end-user value. Building blocks of technology that were once on paper were now on the road!
Within the realm of software engineering, application development and management, the next emergent area is that of self-aware and adaptive software systems.
Imagine, having written a code in Java or Python, that would never have to be touched again, simply because it is truly aware of new components, interfaces, and adapts itself time and again to be up-to-date with version implementation, functionality. Forever!
Various terminologies exist, self-adaptive, self-healing, self-managing and self-optimizing systems. They all focus on autonomous behaviour — where a software or a system dynamically changes its behaviour without changing its fundamental structure.
The key components for self-aware and adaptive software systems primarily consist of the following:
Dynamic adaptive software:
- The component is replaced with another component that has the same interface
- Software system’s structure is substantially modified at run-time.
Dynamic architectural adaptation:
- Model-based adaptation can be used in each of the above forms of dynamic adaptation, although the adaptation challenge is likely to grow progressively from behavioural through architectural adaptation.
Adaptive controls and validation mechanisms:
- Leverages directed distributed control — builds validations, thresholds, trivial and extreme validation
Adaptive continuous deployment:
- Run-time optimization and reconfigurations during deployment
Characteristics of self-awareness and adaptive behaviour
Adaptive behaviour for a self-aware computational node are inherent traits that need to be built into software — that of being able to capture information (and more importantly build a knowledge base) and the reasoning leading to adaption, with trade-offs!
There are essentially 5 characteristics of computational self-awareness and adaptivity:
Being able to respond to events. Both local within the system and outside. Within a code this can be termed a private or public.
Being aware of the stimuli and knowledge of own actions that form part of interactions with other nodes and the environment. This is via feedback loops that its actions can provoke,
generate or cause-specific reactions, with an ability to distinguish between external and internal interactions.
Historical — time aware
Knowledge-based behaviour ushers in traits that draw upon both historical relevance and likely future orientation. The node needs thus, to have memory, with time-series modelling, that can also draw in the ability to calculate and drive towards probabilistic future-looking scenarios.
This characteristic covers explicit objectives (outcomes), existing constraints and happy-paths, and stresses on the ability to reason based on the knowledge of the objective, both internally and externally.
Meta-data on self-awareness
The ultimate trait that will lead to a true self-awareness for a computation node — the need for meta-data on the node’s self-awareness, would need to be built in. This helps, for instance, to have the node being adapted and instantiated as form of time-awareness and a simple form of goal-awareness, simultaneously. However, the node’s dynamic run-time context may require a change or even a destruction of an instantiation due to dynamic trade-offs!
The emergence of self-aware and adaptive software and systems is possible today, with many of the characteristics for software components mimicking human behaviour. What was a paradigm and research perspective a decade earlier has now become embedded into many real-world pervasive software systems, including self-driven vehicles, behavioural financial trading, forensics and many more.
Functional and quality of service parameters expressed across domains, classified into ontologies are part of ongoing work that include architecture generation and re-generation, pattern repository, empirical evaluation, runtime adaptation capabilities and distributed validation and allied languages.
Collaborative efforts through ongoing industry-academia liaison within the area of adaptive systems also extend the capabilities, understanding and curation of knowledge for true self-aware and adaptive systems.