The process by which an agent creates a specification of a software artifact, intended to accomplish goals, using a set of primitive components and subject to constraints
Software design is the process of conceptualizing how a software system will work before it is implemented or modified. Software design also refers to the direct result of the design process – the concepts of how the software will work which consists of both design documentation and undocumented concepts.
Software design usually is directed by goals for the resulting system and involves problem-solving and planning – including both high-level software architecture and low-level component and algorithm design.
In terms of the waterfall development process, software design is the activity of following requirements specification and before coding.