This paper focuses on the theory and techniques used to develop SMP systems. To begin, we define SMP and discuss recent developments in SMP hardware. Next, we explore the benefits of SMP, such as higher density and lower cost per MIPS. Then, we examine how to choose and design software that can take full advantage of SMP hardware. And last, we review a study that demonstrates how system tracing techniques can uncover hidden bottlenecks and resource contention in an SMP system, allowing developers to achieve maximal performance and concurrency.