In computer programming and software design, code refactoring is the process of restructuring existing computer code—changing the "factoring"—without changing its external behavior. Refactoring is intended to improve the design, structure, and/or implementation of the software (its "non-functional" attributes), while preserving its functionality. Potential advantages of refactoring may include improved code readability and reduced complexity; these can improve the source codes maintainability and create a simpler, cleaner, or more expressive internal architecture or object model to improve extensibility. Another potential goal for refactoring is improved performance; software engineers face an ongoing challenge to write programs that perform faster or use less memory.