software engineering process of restructuring existing computer code without changing its external behavior