My research interests are at the intersection of Software Engineering, Formal Methods, and Programming Languages; I focus on designing techniques and building tools that improve software reliability and increase programmer productivity in the world of continuously evolving software. Software is pervasive around us as we surround ourselves with evermore devices; ensuring the quality and reliability of the software around us is critical.
My research so far has focused on ensuring that the quality of software does not degrade as software evolves. To achieve this goal I explored a broad spectrum of techniques ranging from regression testing to differential verification. For regression testing I empirically validated that regression-testing techniques (which are agnostic to program changes) are safe. More recently, I focused on the problem of test reliability: when a change is made the test outcomes (pass/fail) should reflect whether there are faults in the system; there are many reasons why tests can give false alarms or alarms are masked. Our techniques help detect, debug, and fix this problem. When a change is made to the software, we leverage differential program verification to prove that certain parts of the program are not affected by the change.
In my undergrad I worked on transforming imperative loops to a functional map-reduce form. I designed a set of program transformations that transform Java loops to functional operations using lambda expressions; our tool LambdaFicator, implementing the transformations, ships with the official NetBeans distribution.