160 likes | 315 Vues
This document explores the evolution of software, distinguishing between planned maintenance and the organic changes that occur during its lifecycle. It examines growth metrics such as source file count and lines of code through the lens of various examples from projects like Linux and GCC. Key themes include change patterns, evolutionary narratives, and underlying architectural considerations. The text raises open questions regarding the measurement and correlation of software size, quality, and architectural change, invoking metaphors from nature to understand software dynamics.
E N D
How does your software grow?Evolution and architectural change in open source software Michael Godfrey Software Architecture Group (SWAG) University of Waterloo
What is software evolution? “Evolution is what happens while you’re busy making other plans.” • We distinguish between maintenance and evolution: • Maintenance is the planned set of tasks to effect changes. • Evolution is what actually happens to the software. • All I want to know is: How and why does software evolve? How does your software grow?
Lehman’s examples How does your software grow?
Growth of # of source files How does your software grow?
Growth of Lines of Code (LOC) y = .21*x2 + 252*x + 90,055 r2=.997 How does your software grow?
Average/median .h file size How does your software grow?
SS LOC as percentage of total system How does your software grow?
SS LOC as percentage of total system (ignoring drivers) How does your software grow?
Growth of pine How does your software grow?
Growth of gcc/g++/egcs How does your software grow?
Growth of vim(text editor) How does your software grow?
vim avg/median file size How does your software grow?
vim’s architecture How does your software grow?
Change patterns and evolutionary narratives • Phenomena observed in Linux evolution • Bandwagon effect • Contributed third party code • “Mostly parallel” enables sustained growth • Clone and hack • Careful control of core code; more flexibility on contributed drivers, experimental features How does your software grow?
Change patterns and evolutionary narratives • “Band-aid evolution” (just add a layer) • quick way to add new functionality, esp. if system is not well understood e.g., Y2K fixing, adding portability, new features • “Vestigial features” • design artifact persists after rationale dies e.g., whale fin bone structure resembles hand • “Adaptive radiation”[Lehman] • when conditions permit, encourage wild variation for a while. • later, evaluate and let “best” ideas live on. e.g., Linux kernel evolution • “Convergent evolution” • compare similar systems to reference arch. (or to each other) e.g., everyone grows an XML generator in response to market pressure How does your software grow?
Open questions • What are the recurring patterns and compelling metaphors of software evolution? • Does software evolve in the same way as the natural world? • The Nature of Economies, by Jane Jacobs • How to measure size? • How to correlate size and quality? • How to measure change? • How to model architectural change? • What is the predictive power of such models? • Do the “other phenomena” dominate? How does your software grow?