Extreme Software Engineering: A Hands-On Approach