how to grow as a software engineer