Trabajo con alguien que insiste en que cualquier buen ingeniero de software puede desarrollar cualquier tecnología de software, y la experiencia en una tecnología en particular no importa para construir un buen software. Su analogía fue que no es necesario tener conocimiento del producto que se está construyendo para saber cómo construir una línea de ensamblaje que fabrique dicho producto.
En cierto modo, es un cumplido ser visto con un ojo tal que "si eres bueno, eres bueno en todo", pero de alguna manera también trivializa la profesión, como en "Codemonkey, vaya código de honda". Sin experiencia en ciertos marcos de software, puede meterse en problemas rápidamente, y eso es importante.
Traté de explicar esto, pero él no lo compró. ¿Alguna opinión o pensamiento diferente sobre esto para ayudar a explicar que mi experiencia en una cosa no se traduce en todas las cosas?
fuente
Respuestas:
Yo diría todo lo contrario. Un buen ingeniero de software tendría la capacidad de conceptualizar, diseñar y diseñar software de calidad independiente de la tecnología. El extremo opuesto de este espectro es la "clave de código" de .NET o Java o PHP que es buena para recibir instrucciones o especificaciones y utilizar la herramienta para implementar el software.
Un ingeniero de software no necesita ser un maestro de todas las herramientas, pero debe tener un buen conocimiento de alto nivel sobre cuáles son la mayoría de ellas, qué aportan a la mesa y lo que probablemente sea más apropiado para el proyecto dado. . Esperaría que un mono de código solo fuera un maestro de su reconocida experiencia en una herramienta específica.
No confiaría en un ingeniero de Ford que no sabe cómo hacer el trabajo del mecánico.
Sin embargo, la ingeniería de software es uno de estos campos donde, en muchos casos, se espera que seamos el ingeniero, el constructor y el mecánico, todo al mismo tiempo.
fuente
Estoy de acuerdo con la persona con la que trabaja. Un buen ingeniero de software se ocupa de los principios generales de diseño y producción de software. Los lenguajes y marcos reales son detalles.
Eso no es para trivializar la facilidad con la que puede elegir nuevos lenguajes y marcos. Siempre hay una curva de aprendizaje asociada con ellos, pero el punto es que es una curva, no una pared vertical para un buen ingeniero de software.
Un buen ingeniero de software tiene una amplia experiencia en varias herramientas y tecnologías diferentes. Si no lo hace, ¿cómo puede elegir la mejor herramienta para el trabajo? Para eliminar el viejo cliché, para un hombre que sabe cómo usar un martillo, cada problema parece un clavo. Incluso si no eres un experto con un destornillador, vale la pena tener una comprensión pasajera de ellos para que puedas reconocer un tornillo no solo como un clavo de aspecto divertido.
fuente
Versión TLDR: otras disciplinas de ingeniería necesitan conocer los materiales que están utilizando (por ejemplo, los arquitectos necesitan saber cuánta carga pueden soportar los materiales que están utilizando en su diseño ). Los lenguajes y marcos que utilizamos para la ingeniería de software tienen ciertos límites y debemos estar familiarizados con ellos para diseñarlos y desarrollarlos de manera efectiva.
Hay dos fases distintas de lo que hacemos. El primero es el diseño conceptual. Es un diseño de sistema de alto y bajo nivel (por ejemplo, usando UML). Los diseños de alto nivel pueden ser teóricamente independientes de la implementación (aunque a veces un diseño de alto nivel tiene que tener en cuenta detalles específicos, como la plataforma de la base de datos, el middleware estándar, etc.). Los diseños de bajo nivel son un poco más complicados. Puede diseñar los detalles de la lógica empresarial sin incluir los detalles de la infraestructura y, una vez más, en teoría, estos pueden ser independientes de la plataforma.
La segunda fase es la programación real. Mientras que algunos ven la programación como construcción, otros (incluyéndome a mí) argumentan que la codificación sigue siendo una disciplina de diseño (en PPP , Bob Martin se refiere a un artículo en el que el autor presenta un muy buen argumento en este sentido, no lo tengo con ahora, pero actualizaré esta respuesta con un enlace a ese artículo). La construcción real ocurre cuando presionas compilar y en efecto es gratis.
Al igual que un arquitecto tiene que tener en cuenta cosas como la resistencia a la tracción y a la compresión de los materiales de construcción que está utilizando, el ingeniero de software debe conocer las capacidades de la plataforma en la que se está desarrollando al escribir código. Yo diría que un diseño de sistema de bajo nivel no es muy efectivo si no tiene en cuenta las opciones de plataforma también.
fuente
Como alguien que se graduó de un programa de grado de Ingeniería de Software, puedo decir que su compañero de trabajo es parcialmente correcto. Un buen ingeniero de software se enfoca en aplicar matemática, estadística, informática y experiencia en el dominio para construir un sistema. Los métodos que utiliza un ingeniero de software suelen ser independientes de la tecnología y el lenguaje: las herramientas no importan tanto como los principios subyacentes.
Dicho eso, la analogía de tu compañero de trabajo es defectuosa. Comprender los problemas del dominio es esencial para cualquier disciplina de ingeniería. Si no comprende completamente el problema que está tratando de resolver y las personas que está tratando de satisfacer, se vuelve infinitamente más difícil construir la mejor solución posible a sus problemas.
En última instancia, la ingeniería de software (y cualquier disciplina de ingeniería) se trata de aplicar una serie de conceptos para resolver un problema. Si usa con frecuencia las mismas herramientas, se volverá más competente con esas herramientas. Será más fácil para usted identificar los problemas que esas herramientas pueden resolver, los riesgos o dificultades con el uso de esas herramientas, y luego usar esas herramientas para construir una solución.
fuente
Esto es casi seguro que es incorrecto. Los ingenieros de producción especializados deben comprender bastante acerca de los productos bajo su cuidado.
En cualquier caso, una mejor analogía es con los graduados de cursos de ingeniería mecánica: a pesar de que todos comienzan (tanto en mech como en software) con las mismas habilidades, nadie sigue siendo "un ingeniero mecánico", sino que se especializa en los tipos de cosas que construyen. Del mismo modo, el desarrollo de software también tiene subcampos muy distintos.
Para volver a la analogía de la línea de ensamblaje, cada línea de ensamblaje es diferente para cada producto, y los diferentes tipos de desarrollo de software requieren diferentes metodologías: no construiría su software de seguridad de la misma manera que construye un juego.
fuente
Hay una curva de aprendizaje involucrada con diferentes especializaciones. Estoy hablando de las diferencias entre la programación integrada / en tiempo real, la programación de aplicaciones web, la programación de sistemas / sistemas operativos, la programación de clientes gruesos, el desarrollo móvil, etc.
Alguien que sea experto en un tipo de programación podría no ser capaz de cruzar a otro de inmediato debido a diferentes requisitos. Claro, un ingeniero de software tiene lo básico para hacerlo, pero lleva tiempo especializarse en algo.
fuente
Estoy de acuerdo con la premisa que sugiere su colega, aunque agregaría una advertencia.
Un buen ingeniero de software podrá construir un buen software en cualquier tecnología ... después de haber aprendido un poco en la nueva tecnología.
Puede haber algunas peculiaridades que no son obvias al principio, pero un buen ingeniero de software pronto las aprenderá.
Creo que lo que realmente quiere decir es que solo porque un desarrollador tenga 2 años de experiencia sólida en C #, no significa que sea un mejor ingeniero de software con experiencia en Java, que nunca antes haya hecho C #, que no pueda venir, aprender C # y rápidamente convertirse en un mejor desarrollador de C # que el primer chico.
En otras palabras, no necesariamente debes descartar al chico Java por un trabajo, SOLO porque él ha "cumplido" en C #.
fuente
Caso en cuestión: el marco de software con el que usted siente que es tan crítico para tener experiencia especializada probablemente no existía hace 10 años, o ha sufrido una transformación significativa si lo hizo. La naturaleza misma de nuestra profesión hace que sea imposible especializarse para la totalidad de la carrera. Dependiendo de sus respectivos niveles de habilidad, su especialización le brinda una ventaja de entre 1 y 6 meses sobre alguien que nunca ha usado su marco particular. Después de eso, estás a la par.
fuente
Trabajo para una compañía de helicópteros y los ingenieros de aviación aquí están especializados en los tipos de aviones con los que pueden trabajar. Deben ser "tipo clasificado". Técnicamente, podrían trabajar en cualquier cosa, desde un Robinson R22 a un Jumbo Jet, pero no sin el entrenamiento de conversión.
Creo que esto es bastante similar a la ingeniería de software, excepto que el "entrenamiento de conversión" es más informal para los ingenieros de software.
fuente
Al hablar con un pintor, ¿le dirías que no tendría problemas para esculpir?
Aprender un nuevo idioma o detalles específicos de un nuevo dominio es similar a un artista que se ocupa principalmente del lápiz y la tinta y aprende a pintar (o viceversa). De esto es de lo que hablan la mayoría de las otras respuestas, de cómo su amigo está parcialmente correcto: se aplican muchos de los mismos conceptos.
Pero enseñarle a un pintor cómo esculpir un objeto 3D o escribir una novela (Ambas formas de expresión artística) es una bestia completamente diferente. Ese es el punto de vista del que vienes.
El software basado en la web requiere un tipo de pensamiento completamente diferente que el software de escritorio. Ambos son completamente diferentes cuando se aplican a juegos versus un entorno de trabajo. Sospecho que trabajar en un sistema operativo o sistemas integrados también requiere pensar de una manera diferente (pero no tengo experiencia con ellos). Y no tengo dudas de que hay otros dominios que también requieren una forma diferente de pensar.
Resumen y ejemplos:
"Arte" incluye esculturas, novelas, cómics y pinturas. Las superposiciones de habilidades incluyen:
... Y así. Pero como se mencionó anteriormente, es poco probable que a un artista de cómic le vaya bien en su primera novela. Necesitan pensar de manera diferente.
Del mismo modo, hay una superposición en diferentes campos de la programación / ingeniería de software, pero la mayoría de ellos son demasiado distintos para poder entrar. Por ejemplo:
fuente
¿Todos los trabajadores de la construcción de carreteras pueden usar cada pieza de equipo y maquinaria en el lugar de trabajo? La respuesta es no. Hay piezas de maquinaria que conocen y que probablemente estén familiarizadas con las demás. Lo mismo debería ser cierto para los ingenieros de software, hay una cantidad de idiomas y marcos que conoce porque trabaja con ellos todos los días, pero no se debe esperar que conozca las operaciones exactas de los demás sin un poco de capacitación. Es como tomar el martillo neumático y asignarle la tarea de conducir la mezcladora de cemento.
Los lenguajes y marcos de programación son solo herramientas en un cinturón de herramientas de ingenieros de software. Hay algunas herramientas que conocerá mejor que otras debido a la experiencia. En definitiva, la mejor herramienta es comprender los conceptos y principios básicos de la informática. Elegir idiomas y marcos es simplemente seleccionar qué destornillador usar en cada tornillo.
fuente
Este tipo de cosas pasan mucho donde trabajo.
Me gusta compararme con la profesión del tío de mi esposa: un mecánico de automóviles.
Se especializa en Mercedes, puede aplicar sus conocimientos a otras marcas de automóviles, y lo hace, algunos de ellos bastante raros, pero eso no significa que pueda reparar de inmediato la X porque usted dice que está haciendo ruido.
Programo en algunos idiomas, pero eso no significa que sepa por qué Safari en su MacBook vuelve a cargar páginas cada vez que cambia de pestaña (la extraña llamada de hoy). Trataré de averiguar por qué, pero no voy a saber de la cabeza porque el campo de la computación es ENORME .
En ambos casos, después de pasar un tiempo buscando en nuestros respectivos campos, probablemente podríamos encontrar la respuesta, pero no en los diez segundos que la gente piensa porque "pero trabajas con autos" o "pero trabajas con computadoras".
¿La gente dice tales cosas a su médico local (como "Me duele la cabeza, ¿qué enfermedad tengo?"). Apuesto a que lo hacen porque la mayoría de las personas realmente no entienden que hay más en una profesión que sus expectativas inmediatas. de dicha profesión.
fuente