The common view of component centered development is one where applications are constructed by assembling interacting but non-overlapping software components. We are interested in the case where components do overlap, but that may still be developed independently, and deployed and executed in a distributed fashion. In our approach, applications are constructed by independently modeling and programming the functional roles 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. We first present our model of view programming, and show how it is being supported in C++. Next, we show how view programming can be used to add features to existing applications by wrapping those features into view components, which facilitates software 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.