Change is the heart of software development. For example, software evolves to add features, fix bugs, support new hardware, new versions of operating systems and libraries, and new user interfaces. Unfortunately, programmers perform most software changes manually, through low-level text edits, which are almost never reused. This makes software development time-consuming, error-prone, and expensive. It is widely known that at least two-thirds of software costs are due to evolution, with some industrial surveys claiming 90%.
In this talk I will present our ever-growing toolset of interactive program transformations. It currently automates changes from the domains of parallelism, software upgrades, testing, and end-user programming. I will highlight transformations from two domains: converting a mutable into an immutable class, and improving the maintainability and performance of spreadsheets. Our transformations do not require any program annotations, yet the transformations span multiple, non-adjacent, program statements. A find-and-replace tool can not perform such transformations, which require control- and data-flow analysis. Empirical evaluation shows that our toolset is useful: (i) it dramatically reduces the burden of analyzing and changing code, (ii) it is fast so it can be used interactively, (iii) it correctly applies transformations that open-source developers applied incompletely, and (iv) users prefer the improved quality of the changed code.