¿Por qué algunos desarrolladores de software se llaman ingenieros de software?

Me llamo ingeniero porque es importante diferenciar entre “codificadores” e “ingenieros”. Hay docenas de “codificadores” o “programadores” en cada centro de desarrollo que saben cómo completar una determinada tarea de codificación pero no diseñan sistemas informáticos.

Por ejemplo, un ingeniero de software podría manejar una tarea como “desarrollar un sistema para realizar millones de encuestas en línea y almacenar los resultados en una base de datos. Luego, escribir algoritmos para correlacionar los datos y obtener información procesable de los resultados. Elija un backend tecnología que puede manejar la carga y generar redundancia para que ningún dato corra el riesgo de perder en una falla catastrófica “.

Mientras tanto, un codificador obtendría una tarea como “escribir las funciones necesarias de Node.JS para exponer los datos a través de una API REST”.

¿Ver la diferencia?

Creo que es importante recordar que usamos el término “ingeniero de software” debido al trabajo de Margaret Hamilton, quien inventó el término.

Ella tuvo una carrera notable. Fue directora y supervisora ​​de software y programación para el laboratorio Charles Stark Draper del MIT, y fue la diseñadora principal de software de vuelo Apollo. Entre otras cosas, fue pionera en el software asincrónico, la programación de prioridades, las pruebas de extremo a extremo, las pantallas de prioridad y el uso de humanos en el circuito para la toma de decisiones.

Vox publicó un gran artículo sobre el aniversario del aterrizaje del Apolo:
Conoce a Margaret Hamilton, la programadora de los años 60 que salvó el alunizaje
breve introducción: https://www.adafruit.com/blog/20
una entrevista reciente con ella: Margaret Hamilton, la ingeniera que llevó el Apolo a la luna

Fui al BU College of Engineering. Nuestros requisitos principales eran bastante diferentes de los graduados de CS de la Facultad de Artes y Ciencias. Entre otras cosas, aprendimos cosas como la lógica y la organización de la computadora que no son parte de un grado promedio de CS. Del mismo modo, había requisitos comunes de ENG como la mecánica y la teoría de circuitos que no son realmente específicos de la computadora. Por otro lado, omitimos cosas como la teoría de lenguajes de programación y un montón de cosas de matemáticas. Además de esas habilidades particulares (¡y soldar, eso fue divertido!) Aprendí sobre metodología y mentalidad de ingeniería general. Incluso me recordó, en una capacidad muy oficial, mi responsabilidad con la sociedad, por ejemplo, mantener un nivel mínimo de seguridad pública frente a los gerentes que ahorran dinero.

Obviamente, esta es una distinción muy centrada académicamente. ¿Y si no fueras a la escuela? Me gusta la respuesta que leí a continuación: “los ingenieros resuelven problemas; los desarrolladores construyen cosas”, pero es un poco circular. Los ingenieros de software generalmente resuelven problemas creando software. Los desarrolladores de software generalmente crean software para resolver algún tipo de problema. En el mundo del software, distinguiría subjetivamente a los programadores por su enfoque a la programación. Algunos desarrolladores están utilizando la tecnología como un medio para lograr un fin, y tienden a utilizar tantas soluciones preexistentes como sea posible para obtener una solución razonable en funcionamiento rápidamente. Otros pueden luchar por una solución “pura” o “limpia” que pueda usar bibliotecas preexistentes pero que no sacrifique el rendimiento o la integridad conceptual por tiempos de desarrollo rápidos.

No pretendo menospreciar al “desarrollador” que describí por primera vez, pero ciertamente me encuentro en el segundo campo, y me llamo a mí mismo un Ingeniero de Software, lo que resulta que se alinea con mi educación … eso fue a propósito.

“Ingeniero de software” es un título muy mal utilizado en mi opinión. En muchos países, existe un título de ingeniería acreditado y totalmente certificado en software, respaldado por los mismos organismos de la industria que otras disciplinas de ingeniería.

En términos más generales, un ingeniero de software aplica rigor de ingeniería, estándares profesionales y responsabilidad legal a los proyectos en los que trabaja.

Este es el resumen de la licenciatura que completé:

El Bachelor of Software Engineering es un título de ingeniería acreditado profesionalmente de cuatro años. Su objetivo es producir profesionales informáticos completos que sean capaces de trabajar dentro de equipos de ingeniería multidisciplinarios involucrados en el desarrollo de grandes sistemas complejos basados ​​en software.
Los estudiantes desarrollarán bases teóricas sólidas en programación, administración, sistemas, procesos de ingeniería de software y muchos otros aspectos de la informática y la ingeniería de software.

Las diferencias entre lo que estudié y lo que estudiaron la mayoría de las especialidades en informática fueron:

– Métricas de calidad y productividad del software
– Diseño de software y sistemas.
– Gestión de proyectos
– Riesgo, gestión de riesgos y mitigación (análisis en profundidad de Therac-25, Ariane 5 Cluster (nave espacial), etc.)
– Documentación de requisitos y diseños.
– Derecho de ingeniería
– Proyectos de todo el año en el mundo real con clientes de la industria como desarrolladores y gerentes, basándose en lo anterior. Contratos acordados y entregables, gestionó el desarrollo, prueba, entrega y aceptación de un proyecto de software de un año.

