Research

My current main research interests relate to
consciousness, time, and advancing software quality by using both
static and dynamic programming language approaches. On the purely-CS side,
I am particularly concerned with automatic or minimally-guided techniques
that can scale and be applied easily to large, existing programs. I believe
that finding bugs is insufficient, and I also work to help programmers
address defects, understand programs, and program correctly.

Current major research areas:

Consciousness
and Time. I believe consciousness to be primal,
elevant, inadequately explained, and amenable to experimentation: to me, it
is the most interesting of the big problems. I believe the experience of
consciousness over time to be a hard problem (in a sense akin to
NP-Hard) in that solving it would allow us to solve most other
problems. While these are not typically research problems considered
in computer science, interested prospective graduate students are
encouraged to compare my thoughts on the
subject to their own.

GenProg: Evolutionary Program Repair. We have
pioneered techniques to synthesize repairs for defects in legacy programs
using only standard testcases (no code annotations or formal
specifications). We use special program representations and modification
operators to search through the space of candidate patches until one is
found that passes all of the testcases but does not demonstrate the error.
This work is a collaboration with Stephanie Forrest and Claire Le Goues.

Synthesis and Analysis of Non-Executable Artifacts. Source code
is not the only artifact of the software development process. We have
designed algorithms and conducted human studies related to synthesizing
program documentation, understanding software readability, dealing with
defect reports, and predicting run-time execution frequency.

Improving Software Properties. Beyond functional
correctness, a number of other properties are important to software.
Aspects as diverse as power consumption, maintainability, and visual
fidelity are all important in some domains. We have developed techniques to
improve or trade-off these non-functional properties in software
automatically.