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 usually involves problem solving and planning a software solution. This includes both a low-level component and algorithm design and a high-level, architecture design.
It may be reviewed or presented to allow constraints, specifications and even requirements to be adjusted prior to computer programming. It is possible to design software in the process of programming, without a plan or requirement analysis, but for more complex projects this would not be considered feasible. A separate design prior to programming allows for multidisciplinary designers and Subject Matter Experts (SMEs) to collaborate with highly skilled programmers for software that is both useful and technically sound.
flickr photo by qthomasbower https://flickr.com/photos/qthomasbower/2694697816 shared under a Creative Commons (BY-SA) license