Services in a SOA should be independent and self-contained so that changes to one service do not impact others. Each service should define its own operations, data types, and responses. Services should publish their descriptions to a shared directory and be able to communicate asynchronously and reliably with each other through standard platform-independent messages to ensure requests reach the correct destination and secure responses are obtained.