The common view of component centered development is one where object-oriented applications are constructed by assembling interacting but non-overlapping software components, some acquired off the/some shelf, and others built expressly for the application at hand. We are interested in the problem of composing components that do overlap in terms of data definition and manipulation, but that may still be developed independently, and deployed and executed in a distributed fashion. We propose a development approach and a programming model and environment in which applications are constructed by independently modeling, designing, and programming, the different functional roles or views that objects may play, and composing them only on-demand during run-time. An object's response to a message depends on the views currently attached to its core instance. In this paper, we first present our model of view programming, and show how it is being (can be) supported in statically typed languages such as C++ or Java. Next, we show how view programming can be used to add features to existing applications by wrapping those features into view components, thereby greatly facilitating application configuration and evolution. Finally, we look at the challenges and opportunities provided by view programming to distribute components in a safe, robust, and efficient manner.