Unidad 1: Elementos de desarrollo del software

Introducción

En esta Unidad aprenderemos a

  • Reconocer la relación de los programas con los componentes del sistema informático.

  • Diferenciar código fuente, objeto y ejecutable.

  • Identificar las fases de desarrollo de una aplicación informática.

  • Clasificar los lenguajes de programación.

Tipos de software

  • De sistema (Sistema operativo, drivers -controladores-)

  • De aplicación (Suite ofimática, Navegador, Edición de imagen, ...)

  • De desarrollo (Editores, compiladores, interpretes, ...)

Los drivers son los controladores de dispositivos.

Relación Hardware-Software

  • Disco duro : almacena de forma permanente los archivos ejecutables y los archivos de datos.

  • Memoria RAM : almacena de forma temporal el código binario de los archivos ejecutables y los archivos de datos necesarios.

  • CPU : lee y ejecuta instrucciones almacenadas en memoria RAM, así como los datos necesarios.

  • E/S: recoge nuevos datos desde la entrada, se muestran los resultados, se leen/guardan a disco, ...

El disco duro se considera un periférico de E/S (Entrada/Salida).

La CPU se llama también UCP (en inglés), procesador o microprocesador.

Códigos fuente, objeto y ejecutable

  • Código fuente: archivo de texto legible escrito en un lenguaje de programación.

  • Código objeto (intermedio): archivo binario no ejecutable.

  • Código ejecutable: archivo binario ejecutable.

Sólo válido para lenguajes compilados: C, C++, Java.

En lenguajes interpretados no exite código objeto, ni binario. Solo código fuente. Por ejemplo: PHP, Javascript, ...

El código objeto en Java se denomina ByteCode.

Ciclo de vida del software

Ingeniería de software

Disciplina que estudia los principios y metodologías para el desarrollo y mantenimiento de sistemas software.

  • Algunos autores consideran que "desarrollo de software" es un término más apropiado que "ingeniería de software" puesto que este último implica niveles de rigor y prueba de procesos que no son apropiados para todo tipo de desarrollo de software.

Desarrollo de software

Fases principales

  • ANÁLISIS

  • DISEÑO

  • CODIFICACIÓN

  • PRUEBAS

  • MANTENIMIENTO

ANÁLISIS

  • Se determina y define claramente las necesidades del cliente y se especifica los requisitos que debe cumplir el software a desarrollar.

  • La especificación de requisitos debe:

    • Ser completa y sin omisiones

    • Ser concisa y sin trivialidades

    • Evitar ambigüedades. Utilizar lenguaje formal.

    • Evitar detalles de diseño o implementación

    • Ser entendible por el cliente

    • Separar requisitos funcionales y no funcionales

    • Dividir y jerarquizar el modelo

    • Fijar criterios de validación

DISEÑO

  • Se descompone y organiza el sistema en elementos componentes que pueden ser desarrollados por separado.

  • Se especifica la interrelación y funcionalidad de los elementos componentes.

  • Las actividades habituales son las siguientes:

    • Diseño arquitectónico

    • Diseño detallado

    • Diseño de datos

    • Diseño de interfaz de usuario

CODIFICACIÓN

  • Se escribe el código fuente de cada componente.

  • Pueden utilizarse distintos lenguajes informáticos:

    • Lenguajes de programación: C, C++, Java, Javascript, ...

    • Lenguajes de otro tipo: HTML, XML, JSON, ...

PRUEBAS

  • El principal objetivo de las pruebas debe ser conseguir que el programa funcione incorrectamente y que se descubran defectos.

  • Deberemos someter al programa al máximo número de situaciones diferentes.

MANTENIMIENTO

  • Durante la explotación del sistema software es necesario realizar cambios ocasionales.

  • Para ello hay que rehacer parte del trabajo realizado en las fases previas.

  • Tipos de mantenimiento:

    • Correctivo: se corrigen defectos.

    • Perfectivo: se mejora la funcionalidad.

    • Evolutivo: se añade funcionalidades nuevas.

    • Adaptativo: se adapta a nuevos entornos.

