Because there are more variables than can be represented in a finite model, the parameters of a problem often emerge during the attempts to build the solution. Some attempts fail, but reveal previously unrecognized constraints. In practice, this cycle can be extended beyond a single problem. In fact, most software is increasingly made by modifying or recombining the actual material of a previous piece of software, as a building may be altered for new use. This process is more like craft than engineering.
Engineering is the rigorous application of technical knowledge.
The difference is that in a craft process, before problem solving can begin, problem setting must occur. In problem setting, we as designers interactively name the things to which will attend and frame the context in which we will attend to them. And even after the problem has been set, the designer engages in a sort of dialog with the problem situation to uncover the most appropriate means and goals. So, to separate design from implementation, as engineering practices prescribe, would be to eliminate a vital link in the creative feedback process. A second closely related quality that differentiates craftspeople is the ability to turn an artifact into a tool, and vice-versa.