Los ingenieros de software (con títulos) pueden ser legalmente responsables de la misma manera que otros ingenieros son legalmente responsables de su trabajo. Esa es la diferencia.

En mi empresa, el software está diseñado y desarrollado.

La ingeniería de software abarca varias actividades importantes que definen el proceso de desarrollo de software, los objetivos del proyecto y cómo realizar un seguimiento de su progreso:

  1. Análisis de requerimientos. Cualquier proyecto debe haber definido cuáles deben ser los requisitos del sistema, tanto funcionales como de rendimiento. También necesita definir las restricciones que afectarán el proyecto, como políticas internas y externas, leyes, procedimientos de usuario, etc.
  2. Procesos de desarrollo. Utilizamos el Modelo de Madurez de Capacidades – Integración (CMM-I) del Instituto de Ingeniería de Software Carnegie Mellon para definir los procesos y políticas que estandarizan cómo trabajará el equipo en conjunto, qué herramientas se utilizarán, procedimientos de prueba, etc.
  3. Control de procesos. Establecimos reuniones semanales usando una metodología ágil para objetivos y tareas semanales, y seguimos el proceso de desarrollo y la velocidad de desarrollo.

Para el desarrollo de software real, trabajamos en las tareas para definir el diseño, la programación y las pruebas del software. Estas tareas incluyen:

  1. Arquitectura de software. Utilizamos herramientas como Enterprise Architect para definir la funcionalidad y estructura de la aplicación usando UML – Lenguaje de modelado unificado. Eso nos permite llevar a cabo software basado en modelos / ingeniería de sistemas (MBSE). Las funciones e interfaces se forman, lo que define las interfaces que los miembros del equipo deben usar.
  2. Diseño de software. Al comprender los requisitos, las interfaces, la entrada / salida de datos y las necesidades de rendimiento, los desarrolladores de software pueden comenzar a tomar decisiones de diseño, como el mejor lenguaje de programación, las estructuras de datos a utilizar, la necesidad de diferentes componentes como bases de datos, etc.
  3. Programación. Esta es la actividad que la mayoría de la gente piensa para el desarrollo de software. Para cualquier proyecto importante, el trabajo de ingeniería, arquitectura y diseño debía hacerse primero.
  4. Pruebas. Basado en la planificación de la prueba y en la vinculación con los requisitos y el diseño del software, los desarrolladores realizan pruebas unitarias y otros probadores realizan pruebas a gran escala de componentes y sistemas.

Habiendo estudiado tanto la ingeniería eléctrica como la informática, puedo decir que las ideas básicas detrás de la ingeniería de software y la ingeniería eléctrica no son muy diferentes en mi opinión.

La ingeniería eléctrica generalmente tiene dos propósitos: uno es la transmisión de energía a través de la electricidad y el otro es la transmisión de información a través de la electricidad. Muchos consideran que este último es el más interesante de los dos, y la última versión de la ingeniería eléctrica (procesamiento de información) no es realmente tan diferente a la ingeniería de software. Tomas una forma de información como entrada, le haces algunas cosas y la envías a algún lugar como salida. Eso es todo.

En ingeniería eléctrica, solía trabajar con la transformación de señales analógicas, como desde una antena hasta un tubo de rayos catódicos. Ahora diseña chips de computadora con lógica digital y proporciona una interfaz para usar ese chip para … hacer cosas. La ingeniería de software solo va un paso más allá, usted escribe programas que interactúan con la interfaz proporcionada por los chips de computadora, en lo que se conoce como una capa de abstracción. La ingeniería de software puede tener múltiples capas de abstracción, algunas muy “cercanas” a la máquina (código de ensamblaje) y otras que están a varias capas de abstracción (lenguajes de programación de alto nivel como Python). Todas las personas que trabajan en cada capa de abstracción son consideradas ingenieros, porque su función básica de trabajo es la misma: configurar algún tipo de proceso automatizado para transformar la entrada en salida.

El término “ingeniero” es en realidad bastante vago, generalmente se refiere a la aplicación de la ciencia o las matemáticas a fines prácticos. No creo que nadie tenga el monopolio del término.

El desarrollo de software puede o no ser ingeniería, depende del desarrollador (independientemente de su cargo). Como se dijo anteriormente, un desarrollador es “software de ingeniería” si está aplicando su ingenio junto con principios y técnicas derivadas de la informática y las matemáticas.

Los argumentos anteriores de que Computer Science no es una ciencia y, por lo tanto, no hay ingeniería de software, no son válidos. El desarrollo de técnicas de software es sin duda una ciencia que involucra hipótesis, experimentos y observaciones con máquinas de computación física. Es muy probable que un artículo publicado sobre innovación de software incluya una hipótesis, experimentos y observaciones. Hay áreas de la informática que son puramente matemáticas, como la teoría computacional (cálculo lambda, por ejemplo), pero estamos discutiendo las “aplicaciones” del software, por lo que hemos pasado de las matemáticas y los algoritmos a los sistemas reales y físicos. La visión de Alan Turing era desarrollar una máquina informática automática pero generalmente programable.

El software de ingeniería se hace extremadamente difícil por los rápidos avances en computadoras y redes. Para cuando desarrollamos principios y técnicas estándar, el mundo físico en el que se basaron esos principios y técnicas ha cambiado. Imagínese si la superficie de la Tierra cambiara tan rápidamente como las computadoras y las redes. ¿Cómo afectaría eso a los principios y técnicas de construcción de puentes?

