S oftware engineers and practitioners traditionally have focused on programming in the large (PitL), the development of large-scale software systems. However, the increasing speed and capacity and decreasing costs of hardware, emergence of the Internet, and proliferation of handheld devices such as cell phones and PDAs have fueled demand for new technologies that support highly distributed computation on small, mobile platforms. Employing handheld mobile devices in complex scenarios such as sea exploration, environmental monitoring, freeway-traffic management, fire fighting, and natural disaster damage assessment will require addressing a number of daunting challenges. This new set of challenges is more appropriately characterized as programming in the small and many (Prism)—software development for highly distributed, dynamic, mobile, heterogenous computation on large numbers of small, resource-constrained platforms. Recent studies indicate that a promising approach is to apply software architecture principles to the development of software systems in the Prism setting. These principles provide abstractions for representing the system’s structure, behavior, and key properties. Architectures are generally described in terms of components (computational elements), connectors (interaction elements), and their configurations. An architectural style further defines a vocabulary of component and connector types as well as a set of constraints on combining instances of those types in a software system. Examples of styles include blackboard, C2, client-server, pipe and filter, and pushbased. Selecting an appropriate architectural style is a key determinant of a software system’s success. Software architectures provide design-level models and guidelines for composing software systems. However, to be useful in a development setting, these models and guidelines require support for implementation and evolution. As the “Prism Challenges” sidebar describes, Prism’s highly distributed, heterogenous, and mobile nature amplifies the software development demands that permeate the entire software engineering life cycle. Therefore, during the past four years we have focused on the design, implementation, and empirical evaluation of techniques for supporting architecture-based software development in the Prism setting. Several aspects of architecture-based development—component-based system composition, explicit software connectors, architectural styles, upstream system analysis and simulation, and support for dynamism—make it a good fit for Prism’s demands. Our solutions for adaptable system design, efficient implementation, and tailorable execution all leverage the approach’s architectural basis and were guided by four research objectives: The authors present a software-architecture-based approach to support computing on distributed, handheld, mobile, resource-constrained devices.