This document discusses several basic design principles and smells: - A class should have a single responsibility and minimize access to its data. - Inheritance should represent an "is-a" relationship, not be used for implementation convenience. - Methods should not expose implementation details and overuse of conversions should be avoided. - Missing information should be handled gracefully rather than raising errors. - Nil values should be avoided by returning empty collections instead. - Objects rather than strings or tuples should be used to represent data. - The tell-don't-ask principle of using polymorphism rather than conditionals on types should be followed. - Encapsulation should be maintained by not overusing accessors and