In this paper, we first provide an overview of assertions and assertion checking in traditional and object oriented software. We discuss an important aspect of assertions for object oriented systems, their interrelationship with the underlying type system of the implementation language and the use of covariance and contravariance to relax the rules for overriding methods. An important aspect of assertions is to determine when they are valid and we describe a variation of assertions, temporal invariants, that use temporal operators to augment traditional class assertions. Finally, we present our view of the prospects of assertion directed programming in addressing the software quality issue.