Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ingeniería de Software
Es lógico pensar que el software que se produce funciona correctamente y satisface las
necesidades del cliente, para que esto sea así es necesario que se cumplan varias etapas del
desarrollo del mismo y los recursos humanos involucrados deben ser capaces de hacerlo cumplir.
Para ello resulta necesario conocer conceptos fundamentales que hacen a la Ingeniería de
software.
Los ingenieros son los encargados de hacer que los software funcionen, para ello aplican teorías,
métodos y herramientas de forma selectiva, tratando de descubrir soluciones a los problemas
existentes o futuros, aún cuando no existan teorías o métodos aplicables a la resolución de dichos
problemas.
El trabajo del ingeniero debe ser sistémico y organizado, como lo determina la Ingeniería, si quiere
obtener un software de alta calidad, pero a su vez necesita ser flexible a los cambios y tener un
enfoque más informal y creativo para algunos casos que lo requieran.
Para entender mejor la definición primero tiene que conocer el concepto de software.
¿Qué es software?
El software es más que programas; tiene una característica muy importante que hay que atender:
es un sistema.
Antes de mirar más profundamente el proceso de creación de software, será útil explorar algunos
aspectos del software mismo. Como dice el viejo adagio: “para derrotar a tu enemigo hay que
conocerlo”. (Freeman).
Lo importante es definir qué es software, cómo se piensa en él y qué papel cuenta en un contexto
mayor. Si nuestro concepto de software es sólo desde el punto de vista de una computadora, será
sólo programas, líneas de código que se producen en un determinado tiempo; esto es un error, ya
que nos llevará a tener montañas de códigos que no se integrarán como sistema y que no
lograrán satisfacer las necesidades del cliente, aunque técnicamente sean correctos.
Cualquiera sea el tipo de software, requiere de información que lo acompañe para su correcto
entendimiento y uso para luego mantenerlo, caso contrario lo llevará a tener errores que no
podrán ser salvados en el tiempo.
Su Naturaleza y Cualidades:
El software es fácilmente modificable, lo que implica que el código responde a una lógica y
normalmente es de quien lo construye, por lo que si cambia el actor es muy posible que
cambie el código.
No es tangible, como otros productos. Al ser intangible no es fácil imaginarse el tamaño o
la forma del software, muchas veces se cree que realizar una aplicación o una nueva
funcionalidad es algo simple, pero la mayoría de las veces implica un gran trabajo difícil de
visualizar.
Cualidades Representativas:
Correctitud, confiabilidad y robustez
o Correctitud: un programa es “funcionalmente correcto” si se comporta acorde a la
especificación de la función que debería proveer.
o Confiabilidad: un programa es confiable si el usuario puede depender de él. El
software no debe causar daño físico o económico si falla.
o Robustez: un programa es robusto si se comporta “razonablemente”, aún en
situaciones que no fueron anticipadas en los requerimientos.
Performance: afecta la usabilidad de un sistema
Confiabilidad: El software no debería malgastar el uso de los recursos del sistema.
Amigabilidad: esto ocurre si los seres humanos lo encuentran fácil de usar
Verificabilidad: esto ocurre si sus propiedades pueden ser verificadas fácilmente
Desde los años ‟60 se comenzó a separar el concepto de software de hardware, fue entonces que
comenzó a constituirse como producto.
El software es tanto un producto como un objeto técnico, esto es: conocimiento empaquetado.
Este conocimiento es de las personas que intervienen en el proyecto, cada uno aporta algo a un
todo, si este conocimiento no queda documentado se pierde en el tiempo, ya sea porque las
personas se van del proyecto o por olvido.
Las visiones del producto de software atienden a distintos actores, cada uno espera algo distinto
de él:
Usuario: que sea confiable, eficiente y fácil de usar.
Productor: que sea verificable, mantenible, portable y extensible.
Administrador del proyecto: productivo y fácil de controlar.
Es por ello que el software que se entrega es un producto compuesto por programas ejecutables y
documentación que lo acompaña.
Si unimos todos los eslabones de esta cadena de conceptos, podemos identificar qué es un
“Sistema producto”:
Tiene el “pulido” de un programa
Múltiples partes de un sistema
Su costo de desarrollo cuesta alrededor de 9 veces más que un simple programa
Otras de las diferencias importantes de entender son las relacionadas con la Ingeniería en
sistemas.
La Ingeniería en Sistema se ocupa de todos los aspectos del desarrollo de un sistema (aspectos
humanos, de software, de hardware, de procesos, otros), mientras que la Ingeniería en Software
es parte de ese proceso.
Así la Ingeniería de software debe cumplir con los siguientes principios, que son indispensables
para lograr un producto final de calidad:
Rigor y formalidad
Separación de intereses
Modularidad
Abstracción
Anticipación al cambio
Generalidad
Incrementabilidad
El Rol del Ingeniero de Software. A veces se confunden los roles con los ingenieros de otras
disciplinas; si bien tienen algunas en común, es bueno identificar aquellas que hacen
específicamente al rol del Ingeniero en Software:
Buen programador. Es necesario que reúna las características de un buen programador,
no es indispensable que sea en un lenguaje determinado, sino que haya adquirido las
herramientas necesarias para resolver un problema a través de la programación.
Enfoques de diseño. Debe ser capaz de realizar buenos diseños de software.
Niveles de abstracción, haber adquirido un nivel de abstracción que le permita ver la
solución de forma intangible.
Saber modelar. Realizar un modelo conceptual es indispensable para luego poder
plasmarlo en el producto concreto.
Habilidades de comunicación interpersonal. La comunicación y las buenas relaciones con
los integrantes del equipo son fundamentales para lograr un ambiente de trabajo
productivo.
La noción de Ingeniería del software fue introducida en 1968 en una conferencia para discutir lo
que se llamó “Crisis del software”, resultado de la introducción de nuevas tecnologías en hardware
basadas en circuitos integrados. Así, el software que se producía implicaba nuevos conocimientos
y nuevos lenguajes de programación con software de magnitudes mayores y más complejos que
los sistemas previos.
Durante años el desarrollo de Software ha sido un arte, una tarea artesanal basada en el
conocimiento de los desarrolladores de código y del cliente. Se suponía que el cliente sabía lo que
necesitaba y lo solicitaba, generalmente lo hacía directamente a los desarrolladores y en el mejor
de los casos al Gerente del área de Investigación y Desarrollo.
Este tipo de práctica sólo llevó a vivir “La crisis del software”, clientes insatisfechos y pérdida de
dinero para los dueños de las consultoras.
Esta forma de trabajar tiene un alto riesgo, cuando se carece de profesionalidad y calidad en el
producto final.
Para revertir esta situación en un principio se incorporó una persona como intermediario entre el
cliente y el desarrollador, el “Comercial” quien tenía la función de comunicar el requerimiento del
cliente a desarrollo, pero es evidente que entre lo que el cliente ve, necesita, piensa que ve o
piensa que necesita y lo que recepta el intermediario hay diferencias, de más está decir que la
diferencia se amplía cuando se transmite, lo que lleva inevitablemente a no cubrir las expectativas
del cliente.
¿Cuánto tiempo y dinero se pierde cada vez que se trata de resolver un error? Se cobra por
desarrollar un software y por mantenerlo pero no para solucionarlo, donde las horas de
recodificación son a cargo del dueño de la consultora de software.
Con estas medidas podríamos solucionar en parte los problemas, es común escuchar expresiones
tales como, “El problema es el código”, “los que no saben son los desarrolladores”, pero la verdad
no es ésa.
Está comprobado que el mayor problema está en la captura del requerimiento, tarea que requiere
de conocimiento de negocio, de análisis y diseño de interfaz gráfica, porque es la persona
encargada de interpretar correctamente el problema, transmitirlo y documentarlo con la garantía
de que éste responde al requerimiento del cliente. Tan importante es esta tarea que hoy es tratada
como “Ingeniería de Requerimiento”.
La experiencia previa en la construcción de estos sistemas mostró que un enfoque informal para
el desarrollo del software no era bueno. Los grandes proyectos no se entregaban en término con
retrasos de años, costaban mucho más que lo presupuestado, totalmente irrealizables, difíciles de
mantener y con pobre desempeño.
Mientras el hardware mostraba avances tecnológicos que lo hacían superior y bajaban los costos,
el software sufría una evolución totalmente al revés.
Estaba claro que se necesitaba revertir esta situación y para ello había que fijar los lineamientos
para que la producción de software se convirtiera en una Ingeniería, nuevas técnicas y métodos
para controlar la complejidad inherente a los grandes sistemas.
En estos tiempos donde las empresas necesitan ser competitivas, responder al dinamismo de los
cambios en forma eficiente es sumamente importante, para ello se define un correcto proceso de
software, donde el cliente está al inicio y al final, desde el requerimiento hasta la entrega,
estableciendo las etapas mínimas que garantizan un producto de calidad y la satisfacción del
cliente.
Sabemos que no hay un “ideal” de la Ingeniería de software, debido a la gran diversidad de tipos
de sistemas y organizaciones que los usan, por lo que necesitamos tener diversos enfoques para
el desarrollo de software, no obstante, las nociones fundamentales de procesos y organización del
sistema constituyen la base de todas las técnicas y, a su vez, son la esencia de la Ingeniería de
software.
Concepto de sistema
Esta definición es tan amplia que puede incluir a sistemas tan simples como puede ser un velador
o un bolígrafo, hasta los sistemas muy complejos como podría ser un sistema de aviación o de
seguridad aérea, entre muchos otros casos posibles que incluyen diversas tecnologías, hardware
y software.
Significa que estos sistemas incluyen los procesos y procedimientos operativos, las
personas que lo operan, las reglas internas, de negocio, como también las reglas externas
que rigen su uso y funcionamiento. Como ejemplo podemos citar un sistema de facturación
que incluye los procesos necesarios, las reglas impositivas que lo rigen y las reglas
internas de la organización.
Entre estas propiedades no funcionales, la fiabilidad es quizás la más importante ya que se puede
aplicar a los cinco componentes principales de los sistemas socio-técnicos, fiabilidad del
hardware, del software, de las personas que lo operan, de los procesos definidos y de los datos
utilizados.
El desarrollo de sistemas tiene un alcance limitado para rehacer el trabajo. Cuando se han
tomado las decisiones en la Ingeniería del sistema se han planteado las etapas y las
acciones de cada una, donde cada etapa verifica con la anterior si el camino es el correcto,
por lo que pensar en cambios a la mitad del proceso traería costos y riesgos muy grandes.
Las etapas que se identifican en el proceso de Ingeniería de sistemas son las siguientes:
o Definición de requerimientos
o Diseño del sistema
o Desarrollo del subsistema
o Integración del sistema
o Instalación del sistema
o Evolución del sistema
o Desmantelamiento del sistema
Requerimientos Productos y
Ideas Actividades servicios
Tiempo
Si bien no se puede tratar al proceso de software como una serie de actividades preestablecidas e
inmodificables, ya que cada producto de software final es único y atiende a características de
organización, cliente, proyecto y factores internos y externos, se identifican 4 actividades
fundamentales para todos los procesos, que son:
Especificación del software. Se trata de definir las funcionalidades que deberá tener el
software y las restricciones en su operación.
Diseño e implementación del software. Primero se diseña la solución y luego se produce el
software que cumpla con la especificación.
Validación del software. Se valida con el cliente la funcionalidad del software asegurando
que realiza lo que el cliente desea y necesita.
Evolución del software. Las organizaciones son sistemas dinámicos que se acomodan a
los cambios, el software debe evolucionar para cubrir las necesidades de cambio que
plantea el cliente.
Cada empresa adopta el proceso con las etapas que considera mejor según el equipo de gente
que dispone, siempre teniendo en cuenta estas 4 actividades fundamentales.
Todo proceso de construcción de software lleva un tiempo desde que es requerido por el cliente
hasta que se finaliza y se entrega el producto final, luego viene el mantenimiento del mismo. Este
tiempo es el “Ciclo de Vida”.
Como ciclo de vida, tiene un comienzo y puede tener un fin, de acuerdo al límite que se determine,
en ese tiempo es que se dan las actividades fundamentales que vimos anteriormente.
Como determinamos que no existe un proceso ideal, es que este proceso ha tomado distintas
formas en el tiempo, de acuerdo a la respuesta obtenida y la retroalimentación que se realiza del
mismo.
Dentro de una organización pueden existir sistemas que están funcionando y que quizás no
cumplan con todas las necesidades del cliente, pero que no se pueden dejar de usar. Las nuevas
funcionalidades tendrán que tener en cuenta estos sistemas para su integración. Estos sistemas
se consideran “Sistemas heredados”, en algunos casos no se pueden modificar, sólo utilizar, en
otros casos se puede modificar, pero si no poseen documentación es una tarea muy compleja.
Las nuevas funcionalidades o los sistemas completos se pueden desarrollar o adquirir, o sea que
en una organización pueden coexistir sistemas heredados, sistemas propios y sistemas
adquiridos; es necesaria la integración de las partes para alcanzar la funcionalidad, el objetivo y el
trabajo como sistema.
Esta definición puede aplicarse al proceso de desarrollo de software; el modelo se plantea teórico,
para facilitar su comprensión y el estudio de su comportamiento.
Definición de modelo de procesos de software planteado por SOMMERVILLE, IAN (“Ingeniería del
Software”, pág. 25): “Un modelo de procesos es una descripción simplificada de un proceso del
software que presenta una visión de ese proceso.”
Esta definición la podemos interpretar como: La serie de pasos a través de los cuales el producto
progresa, teniendo en cuenta las personas involucradas en la ingeniería del software.
Para tener las ventajas descriptas anteriormente son necesarios los modelos de ciclos de vida, así
como conocerlos para poder elegir cuál es más conveniente utilizar, de acuerdo al caso a resolver
y a la situación.
Recordemos que el ciclo de vida de un proyecto comienza cuando el mismo forma parte de una
idea hasta la implementación en todos los usuarios que utilizarán el sistema y que un modelo de
ciclo de vida define el estado de las fases a través de las cuales se mueve un proyecto de
desarrollo de software.
Existen muchos modelos, algunos se desprenden de otros, también depende de los autores de las
distintas bibliografías. Sommerville Ian (“Ingeniería del Software”, pág. 25), plantea que “la
mayoría de los modelos de procesos del software se basan en uno de los tres modelos generales
o paradigmas de desarrollo de software”:
Fue el primer ciclo de vida de software, definido por Winston Royce a fines del 70.
Es el más básico de todos los modelos y sirve como bloque de construcción para los demás
modelos de ciclo de vida, plantea una visión simple basada en el concepto que el desarrollo de
software puede ser a través de una secuencia simple de fases. Cada fase tiene un conjunto de
metas bien definidas y las actividades dentro de una fase contribuyen a la satisfacción de metas
de esa fase o quizás a una subsecuencia de metas de la fase. Existen fases discontinuas, las
cuales no se solapan. Este modelo está orientado a la documentación.
En los primeros años tuvo mucha aceptación, luego se fueron realizando modificaciones tratando
de lograr adaptarlo a las necesidades.
A partir de los 90 ha sido sujeto a numerosas críticas, debido a que es restrictivo y rígido, lo cual
dificulta el desarrollo de proyectos de software moderno.
Especificación de
Requerimiento Definición
Análisis
Especific.
Diseño
Implementación y
Unidad de Testeo Desarrollo
Integración
Implementación Mantenimiento
Debido a las desventajas del modelo, muchos modelos nuevos de ciclo de vida han sido
propuestos, incluyendo modelos que pretenden desarrollar software más rápidamente, más
incrementalmente, de una forma más evolutiva o precediendo el desarrollo a escala total con
algún conjunto de prototipos rápidos.
Desarrollo evolutivo
El desarrollo evolutivo consiste en desarrollar una implementación inicial, entregada a los usuarios
para sus comentarios y refinándola a través de la retroalimentación y las versiones hasta lograr el
sistema adecuado.
Los requerimientos son cuidadosamente examinados y sólo aquellos que son bien comprendidos
son seleccionados para el primer incremento. Los desarrolladores construyen una implementación
parcial del sistema que recibe sólo estos requerimientos. El cliente lo usa, basado en la
retroalimentación y en los nuevos requerimientos se construye la nueva versión, así el proceso se
repite indefinidamente.
Todo lo que uno tiene que hacer es construir un subconjunto de requerimientos conocidos
(incremental) y comprender que nuevos requerimientos aparecerán cuando el sistema sea
desplegado o desarrollado.
Desarrollo exploratorio, donde se trabaja con el cliente para explorar sus requerimientos y
entregar un sistema final, comenzando siempre por los requerimientos del sistema que se
entienden mejor. El sistema crece, evoluciona con lo que el cliente va proponiendo.
Prototipos desechables, en este caso se centra en los requerimientos que no están muy
claros, por lo que el objetivo es comprender los requerimientos del cliente para poder
desarrollar una definición mejorada del sistema.
Visto desde la ingeniería de gestión, el modelo evolutivo tiene los siguientes problemas:
Carencia de Visibilidad del Proceso
Los sistemas frecuentemente son pobremente estructurados
Puede requerirse habilidades Especiales (Ej. En lenguajes de prototipación rápida)
Es factible su aplicación:
Para Sistemas interactivos de tamaño pequeño o mediano.
Para partes de sistemas grandes (Ej. Interfaces de usuario).
Para sistemas de ciclo de vida corto.
Con los avances de la programación orientada a objetos, el conocimiento de sistemas que actúan
en forma similar se ha incorporado el concepto de componente reusable.
Desarrollo e Validación
integración del sistema
Diseño de sistemas con reutilización: esta etapa se relaciona con el marco de trabajo, son los
diseñadores los que tienen en cuenta los componentes que se reutilizan para organizar el marco
de trabajo que los satisfaga o bien diseñar nuevos componentes porque no se cuenta con los
necesarios.
Este modelo tiene mucho en común con el enfoque que está surgiendo en los últimos años para el
desarrollo de sistemas que se basan en la integración de servicios Web.
Modelo incremental
Si el desarrollo de sistema es complejo y es un proyecto a largo plazo, implica que tiene asociado
demasiados riesgos, como por ejemplo que no se termine, que no cumpla con las necesidades del
cliente que cambiaron desde que lo solicitó, que el costo sea muy elevado, entre otros.
Una forma de reducir estos riesgos es construir sólo una parte de sistema, organizando por
versiones lo que se incrementa.
En el modelo incremental requiere del 100% de los requerimientos al comienzo del ciclo de vida,
se toman subconjuntos de requerimientos y se desarrollan en versiones siempre incrementando el
producto de software. El documento de requerimientos es escrito al capturar todos los
requerimientos necesarios para el sistema completo, es el que sirve de guía para los incrementos.
Este modelo es compatible con el modelo cascada, no obstante el modelo incremental provee
algunos beneficios significativos para los proyectos:
Construir un sistema pequeño es siempre menos riesgoso que construir un sistema
grande.
Al ir desarrollando parte de las funcionalidades, es más fácil determinar si los
requerimientos planeados para los niveles subsiguientes son correctos.
Si un error importante es realizado, sólo la última iteración necesita ser descartada.
Reduciendo el tiempo de desarrollo de un sistema, decrecen las probabilidades que esos
requerimientos de usuarios puedan cambiar durante el desarrollo.
Si un error importante es realizado, el incremento previo puede ser usado.
Los errores de desarrollo realizados en un incremento, pueden ser arreglados antes del
comienzo del próximo incremento.
Requisitos Requisitos
Diseño de
Diseño Arquitectura
Diseño
detallado
Codificación
y pruebas
Desarrollo unitarias
Pruebas de
integración
Pruebas de
sistema
Instalación y
capacitación
Implementación
Aceptación del
cliente
Tanto el modelo de desarrollo incremental como el modelo de desarrollo evolutivo construyen una
serie de grandes versiones sucesivas de un producto. La diferencia radica en el conocimiento de
los requerimientos, mientras que la aproximación incremental presupone que el conjunto completo
de requerimientos es conocido al comenzar, el modelo evolutivo asume que los requerimientos no
son completamente conocidos al inicio del proyecto.
A diferencia del modelo evolutivo donde los requerimientos mejor entendidos están incorporados,
un prototipo generalmente se construye con los requerimientos entendidos más pobremente.
Veamos su gráfica:
Veamos su gráfica:
Modelo Iterativo
Este modelo tiene como objetivo obtener un protocolo de desarrollo común para cualquier tipo de
aplicación de software, minimizando los procesos que tardan mucho tiempo, para entregar
avances o compilados por módulos acompañados de su documentación facilitando la
transferencia de conocimientos entre los integrantes del proyecto y del cliente.
Se asemeja al modelo de desarrollo por prototipos, la diferencia es que en el modelo iterativo los
prototipos son entregables y tienen versión.
Veamos su gráfica:
Modelo de espiral
Cada proyecto es organizado y explotado en miniproyectos, es conveniente para modelos del ciclo
meta-vida, o sea que transcurren en el tiempo.
Es un modelo incremental con versiones, en cada una se respetan las etapas, se documenta y va
incluyendo a los productos anteriores.
Veamos su gráfica:
Se toman las características de ambos modelos, del iterativo y del incremental para lograr un
modelo con mejores aplicaciones.
Las ventajas, si bien son muchas y variadas, dependen del contexto en que se implemente el
proceso. Algunas de ellas son:
Se divide en fases, workflows centrales e iteraciones.
Resolución de problemas de alto riesgo en menores tiempos del proyecto.
Visión de avance en el desarrollo desde las primeras etapas del desarrollo.
Obtención del feedback del usuario lo antes posible, lo que permite orientar el desarrollo al
cumplimiento de sus necesidades y realizar las adaptaciones identificadas y necesarias
para cumplir con los objetivos planteados.
Menor porcentaje de fallo del proyecto, mayor productividad del equipo y menor cantidad
de defectos.
La complejidad del proyecto se maneja por partes.
El aprendizaje y experiencia del equipo se da iteración tras iteración, mejora
exponencialmente el trabajo, aumenta la productividad y permite optimizar el proceso a
corto plazo.
El trabajo iterativo deja una experiencia en el equipo que permite ir ajustando y mejorando
las planificaciones, logrando menores desvíos en la duración total del proyecto.
Adoptar este modelo no presenta grandes inversiones.
El modelo iterativo e incremental es utilizado por metodologías modernas y es adoptado por UML
(Lenguaje de modelado unificado). Su gráfica es la siguiente (fuente: Book Racional Modeler)
El gráfico del modelo iterativo e incremental presenta una tabla de dos entradas, las columnas
representan las “Fases” y las filas representan los “Flujos de trabajo”.
Los flujos de trabajo representan las actividades y son 7: Requerimientos, Análisis y Diseño,
Implementación, Prueba, Administración de configuración, Administración del proyecto y Entorno.
Las tres últimas etapas se toman como acompañamiento de todo el proceso de desarrollo.
Existen dos temas que son generales a todos los modelos, el costo de tiempo por etapas y los
riesgos.
Si bien cada modelo tiene su organización y tiempos por fases, hay cálculos promedios que se
pueden tener en cuenta para los procesos.
Integración
Test de (8%)
Mod.(7%)
C od. De
Módulos
(5%)
Diseño (6%) Manteni-
miento
Especifica- Requeri- (67%)
ción (5%) mientos
(2%)
Gestión de Riesgos
Cascada
Alto riesgo en sistemas nuevos debido a problemas de especificación y diseño.
Bajo riesgo para desarrollos bien conocidos y utilizando tecnología familiar.
Evolutivos
Bajo riesgo para nuevas aplicaciones debido a que la especificación y la programación
están muy relacionados
Alto riesgo debido a la carencia de visibilidad para el proceso.
Transformacional
Alto riesgo debido a la necesidad de tecnología avanzada y habilidades en el personal
Trataremos entonces en conjunto los modelos integrando las características de cada uno para
lograr una visión general y particular de ellos, que ayude a la toma de decisiones a la hora de
tener que elegir uno a implementar en un proyecto.
Ciclo de vida Cascada Codificación y Espiral Cascada Prototipación Entrega por Diseño por
Puro Arreglo Modificado Evolutiva Etapas Fases
Resumen:
Los temas tratados en este módulo tienen que ver directamente con la Ingeniería de software y su
relación con la Ingeniería de sistemas y la Ciencia de la computación.
Tenga en cuenta los puntos clave que remarcamos a continuación (Sommerville, Ian, capítulo 1 y
3):
En cuanto a los sistemas y las Ingenierías puede destacar los siguientes puntos clave
(Sommerville, Ian, capítulo 2):
Proceso de Software
o Un conjunto coherente de actividades para especificar, diseñar, implementar y
testear un sistema de software.
Modelos de Ciclo de Vida
o Cascada demasiado inflexible
Orientado a documentos
o Modelos evolutivos y prototipos
Dependen de las decisiones tomadas antes del entendimiento del problema
o Una buena solución es integrar protipado rápido y cascada
Puntos clave a tener en cuenta, Sommerville, Ian, (capítulo 4 – temas 4.1 y 4.2):