- Introducción
- La
ingeniería del software - Gestión de
poyectos de software - Metodologías de desarrollo de
software - Ingeniería
del software orientada a objetos - Conclusiones
- Bibliografía
Introducción
Los continuos y robustos avances en el campo de la
Informática y Telecomunicaciones, han generado una
reacción positiva respecto al modo de producir software. El
aumento en capacidad de procesamiento, la disminución en
latencias de respuesta a consultas, la disminución de costos
de hardware, los avances inmensos en comunicaciones, el
surgimiento de redes globales y servicios puestos en el
Cloud, así como el acceso a virtualmente todos los
elementos de uso cotidiano, como son: computadores personales,
laptops, teléfono celulares, tabletas, eso sin dejar
atrás electrodomésticos y demás utensilios sobre
los cuales se pueda poner algo de "inteligencia" han disparado el
uso de sistemas abiertos y distribuidos.
Por lo anterior y desde hace varios años, se ha
venido cambiando la conciencia y necesidad de cambio de
mentalidad en el diseño y producción de software. Es
por eso que este ensayo cubrirá los conceptos relevantes que
nos permitirán entender porque el desarrollo de software es
mucho más que variables, funciones, ciclos repetitivos,
etc., ya que desarrollar software es una forma directa de generar
valor a las personas a través de la organización,
automatización y reestructuración de los procesos de
una compañía.
Este ensayo deberá dar respuesta a preguntas como
¿Qué es la ingeniería del software?,
¿Cuál es la mejor forma para gestionar un proyecto?,
¿Qué metodología se puede aplicar en el
desarrollo?
La ingeniería del
software
Muchas personas asocian el término software
únicamente a los programas de computador, sin embargo
sería bueno entregar al entendimiento colectivo una
definición más precisa, más amplia en donde el
software no solo son programas, sino también los documentos
asociados y la configuración de datos que se requiera para
hacer que estos programas funciones correcta y
efectivamente.
Partiendo de esta premisa, la Ingeniería de
Software es una disciplina de la ingeniería que comprende la
totalidad de los aspectos de producción de software. De
ahí la diferencia entre ingeniería del software y
ciencia de la computación, donde ésta la última
comprende la teoría y fundamentos, mientras que la primera
comprende las maneras prácticas para desarrollar y entrega
un software útil y de calidad.
El sentido común no falla, la
ingeniería la aplican los ingenieros y, los ingenieros son
aquellos quienes hacen uso de la inteligencia para buscar
soluciones a un problema presente, sin ser cualquier tipo de
soluciones, sino soluciones que generen valor a lo que se hace y
como se hace.
Lamentablemente no siempre se cuenta con los recursos
necesarios para llegar a las soluciones planteadas, es por eso
que de esta manera, se valora el ingenio del
ingeniero.
La ingeniería del software gira en torno al modelo
de desarrollo general de la siguiente figura en donde se inicia
con el planteamiento de un problema, seguido de un diseño,
una implementación, una operación y finalmente una
evaluación apoyados sobre unos objetivos claros como lo
son:
Mejorar calidad del producto, fácil
mantenimiento y entrega en plazo acordadoElevar nivel de productividad en la ejecución
del trabajo de los ingenieros del softwareProporcionar elementos que faciliten el desarrollo
del softwareEntregar pautas y/o patrones que permitan un
desarrollo eficiente y de calidad
Figura 1 –
[1]Modelo Ingeniería del
Software
Proceso de la ingeniería de software de acuerdo a
[2]Roger Pressman, define el proceso de
la ingeniería del software como "la unión que
mantiene unidas las capas de tecnología y que permiten un
desarrollo racional y oportuno de la ingeniería del
software".
Los métodos de la ingeniería del software
indican claramente cómo construir de modo técnico. Los
métodos cubren una gama de tareas que incluyen el
análisis de requisitos o planeación, diseño,
construcción de programas, pruebas y mantenimiento o
soporte.
Las herramientas de la ingeniería del software
proporcionan un soporte automático y semiautomático.
Cuando se integran dichas herramientas, para que la
información creada por una herramienta pueda ser utilizada
por otra herramienta, se establece un sistema de soporte
denominado Ingeniería asistida por computadora
(Computer-aided Software Engineering CASE) el cual
combina, software, hardware y una base de datos utilizados para
generar un entorno de Ingeniería del software que sea
análogo a CAD/CAE (computer-aided
design-engineering).
De acuerdo a lo anterior, el producto obtenido de la
Ingeniería del Software consiste en los programas de calidad
desarrollados, la documentación asociada y un proceso final
de evaluación estabilización y soporte
efectivo.
Gestión de poyectos de
software
La gestión de proyectos de software es una parte
esencial en la Ingeniería del Software y, aunque no puede
garantizar el éxito del proyecto, una mala gestión
usualmente lleva a su fracaso, entregando el software tarde, con
sobre costos y muchas veces los requerimientos no son cubiertos
totalmente.
Los gestores de Software pueden hacer un trabajo similar
al de los gestores de otro tipo de proyecto, sin embargo, la
Ingeniería del Software es diferente en muchos aspectos,
algunos de ellos están relacionados en que es un intangible,
no existe un proceso estándar en su desarrollo y por lo
general el producto debe ser hecho a la medida del cliente. De
ahí la importancia de su gestión.
Etapas
Planificación
Determinación de un curso de acciones
para alcanzar los objetivos organizacionales. La
planificación es la definición de qué se va a
hacer, hasta donde se pretende o se puede llegar y cómo se
logrará.
Organización
Discusión y establecimiento de las
relaciones entre unidades de trabajo para el cumplimiento de
objetivos previo otorgamiento de responsabilidades y autoridad
para alcanzar los objetivos.
Staffing
Selección de entrenamiento y
certificaciones necesarias para los cargos dentro de la
organización.
Dirección
Creación de una atmósfera de
apoyo y motivación al equipo involucrado para alcanzar los
resultados deseados.
Control
Establecimiento, evaluación y
medición del desempeño en la ejecución de las
actividades a través de los objetivos planteados
[3]VARAS, 1998).
Actividades Derivadas
Las siguientes actividades son derivadas del que hacer
en las etapas mencionadas anteriormente y se detallan a
continuación:
Planificación:
Fijar objetivos y metas.
Desarrollar las estrategias
necesarias.Desarrollar las políticas
definidas.Anticipar a situaciones
futuras.Conducir establecimiento de
riesgos.Determinar los posibles cursos de
acción.Tomar las decisiones de
planificación respectivas.Fijar los procedimientos y las
reglas.Desarrollar planes del
proyecto.Preparar los presupuestos.
Documentar los planes establecidos.
Organización:
Identificar y agrupar funciones,
actividades y tareas del proyectoSeleccionar las estructuras
organizacionales.Crear las posiciones
organizacionales.Definir las responsabilidades y
autoridades.Establecer perfiles para cada
rol.Documentar todas las decisiones
organizacionales.
Staff:
Completar los roles dentro de la
organizaciónAsimilar al personal
asignadoEntrenar y certificar si es posible al
personalEvaluar, valorar y motivar al
personalCompensar los esfuerzos
realizados
Dirección:
Proveer un liderazgo
asertivo.Supervisar el personal.
Delegar autoridad.
Motivar al personal.
Construir equipos
interdisciplinarios.Coordinar todas actividades
derivadas.Facilitar la
comunicación.Resolver los conflictos que se
presenten.Manejar y documentar los
cambios.Documentar decisiones de
dirección
Control:
Desarrollar los estándares de
desempeño.Establecer los sistemas de monitoreo y
reportes.Medir y analizar resultados.
Iniciar acciones correctivas
Recompensar y disciplinar al
personal.Documentar los métodos de control
(VARAS, M.1998)
Proceso de Software
La mejor forma de entender un proceso de software es
conociendo los custro pilares que sostienen la mesa; las
personas, el producto, el proceso y el proyecto. Gestor que se
olvide que el trabajo de ingeniería de software es un
esfuerzo humano intenso, no tendrá éxito en su
gestión. El factor humano es tan importante que el Instituto
de Ingeniería de Software ha desarrollado un modelo de
madurez de la Capacidad de Gestión de Personal con el objeto
de atraer, motivar, desplegar, aumentar y retener el talento
necesario para llevar a cabo proyectos de gran
envergadura.
Para la gestión exitosa de un proyecto de software,
es necesario comprender y establecer los contras que puedan
presentarse en su desarrollo, preguntándose ¿Qué
puede salir mal? y ¿Cómo hacerlo de la forma correcta?.
Para determinarlo existen 10 señales que indican si un
proyecto está en peligro:
Los desarrolladores no comprenden las
necesidades y requerimientos del clienteEl ámbito del producto no se
encuentra definido adecuadamenteLos cambios se encuentran mal
realizadosCambio en la tecnología
utilizadaLas necesidades del negocio están
mal definidas o cambianLas fechas de entrega no son
realísticasLos usuarios no colaboran en la
implantación, se resistenSe pierden los
[4]sponsors o nunca se obtuvieron de la forma
adecuadaLos gestores y desarrolladores evitan
las Best Practices[5]y sabias
lecciones (REEL, 1999).
Métricas
Algo medible es algo controlable, por esto es imperativo
y fundamental en la ingeniería de software. La medición
permite realizar un seguimiento a aquello que está en
desarrollo, para este caso, el software. William Thomson dijo en
alguna ocasión:
"Cuando pueda medir lo que está diciendo y
expresarlo con números ya conoce algo sobre ello; cuando no
pueda medir, cuando no pueda expresar lo que dice con
números, su conocimiento es precario y deficiente: puede ser
el comienzo del conocimiento, pero en sus pensamientos, apenas
está avanzando hacia el escenario de la
ciencia".
Las métricas de software comprenden un gran
compendio de mediciones para el software de un computador. La
medición puede aplicarse al proceso per-ce como al intento
de mejorar una línea base continua. Se puede implementar en
el proyecto para ayudar en la estimación, control de
calidad, evaluación de productividad y control del
proyecto.
Finalmente se hace alusión a 4 razones
para medir los procesos del software, productos y
recursos:
Caracterizar, para tener una mejor
comprensión de los procesos
Evaluar, para determinar el estado con
respecto al diseño
Predecir, para poder
planificar
Mejorar, al medir cuando se recoge la
información ayudando a identificar obstáculos,
ineficiencias y problemas de raíz.
Metodologías de desarrollo de
software
La crisis de software de los años 60´s
generada por los cambios que sufrió en esa época con su
contraparte el Hardware motivó la introducción de la
ingeniería del Software. Por lo anterior, se han generado
métodos que han llevado a la modificación del
pensamiento de diseñadores y programadores en búsqueda
de mejorar las fallas existentes en el proceso de creación
de software debido a la ineficacia de los modelos
precedentes.
Un proceso de software es un conjunto de pasos o
actividades producidas como resultado de la producción de
software. Las salidas registradas pueden buscar la
construcción de un lenguaje de alto nivel, desarrollar
algún otro desde cero o modificar ampliando uno existente,
configurando o integrando módulos para agregar nuevas
funcionalidades a un sistema ya existente.
El proceso de trabajo define un marco de trabajo para un
conjunto de Áreas Claves de Proceso (ACPs) que se establecen
para la entrega efectiva de la tecnología de la
ingeniería del software. Las áreas de importancia de
proceso, conforman la base de control de gestión de
proyectos y establecen el contexto sobre el cual se aplican los
métodos técnicos, se obtienen productos del trabajo, se
establecen hitos, se asegura la calidad y el cambio se gestiona
correctamente. [6]PAULK, 1993).
Los métodos de la ingeniería del software
indican claramente el cómo construir técnicamente el
software. Estos métodos abarcan una amplia gama de tareas
que incluyen análisis de requisitos, diseño,
construcción de programas, pruebas y
mantenimiento.
Aunque existen muchos diferentes de software,
actividades fundamentales comunes al proceso de métodos
son:
1. Especificación del Software: Se define
funcionalidad y restricciones de su
operación.2. Diseño e implementación del
software: Se debe procurar cumplir con las
especificaciones3. Validación del software: Se debe
validar que el software cumpla con la funcionalidad y haga lo
que el cliente necesite.4. Evolución del software:
[7]El software debe escribirse de tal
manera que evolucione con las necesidades cambiantes del
cliente."
Lo anterior propone un modelo lineal secuencial o modelo
en cascada, el cual sugiere un enfoque sistemático y
secuencial que inicia con un nivel de sistemas y progresa con el
análisis, diseño, desarrollo, pruebas y
mantenimiento.
Después de años de trabajo cometiendo errores
y de muchos cliente insatisfechos, se llega a la conclusión
de que es necesaria una interacción con el cliente, dando
origen a métodos de desarrollo evolutivos como lo es el
modelo de construcción de prototipos, en donde ya
visto que el cliente define un conjunto de requisitos generales
para el software, sin identificar correctamente requerimientos
detallados de entrada, proceso o salida, causando que los
algoritmos no sean lo suficientemente eficientes por su capacidad
de adaptación a un sistema operativo, o de la forma en que
debería tomarse la interacción hombre máquina. Es
por eso que es perentorio [8]iniciar la
recolección de requisitos donde el desarrollador y el
cliente encuentran y definen los objetivos globales para el
software, identifican los requisitos conocidos y las áreas
del esquema en donde es obligatoria más definición.
Continua con una fase de desarrollo de prototipo, diseño que
debe centrarse en esos aspectos definidos que serán visibles
al cliente/usuario. Luego entrará a una fase de
evaluación cliente/usuario que será útil para
afinar requisitos, repitiendo las faces hasta garantizar una
afinación que cumpla con los requerimientos del
cliente".
El siguiente paso en la evolución del desarrollo
del software es la reutilización del código, para la
cual se propuso el modelo de desarrollo basado en
componentes naciendo el paradigma de la programación
orientada a objetos.
Ingeniería del software
orientada a objetos
La Orientación a Objetos es una forma diferente de
pensar en el momento de desarrollar software, es un paradigma
para crear programa abstrayendo el mundo real utilizando objetos
y clases de objetos, en donde se trata de hacer de manera similar
al pensamiento humano.
El desarrollo de tecnologías orientadas a objetos
se convirtieron en la década de los noventas en motor clave
de la industria del software. No obstante, la tecnología de
objetos no es algo nuevo como algunos pregonan, por el contrario,
es una tecnología madura que se remonta a los años
sesenta [9]JOYANES, 1998) en Europa.
Figura 2 –
[10]Desarrollo Orientado a Objetos
La orientación a objetos se basa en la idea de
programación modular, dividiendo el código en partes
más simples, facilitando la reutilización del mismo ya
que al entender un sistema pensado en objetos, se pueden extraer
partes del mismo para ser implantadas en otro sin ser
necesariamente similar.
Los ochentas marcaron la era del lanzamiento de los
lenguajes orientados a objetos como lo son Objective C, Common
Lisp Object System (CIOS), Object Pascal, Ada, entre otros
volcando la atención de los desarrolladores en torno a ese
paradigma.
Los noventas fueron los años dorados de la
Orientación a Objetos, Sun Microsystems lanza un nuevo
desarrollo llamado JAVA, el cual toma lo mejor de C++ compilando
un nuevo lenguaje aprovechando el software existente facilitando
la adaptación del mismo a usus diferentes sin tener que
cambiar el código existente.
La programación orientada a objetos expresa un
programa como un conjunto de objetos que colaboran entre ellos
para la realización de tareas. Muy distinto a los lenguajes
de programación tradicionales procedurales en donde los
datos y procedimientos están separados sin relación
alguna.
Análisis Orientado a Objetos
El análisis orientado a objetos
involucra el desarrollo de un modelo orientado a objetos del
dominio de la aplicación. [11]Los Objetos
identificados son el reflejo de las entidades y operaciones
asociadas con el problema que se debe resolver".
La programación orientada a objetos se
diferencia de la programación estructurada y de la
clasificación modular por las siguientes
características básicas:
Abstracción: Cada objeto en el sistema puede
usarse como "agente" abstracto que puede realizar un trabajo,
cambiar su estado, informar y comunicarse con otros objetos
sin revelar como se implementan estas
características.
Encapsulamiento: Asegura que los objetos no
están en capacidad de cambiar el estado interno de otros
objetos de forma inesperada, únicamente los propios
métodos internos del objeto pueden acceder a su
estado.
Poliformismo: Las colecciones y referencias de
objetos pueden contener objetos de diferentes tipos y la
invocación de un comportamiento en una referencia
producirá el comportamiento correcto para el tipo real
de objeto referenciado.
Herencia: Organiza y facilita el poliformismo y
encapsulación permitiendo a dichos objetos definirse y
crearse como tipos especiales de objetos
preexistentes.
Los objetos son componentes potencialmente reutilizables
ya que son encapsulamientos independientes de las operaciones y
del estado.
Diseño Orientado a Objetos
La esencia del diseño de software es la toma de
decisiones sobre cómo se debe organizar lógicamente el
software. Este es un proceso creativo en donde cada autor lo hace
de forma particular.
En ingeniería del software existe un concepto
fundamental y es el de "Diseño Arquitectónico". Ya que
como los sistemas se dividen en pequeños subsistemas que
proporcionan una serie de salidas al sistema general, el
diseño arquitectónico es el proceso de diseño
básico que los representa, la forma de comunicación y
los mecanismos de control que existen entre ellos; a este
resultado se le denomina arquitectura del software.
"La arquitectura del sistema afecta directamente la
solidez, rendimiento y su mantenibilidad". El estilo y
estructura elegidos en el desarrollo de una aplicación puede
depender de los requerimientos funcionales del
sistema:
Rendimiento: si este es un requerimiento
crítico, la arquitectura debará basarse en la
identificación de operaciones críticas en un
pequeño número de subsistemas con tan poca
comunicación como se pueda entre estos
subsistemas.
Protección: si este es un requerimiento
crítico, se debe hacer uso de una arquitectura
estructurada en capas con los recursos más críticos
protegidos en las capas más internas debiendo aplicarse
una validación de seguridad de alto nivel.Seguridad: si este es un requerimiento crítico,
la arquitectura deberá desarrollarse para que las
operaciones relacionadas con la seguridad se localicen en un
único subsistema o un pequeño número de ellos.
Lo anterior con el objeto de reducir costos y los problemas
de validación de seguridad.
Disponibilidad: si este es un requerimiento
crítico, la arquitectura deberá enfocarse para
incluir componentes sin detener el sistema.
Mantenibilidad: si este es un requerimiento
crítico, la arquitectura del sistema deberá
pensarse en utilizar componentes independientes evitando las
estructuras de datos compartidas.
"Obviamente hay presente un conflicto potencial entre
estas arquitecturas, si existen dos o más requerimientos
compartidos, deberá encontrarse una solución
intermedia".
Como se mencionó anteriormente, existe diferentes
métodos y arquitecturas de diseño orientado a objeto
sin que haya uno mejor que otro. Por lo anterior, en siguiente es
un proceso general de actividades comunes a muchos
procesos:
Comprender y definir el contexto y los métodos
de utilización del sistema: Permite comprender la
relación directa entre el diseño del software y el
entorno externo.
Diseñar la arquitectura del sistema: Aplicar
todos los principios de diseño arquitectónico para
representar la interacción entre el software y su
entorno.Identificar los objetos principales en el sistema:
Identificar los objetos y sus clases.
Desarrollar los modelos de diseño: Muestra los
objetos y clases y los tipos de relación entre estas
entidades.
Especificar la interfaces de los objetos: Es
imperativo identificar las interfaces con el propósito
de que los objetos se puedan diseñar en
paralelo.
Conclusiones
Los cambios radicales en hardware a partir de la
última mitad del siglo anterior causaron una forzada
evolución del software, lo cual ha generado el
establecimiento de modelos, estándares y redefinición
de conceptos que ratifican un establecimiento cada vez más
fuerte de la Ingeniería del Software a nivel
mundial.
La gestión de proyectos de desarrollo de software
es motor esencial para el éxito de cualquier proyecto de
este tipo. La gestión debe fraccionarse en las etapas
definidas claramente, manteniendo en cuenta los 4 requisitos
indispensables: las personas, el producto, el proceso y el
proyecto.
La programación orientada a objetos es una
extensión actual de la tecnología que si bien ha
evolucionado desde mediados del siglo pasado, presenta hoy
día un enfoque nuevo y distinto al tradicional.
El diseño de la arquitectura es parte fundamental
de los principios de la Ingeniería del Software y es
único en el sentido de que se organiza en función de
los objetos y clases que se definirán. De hecho,
probablemente la parte más difícil del desarrollo de
software orientado a objetos es la identificación de clases
necesarias y la forma como interactúan entre
sí.
Teniendo en cuenta los principios de Ingeniería del
Software resumidos en este ensayo, profundizando en cada uno de
ellos y llevando un trabajo juicioso y concienzudo,
garantizará el éxito en cualquier proyecto de
construcción de software y, porque no? en proyectos de otro
tipo.
Bibliografía
- SOMMERVILLE, Ian. Ingeniería del Software,
Séptima Edición. Traducción, María Isabel
Alfonso Galipienso – Antonio Botía Martínez.
PEARSON EDUCATION S.A., Madrid, 2005. - VARAS, M. (1998). Gestión de
Proyectos de Desarrollo de Software. Universidad
de Concepción. Santiago de Chile. - PRESSMAN, R. (1998). IIngeniería
del Software: Un enfoque práctico, cuarta
edición, Mc-Graw Hill, Madrid - CAMPDERRICH, Benet. (2003). Ingeniería del
Software, Universidad Oberta de Cataluña,
Barcelona. - BAETJER, H. (1998). Software as Capital,
IEEE Computer Society Press, 1998. - BOEHM, B. W. (1984). Software
Engineering, IEEE Transactions on Computers, C-25,
núm. 12. - DE LA ROSA, F. (2004). Gestión de
Proyectos de Software Mediante Mapas Conceptuales,
Universidad de Sevilla, Sevilla.
Autor:
Angel Alberto Echeverry
Castano
Octubre 08 de 2014Bogotá D.C.,
Colombia
ATLANTIC INTERNATIONAL
UNIVERSITY
[1] Modelo Ingeniería del Software –
Desarrollo de Software
[2] Roger Pressman: Ingeniero de sistemas y
consultor de Ingeniería del Software en R.S. Pressman
& Associates, Inc.
[3] Gestores de Software: Gerente de
Proyectos con especialidad en Ingeniería del Software
[4] VARAS, Marcela. Ingeniero Civil
Informático Magister en Ciencias de la
Computación – Universidad de
Concepción
[5] Staff: personal involucrado en el
proyecto
[6] Sponsors: Patrocinadores del proyecto
[7] Best Practices: Mejores prácticas
definidas por entidad, ente regulador o fabricante
[8] William Thomson, primer barón
Kelvin, Irlanda, 26 de
junio de 1824 - Largs, Ayrshire,Escocia, 17
de diciembre de 1907, físico y
matemático británico
[9] PAULK: Dr. Mark C. Paulk, fué Senior
Systems Scientist en el Institute for Software
Research in the School of Computer Science en Carnegie
Mellon University
[10] SOMMERVILLE, 2005
[11] PRESSMAN, 1998