La ingeniería de software es una rama de la informática que incluye el desarrollo y la construcción de software de sistemas informáticos y software de aplicaciones. El software de sistemas informáticos se compone de programas que incluyen utilidades informáticas y sistemas operativos. Aprende toso sobre como ser un Ingeniero en Software.

Historia
La Ingeniería de Software se ha convertido en una profesión con alta demanda, y desde su profesionalización a principios del año de 1980, se ha convertido en una profesión relacionada con la informática estando al lado de las ciencias de computación y la ingeniería tradicional.
Para el año 1987, en el Reino Unido a través del Departamento de Informática -Imperial College de Londres- se introdujo la primera titulación de ingeniería de software por tres años y al año siguiente la Universidad de Sheffield estableció un programa similar.
En el año 1996 se establece la primera licenciatura en los Estados Unidos por la Universidad de Tecnología de Rochester, pero no fue sino hasta el año 2003 que tuvo la acreditación de programas de educación universitaria -ABET- y paralelamente, en el mismo año del 2003 la Universidad de Clarkson, Universidad Estatal de Mississippi y la Escuela de Ingeniería de Milwaukee obtuvieron tal acreditación.
En el año 1997 en la India implementaron una maestría en Ingeniería de Software de cinco años, comenzando su piloto en el Colegio de Tecnología de PSG en Coimbatore.
Desde entonces, se han establecido títulos universitarios de ingeniería de software en muchas universidades. Un plan de estudios internacional estándar para títulos universitarios de ingeniería de software fue recientemente definido por el SE2004 -Ingeniería de Software 2004- antes conocido como CCSE -Informática Plan de estudios de Ingeniería de Software- el cual incluyen la Ingeniería de Software Educación Conocimiento.
En España, esta profesión a pesar de estar amparada legalmente –Ley 12/1986- como una competencia profesional y reconocida por universidades oficiales, hay muy poca o escasas normativas. Las competencias del ingeniero en sistema engloba de forma genérica dentro de las competencias de cualquier ingeniero técnico.
El Colectivo, los Colegios y Asociados de Ingeniería en Software han realizado solicitudes en variedad de ocasiones ante el Ministerio de Industria, Turismo y Comercio para que regulen sobre la materia para evitar las comparaciones existentes con el resto de las ingenierías.
En el año 2007 se realizaron concentraciones en Madrid y al rededor de mil profesionales informaron a ciudadanos sobre su situación legal. Posteriormente, en el año 2008, se concentraron estudiantes y profesionales en 30 ciudades de toda España para reclamar regulación de la profesión y de esa misma manera exigieron un trato igualitario a las ingenierías que se encuentran en el Espacio Europeo de Educación Superior -Proceso de Bolonia- y en 2009 se realizo otra concentración en Sevilla y la Coruña.
¿Qué hace un Ingeniero en software?
El Ingeniero en software es un profesional muy buscado. Los desarrolladores que viven en áreas de alta demanda a menudo reciben muchas consultas al mes de reclutadores. Un ingeniero de software aplica el análisis, la matemática y los principios de la informática para diseñar y desarrollar software informático.

Hay diferentes tipos de software que un ingeniero en software puede desarrollar, como:
- Sistemas operativos.
- Juegos de computadora.
- Middleware.
- Aplicaciones comerciales.
- Sistemas de control de red.
Los cambios en la tecnología y las nuevas áreas de especialización hacen que esta profesión evolucione a un ritmo rápido.
Cuando los ingenieros comienzan a trabajar, mayormente van analizar las carencias -necesidades- que le presente el usuario, va a proyectar diseños, realizar pruebas, y por último va a desarrollar el software de la PC para satisfacer esas necesidades planteadas. Son expertos en el sistema informático, estructuración del software y reconocen los limites del hardware.
El proceso es complejo, por lo tanto, el ingeniero hará usos de sus conocimientos para crear diagramas de flujo y algoritmos para indicar a la computadora qué hacer. El cambio de estas instrucciones a un lenguaje codificado informático suele ser responsabilidad de un programador informático.
El Ingeniero en software también debe poseer habilidades interpersonales y ser capaces de comunicarse efectivamente con los usuarios para capacitar, probar y depurar el software hasta el producto final. A menudo participan desde las primeras etapas de la planificación del software hasta las etapas de prueba, desarrollo, capacitación y soporte.

Los ingenieros de software se pueden dividir en dos categorías:
- Ingeniero en software de aplicaciones:
Estos profesionales crean, modifican o hacen adaptaciones en aplicaciones para empresas y organizaciones grandes mediante el análisis de las necesidades del usuario final. Estos van a diseñar, construir, instalarán y mantendrán estas aplicaciones o programas.
- Ingeniero en software de sistemas:
Estos profesionales coordinan la creación, el mantenimiento y el crecimiento de los sistemas informáticos de una empresa u organización. Van a coordinar las necesidades de cada departamento, sugieren dirección técnica y configuran las redes que conectan las PC con la empresa.
Ser un ingeniero de software es una gran elección de carrera para alguien que es excepcionalmente bueno en las habilidades analíticas y habilidades para resolver problemas. El Ingeniero en software es solucionador de problemas instintivos, bueno para trabajar con otros y centrados en ver los problemas hasta su finalización exitosa.
Un ingeniero de software debe estar en conocimiento de:
- Programación y codificación.
- Fundamentos de informática.
- Diseño y arquitectura.
- Algoritmos y estructuras de datos.
- Análisis de información.
- Software de depuración.
- Software de prueba.
¿Qué estudiar para ser Ingeniero de software?
La ingeniería de software es una profesión en constante cambio, una que se adapta a medida que se desarrollan nuevas tecnologías. Debido a su naturaleza cambiante, existen múltiples puntos de entrada a la profesión. Aunque no existe un camino único para convertirse en ingeniero de software.

Completar una educación formal es el primer paso para convertirse en un ingeniero de software. Los futuros estudiantes pueden seleccionar programas de capacitación tanto tradicionales como no tradicionales para obtener la educación necesaria para obtener puestos de nivel de entrada. Algunas opciones incluyen:
- Asociados ( dos Años)
Aunque los empleadores generalmente prefieren candidatos con un título de cuatro años, un título de asociado puede abrir la puerta a trabajos de nivel de entrada en el campo. Los estudiantes pueden optar por especializaciones en varias áreas relacionadas -tecnología de ingeniería de software o la ingeniería de sistemas de software-. El pensum académico se centra en los principios básicos de ingeniería de software, lenguajes de programación y enfoques modernos para el desarrollo de software.
- Licenciatura (cuatro años).
Una licenciatura en ciencias de la computación, o un campo relacionado, es el título mínimo tradicional preferido por los empleadores. Los programas de licenciatura exponen a los estudiantes a un plan de estudios más amplio, uno que proporciona una base en matemáticas y ciencias de la computación. Los estudiantes desarrollan una comprensión integral de la programación, la arquitectura del software y las pruebas de software. También pueden tomar cursos especializados en áreas de aplicación, como redes o sistemas integrados.
- Bootcamp de codificación (8 a 12 semanas).
Los bootcamps de codificación son una ruta educativa relativamente nueva para los aspirantes a ingenieros o desarrolladores de software. Estos programas suelen durar entre ocho y doce semanas, y colocan a los estudiantes en un entorno de aprendizaje inmersivo y práctico. Al graduarse, los estudiantes deben estar listos para carreras de nivel de entrada como ingenieros de software o desarrolladores.
Perfil profesional de un Ingeniero en software
Los ingenieros de software pueden laborar en empresas de todos los tamaños. Las grandes empresas suelen emplear equipos grandes y ofrecen mayores oportunidades donde los ingenieros pueden trabajar en un gran proyecto y pueden administrar equipos de desarrolladores.

En un entorno más pequeño, el papel de un ingeniero de software puede combinarse más completamente con el de un desarrollador. Algunos ingenieros de software pueden trabajar de forma remota, con horarios flexibles y una mínima interacción en persona con los miembros del equipo.
Muchos ingenieros recién graduados comienzan trabajando con profesores, supervisores de pasantías y otros mentores. Los estudiantes también deben aprovechar cualquier servicio profesional que su colegio o universidad pueda ofrecer.
A través de conferencias, juntas de trabajo y foros de miembros, las organizaciones profesionales también brindan acceso a oportunidades de trabajo.
En un campo que cambia rápidamente, los ingenieros de software pueden beneficiarse enormemente de la participación en organizaciones profesionales. La mayoría de las organizaciones ofrecen múltiples formas para que los miembros se mantengan actualizados sobre las tendencias actuales y los cambios en el campo a través de boletines, publicaciones y eventos.
Las organizaciones profesionales también brindan asistencia para el avance profesional, incluidas las bolsas de trabajo y los programas de tutoría. Una de las mejores formas de establecer contactos con colegas en el campo, las organizaciones profesionales ofrecen una gran cantidad de útiles foros en línea, reuniones locales y conferencias anuales.

