Software Engineering
Software Engineering
Definiciones
IEEE define la ingeniería de software como:
(1) La aplicación de un enfoque sistemático, disciplinado y cuantificable para el desarrollo,
operación y mantenimiento de software; es decir, la aplicación de la ingeniería al
software.
(2) El estudio de enfoques como en la declaración anterior.
Fritz Bauer, un informático alemán, define la ingeniería de software como:
La ingeniería de software es el establecimiento y uso de principios sólidos de ingeniería
para obtener económicamente un software que sea confiable y funcione de manera
eficiente en máquinas reales.
Paradigmas de software
Los paradigmas de software se refieren a los métodos y pasos que se toman
al diseñar el software. Hay muchos métodos propuestos y están en
funcionamiento hoy, pero necesitamos ver en qué parte de la ingeniería del
software se encuentran estos paradigmas. Estos se pueden combinar en
varias categorías, aunque cada una de ellas está contenida entre sí:
Diseño
Mantenimiento
Programación
Paradigma de programación
Codificación
Pruebas
Integración
Software grande: es más fácil construir un muro que una casa o edificio, del
mismo modo, ya que el tamaño del software se convierte en una gran ingeniería
que tiene que avanzar para darle un proceso científico.
Escalabilidad: si el proceso del software no se basara en conceptos científicos y
de ingeniería, sería más fácil recrear un nuevo software que escalar uno existente.
Costo: a medida que la industria del hardware ha demostrado sus habilidades y la
gran fabricación ha bajado el precio de la computadora y el hardware
electrónico. Pero el costo del software sigue siendo alto si no se adapta el proceso
adecuado.
Naturaleza dinámica: la naturaleza siempre creciente y adaptable del software
depende en gran medida del entorno en el que trabaja el usuario. Si la naturaleza
del software siempre está cambiando, se deben realizar nuevas mejoras en la
existente. Aquí es donde la ingeniería de software juega un buen papel.
Gestión de calidad: un mejor proceso de desarrollo de software proporciona un
producto de software mejor y de calidad.
Operacional
Transicional
Mantenimiento
Se espera que el software bien diseñado y diseñado tenga las siguientes
características:
Operacional
Esto nos dice qué tan bien funciona el software en las operaciones. Se puede
medir en:
Presupuesto
Usabilidad
Eficiencia
Exactitud
Funcionalidad
Confianza
Seguridad
La seguridad
Transicional
Portabilidad
Interoperabilidad
Reusabilidad
Adaptabilidad
Mantenimiento
Este aspecto resume qué tan bien un software tiene las capacidades para
mantenerse en el entorno siempre cambiante:
Modularidad
Mantenibilidad
Flexibilidad
Escalabilidad
En resumen, la ingeniería de software es una rama de la informática, que
utiliza conceptos de ingeniería bien definidos necesarios para producir
productos de software eficientes, duraderos, escalables, dentro del
presupuesto y a tiempo.
Actividades SDLC
SDLC proporciona una serie de pasos a seguir para diseñar y desarrollar un
producto de software de manera eficiente. El marco SDLC incluye los
siguientes pasos:
Comunicación
Recopilación de requisitos
Estudio de factibilidad
Diseño de software
Codificación
Pruebas
Una estimación dice que el 50% de todo el proceso de desarrollo de software
debe ser probado. Los errores pueden arruinar el software desde el nivel
crítico hasta su propia eliminación. Los desarrolladores realizan las pruebas de
software mientras los desarrolladores codifican y los expertos realizan pruebas
exhaustivas en varios niveles de código, como pruebas de módulos, pruebas
de programas, pruebas de productos, pruebas internas y pruebas del producto
al final del usuario. El descubrimiento temprano de errores y su solución es la
clave para un software confiable.
Integración
Es posible que el software deba integrarse con las bibliotecas, bases de datos
y otros programas. Esta etapa de SDLC está involucrada en la integración de
software con entidades del mundo exterior.
Implementación
Operación y mantenimiento
Disposición
Modelo de cascada
Este modelo supone que todo se lleva a cabo y se lleva a cabo perfectamente
según lo planeado en la etapa anterior y no hay necesidad de pensar en los
problemas pasados que pueden surgir en la siguiente fase. Este modelo no
funciona sin problemas si quedan algunos problemas en el paso anterior. La
naturaleza secuencial del modelo no nos permite regresar y deshacer o
rehacer nuestras acciones.
Este modelo es más adecuado cuando los desarrolladores ya han diseñado y
desarrollado software similar en el pasado y conocen todos sus dominios.
Modelo iterativo
Modelo espiral
V - modelo
Creación de software
Gestión de proyectos de software
Un proyecto es una tarea bien definida, que es una colección de varias
operaciones realizadas para lograr un objetivo (por ejemplo, desarrollo y
entrega de software). Un proyecto puede caracterizarse como:
Proyecto de software
Un proyecto de software es el procedimiento completo de desarrollo de
software, desde la recopilación de requisitos hasta las pruebas y el
mantenimiento, realizado de acuerdo con las metodologías de ejecución, en
un período de tiempo específico para lograr el producto de software previsto.
Necesidad de gestión de proyectos de software.
Se dice que el software es un producto intangible. El desarrollo de software es
una especie de flujo completamente nuevo en los negocios mundiales y hay
muy poca experiencia en la creación de productos de software. La mayoría de
los productos de software están hechos a medida para satisfacer los requisitos
del cliente. Lo más importante es que la tecnología subyacente cambia y
avanza con tanta frecuencia y rapidez que la experiencia de un producto
puede no aplicarse al otro. Todas estas restricciones comerciales y
ambientales conllevan riesgos en el desarrollo de software, por lo tanto, es
esencial administrar los proyectos de software de manera eficiente.
Proyecto de gestión
Definición y configuración del alcance del proyecto
Gestión de actividades de gestión de proyectos.
Monitoreo de progreso y desempeño
Análisis de riesgos en cada fase.
Tome las medidas necesarias para evitar o salir de problemas.
Actuar como portavoz del proyecto
Planificación de proyectos
Gestión del alcance
Estimacion del proyecto
Planificación de proyectos
La planificación del proyecto de software es una tarea que se realiza antes de
que la producción del software realmente comience. Está allí para la
producción de software, pero no implica ninguna actividad concreta que tenga
ninguna conexión de dirección con la producción de software; más bien es un
conjunto de procesos múltiples, que facilita la producción de software. La
planificación del proyecto puede incluir lo siguiente:
Estimación de esfuerzo
Los gerentes estiman los esfuerzos en términos de requisitos de personal y horas
hombre requeridas para producir el software. Para la estimación del esfuerzo, se
debe conocer el tamaño del software. Esto puede derivarse de la experiencia de
los gerentes, los datos históricos de la organización o el tamaño del software se
pueden convertir en esfuerzos mediante el uso de algunas fórmulas estándar.
Estimación de costos
Esto podría considerarse como el más difícil de todos porque depende de más
elementos que cualquiera de los anteriores. Para estimar el costo del proyecto, se
requiere considerar:
Técnica de descomposición
Modelo de Putnam
Este modelo está hecho por Lawrence H. Putnam, que se basa en la distribución
de frecuencia de Norden (curva de Rayleigh). El modelo de Putnam asigna el
tiempo y los esfuerzos necesarios con el tamaño del software.
COCOMO
COCOMO significa COnstructive COst MOdel, desarrollado por Barry W.
Boehm. Divide el producto de software en tres categorías de software: orgánico,
semi-separado e integrado.
Programación de proyectos
La programación del proyecto en un proyecto se refiere a la hoja de ruta de
todas las actividades que se realizarán con el orden especificado y dentro del
intervalo de tiempo asignado a cada actividad. Los gerentes de proyecto
tienden a definir varias tareas y a proyectar hitos y organizarlos teniendo en
cuenta varios factores. Buscan tareas que se encuentran en una ruta crítica en
el cronograma, que son necesarias para completar de manera específica
(debido a la interdependencia de la tarea) y estrictamente dentro del tiempo
asignado. La disposición de las tareas que se encuentra fuera de la ruta crítica
tiene menos probabilidades de impactar en todo el cronograma del proyecto.
Para programar un proyecto, es necesario:
Divide las tareas del proyecto en una forma más pequeña y manejable
Descubre varias tareas y correlacionalas
Estimación del tiempo requerido para cada tarea
Divida el tiempo en unidades de trabajo.
Asigne un número adecuado de unidades de trabajo para cada tarea.
Calcular el tiempo total requerido para el proyecto de principio a fin
Administracion de recursos
Todos los elementos utilizados para desarrollar un producto de software
pueden asumirse como recursos para ese proyecto. Esto puede incluir
recursos humanos, herramientas productivas y bibliotecas de software.
Los recursos están disponibles en cantidad limitada y permanecen en la
organización como un conjunto de activos. La escasez de recursos dificulta el
desarrollo del proyecto y puede retrasarse con respecto al cronograma. La
asignación de recursos adicionales aumenta el costo de desarrollo al final. Por
lo tanto, es necesario estimar y asignar recursos adecuados para el proyecto.
La gestión de recursos incluye:
Identificación: tome nota de todos los riesgos posibles que pueden ocurrir en el
proyecto.
Categorizar: clasifique los riesgos conocidos en intensidad de riesgo alta, media y
baja según su posible impacto en el proyecto.
Administrar: analiza la probabilidad de ocurrencia de riesgos en varias
fases. Haga un plan para evitar o enfrentar riesgos. Intenta minimizar sus efectos
secundarios.
Supervisar: controle de cerca los riesgos potenciales y sus síntomas
iniciales. También controle los efectos de los pasos tomados para mitigarlos o
evitarlos.
Gestión de la configuración
La gestión de la configuración es un proceso de seguimiento y control de los
cambios en el software en términos de requisitos, diseño, funciones y
desarrollo del producto.
IEEE lo define como "el proceso de identificar y definir los elementos en el
sistema, controlar el cambio de estos elementos a lo largo de su ciclo de vida,
registrar e informar el estado de los elementos y las solicitudes de cambio, y
verificar la integridad y corrección de los elementos".
En general, una vez que se finaliza el SRS, hay menos posibilidades de que el
usuario requiera cambios. Si ocurren, los cambios se abordan solo con la
aprobación previa de la alta gerencia, ya que existe la posibilidad de que se
sobrepasen los costos y el tiempo.
Base
Cambio de control
Gráfico de gantt
Los diagramas de Gantt fueron ideados por Henry Gantt (1917). Representa el
cronograma del proyecto con respecto a los períodos de tiempo. Es un gráfico
de barras horizontales con barras que representan actividades y tiempo
programado para las actividades del proyecto.
Gráfico PERT
Histograma de recursos
Requisitos de Software
Los requisitos de software son una descripción de las características y
funcionalidades del sistema de destino. Los requisitos transmiten las
expectativas de los usuarios del producto de software. Los requisitos pueden
ser obvios u ocultos, conocidos o desconocidos, esperados o inesperados
desde el punto de vista del cliente.
Ingeniería de requisitos
El proceso para reunir los requisitos de software del cliente, analizarlos y
documentarlos se conoce como ingeniería de requisitos.
El objetivo de la ingeniería de requisitos es desarrollar y mantener un
documento sofisticado y descriptivo de 'Especificación de requisitos del
sistema'.
Estudio de factibilidad
Recopilación de requisitos
Especificación de requisitos de software
Validación de requisitos de software
Veamos el proceso brevemente:
Estudio de factibilidad
Recopilación de requisitos
Entrevistas
Encuestas
Cuestionarios
Análisis de tareas
Análisis de dominio
Lluvia de ideas
Prototipos
Observación
Un equipo de expertos visita la organización o el lugar de trabajo del
cliente. Observan el funcionamiento real de los sistemas instalados
existentes. Observan el flujo de trabajo al final del cliente y cómo se tratan los
problemas de ejecución. El equipo mismo saca algunas conclusiones que
ayudan a formar los requisitos esperados del software.
Claro
Correcto
Consistente
Coherente
Comprensible
Modificable
Verifiable
Priorizado
Inequívoco
Trazable
Fuente creíble
Requisitos de Software
Deberíamos tratar de entender qué tipo de requisitos pueden surgir en la fase
de obtención de requisitos y qué tipos de requisitos se esperan del sistema de
software.
En términos generales, los requisitos de software deben clasificarse en dos
categorías:
Requerimientos funcionales
Requerimientos no funcionales
Seguridad
Inicio sesión
Almacenamiento
Configuración
Actuación
Costo
Interoperabilidad
Flexibilidad
Recuperación de desastres
Accesibilidad
Los requisitos se clasifican lógicamente como
fácil de operar
respuesta rápida
manejo efectivo de errores operacionales
proporcionando una interfaz de usuario simple pero consistente
La aceptación del usuario depende en gran medida de cómo puede usar el
software. La IU es la única forma en que los usuarios perciben el sistema. Un
sistema de software que funcione bien también debe estar equipado con una
interfaz de usuario atractiva, clara, consistente y receptiva. De lo contrario, las
funcionalidades del sistema de software no se pueden utilizar de manera
conveniente. Se dice que un sistema es bueno si proporciona medios para
usarlo eficientemente. Los requisitos de la interfaz de usuario se mencionan
brevemente a continuación:
Modularización
La modularización es una técnica para dividir un sistema de software en
múltiples módulos discretos e independientes, que se espera que sean
capaces de realizar tareas de forma independiente. Estos módulos pueden
funcionar como construcciones básicas para todo el software. Los diseñadores
tienden a diseñar módulos de manera que puedan ejecutarse y / o compilarse
por separado e independientemente.
El diseño modular sigue involuntariamente las reglas de la estrategia de
resolución de problemas 'divide y vencerás', esto se debe a que hay muchos
otros beneficios asociados con el diseño modular de un software.
Ventaja de modularización:
Concurrencia
En el pasado, todo el software debe ejecutarse secuencialmente. Por
ejecución secuencial queremos decir que la instrucción codificada se ejecutará
una tras otra, lo que implica que solo una parte del programa se activará en un
momento dado. Digamos que un software tiene múltiples módulos, entonces
solo uno de todos los módulos se puede encontrar activo en cualquier
momento de ejecución.
En el diseño de software, la concurrencia se implementa dividiendo el software
en múltiples unidades independientes de ejecución, como módulos, y
ejecutándolos en paralelo. En otras palabras, la concurrencia proporciona
capacidad al software para ejecutar más de una parte del código en paralelo
entre sí.
Es necesario que los programadores y diseñadores reconozcan esos módulos,
que pueden ejecutarse en paralelo.
Ejemplo
Acoplamiento y Cohesión
Cuando un programa de software se modulariza, sus tareas se dividen en
varios módulos en función de algunas características. Como sabemos, los
módulos son un conjunto de instrucciones juntas para lograr algunas
tareas. Sin embargo, se consideran como una entidad única, pero pueden
referirse entre sí para trabajar juntas. Existen medidas por las cuales se puede
medir la calidad de un diseño de módulos y su interacción entre ellos. Estas
medidas se llaman acoplamiento y cohesión.
Cohesión
La cohesión es una medida que define el grado de intradependencia dentro de
los elementos de un módulo. Cuanto mayor es la cohesión, mejor es el diseño
del programa.
Hay siete tipos de cohesión, a saber:
Acoplamiento
El acoplamiento es una medida que define el nivel de interdependencia entre
los módulos de un programa. Indica a qué nivel los módulos interfieren e
interactúan entre sí. Cuanto más bajo sea el acoplamiento, mejor será el
programa.
Hay cinco niveles de acoplamiento, a saber:
Verificación de diseño
La salida del proceso de diseño de software es documentación de diseño,
pseudocódigos, diagramas lógicos detallados, diagramas de proceso y una
descripción detallada de todos los requisitos funcionales o no funcionales.
La siguiente fase, que es la implementación del software, depende de todos
los resultados mencionados anteriormente.
Entonces es necesario verificar la salida antes de pasar a la siguiente
fase. Cuanto antes se detecte cualquier error, mejor será o podría no
detectarse hasta que se pruebe el producto. Si los resultados de la fase de
diseño están en forma de notación formal, entonces se deben usar sus
herramientas asociadas para la verificación; de lo contrario, se puede usar una
revisión exhaustiva del diseño para la verificación y validación.
Mediante el enfoque de verificación estructurada, los revisores pueden
detectar defectos que podrían ser causados por pasar por alto algunas
condiciones. Una buena revisión de diseño es importante para un buen diseño
de software, precisión y calidad.
Tipos de DFD
DFD lógico : este tipo de DFD se concentra en el proceso del sistema y el flujo de
datos en el sistema. Por ejemplo, en un sistema de software bancario, cómo se
mueven los datos entre diferentes entidades.
DFD físico : este tipo de DFD muestra cómo se implementa realmente el flujo de
datos en el sistema. Es más específico y cercano a la implementación.
Componentes DFD
Niveles de DFD
Nivel 0 : el nivel más alto de abstracción DFD se conoce como Nivel 0 DFD, que
representa todo el sistema de información como un diagrama que oculta todos los
detalles subyacentes. Los DFD de nivel 0 también se conocen como DFD de nivel
de contexto.
Nivel 2 : en este nivel, DFD muestra cómo fluyen los datos dentro de los módulos
mencionados en el Nivel 1.
Los DFD de nivel superior se pueden transformar en DFD de nivel inferior más
específicos con un nivel de comprensión más profundo a menos que se logre el
nivel de especificación deseado.
Gráficos de estructura
El gráfico de estructura es un gráfico derivado del diagrama de flujo de
datos. Representa el sistema con más detalle que DFD. Desglosa todo el
sistema en los módulos funcionales más bajos, describe las funciones y
subfunciones de cada módulo del sistema con mayor detalle que el DFD.
El diagrama de estructura representa la estructura jerárquica de los
módulos. En cada capa se realiza una tarea específica.
Aquí están los símbolos utilizados en la construcción de diagramas de
estructura:
Saltar : se muestra una flecha apuntando dentro del módulo para representar que
Flujo de datos : una flecha dirigida con un círculo vacío al final representa el flujo
de datos.
Flujo de control : una flecha dirigida con un círculo relleno al final representa el
flujo de control.
Diagrama HIPO
El diagrama HIPO (Hierarchical Input Process Output) es una combinación de
dos métodos organizados para analizar el sistema y proporcionar los medios
de documentación. El modelo HIPO fue desarrollado por IBM en el año 1970.
El diagrama HIPO representa la jerarquía de módulos en el sistema de
software. El analista utiliza el diagrama HIPO para obtener una vista de alto
nivel de las funciones del sistema. Descompone funciones en subfunciones de
manera jerárquica. Representa las funciones realizadas por el sistema.
Los diagramas HIPO son buenos para fines de documentación. Su
representación gráfica facilita a los diseñadores y gerentes obtener una idea
gráfica de la estructura del sistema.
A diferencia del diagrama IPO (Input Process Output), que representa el flujo
de control y datos en un módulo, HIPO no proporciona ninguna información
sobre el flujo de datos o el flujo de control.
Ejemplo
Inglés estructurado
La mayoría de los programadores desconocen el panorama general del
software, por lo que solo confían en lo que sus gerentes les dicen que
hagan. Es responsabilidad de la administración de software superior
proporcionar información precisa a los programadores para desarrollar un
código preciso pero rápido.
Otras formas de métodos, que utilizan gráficos o diagramas, a veces pueden
ser interpretados de manera diferente por diferentes personas.
Por lo tanto, los analistas y diseñadores del software presentan herramientas
como el inglés estructurado. No es más que la descripción de lo que se
requiere para codificar y cómo codificarlo. El inglés estructurado ayuda al
programador a escribir código libre de errores.
Otras formas de métodos, que utilizan gráficos o diagramas, a veces pueden
ser interpretados de manera diferente por diferentes personas. Aquí, tanto el
inglés estructurado como el pseudocódigo intentan mitigar esa brecha de
comprensión.
El inglés estructurado es el que utiliza palabras simples en inglés en el
paradigma de programación estructurada. No es el código definitivo, sino una
especie de descripción de lo que se requiere para codificar y cómo
codificarlo. Los siguientes son algunos tokens de programación estructurada.
IF-THEN-ELSE,
DO-WHILE-UNTIL
Ejemplo
Pseudocódigo
El pseudocódigo se escribe más cerca del lenguaje de programación. Puede
considerarse como lenguaje de programación aumentado, lleno de
comentarios y descripciones.
El seudocódigo evita la declaración de variables, pero se escriben utilizando
algunas construcciones de lenguaje de programación real, como C, Fortran,
Pascal, etc.
El pseudocódigo contiene más detalles de programación que el inglés
estructurado. Proporciona un método para realizar la tarea, como si una
computadora estuviera ejecutando el código.
Ejemplo
Tablas de decisiones
Una tabla de decisiones representa las condiciones y las acciones respectivas
que deben tomarse para abordarlas, en un formato tabulado estructurado.
Es una herramienta poderosa para depurar y prevenir errores. Ayuda a
agrupar información similar en una sola tabla y, al combinar tablas, ofrece una
toma de decisiones fácil y conveniente.
Ejemplo
No hacer nada
Modelo de entidad-relación
El modelo de entidad-relación es un tipo de modelo de base de datos basado
en la noción de entidades del mundo real y la relación entre ellas. Podemos
mapear el escenario del mundo real en el modelo de base de datos ER. El
modelo ER crea un conjunto de entidades con sus atributos, un conjunto de
restricciones y relación entre ellas.
El modelo ER se utiliza mejor para el diseño conceptual de la base de
datos. El modelo ER se puede representar de la siguiente manera:
Entidad : una entidad en el modelo ER es un ser del mundo real, que tiene
algunas propiedades llamadas atributos . Cada atributo se define por su conjunto
de valores correspondiente, llamado dominio .
Por ejemplo, considere una base de datos de la escuela. Aquí, un estudiante es
una entidad. El estudiante tiene varios atributos como nombre, identificación, edad
y clase, etc.
Relación : la asociación lógica entre entidades se denomina relación . Las
relaciones se asignan con entidades de varias maneras. Las cardinalidades de
mapeo definen el número de asociaciones entre dos entidades.
Mapeo de cardinalidades:
Diccionario de datos
El diccionario de datos es la recopilación centralizada de información sobre
datos. Almacena el significado y el origen de los datos, su relación con otros
datos, el formato de datos para su uso, etc. El diccionario de datos tiene
definiciones rigurosas de todos los nombres para facilitar a los usuarios y
diseñadores de software.
El diccionario de datos a menudo se hace referencia como repositorio de
metadatos (datos sobre datos). Se crea junto con el modelo DFD (Diagrama
de flujo de datos) del programa de software y se espera que se actualice cada
vez que se modifique o actualice DFD.
Contenido
Flujo de datos
Estructura de datos
Elementos de datos
Almacenes de datos
Procesamiento de datos
El flujo de datos se describe mediante DFD como se estudió anteriormente y
se representa en forma algebraica como se describe.
= Compuesto de
{} Repetición
() Opcional
+ Y
[/] O
Ejemplo
Elementos de datos
Nombre primario
Nombre secundario (alias)
Caso de uso (Cómo y dónde usar)
Descripción del contenido (notación, etc.)
Información complementaria (valores preestablecidos, restricciones, etc.)
Almacén de datos
Archivos
o Interna al software.
o Externo al software pero en la misma máquina.
o Externo al software y al sistema, ubicado en diferentes máquinas.
Mesas
o Convenio de denominación
o Propiedad de indexación
Procesamiento de datos
Diseño estructurado
El diseño estructurado es una conceptualización del problema en varios
elementos de solución bien organizados. Básicamente se trata del diseño de
la solución. El beneficio del diseño estructurado es que brinda una mejor
comprensión de cómo se resuelve el problema. El diseño estructurado
también facilita que el diseñador se concentre en el problema con mayor
precisión.
El diseño estructurado se basa principalmente en la estrategia de "divide y
vencerás", donde un problema se divide en varios problemas pequeños y cada
problema pequeño se resuelve individualmente hasta que se resuelve todo el
problema.
Los pequeños problemas se resuelven mediante módulos de solución. El
diseño estructurado enfatiza que estos módulos estén bien organizados para
lograr una solución precisa.
Estos módulos están ordenados en jerarquía. Se comunican entre ellos. Un
buen diseño estructurado siempre sigue algunas reglas para la comunicación
entre múltiples módulos, a saber:
Cohesión : agrupación de todos los elementos relacionados funcionalmente.
Acoplamiento : comunicación entre diferentes módulos.
Un buen diseño estructurado tiene alta cohesión y bajos arreglos de
acoplamiento.
Proceso de diseño
Se ve todo el sistema como el flujo de datos en el sistema por medio del diagrama
de flujo de datos.
DFD muestra cómo las funciones cambian los datos y el estado de todo el sistema.
El sistema completo se divide lógicamente en unidades más pequeñas conocidas
como funciones en función de su funcionamiento en el sistema.
Cada función se describe en general.
Proceso de diseño
Atractivo
Fácil de usar
Sensible en poco tiempo
Claro para entender
Consistente en todas las pantallas de interfaz
La interfaz de usuario se divide en dos categorías:
Elementos CLI
Una interfaz de línea de comandos basada en texto puede tener los siguientes
elementos:
Símbolo del sistema : es un notificador basado en texto que muestra
principalmente el contexto en el que trabaja el usuario. Es generado por el
sistema de software.
Cursor : es una pequeña línea horizontal o una barra vertical de la altura de la
línea, para representar la posición del carácter mientras se escribe. El cursor se
encuentra principalmente en estado de parpadeo. Se mueve a medida que el
usuario escribe o elimina algo.
Comando : un comando es una instrucción ejecutable. Puede tener uno o más
parámetros. La salida en la ejecución del comando se muestra en línea en la
pantalla. Cuando se produce la salida, se muestra el símbolo del sistema en la
siguiente línea.
Elementos GUI
Una GUI de una aplicación contiene uno o más de los elementos de la GUI
enumerados:
Ventana de aplicación : la mayoría de las ventanas de aplicación utilizan las
construcciones proporcionadas por los sistemas operativos, pero muchas usan
sus propias ventanas creadas por el cliente para contener el contenido de la
aplicación.
Cuadro de diálogo : es una ventana secundaria que contiene mensajes para el
usuario y solicita que se tomen medidas. Por ejemplo: la aplicación genera un
diálogo para obtener la confirmación del usuario para eliminar un archivo.
Deslizadores
Caja combo
Cuadrícula de datos
La lista desplegable
Ejemplo
GUI móvil, GUI de computadora, GUI de pantalla táctil, etc. Aquí hay una lista
de algunas herramientas que son útiles para construir GUI:
FLUIDO
AppInventor (Android)
LucidChart
Wavemaker
Estudio visual
Parámetro Sentido
norte Vocabulario n1 + n2
norte Talla N1 + N2
Punto de función
Es ampliamente utilizado para medir el tamaño del software. Function Point se
concentra en la funcionalidad proporcionada por el sistema. Las
características y la funcionalidad del sistema se utilizan para medir la
complejidad del software.
El punto de función cuenta con cinco parámetros, denominados Entrada
externa, Salida externa, Archivos internos lógicos, Archivos de interfaz externa
y Consulta externa. Para considerar la complejidad del software, cada
parámetro se clasifica además como simple, promedio o complejo.
Veamos los parámetros del punto de función:
Entrada externa
Salida externa
Consulta externa
Entradas 3 44 66
Salidas 44 55 77
Investigación 3 44 66
Archivos 77 10 15
Interfaces 55 77 10
Sin influencia
Incidental
Moderar
Promedio
Significativo
Esencial
Todas las clasificaciones se resumen como N. El valor de N varía de 0 a 70
(14 tipos de características x 5 tipos de clasificaciones). Se usa para calcular
Factores de Ajuste de Complejidad (CAF), usando las siguientes fórmulas:
CAF = 0.65 + 0.01N
Luego,
Puntos de función entregados ( FP ) = CAF x FP sin procesar
Este FP se puede usar en varias métricas, como:
Costo = $ / FP
Calidad = Errores / FP
Productividad = FP / persona-mes
Implementación de software
En este capítulo, estudiaremos los métodos de programación, la
documentación y los desafíos en la implementación de software.
Programación estructurada
En el proceso de codificación, las líneas de código siguen multiplicándose, por
lo tanto, el tamaño del software aumenta. Gradualmente, se vuelve casi
imposible recordar el flujo del programa. Si uno olvida cómo se construyen el
software y sus programas, archivos y procedimientos subyacentes, se vuelve
muy difícil compartir, depurar y modificar el programa. La solución a esto es la
programación estructurada. Alienta al desarrollador a usar subrutinas y bucles
en lugar de usar saltos simples en el código, lo que aporta claridad en el
código y mejora su eficiencia. La programación estructurada también ayuda al
programador a reducir el tiempo de codificación y organizar el código
correctamente.
La programación estructurada indica cómo se codificará el programa. La
programación estructurada utiliza tres conceptos principales:
Análisis de arriba hacia abajo : siempre se hace un software para realizar un
trabajo racional. Este trabajo racional se conoce como problema en el lenguaje
del software. Por lo tanto, es muy importante que comprendamos cómo resolver el
problema. Bajo el análisis de arriba hacia abajo, el problema se divide en
pequeños pedazos donde cada uno tiene algún significado. Cada problema se
resuelve individualmente y los pasos se indican claramente sobre cómo resolver
el problema.
Programación modular : durante la programación, el código se divide en un
grupo más pequeño de instrucciones. Estos grupos se conocen como módulos,
subprogramas o subrutinas. Programación modular basada en la comprensión del
análisis de arriba hacia abajo. Desalienta los saltos usando declaraciones 'goto'
en el programa, lo que a menudo hace que el flujo del programa no sea
rastreable. Los saltos están prohibidos y se fomenta el formato modular en la
programación estructurada.
Codificación estructurada : en referencia al análisis de arriba hacia abajo, la
codificación estructurada subdivide los módulos en unidades de código más
pequeñas en el orden de su ejecución. La programación estructurada usa una
estructura de control, que controla el flujo del programa, mientras que la
codificación estructurada usa una estructura de control para organizar sus
instrucciones en patrones definibles.
Programacion Funcional
La programación funcional es un estilo de lenguaje de programación, que
utiliza los conceptos de funciones matemáticas. Una función en matemáticas
siempre debe producir el mismo resultado al recibir el mismo argumento. En
lenguajes de procedimiento, el flujo del programa se ejecuta a través de
procedimientos, es decir, el control del programa se transfiere al procedimiento
llamado. Mientras el flujo de control se transfiere de un procedimiento a otro, el
programa cambia su estado.
En la programación de procedimientos, es posible que un procedimiento
produzca resultados diferentes cuando se llama con el mismo argumento, ya
que el programa en sí puede estar en un estado diferente mientras lo
llama. Esta es una propiedad, así como un inconveniente de la programación
de procedimientos, en la que la secuencia o el momento de la ejecución del
procedimiento se vuelve importante.
La programación funcional proporciona medios de cálculo como funciones
matemáticas, lo que produce resultados independientemente del estado del
programa. Esto hace posible predecir el comportamiento del programa.
La programación funcional utiliza los siguientes conceptos:
Funciones de primera clase y de orden superior : estas funciones tienen la
capacidad de aceptar otra función como argumento o devuelven otras funciones
como resultados.
Funciones puras : estas funciones no incluyen actualizaciones destructivas, es
decir, no afectan a ninguna E / S ni memoria y, si no están en uso, pueden
eliminarse fácilmente sin obstaculizar el resto del programa.
Recursión : la recursión es una técnica de programación en la que una función se
llama a sí misma y repite el código del programa, a menos que coincida alguna
condición predefinida. La recursión es la forma de crear bucles en la
programación funcional.
Evaluación estricta : es un método para evaluar la expresión pasada a una
función como argumento. La programación funcional tiene dos tipos de métodos
de evaluación, estrictos (ansiosos) o no estrictos (perezosos). La evaluación
estricta siempre evalúa la expresión antes de invocar la función. La evaluación no
estricta no evalúa la expresión a menos que sea necesaria.
λ-calculus : la mayoría de los lenguajes de programación funcionales utilizan λ-
calculus como sus sistemas de tipos. Las expresiones λ se ejecutan al evaluarlas
a medida que ocurren.
Common Lisp, Scala, Haskell, Erlang y F # son algunos ejemplos de lenguajes
de programación funcionales.
Estilo de programación
El estilo de programación es un conjunto de reglas de codificación seguidas
por todos los programadores para escribir el código. Cuando varios
programadores trabajan en el mismo proyecto de software, con frecuencia
necesitan trabajar con el código del programa escrito por algún otro
desarrollador. Esto se vuelve tedioso o, a veces, imposible, si todos los
desarrolladores no siguen un estilo de programación estándar para codificar el
programa.
Un estilo de programación apropiado incluye el uso de nombres de funciones y
variables relevantes para la tarea prevista, el uso de sangría bien colocada, el
código de comentarios para la conveniencia del lector y la presentación
general del código. Esto hace que el código del programa sea legible y
comprensible para todos, lo que a su vez facilita la depuración y la resolución
de errores. Además, el estilo de codificación adecuado ayuda a facilitar la
documentación y la actualización.
Pautas de codificación
La práctica del estilo de codificación varía con las organizaciones, los sistemas
operativos y el lenguaje de codificación en sí.
Los siguientes elementos de codificación pueden definirse bajo las pautas de
codificación de una organización:
Convenciones de nomenclatura : esta sección define cómo nombrar funciones,
variables, constantes y variables globales.
Sangría : este es el espacio que queda al comienzo de la línea, generalmente 2-8
espacios en blanco o una sola pestaña.
Espacio en blanco : generalmente se omite al final de la línea.
Operadores : define las reglas de escritura de operadores matemáticos, de
asignación y lógicos. Por ejemplo, el operador de asignación '=' debe tener
espacio antes y después, como en "x = 2".
Estructuras de control : las reglas de escribir if-then-else, case-switch, while-until
y para declaraciones de flujo de control únicamente y de forma anidada.
Longitud de línea y ajuste : define cuántos caracteres deben estar allí en una
línea, principalmente una línea de 80 caracteres. El ajuste define cómo se debe
ajustar una línea, si es demasiado larga.
Funciones : define cómo deben declararse e invocarse las funciones, con y sin
parámetros.
Variables : menciona cómo se declaran y definen variables de diferentes tipos de
datos.
Comentarios : este es uno de los componentes de codificación importantes, ya
que los comentarios incluidos en el código describen lo que realmente hace el
código y todas las demás descripciones asociadas. Esta sección también ayuda a
crear documentaciones de ayuda para otros desarrolladores.
Documentación de software
La documentación del software es una parte importante del proceso del
software. Un documento bien escrito proporciona una gran herramienta y un
medio de repositorio de información necesario para conocer el proceso del
software. La documentación del software también proporciona información
sobre cómo usar el producto.
Una documentación bien mantenida debe incluir los siguientes documentos:
Documentación de requisitos : esta documentación funciona como una
herramienta clave para que el diseñador de software, el desarrollador y el equipo
de prueba realicen sus tareas respectivas. Este documento contiene toda la
descripción funcional, no funcional y de comportamiento del software previsto.
La fuente de este documento puede ser datos previamente almacenados sobre el
software, que ya están ejecutando software al final del cliente, la entrevista, los
cuestionarios y la investigación del cliente. En general, se almacena en forma de
hoja de cálculo o documento de procesamiento de texto con el equipo de gestión
de software de alta gama.
Esta documentación funciona como base para el desarrollo del software y se
utiliza principalmente en las fases de verificación y validación. La mayoría de los
casos de prueba se crean directamente a partir de la documentación de
requisitos.
Documentación de diseño de software : estas documentaciones contienen toda
la información necesaria, necesaria para construir el
software. Contiene: (a) Arquitectura de software de alto nivel, (b) Detalles de
diseño de software, (c) Diagramas de flujo de datos, (d) Diseño de base de datos
Estos documentos funcionan como repositorio para que los desarrolladores
implementen el software. Aunque estos documentos no brindan detalles sobre
cómo codificar el programa, brindan toda la información necesaria que se requiere
para la codificación y la implementación.
Documentación técnica : los desarrolladores y los codificadores reales
mantienen estas documentaciones. Estos documentos, en su conjunto,
representan información sobre el código. Mientras escriben el código, los
programadores también mencionan el objetivo del código, quién lo escribió, dónde
será requerido, qué hace y cómo lo hace, qué otros recursos usa el código, etc.
La documentación técnica aumenta la comprensión entre varios programadores
que trabajan en el mismo código. Mejora la capacidad de reutilización del
código. Hace que la depuración sea fácil y rastreable.
Hay varias herramientas automatizadas disponibles y algunas vienen con el
lenguaje de programación en sí. Por ejemplo, Java viene con la herramienta
JavaDoc para generar documentación técnica de código.
Documentación del usuario : esta documentación es diferente de todo lo
explicado anteriormente. Todas las documentaciones anteriores se mantienen
para proporcionar información sobre el software y su proceso de desarrollo. Pero
la documentación del usuario explica cómo debería funcionar el producto de
software y cómo debería utilizarse para obtener los resultados deseados.
Estas documentaciones pueden incluir procedimientos de instalación de software,
guías prácticas, guías de usuario, método de desinstalación y referencias
especiales para obtener más información, como actualización de licencias, etc.
La validación asegura que el producto en desarrollo cumple con los requisitos del
usuario.
La validación responde a la pregunta: "¿Estamos desarrollando el producto que
intenta todo lo que el usuario necesita de este software?".
La validación enfatiza los requisitos del usuario.
Verificación de software
La verificación es el proceso de confirmar si el software cumple con los
requisitos comerciales y se desarrolla siguiendo las especificaciones y
metodologías adecuadas.
La verificación asegura que el producto que se está desarrollando cumple con las
especificaciones de diseño.
La verificación responde a la pregunta: "¿Estamos desarrollando este producto
siguiendo firmemente todas las especificaciones de diseño?"
Las verificaciones se concentran en el diseño y las especificaciones del sistema.
Los objetivos de la prueba son:
Errores : estos son errores de codificación reales cometidos por los
desarrolladores. Además, hay una diferencia en la salida del software y la salida
deseada, se considera como un error.
Falla : cuando existe un error, se produce una falla. Una falla, también conocida
como error, es el resultado de un error que puede causar fallas en el sistema.
Falla : se dice que la falla es la incapacidad del sistema para realizar la tarea
deseada. La falla ocurre cuando existe una falla en el sistema.
Enfoques de prueba
Las pruebas se pueden realizar en base a dos enfoques:
Prueba de funcionalidad
Pruebas de implementación
Cuando se prueba la funcionalidad sin tener en cuenta la implementación real,
se conoce como prueba de caja negra. El otro lado se conoce como prueba de
caja blanca donde no solo se prueba la funcionalidad sino que también se
analiza la forma en que se implementa.
Las pruebas exhaustivas son el método más deseado para una prueba
perfecta. Se prueba cada valor posible en el rango de los valores de entrada y
salida. No es posible probar todos y cada uno de los valores en el escenario
del mundo real si el rango de valores es grande.
Niveles de prueba
Las pruebas en sí pueden definirse en varios niveles de SDLC. El proceso de
prueba se ejecuta en paralelo al desarrollo de software. Antes de saltar a la
siguiente etapa, se prueba, valida y verifica una etapa.
Las pruebas por separado se realizan solo para asegurarse de que no quedan
errores ocultos o problemas en el software. El software se prueba en varios
niveles:
Examen de la unidad
Pruebas de integración
Prueba de sistema
Test de aceptación
Cuando el software está listo para entregar al cliente, tiene que pasar por la
última fase de prueba donde se prueba la interacción y respuesta del
usuario. Esto es importante porque incluso si el software cumple con todos los
requisitos del usuario y si al usuario no le gusta la forma en que aparece o
funciona, puede ser rechazado.
Pruebas alfa : el propio equipo de desarrolladores realiza pruebas alfa utilizando
el sistema como si se estuviera utilizando en un entorno de trabajo. Intentan
descubrir cómo reaccionaría el usuario ante alguna acción en el software y cómo
el sistema debería responder a las entradas.
Prueba beta : después de que el software se prueba internamente, se entrega a
los usuarios para que lo usen en su entorno de producción solo con fines de
prueba. Este todavía no es el producto entregado. Los desarrolladores esperan
que los usuarios en esta etapa traigan problemas diminutos, que se omitieron
para asistir.
Pruebas de regresión
Antes de la prueba
Mientras se prueba
Después de la prueba
Tipos de mantenimiento
En la vida útil del software, el tipo de mantenimiento puede variar según su
naturaleza. Puede ser solo una tarea de mantenimiento de rutina como algún
error descubierto por algún usuario o puede ser un gran evento en sí mismo
según el tamaño o la naturaleza del mantenimiento. Los siguientes son
algunos tipos de mantenimiento basados en sus características:
Mantenimiento correctivo : esto incluye modificaciones y actualizaciones
realizadas para corregir o corregir problemas, que son descubiertos por el usuario
o concluidos por los informes de error del usuario.
Mantenimiento adaptativo : esto incluye modificaciones y actualizaciones
aplicadas para mantener el producto de software actualizado y en sintonía con el
mundo cambiante de la tecnología y el entorno empresarial.
Mantenimiento perfecto : esto incluye modificaciones y actualizaciones
realizadas para mantener el software utilizable durante un largo período de
tiempo. Incluye nuevas características, nuevos requisitos de usuario para refinar
el software y mejorar su confiabilidad y rendimiento.
Mantenimiento preventivo : esto incluye modificaciones y actualizaciones para
evitar futuros problemas del software. Su objetivo es atender los problemas, que
no son significativos en este momento pero que pueden causar serios problemas
en el futuro.
Costo de mantenimiento
Los informes sugieren que el costo de mantenimiento es alto. Un estudio
sobre la estimación del mantenimiento del software encontró que el costo de
mantenimiento es tan alto como el 67% del costo del ciclo completo del
proceso del software.
Actividades de mantenimiento
IEEE proporciona un marco para actividades de proceso de mantenimiento
secuencial. Se puede usar de manera iterativa y se puede extender para que
se puedan incluir elementos y procesos personalizados.
Estas actividades van de la mano con cada una de las siguientes fases:
Identificación y rastreo : implica actividades relacionadas con la identificación de
requisitos de modificación o mantenimiento. Es generado por el usuario o el
sistema mismo puede informar a través de registros o mensajes de error. Aquí, el
tipo de mantenimiento también se clasifica.
Análisis : la modificación se analiza por su impacto en el sistema, incluidas las
implicaciones de seguridad y protección. Si el impacto probable es severo, se
busca una solución alternativa. Un conjunto de modificaciones requeridas se
materializa en especificaciones de requisitos. Se analiza el costo de modificación /
mantenimiento y se concluye la estimación.
Diseño : los nuevos módulos, que deben reemplazarse o modificarse, están
diseñados según las especificaciones de requisitos establecidas en la etapa
anterior. Los casos de prueba se crean para validación y verificación.
Implementación : los nuevos módulos se codifican con la ayuda del diseño
estructurado creado en el paso de diseño. Se espera que cada programador
realice pruebas unitarias en paralelo.
Prueba del sistema: la prueba de integración se realiza entre los módulos recién
creados. Las pruebas de integración también se llevan a cabo entre los nuevos
módulos y el sistema. Finalmente, el sistema se prueba como un todo, siguiendo
procedimientos de prueba regresivos.
Prueba de aceptación : después de probar el sistema internamente, se prueba su
aceptación con la ayuda de los usuarios. Si en este estado, el usuario se queja de
algunos problemas que se abordan o se señalan para abordar en la próxima
iteración.
Entrega : después de la prueba de aceptación, el sistema se implementa en toda
la organización mediante un pequeño paquete de actualización o una instalación
nueva del sistema. La prueba final se lleva a cabo en el extremo del cliente
después de que se entrega el software.
Se proporciona un centro de capacitación si es necesario, además de la copia
impresa del manual del usuario.
Gestión del mantenimiento: la gestión de la configuración es una parte esencial
del mantenimiento del sistema. Se ayuda con herramientas de control de
versiones para controlar versiones, semi-versiones o gestión de parches.
Reingeniería de software
Cuando necesitamos actualizar el software para mantenerlo en el mercado
actual, sin afectar su funcionalidad, se llama reingeniería de software. Es un
proceso minucioso donde se cambia el diseño del software y se reescriben los
programas.
El software heredado no puede seguir sintonizándose con la última tecnología
disponible en el mercado. A medida que el hardware se vuelve obsoleto, la
actualización del software se convierte en un dolor de cabeza. Incluso si el
software envejece con el tiempo, su funcionalidad no lo hace.
Por ejemplo, inicialmente Unix se desarrolló en lenguaje ensamblador. Cuando
surgió el lenguaje C, Unix fue rediseñado en C, porque trabajar en lenguaje
ensamblador era difícil.
Aparte de esto, a veces los programadores notan que pocas partes del
software necesitan más mantenimiento que otras y también necesitan
reingeniería.
Proceso de reingeniería
Decide qué volver a diseñar. ¿Es todo el software o parte de él?
Realice ingeniería inversa para obtener especificaciones del software existente.
Reestructurar el programa si es necesario. Por ejemplo, cambiar programas
orientados a funciones en programas orientados a objetos.
Reestructurar los datos según sea necesario.
Aplique los conceptos de ingeniería avanzada para obtener un software
rediseñado.
Hay pocos términos importantes utilizados en la reingeniería de software
Ingeniería inversa
Ingeniería Adelante
Reutilización de componentes
Un componente es una parte del código del programa de software, que
ejecuta una tarea independiente en el sistema. Puede ser un módulo pequeño
o un subsistema en sí mismo.
Ejemplo
Proceso de reutilización
Herramientas CASE
Las herramientas CASE son un conjunto de programas de aplicación de
software, que se utilizan para automatizar las actividades SDLC. Los
administradores de proyectos de software, analistas e ingenieros utilizan
herramientas CASE para desarrollar un sistema de software.
Hay varias herramientas CASE disponibles para simplificar varias etapas del
ciclo de vida del desarrollo de software, como herramientas de análisis,
herramientas de diseño, herramientas de gestión de proyectos, herramientas
de gestión de bases de datos, herramientas de documentación, por nombrar
algunas.
El uso de herramientas CASE acelera el desarrollo del proyecto para producir
el resultado deseado y ayuda a descubrir fallas antes de avanzar con la
siguiente etapa en el desarrollo de software.
Herramientas de diagrama
Herramientas de documentación
Herramientas de análisis
Herramientas de diseño
Herramientas de programación
Herramientas de prototipos
Estas herramientas ayudan a diseñar páginas web con todos los elementos
aliados como formularios, texto, guiones, gráficos, etc. Las herramientas web
también proporcionan una vista previa en vivo de lo que se está desarrollando
y cómo se verá una vez finalizado. Por ejemplo, Fontello, Adobe Edge Inspect,
Foundation 3, Brackets.
Herramientas de mantenimiento