Component Based Development combines large grained components, running in their own threads of control, into large scale applications. In the current model, when called, a component runs to completion and returns a result. The current state of the art uses middleware, like application servers, to manage components and mediate communications. The next generation of components will be smart and autonomous (proactive), able to self-configure, self-heal, and ultimately self-organize. Smart components will join and leave adhoc networks and collaborations as users enter and leave various contexts. Two key qualities of these smart component aggregations are robustness and adaptability.
A robust system pursues goals, while adapting the underlying functions to fit the current situation (e.g. subcomponent loss or arrival). An adaptive system accepts new goals and either finds or configures the functions needed to satisfy those goals. Smart components behave opportunistically as other components appear and dissappear in the component's current context.
Smart component systems are already being built. These systems use software agents, agent communication languages, and agent platforms. Unfortunately, the most widely cited methods for Agent Oriented Software Development look too much like traditional Component Based Development. Tasks are decomposed into predefined functions implemented in various components. Such systems are neither adaptive nor robust.
An appropriate design methodology for smart component systems must treat goals as first-class entities - decomposing goals and assign the resulting subgoals to each component. Each component is free to vary its functional behavior in order to better satisfy its goals.
I described a goal oriented design methodology, and a sample system, in a refereed paper presented at AAW'02, HP's internal Appliance Aggregation Workshop.