Habilidades de un Ingeniero en software
Las habilidades se refieren a las competencias prácticas y de enseñanza que un empleado debe desarrollar para calificar para un puesto en particular. Las habilidades para los ingenieros de software incluyen aprender a codificar con lenguajes de programación como Java, SQL y Python.
- Java: El java -lenguaje de programación- produce software en múltiples plataformas sin necesidad de recompilación. El código se ejecuta en casi todos los sistemas operativos, incluidos Mac OS o Windows. Java usa la sintaxis de la programación C y C ++. Los programas operados por el navegador facilitan la GUI y la interacción de los objetos de los usuarios.
- JavaScript: crea secuencias de comandos -por lenguaje de programación- que permite a los usuarios realizar tareas complejas y está incorporado en la mayoría de las páginas web. Este permite a los usuarios actualizar contenido, animar imágenes, operar multimedia y almacenar variables. JavaScript representa una de las tres tecnologías principales de la web.
- SQL: también conocido como lenguaje de consulta estructurado -consultas SQL- actualizaciones, modificaciones, eliminaciones e inserciones de datos. Para lograr esto, utiliza un número establecido de comandos. Este lenguaje informático es estándar para la manipulación de datos y la gestión de bases de datos relacionales. Los profesionales lo usan para administrar datos estructurados donde existen relaciones entre variables y entidades.
- C ++: considerado un -lenguaje de programación- orientado a objetos y de propósito general, C ++ utiliza lenguaje de bajo y alto nivel. Dado que prácticamente todas las computadoras contienen C ++, los ingenieros de software deben comprender este lenguaje. C ++ abarca la mayoría de los programas en C sin cambiar la línea del código fuente. C ++ manipula principalmente texto, números y otras tareas con capacidad de computadora.
- C #: desarrollado inicialmente para Microsoft, este -lenguaje de programación- es altamente expresivo y es más simple en comparación con otros lenguajes, pero incluye componentes de C ++ y Java. Los tipos y métodos genéricos proporcionan seguridad adicional y un mayor rendimiento. C # también permite a los profesionales definir el comportamiento de iteración, al tiempo que admite la encapsulación, el polimorfismo y la herencia.
- Python: este es -lenguaje de programación- de alto nivel contiene semántica dinámica, estructuras, mecanografía y enlace que conectan los componentes existentes; sin embargo, la sintaxis de Python es fácil de aprender, ya que no requiere una etapa de compilación, lo que reduce el mantenimiento del programa y mejora la productividad. Python también admite el uso de módulos y paquetes, lo que permite a los ingenieros usar el lenguaje para diversos proyectos.
Los lenguajes de programación comprenden el día a día de un ingeniero en software, con casi tantas opciones para explorar como posibilidades de trabajo.
Los ejemplos incluyen Ruby, un lenguaje orientado a objetos que funciona en bloques; Rust, que se integra con otros idiomas para el desarrollo de aplicaciones; PHP, un script de desarrollo web que se integra con HTML; y Swift, que puede programar aplicaciones para todos los productos de Apple.
Actividades laborales del Ingeniero en software
En sus actividades diarias, deben aplicar todas las habilidades técnicas como el lenguajes de programación ya que son esenciales. Deben tener también:
- Comunicación: Ya sea para informar el progreso a un supervisor, explicar un producto a un cliente o coordinarse con los miembros del equipo para trabajar en el mismo producto, los ingenieros de software deben ser expertos en comunicarse por correo electrónico, teléfono y reuniones en persona.
- Multitarea: el desarrollo de software puede requerir que los ingenieros dividan la atención en diferentes módulos del mismo proyecto, o que cambien fácilmente entre proyectos cuando trabajan en una fecha límite o satisfacen las necesidades del equipo.
- Organización: para manejar múltiples proyectos a través de sus diversas etapas y realizar un seguimiento de los detalles, los ingenieros de software deben demostrar un cierto nivel de organización. Los supervisores ocupados supervisan equipos completos y necesitan acceder a la información de manera eficiente a pedido del cliente.
- Atención al detalle: la concentración desempeña un papel fundamental para los ingenieros de software. Deben solucionar problemas de codificación y errores a medida que surgen, y realizar un seguimiento de una gran cantidad de detalles complejos que rodean múltiples proyectos en curso.

Dependiendo de la posición particular, las responsabilidades diarias pueden variar. Pueden consultar con clientes o ejecutivos para comenzar el desarrollo de un proyecto, diseñando programas que cumplan con esas expectativas.
Reúnen cuadros y diagramas para la representación visual del software, escriben códigos ellos mismos además de supervisar a un equipo de programadores. También ejecutan pruebas y corrigen problemas que pueden ocurrir con los programas que han diseñado.
Ingeniería de software
La ingeniería de software puede considerarse como la creación de nuevos productos y herramientas mediante el uso de principios, conocimientos y herramientas relacionadas con el software en beneficio de la humanidad. Es una ciencia que trata sistemática, descriptiva y cuantitativamente con todo el ciclo de vida.
Objetivos
El profundo conocimiento de la informática, tanto teórico como práctico, forma la base de la ingeniería de software. El conocimiento teórico proporciona una comprensión de qué problemas se pueden resolver, qué estructuras de datos y algoritmos son apropiados, cuándo y cómo se van a utilizar, etc.
Por otro lado, el conocimiento práctico proporciona una comprensión de cómo funciona el hardware, cómo utilizar el poder de los lenguajes y herramientas de programación al desarrollar software, etc.

Uno de los objetivos principales de la ingeniería de software es ayudar a los desarrolladores a obtener software de alta calidad. Esta calidad se logra mediante el uso de la Gestión de calidad total -Total Quality Management (TQM)- que permite la mejora continua del proceso personalizado que conduce al desarrollo de enfoques más establecidos.
Recursos
Todos los elementos utilizados para desarrollar un producto de software pueden asumirse como recursos para ese proyecto. Esto puede incluir recursos humanos, herramientas productivas y bibliotecas de software.
Los recursos suelen estar disponibles en cantidad limitada y deben permanecen organizados como un conjunto de activos. La escasez de recursos dificulta el desarrollo del proyecto y puede retrasarse con respecto al cronograma. La asignación de recursos adicionales aumenta el valor de desarrollo al final. Por lo tanto, es necesario estimar y asignar recursos adecuados para el proyecto.
Metodología
La ingeniería de software se ve comúnmente como significativo para la programación. Aunque la programación es una parte importante del desarrollo de software, también incluye otras actividades, como la administración. El llamado modelo Scrum, que se utiliza principalmente en el desarrollo de software Agile, define tres roles:
- Propietario del producto: reúne y clasifica los requisitos por prioridad.
- Scrum Master: es responsable de la gestión y media entre las partes individuales.
- Equipo: los desarrolladores de software y otros roles en una agencia.

A continuación, te mostramos las etapas del proceso:
Obtención de requisitos
La obtención de requisitos es necesario para el éxito o el fracaso de un proyecto de sistemas o software. Los requisitos deben ser documentados, accionables, medibles, comprobables, rastreables, relacionados con las necesidades u oportunidades comerciales identificadas, y definidos con un nivel de detalle suficiente para el diseño del sistema.
Conceptualmente, la obtención de requisitos incluye tres tipos de actividades:
- Obtención de requisitos: (por ejemplo, el estatuto o la definición del proyecto), la documentación del proceso comercial y las entrevistas con las partes interesadas. Esto a veces también se denomina recopilación de requisitos o descubrimiento de requisitos.
- Requisitos de grabación: se pueden registrar en varias formas, que generalmente incluyen una lista resumida y pueden incluir:
- Lenguaje natural.
- Casos de uso.
- Historias de usuarios.
- Especificaciones de procesos.
- Una variedad de modelos, incluidos modelos de datos.
Análisis de requisitos
Determinar si los requisitos establecidos son claros, completos, no duplicados, concisos, válidos, consistentes y sin ambigüedades, y resolver cualquier conflicto aparente. El análisis también puede incluir requisitos de tamaño.
El análisis de requisitos puede ser un proceso largo y agotador durante el cual intervienen muchas habilidades psicológicas delicadas. Los sistemas grandes pueden confrontar a los analistas con cientos o miles de requisitos del sistema.

