An approach to software development is sketched in which problem structuring is separated from software architecture. The problem is decomposed into subproblems of familiar classes that can be considered in isolation; then the interactions among the subproblems are considered. The architectural task is seen as the task of composing the software machines associated with each subproblem and with the more complex interactions among them. It is suggested that such an approach embodies a good separation of concerns that can contribute to achieving system dependability.