Resultado tras cada fase (I)

  • Ingeniería de sistemas: Especificación del sistema

  • ANÁLISIS: Especificación de requisitos del software

  • DISENO arquitectónico: Documento de arquitectura del software

  • DISENO detallado: Especificación de módulos y funciones

  • CODIFICACIÓN: Código fuente

Resultado tras cada fase (II)

( Continuación )

  • PRUEBAS de unidades: Módulos utilizables

  • PRUEBAS de integración: Sistema utilizable

  • PRUEBAS del sistema: Sistema aceptado

  • Documentación: Documentación técnica y de usuario

  • MANTENIMIENTO: Informes de errores y control de cambios

Modelos de desarrollo de software

  • Modelos clásicos (predictivos)

    • Modelo en cascada

    • Modelo en V

  • Modelo de construcción de prototipos

  • Modelos evolutivos o incrementales

    • Modelo en espiral (iterativos)

    • Metodologías ágiles (adaptativos)

Modelo en cascada (I)

Modelo en cascada (II)

  • Modelo de mayor antigüedad.

  • Identifica las fases principales del desarrollo software.

  • Las fases han de realizarse en el orden indicado.

  • El resultado de una fase es la entrada de la siguiente fase.

  • Es un modelo bastante rígido que se adapta mal al cambio continuo de especificaciones.

  • Existen diferentes variantes con mayor o menor cantidad de actividades.

Modelo en V (I)

Modelo en V (II)

  • Modelo muy parecido al modelo en cascada.

  • Visión jerarquizada con distintos niveles.

  • Los niveles superiores indican mayor abstracción.

  • Los niveles inferiores indican mayor nivel de detalle.

  • El resultado de una fase es la entrada de la siguiente fase.

  • Existen diferentes variantes con mayor o menor cantidad de actividades.

Prototipos (I)

  • A menudo los requisitos no están especificados claramente:

    • por no existir experiencia previa.

    • por omisión o falta de concreción del usuario/cliente.

Prototipos (II)

  • Proceso:

    • Se crea un prototipo durante la fase de análisis y es probado por el usuario/cliente para refinar los requisitos del software a desarrollar.

    • Se repite el paso anterior las veces necesarias.

Prototipos (III)

  • Tipos de prototipos:

    • Prototipos rápidos

      • El prototipo puede estar desarrollado usando otro lenguaje y/o herramientas.

      • Finalmente el prototipo se desecha.

    • Prototipos evolutivos

      • El prototipo está diseñado en el mismo lenguaje y herramientas del proyecto.

      • El prototipo se usa como base para desarrollar el proyecto.

Modelo en espiral (I)

  • Desarrollado por Boehm en 1988.

  • La actividad de ingeniería corresponde a las fases de los modelos clásicos: análisis, diseño, codificación, ...

Modelo en espiral (II)

Aplicado a la programación orientada a objetos

  • En la actividad de ingeniería se da gran importancia a la reutilización de código.

Metodologías ágiles (I)

  • Son métodos de ingeniería del software basados en el desarrollo iterativo e incremental.

  • Los requisitos y soluciones evolucionan con el tiempo según la necesidad del proyecto.

  • El trabajo es realizado mediante la colaboración de equipos auto-organizados y multidisciplinarios, inmersos en un proceso compartido de toma de decisiones a corto plazo.

  • Las metodologías más conocidas son:

    • Kanban

    • Scrum

    • XP (eXtreme Programming)

Metodologías ágiles (II)

Manifiesto por el Desarrollo Ágil

  • Individuos e interacciones sobre procesos y herramientas

  • Software funcionando sobre documentación extensiva

  • Colaboración con el cliente sobre negociación contractual

  • Respuesta ante el cambio sobre seguir un plan

Kanban (I)

  • También se denomina "sistema de tarjetas".

  • Desarrollado inicialmente por Toyota para la industria de fabricación de productos.

  • Controla por demanda la fabricación de los productos necesarios en la cantidad y tiempo necesarios.

  • Enfocado a entregar el máximo valor para los clientes, utilizando los recursos justos.