Especificación
Es un documento creado por el analista de sistemas después de que se recopilan los requisitos de varios interesados.
Define cómo va a:
- Interactuar el software previsto con el hardware.
- Las interfaces externas.
- La velocidad de operación.
- El tiempo de respuesta del sistema.
- La portabilidad del software en varias plataformas.
- La capacidad de mantenimiento.
- La velocidad de recuperación después de un bloqueo.
- la seguridad.
- La calidad.
- Las limitaciones.
Diseño de software
La fase de diseño del desarrollo de software trata de transformar los requisitos del cliente como se describe en los documentos SRS en una forma implementable utilizando un lenguaje de programación.
El proceso de diseño de software se puede dividir en los siguientes tres niveles de fases de diseño:
- Diseño de interfaz:
El -diseño de interfaz- es la especificación de la interacción entre un sistema y su entorno. Esta fase avanza a un alto nivel de abstracción con respecto al funcionamiento interno del sistema, es decir, durante el diseño de la interfaz, el sistema interno se ignora por completo y el sistema lo trata como una caja negra.La atención se centra en el diálogo entre el sistema de destino y los usuarios, dispositivos y otros sistemas con los que interactúa. La declaración del problema de diseño producida durante el paso de análisis debe identificar a las personas, otros sistemas y dispositivos que se denominan colectivamente agentes.El diseño de la interfaz debe incluir los siguientes detalles:- Descripción precisa de eventos en el entorno o mensajes de agentes a los que el sistema debe responder.
- Descripción precisa de los eventos o mensajes que debe producir el sistema.
- Especificación sobre los datos y los formatos de los datos que entran y salen del sistema.
- Especificación de las relaciones de orden y temporización entre eventos o mensajes entrantes y eventos o mensajes salientes.
- Diseño arquitectónico:
El -diseño arquitectónico- es la especificación de los componentes principales de un sistema, sus responsabilidades, propiedades, interfaces y las relaciones e interacciones entre ellos. En este diseño se elige la estructura general del sistema, pero se ignoran los detalles internos de los componentes principales.Los problemas en el diseño arquitectónico incluyen:- Descomposición gruesa de los sistemas en componentes principales.
- Asignación de responsabilidades funcionales a los componentes.
- Interfaces de componentes.
- Propiedades de escalamiento y rendimiento de componentes, propiedades de consumo de recursos, propiedades de confiabilidad, etc.
- Comunicación e interacción entre componentes.
El diseño arquitectónico agrega detalles importantes ignorados durante el diseño de la interfaz. El diseño de los componentes internos de los componentes principales se ignora hasta la última fase del diseño.
- Diseño detallado:
El -diseño detallad-o es la especificación de los elementos internos de todos los componentes principales del sistema, sus propiedades, relaciones, procesamiento y, a menudo, sus algoritmos y las estructuras de datos.El diseño detallado puede incluir:- Descomposición de los principales componentes del sistema en unidades de programa.
- Asignación de responsabilidades funcionales a las unidades.
- Interfaces de usuario.
- Estados de la unidad y cambios de estado.
- Interacción de datos y control entre unidades.
- Empaquetado e implementación de datos, incluyendo problemas de alcance y visibilidad de los elementos del programa.
- Algoritmos y estructuras de datos.

Arquitectura de software
Una parte del desarrollo de software que no debe subestimarse es el diseño de software. Se trata del diseño óptico y la cuestión de cómo debe verse la superficie, es decir, la interfaz de usuario, con los elementos de entrada y control correspondientes.
Los llamados wireframes, también conocidos desde el campo del diseño web, ayudan aquí, en los que la estructura del software está representada gráficamente.
Pruebas de software
Es un proceso de ejecución de un programa con el objetivo de encontrar errores. Para que nuestro software funcione bien, debe estar libre de errores. Si la prueba se realiza con éxito, eliminará todos los errores del software.
Los principios de las pruebas de software son:
- Todas las pruebas deben cumplir con los requisitos del cliente.
- Las pruebas exhaustivas no son posibles, ya se necesita la cantidad óptima de pruebas basadas en la evaluación de riesgos de la aplicación.
- Todas las pruebas a realizar deben planificarse antes de implementarlo
Se debe seguir la regla de pareto (regla 80/20) que establece que el 80% de los errores proviene del 20% de los componentes del programa. - Se debe probar con piezas pequeñas y extiéndalo a piezas grandes.
Implementación de software
La implementación del software comienza con el esfuerzo de la fabricación del software, esta implica diseño programático, edición o programación de código fuente y pruebas de cada unidad de software. Se supone que cada unidad de software es adecuada para su propósito o rol previsto en el contexto arquitectónico general.
El resultado de la fabricación del software debe ser una unidad documentada de código fuente que se haya probado con respecto a su especificación de unidad estructural. Este código fuente (unidad de software) está disponible para ser ensamblado, integrado y compilado con otros elementos de software fabricados para crear componentes de software más grandes.
Estos componentes de software integrados se prueban según las especificaciones de los componentes estructurales para garantizar su corrección y modificación.
Documentación de software
Es una parte importante del proceso. Un documento bien escrito proporciona una gran herramienta y un medio de repositorio de información necesaria. También proporciona información sobre cómo usar el producto.
Una documentación bien mantenida debe incluir los siguientes documentos:
- Documentación de requisitos: esta documentación funciona como una herramienta clave para que el diseñador de software, el desarrollador y el equipo de prueba realicen sus tareas respectivas. Este documento contiene toda la descripción funcional, no funcional y de comportamiento del software previsto.
La fuente de este documento puede ser datos previamente almacenados sobre el software, que ya están ejecutando software al final del cliente, la entrevista, los cuestionarios y la investigación del cliente. En general, se almacena en forma de hoja de cálculo o documento de procesamiento de texto con el equipo de gestión de software de alta gama.
- Documentación de diseño de software: estas documentaciones contienen toda la información necesaria, necesaria para construir el software. Contiene:
- Arquitectura de software de alto nivel.
- Detalles de diseño de software.
- Diagramas de flujo de datos.
- Diseño de base de datos
Aunque estos documentos no brindan detalles sobre cómo codificar el programa, brindan toda la información necesaria que se requiere para la codificación y la implementación.

- Documentación técnica: los desarrolladores y los codificadores reales mantienen estas documentaciones. Estos documentos, en su conjunto, representan información sobre el código. Mientras escriben el código, los programadores también mencionan el objetivo del código, quién lo escribió, dónde se requerirá, qué hace y cómo lo hace, qué otros recursos usa el código, etc.
La documentación técnica aumenta la comprensión entre varios programadores que trabajan en el mismo código. Mejora la capacidad de reutilización del código. Hace que la depuración sea fácil y rastreable.
- Documentación del usuario: esta documentación es diferente de todo lo explicado anteriormente. Explica cómo debería funcionar el producto de software y cómo debería utilizarse para obtener los resultados deseados. Estas documentaciones pueden incluir procedimientos de instalación de software, guías prácticas, guías de usuario, método de desinstalación y referencias especiales para obtener más información, como actualización de licencias, etc.
Mantenimiento de software
Forma parte del ciclo de vida del desarrollo de software. Su objetivo principal es modificar y actualizar la aplicación de software después que ha sido entregado para corregir errores y mejorar el rendimiento. El software es un modelo del mundo real. Cuando el mundo real cambia, el software requiere modificaciones siempre que sea posible.
El software debe realizarse para:
- Corregir fallas o errores.
- Mejora el diseño.
- Implementar mejoras.
- Interfaz con otros sistemas.
- Acomodar programas para que se puedan utilizar en diferentes hardware, software.
- Nuevas características del sistema e instalaciones de telecomunicaciones.
- Migrar software heredado.
- Retirar el software.

Modelo de desarrollo del software
Los modelos de ciclo de vida de desarrollo de software (SDLC) muestran las formas de navegar a través del complejo y exigente proceso de creación de software. La calidad, los plazos, el presupuesto y la capacidad de un proyecto para cumplir con las expectativas de las partes interesadas dependen en gran medida del modelo elegido.
Todos los modelos SDLC se pueden estructurar en varios grupos dependiendo de cómo aborden la organización del flujo de trabajo, lineal o iterativamente, y qué tipo de relaciones se establecen entre el equipo de desarrollo y el cliente.
Hoy en día hay más de 50 modelos SDLC reconocidos en uso. Ninguno de ellos es perfecto, y cada uno trae sus aspectos favorables y desventajas para un proyecto de desarrollo de software específico o para un equipo. A continuación, se le van a nombrar los ocho modelos más populares para analizar su esencia y comparar las características principales.
Modelo Cascada
A través de todas las etapas de desarrollo (análisis, diseño, codificación, prueba, implementación), el proceso se mueve en modo cascada. Cada etapa tiene resultados concretos y está estrictamente documentada. La siguiente etapa no puede comenzar antes de que la anterior se complete por completo.
Así, por ejemplo, los requisitos de software no pueden reevaluarse más en el desarrollo. Tampoco existe la capacidad de ver y probar el software hasta que finaliza la última etapa de desarrollo, lo que resulta en altos riesgos del proyecto y resultados impredecibles del proyecto. Las pruebas a menudo son apresuradas y los errores son costosos de solucionar.

Casos de uso:
- Proyectos simples pequeños o medianos con requisitos claramente definidos e inmutables (desarrollo de sitios web para pequeñas empresas).
- Proyectos con la necesidad de un control más estricto, presupuesto y plazos predecibles (por ejemplo, proyectos gubernamentales).
- Proyectos que deben cumplir con múltiples reglas y regulaciones (proyectos de atención médica).
- Proyectos en los que se utiliza una pila tecnológica y herramientas conocidas.
Modelo V (modelo de validación y verificación)
El modelo V es otro modelo lineal con cada etapa que tiene una actividad de prueba correspondiente. Tal organización de flujo de trabajo implica un control de calidad excepcional, pero al mismo tiempo, hace que el modelo V sea uno de los modelos más caros y que consumen más tiempo.
Además, aunque los errores en las especificaciones de requisitos, los errores de código y arquitectura pueden detectarse temprano, los cambios durante el desarrollo siguen siendo costosos y difíciles de implementar. Como en el caso de la Cascada, todos los requisitos se recopilan al inicio y no se pueden cambiar.
Casos de uso:
- Proyectos donde las fallas y los tiempos de inactividad son inaceptables (por ejemplo, software médico, software de gestión de flotas de aviación).
Modelo incremental e iterativo
El proceso de desarrollo basado en el modelo incremental se divide en varias iteraciones (se requiere un diseño de software modular «estilo Lego»). Se agregan nuevos módulos de software en cada iteración con poco o ningún cambio en los módulos agregados anteriormente.

