senior software developer job description