The boundaries of a service are well-defined when they are incorporated into a distributed application. Other services do not see the internal workings, implementation details, or resource representations of a service.
Services are autonomous
Service implementations are developed and evolve independently from one another.
Services share schema and contract, not classes
In service-oriented architectures, no single set of abstractions (classes) spans an entire application. Services share schemas (contracts) that define the structure of the information that they exchange, not information about their underlying type systems.
Policies determine service compatibility
Services interact with one another only after it has been determined – based on policy assertions – that they can meaningfully exchange information.
See: D. Box, Service-Oriented Architecture and Programming (SOAP)