El proceso de desarrollo puede ir secuencialmente o en paralelo. El desarrollo paralelo se suma a la velocidad de entrega, mientras que muchos ciclos repetidos de desarrollo secuencial pueden hacer que el proyecto sea largo y costoso.
Con el desarrollo iterativo, el software cambia en cada iteración, evoluciona y crece. A medida que cada iteración se basa en la anterior, el diseño del software permanece consistente.
Los requisitos no pueden cambiar radicalmente puesto que los principales deben definirse al principio, especialmente aquellos para el diseño del sistema en caso de desarrollo del modelo incremental, ya que una mayor integración de las partes de software entregadas puede convertirse en un problema.
Este modelo SDLC generalmente implica cierta participación del cliente debido a la posible necesidad de pequeñas modificaciones de requisitos durante el proceso de desarrollo.
Casos de uso:
- Grandes aplicaciones empresariales de misión crítica que preferiblemente consisten en partes sueltas, como microservicios o servicios web.

Modelo espiral
El modelo espiral se centra en una evaluación exhaustiva del riesgo. Por lo tanto, para aprovechar al máximo los beneficios del modelo, deberá involucrar a las personas con una sólida formación en evaluación de riesgos.
Una iteración en espiral típica dura alrededor de 6 meses y comienza con 4 actividades importantes:
- Planificación exhaustiva.
- Análisis de riesgos.
- Creación de prototipos
- Evaluación de la parte entregada anteriormente.
Los ciclos espirales repetidos extienden seriamente los plazos del proyecto.
Este es el modelo donde aparece la participación intensiva del cliente. Pueden participar en las etapas de exploración y revisión de cada ciclo. En la etapa de desarrollo, las enmiendas del cliente no son aceptables.
Casos de uso:
- Proyectos con necesidades comerciales poco claras o requisitos demasiado ambiciosos / innovadores.
- Proyectos que son grandes y complicados.
- Actividad de investigación y desarrollo (I + D) o la introducción de un nuevo servicio o producto.
El proceso unificado racional (RUP)
El proceso unificado racional llamado comúnmente -Rational Unified Process (RUP)- también es una combinación de marcos lineales e iterativos.
El modelo divide el proceso de desarrollo de software en 4 fases:
- Inicio.
- Elaboración.
- Construcción.
- Transición.
RUP ayuda a construir soluciones estables y, al mismo tiempo, flexibles, pero aún así, este modelo no es tan rápido y adaptable como el grupo Agile puro (Scrum, Kanban, XP, etc.). El grado de participación del cliente, la intensidad de la documentación y la duración de la iteración pueden variar según las necesidades del proyecto.
Casos de uso:
- Proyectos grandes y de alto riesgo, especialmente, desarrollo basado en casos de uso y desarrollo rápido de software de alta calidad.
Modelo del grupo Agile
El resto de los modelos SDLC están bajo el paraguas de Agile. Hoy en día, más del 70% de las organizaciones emplean este o aquel enfoque Agile en sus proyectos de TI. En general, en el corazón de Agile se encuentran el desarrollo iterativo, la comunicación intensiva y la retroalimentación temprana de los clientes.

Cada iteración ágil generalmente lleva varias semanas y ofrece una versión completa del software de trabajo. Los modelos de este grupo se centran más en entregar una parte funcional de la aplicación rápidamente. Prestan menos atención a la documentación detallada del software (especificación detallada de requisitos, descripción detallada de la arquitectura) y más a las actividades de prueba de software.
Esto fomenta el desarrollo rápido, pero prolonga considerablemente la transferencia de software al equipo de soporte y hace que su mantenimiento sea más complicado, ya que se dedica más tiempo a encontrar el problema cuando no hay una descripción detallada del software.
Agile se trata de trabajar en estrecha colaboración tanto en todo el equipo como con los clientes. Al final de cada iteración, las partes interesadas revisan el progreso del desarrollo y reevalúan la prioridad de las tareas para la iteración futura para aumentar el retorno de la inversión (ROI) y garantizar la alineación con las necesidades del usuario y los objetivos comerciales.
En consecuencia, los lanzamientos frecuentes son característicos de los modelos Agile. También permiten la mejora continua del software con soluciones y cambios fáciles, actualizaciones rápidas y funciones adicionales, y ayudan a entregar aplicaciones que satisfagan mejor las necesidades de los usuarios.
Sin embargo, la falta de planificación detallada y la apertura a los cambios dificultan la estimación precisa del presupuesto, el tiempo y las personas necesarias para el proyecto.

Casos de uso:
- Prácticamente cualquier iniciativa de inicio, cuando se requiere la retroalimentación temprana de los usuarios finales.
- La mayoría de los proyectos medianos en desarrollo de software personalizado donde los requisitos comerciales no se pueden traducir con confianza a requisitos detallados de software.
- Grandes proyectos que son fáciles de dividir en pequeñas partes funcionales y se pueden desarrollar de forma incremental a lo largo de cada iteración.
Agile viene en diferentes presentaciones. Hoy, sus subtipos más comunes son Scrum, Extreme Programming y Kanban.
Scrum
Scrum es probablemente el modelo Agile más popular. Las iteraciones (‘sprints’) suelen durar de 2 a 4 semanas y están precedidas de una planificación exhaustiva y una evaluación previa del sprint. No se permiten cambios después de que se hayan definido las actividades de sprint.
Extreme Programming (XP)
Con Extreme Programming (XP), una iteración típica dura de 1 a 2 semanas. El modelo permite introducir cambios incluso después del lanzamiento de la iteración si el equipo aún no ha comenzado a trabajar con la pieza de software relevante. Tal flexibilidad complica significativamente la entrega de software de calidad.
Para mitigar el problema, se requiere el uso de programación de pares, desarrollo basado en pruebas y automatización de pruebas, integración continua -CI- lanzamientos pequeños, diseño de software simple y prescripciones para seguir los estándares de codificación.

Kanban
En cuanto a Kanban, su característica distintiva clave es la ausencia de iteraciones pronunciadas. Si se usan, se mantienen extremadamente cortos (‘sprints diarios’). En cambio, se pone énfasis en la visualización del plan. El equipo utiliza la herramienta Kanban Board que proporciona una representación clara de todas las actividades del proyecto, su número, personas responsables y progreso.
Tal mayor transparencia ayuda a estimar las tareas más urgentes con mayor precisión. Además, el modelo no tiene una etapa de planificación separada, por lo que se puede introducir una nueva solicitud de cambio en cualquier momento.
La comunicación con el cliente es continua, pueden verificar los resultados del trabajo cuando lo deseen, y las reuniones con el equipo del proyecto pueden ocurrir incluso a diario. Debido a su naturaleza, el modelo se usa con frecuencia en proyectos de soporte y evolución de software.
Naturaleza de la ingeniería de software
Para comprender la naturaleza de la ingeniería de software, es útil comprender la naturaleza de la ingeniería en general.
La ingeniería tiene sus raíces en dos actividades humanas importantes: ciencias y artesanías. Las siguientes dos secciones describen la naturaleza de estas actividades. La siguiente sección describe la naturaleza de la ingeniería en términos de sus relaciones conceptuales con las ciencias y la artesanía. La última sección analiza las características de la ingeniería de software que no son comunes a todas las disciplinas de ingeniería.

Ciencias
Una ciencia es un cuerpo de conocimiento causal sobre un tema, organizado en teorías. Las teorías proporcionan explicaciones de las relaciones entre las características de los objetos cubiertos por el tema y el comportamiento de esos objetos.
La comprensión científica comienza con una comprensión de cómo se comportan las cosas. Más tarde, una ciencia se centra más en por qué se comportan como lo hacen. En algunas áreas de la ciencia, esta comprensión se puede utilizar para predecir el comportamiento, lo que lleva a un valor utilitario para la ciencia. Sin embargo, una ciencia bien desarrollada tiene un núcleo que se preocupa por comprender por sí mismo.
La mente humana no maneja bien una gran colección de hechos. Para satisfacer las necesidades humanas, los hechos deben organizarse en teorías, con una sola teoría que abarque y explique una gran cantidad de hechos. A menudo, una buena explicación requiere nuevos conceptos. Aunque nuestra percepción es la fuente principal de conocimiento, los conceptos perceptivos primitivos pueden ser solo indicaciones indirectas de factores que causan cambios. Los nuevos conceptos identifican esos factores.
La mayoría de las ciencias intentan cuantificar los conceptos relevantes si es práctico. En algunas ciencias bien desarrolladas, como la física y la química, la cuantificación juega un papel central, lo que resulta en una teoría matemática en el corazón de la ciencia. En algunas áreas de la ciencia, como la teoría de la evolución en biología, la medición no siempre es práctica y la teoría matemática no está muy bien desarrollada.
Practicar una ciencia es un esfuerzo creativo. La creatividad es una cualidad importante que distingue a los científicos expertos de los científicos promedio. Se necesita imaginación para reunir los hechos de una manera que tenga sentido. Se necesita imaginación para desarrollar conceptos que tengan poder explicativo.

