En el ámbito del desarrollo de software, dos figuras profesionales destacan: el ingeniero de software y el programador. A pesar de compartir el objetivo común de crear soluciones tecnológicas, sus enfoques y responsabilidades varían significativamente.
Este artículo se adentra en las diferencias entre un ingeniero de software y un programador, explorando aspectos como formación, enfoque de trabajo, habilidades de comunicación, certificaciones y responsabilidades en el ciclo de vida del software. Al comprender estas diferencias clave, podemos apreciar el valor único que cada uno aporta al desarrollo de aplicaciones y sistemas de software.
Todos los ingenieros de software pueden programar, pero no todos los programadores pueden diseñar software
A algunas personas no les gusta el término “Ingeniero de Software” porque es una metáfora relacionada con la ingeniería en un sentido industrial. Este artículo no trata de ese término. Si no te gusta, puedes sustituirlo por diseñador de software, creador de software o “pintor artístico” de software, me da lo mismo.Por Ingeniero de Software, me estoy refiriendo a la persona que considera la creación de software de calidad como su actividad profesional.
Es una persona que aplica conocimiento científico y estadístico a la profesión de hacer software y no la ve solo como un trabajo que le permite ganar dinero.Saber cómo programar no te convierte en un ingeniero de software.Cualquiera puede aprender a programar. Es relativamente sencillo en la práctica.
Cualquiera puede crear programas sencillos que funcionen para ellos en sus máquinas, pero eso no garantiza que los mismos programas funcionen para los demás.Mi analogía favorita sobre esto es que todo el mundo puede cantar y entretenerse en la ducha, pero a la hora de divertirse, no pones música de ti mismo cantando. Recurres a los profesionales.¿Más analogías? Ahí van:
- Aprendimos matemáticas y a escribir en el colegio, pero eso no nos hizo matemáticos y escritores.
- La mayor parte de nosotros puede fácilmente aprender a cocinar, pero cuando llega el momento de darle de comer a mucha gente, entonces contratamos a un chef.
- No llamas al manitas del vecindario para que haga una casa desde cero.
En este artículo, el mensaje principal que quiero transmitir es que los programas más sencillos son muy diferentes de los programas diseñados profesionalmente, y que no todo el mundo es capaz de hacerlo aunque sepan programar software complejo. El acto de programar, en su definición más simple, es dar instrucciones a los ordenadores para que hagan algo con alguna entrada con el fin de producir alguna salida. El acto de la ingeniería de software consiste en diseñar, programar, probar y mantener programas de software con el propósito de resolver problemas para muchos usuarios.
Se trata de crear soluciones robustas y seguras que resistan la prueba del tiempo y que funcionen incluso ante algunos de los problemas que no se conocen y que son no tan obvios como los problemas originales que motivan el desarrollo del software en cuestión.Los ingenieros de software tienen que ser conscientes de todo lo relacionado con los problemas que resuelven, las soluciones que ofrecen, las limitaciones de esas soluciones, sus implicaciones de privacidad y sus implicaciones de seguridad, etc.Si alguien no entiende el problema en su totalidad, no se le debería permitir que programe una solución para el mismo.
La mentalidad de solución
Los ingenieros de software no piensan que su carrera es solo escribir código. Piensan en términos de satisfacer necesidades y resolver problemas. Esto es importante porque no todos los problemas necesitan un programa. Algunos problemas pueden ser resueltos por programas de software ya existentes o por la combinación de varios programas. Algunos problemas pueden prevenirse totalmente si se actúa con prontitud.
El diseño de buenos programas a menudo implica la planificación para prevenir problemas futuros. Citando a Albert Einstein: “Los intelectuales resuelven los problemas, los genios los evitan.”Los problemas complicados suelen requerir la creación de varios sub-programas o módulos. Algunos problemas necesitan programas que se ejecuten en paralelo, mientras que otros necesitan que los programas se ejecuten de forma secuencial. Algunos problemas se pueden resolver educando a los usuarios.Antes de escribir un programa, un diseñador de software debe hacer las siguientes preguntas:
- ¿Qué problemas estoy tratando de resolver?
- ¿Qué más se puede hacer además de escribir código para resolverlos?
- ¿Qué puedo hacer para que estos problemas sean más fáciles de resolver con código?
Código de calidad
Los mejores programas son fáciles de leer, se pueden escalar fácilmente, funcionan muy bien con otros programas y mantenerlos no supone una pesadilla. La calidad del código no se puede negociar, el uso de atajos chapuceros debido a la inminencia de una fecha límite o a una conjetura es inaceptable.Uno de los aspectos más importantes de la ingeniería de software es diseñar cualquier cosa desde el principio y estar listo ser escalable.
Hacer modificaciones en software es una realidad constante. Los usuarios exigirán más funciones y formas más fáciles de usar el software.Una pieza de software no suele ser muy útil por sí sola. Las funcionalidades útiles del software comienzan cuando varias piezas de software se comunican entre sí, intercambian sus datos y colaboran en la tarea de presentar datos e interfaces a los usuarios.
El diseño de los programas tiene que hacerse teniendo esto en mente. ¿Qué mensajes aceptan? ¿Qué eventos son monitorizados? ¿Qué mensajes se emiten? ¿Cómo autenticamos y autorizamos las comunicaciones?Otro aspecto importante de los mejores programas de software es la claridad del código, no el número de pruebas que se hacen ni el del informe de evaluación del software. La pregunta es si este código es legible para otra persona. O mejor dicho, ¿podría yo, el programador hoy, entender este código dentro de unas semanas?La legibilidad del código importa mucho más de lo que piensas.
Desafortunadamente, no hay buenas métricas que permitan medir la claridad del código. Memorizar buenos estándares y prácticas de programación puede ayudar, pero a menudo no es suficiente. Los buenos ingenieros de software solo desarrollan la visión necesaria para conseguir claridad en el código con experiencia e intuición. La metáfora de la redacción escrita aquí es perfecta: el simple hecho de conocer una enorme lista de palabras no necesariamente te ayudará a escribir un contenido conciso y claro.Con los programas de software las cosas van a salir mal, es una realidad del oficio.
Ser capaz de arreglarlos fácilmente cuando sucede es un atributo muy importante de un buen software. Los errores que ocurren en los programas deben tener mensajes claros y estar registrados de forma centralizada en algún lugar para ser monitorizados. Cuando se informa de un nuevo error, la persona que necesita corregirlo debe ser capaz de depurar ese error. Deben ser capaces de conectarse al sistema y leer información sobre el contexto de ejecución en cualquier momento. Deben ser capaces de verificar fácilmente las expectativas sobre cualquier parte del sistema.
Entornos y pruebas
Cuando un ingeniero de software desarrolla un programa, se asegura de que el software funcione en muchos entornos diferentes, en máquinas con recursos diferentes y en zonas horarias diferentes. El software debe funcionar en muchos tamaños de pantalla diferentes y con orientaciones distintas. También necesita gestionar el hecho de verse obligado a utilizar una memoria limitada o una potencia de procesamiento reducida.Cuando se crea software para un navegador web, por ejemplo, necesita funcionar en todos los diferentes navegadores principales.
Al crear software de escritorio, en la mayoría de los casos debe funcionar para usuarios de Mac y Windows. Cuando se crean aplicaciones que dependen de los datos, el software debe funcionar cuando la conexión para recuperar esos datos es lenta o está completamente desconectado durante un tiempo.Para crear una aplicación de software, los ingenieros de software intentan hacer un análisis de todos los escenarios posibles que se les ocurren y planifican hacer una prueba de los mismos.
Esto comienza con lo que ellos llaman “la senda feliz” donde nada inesperado sucede, pero lo más importante es que documentan cada incidente que es muy probable que ocurra y planifican una prueba para ello. Algunos ingenieros de software empiezan con el desarrollo de código, al que llaman casos de prueba, que simulan estos escenarios. Luego programan el código requerido que supera todos estos casos de prueba.
Los ingenieros de software son capaces de comprender los requisitos del software, que por lo general son ambiguos e incompletos. El talento y destreza que hace de un ingeniero de software un profesional valioso no se centra en cómo programar una solución, sino en cómo identificar lo que debe incluirse en ella (y también lo que no).
Costes y Eficiencia
En la mayoría de los casos, los ingenieros de software pueden resolver problemas rápidamente. Si piensas que contratar programadores experimentados significa tener mayores costos, piénsalo de nuevo. Cuanto más experimentado sea el programador que contrates, más rápido podrán ofrecer soluciones robustas, precisas, fiables y de mantenimiento sencillo. Esto se traduce en una disminución global de los costes a largo plazo.También hay que tener en cuenta el costo de ejecutar el programa. Cada programa utilizará recursos informáticos y estos no son gratuitos.
Un ingeniero de software programará software eficiente que no utiliza los recursos del ordenador inútilmente. Por ejemplo, el almacenamiento en caché de datos de uso frecuente es una estrategia que se aplica aquí, pero es sólo una de las miles de herramientas y variaciones que pueden hacer que un programa sea más rápido y eficiente.Un programador principiante podría darle una solución barata, pero ejecutar esa solución te puede costar a ti y a tus clientes mucho más que si tuvieras un desarrollador experimentado, ya que desde el principio crearía una solución eficiente.
Usabilidad
Los buenos programas se diseñan teniendo en cuenta la experiencia del usuario (UX). La interacción persona-ordenador es un tema importante con innumerables estudios de investigación y conclusiones. Cuanto más se adopten estos conocimientos, mejor será el software.A continuación se ofrecen un par de ejemplos para poder apreciar un poco este enorme campo:
- Cuando se diseñan formularios de entrada de datos en los que se espera que los usuarios introduzcan datos como, por ejemplo, su dirección de correo electrónico, un buen programa receptor ignoraría la letra mayúscula utilizada para la dirección de correo electrónico. También recortaría cualquier espacio extra a su alrededor. No se lo pongas difícil al usuario porque su clave BloqMayús esté activada, un correo electrónico solo es válido en su formato en minúsculas. Si el programa está aceptando nuevas direcciones de correo electrónico, valídalas antes para que el usuario reciba un mensaje claro de que probablemente usó la dirección equivocada. Esto incluye problemas de validación obvios como no tener un signo @, pero también debería incluir los problemas de validación no tan obvios como el uso de un “gmail.ocm” mal escrito.
- Al redirigir a un usuario a hacer algo, una buena aplicación recordará su ubicación original y lo redirigirá de vuelta a esa ubicación cuando haya terminado. Un buen programa también recordaría cualquier dato e interacción ya definidos que necesiten ser asociados con los pasos futuros que se le pida al usuario. Por ejemplo, supongamos que ha estado buscando vuelos como invitado en Expedia. A continuación, decidió crear una cuenta. Todas sus búsquedas anteriores se guardarán en la nueva cuenta y podrá acceder a ellas desde máquinas completamente diferentes.
Se nos pueden ocurrir miles de escenarios más, lo más importante es tener en cuenta el UX en al meneos aquellas funcionalidades más utilizadas por los clientes de un software.
Confiabilidad, seguridad y protección
Estos son probablemente los puntos más importantes que diferencian a los profesionales de la informática de los aficionados. Saben que son los únicos responsables de crear soluciones seguras.Un programa tiene que ser resistente a las entradas de datos inadecuadas, a los malos estados y a las malas interacciones. Esto es MUY difícil de lograr y es la razón principal por la que oímos historias de personas que se han ido a la ruina a causa de errores de software.
Los usuarios van a utilizar el software con una mala o incorrecta entrada de datos. Algunos lo harán intencionalmente para tratar de romper el software y hackear los recursos presentes en el mismo. En muchos casos, las personas responsables de incidentes relacionados con la seguridad de un software son expedientados y en muchos casos despedidos.Se sobreentiende que el trabajo de cualquier ingeniero incluiye crear aplicaciones resistented a las entradas erróneas y maliciosas en todo el software que está expuesto públicamente.
El tema de la seguridad no sólo se refiere a las entradas malintencionadas y dañinas, sino también a las entradas de datos normales. Si los usuarios olvidan sus contraseñas, ¿cuántas veces se les puede permitir intentarlo? ¿Los dejas fuera después? ¿Y si alguien más está tratando de bloquearlos? ¿Permites que tus usuarios envíen su contraseña a través de una conexión no cifrada? ¿Qué pasa si un intento de acceder a una cuenta proviene de un lugar inusual? ¿Qué hacer si el inicio de sesión parece automatizado?¿Qué haces para proteger a tus usuarios de los scripts cruzados y las solicitudes de falsificación, de los ataques del tipo “intermediario” y del simple phishing social? ¿Tienes una estrategia de copia de seguridad si recibes un ataque DDoS en tus servidores?
Estas preguntas son tan solo para mencionar algunas de las muchas preocupaciones que hay que prever.Los programas seguros no almacenan información sensible en texto plano, sino más bien como datos cifrados en un solo sentido con algoritmos muy difíciles de romper. Esta es una estrategia de copia de seguridad en caso de que el programa y los datos se vean comprometidos. Los hackers se encontrarían con datos encriptados que son inútiles para ellos en su mayor parte.Los problemas inesperados o imprevistos ocurren en el mejor de los programas de software. Si no eres consciente de ello y no estás pensando en ello, no eres un profesional del software, sólo eres un creador de aplicaciones poco seguras.Los fallos del software son invisibles. Nuestra capacidad intelectual para predecir y prevenir defectos conocidos es limitada. Esta es la razón por la que los ingenieros de software entienden el valor que tienen las buenas herramientas que pueden ayudarles a programar software correcto y seguro.
La Evolución de la Ingeniería del Software
Nadie puede aprender a ser ingeniero de software en dos meses, ni en seis, ni siquiera en un año. No se aprende a ser ingeniero de software en un bootcamp. Llevo aprendiendo más de 20 años y todavía estoy aprendiendo hoy en día. Llegué a tener la confianza suficiente para llamarme a mí mismo un programador experimentado sólo después de una década de aprendizaje y después de diseñar, desarrollar y mantener aplicaciones que son utilizadas por miles de usuarios.La ingeniería de software no es para todos, pero todos deben aprender a resolver sus propios problemas con los ordenadores.
Si puedes aprender a escribir programas simples, deberías hacerlo. Si puedes aprender a usar servicios genéricos de software, deberías hacerlo. Si puedes aprender a usar software de código abierto, tendrás mucho poder.Los problemas evolucionan y la ingeniería de software también lo hace. El futuro de esta profesión es permitir que los usuarios frecuentes de ordenadores puedan utilizarlos sin necesidad de estudiar durante cinco años. Permite a los usuarios poder resolver los problemas fáciles por sí mismos con herramientas fáciles de usar. Los ingenieros de software entonces se podrían dedicar a crear mejores herramientas, resolver problemas conocidos mayores y hacer todo lo posible para prevenir los desconocidos.Nota: este post es una traduccíon de este artículo.
¿Cuál es la diferencia entre un ingeniero de software y un programador? Ampliando la perspectiva en 2024
El mundo de la tecnología es vasto y en constante evolución. A medida que este campo crece, surgen nuevos roles y responsabilidades. Dentro de la industria del software, dos roles fundamentales son el ingeniero de software y el programador. Aunque ambos trabajan en el desarrollo de software, sus enfoques y responsabilidades difieren significativamente. En este artículo, exploraremos las diferencias entre estos dos roles y añadiremos algunas nuevas ideas a la discusión.
- Formación y educación: Ingenieros de software suelen tener una formación más amplia y profunda en áreas como matemáticas, algoritmos, diseño de sistemas y arquitectura de software, lo cual les permite abordar problemas más complejos y crear soluciones sofisticadas. Por otro lado, los programadores suelen enfocarse en la codificación, depuración y mantenimiento de aplicaciones, lo que no siempre requiere una formación académica tan rigurosa.
- Enfoque de trabajo: Mientras que los programadores se centran en la implementación de código, los ingenieros de software se enfocan en el diseño y desarrollo de sistemas de software, lo que implica la creación de algoritmos y estructuras de datos, así como la optimización y escalabilidad del sistema. Los ingenieros de software también trabajan en la integración de sistemas y en la garantía de la calidad del software.
- Habilidades de comunicación y trabajo en equipo: Los ingenieros de software suelen trabajar en equipos multidisciplinarios y deben tener habilidades de comunicación efectivas para interactuar con otros profesionales, como diseñadores de UX, analistas de sistemas y especialistas en marketing. Los programadores también pueden trabajar en equipo, pero a menudo su enfoque está más centrado en la programación y el perfeccionamiento del código.
- Certificaciones y lenguajes de programación: Los ingenieros de software pueden obtener certificaciones como PMP (Project Management Professional) o CSM (Certified Scrum Master) para mejorar sus habilidades de gestión de proyectos y liderazgo. Los programadores, por otro lado, suelen especializarse en lenguajes de programación específicos y pueden obtener certificaciones como Oracle Certified Java Developer o Microsoft Certified Solutions Developer.
- Responsabilidad en el ciclo de vida del software: Los ingenieros de software están involucrados en todo el ciclo de vida del desarrollo de software, desde la fase de planificación hasta la implementación y el mantenimiento. Los programadores, en cambio, se centran principalmente en la fase de implementación y pueden tener responsabilidades limitadas en otras áreas del proceso.
- Habilidades analíticas y de resolución de problemas: Los ingenieros de software suelen tener habilidades analíticas y de resolución de problemas más avanzadas que les permiten abordar problemas complejos y diseñar soluciones eficientes y escalables. Los programadores, aunque también deben ser capaces de resolver problemas, se enfocan más en la implementación y depuración del código.
Aunque hay diferencias claras entre un ingeniero de software y un programador, ambos roles son esenciales en el desarrollo de aplicaciones y sistemas de software. En última instancia, la elección entre estos dos roles dependerá de las habilidades.
Artículos relacionados: Diferencias entre un programador y un desarrollador, Desarrollo de aplicaciones multi-plataforma, 5 formas de mejorar tu lógica de programación, ¿Eres desarrollador? No te pagan por escribir código, 8 características importantes de un buen analista programador, 10 consejos para mejorar destrezas de programación y ser mejor programador, ¿Por qué a la mayoría de los programadores solo nos gusta nuestro código?,