Designing High-Performance Distributed Applications Using Software Performance Engineering: A Tutorial