Alternately you can do software by experimentation, by hacking up some code, and refactoring it until it looks optimal for the task at hand.

Software design does not directly refer to the way that the program looks to the user - that is Interface design. Software design refers to the internals of the program, the source code. However those internals must allow the front end to exist, and so are severely constrained by it.

Software design, as opposed to the de facto design resulting from unplanned construction, aims to produce readable, maintainable, flexible, robust and elegant code by forethought about the structure of the program constructed. The more ambitious the program, the more forethought is needed.

I do not regard software design as completely separated from software construction. Each procedure implemented involves some decisions about how it will behave; and design decisions taken in vacuum, without the reality checks of implementation, may not work as well as intended.

Software design is concerned with programming on a larger scale than how to phrase a single line of code. It aims to make the large-scale structure of a system understandable by means of consistently used metaphors. It adds an aesthetic. In order to make good software, it is often necessary to create one or more levels of abstraction between the vocabulary of the problem domain and the vocabulary of the programming language. Doing this, and doing it well, is software design.