Fundamento de Ingeniería de Software - 1.1 Conceptos básicos

Introducción

En los fundamentos de ingeniería de software hablaremos de las técnicas de construir y diseñar software de manera correcta, el diseño de software es como la construcción de un producto o una casa, todo requiere un plan o diseño para posteriormente llevar a cabo la fabricación y materialización del producto que se planeó en un principio. Al momento de construir cualquier producto, ya sea una casa o un objeto, se pueden cometer errores que merman la calidad del producto en el proceso de fabricación, por ello es muy importante tener un plan y conocer muy en claro cual es el objetivo a donde se quiere llegar y cuales son los pasos necesarios para conseguirlo. De manera análoga podemos decir que la construcción de software es semejante a la construcción de cualquier otra cosa y si lo comparamos con una casa podemos ver de manera simple como la casa pasa por diferentes fases para su construcción y por diferentes especialistas durante el proceso, lo mismo sucede con el software. En la construcción de una casa podemos ver como el arquitecto se reúne con los clientes para ver cuáles son las necesidades de estos para posteriormente crear el diseño de los planos del inmueble, después ya que esta plasmada la idea se pasa a la fase de construcción con los albañiles pero el arquitecto siempre esta presente observando que se realicen las actividades como debe de ser, es decir, de la mejor manera posible, para brindar un producto de calidad ya que si este no supervisa la construcción de la obra, los resultados pueden llegar a ser pésimos en calidad y la obra final puede derrumbarse o dar como resultado algo completamente diferente a lo planeado.

En el diseño de software ocurre exactamente lo mismo, como ingenieros en sistemas no solo basta con tener el conocimiento en algún lenguaje de programación y saber como hacer uso de alguna tecnología, ya como profesionales debemos crear software de calidad que cumpla con las expectativas del cliente y que esté preparado para cualquier circunstancia.

Desarrollo

En el desarrollo de software no basta con tener los conocimientos de lenguajes de programación si no que el ingeniero debe ver más allá de lo simple y aprender nuevos conceptos que son esenciales para el desarrollo correcto de las aplicaciones, desde mi punto de vista el principal concepto a aprender son los patrones arquitectónicos, el patrón arquitectónico o también conocido como patrón de diseño hace referencia a la manera en la que construimos nuestro software, en la década de los 90’s un grupo de ingenieros en estados unidos publicaron un libro llamado “Desing Patterns” en el cual se hablo por primera vez acerca de este tema y dando pie a una nueva perspectiva en el diseño de software. Este grupo de ingenieros se dedicaban a fabricar software para las compañías americanas y trabajaban en equipo para realizar estas tareas, durante ese tiempo ellos se dieron cuenta de que para trabajar en equipo de manera organizada y al mismo tiempo permitir que el software fuera robusto era necesario establecer un estándar en las técnicas de programación y que todos los ingenieros que trabajaban bajo un mismo proyecto siguieran patrones en la manera en que creaban su código para que los demás pudieran entender y/o modificar con facilidad el código de otros programadores, por ello establecieron patrones comunes en la manera de crear el software, después con la experiencia que tenían programado para diferentes empresas se dieron cuenta que estos patrones se repetían en diferentes tipos de aplicaciones. Ellos hicieron la maravillosa tarea de documentar estos patrones y compartirlos al publico en un libro en el año de 1994. Además, con el paso del tiempo los programadores experimentados han ido fomentando estándares en la manera de programar software, todos estos estándares los conocemos comúnmente como “las buenas prácticas de programación” las cuales son variadas y en algunas ocasiones especificas del lenguaje o tecnología, pero muy semejantes en general.

Conclusión

En el diseño de software no basta con conocer los lenguajes de programación si no que también es necesario tener buenas prácticas de programación y conocer los patrones de diseño para poder crear software robusto y escalable.

Conceptos básicos

Arquitectura Cliente/Servidor: Sistema distribuido en el que un programa, el servidor, gestiona un recurso compartido, en relación con este recurso como otros programas y los clientes pueden pedir funciones determinadas.

Cardinalidad: En una asociación binaria la cardinalidad de un papel A es el número de objetos del otro papel B al que se pueden estar enlazando cada objeto da como se indica el valor máximo y mínimo de este número.

CASE: Siglas de Computer-Aided Software Engineering.

Ciclo de Vida Clásico: Ciclo de vida en el que se supone que cada etapa se basa en los productos del anterior y no se vuelve nunca a etapas anteriores sin ciclo de vida en cascada.

Ciclo de Vida: conjunto de etapas del desarrollo de software por las cuales se pasa el orden previamente establecido.

Clase abstracta: Superclase de la cual no se pueden instanciar objetos porque cada uno de sus objetos debe pertenecer a alguna de sus subclases.

Clase Asociativa: Asociación que, por el mero hecho de tener atributos y operaciones propias coma llega a ser una clase.

COBRA: Common Object Request Broker Archichecture especificaciones de un middleware para objetos distribuidos elaborado por la OMG con el fin de que se convierta en un estándar.

Ingeniería de software: Conjunto de las técnicas, métodos y herramientas que se utilizan para producir software.

Instancia: Un objeto es una instancia de su clase punto este concepto se extiende a los clasificadores.

Interfaz de usuario: Lo que ven los usuarios del funcionamiento del software.

Interfaz: Conjunto operaciones de una clase visible desde otras clases.

Middleware: Software que cumple el papel de intermediario entre múltiples clientes y múltiples servidores.

Prototipo: El prototipo de un sistema de software es una versión provisional del sistema coma que sólo tiene lo imprescindible para que el usuario pueda comprobar si se han entendido bien sus requisitos.

UML: Modelo estándar para la construcción de software orientado a objetos. Sistema abierto: sistema distribuido basado en un conjunto de normas ampliamente aceptadas en el ámbito internacional.

Ada: Lenguaje de programación que desarrolló el Departamento de Defensa estadounidense en la década de 1980 como un lenguaje estándar para desarrollar software militar se basa en investigación acerca de lenguajes de programación de la década de 1970 e incluye sentencias como tipos de datos abstractos y soporte para concurrencia. Todavía se utiliza en grandes sistemas militares y aeroespaciales complejos.

Análisis estático: Análisis basado en herramientas del código fuente de un programa para descubrir errores y anomalías punto las anomalías como las asignaciones sucesivas a una variable sin uso intermedio, pueden ser indicadores de errores de programación.

Arquitectura de referencia: Arquitectura genérica idealizada que incluye todas las características que pueden incorporar los sistemas. Es una manera de informar a los diseñadores acerca de la estructura general de dicha clase de sistema en lugar de una base para crear una arquitectura de sistema específica.

Arquitectura de software: Modelo de la estructura y organización fundamentales de un sistema de software.

Ataque de negación de servicio: Un ataque en un sistema de software basado en web que trate de sobrecargar el sistema de forma que no pueda proporcionar su servicio normal a los usuarios.

Computación en nube: La provisión de computación YO servicios de aplicación a través de internet con el uso de una nube de servidores de un proveedor externó punto la nube se implementa usando un gran número de computadoras y tecnología de virtualización para hacer usada de manera efectiva en dichos sistemas.

CVS: Herramienta de software de fuente abierta ampliamente usada para la gestión de versiones. Desarrollo de software orientado a aspectos: un enfoque del desarrollo de software que combina desarrollo generativo y basado en componentes. Se identifican las competencias, intereses, asuntoso propiedades transversales en un programa y la implementación de estas competencias se definen como aspectos.

Comentarios