A set of rules and tools for building software applications which specify how software components should interact.