skills needed to be a software engineer