What Every Programmer Should Know About Object-Oriented Design