The process of conceptualizing, defining, designing, programming, documenting, testing, and bug-fixing that goes into making and maintaining a software applications, frameworks, or other components.