- 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 acordado
Elevar nivel de productividad en la ejecución del trabajo de los ingenieros del software
Proporcionar elementos que faciliten el desarrollo del software
Entregar 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 proyecto
Seleccionar 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ón
Asimilar al personal asignado
Entrenar y certificar si es posible al personal
Evaluar, valorar y motivar al personal
Compensar 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 cliente
El ámbito del producto no se encuentra definido adecuadamente
Los cambios se encuentran mal realizados
Cambio en la tecnología utilizada
Las necesidades del negocio están mal definidas o cambian
Las fechas de entrega no son realísticas
Los usuarios no colaboran en la implantación, se resisten
Se pierden los [4]sponsors o nunca se obtuvieron de la forma adecuada
Los 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 especificaciones
3. 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