What Does it Take to Become a Great Software Engineer?