Ingeniería de software
Una de las ramas de las ciencias de la computación y la informática es la Ingeniería de Software. En ella se estudia se estudia el ciclo de vida completo del Software.
A continuación te dejo una selección de artículos técnicos relacionados con la ingeniería del software. Te recomiendo que eches un vistazo por si alguno es de tu interés.
Si sólo quería saber más sobre qué es la ingeniería del software y profundizar más en ello, haz click aquí.
Mi Experiencia con ChatGPT: Un Viaje de Descubrimiento y Creación
Google App Script para monitoreo de correo
Comandos de Git mas comunes
Rapidez y confiabilidad usando Consumer Driven Contract Testing
Verificando la integración de Microservicios con Contract Testing
Introducción al Contract Testing
Trabajar con múltiples proyectos en Intellij
Qué es Blockchain
Mecanismos de consenso en Blockchain
¿Qué es la Web3?
Comprendiendo Python imports, __init__ y python path
Web3
¿Informático? ¿Desarrollador de Software? ¿Ingeniero de Software?
Si eres compañero de profesión, no se si te habrá pasado como a mi. Muchas veces cuando tengo que decir a qué me dedico, no se bien qué decir… Ingeniero del Software, Informático, Desarrollador de Software …
Muchas veces dependiendo de quién sea el que me pregunta, termino por decir una u otra cosa. ¿Te imaginas diciéndole a tu abuelo/a que eres Ingeniero del Software? No sé, a mi al menos ¡se me hace raro! 😅
Supongo que te habrá pasado que al responder con un ‘pues soy informático’, automáticamente ha aparecido una imagen como esta en tu cabeza.

Y… no amigos, los informáticos NO arreglamos impresoras atascadas, y NO arreglamos ordenadores o chismes electrónicos que no encienden. Al menos no la mayoría de informáticos.
Pero dejémonos de paja, y vamos al grano, que aquí has venido a aprender (supongo).
¿Qué es la ingeniería del software?
La ingeniería del software es una disciplina formada por un conjunto de metodologías, herramientas y técnicas que se usan en el desarrollo de programas informáticos, también conocido como software.
La generación de software, es un proceso intrínsecamente creativo.
La ingeniería de software trata de sistematizar este proceso para tratar de reducir el riesgo de fracaso.

Para ello, busca la aplicación de las metodologías, herramientas y sistemas, de la forma más eficiente posible, para lograr unos resultados óptimos.
Hay que ser capaces no sólo de resolver el problema, sino hacerlo de la forma más apropiada.
Fases de la Ingeniería del Software
La ingeniería del software está presente de principio a fin en el proceso de creación de un software.
Vamos a ver cuáles son las fases principales en este proceso.
- Análisis de requisitos.
De esta fase depende en gran medida no sólo el alcance del producto final, sino el éxito o no del mismo.
Hay muchos memes sobre esto que he creído interesante incluir, porque como bien dice el refrán, una imagen vale más que mil palabras.

Para que eso no ocurra, se necesita pasar por una fase de toma de requisitos clara, bien definida y entendida tanto por el cliente como por el ingeniero de software.
- Diseño y arquitectura.
Una vez se conocen los requisitos, se pueden empezar a determinar los distintos casos de uso, para abarcar las distintas funcionalidades que el sistema debe llevar a cabo.
En esta fase se estudiarán las distintas opciones de implementación del software, y se decidirá su estructura.
Es otra fase crucial, a la par de compleja. Por ello no es algo que se haga una única vez, sino que se producirá de forma iterativa, refinando la solución a medida que se va diseñando.
Para facilitar el éxito de esta fase, te puedes apoyar en el catálogo de patrones de diseño ya existentes, donde se recogen las experiencias en otros diseños, para evitar que se vuelva a caer en los mismos errores.
- Desarrollo.
Fase preferida de un alto porcentaje del gremio de la informática.
En este punto se decidirá qué lenguaje de programación será el utilizado para llevar a cabo la implementación de la solución.
Una vez tomada esta decisión, se procede con la implementación. Siempre teniendo presentes las buenas prácticas de desarrollo, para tratar de evitar, desde el momento cero, que el código se vuelva indescifrable e inmantenible.
Sin lugar a dudas, un must de todo aquel que está interesado en desarrollar código de calidad es el libro Clean Code, de Robert C. Martin.