Esto depende de dónde se encuentre en el mundo, pero como me acabo de graduar de la universidad con un título de ingeniería en Canadá, le daré la perspectiva canadiense:

En Canadá hay ingeniería de software! Lo tomas en la universidad como mecánica, eléctrica, química, etc. Algunas escuelas incluso tienen un primer año común, donde todas las disciplinas tienen los mismos cursos de primer año. Los programas de ingeniería de software deben estar acreditados y aún involucrar muchas matemáticas y ciencias al igual que cualquier otra disciplina de ingeniería. Graduarse con este programa le proporciona su anillo de hierro (una tradición de ingeniería canadiense) como cualquier otro programa de ingeniería.

En Canadá NO puede llamarse a sí mismo un “Ingeniero” sin esta educación formal. De hecho, en Canadá realmente necesita su P.Eng (licencia de Ingeniería Profesional) para usar el título “Ingeniero”. Antes de tu P.Eng eres un EIT (Ingeniero en Entrenamiento).

Cuando Microsoft presentó su programa MCSE (Microsoft Certified Systems Engineer), la asociación canadiense de ingenieros profesionales le dijo a Microsoft que no usara el término “ingeniero”, ya que sería técnicamente ilegal en Canadá.

La respuesta de Erin Rasmussen es correcta y precisa. Vale la pena leer el artículo que citó, Margaret Hamilton, la ingeniera que llevó el Apolo a la Luna. Como explica, Margaret Hamilton, programadora de computadoras de la NASA con un título en matemáticas, acuñó a propósito el término “ingeniero de software” a fines de la década de 1960 como parte de una campaña “para traer la legitimidad del software para que (y aquellos que lo construyen) recibir el debido respeto … ” La Sra. Hamilton continúa diciendo: “Cuando comencé a usar esta frase, me pareció bastante divertida. Fue una broma continua durante mucho tiempo”.

No estoy de acuerdo con la mayoría de las otras respuestas que he leído aquí, y no solo por el hecho histórico mencionado anteriormente. Creo que la mayoría de las respuestas a esta pregunta (y preguntas similares) son de ingenieros de software. En general, suenan a especulación o justificación post hoc. Algunas respuestas suenan sorprendentemente defensivas, y honestamente no entiendo la razón del vitriolo. ¿Tal vez hubo alguna rivalidad entre los departamentos de la universidad que me perdí?

Mi experiencia puede ser diferente a la de la mayoría de la gente: tengo dos maestrías: una en ingeniería y otra en informática. Pasé años trabajando como ingeniero, y más tarde, incluso más años trabajando como ingeniero de software. Si bien las diferentes ramas de la ingeniería (por ejemplo, ingeniería mecánica e ingeniería química) requieren cursos de estudio bastante similares para un título, los programas de informática se superponen muy poco con los programas de ingeniería. Creo que los campos de estudio son muy diferentes porque los requisitos y la práctica profesional de la ingeniería de software son muy diferentes de los de la ingeniería. No estoy insinuando que un campo es más difícil o más valioso que otro, solo que son diferentes.

Algunas respuestas, como la respuesta de Brian Bi, han postulado que se debe a que la ingeniería de software es de alguna manera análoga a otros tipos de ingeniería. Para mí, eso suena como un razonamiento mal extendido. Los ingenieros usan las matemáticas y las ciencias para resolver problemas. Los ingenieros de software pueden usar las matemáticas, pero generalmente no usan las ciencias naturales o físicas. Confiar en analogías entre, digamos, estructuras de datos (por ejemplo, listas enlazadas) utilizadas en ingeniería de software y estructuras físicas (por ejemplo, vigas I) utilizadas en ingeniería estructural suena como una admisión bastante clara de que los campos realmente no son similares en absoluto. También se podría argumentar que los novelistas son como ingenieros de software porque ambos construyen obras escritas complejas a partir de series de enunciados regidos por reglas gramaticales, o que la música es como la ingeniería de software porque ambos campos tienen bases matemáticas y la música se basa en medidas y versos de manera análoga a la forma en que el software se construye a partir de declaraciones y funciones.

Muchas respuestas, como la respuesta de Kyle Howard a ¿Por qué algunos desarrolladores de software se autodenominan ingenieros de software ?, hacen un argumento en la línea de “los ingenieros de software diseñan sistemas mientras que los programadores simplemente escriben código”. Puede ser interesante discutir las distinciones que a veces se hacen entre ciencias de la computación, programación de computadoras e ingeniería de software, pero creo que usualmente describen diferentes partes de un trabajo más de lo que describen diferentes profesiones. La mayoría de las personas que se llaman a sí mismas por cualquiera de esos títulos hacen los tres. Estas respuestas realmente describen las diferencias entre ingenieros junior e ingenieros senior, no entre ingenieros de software y cualquier otro trabajo.

