Principles of Computer System Design: An Introduction