Abstraction - is the code organization such that you can think about it in terms of the real world system it models. Is the important logic of that system expressed in the code or held in your head?...
Is your code Cohesive? Are things that belong together close to each other? Does every (or most) methods in a class use every (or most) attributes...
Do one thing and do it well, be extensible without changing existing code, don't break your parent class's contracts, make fine grained interfaces specific to clients needs, avoid dependencies by relying on abstractions...