Abstract
Software development is ultimately an engineering activity, whose primary activity is to deliver executable artifacts in a manner that balances the forces on that system. The forces that swirl around a software-intensive system include not only its purely functional requirements but also a multitude of nonfunctional ones, such as reliability, portability, and scalability (often called a system's -ilities). Each of these forces is resolved systemically, meaning that no single part of a system can be responsible for responding to a force. Rather, the system as a whole, with its parts working in an architected union, must confront these forces. Indeed, the fact that these forces are dynamic and might change radically over a system's lifetime contributes to making software-intensive systems so complex. © 2006 IEEE.