Artesanía
Una artesanía está concebida con la producción de un tipo de producto. En algunos casos, un artesano también se preocupa por el mantenimiento de los productos. Como una ciencia, un oficio implica un cuerpo de conocimiento. En parte, el conocimiento se refiere al comportamiento de los productos y sus componentes.
Además, un oficio requiere el desarrollo de herramientas y técnicas involucradas en la producción. Esto implica un segundo tipo de conocimiento. Este es el «saber hacer» de un oficio: habilidades involucradas en el uso de las herramientas y técnicas.
Finalmente, un producto se produce por su valor. El valor de un producto puede ser estético, se valora como un fin en sí mismo o puede ser utilitario, es un medio para otro fin. En cualquier caso, practicar un oficio requiere un conocimiento de valores y medios para lograrlos. Sin embargo, el conocimiento por sí solo no garantiza el logro del valor. Se necesita práctica para desarrollar hábitos en el uso de las herramientas y técnicas.
Estos hábitos automatizan parcialmente el logro de valor, liberando la mente para lidiar con problemas más complejos que puedan surgir. El conocimiento de los valores junto con los hábitos practicados conforman la ética de trabajo de un oficio.
Como en la ciencia, la cuantificación puede ser importante en un oficio. La cuantificación de las propiedades físicas de las materias primas puede ser esencial en la construcción de un producto terminado. Sin embargo, generalmente no se necesita una teoría matemática completa.
Al igual que en la ciencia, practicar un oficio es un esfuerzo creativo, y la creatividad es una cualidad importante que distingue a los profesionales expertos de los profesionales promedio. Se necesita imaginación para juntar las materias primas de nuevas maneras para crear un producto de valor. Se necesita imaginación para usar herramientas y técnicas de nuevas maneras para mejorar el valor del producto.
Ingeniería
Conceptualmente, las disciplinas de ingeniería surgen de la artesanía a medida que sus bases de conocimiento evolucionan hacia las ciencias. Las razones y el impacto de esta evolución se describen en esta sección. La presentación no pretende ser históricamente correcta.
Es aproximadamente correcto para la ingeniería civil, pero otras disciplinas de ingeniería varían considerablemente del patrón. A pesar de las diferencias históricas, diferentes disciplinas de ingeniería abordan problemas similares y esos problemas tienen un efecto similar en el resultado final.
Si un artesano está produciendo un producto utilitario, entonces existe una demanda de mayor funcionalidad del producto, mayor calidad en el producto y mayores cantidades del producto. Satisfacer estas demandas resulta en una mayor complejidad en el producto, en el proceso de producción, o en ambos. Para hacer frente a las mayores demandas y la mayor complejidad, una nave debe cambiar de tres maneras importantes.
En primer lugar, en las primeras etapas de desarrollo de un oficio, es fundamental comprender cómo se comportan las cosas; entender por qué es de importancia secundaria. Con productos y procesos de producción más complejos, solo saber cómo se comportan las cosas no es suficiente.

También hay una mayor necesidad de comprender las relaciones causales: las respuestas a las preguntas de «por qué». Las respuestas a estas preguntas a menudo tienen un poder predictivo que es esencial para desarrollar nuevas técnicas y metodologías de diseño y producción. Cuando el conocimiento sobre el comportamiento del producto y sus componentes está bien desarrollado, se convierte en una ciencia.
En segundo lugar, la producción de productos con mayor funcionalidad o mayor calidad requiere una mayor comprensión de los valores.
Esto lleva a una teoría del valor que se ocupa de los factores involucrados en la calidad de un producto, medios para cuantificar los factores, conceptos que identifican las características controlables de un producto que afectan su calidad y principios que centran la atención en cuestiones importantes de diseño de productos relacionados con el valor.
La ética del trabajo se ocupa de cuestiones causales más profundas: causas que afectan el valor. Cuando la ética de trabajo del oficio está bien desarrollada, también se convierte en una ciencia.
Tercero, la producción de productos complejos, grandes cantidades de productos y productos más funcionales requieren una gran cantidad de planificación. Cuando el producto es complejo o tiene una mayor funcionalidad, la planificación se centra en el diseño del producto.

Cuando se producen grandes cantidades de un producto, la planificación se centra en diseñar un proceso de producción. En algunos casos, se necesita un esfuerzo significativo para diseñar tanto el producto como su proceso de producción. La magnitud de este esfuerzo puede requerir que las personas involucradas desarrollen habilidades especializadas.
Algunos continúan con la producción real, otros están involucrados en el diseño de productos y procesos de producción. Aquellos que participan en el diseño se convierten en parte de una nueva disciplina: una disciplina de ingeniería.
Una disciplina de ingeniería se basa en las mismas bases de conocimiento que un oficio, pero han madurado en ciencias. Una disciplina de ingeniería también tiene herramientas y técnicas al igual que un oficio. Sin embargo, estas herramientas y técnicas se desarrollan dentro de la disciplina de ingeniería más como ayudas para el diseño que como producción.
Como en un oficio, se necesita práctica para desarrollar hábitos en su uso. La automatización parcial del logro de los valores es aún más importante porque un ingeniero tiene problemas más complejos con los que lidiar. El conocimiento de los valores junto con los hábitos practicados conforman la ética de trabajo de una disciplina de ingeniería.
La producción de productos complejos agrega otra nueva dimensión a la tarea de un ingeniero. La producción de productos complejos requiere el uso de equipos de ingenieros para hacer el diseño. Cuando se trata con mucha gente, es importante tener un proceso de diseño bien definido.

También es importante tener una estructura de gestión para guiar a las personas a través del proceso, identificar los riesgos involucrados y asignar los recursos necesarios. Para gestionar de manera efectiva, los gerentes deben comprender la disciplina de la ingeniería.
Los gerentes de un proceso de diseño son generalmente ingenieros con experiencia sustancial en diseño. Para preparar a los ingenieros para este rol, la administración es una parte importante de la educación en ingeniería.
Ingeniería: software
Parte de la naturaleza de la ingeniería de software está implícita en su clasificación como disciplina de ingeniería. Esta sección discute algunas de sus características y problemas únicos. La singularidad aquí no implica que las características y los problemas no se puedan encontrar en otras disciplinas de ingeniería. Solo significa que no son comunes a todas las disciplinas de ingeniería, o significativamente más importantes en ingeniería de software.
Las diversas disciplinas de ingeniería se distinguen por el tipo de producto y/o el tipo de componentes que forman la materia prima para el producto. La ingeniería de software se caracteriza por su producto principal, que es el software: programas que dirigen a una computadora para realizar alguna tarea.
En esta rama de la ingeniería, existe una ciencia bien desarrollada, informática, que cubre, entre otras cosas, conceptos de:
- Lenguajes de programación.
- Algoritmos.
- Estructuras de datos.

También desarrolla aspectos importantes de sistemas de:
- Hardware de sistemas.
- Software de sistemas.
Muchas de las áreas temáticas de informática tratan con productos de software. Debido a esto, la frontera entre la informática y la ingeniería de software es difícil de definir. En particular, los valores de la ingeniería de software son un elemento importante de la informática.
En algunas disciplinas de ingeniería donde la producción en grandes cantidades es un objetivo, las cantidades introducen una gran complejidad en el proceso de producción. Reproducir software es relativamente fácil, una vez que ha sido diseñado.
Los problemas de ingeniería que surgen también son de una naturaleza muy diferente a los problemas de diseño de software. Son problemas manejados por otras disciplinas de ingeniería. La ingeniería de software se ocupa casi exclusivamente del diseño del producto y no del proceso de producción.
Aunque hay una categoría clara que describe el producto de la ingeniería de software, la funcionalidad de ese producto es extremadamente amplia. Una indicación de esto es el hecho de que cualquier proceso de ingeniería podría automatizarse para que se convierta, en parte, en un proyecto de ingeniería de software.

De manera más general, el software se puede aplicar a la automatización de cualquier tarea humana, y esto tiene dos consecuencias importantes.
Primero, no existe un dominio único de conocimiento que cubra el comportamiento de todos los productos de software. La ingeniería de software no tiene un solo cuerpo de teoría que nos diga cómo especificar y medir el comportamiento de sus productos. La informática trata con los componentes del software y algunas de las herramientas y técnicas involucradas en su construcción, pero no trata y no puede tratar con todos los tipos de comportamiento exhibidos por el software.
En segundo lugar, los valores de la ingeniería de software están dirigidos por clientes que tienen una gama ilimitada de necesidades. Una clasificación de la amplia gama de valores es una tarea prácticamente imposible. Incluso donde hay valores comunes, varían considerablemente en importancia. Un valor que no es importante en un producto de software puede ser crucial en otro. Por estas razones, el lado ético y orientado al valor de la ingeniería de software adquiere un papel más destacado.
La amplia variedad de funcionalidades y valores de software puede tratarse de tres maneras:
Primero, los ingenieros de software pueden especializarse y hasta cierto punto, esto ya ha sucedido. Hay algunas empresas de desarrollo de software, por ejemplo, que se especializan en software de negocios y contabilidad.
Un modo más común de especialización es el desarrollo interno de software. Una empresa que usa mucho software a menudo tendrá un departamento dedicado al desarrollo de software. Los ingenieros de software que trabajan en ese departamento desarrollarán automáticamente una especialización adaptada a las necesidades de la empresa.
Segundo, hay que tomar en cuenta que hay numerosas áreas donde la demanda no garantiza una especialización, por lo que se pude decir que hay personas capacitadas en el área de aplicación que desarrollan habilidades de programación.
Esta es una opción viable para software relativamente simple. Para un software más complejo, la pérdida en la comprensión de la construcción del software puede ser mayor que la ventaja de estar familiarizado con el dominio de la aplicación.
Tercero, una solución más general al problema es modificar el proceso de desarrollo de software. La idea básica es asignar una cantidad significativa de tiempo temprano en el desarrollo del análisis de dominio. El análisis de dominio implica comunicarse con expertos en el área de aplicación, observando conceptos importantes y sus relaciones.
Durante el análisis de dominio, los desarrolladores de software crean un modelo de dominio que se puede convertir fácilmente en software. Otro cambio importante en el proceso consiste en construir el producto en etapas y obtener comentarios del cliente sobre las versiones preliminares.
Mantenimiento
A diferencia de otras disciplinas de ingeniería, en ingeniería de software, el mantenimiento no se ocupa principalmente del deterioro de un producto con el tiempo. En cambio, su objetivo es mejorar el software. Existen tres tipos generales de mantenimiento de software, definidos por los tipos de mejoras.