Algunas personas han señalado que los departamentos de informática generalmente son parte de los departamentos de ingeniería, no departamentos de ciencias. Este no siempre ha sido el caso: el departamento de Stanford CS (para elegir un ejemplo) comenzó como parte del departamento de matemáticas. En las décadas de 1960 y 1970, muchos departamentos de informática se trasladaron de las facultades de ciencias a las facultades de ingeniería. Las razones profesadas a menudo eran algo así como alinear correctamente la misión educativa del departamento con su universidad o los fundamentos filosóficos de sus campos, pero siempre pensé que parecían inventadas por y para comités directivos académicos. Me preguntaba si los departamentos de informática habían sido anexados por ingeniería cuando CS comenzó a atraer más fondos. Hace poco conocí a un hombre que había ayudado a su departamento de CS a hacer ese movimiento, y él me dijo que tenía toda la razón: dijo que su departamento inició el movimiento porque pensaban que podrían recaudar más fondos si estuvieran asociados con el Colegio de Ingeniería de lo que podrían como parte de la Facultad de Ciencias.

Así que ahí lo tienes: como muchos otros han concluido, se trata de dinero. 🙂

Un programador no es necesariamente un ingeniero de software, al igual que el tipo que clava clavos en 2×4 para construir una casa es un arquitecto.

Después de 20 años en la industria, finalmente estoy de acuerdo con que la gente me llame ingeniero de software, o incluso a veces arquitecto de software. Estoy de acuerdo en que estos términos se usan demasiado libremente, pero a veces los términos son realmente precisos.

Ingenieros y arquitectos diseñan sistemas . No importa qué disciplina, ya sea un puente, un arma de fuego, un microchip o algún tipo de sistema de automatización de software. También pueden mover un martillo, girar una llave inglesa o escribir un código, pero la disciplina que describe el título es resolver problemas complejos y difíciles, y luego diseñar sistemas para simplificarlos. A menudo no escriben la mayor parte del código, o martillan la mayoría de las uñas, según sea el caso, en esos sistemas. Toman un problema, se aseguran de que esté lo suficientemente definido como para ser solucionable, y luego lo resuelven y crean un sistema que permite a un lego resolverlo fácilmente por sí mismos.

Cruzar un río, matar a un depredador que es más grande que tú, hacer una computadora más rápida o hacer que esa computadora haga comparaciones complejas en un conjunto de datos de millones de cosas, todas son complejas y difíciles de hacer con tus propias manos, y encontrar un La manera de hacer esas cosas simples para cualquiera es la ingeniería.

La ingeniería de software es demasiado joven y, por lo tanto, está menos evolucionada que otras ramas de la ingeniería.

La ingeniería básicamente está tomando la ciencia y creando aplicaciones prácticas de esa ciencia. Hay varias ramas de la ingeniería que han evolucionado de forma independiente. Casi todas las ramas de la ingeniería comenzaron con un grupo de personas que estudiaban ciencias y descubrían cómo resolver un problema. Cuando comienza una nueva rama de la ingeniería, casi nadie sabe si lo que están haciendo es correcto. Solo después de hacer algunas cosas, puede comenzar a descubrir la metodología, también conocida como la mejor manera de hacer ingeniería. Una vez que comience a construir la metodología, puede comenzar a estandarizar las herramientas. Después de estandarizar las herramientas y las metodologías, puede comenzar a capacitar a ingenieros en los conjuntos de herramientas estándar y luego encontrar formas de mejorar el conjunto de herramientas. La ingeniería civil ha llegado a este punto porque la gente ha estado haciendo ingeniería civil durante, no sé, al menos 3000 años. La ingeniería mecánica surgió de la necesidad de construir fábricas, y realmente comenzó con la llegada de la máquina de vapor en el siglo XVIII. Entonces, tiene un poco menos de 300 años. La ingeniería química y eléctrica surgió de la ingeniería mecánica y adoptó muchos principios que se desarrollaron como parte de la ingeniería mecánica.

El desarrollo de software, OTH, ni siquiera era una profesión hace 50 años. Sí, las personas desarrollaron software, pero en los primeros días, las personas que desarrollaron software realmente tenían otro día de trabajo. Crearon software para hacer que la computadora haga algunas de sus tareas por ellos. El desarrollo de software es lo que hicieron los ingenieros y científicos para facilitar su trabajo real. La idea de que una persona pueda ganarse la vida simplemente sabiendo cómo programar la computadora es bastante nueva. La idea de que una persona pase por la universidad aprendiendo a programar una computadora (y poco más que cualquier otra cosa) y luego salga a hacer algo útil también es bastante nueva. Las universidades no tenían la ingeniería de software como disciplina hasta hace muy poco.

Entonces, hay 2 preguntas
a) ¿Por qué tratar el desarrollo de software como una profesión? ¿Por qué no solo enseñar a cada ingeniero y científico cómo desarrollar programas? ¿No es realmente el software una herramienta que te ayuda a hacer cosas como el cálculo? Enseñamos cálculo a todos los ingenieros / científicos. ¿Por qué no enseñamos programación a todos los que la necesitan?
b) ¿Por qué tratar el desarrollo de software como una rama separada de la ingeniería? ¿Por qué no se considera un trabajo especializado como soldar o coser? ¡¿Derecho?! ¿Qué es la ingeniería al respecto?