- Pruebas.
La gran olvidada… si bien es cierto que cada vez menos. Si eres compañero de profesión, cuántas veces no te habrás encontrado con la típica pregunta de ‘¿Pero esa estimación es con o sin pruebas?’
Hoy en día no se concibe un software sin sus pruebas. El QA (Quality Assurance) está en auge desde hace ya un tiempo y cada vez son más y mejores las herramientas que el desarrollador puede usar para garantizar la calidad del código.
Existen muchos tipos de pruebas, pero quizás las más cercanas al desarrollador sean las unitarias, donde se verifica que cada unidad de código implementado funciona de forma independiente como se esperaría.
Como comentaba antes, a día de hoy es difícil no encontrar equipos divididos, donde los desarrolladores implementan, y el equipo independiente de QA se dedica a elaborar las pruebas del sistema para garantizar su calidad.
- Documentación.
Esta es otra de las fases que crea siempre debate y que de hecho con la aparición de las metodologías Agile quizás se haya visto aun más modificada.
A mi me gusta verla como la fase que te permite dar a conocer el software a cualquiera que tenga la capacidad técnica suficiente.
Imagina un enlace que poder compartir y que pudieras usar para garantizar que cualquiera que profundice en él, tenga un conocimiento adecuado del software.
Ese es el objetivo de esta fase. Tan fácil de decir, tan tremendamente difícil de conseguir.

Además de ser una de las fases que a los creadores de software gusta menos por lo general, y eso afecta de forma directa a que los resultados en la misma sean, de nuevo en general, mediocres.
Las personas en los equipos de desarrollo van y vienen, y los software evolucionan de forma continua. Es fundamental tener una buena documentación del producto no sólo para lo comentado anteriormente, sino para ahorrar en tiempo, y por lo tanto en costes, ya que si disponemos de ese enlace ‘mágico’ estaremos evitando mucho tiempo en transmisión de conocimiento que se efectuaría mediante otras vías.
- Mantenimiento.
El software es un ente vivo que normalmente evoluciona a medida que pasa el tiempo y con él las necesidades. En esta fase de mantenimiento es donde entra esta evolución para mejorar las funcionalidades existentes y dar respuesta a los nuevos requisitos.
Además también tenemos el mantenimiento correctivo, que es el que quizás es más conocido. Aquel que se encarga de arreglar cualquier fallo de funcionalidad una vez el software ya está en producción.

Objetivos de la ingeniería del software
Los objetivos siempre son algo quizás demasiado variable, al menos si se buscan a bajo nivel. A alto nivel todo se puede resumir quizás con un ‘que el producto sea de calidad’. Pero… ¿cómo llegar hasta ahí? ¿qué otros objetivos más concretos nos pueden llevar hasta ese?
No hay una solución a cualquier problema planteado. Pero sí que se puede llegar a determinar si una solución es mejor que otra, o al menos los pros y contras de cada una.
Se debe siempre tener las buenas prácticas y los estándares en mente para aplicarlas buscando acercarnos a esa solución más eficiente y empíricamente mejor.
Permíteme listar a continuación cuáles son los principales objetivos que un ingeniero de software debería tener siempre presentes.
Satisfacción del usuario
Al fin y al cabo el software que se está desarrollando tiene el objetivo de satisfacer las necesidades de su usuario final.
Nunca se debe perder este foco, estando siempre centrados en entender el para qué va a servir lo que se está haciendo.
Entender los requisitos es una pieza tremendamente fundamental y necesaria antes de empezar a desarrollar por desarrollar.
Fiabilidad
Siempre debes buscar que el producto esté preparado para todos los posibles escenarios. No sólo aquellos donde todo se comporta de forma esperada, sino también aquellos donde ciertas piezas pueden no funcionar.

En cualquiera de estos casos, el software debe estar preparado para no responder de forma inesperada.
Además, y también relacionado con lo anterior, siempre debes tener en mente el objetivo de cero bugs.
Para ello cobra mucho sentido el poner foco en la calidad (QA) y en tener una colección de test que garanticen de forma automática que el producto no tiene problemas.
Costes
De nada sirve tener el mejor software del mundo si en el camino nos hemos arruinado y los ingresos que produce no superan los costes. Ley fundamental de cualquier negocio; maximizar los beneficios.
En la ingeniería del software no hay excepciones.
Debemos buscar la mejor solución, con unos costes apropiados.
Generalmente los costes más altos suelen ser los de mantenimiento. Así que uno de los objetivos principales debe ser que el código sea legible, fácilmente entendible y flexible a cambios, para que llegado el momento de tener que corregir fallos, no haya que tirar la casa y empezarla desde el principio.
Generar valor continuamente
Es esencial que el cliente vea evolución en su producto.

