Most real-world problems, especially design problems, are ill-structured, but formal approaches to problem-solving in AI have only really made progress into techniques for solving well-structured problems. Nevertheless, such research contains clues which illuminate the way towards formal approaches to solving ill-structured problems. This paper presents the foundations of an approach towards developing a better computational understanding of ill-structured problems and how to solve them computationally, with the eventual aim of giving AI problems a much greater and more useful role in the design process. The main issues which come up in this endeavour are the notions of different kinds of ill-structuredness, and the meaning of a 'solution' to an ill-structured (and hence possibly insoluble) problem. Some basic algorithmic recipes are proposed for dealing with the main kinds of ill-structuredness, and the initial design of a general computational technique which deals with general ill-structuredness is discussed.