- Correctivo: modificaciones de software que corrigen defectos.
- Perfectivo: modificaciones de software que agregan un nuevo comportamiento, modifican el comportamiento anterior para que sea más adecuado para los usuarios o modifican la estructura para simplificar el mantenimiento futuro (refactorización).
- Adaptativo: modificaciones de software que apuntan a la adaptación para plataformas nuevas o modificadas.
El bajo costo de la reproducción e instalación del software hace que sea práctico desarrollar software que se actualice continuamente mientras está en uso. Se ha estimado que el ochenta por ciento (80%) del esfuerzo de desarrollo de software está relacionado con el mantenimiento. Esta cifra refleja el esfuerzo general, incluido el software fallido. Para un software exitoso con una larga historia, la cifra se acerca al cien por ciento (100%).
Dado que gran parte del esfuerzo de desarrollo exitoso está involucrado en el mantenimiento, los intereses de los desarrolladores pesan mucho en los valores del software. Algunos de los efectos se enumeran a continuación.
- Es más importante documentar el diseño del software además de su uso. Con un diseño mal documentado, los encargados del mantenimiento del software pasarán mucho más tiempo estudiando el software existente antes de realizar cambios. Trabajar con aspectos de diseño no documentados también puede introducir nuevos errores.
- Es más importante gastar un esfuerzo -extra- en la creación de software y procesos de prueba para ser guardados para su posterior reutilización después del mantenimiento.
El Ingeniero en software se han centrado recientemente en una técnica importante llamada refactoring -refactorización- y esta se refiere a cambios en el software que no cambian su funcionalidad. Los cambios se realizan con el fin de simplificar el mantenimiento futuro. Después de un mantenimiento de refactoring, el software de prueba original se puede reutilizar sin modificaciones.

- Es más importante estructurar el diseño para que los cambios futuros se puedan hacer más fácilmente. La complejidad y la naturaleza de las interacciones entre componentes es la consideración más importante. Los conceptos -acoplamiento y cohesión- están destinados a tratar este problema.
Uno de los desarrollos recientes más importantes en ingeniería de software se refiere a patrones de diseño. Gran parte del esfuerzo en los patrones de diseño es el análisis de los motivos del cambio y los patrones que reducen el impacto de los cambios.
Disciplina de ingeniería de software
El conocimiento de ingeniería de software ahora toma muchas formas y está codificado en muchos diferentes caminos. Por lo general, se expresa en términos de una combinación de modelos (formales e informales), experiencia y evaluaciones empíricas, según se adapte mejor a los aspectos de interés.
Producir software de manera sistemática, controlada y eficiente y poder hacerlo para una variedad de aplicaciones y contextos requiere un amplio gama de «herramientas» (tanto conceptuales como físicas) junto con las necesarias comprensión de la mejor manera de implementarlos.
Los fundamentos para esto se extraen de un gama de disciplinas, y algunas contribuciones e influencias significativas que hablaremos a continuación.

Ingeniería de software como disciplina informática
En los primeros días de la informática, los informáticos producían software y computadoras. Los ingenieros construyeron el hardware para alojar su ejecución. Como el tamaño, la complejidad, el rol y la importancia crítica de los artefactos de software creció, al igual que la necesidad de asegurar que realizado según lo previsto.
A principios de la década de 1970, era evidente que el software adecuado para las prácticas de desarrollo requerían más que solo los principios subyacentes de la ciencia de la computadora, pues necesitaban las herramientas analíticas y descriptivas desarrolladas dentro de la computadora y el rigor que las disciplinas de ingeniería aportan a la fiabilidad y confiabilidad de los artefactos que diseñaban.
Basándose en la informática como uno de sus fundamentos, la ingeniería de software busca desarrollar y usar modelos sistemáticos y técnicas confiables para producir software de alta calidad. Estas preocupaciones se extienden desde la teoría y los principios hasta las prácticas de desarrollo que son más visible para aquellos fuera de la disciplina.
Aunque es poco probable que por cada software el ingeniero va a tener una gran experiencia en todos los aspectos de la informática, lo que si tendrá es una comprensión general siendo esta relevante que a su vez le dará cierta experiencia en aspectos particulares ya que son una necesidad.
El estudio y la práctica de la ingeniería de software están influenciados tanto por sus raíces en la computadora ciencia y su surgimiento como disciplina de ingeniería.

Una cantidad significativa sobre la corriente de investigación en ingeniería de software se lleva a cabo dentro del contexto de la informática y departamentos de computación o colegios. Del mismo modo, los programas de grado de ingeniería de software están siendo desarrollado por tales unidades académicas, así como en colegios de ingeniería. Así, la ingeniería de software mantiene una conexión más fuerte con su disciplina subyacente (informática) que puede ser el caso para algunos otros campos de ingeniería.
El proceso de construir ha prestado especial atención a incorporar prácticas de ingeniería en el desarrollo de software lo cual se hace para distinguir -la ingeniería de software- planes de estudio de aquellos apropiados para programas de licenciatura en informática.
Creación
Algunas características comunes a cualquier otra disciplina de ingeniería son igualmente aplicable a la ingeniería de software. Por lo tanto, han influido tanto en el desarrollo de ingeniería de software y el contenido del mismo.
- Mientras que los científicos observan y estudian los comportamientos existentes y luego desarrollan modelos para describirlos, los ingenieros usan tales modelos como punto de partida para diseñar y desarrollando tecnologías que permitan nuevas formas de comportamiento.
- Los ingenieros proceden tomando una serie de decisiones, evaluando cuidadosamente las opciones y elegir un enfoque en cada punto de decisión que sea apropiado para la tarea en el contexto actual. La idoneidad puede juzgarse mediante un análisis de compensación que equilibra los costos con los beneficios.
- Los ingenieros crean a través de los cálculos y, cuando corresponde, trabajan cuantitativamente. Ellos calibran y validan sus mediciones, y usan aproximaciones basadas en la experiencia y datos empíricos.
- Los ingenieros enfatizan el uso de un proceso disciplinado al crear y implementando diseños y puede operar efectivamente como parte de un equipo al hacerlo.
- Los ingenieros pueden tener múltiples roles: investigación, desarrollo, diseño, producción, pruebas, construcción, operaciones y administración además de otras como ventas, consultoría y enseñanza.
- Los ingenieros usan herramientas para aplicar procesos sistemáticamente. Por lo tanto, la elección y uso de herramientas apropiadas es un aspecto clave de la ingeniería.
- Los ingenieros, a través de sus sociedades profesionales, avanzan por el desarrollo y validación de principios, estándares y mejores prácticas.
- Los ingenieros reutilizan diseños y artefactos de diseño. Aunque existen fuertes similitudes entre la ingeniería de software y las más tradicionales ingeniería, también hay algunas diferencias (no necesariamente en detrimento del software Ingeniería):

- Las nociones de la ingeniería de software se basan en informática, no ciencias naturales.
- Los modelos de ingeniería de software hacen más uso de lo discreto -sistema de algoritmo- que de lo continuo en matemáticas.
- La concentración está en entidades abstractas, lógicas en lugar de artefactos concretos y físicos.
- No hay fase de fabricación en el sentido tradicional.
- El mantenimiento del software se refiere principalmente al:
- Desarrollo continuo.
- Evolución.
- No al desgaste convencional.
- La ingeniería de software no siempre se ve como una actividad «profesional». Una preocupación para estas pautas curriculares es ayudar con la evolución de la ingeniería de software hacia un estado más «profesional».
Matemáticas y Estadística
La ingeniería de software hace poco uso directo de las matemáticas continuas tradicionales, aunque tal conocimiento puede ser necesario al desarrollar software para algunos dominios de aplicación, así como al aprender estadísticas.
Como la informática, la ingeniería de software hace uso de formalismos y conceptos matemáticos -discretos- donde es necesario, como cuando se modelan las interacciones y posibles inconsistencias entre diferentes requisitos y soluciones de diseño, artefactos de modelado para el diseño de pruebas y comportamiento de modelado para análisis de seguridad.
Las estadísticas también tienen un papel en la ingeniería de software. Actividades como modelado de costos y la planificación requiere una comprensión de la probabilidad e interpretación del cuerpo en crecimiento de conocimiento empírico, de manera similar necesita familiaridad con temas como la importancia y poder estático.
Además, las interacciones de un artefacto de software con otro sistema y sus elementos a menudo conducen a un comportamiento que no es determinante y, por lo tanto, se describe mejor usando modelos estadísticos debido a que todas estas son aplicaciones de estadística y probabilidad que llegan al tratamiento.
Psicología y Ciencias Sociales
Las relaciones interpersonales juegan un rol en muchas actividades de ingeniería de software. Sin embargo no siempre fue así, ya que las relaciones en grupos y equipos tendió a ser minimizado en el cual el ingeniero en software solo se dedicaba a generar planes basados en el desarrollo bien estructurado -modelo cascada- sin generar iteración.
La consideración de los factores humanos fue por lo tanto limitado en gran medida a aspectos como la interacción humano-computadora y el proyecto gestión, que siguen siendo importantes hoy.
Una de las contribuciones clave del pensamiento contemporáneo iterativo y ágil ha sido un mayor énfasis en las personas en el proceso de desarrollo de software, incluyendo clientes, usuarios y otras partes interesadas, así como profesionales de ingeniería -ingeniero en software-, tanto en términos de sus roles como de las interacciones.
Esto ha sido acompañado por un reconocimiento de que las interacciones entre usuarios y sistemas debe ser un elemento fundamental del pensamiento de diseño y que esto debería centrarse en explotar diferentes puntos de vista en lugar de limitarlos.
Aunque, a los fines del diseño curricular, estas no son áreas temáticas que necesiten profundas estudio, el ingeniero en software debe ser consciente de los efectos que los factores humanos pueden tener en muchas de las actividades de la disciplina.

