This document discusses key aspects of dependability engineering including: achieving dependability through fault avoidance, detection, and tolerance; using redundancy and diversity; the importance of well-defined, repeatable processes; and guidelines for dependable programming such as checking inputs, handling exceptions, avoiding error-prone constructs, and including timeouts. Critical systems often have high dependability requirements and their development must convince regulators that the system is dependable, safe, and secure.