La respuesta a estas 2 preguntas se deriva de las cosas que hemos aprendido como científicos e ingenieros a lo largo de los años.
a) No todos los científicos / ingenieros son buenos desarrolladores de software. Debes aprender muchas cosas antes de convertirte en un buen desarrollador. Escribir código es fácil. Escribir código que sea mantenible, flexible y funcione bien es difícil. Necesitas entender muchos principios. Enseñar a cada científico / ingeniero esos principios los quita de su trabajo diario
b) Hay muchas aplicaciones comerciales de software que no requieren conocimientos de ciencia / ingeniería. O en otras palabras, no tienes que ser un científico espacial para hacer Twitter. Tener solo científicos / ingenieros sabe cómo hacer que el software sea excesivo
c) El desarrollo de software se beneficia de la “mentalidad de ingeniería”. Por lo tanto, es beneficioso capacitar a los desarrolladores de software con el mismo rigor que capacitamos a otros ingenieros.

Déjame calificar el último punto porque es el más importante. La forma en que la mayoría de las ramas establecidas del trabajo de ingeniería es que el ingeniero está capacitado en un conjunto de herramientas y metodologías que pueden resolver una clase particular de problemas. Cuando surge un problema en esa clase de problemas, obtienes al ingeniero, y él / ella básicamente mira el problema, selecciona la herramienta / metodología correcta y luego diseña la solución usando la herramienta / metodología. Esto es lo que yo llamo una “mentalidad de ingeniería”: encuentre la mejor herramienta para el trabajo y aplíquela

Bueno, resulta que esto es exactamente lo que queremos que hagan los desarrolladores de software. Sin embargo, el problema es que aún no hemos inventado todas las herramientas. Los desarrolladores de software son ingenieros con la mitad de un conjunto de herramientas. Entonces, lo que sucede es que con nuevos problemas, inventamos nuevas herramientas. El problema de almacenar datos de manera confiable es lo que condujo a la invención de RDBMS. Sin embargo, los desarrolladores que estaban creando aplicaciones antes de que se construyera RDBMS no tenían RDBMS en su conjunto de herramientas. Entonces, se les ocurrieron implementaciones de almacenamiento de datos a medias. Durante este proceso de evaluar a medias nuestras bases de datos, descubrimos lo que queríamos de nuestro RDBMS, y luego creamos RDBMS. Finalmente, RDBMS se convirtió en una parte estándar del conjunto de herramientas de cada ingeniero de software

Esto es lo que hace que el desarrollo de software sea “ingeniería”. Aún no está allí. Pero, el impulso es encontrar herramientas y metodologías estándar. Seguimos probando cosas nuevas y nuevas metodologías, y nuestro conjunto de herramientas estará completo. En mi opinión, tenemos al menos media década más por delante. En última instancia, queremos llegar a un punto en el que la mentalidad de “no hecho aquí” desaparezca. Tienes un problema, llamas a un ingeniero de software. El ingeniero de software dice: – Coloque esta base de datos de este tamaño allí, coloque un servidor de aplicaciones de ese tamaño allí, coloque este tipo de motor de análisis para generar sus informes. Esto es lo que debe hacer para proteger su aplicación. Así es como se planifica el crecimiento “¡Boom! ¡Vamos! Obtienes un grupo de técnicos que ponen todo junto.

Técnicamente, ya estamos tan cerca de esto. Para la mayoría de las aplicaciones web, no es necesario reinventar la rueda. Existen muchas herramientas que se pueden combinar para crear la mayoría de las aplicaciones web. El problema es que esperamos que los “ingenieros” realmente construyan la cosa. Esto significa que necesitamos un ejército de ingenieros … y los ingenieros son costosos.

Lo que tenemos que hacer es encontrar una forma de capacitar a técnicos de software más baratos sin hacerlos pasar por 6 años de escuela de ingeniería, y capacitar a las personas que sí pasan por 6 años de escuela de ingeniería en mejores ingenieros. Los ingenieros deben ser planificadores, no hacedores. El problema en la ingeniería de software es que estamos entrenando a muchos hacedores, y no a muchos planificadores.

Gracias por el A2A. En los viejos tiempos anteriores a Google, el título de “Ingeniero de software” estaba reservado principalmente para los programadores de firmware y sistemas, es decir, desarrolladores más cercanos al hardware, mientras que el “Programador-Analista” (que luego se convirtió en “desarrollador” como SE) era común en las empresas TI, es decir, departamentos de TI de compañías no técnicas como bancos y compañías de seguros, junto con toda la Gran Cadena Alimentaria de Consultoría de TI (proveedores de soluciones, etc.) que lo atiende.

TI es claramente diferente de la contabilidad de ingeniería: un “centro de costos” frente a un “generador de ingresos”. Eso impulsa el tratamiento de los ingenieros y debería explicar la drástica diferencia salarial entre Google y los departamentos de TI subcontratados. TI es un gasto para cortar, cortando a los programadores que respiran aire de personas importantes (banqueros, corredores, gerentes, etc.), ya sea que la ingeniería (en una empresa de ingeniería) sea esa actividad importante en sí misma.

¿Cómo encajan IBM, Oracle y el resto de la Gran Cadena Alimentaria de Consultoría de TI (proveedores de soluciones, tiendas de desarrollo offshore, etc.) en esta imagen? Técnicamente son empresas de ingeniería, pero dado que se especializan en la misma automatización empresarial que se encuentra en los departamentos de TI a los que sirven, y existe una circulación de personas entre esos proveedores y departamentos de TI, la misma actitud de gestión de TI (irrespetuosa) hacia los ingenieros se importó de TI .

