This paper presents a generalization of two fundamental programming concepts, LOCAL ABSTRACTIONS and GLOBAL ABSTRACTIONS, and a survey of several mechanisms for implementing them. Global abstractions are semantic definitions (of objects) used throughout a program, whereas Local abstractions are refinement steps generated by the subdivision of a problem into subproblems. Global abstractions are very well supported in today's programming languages, but there is no mechanism entirely satisfactory for the "natural" development of programs using top-down step-wise decomposition techniques. Current languages lack means of expressing the hierarchical tree structure of programs. The structure of the program <u>must be retained explicitly</u>, and with varying degrees of detail at different levels corresponding to the way the program was developed. There is an important deficiency in the process of refining the solution to a problem: local abstractions, which describe intermediate stages of the solution, are replaced by their corresponding refinements.In particular, we discuss some inadequacies of "the facto" structuring constructs in modern languages, showing that, for instance, procedures should not be used for represeting refinements, since these are intended to control the "static" program structure (refinements may well represent non-executable pieces of code!). Finally, we propose the introduction of two new DESIGN constructs for developing structured programs which can show and maintain the solutions's structure as produced during the development process.