Gestión de proyecto
Todos los proyectos de desarrollo de software deben gestionarse de alguna manera, incluso si solo es uno con la persona que está involucrada. La planificación, la estimación y el control de versiones -gestión de versiones- son ejemplos de actividades de gestión que son necesarias para cualquier proyecto, independientemente de su tamaño o modelo de proceso elegido. Del mismo modo implica para la gestión del equipo y los efectos de los factores.
La motivación individual y de equipo son asuntos importantes para casi todos los proyectos. La ausencia de una etapa de fabricación significativa para el software cambia la naturaleza de la -gestión de proyectos- en la ingeniería de software y las prácticas ágiles pueden requerir diferentes tareas de gestión que los enfoques basados en planes.
Sin embargo, los proyectos de software aún deben seguir siendo administrado, incluso si se agrega alguna adaptación de conceptos y modelos.
¿Cuánto gana un Ingeniero en software?
A través de in informe del mercado laboral de España, realizado por el portal Infojobs quien trabajo en coordinación con la Escuela Superior de Administración y Dirección de Empresas -Esade-, indicaron que las ofertas laborales de los ingenieros en software han ascendido en estos últimos dos años. El año pasado se generaron más de 95.000 puestos de trabajos que es un aumento del 42% a diferencia de otros años.
El salario de un ingeniero en software ronda desde los 15.000 y 25.000 euros al año, por lo que se traduce a un sueldo de 1.250 a 2.080 euros mensual.
Ahora bien, el salario de para un recién graduado ronda entre los 14.000 y 20.000 euros, y para los directores de proyectos tiene un salario que ronda los 70.000 euros al año. Entonces se puede decir que son los profesionales mejor pagados en España.

Ventajas de un Ingeniero en software
La mayor ventaja de ser ingeniero de software es que debido a que todo depende de la tecnología, hay muchas oportunidades para los ingenieros de software que resultan en buenos paquetes salariales en esta industria.
Por lo tanto, en palabras simples en términos de oportunidades y dinero, los ingenieros de software puntúan sobre otros profesionales, sin embargo, últimamente ha habido una disminución tanto en las oportunidades como en el dinero debido a una desaceleración en la economía mundial.
Otro beneficio de ser ingeniero de software es que este es un trabajo de oficina en el sentido de que los profesionales de software nunca son enviados al campo para mercadeo u otras tareas. Por lo tanto, si eres de los que aman trabajar en una oficina con aire acondicionado desde la mañana hasta la noche, entonces esa es la mejor opción.
Código ético de un Ingeniero en software
Las computadoras tienen un papel central y creciente en los negocios, la industria, el gobierno, la medicina, la educación, el entretenimiento y la sociedad en general.
Estos profesionales son aquellos que contribuyen mediante la participación directa o mediante:
- La enseñanza
- Al análisis.
- Especificación.
- Diseño.
- Desarrollo.
- Certificación.
- Mantenimiento.
- Prueba de sistemas de software.

Debido a su rol en el desarrollo de sistemas de software -los ingenieros de software- tienen oportunidades que hacen mucha diferencia bien sea para hacer el bien o causar daño, para permitir que otros hagan el bien o causen daño, o para influir en otros para que hagan el bien o causen daño.
Para garantizar en la medida de lo posible que sus esfuerzos se utilizarán para bien -los ingenieros de software- deben comprometerse a hacer de la ingeniería de software una profesión beneficiosa y respetada. De acuerdo con ese compromiso, deben cumplir con el siguiente Código de Ética y Práctica Profesional.
El código contiene ocho principios vinculados con el comportamiento y las decisiones tomadas por los profesionales de ingeniería de software, incluidos educadores, gerentes, supervisores y formuladores de políticas, así como aprendices y estudiantes de la profesión.
Los principios determinan las relaciones que deben ser manejadas con ética y de forma responsable en las que participan los individuos, grupos, organizaciones y las obligaciones principales dentro de estas relaciones. Las cláusulas de cada principio son de alguna manera ilustraciones de las obligaciones incluidas en estas relaciones.
Estas obligaciones se basan en la humanidad del -ingeniero en software- en especial atención a las personas que han sido de alguna manera perjudicadas por el trabajo de los mismos, y en los elementos únicos de la práctica de la ingeniería de software. El Código prescribe esto como obligaciones de cualquiera que diga ser o aspire a ser ingeniero de software.

No se pretende que los segmentos propios del Código se usen de forma aislada para justificar errores de omisión o comisión. La lista de principios y cláusulas no es exhaustiva, sin embargo, las cláusulas no deben leerse como una separación de lo aceptable de lo inaceptable en la conducta profesional en todas las situaciones prácticas.
El código no es un algoritmo ético simple que genera decisiones honradas. En algunas situaciones, los estándares pueden estar en tensión entre ellos o con estándares de otras fuentes. Las tensiones éticas pueden abordarse mejor mediante una consideración cuidadosa de los principios fundamentales, en lugar de depender ciegamente de regulaciones detalladas.
Estos principios deben hacer predominar en los ingenieros de software para que consideren ampliamente quién se ve afectado por su trabajo; examinar si ellos y sus colegas están tratando a otras personas con el debido respeto; reflexionar en cómo el público reaccionaria sus decisiones si tuviera suficiente información en la materia.
De igual manera, deben analizar como los menos favorecidos se verán afectados por sus decisiones, y considerar si sus actos serían respetados como el profesional que es.
En todos estos juicios de valor, el desasosiego de la profesión es por la salud, la seguridad y el bienestar del público, siendo esto primordial; es decir, el «interés público» es fundamental para este Código.

El contexto dinámico y exigente de la profesión -ingeniería de software- requiere un código que sea adaptable y relevante para las nuevas situaciones a medida que ocurren. Sin embargo, incluso en esta generalidad, el Código proporciona soporte para colegas que necesitan tomar medidas positivas en un caso específico al documentar la postura ética de la profesión.
El código proporciona una base ética a la que pueden apelar las personas dentro de los equipos y el equipo en su conjunto. El Código fomenta a definir aquellas acciones que son éticamente inadecuadas para solicitar al profesional -ingeniero en software- o equipos de los mismos.
El Código no es simplemente para juzgar la naturaleza de los actos dudosos, sino que también tiene una importante función educativa. El código simboliza el consenso de la profesión sobre cuestiones éticas, es un medio para ilustrar tanto al público como a los estudiantes aspirantes a profesionales sobre las obligaciones éticas de todos.
Principios éticos de un Ingeniero en software
A continuación, te presentamos los principios éticos de la profesión:
La sociedad y el público
- Aceptar la plena y total responsabilidad de su propio trabajo.
- Moderar los intereses entre el -ingeniero en software- el empleador, el cliente y los usuarios con el bienestar general.
- Se debe aprobar -el software- solo si tienen una creencia bien fundada de que es seguro, además de cumplir con las especificaciones, pasado las pruebas apropiadas y no disminuye la calidad de vida, disminuye la privacidad o daña el medio ambiente. El efecto final del trabajo debe ser para el bienestar general.
- Indicar a las personas o autoridades competentes cualquier peligro real o potencial para el usuario, el público o el medio ambiente, que ellos puedan considerar razonablemente y que este a su vez asociados con el software o documentos relacionados.
- Cooperar con elementos relacionado a la materia para abordar asuntos que genere grave preocupación pública causados por el software, su instalación, mantenimiento, soporte o documentación.
- El profesional -ingeniero en software- debe ser justo y sincero, debe evitar el engaño en todas las declaraciones, especialmente las públicas sobre software o documentos, métodos y herramientas relacionados.
- El -ingeniero en software- debe tomar en consideración problemas de discapacidad física, asignación de recursos, desventajas económicas y otros factores que pueden disminuir el acceso a los beneficios del software.
- Ser -ingeniero en software- es estar a disposición de contribuir o donar sus habilidades profesionales como voluntario a buenas causas y a la educación pública con respecto a la disciplina.
Cliente y empleador
- El -ingeniero en software- debe brindar un servicio en sus áreas de competencia, siendo honesto y directo sobre cualquier limitación de su experiencia y educación.
- No usar dolosamente un software que se obtuvo o retiene de manera ilegal o poco ética.
- El -ingeniero en software- debe usar la propiedad de un cliente o empleador solo de manera adecuada, con autorización y con el conocimiento y consentimiento del cliente o empleador.
- Debe asegurarse de que cualquier documento en el que se basan haya sido aprobado, cuando así se requiera y por alguien con autoridad para aprobarlo.
- Se debe mantener en privado cualquier información confidencial obtenida en su trabajo profesional, siempre y cuando dicha confidencialidad este sujeta a delito y ya sea consistente con el interés público y con la ley.
- Deben hacer identificación, documentación, recopilación con celeridad al cliente o al empleador si, en su opinión, es probable que un proyecto falle, resulte demasiado costoso, viole la ley de propiedad intelectual o sea problemático.
- Deben hacer identificación, documentación, e informar con celeridad al cliente o al empleador sobre asuntos importantes de interés social de los cuales se tengan en conocimiento relacionado al software.
- No debe aceptar ningún trabajo externo en detrimento del trabajo que realizan para su empleador principal.
- El -ingeniero en software- no puede promover interés adverso para su empleador o cliente, a menos que se comprometa una preocupación ética mayor; en ese caso, informe al empleador o otra autoridad apropiada sobre esa preocupación ética.

