Abstract
Reverse engineering of large legacy software systems generally cannot meet its objectives
because it cannot be cost-effective. There are two main reasons for this. First, it is
very costly to
"understand" legacy code sufficiently well to permit changes to be made safely, because reverse
engineering of legacy code is intractable in the usual computational complexity sence.
Second, even if legacy code could be cost-effective reverse engineered, te ultimate
objective - re-engineering code to create a system that will not need to be reverse
engineered again in the future - is presently unattainable. Not just crusty old systems,
but even ones engineered today, from scratch, cannot escape the clutches of intractability
until software engineers learn to design systems that support modular reasoning about their
behavior. We hope these observations serve as a wake-up call to those who dream of
developing high-quality software systems by transforming them from defective raw materials.