This document provides hints for designing successful computer systems based on the author's experience designing and studying various systems. Some key hints discussed are: (1) Keep interfaces and abstractions simple by doing one thing well and avoiding unnecessary generalizations, (2) Separate normal and worst-case functionality to improve performance for common cases, and (3) Make actions atomic and use logging to update state to improve fault tolerance and reliability. The hints are illustrated with examples ranging from hardware to operating systems to applications.