A practical definition of good software architecture: change-friendly, testable, maintainable, and useful to the team.