Las metodologías ágiles facilitan lograr este objetivo, buscando aumentar el valor del producto cada 2-3 semanas, en lo que se denomina un sprint de desarrollo.
En la mayoría de los casos el producto evoluciona a medida que se va viendo crecer. Mi experiencia me dice que es muy difícil encontrar unos requisitos tan perfectamente definidos que se sepa desde el momento inicial cómo debería terminar el producto.
Generalmente se tiene una idea, más o menos clara, con objetivos más o menos concretos, pero a medida que éstos se van cumpliendo y que el software va viendo la luz, se suele pivotar, cambiando cosas o incluso generando nuevos objetivos.
Por esto es esencial que no nos escondamos en una cueva a hacer lo que se firmó en la fase de toma de requisitos sin hablar con nuestro cliente o usuario final. Debemos tener contacto y a medida que se va evolucionando, siempre presentar las mejoras y funcionalidades al cliente para asegurar que se va por la línea adecuada.
Rendimiento
Este objetivo va también íntimamente ligado con el de los costes.
Por norma general, un software eficiente y con un alto rendimiento suele necesitar de menos recursos como CPU o uso de memoria, y eso a fin de cuentas se traduce en menos costes y por tanto más beneficios.
Y más allá de beneficios, muchos negocios sencillamente necesitan dar respuesta en un corto periodo de tiempo, por lo que en ciertas ocasiones se podría decir que un determinado y exigente rendimiento es requisito fundamental.
Reusabilidad
Siempre, siempre, siempre debemos tener en mente y escrito a fuego este objetivo. Solucionar un problema de forma genérica generando una unidad de código que pueda ser reutilizado en muchos otros lugares en el futuro ahorra esfuerzo y dinero.
Dicho así parece algo sencillo, pero es en realidad muy difícil de llevar a cabo de forma apropiada, sobre todo en software de tamaño importante con grandes equipos independientes.
Equipo
Nunca te olvides de tu equipo. Un buen ingeniero de software es aquel que no sólo se preocupa por su parcela, pulsando las mejores teclas en su teclado para generar el mejor código.
Me atrevería a decir que ningún software importante hoy en día es uni-personal. Y es por ello por lo que saber trabajar en equipo es un punto que considero pilar fundamental.
Transmitir los objetivos tanto a alto como a bajo nivel, asegurándote de que éstos han sido bien entendidos, comunicarte con el equipo para hacerles partícipes de la estrategia a seguir en el corto-medio plazo para ir cumpliendo los objetivos y llevar un tracking organizado del trabajo en el día a día son tres de los puntos que considero más importantes.
¿Qué hace un ingeniero de software?
Un ingeniero de software en su día a día se enfrenta a diversidad de retos, y las tareas pueden variar en función de la naturaleza de los problemas a solucionar.

Entre esas tareas puedes encontrar:
- Modificar software ya existente.
- Creación de software nuevo desde cero.
- Analizar y diseñar sistemas de software completos.
- Planificar el proceso de creación de software de inicio a fin.
- Documentar los flujos para mostrar qué es lo que ocurre en un sistema de software determinado.
- Trabajo en equipo con otros desarrolladores de software, diseñadores… etc, para llegar a soluciones comunes.
- Cuidar de factores como seguridad, coste y tiempos de entrega en el proceso de diseño y desarrollo.
- Facilitar la formación del equipo con cursos y/o documentación.
Orientación profesional de un ingeniero del software
Seguro que existen más vías posibles a las que listo a continuación, pero estas son las que creo interesantes de comentar.
- Colaborador independiente
Los colaboradores independientes se enfocan en profundizar sus conocimientos a lo largo de sus carreras, a veces en múltiples áreas temáticas. A menudo valoran ser creadores y asumir roles más prácticos en los proyectos. Es un rol que requiere liderazgo, ya que se confía en ellos para defender y orientar a los equipos, así como para dar un buen ejemplo de ética de trabajo y ejecución.
- Líder de equipo o Manager.
Esta es más la vía de la gestión tradicional quizás. Para este rol se requiere en mayor medida habilidades sociales, así como organizativas.
Se necesita saber cómo formar y liderar equipos exitosos, manteniendo constantemente la motivación, delegando y asignando tareas complejas.
Se requiere visibilidad dentro de la organización, tanto internamente en términos de colaboración y gestión de las partes involucradas, como externamente en lo referente a representar a la empresa ante los clientes actuales y potenciales.
- Freelancer
Cuando se quiere volar sólo, normalmente se termina haciendo.
Ya sea desde el principio, o cuando ya se ha acumulado cierta experiencia y habilidades.
Si se está motivado y se disfruta trabajando en una variedad de proyectos, este tipo de vía puede ofrecer una mayor flexibilidad en horas de trabajo y nivel de contribución.
- Ingeniero de Startup
Montar una startup es también otra de las vías posibles a explorar.
Eso sí, si te decides por esta vía, no sólo tendrás el trabajo de ingeniería como tal, sino también la parte comercial y de gestión y administración que una empresa necesita.
Desde luego, un desafío interesante para aquellos que se ven con la suficiente motivación.
Los skills o habilidades necesarias variarán dependiendo de la vía elegida.
