Principles of good software specification and their implications for specification languages | Synapse