Software Evolution
Includes all development activities that intend to take the software from a basic to more advanced state.

Software Maintenance
Includes activities required to keep the software operation and responsive after deployment. this involves making small changes to a deployed system but no major change to its architecture or requirements.
- Corrective Change: triggered to address bugs
- Adaptive Change: triggered by changes to the OS, hardware, software dependencies, or business rules and policies
- Perfective change: triggered by end users requesting small changes in requirements and features in an existing system
- Preventative change: triggered to increase the maintainability of software in the long run
Change Impact Analysis
Software maintenance and evolution involve change, and change impact analysis is the task of estimating the parts of the software that could be affected by a proposed change.
Techniques for performing impact analysis are:
- Traceability analysis: use explicit traceability relations established between different development artifacts like requirements, design, code, and test cases, to infer possibility of change impact
- Dependency analysis: use static and semantic dependencies between the development artifacts to infer the possibility of change impact
- Change history analysis: uses the commit history in a source control system to inter implicit correlations between different development artifacts
Software Refactoring
This is the process of making a change to the internal structure software to make it easier to understand and cheaper to maintain without changing its observable behavior.
It is a way to pay back to the technical debt, which is necessary work that gets delayed during the development of a software project in order to hit a particular deliverable or deadline.
Method Refactoring
- Extract Method: when a code fragment can be reused, move this code to a separate new method and replace the old code with a call to the method