Research interests:

My research lies at the intersection of Software Engineering, Evolutionary Computation, Distributed Systems, and Adaptive/Autonomic Computing. Let me explain...

Whether directly or not, each day we trust computers to function as expected in one way or another. As the demands on software applications become more complex, it becomes increasingly difficult to build systems that function correctly at all times. Heck, it is relatively difficult to get these systems to even work at times! Software Engineering is a discipline that promotes techniques, tools, and methodologies for managing software projects throughout its various development and maintenance phases. In particular, our lab (SENS) focuses on providing some level of assurance that the system built will behave as expected, under a wide range of possible conditions. Personally, one of the beauties of Software Engineering is that it can be applied to almost any other discipline in Computer Science. As a result, Software Engineering is constantly reinventing itself and drawing novel techniques from other fields in its quest to systematically produce software that behaves as it should.

Nowadays it seems everything is networked. While this provides a framework for constructing powerful applications, it also implies that Distributed Systems are particularly difficult to build and maintain. For instance, most Distributed Systems are heterogeneous in nature, meaning they comprise different platforms, communication protocols, developers, etc. In particular, our research lab focuses on two general aspects of Distributed Systems. First, some of my colleagues explore how the network infrastructure itself affects communication capabilities. Second, some of us explore how distributed components can be dynamically changed (adaptation) at run time without negatively affecting the system. We strongly believe that studying these two areas will help developers better understand and develop Distributed Systems as our dependency upon them grows.

Adaptive/Autonomic Systems were proposed as a means to help lessen the complexity associated with maintaining computing systems once deployed. In particular, a key goal in Adaptive/Autonomic Systems is to perform changes on the 'fly', minimizing costly service interruptions whenever possible. Although Adaptive/Autonomic Systems do reduce the complexity associated with change management at run time, ironically, Adaptive/Autonomic Systems themselves are extremely complex to design, implement, verify, and validate. The Software Engineering Community has performed much research on providing tools and methodologies for systematically building Adaptive/Autonomic Systems such as middleware, frameworks, and design patterns. While various approaches are now widely available for building Adaptive/Autonomic Systems, there is still a long road ahead! In particular, our research lab focuses on ensuring that an Adaptive/Autonomic System behaves correctly before, during, and after an adaptation is performed.

While we struggle (no matter what anyone else says, *we do*) to systematically build Distributed Adaptive/Autonomic Computing Systems, nature has been accomplishing this task for billions of years! Somewhat ironic, isn't it? Without entering an Intelligent Design/Evolution argument here, let's just say that evlution has produced millions and millions of organisms that are Adaptive/Autonomic on their own. While some research focuses on observing evolved behavior and adapting it for their tasks (biomimetics), other researchers, like our Orchid project, focuses on harnessing the power of evolution to evolve behavior that solves the problem being addressed. To accomplish this goal, we employ techniques such as genetic algorithms, genetic programming, and digital evolution (through the Avida platform). Throughout the past few years we have obtained promising results that suggest Evolutionary Computation has much to offer both the Software Engineering and Adaptive/Autonomic Computing domains.