What every programmer should know about design