Sin mencionar que TI (industria de tecnología empresarial) hace frente a la tasa de falla del 70–90%. A diferencia de Google y otras verdaderas empresas de ingeniería, que venden sus productos y servicios, todos los proveedores de TI ganan dinero en horas hombre, independientemente del éxito del proyecto. Por lo tanto, emplean “cuerpos” para registrar las horas. Esta explicación simplificada será suficiente por ahora. No quiero escribir otra novela sobre la contratación de atracones y monos codificados. La conclusión es: ¿el más grande y más grande: Oracle o Salesforce pagan $ 400K de Google a los desarrolladores senior? Yo descanso mi caso.

Google y Amazon también tienen departamentos de TI: responsables de comprar contabilidad y otro software, que una compañía científica de tecnología de consumo como ellos nunca se rebajará a desarrollar.

Una vez trabajé en una empresa (una corporación Fortune 100), que tenía los departamentos de TI e Ingeniería en el mismo piso. Hubiera sido cómico, si no fuera tan malo. De 2 a 3 personas de usted saben dónde se apiñan en un único cubículo previamente “personal” en el lado de TI y oficinas espaciosas, muebles elegantes, muchas plantas y el resto de detalles explícitos de “nos importa” en la mitad del piso de Ingeniería. Como dos mundos diferentes. Escribo sobre esas atrocidades en mi blog Medium, si tienes curiosidad.

La ingeniería en software es un poco gris. Parte de lo que hacen algunos desarrolladores de software tiene mucho en común con otras disciplinas de ingeniería.

Al escribir aplicaciones críticas para el rendimiento, por ejemplo, los ingenieros de software deben tener en cuenta varios aspectos de la máquina de computación física para lograr mejores resultados. Cuántos ciclos toman varias operaciones, cómo organizar los datos para reducir las pérdidas de caché, cómo asignar la memoria de manera eficiente; todos estos problemas se basan en el funcionamiento real de la máquina. Al optimizar, los resultados, en términos de eficiencia, son medibles y comparables. Este tipo de trabajo tiene mucho en común con otras disciplinas de ingeniería.

Pero eso no es todo lo que hace un desarrollador de software, y algunos desarrolladores de software nunca necesitan hacer este tipo de trabajo. En muchas situaciones / áreas de desarrollo, el hardware es suficientemente potente en comparación con la aplicación que están desarrollando que pueden ignorar el hardware y simplemente enfocarse en obtener lo que sea que funcione. Esto tiene menos en común con las disciplinas de ingeniería tradicionales.

Entonces, por esa razón, sospecho si el término “ingeniero de software” es válido o no en comparación con otras disciplinas de ingeniería continuará siendo debatido.

En la práctica, “ingeniero de software” generalmente se refiere a alguien capaz de tomar un problema del mundo real y diseñar e implementar una solución de software. Si bien casi todos los ingenieros de software son programadores, no todos los programadores son necesariamente capaces de hacer lo que se espera que un ingeniero de software pueda hacer. El título se diferencia de los programadores aficionados de hackeo y los codificadores que han aprendido a realizar tareas de programación específicas, pero que no son necesariamente capaces de tomar ningún problema genérico y crear una solución de software.

En mi localidad, bajo el grupo de ingeniería eléctrica, una de las especializaciones que ofrecen las universidades son las computadoras. El SDLC (piense en “Mythical Man Month”, el clásico de desarrollo de software de alto nivel) está cubierto por un curso de ingeniería de software. En el trabajo, tal persona nunca puede exponerse a una gran variedad de trabajos cercanos al metal desnudo. Entonces, mientras se describen a sí mismos, generalizan al ingeniero de software.

Sin embargo, veo su punto, solo un curso con pocos créditos es mucho menos que la especialización completa, por lo que el título de ingeniero de software es elástico. Pero cuando los reclutadores buscan conocimiento de CMMI, Libro de conocimiento de gestión de proyectos de software, etc., mientras escanean cantidades masivas de currículums, es la forma en que las cosas entrenan.

Otras nociones relacionadas con la designación son:

Codificador de software: o codemonkey, que revisa la corrección gramatical después de copiar el pegado de la documentación oficial o el stackoverflow para hacer ajustes para adaptarse adecuadamente al problema en cuestión.

Probador de software: revisa el trabajo de codemonkey en busca de ajustes faltantes.

Desarrollador de software: una persona ágil de pila completa que comenzó a dominar uno de los otros roles, pero a medida que los proyectos se distribuyen geográficamente, ha adquirido cierta experiencia para cubrir el puesto vacante para los otros roles.

Programador de software: finalizará el estilo de codificación para linting, identificadores, decidirá entre switch..case, operador ternario, if..then, etc. para aumentar la legibilidad para hacer comentarios concisos, es decir, en las líneas de un programador que decide cómo escribir a ROM de acuerdo con el IC insertado.

Arquitecto de software: identificará bloques de código obligatorios para las pruebas de compilación de depuración, codificación, implementación / integración continua, pero apenas realizará ninguna codificación manual real.

Deje que el entrenador del término “ingeniero de software” le muestre qué es un ingeniero de software, Margaret Hamilton, diseñadora principal de software de vuelo de Apollo.


Puede verificar cómo su trabajo en Ingeniería de Software evitó el aborto del alunizaje del Apolo 11.

