Service-Oriented Architecture (SOA) is the contemporary paradigm of choice for developing scalable, loosely-coupled applications that span organisations. However the architectural paradigm that is SOA is often confused with the implementation technology that is Web Services. In this paper we aim to clarify the fundamental tenets of SOA and their relevance to Internet-scale computing (or Grid computing). We then show how to apply the principles of SOA to building Internet-scale applications using Web Services technologies and how to avoid software pitfalls by adhering to a number of deliberately simple architectural constraints.