Working through JavaScript: The Good Parts.