Y puede verificar su área de especialización y ver si es otro ingeniero que no sea ingeniero de software.

Sus áreas de especialización incluyen diseño de sistemas y desarrollo de software, modelado empresarial y de procesos, paradigma de desarrollo, lenguajes formales de modelado de sistemas, objetos orientados al sistema para modelado y desarrollo de sistemas, entornos de ciclo de vida automatizado, métodos para maximizar la confiabilidad y reutilización de software, análisis de dominio , corrección por las propiedades del lenguaje incorporado, técnicas de arquitectura abierta para sistemas robustos, automatización completa del ciclo de vida, aseguramiento de la calidad, integración perfecta, detección de errores y técnicas de recuperación, sistemas de interfaz hombre / máquina, sistemas operativos, pruebas de extremo a extremo técnicas y técnicas de gestión del ciclo de vida.

Margaret Hamilton (científica)

Entonces. Para responder a su pregunta, eso se debe a que un ingeniero químico / mecánico / eléctrico / lo que sea no es el tipo de ingeniería que escribe el software que aterriza un módulo lunar, es un ingeniero de software.

Son ingenieros de software que diseñan Quora, Wikipedia, Facebook, Android, Windows, Linux y muchas cosas ubicuas a su alrededor. ¿Te has cagado hoy? Bueno, ese inodoro seguramente fue diseñado en un software creado y mantenido por ingenieros de software.

Porque ellos son ingenieros.

Algún tipo al azar que aprendió por sí mismo PHP y sabe cómo hacer un complemento de WordPress y usar un marco para construir un sitio web de folleto con un formulario de contacto, realmente no puede titularse ingeniero.

Por otro lado, un chico con un título en ciencias de la computación y conocimientos para diseñar software, construir, escalar, probar y mantener software utilizando cualquier lenguaje de programación, puede decir “Soy un ingeniero”.

Por supuesto, este no es siempre el caso, porque los desarrolladores autodidactas pueden ser mucho mejores. Por lo general, es como comparar un trabajador de la construcción y un arquitecto. Otra cosa es que para ser un ingeniero de software de pleno derecho, uno necesita trabajar con proyectos de calidad durante al menos unos años después de un título de la misma manera que lo hacen los arquitectos, médicos y otros ingenieros.

El trabajo de desarrollo de software de alto nivel es realmente muy similar a la ingeniería, en mi humilde opinión. Veamos qué dice Wikipedia sobre ingeniería:

Un ingeniero es un profesional profesional de la ingeniería, preocupado por la aplicación de los conocimientos científicos, las matemáticas y el ingenio para desarrollar soluciones para problemas técnicos, sociales y comerciales. Los ingenieros diseñan materiales, estructuras y sistemas mientras consideran las limitaciones impuestas por la practicidad, la regulación, la seguridad y el costo. [1] [2] La palabra ingeniero se deriva de las raíces latinas ingeniare (“inventar, idear”) e ingenium (“inteligencia”). [3] [4]
El trabajo de los ingenieros forma el vínculo entre los descubrimientos científicos y sus aplicaciones posteriores a las necesidades humanas y la calidad de vida. [1]

¿El conocimiento científico? ¿Matemáticas? Cheque. (es decir, informática)
¿Ingenio? Cheque.
¿Desarrollar soluciones para problemas técnicos, sociales y comerciales? Cheque.
Sistemas de diseño? Cheque.
¿Considerar las limitaciones impuestas por la practicidad, la regulación, la seguridad y el costo? Cheque.
¿Vincular descubrimientos científicos con aplicaciones? Cheque.

He visto a muchas personas argumentar que la ingeniería de software no es ingeniería y todos sus argumentos me parecen ad hoc y poco convincentes.

Editar: Entonces, varias personas han señalado que la informática no es una ciencia real. Estoy de acuerdo en que la informática no es una ciencia real, pero sostengo que no se puede ver el bosque desde los árboles.

La informática no es una ciencia real solo porque lo que investiga no es el mundo natural, sino una combinación de lógica matemática y el fenómeno artificial de la tecnología informática. Sin embargo, la ingeniería de software tiene la misma relación con la informática que la ingeniería química con la química o la ingeniería eléctrica con la electrodinámica. Es decir, mientras que la química y la electrodinámica son cuerpos de conocimiento preciso y técnico que nos permiten predecir con precisión el comportamiento de los sistemas químicos y eléctricos (un ingrediente necesario para construir tales sistemas para resolver problemas particulares), la informática, al menos para alguna definición de El término nos permite hacer lo mismo con el software.

Permítanme tratar de resumir por qué prefiero llamarme ingeniero de software en lugar de desarrollador de software:

  • Yo resuelvo problemas. Algunos problemas no necesitan ningún desarrollo.
  • Entiendo más que solo cómo codificar para el éxito. Ni siquiera tengo algunos buenos ejemplos de eso. Desafío a las personas, me esfuerzo por la calidad, hago pruebas de rendimiento por diversión, sigo entendiendo las cosas ya resueltas, solo porque podrían resolverse mejor.
  • La ingeniería tiene un sabor a ciencia. No solo dices oh Node.js rocks. Prototipo 3 pilas y muestra cómo se comparan en bastantes dimensiones. Será mejor que sean mejores en algunos aspectos y peores en otros. Luego eliges tu compensación. Alguna objetividad, así como algo de espíritu, tiene que estar en esa decisión. Conviértalo en un espíritu de equipo debatiendo en el equipo y luego haciendo una llamada votando.

