Carey Aydelotte tiene la idea básica correcta, pero quiero aportar mis dos centavos. Vale, quizá más bien diez. Lo que sea. No estoy "en todo el asunto de la brevedad" hoy. 🙂
Los extremos delanteros vs. los extremos traseros son un "eje" de la programación, en el que mis definiciones de esos términos se alinean más o menos con la de ella. "Ingeniero de software" es simplemente uno de los muchos títulos de trabajo que pueden o no estar a lo largo de otro eje, en comparación con otros títulos como "desarrollador de software", "programador", "codificador", y así sucesivamente.
El "puede o no" es porque hay muy poca definición de las diferencias entre los títulos, excepto en algunos lugares que requieren certificaciones con el fin de utilizar la palabra "ingeniero". Así, algunas empresas simplemente llaman a todos sus productores de código por un título de este tipo, mientras que algunas tienen una progresión de lo que consideran un título más "bajo" a títulos más "exaltados", algunas dejan que la gente elija sus propios títulos (pero tal vez tienen algunos prefijados como "Junior" y "Senior"), etc.
Así que a menudo puede ver estos ejes (y más, como el idioma, la industria, etc.) mezclados. Por ejemplo, puedes ver a personas con títulos como "Desarrollador de Rails Financiero Back-End", "Ingeniero de Software de Criptografía Elm Front-End", "Pounder de Teclado Aleatorio General de JavaScript Full-Stack", etc. etc. etc.
Dicho esto, normalmente he escuchado "ingeniero de software" para referirse a personas que están bien en sus carreras, equilibrando compensaciones a largo plazo, teniendo mucho más deber sobre la calidad del software, y el negocio en sí. Más allá de eso, su papel podría ser principalmente o exclusivamente en un extremo o el otro, o "pila completa" (ambos extremos), o fluctuante.