Kanban (II)

Pizarra kanban

Scrum (I)

  • Modelo de desarrollo incremental.

  • Iteraciones (sprint) regulares cada 2 a 4 semanas.

  • Al principio de cada iteración se establecen sus objetivos priorizados (sprint backlog).

  • Al finalizar cada iteración se obtiene una entrega parcial utilizable por el cliente.

  • Existen reuniones diarias para tratar la marcha del sprint.

Scrum (II)

XP (Programación extrema) (I)

Valores

  • Simplicidad

  • Comunicación

  • Retroalimentación

  • Valentía o coraje

  • Respeto o humildad

XP (Programación extrema) (II)

Características

  • Diseño sencillo

  • Pequeñas mejoras continuas

  • Pruebas y refactorización

  • Integración continua

  • Programación por parejas

  • El cliente se integra en el equipo de desarrollo

  • Propiedad del código compartida

  • Estándares de codificación

  • 40 horas semanales

Lenguajes de programación

Obtención de código ejecutable

  • Para obtener código binario ejecutable tenemos 2 opciones:

    • Compilar

    • Interpretar

Proceso de compilación/interpretación

  • La compilación/interpretación del código fuente se lleva a cabo en dos fases:

    1. Análisis léxico

    2. Análisis sintáctico

  • Si no existen errores, se genera el código objeto correspondiente.

  • Un código fuente correctamente escrito no significa que funcione según lo deseado.

  • No se realiza un análisis semántico.

Lenguajes compilados

  • Ejemplos: C, C++

  • Principal ventaja: Ejecución muy eficiente.

  • Principal desventaja: Es necesario compilar cada vez que el código fuente es modificado.

Lenguajes interpretados

  • Ejemplos: PHP, Javascript

  • Principal ventaja: El código fuente se interpreta directamente.

  • Principal desventaja: Ejecución menos eficiente.

JAVA (I)

  • Lenguajes compilado e interpretado.

  • El código fuente Java se compila y se obtiene un código binario intermedio denominado bytecode.

  • Puede considerarse código objeto pero destinado a la máquina virtual de Java en lugar de código objeto nativo.

  • Después este bytecode se interpreta para ejecutarlo.

JAVA (II)

  • Ventajas:

    • Estructurado y Orientado a Objetos

    • Relativamente fácil de aprender

    • Buena documentación y base de usuarios

  • Desventajas:

    • Menos eficiente que los lenguajes compilados

Tipos (I)

  • Según la forma en la que operan:

    • Declarativos: indicamos el resultado a obtener sin especificar los pasos.

    • Imperativos: indicamos los pasos a seguir para obtener un resultado.

Tipos (II)

  • Tipos de lenguajes declarativos:

    • Lógicos: Utilizan reglas. Ej: Prolog

    • Funcionales: Utilizan funciones. Ej: Lisp, Haskell

    • Algebraicos: Utilizan sentencias. Ej: SQL

  • Normalmente son lenguajes interpretados.

Tipos (III)

  • Tipos de lenguajes imperativos:

    • Estructurados: C

    • Orientados a objetos: Java

    • Multiparadigma: C++, Javascript

  • Los lenguajes orientados a objetos son también lenguajes estructurados.

  • Muchos de estos lenguajes son compilados.

Tipos (IV)

  • Tipos de lenguajes según nivel de abstracción:

    • Bajo nivel: ensamblador

    • Medio nivel: C

    • Alto nivel: C++, Java

Evolución

  • Código binario

  • Ensamblador

  • Lenguajes estructurados

  • Lenguajes orientados a objetos

Historia simplificada

Historia simplificada

Historia detallada

Historia detallada

Criterios para la selección de un lenguaje

  • Campo de aplicación

  • Experiencia previa

  • Herramientas de desarrollo

  • Documentación disponible

  • Base de usuarios

  • Reusabilidad

  • Transportabilidad

  • Imposición del cliente

Last updated