En resumen, algunos sienten que tal etiqueta les da credibilidad, legitimidad y los hace sonar más serios. Pero esta es una etiqueta tonta.

Cuando se le pidió a David Parnas (que trabaja en software de misión crítica) que ejecutara el curso de ingeniería de software en su universidad, no pudo resolver qué era. Cuando un graduado de ingeniería eléctrica recurrió al software, pensó que lo que hacía como profesional del software tenía poco que ver con la ingeniería.

Ingeniería mapea un diseño en recursos físicos. En informática, expresamos algoritmos independientes de los recursos, pero tenemos algunos recursos como el espacio (cuántos bits requiere un estado del sistema) y el tiempo de CPU. Realmente, el único recurso que nos preocupa es el tiempo: nos gustaría que nuestros cálculos se completen antes del final del universo, tal vez antes.

Por lo tanto, no estamos tan preocupados por las características físicas de un recurso como los ingenieros reales.

Algunas prácticas de proyectos de ingeniería son aplicables, pero muchas no lo son.

Es un argumento abierto, pero en general los profesionales del software no deberían llamarse ingenieros, son disciplinas muy diferentes. De hecho, el software realmente es solo un diseño abstracto. Una vez que se realiza el diseño, el compilador realiza la ingeniería de diferentes recursos físicos (arquitecturas del sistema). Por lo tanto, realmente no hacemos ingeniería.

http://se.ethz.ch/~meyer/publica

Hasta cierto punto, esto es una cuestión de preferencia del personal porque si usted es SWDev o SWEeng, prácticamente hace lo mismo todos los días.

Tiende a ver a un ingeniero de software en empresas de ingeniería (el producto es un sistema compuesto por software más hardware) o en firmas de desarrollo de software puro (a diferencia de las firmas que escriben software personalizado que solo se usa internamente).

Nunca he trabajado para una firma S / W pura, pero trabajé en telecomunicaciones durante varios años hasta 2008, por lo que el resto de lo que digo es principalmente sobre ingeniería de software en una gran empresa de ingeniería de telecomunicaciones.

Con frecuencia, un ingeniero de software que trabaja en Telecom sería parte de un equipo de ingeniería que comprende experiencia en hardware, software y firmware. Entonces, un subconjunto de la funcionalidad requerida se implementa en los circuitos y el resto es software / firmware incorporado.

Esto implica que la persona de software podría necesitar leer esquemas y comprender mucho sobre cómo funciona el hardware (FPGA o IC). También puede haber controladores de software que necesiten configurar el hardware (cargar el FPGA o los registros del programa que controlan la funcionalidad de IC) o controladores necesarios para mover los datos (mantener el FPGA alimentado con nuevos datos).

Gran parte de esta funcionalidad podría implementarse en hardware o software, pero debido a varias compensaciones de costos, requisitos de programación o la necesidad de que el software a prueba del futuro haya asumido gran parte de este trabajo. Por supuesto, los FPGA (algunos incluso con núcleos de CPU) desdibujan totalmente la línea entre los ingenieros de software y hardware y, por lo tanto, es ventajoso que el diseñador pueda trabajar en ambos ámbitos.

More Interesting

Ingenieros de software: ¿Cómo deshacerse de la visión del túnel cuando se programa?

He oído hablar de desarrolladores de software que ganan 300-500 $ k. Soy un principiante relativo en el campo, todavía no he arañado 100k. ¿Cómo llegas a esas sumas? ¿Qué conocimientos / calificaciones pueden llevarte allí?

¿Me puede dar un ejemplo específico de lo que hace su equipo de desarrollo de software y cuál es su función?

¿Por qué algunos programadores informáticos desarrollan un software sorprendente o nuevos conceptos, mientras que otros están atascados con el trabajo de programación básica?

Como desarrollador de software, ¿es un problema si veo la programación como un trabajo más?

Cómo definir una obra maestra en el desarrollo de software

¿Hay una comunidad de desarrolladores de habla inglesa en Italia?

Como desarrollador de software mal pagado; ¿Debo esperar para mudarme de mi trabajo actual (primer trabajo)?

¿Puede un probador manual convertirse en desarrollador de software si tiene buenos conocimientos de programación?

¿Cuál es el área más grande en el desarrollo de software?

¿Puede un recién graduado de ingeniería mecánica administrar un rol de desarrollador de software?

¿Quién es el desarrollador de software más importante del mundo y por qué?

Trabajo como analista financiero para un banco. Estoy interesado en hacer un cambio de carrera y convertirme en desarrollador de software. Si me enseño a codificar con cursos en línea, ¿cuánto tiempo hasta que una empresa de tecnología pueda emplearme como desarrollador?

Si un desarrollador de software puede desarrollar fácilmente un sitio web o una aplicación, ¿por qué no desarrollan un sitio web como Alibaba o una aplicación como Uber? ¿Por qué trabajan para una empresa?

Los reclutadores técnicos y los gerentes de contratación de software me llaman entusiasmado con mi currículum, pero cuelgan desilusionado y me dicen que no encajo bien. Me temo que soy un mal programador, pero paso 24/7 trabajando y estudiando software. ¿Qué estoy haciendo mal?