Producto
- El -ingeniero en software- debe esforzarse por una alta calidad, un costo aceptable y un cronograma razonable, asegurando que la prestación del servicio sean claras y aceptadas por el empleador y el cliente, y estén disponibles para su consideración por el usuario y el público.
- El profesional debe asegurar metas y objetivos adecuados, alcanzables para cualquier proyecto en el que trabajen o propongan.
- Identificar, definir y abordar asuntos éticos, económicas, culturales, legales y ambientales relacionadas con proyectos de trabajo.
- Asegurarse de que están calificados para cualquier proyecto en el que trabajen o propongan trabajar, mediante una combinación adecuada de educación y experiencia.
- Asegurarse de utilizar un método apropiado para cualquier proyecto en el que trabajen o propongan trabajar.
- Deben trabajar para seguir los estándares profesionales, si están disponibles y que sean más apropiados para la tarea, apartándose de estos solo cuando esté éticamente o técnicamente justificado.
- El -ingeniero en software- debe esforzarse por comprender completamente las especificaciones del software en el que trabajan.
- El profesional debe asegurar que las especificaciones del software en el que desarrollan estén bien documentadas, satisfagan los requisitos de los usuarios y cuenten con las aprobaciones correspondientes.
- El profesional debe asegurarse de realizar las estimaciones cuantitativas realistas de costo, programación, personal, calidad y resultados en cualquier proyecto en el que trabajen o propongan trabajar y proporcione una evaluación de incertidumbre de estas estimaciones.
- Debe realizar las pruebas, depuración y revisión adecuadas de software y documentos relacionados en los que se encuentran trabajando.
- Deben realizar la documentación apropiada, incluir los problemas importantes y significativos, y las soluciones adoptadas, para cualquier proyecto en el que trabajen.
- El -ingeniero en software- al trabajar en el desarrollo del software y los documentos relacionados, deben respetar la privacidad y confidencialidad de aquellos que pueden verse afectados por ese software.
- Debe tener cautela al usar solo datos precisos derivados u obtenidos por medios legales, y úselos solo de maneras autorizadas.
- Se debe mantener la integridad de los datos, ser sensible a los que sean obsoletos o defectuosos.

Juicio
- El -ingeniero en software- debe moderar todos los juicios técnicos por la necesidad de apoyar y mantener los valores humanos.
- El profesional debe firmar y respaldar documentos que fueron realizados bajo su supervisión o dentro de sus áreas de competencia y con los que se este de acuerdo.
- Dentro de la profesión debe ser totalmente objetivo con respecto a cualquier software o documentos relacionados que se les solicite evaluar.
- No debe participar e involucrarse en prácticas engañosas como sobornos, doble facturación u otras prácticas financieras inadecuadas.
- Debe informar oportunamente a todos quienes tienen interés, sobre aquellos problemas que no puedan evitarse razonablemente.
- Puede negarse a participar, como miembros o asesores, en un organismo privado, gubernamental o profesional relacionado con problemas relacionados con el software, en el sus empleadores o sus clientes tengan posibles conflictos de intereses no revelados.

Administración
- Se debe garantizar una buena gestión para cualquier proyecto en el que trabajen, incluidos procedimientos efectivos para la promoción de la calidad y la reducción de riesgos.
- El-ingeniero en software- debe garantizar que esta informado de los estándares antes de cumplirlos.
- El-ingeniero en software- debe garantizar que los empleados conozcan las normas del empleador para la debida protección de datos como contraseñas, archivos y cualquier otro dato de privacidad.
- Debe asignar trabajo solo después de tener en cuenta la educación y experiencia.
- Asegurar estimaciones cuantitativas realistas de costo, programación, personal, calidad y resultados en cualquier proyecto en el que trabajen o propongan trabajar, y proporcione una evaluación de la incertidumbre de estas estimaciones.
- Atraer a los profesionales potenciales solo mediante una descripción completa y exacta de las condiciones de empleo.
- Ofrecer una remuneración justa y equitativa.
- No debe impedir que alguien tome una posición para la cual esa persona está calificada.
- Asegurar de que haya un acuerdo justo sobre la propiedad de cualquier software, proceso, investigación, escritura u otra propiedad intelectual a la que haya contribuido e -ingeniero en software-.
- Prever el debido proceso en la audiencia de cargos de violación de la política de un empleador o del código.
- No puede solicitar al -ingeniero en software- que haga algo que sea inconsistente con el código.
- No puede sancionar al personal por manifestar preocupaciones éticas sobre un proyecto.

Profesión
- Debe ayudar a desarrollar un ambiente estructurado y favorable para actuar éticamente.
- Fomentar la ciencia de la ingeniería de software.
- Ampliar el conocimiento mediante la participación adecuada en organizaciones profesionales, reuniones y publicaciones.
- El -Ingeniero en software- debe dar apoyo, como miembros de una profesión, a otros ingenieros que se esfuerzan por seguir el código.
- El -Ingeniero en software- no debe promover sus propios intereses a expensas de la profesión, cliente o empleador.
- Cumplir todas las leyes que rigen su trabajo, a menos que, en circunstancias excepcionales, dicho cumplimiento sea inconsistente con el interés público.
- Ser preciso al indicar las características del software en el que trabajan, evitando no solo afirmaciones falsas, sino también afirmaciones que razonablemente se supone que son especulativas, vacías, engañosas o dudosas.
- Asumir la responsabilidad de detectar, corregir e informar errores en el proyecto y los documentos asociados en los que trabajan.
- El -Ingeniero en software- debe asegurarse que los clientes, empleadores y supervisores conozcan el compromiso con el código de ética y las ramificaciones posteriores de dicho compromiso.
- Se debe evitar las asociaciones con empresas y organizaciones que entren en conflicto con el código.
- Debe reconocer las violaciones al código son opuesto con ser un -ingeniero en software- profesional.
- Debe expresar inquietudes a las personas involucradas cuando se detectan violaciones significativas del código a menos que esto sea imposible, contraproducente o peligroso.
- Debe informar sobre las violaciones significativas del código a las autoridades competentes.

Colegas
- Aliente a sus colegas a adherirse al código.
- Apoyar a colegas en el desarrollo profesional.
- Debe acreditar totalmente el trabajo de otros y abstenerse de tomar méritos indebidos.
- Examinar el trabajo de otros de manera objetiva, sincera y debidamente documentada.
- Dé una criterio imparcial a las opiniones, inquietudes o quejas de un colega.
- Se debe ayudar a colegas a conocer plenamente sobre las normas laborales estándar actuales, incluidas las políticas y los procedimientos para proteger las contraseñas, los archivos y otra información privada.
- No intervenir injustamente en la carrera de ningún colega; sin embargo, la preocupación por el empleador, el cliente o el interés público puede obligar al -ingeniero de software- de buena fe, a cuestionar la competencia de un colega.
- En situaciones fuera de sus propias áreas de competencia, recurra a las opiniones de otros profesionales que tengan competencia en esa área.

Aprendizaje
- El -Ingeniero en software- debe mejorar su conocimiento y estar actualizado en los avances de la carrera.
- Debe mejorar su capacidad de crear software de calidad seguro.
- Mejore su capacidad de producir documentación precisa, informativa y bien escrita.
- Perfeccionar su comprensión con documentos relacionados en los que trabajan y del entorno en el que se utilizarán.
- Perfeccionar los estudios sobre los estándares relevantes y las normas que rige el software.
- El -Ingeniero en software- debe mejorar su conocimiento que tiene sobre el código, su interpretación y su aplicación a su trabajo.
- No dar trato injusto a nadie por prejuicios irrelevantes.
- No debe influir en otros para emprender cualquier acción que implique una violación del código.
- El -Ingeniero en software- debe reconocer que el incumplimiento del código son contrarios con ser un ingeniero en software profesional.
Si te ha parecido útil la información contenida en este artículo, quizá te interese descubrir también:
- Planilla de solicitud de Pasaporte del Saime en Venezuela.
- Ipsfa en línea: ¿Cómo consultar saldo de Pensionados?.
- Pasaporte Express en Venezuela: ¿Cómo Sacarlo?.