The multiplicity of the design space constantly confuses apprentice designers. Given a software design problem, what’s a good solution to it? Events? Objects? Observers? Callbacks? Virtuals? Templates?… The most important difference between an expert software architect and a beginner is the knowledge of what works and what doesn’t.

Andrei Alexandrescu