We consider Performance Engineering (PE) as a structured, iterative process for code optimization and parallelization. The key ingredient is a performance model which provides insights into the interaction between the code and the hardware. The model identifies the actual performance-limiting factors (“bottlenecks”), allowing for a selection of appropriate code changes. Once the impact of the code changes is validated the process restarts with a new bottleneck identified by the performance model. Since this model-based approach provides a thorough understanding of the impact of hardware features on code performance it is also useful in various other areas such as performance reproducibility, performance prediction for future architectures or education and training. The talk will introduce the basic PE concepts, survey basic performance models and present selected use cases of PE including work performed in the DFG Priority programm "Software for Exascale Computing".