Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido
1. Definición del Módulo. .................................................................................................................... 2
2. Introducción. ................................................................................................................................... 4
2. Desarrollo de Software. ................................................................................................................... 9
2.1. Disciplinas implicadas en el desarrollo de software. ................................................................. 9
2.1.1. Procesos de desarrollo definidos y empíricos. ................................................................... 9
2.1.2. Procesos de desarrollo y modelos de proceso. Criterios para elección de ciclos de vida en
función de las necesidades del proyecto y las características del producto. ............................. 16
2.1.3. Disciplinas técnicas, de gestión y de soporte que conforman la ingeniería de software. 22
2.1.4. Gestión de configuración de software. ............................................................................ 25
2.1.5. Testing y revisiones técnicas al software. ........................................................................ 36
2.2. Gestión de proyectos. ............................................................................................................. 49
2.2.1. Gestión tradicional y ágil de proyectos. ........................................................................... 49
2.2.2. Introducción a los métodos ágiles. Manifiesto Ágil.......................................................... 53
2.2.3. Requerimientos en ambientes ágiles. .............................................................................. 54
2.2.4. User Stories...................................................................................................................... 58
2.2.5. Métodos Ágiles: SCRUM, XP, TDD. ................................................................................... 62
3. Bibliografía. .................................................................................................................................... 85
1
DESARROLLO DE SOFTWARE
Este módulo se orienta al desarrollo de las siguientes capacidades profesionales, estando estas
articuladas con las funciones que se describen en el alcance del perfil profesional:
El Programador como parte integrante de un equipo de proyecto debe poder estimar el esfuerzo que
necesita para realizar un trabajo que le fue asignado. Para ello deberá procurarse la información que
necesite para dimensionar el trabajo, considerando la utilización de recursos de los que disponga
para ser productivo, por ejemplo, utilización de bibliotecas de componentes, aplicación de patrones,
entre otros.
La formación de capacidades como sujetos que integrarán equipos de desarrollo, dado que el
desarrollo de software es esencialmente, trabajo en equipo; haciendo hincapié en el desarrollo de
habilidades interpersonales.
2
DESARROLLO DE SOFTWARE
3
DESARROLLO DE SOFTWARE
2. Introducción.
El software en su origen era la parte insignificante del hardware, lo que venía como añadidura, casi
como regalo, no pasó mucho tiempo de su evolución y se generó una idea de software: igual
programa; y en breve tiempo adquirió una entidad propia, la cual desde el comienzo fue acompañada
de complejidad (dificultad de…), por ser un producto difícil de entender, difícil de explicar, difícil de
construir y difícil de mantener, es decir, un producto difícil, un producto intangible, maleable y con
diversas representaciones, en constante cambio y evolución. El software se ha convertido en ubicuo,
está inserto en la mayoría de las actividades de la persona humana, en su cotidianeidad. Por lo
anterior, es importante no subestimarlo.
Por su parte, Freeman caracteriza al software como “el alma y cerebro de la computadora, la
corporización de las funciones de un sistema, el conocimiento capturado acerca de un área
de aplicación, la colección de los programas, y los datos necesarios para convertir a una
computadora en una máquina de propósito especial diseñada para una aplicación particular,
y toda la información producida durante el desarrollo de un producto de software”.
El software no sólo hace referencia a los programas ejecutables sino también representa
diversas cosas, las cuales difieren en el tiempo, con las personas y principalmente en cómo
se lo va a emplear. El software viabiliza el producto más importante de nuestro tiempo: la
información.
Sumado a lo antes dicho, recordemos que “hacemos software con software”. Esto no sólo dificulta el
proceso de diseño en nuestra mente, sino que dificulta severamente la comunicación entre las
mentes.
Robert Cochram, utiliza las siguientes características para describir lo que es único y especial en el
software:
1. El software es intangible.
2. Tiene alto contenido intelectual.
4
DESARROLLO DE SOFTWARE
3. Generalmente, no es reconocido como un activo por los Contadores, por lo que no está en
los balances.
4. Su proceso de desarrollo es humano intensivo, basado en equipos y construido en proyectos.
5. El software no exhibe una separación profunda entre I&D y producción.
6. El software puede ser potencialmente modificado, en forma permanente.
Pressman, expresa las características del software haciendo énfasis en la diferencia que éste tiene
con el hardware:
Pese a la diversidad de opiniones que expresan los autores respecto a las características del software,
todos coinciden en su complejidad. Según Basili, el software es intangible y su intangibilidad es lo que
contribuye fuertemente a su complejidad. El software es complejo, complejo de construir, complejo
de entender, complejo de explicárselo a otros. Esta característica inherente del software, junto al
hecho de que el software es, desarrollado y no construido y la falta de principios y componentes bien
definidos hace de él un producto diferente a cualquier otro, con el que se haya tratado antes.
5
DESARROLLO DE SOFTWARE
como en la siguiente realizada en Roma en 1969, se estipuló el interés hacia los aspectos técnicos y
administrativos del desarrollo y mantenimiento de productos software.
Se pretendía acordar las bases para una ingeniería de construcción de software. Según Fritz Bauer, lo
que se necesitaba era “establecer y usar principios de ingeniería orientados a obtener software de
manera económica, que sea fiable y funcione eficientemente sobre máquinas reales”. Esta definición
marcaba posibles cuestiones tales como: ¿Cuáles son los principios robustos de la ingeniería
aplicables al desarrollo de software? ¿Cómo construimos el software económicamente para que sea
fiable? ¿Qué se necesita para crear software que funcione eficientemente?
Ingeniería de Software
El “IEEE Standard Glossary of Software Engineering Terminology” ha desarrollado una definición más
completa para ingeniería del software: “La aplicación de un enfoque sistemático, disciplinado y
cuantificable para el desarrollo, operación y mantenimiento del software; es decir, la aplicación de la
ingeniería al software”.
• Cualquier disciplina de ingeniería (incluida la ingeniería del software) debe descansar sobre
un esfuerzo de organización de calidad. La gestión de calidad y las filosofías similares
6
DESARROLLO DE SOFTWARE
Las disciplinas denominadas Técnicas son las relacionadas directamente con la construcción del
producto de software. Las disciplinas de Gestión están relacionadas con el proyecto, que tal como se
profundizará más adelante en este apunte, es el medio que se utiliza para guiar la construcción de
software. Las disciplinas de Soporte, también conocidas como disciplinas protectoras, son las que
brindan herramientas que ayudan a obtener calidad para el software que se va a desarrollar:
7
DESARROLLO DE SOFTWARE
8
DESARROLLO DE SOFTWARE
2. Desarrollo de Software.
Un gran desarrollo de software entrega lo que se necesita, a tiempo y dentro del presupuesto. Cada
pieza de software comienza con una idea de un cliente. Es tu trabajo como desarrollador de software
es dar vida a esa idea. Sin embargo, tomar una idea vaga y transformarla en software funcionando,
software que satisfaga a su cliente, no es una tarea trivial. El propósito de este apunte es poder
introducirlos en el mundo del desarrollo de software, y llegar a entregar el software que se necesita,
a tiempo y dentro del presupuesto definido.
9
DESARROLLO DE SOFTWARE
El software se desarrolla por personas, que deben estar motivadas y capacitadas para hacer su
trabajo. Debe emplear un proceso que guía la transformación; y ayudarse con herramientas que
faciliten el trabajo.
En el ámbito del desarrollo de software se define un requerimiento cómo una característica que el
producto que se va a construir debe satisfacer.
Esa característica puede está relacionada con algún comportamiento o con alguna capacidad, que el
Cliente/Usuario espera encontrar en el producto de Software.
Planificar es definir qué es lo que haremos, cuándo lo haremos, cómo vamos a hacerlo y quién lo
hará.
La planificación establece compromisos que esperamos cumplir, y si bien con frecuencia los planes
pueden están equivocados, si no se planifica, no se puede responder las preguntas básicas antes
mencionadas.
Si no sabemos planificar, lo mejor que podemos hacer es planificar con más frecuencia.
Estimar es predecir el tiempo y el costo que llevará desarrollar un producto de software, basándonos
es el tamaño de lo que queremos construir.
Las estimaciones tienen asociada una probabilidad, y esa probabilidad está relacionada con la
información con la que contamos al momento de predecir.
El problema con las estimaciones es que se las requiere muy pronto, y es difícil hacer predicciones,
especialmente sobre el futuro.
10
DESARROLLO DE SOFTWARE
Diseñar es crear, diseñar es tomar decisiones respecto de cuál es la mejor forma de satisfacer los
requerimientos definidos para el producto.
Durante el diseño se aplican varias técnicas y principios, para crear modelos que especificarán el
producto a construir. Al diseñar software se crean representaciones que visualizan diferentes partes
del mismo, a saber: su arquitectura, sus procesos, sus bases de datos y la forma en la que el software
interactuará con sus usuarios.
Programar es escribir código, que permitirá controlar lo que una computadora hará.
Las revisiones técnicas del software tienen por objetivo detectar tempranamente errores que se
comenten al desarrollar.
Si mostramos y explicamos a otros el trabajo que hicimos es muy probable que esos errores sean
identificados y puedan corregirse antes que se hagan mayores, impacten en otros artefactos; y que
sea más costoso corregirlos.
La prueba del software, en inglés testing, es un proceso que tiene por objetivo encontrar defectos,
que se asume de ante mano que está allí.
Durante la prueba debemos poder validar que el producto que se está probando es el que el usuario
quería, y verificar que el producto funciona correctamente.
11
DESARROLLO DE SOFTWARE
Una de las características del software es que es fácil de modificar, maleable y dado que vamos a
necesitar cambiarlo muchas veces, es necesario crear mecanismos que nos ayuden a controlar el
software a lo largo de su ciclo de vida.
El control de la configuración del software protege la integridad del producto que construimos de
pérdidas de componentes o de cambios realizados a los componentes, evita superposición de
cambios y esfuerzos duplicados de mantenimiento.
El monitoreo y control compara los planes realizados con el avance real de un proyecto. Nos da
visibilidad respecto de la situación del proyecto en un momento de tiempo, cuánto hicimos, cuánto
nos falta para terminar, cuánto gastamos, cuanto tiempo consumimos.
Si a esas preguntar podemos responderlas con números será más fácil interpretar el estado real del
proyecto y poder tomar decisiones acertadas respecto de cómo continuar.
Desarrollar Software
El Software como producto se desarrolla de manera gradual, cada versión del software es única y se
obtiene como resultado de la ejecución de un Proyecto. Cada proyecto involucra personas que son
responsables de la transformación de los requerimientos en el producto final. El proyecto utiliza un
proceso que define las actividades que se llevarán a cabo para alcanzar los objetivos.
12
DESARROLLO DE SOFTWARE
Las personas son los principales autores de un proyecto de Software, que asumen diferentes roles
tales como analistas de sistemas, diseñadores, programadores, arquitectos, analistas de prueba,
líderes de proyecto, revisores técnicos, entre otros. Estas personas conformarán lo que se denomina
Equipo de Desarrollo.
Un equipo de desarrollo para ser eficaz deberá maximizar capacidades y habilidades de cada persona,
teniendo en cuenta las características de la organización, la cantidad de personas que integran el
equipo, el grado de habilidad de los integrantes y la dificultad del problema a resolver.
El Equipo de Desarrollo debe interactuar con otros participantes que también están involucrados en
la obtención del software, que es importante mencionar: Gerentes de Proyecto, Gerentes de
Producto, Clientes, Usuarios Finales.
Un proceso de software define un conjunto completo de actividades necesarias para transformar los
requerimientos de un usuario en un producto.
El proceso proporciona un marco de trabajo, una estructura que puede tomarse como referencia
para definir el plan que guiará el proyecto para el desarrollo del software.
Finalmente, las personas, que, en el desarrollo de software, son lo más importante, ya que la materia
prima para su creación es la mente y el trabajo de las personas que integrarán el equipo.
13
DESARROLLO DE SOFTWARE
La definición completa del proceso contiene actividades relacionadas con las disciplinas técnicas, de
gestión y de soporte o protectoras, mencionadas con anterioridad en este apunte. El proceso define
además de las actividades que deben realizarse, las entradas que necesita, las salidas que produce,
los roles responsables de la realización de las actividades, la definición de las herramientas que se
necesitan y la forma de medir y controlar si las actividades efectivamente se realizaron.
Sin embargo, un pequeño número de actividades es aplicable a todos los proyectos de software, sin
importar su tamaño o complejidad. Otros conjuntos de tareas permiten que las actividades del
proceso se adapten a las características del proyecto de software, así como a los requisitos del equipo
del proyecto y a las características del Producto.
Vinculado al concepto de proceso está el concepto de Modelo de Proceso o Ciclo de Vida del Proceso
de Desarrollo, el cual se define como una representación de un proceso. El modelo de proceso grafica
una descripción del proceso desde una perspectiva particular, indicando fases para el proceso y el
orden en el que las mismas se llevarán a cabo.
Hay diferentes tipos de modelos de procesos. Algunos, denominados secuenciales, plantean que las
fases del proceso deben ejecutarse en forma completa y en orden, avanzando con el cien por ciento
de los artefactos que deben construirse en cada fase antes de poder pasar a la siguiente.
Otros modelos de proceso denominados iterativos, por el contrario, plantean que puede avanzarse
con una porción del producto que debe construirse, evolucionando a través de cada una de las etapas
hasta obtener una versión completa, para una parte del producto y luego repetir el proceso hasta
terminar el desarrollo completo. Se abordará este tema con más detalle en la última sección del
apunte.
El mismo proceso puede ser utilizado con diferentes modelos de proceso en cada proyecto que se
realizará, según las características particulares de cada proyecto.
14
DESARROLLO DE SOFTWARE
Es un esfuerzo temporal que se lleva a cabo para crear un producto, servicio o resultado único, en
este caso un producto de software.
El proyecto integra personas, utiliza un proceso y herramientas para obtener como resultado un
producto de software.
Al inicio del proyecto debe decidirse que conjunto de actividades definidas en el proceso, aplican
para el proyecto, es decir adaptar el proceso al proyecto. Así como también el modelo de proceso o
ciclo de vida más conveniente para utilizar en el proyecto.
• Temporal: esto significa que tiene una fecha de comienzo y fin definidos. Un proyecto
termina cuando se alcanza el/los objetivo/s o cuando queda claro que no podrán alcanzarse
por la razón que sea. Una línea de producción que obtiene productos en masa, no es un
proyecto.
• Productos, Servicios o Resultados únicos: Los resultados que se obtienen de los proyectos
por similares que sean tienen características que los hacen únicos. La presencia de elementos
repetitivos no cambia la condición fundamental de obtener resultados “únicos”.
• Orientado a Objetivos: Los proyectos están dirigidos a obtener resultados y ello se refleja a
través de objetivos. Los objetivos guían al proyecto. Los objetivos que se definen deben ser
claros y alcanzables. Un objetivo es claro cuando todas las personas que están involucradas
en el proyecto comprenden lo que hay que lograr. Un objetivo es alcanzable cuando lo
definido como expectativa a alcanzar es factible de hacerse.
▪ PRODUCTO: EL RESULTADO
El Producto es más que código, en el contexto del desarrollo de software, el producto que se obtiene
es un sistema software. El termino producto aquí hace referencia al sistema entero, y no sólo al
código ejecutable que se entrega al cliente.
15
DESARROLLO DE SOFTWARE
Un sistema software es la sumatoria de todos los artefactos que se necesitan para representarlo en
una forma comprensible para las máquinas, los trabajadores y los interesados.
Una versión de un Producto de Software puede incluir entre otras cosas: código, bases de datos,
manuales de usuario, manuales de configuración, modelos del diseño, documentos de arquitectura,
documentos de requerimientos, casos de prueba.
El término Artefacto, se utiliza para referenciar cualquier información creada, producida, cambiada
o utilizada por las personas en el desarrollo del sistema.
Básicamente, hay dos tipos de artefactos: artefactos de ingeniería y artefactos de gestión. Los de
ingeniería son creados durante la ejecución de las disciplinas técnicas (Requerimientos, Análisis,
Diseño, Implementación, Prueba y Despliegue).
Los artefactos de gestión tienen un tiempo de vida corto, lo que dura la vida del proyecto; A este
conjunto pertenecen artefactos como el plan de proyecto.
2.1.2. Procesos de desarrollo y modelos de proceso. Criterios para elección de ciclos de vida
en función de las necesidades del proyecto y las características del producto.
El software se desarrolla para algún cliente en particular o para un mercado en general. Para el diseño
y desarrollo de productos de software se aplican metodologías, modelos y técnicas que permiten
resolver los problemas. En los años 50 no existían metodologías de desarrollo, el desarrollo estaba a
cargo de los propios programadores.
Los resultados eran impredecibles, no se sabía la fecha exacta en que concluiría un proyecto de
software, no había forma de controlar las actividades que se estaban desarrollando. Tampoco se
contaba con documentación estandarizada. El nacimiento de técnicas estructuradas es lo que da
origen al desarrollo de aplicaciones aplicando técnicas, métodos y herramientas de ingeniería.
16
DESARROLLO DE SOFTWARE
más eficiente de las metodologías y lograr sistemas más eficientes y de mayor calidad con la
documentación necesaria en perfecto orden y en el tiempo requerido.
Una metodología define una forma disciplinada para desarrollar software con el objetivo de hacerlo
más predecible y eficiente. Una metodología contiene representaciones que facilitan la manipulación
de modelos, y la comunicación e intercambio de información entre todas las personas involucradas
en la construcción de un sistema.
La experiencia ha demostrado que los proyectos exitosos son aquellos que son administrados
siguiendo una serie de procesos que permiten organizar y luego controlar el proyecto. Es necesario
destacar la importancia de los métodos, pero el éxito del proyecto depende más de la comunicación
efectiva con los interesados, el manejo de las expectativas y el nivel de involucramiento y motivación
de las personas que participan en el proyecto.
Existen diferentes metodologías que han sido en los últimos años herramientas de apoyo para
el desarrollo del software. Sommerville (2005), menciona que:
En este sentido, Jacobson (2000), aporta el concepto de Proceso de Desarrollo, con la intención que
sirva para hacer operativo y concreto, lo expuesto en una metodología, definiéndolo como:
• Proceso de Desarrollo de Software define quién está haciendo qué, cuándo y cómo alcanzar
un determinado objetivo. En la ingeniería de software, el objetivo es construir un producto
de software o mejorar uno existente. Es necesario que el proceso sirva de guía a los
participantes (clientes, usuarios, desarrolladores, diseñadores, líderes de proyectos, por
mencionar algunos ejemplos).
Procesos de Control
Cuando trabajamos en el desarrollo de software, utilizando proyectos, podemos elegir dos enfoques
muy diferentes de procesos de control. Esta elección determinará la forma en la que se realizará el
trabajo en el contexto del proyecto y las decisiones que se tomen, por consecuencia afectará la forma
en la que se obtendrán y presentarán los productos resultantes.
El proceso predictivo de control asume que es posible detallar las principales variables de un proyecto
(requisitos, tareas, recursos, costos y tiempos) y predecir su comportamiento a largo plazo.
Adicionalmente a esta predicción, se crea una cadena de actividades donde cada una recibe una
entrada, ejecuta una serie de tareas preestablecidas y produce una salida esperada. Cada una de
estas tareas está asociada a un determinado rol que posee ciertas habilidades para transformar la
entrada en una salida. Otro supuesto fundamental de este enfoque de control, es que la
17
DESARROLLO DE SOFTWARE
responsabilidad sobre un ítem en progreso se traspasa entre los roles que se ocupan de las diferentes
actividades, quedando en el rol destinatario del traspaso la responsabilidad de la aceptación del ítem.
Dado que cada actividad requiere diferente cantidad de esfuerzo, el control se realiza midiendo el
esfuerzo incurrido contra el estimado.
El supuesto de que el flujo de trabajo está prediseñado y predefinido nos lleva a la conclusión de que
la predictibilidad se puede asegurar en cualquier momento durante el proyecto.
A diferencia del proceso Predictivo de Control, el proceso Empírico acepta la complejidad y en vez de
pretender controlar la realidad, su propósito es medir constantemente los resultados y adaptar el
comportamiento en consecuencia. Bajo este paradigma, las variables del proyecto se pueden
predecir, pero con un horizonte temporal acotado.
Manteniendo entonces un intervalo de tiempo pequeño y constante, el control puede ser bastante
granular al revisar sistemáticamente el resultado del trabajo realizado durante ese intervalo de
tiempo y ajustando las variables del contexto y permitiendo así una constante estabilización y
optimización del sistema.
El rol del equipo de trabajo es fundamental en un proceso empírico ya que los individuos dejan de
ser percibidos como agentes independientes y pasan a ser parte de un conjunto interdependiente de
personas que forman un equipo, donde el éxito o el fracaso es colectivo y no individual.
Creer que los procesos predictivos, por más detallados y definidos que estén (predictivos que sean),
son más confiables y seguros que las personas que los ejecutan, es desde la perspectiva de gran parte
de la industria de software, una falacia. Los procesos predictivos no aprenden. Los procesos
predictivos no piensan. Las personas son las que piensan, aprenden y crean cosas nuevas.
Los procesos predictivos son extremadamente valiosos y eficientes para ejecutar tareas repetitivas
en contextos predecibles. ¿Alguna vez te sentaste frente a una hoja por un rato para "ser creativo"?
¿Alguna vez trabajaste en un proceso predictivo con un paso donde había que crear algo nuevo?
¿Cómo te ha ido? Los procesos predictivos son racionales, lógicos. Los procesos empíricos dan lugar
a la creatividad. Los procesos predictivos se basan en experiencias pasadas e intentan repetirlas, pero
debemos vivir mirando hacia el futuro, hacia la innovación.
Del paradigma de los procesos empíricos de control, surgen las metodologías ágiles para el desarrollo
de software.
Al final de este apunte se describen los fundamentos y principios de las metodologías ágiles; el
manifiesto ágil y se introducen algunas de las metodologías ágiles más conocidas.
18
DESARROLLO DE SOFTWARE
Tal como se mencionó antes, un modelo de proceso o ciclo de vida, es una representación abstracta
de un proceso. Cada modelo representa un proceso desde una perspectiva particular y así
proporciona información parcial sobre el proceso. Estos modelos generales no son descripciones
definitivas de los procesos del software, más bien son abstracciones de los procesos que se pueden
utilizar para el desarrollo del software. Puede pensarse en ellos como marcos de trabajo del proceso,
que definen detalles de cómo trabajar con los procesos. Un proceso en particular puede utilizarse
con distintos modelos de proceso, en proyectos diferentes, en función de las situaciones particulares
de esos proyectos.
Este modelo de proceso de tipo secuencial, que considera las actividades del proceso de desarrollo:
Requerimientos, Análisis, Diseño, Implementación y Prueba, como fases separadas del proceso,
asumiendo que se deben realizar en forma completa cada una de ellas antes de comenzar con la
siguiente. En este modelo de proceso, la retroalimentación del cliente, respecto del producto
construido, no llega sino hasta el final. Esto es muy costoso en el caso que el producto presentado al
cliente no sea el producto correcto, lo que implica costos muy altos para cambiarlo, dado que se
desarrollaron todas las etapas del proyecto basadas en una asunción de necesidades que no eran las
correctas.
19
DESARROLLO DE SOFTWARE
Este modelo de proceso surge como una evolución del anterior, donde se deja la totalidad de la
definición del producto de software a construir al principio del proyecto y luego se divide la totalidad
de los requerimientos en partes que se resolverán en “subproyectos”. Dentro de cada subproyecto
se realiza análisis y diseño detallado de la porción del sistema asignada como alcance a ese
subproyecto y Prueba, haciendo al final la integración de cada subsistema y la prueba del sistema
completo. Se puede llevar adelante subproyectos en paralelo si hay gente disponible para hacerlo. La
siguiente figura muestra la representación gráfica del modelo de proceso en Cascada con
Subproyectos.
Este es un modelo de proceso o ciclo de vida que plantea que, el software se desarrolla gradualmente,
por funcionalidades que al terminarse incrementan las capacidades del producto. Es una repetición
del ciclo de vida en cascada, aplicándose a una porción del producto cada vez. Al finalizar cada ciclo,
le entregamos una versión al cliente que contiene nuevas funcionalidades. Este modelo permite
entregas al cliente antes de finalizar completamente el proyecto.
20
DESARROLLO DE SOFTWARE
Este modelo de proceso o ciclo de vida, también derivado del modelo de cascada, busca reducir el
riesgo que surge de brechas entre las necesidades del usuario y el producto final, debido a malos
entendidos durante la etapa de requerimientos.
Es la iteración de varios ciclos de vida en cascada, donde al final de cada iteración se le entrega al
cliente una versión mejorada o con mayores funcionalidades del producto. El cliente es quién luego
de cada iteración, evalúa el producto, lo corrige o propone mejoras. Estas iteraciones se repetirán
hasta que se obtenga un producto que satisfaga al cliente. Este modelo de proceso suele utilizarse
en proyectos en los que los requerimientos no están claros de parte del usuario.
21
DESARROLLO DE SOFTWARE
Haciendo una recopilación de todos los conceptos que se han dado sobre la Ingeniería de software,
la podemos definir como la disciplina o área de la informática, que hace uso razonable de los
principios de ingeniería con el objetivo de obtener soluciones informáticas económicamente factible
y que se adapte a las necesidades de las empresas reales, tomando en cuenta los procesos de
producción y mantenimiento de software que son desarrollados y modificados en el tiempo y con los
costos estimados.
Esta ingeniería trata con áreas muy diversas de la informática y de las Ciencias de la Computación,
tales como construcción de compiladores, Sistemas Operativos, o desarrollos Intranet/Internet,
abordando todas las fases del ciclo de vida del desarrollo de cualquier tipo de Sistema de Información
y aplicables a infinidad de áreas (negocios, investigación científica, medicina, producción, logística,
banca, etc.).
En conclusión, podemos decir que los cuatro autores anteriores, de manera diferente describen en
si el principal objetivo de la ingeniería de software, la cual es el establecimiento y puesta en práctica
de los principios y metodologías que nos lleven a un desarrollo eficiente de software en todas las
etapas desde sus inicios hasta su implementación y mantenimiento.
La ingeniería de software es reconocida como una disciplina legítima, digna de tener una
investigación seria, un estudio cuidadoso y generando una gran controversia. En la industria el
ingeniero del software ha sustituido al programador como título de trabajo preferente. Los modelos
de procesos de software, métodos de ingeniería de software y herramientas se han adoptado con
éxito en el amplio espectro de las aplicaciones industriales. Los gestores y usuarios reconocen la
necesidad de un enfoque más disciplinado del software.
22
DESARROLLO DE SOFTWARE
Los paradigmas relacionados con la programación de alto nivel se agrupan en tres categorías de
acuerdo con la solución que aportan para resolver el problema:
23
DESARROLLO DE SOFTWARE
Hoy en día, los productos de software se construyen con un nivel de urgencia que no se veía en años
anteriores. La prioridad más alta de las compañías es reducir el tiempo de salida al mercado, que es
la base del desarrollo rápido.
La ingeniería de software es percibida por algunos como demasiado formal, que consume demasiado
tiempo y demasiado estructurada para la flexibilidad necesaria durante el desarrollo de hoy en día.
Las personas que hacen estas críticas exponen que no se pueden permitir la formalidad de un
enfoque de ingeniería para construir software porque necesitan desarrollar productos de forma
rápida. Las personas que lanzan tales objeciones ven la ingeniería como una disciplina estática y
piensan que no se puede adaptar a las necesidades cambiantes del negocio y la industria. La verdad
es, sin embargo, que la ingeniería del software es adaptativa y por lo tanto, relevante para cualquiera
que construya un producto software.
La ingeniería del software es adaptativa y no una metodología rígida. Es una filosofía que puede ser
adaptada y aplicada a todas las actividades y dominios de aplicación del desarrollo de software.
La ingeniería del software proporciona una amplia colección de opciones que los profesionales
pueden elegir para construir productos de alta calidad. Sin embargo, no hay un enfoque de ingeniería
individual o un conjunto de procesos, métodos o herramientas de ingeniería del software para
construir un producto software.
El enfoque de ingeniería del software, incluyendo los procesos, métodos y herramientas puede y
debería ser adaptada al producto, la gente que lo construye y el entorno del negocio.
Todo este conjunto de ideas y opiniones llevaron a lo que hoy en día son las metodologías ágiles.
Entre los principios más destacados de la ingeniería del software, podemos señalar los siguientes:
24
DESARROLLO DE SOFTWARE
El desarrollo del software siempre es progresivo y dadas las características de maleabilidad propias
del software, es necesario mantener organizados y controlados los cambios que se realizarán al
software a lo largo del tiempo.
25
DESARROLLO DE SOFTWARE
El objetivo es maximizar la productividad minimizando los errores. Dado a que el cambio puede
ocurrir en cualquier momento, las actividades de la administración de configuración de software son
desarrolladas para identificar el cambio, controlar el cambio, asegurar que el cambio está siendo
apropiadamente implantado, e informar del cambio a aquellos que les interesa.
▪ CONFIGURACIÓN
Una configuración es el conjunto de todos los componentes fuentes que son compilados en un
ejecutable consistente, más todos los componentes, documentos e información de su estructura que
definen una versión determinada del producto en un momento de tiempo.
Una configuración cambia porque se añaden, retiran o modifican elementos. También hay que
contemplar la posibilidad de que los mismos elementos se reorganicen de forma diferente, sin que
cambien individualmente.
La evolución del sistema consiste en: añadir, suprimir, modificar ítems de configuración; o bien,
reorganizar la estructura. Se llama:
▪ REPOSITORIO
26
DESARROLLO DE SOFTWARE
de los ítems de configuración (IC) de un mismo sistema o producto de software, incluyendo las
distintas versiones de cada IC.
Repositorio Centralizado
27
DESARROLLO DE SOFTWARE
Repositorio Distribuido
• Cada cliente tiene una copia exactamente igual del repositorio completo.
• Si un servidor falla sólo es cuestión de “copiar y pegar”.
• Posibilita otras formas de trabajo no disponibles en el modelo centralizado.
28
DESARROLLO DE SOFTWARE
▪ ÍTEM DE CONFIGURACIÓN
Se llama ítem de configuración (IC) a todos y cada uno de los artefactos que forman parte del
producto o del proyecto, que pueden sufrir cambios o necesitan ser compartidos entre los miembros
del equipo y sobre los cuales necesitamos conocer su estado y evolución.
▪ C AMBIO
El cambio en este contexto se define como el paso de una versión de la línea base a la siguiente.
Puede incluir modificaciones del contenido de algún componente, o modificaciones de la estructura
del sistema, añadiendo, eliminando y/o reorganizando componentes.
▪ VERSIÓN
Una versión se define, desde el punto de vista de la evolución, como la forma particular de un
artefacto en un instante o contexto dado.
También hay que contemplar la posibilidad de que coexistan versiones alternativas de un mismo
artefacto un instante dado. Es necesario disponer de un método para identificar unívocamente las
diferentes versiones de manera sistemática u organizada.
La evolución puede representarse gráficamente en forma de grafo, en el que los nodos son las
versiones y los arcos corresponden a la creación de una nueva versión a partir de otra ya existente.
29
DESARROLLO DE SOFTWARE
El siguiente gráfico muestra las revisiones sucesivas de un componente, que dan lugar a una simple
secuencia lineal.
Esta forma de evolución no presenta problemas desde el punto de vista de organización del
repositorio. Las versiones se pueden designar simplemente mediante números correlativos, como en
la figura.
▪ VARIANTE
Una variante es una versión de un ítem de configuración (o de la configuración) que evoluciona por
separado. Las variantes representan configuraciones alternativas. Un producto de software puede
adoptar distintas formas (configuraciones) dependiendo del lugar donde se instale. Por ejemplo,
dependiendo de la plataforma (máquina + S.O.) que la soporta, o de las funciones opcionales que
haya de realizar o no.
Cuando hay variantes, es decir, cuando existen simultáneamente varias versiones de un ítem de
configuración, el grafo de evolución ya no es una secuencia lineal, sino que adopta la forma de un
árbol. Si queremos seguir numerando las versiones se necesitará ahora una numeración a dos niveles.
El primer número designa la variante (línea de evolución), y el segundo la versión particular (revisión)
a lo largo de dicha variante, como podemos ver en la siguiente figura.
30
DESARROLLO DE SOFTWARE
Se presenta un ejemplo de evolución simple (secuencia temporal lineal). Las revisiones del conjunto
se han numerado correlativamente (Rev.1, Rev.2, ...). Cada configuración contiene una colección de
elementos, no siempre los mismos. Pueden crearse o eliminarse elementos entre una revisión y la
siguiente. Los cambios individuales de un componente se indican con flechas. Los componentes que
se mantienen sin cambios se marcan con dos líneas paralelas (como el signo = en vertical).
▪ LÍNEA B ASE
Una línea base es una configuración que ha sido revisada formalmente y sobre la que se ha llegado a
un acuerdo. Sirve como base para desarrollos posteriores y puede cambiarse sólo a través de un
procedimiento formal de control de cambios.
Una definición más formal, dada por el Estándar IEEE 610.12-1990, dice: “Línea Base es una
especificación o producto que se ha revisado formalmente y sobre los que se ha llegado a un acuerdo,
y que de ahí en adelante sirve como base para un desarrollo posterior y que puede cambiarse
solamente a través de procedimientos formales de control de cambios”
31
DESARROLLO DE SOFTWARE
El Comité de Control de Cambios debe tener definido el procedimiento que se utilizará para realizar
esta tarea, de manera de garantizar que todos los interesados que deban ser informados, se enteren
de la ocurrencia de un cambio.
Está formado por representantes de todas las áreas que se vean afectadas por el cambio propuesto,
ejemplos de roles de un equipo de desarrollo que pueden formar parte de un Comité de Control de
Cambios:
• Líder de Proyecto.
• Arquitecto.
• Analista Funcional.
• Gestor de Configuración de Software.
• Desarrolladores.
• Analistas de Prueba.
• Representante del Cliente.
32
DESARROLLO DE SOFTWARE
▪ IDENTIFICACIÓN DE ÍTEMS
▪ CONTROL DE CAMBIOS
El control de cambios consiste en la evaluación y registro de todos los cambios que se hagan a la
configuración del software. Está relacionado con la naturaleza evolutiva del desarrollo de software;
creando por medio de cambios sucesivos realizados de una manera disciplinada. La evolución de un
producto de software, puede verse como la evolución de sus líneas base.
▪ AUDITORÍAS DE CONFIGURACIÓN
Sirven, junto con las revisiones técnicas para garantizar que el cambio se ha implementado
correctamente.
33
DESARROLLO DE SOFTWARE
• Auditoría de configuración física: Asegura que lo que está indicado para cada IC en la línea
base o en la actualización se ha alcanzado realmente. Evaluación independiente de los IC
para verificar que el software y su documentación son internamente consistentes y están
listos para ser entregados al cliente.
Ambos tipos de auditoría se hacen a una línea base específica del producto de software en un
momento de tiempo determinado. Uno de los aspectos principales que se controla en estas
auditorías es la trazabilidad del producto de software, razón por la cual la Matriz de Trazabilidad es
una herramienta muy útil al momento de auditar, tal como se representa en el siguiente esquema.
La trazabilidad plantea la incorporación de vínculos entre los ítems de configuración que nos
permiten detectar si todos los requerimientos que fueron comprometidos están siendo satisfechos,
el estado de avance de cada requerimiento, como así también vínculos hacia el origen y la razón de
la incorporación de esos requerimientos en el producto de software.
▪ GENERACIÓN DE INFORMES
Se ocupa de mantener los registros de la evolución del sistema. Maneja mucha información y salidas
por lo que se suele implementar dentro de procesos automáticos, cuyo soporte depende de la
herramienta de administración de configuraciones que se utilice.
34
DESARROLLO DE SOFTWARE
Como todas las actividades vinculadas al desarrollo de software, las actividades vinculadas con la
administración de configuración de software también deben planificarse. En el caso particular de
estas actividades es deseable que la planificación se haga lo más tempranamente posible.
• TortoiseSVN.
• Subversion.
• Git.
35
DESARROLLO DE SOFTWARE
Las revisiones técnicas surgen a partir de la necesidad de producir software de alta calidad. Algunos
grupos de desarrollo creen que la calidad del software es algo en lo que deben preocuparse una vez
que se ha generado el código. ¡Error! El Aseguramiento de la calidad del software es una actividad de
protección que se aplica a lo largo de todo el proceso de construcción del software.
Es un proceso de revisión cuyo propósito es llegar a detectar lo antes posible, errores o desviaciones
en los productos que se van generando a lo largo del desarrollo. Esto se fundamenta en el hecho que
el trabajo debe ser revisado; debido a que hay errores que son percibidos más fácilmente por otras
personas que por los creadores.
36
DESARROLLO DE SOFTWARE
Si bien cualquier producto de trabajo puede ser revisado técnicamente. Suele requerirse esta práctica
para una muestra de artefactos, si el producto es muy grande y esto podría afectar los compromisos
del proyecto. La siguiente tabla muestra ejemplos de artefactos de software que pueden ser
revisados y que roles podrían participar de una revisión:
El trabajo técnico necesita ser revisado por una simple razón: errar es humano. Otra razón por la que
son necesarias las revisiones técnicas es que, aunque la gente es buena descubriendo algunos de sus
propios errores, algunas clases de errores se le pasan más fácilmente al que los origina que a otras
personas.
¡Qué gran regalo sería poder vernos como nos ven los demás!
• Señalar la necesidad de mejoras en el producto hecho por una sola persona o un equipo.
• Confirmar las partes del producto en las que no es necesaria o no es deseable una mejora.
• Conseguir un trabajo de mayor calidad maximizando los criterios de corrección y completitud
principalmente.
Existen muchos tipos diferentes de revisiones que se pueden llevar adelante como parte de la
ingeniería del software. Cada una tiene su lugar. Una reunión informal durante el almuerzo o en un
café es una forma de revisión, si se discuten problemas técnicos. Una presentación formal de un
diseño de software a una audiencia amplia y variada es una forma de revisión. La más formal de las
técnicas se llama Inspección de Software, se describirá en forma resumida un poco más adelante en
esta sección.
37
DESARROLLO DE SOFTWARE
Dentro del contexto de desarrollo de software, los términos "defecto" y "falla" son sinónimos. Ambos
implican un problema de calidad descubierto después de entregar el software a los usuarios finales.
El objetivo primario de las revisiones técnicas es encontrar errores durante el proceso para evitar que
se conviertan en defectos después de la entrega del software. El beneficio obvio de estas revisiones
es el descubrimiento de errores al principio para que no se propaguen al paso siguiente del proceso
de desarrollo del software.
Se ha demostrado que las revisiones de software son efectivas en un 75% a la hora de detectar
errores.
Para ilustrar el impacto sobre el costo de la detección anticipada de errores, supongamos que un
error descubierto durante el diseño cuesta corregirlo 1 unidad monetaria. De acuerdo a este costo,
el mismo error descubierto justo antes de que comience la prueba costará 6,5 unidades; durante la
prueba 15 unidades; y después de la entrega, entre 60 y 100 unidades.
38
DESARROLLO DE SOFTWARE
Podemos ver a las inspecciones de software como un repaso detallado y formal del trabajo en
progreso. Pequeños grupos de trabajadores (4 o 5) estudian el "producto de trabajo"
independientemente y luego se reúnen para examinar el trabajo en detalle.
El "producto de trabajo" puede ser: líneas de código, requerimientos, diseño y/o cualquier otro
artefacto. Los productos de trabajo son considerados “en progreso” hasta que la inspección y las
correcciones necesarias estén completas.
Grupos de inspección: Se recomienda formar grupos entre 3 y 6 personas [IEEE STD 1028-1988].
Dentro de este grupo debe incluirse al autor de los productos de trabajo.
Rol Responsabilidad
• Creador o encargado de mantener el producto que va a ser inspeccionado.
• Inicia el proceso asignando un moderador y designar junto al moderador el resto
Autor de los roles.
• Entrega el producto a ser inspeccionado al moderador.
• Reporta el tiempo de re trabajo y el nro. Total de defectos al moderador.
• Planifica y lidera la revisión.
• Trabaja junto al autor para seleccionar el resto de los roles.
• Entrega el producto a inspeccionar a los inspectores con tiempo (48 hs.) antes
Moderador
de la reunión.
• Coordina la reunión asegurándose que no hay conductas inapropiadas.
• Hacer seguimiento de los defectos reportados.
Lector Lee el producto a ser inspeccionado.
Anotador Registra los hallazgos de la revisión.
Examina el producto antes de la reunión para encontrar defectos. Registra sus
Inspector
tiempos de preparación.
• Revisión General: Si los inspectores no están familiarizados con el software que se está
desarrollando, una vista general es necesaria en este momento. Este es un paso opcional,
pero no menos importante ya que en esta etapa se dará al grupo de inspección introducción
y contexto requeridos para actuar durante las inspecciones.
39
DESARROLLO DE SOFTWARE
• Reunión: En esta etapa, los inspectores se reúnen para analizar su trabajo individual en forma
conjunta. El moderador deberá asegurarse que todos los inspectores están suficientemente
preparados. La persona designada como lector presenta el "producto de trabajo",
interpretando o parafraseando el texto, mientras que cada participante observa en busca de
defectos. Es recomendable que este examen no dure más de 2 horas ya que la atención en
busca de defectos va disminuyendo con el tiempo. Al terminar con la reunión, el grupo
determina si el producto es aceptado o debe ser re trabajado para una posterior inspección.
Los dos resultados principales deben ser: Una lista de defectos a corregir, y un reporte de
inspección que describa que es lo que se inspeccionó, quien inspeccionó qué y el número de
defectos encontrados.
• Re trabajo: El autor corrige todos los defectos encontrados por los inspectores.
• El proceso de inspección debe ser llevado a cabo por personas que conozcan tanto del
dominio específico, del producto de software, así como la tecnología aplicada a las soluciones
que serán objeto de la inspección. A partir de este conocimiento en el equipo de inspección,
deberán respetarse las etapas planteadas precedentemente, creando las condiciones
necesarias para maximizar la sinergia que se produzca sobre todo en la etapa de "examen".
40
DESARROLLO DE SOFTWARE
La prueba de software, más conocida por su nombre en inglés: “testing de software” pertenece a una
actividad o etapa del proceso de producción de software denominada Verificación y Validación -
usualmente abreviada como V&V.
V&V es el nombre genérico dado a las actividades de comprobación que aseguran que el software
respeta su especificación y satisface las necesidades de sus usuarios. El sistema debe ser verificado y
validado en cada etapa del proceso de desarrollo utilizando los documentos (descripciones)
producidas durante las etapas anteriores. Cómo vimos en la sección anterior no sólo el código debe
ser sometido a actividades de V&V sino también todos los artefactos generados durante el desarrollo
del software.
Si bien estos términos en su uso cotidiano pueden llegar a ser sinónimos, para la Ingeniería de
Software tienen significados diferentes y cada uno tiene una definición precisa.
El testing es una actividad desarrollada para controlar la calidad del producto, al identificar defectos
y problemas. El testing de software consiste en la verificación dinámica del comportamiento de un
programa sobre un conjunto finito de casos de prueba, apropiadamente seleccionados, en relación
con el comportamiento esperado. Es una técnica dinámica en el sentido de que el programa se
verifica poniéndolo en ejecución de la forma más parecida posible a como se ejecutará cuando esté
en producción.
El programa se prueba ejecutando sólo unos pocos casos de prueba dado que por lo general es física,
económica y/o técnicamente imposible ejecutarlo para todos los valores de entrada posibles. De aquí
la frase de Dijkstra: “Si uno de los casos de prueba detecta un error el programa es incorrecto, pero
si ninguno de los casos de prueba seleccionados encuentra un error no podemos decir que el
programa es correcto (perfecto)”.
Esos casos de prueba son elegidos siguiendo alguna regla o criterio de selección.
Las limitaciones antes mencionadas no impiden que el testing se base en técnicas consistentes,
sistemáticas y rigurosas (e incluso, como veremos más adelante, formales). Sin embargo, en la
práctica industrial, como ocurre con otras áreas de Ingeniería de Software, usualmente se considera
sólo una parte mínima de dichas técnicas tornando a una actividad razonablemente eficaz y eficiente
en algo útil y de escaso impacto.
41
DESARROLLO DE SOFTWARE
Testear un programa significa ejecutarlo bajo condiciones controladas tales que permitan observar
su salida o resultados.
La primera lección a aprender es que no se puede probar que el sistema no tenga una falta, sí que
esté libre de fallas. El propósito de la prueba es encontrar fallas
La prueba es un proceso destructivo, tener que indagar sobre lo que hicimos para detectar lo que
hicimos mal.
Es conocido que la corrección de una falla provoca fallas adicionales, en consecuencia, si una falla
aparece debemos probar todo el software nuevamente.
Las pruebas (tests) se hacen para verificar y validar tanto requerimientos funcionales como
requerimientos no funcionales.
42