This document discusses techniques for engineering dependable software systems. It covers topics like redundancy and diversity, dependable processes, and dependable system architectures. Redundancy and diversity are fundamental approaches to achieving fault tolerance. Dependable processes use well-defined and repeatable development practices to minimize faults. Dependable system architectures, like protection systems and self-monitoring architectures, are designed to tolerate faults through techniques such as voting across redundant or diverse versions of the system.