Ingeniería de Software Informe de Metodología Profesor: Dr. Narciso Cerpa. Integrantes: Yannira Arancibia, Marcos Gutiérrez, Gonzalo Pincheira, Felipe Venegas P. Jueves, 14 de septiembre del 2007 1 Índice 1. Introducción……………………………………………………………………. 3 1.1. ¿Que es una metodología? 1.2. ¿Que es una metodología ágil? 1.3. Los principales valores de una metodología ágil 2. Explicación del Método de Desarrollo ASD……………………………………5 2.1. Características 2.2. Fases 2.2.1. Especular 2.2.2. Colaborar 2.2.3 Aprender 3. Tecnología………………………………………………………………………..8 3.1. Tecnología del software 3.2. Plataforma 3.2. Lenguaje 3.3. Sistema Operativo 4. Técnicas y herramientas……………………………..…………………………….8 5. Actividades de gestión……………………………..…………………………….10 5.1. Equipos de trabajo 5.1.1. Roles y responsabilidades 5.2. Documentación 5.3. Relaciones 5.3.1. Con el grupo de trabajo 5.3.2. Con el usuario 6. Conclusión…………………………………………………………………………12 7. Referencias…………………………………………………………………………13 8. Glosario…………………………………………………………………………….14 2 1. Introducción En el siguiente manual explicaremos sobre la metodología ágil ASD (Adaptive Software Development), como trabajar en ella, las fases de esta, el equipo que se debe tener para poder trabajar correctamente, entre otras cosas. Lo primero que debemos saber para poder empezar a trabajar con esta metodología es: 1.1. ¿Que es una metodología? Es la que define como se debe realizar un proyecto de desarrollo de software, respondiendo a las siguientes preguntas: Quién debe hacer Qué, Cuándo y Cómo hacerlo. No existe una metodología de software universal. Estas dependen de las características y tamaño de cada proyecto de software que se ah de realizar. Siendo las metodologías ágiles las más usadas en estos últimos tiempos. 1.2. ¿Qué es una metodología ágil? Es una estrategia de desarrollo de software que promueve prácticas que son adaptativas en vez de predictivas; centradas en las personas o los equipos, iterativas, orientadas hacia la funcionalidad y la entrega, de comunicación intensiva y que requieren implicación directa de cliente. Este tipo de metodología se creo con la necesidad de agilizar y automatizar los procesos de desarrollo de software. Estas metodologías proponen simplicidad y velocidad para crear sistemas. Los principales valores de la metodología ágil son: a) Al individuo y las interacciones del equipo de desarrollo sobre el proceso y las herramientas: La gente es el principal factor de éxito de un proyecto software. No se necesitan grandes desarrolladores sino los que se adapten bien al trabajo del equipo. Las herramientas son importantes para mejorar el rendimiento del equipo, pero no en demasía ya que pueden afectar porque puede afectar negativamente. Una vez que se crea un buen equipo estos deben crear su entorno en base a sus propias necesidades. b) Desarrollar software que funciona más que conseguir una buena documentación: La regla a seguir es no producir documentos a menos que sean necesarios de forma inmediata para tomar una decisión importante, deben ser cortos y centrarse en lo fundamental. En caso de integración de un nuevo integrante al equipo de trabajo, las herramientas que le van a servir para ponerse al día son el código y la interacción con el equipo. c) La colaboración con el cliente más que la negociación de un contrato: Esta colaboración entre ambos será la que marque la marcha del proyecto y asegure su éxito. 3 d) Responder a los cambios más que seguir estrictamente un plan: la planificación no debe ser estricta puesto que hay muchas variables en juego, debe ser flexible para poder adaptarse a los cambios que puedan surgir. Una buena estrategia es hacer planificaciones detalladas para unas pocas semanas y planificaciones mucho más abiertas para unos pocos meses. Mientras más habilidad tenga el equipo para responder a los cambios del proyecto en el camino, menos posibilidad de fracaso tendrán en este. Para saber si su proceso de desarrollo de software es ágil debe cumplir los siguientes requisitos. • • • • Incremental. Entregas pequeñas de software, con ciclos rápidos. Cooperativo. Cliente y desarrolladores trabajan juntos constantemente con una cercana comunicación. Sencillo. El método en sí mismo es simple, fácil de aprender y modificar. Esta bien documentado y es adaptable. Permite realizar cambios de último momento). 1.3. Ventaja de las metodologías ágiles Alguna de las ventajas que tienen las metodologías ágiles son: a) b) c) d) e) f) g) h) Entrega continua y en plazos cortos de software funcional. Trabajo conjunto entre el cliente y el equipo de desarrollo. Minimiza los costos frente a cambios. Importancia de la simplicidad, al eliminar el trabajo innecesario. Atención continua a la excelencia técnica y al buen diseño. Mejora continua de los procesos y el equipo de desarrollo. Evita malentendidos de requerimientos entre el cliente y el equipo. El equipo de desarrollo no malgasta el tiempo y dinero del cliente desarrollando soluciones innecesariamente generales y complejas que en realidad no son un requisito del cliente. i) Cada componente del producto final ha sido probado y satisface los requerimientos. Luego de haber conocido los términos básicos de lo que son las metodologías ágiles, nos enfocaremos en explicar como implementar la metodología ASD en el desarrollo de un proyecto de software. 4 2. Explicación de la Metodología ASD La metodología ASD es una metodología ágil y posee ciertas características que la diferencian de otras como la XP, Scrum o Cristal pero si se quisiera comparar con alguna de las metodologías ágiles se podría comparar con Scrum ya que tienen unos cuantos puntos en común sobre la utilización de prácticas para la construcción del software. En cuanto a documentación y tecnología ASD no tiene herramientas o técnicas para abordar estos puntos por lo que esto debe ser acordado por el grupo de trabajo tomando en cuenta la agilidad con la que se debe abordar el problema y con las características propias que posee el grupo de desarrolladores del proyecto. 2.1. Características Su impulsor es Jim Highsmith. Sus principales características son: - Iterativo: Ya que la base de esta metodología se enfoca en un ciclo de vida. - Orientado en los componentes del software: Definiendo este como un grupo de funcionalidades a ser desarrolladas durante un ciclo de vida. - Tolerante a cambios: Fácil adaptación a cambios repentinos de requerimientos, ya sean estos implantados por el usuario o el análisis del grupo de trabajo. 2.2. Fases Las fases en las que se trabaja la metodología ASD son tres: Especular, Colaborar y Aprender (Especulate, collaborate, learn). Estas fases o Etapas corresponden al llamado "Ciclo de Vida" con el cuál esta metodología se identifica. Sabiendo del carácter adaptativo de esta metodología, ASD nos permite tomar pequeñas "desviaciones" en cada fase en que cada ciclo debe componerse de una mezcla entre funcionalidades críticas, útiles y opcionales, en donde deben priorizarse las críticas ya que son las que ponen en jaque el proyecto, luego las útiles, que facilitaran el desarrollo del sistema y por último las opcionales las cuales no son imprescindibles en el proyecto. Todo esto con tal de prever futuros retrasos en el proyecto. 5 También se pueden tomar grandes desviaciones las cuales son beneficiosas para el sistema, ya que se utilizan para la exploración del dominio y la aplicación. 2.2.1. Especular: Esta fase consiste en realizar una planificación tentativa del proyecto tomando en cuenta las futuras entregas que se le darán al usuario protipos. En esta fase se fija un rumbo determinado el cuál será seguido en la parte de desarrollo y toma mayor énfasis en cada iteración ya que ASD posee la características de usar cada iteración para APRENDER por lo que en el momento de especular en las futuras iteraciones esto será de gran importancia ya que trabajaremos en función de esto para así abordar de una manera mas efectiva y planificada nuestra especulación. 2.2.2. Colaborar: Esta Fase del llamado ciclo de vida, es en la que se toma el rumbo mencionado antes, en la etapa de especulación, donde se construirá la funcionalidad del proyecto. Durante cada Iteración el equipo se preocupa de colaborar fuertemente para que de esta manera se logre liberar la funcionalidad planificada. En esta parte también es posible explorar nuevas alternativas pudiendo alterar fuertemente el rumbo del proyecto, pero esta es una de las razones por las que ASD está dentro de la categoría de metodologías ágiles. ASD no propone técnicas ni tareas en la etapa de construcción, lo que hace es mencionar que todas las prácticas e ideas que se llevan a cabo con el fin de reforzar la colaboración entre los desarrolladores del proyecto (otro punto que hace referencia al concepto de metodologías ágiles). La importancia de la colaboración se debe establecer en la relación entre las personas, las cuales deben estar suficientemente fuertes y claras para se pueda arreglar cualquier circunstancia compleja que se presente: emergencias*. 6 2.2.3. Aprender: Esta Fase es la última en cada ciclo y consiste en la revisión de calidad donde se analizan 4 categorías: • Calidad del resultado de la desde la perspectiva del cliente: En esta parte se sugiere, para lograr evaluar la calidad desde el punto de vista del cliente, utilizar grupos de enfoque hacia el cliente con tal de recoger nuevos requerimientos o cambios que el cliente pueda requerir. • Calidad del resultado de la desde la perspectiva técnica: Esto consiste en analizar la calidad del producto revisando el diseño, el código y las pruebas en función de lograr aprender de los errores y desvíos empleados para poder resolverlos, y esto implica no poner énfasis en encontrar culpables ya que esto afectaría las relaciones entre el grupo de trabajo. Seguido a esto viene la parte práctica de esta etapa en la cual se profundiza en las exploraciones que se hayan realizado con lo cual podremos modificar ya sea el diseño del sistema, o los posibles cambios de requerimientos que nos de el cliente. • Funcionamiento del equipo de desarrollo y las prácticas que este utiliza: En esta etapa del aprendizaje se enfatiza la interacción entre las partes, la dinámica del grupo y las técnicas que se acordaron emplear. Es importante que al final de cada ciclo de vida (postmortem), se realicen pequeñas reuniones con el fin de analizar lo aprendido Antes de realizar una iteración, se discuten los procesos que favorecen el desarrollo del proyecto y asimismo descartar los de influencia negativa siendo estos últimos, los procesos que puedan haber afectado el trabajo del grupo y los que no son compatibles con los requerimientos. • Status del proyecto: Esta ultima etapa, se revisa todo lo efectuado respecto al proyecto en función de lo que inicialmente se había planificado, tanto en la parte técnica como en la humana. En este momento es en donde se detectaran las posibles diferencias que podrían cambiar el rumbo del proyecto. Una vez que exploramos las 3 fases, se realiza el bucle de aprendizaje (learning loop), en el cual se realizan revisiones de calidad con presencia del cliente como experto. La presencia del cliente se suplementa con sesiones de talleres en el que programadores y representantes del cliente se encuentran para discutir rasgos del producto en términos no técnicos, sino que de negocios. 7 3. Tecnología En todo proyecto, si bien la parte de planificación y especulación es importante, también tenemos la parte de tecnología que es casi la más importante ya que esta condicionara procesos del desarrollo del sistema. Será la que se llevará a la práctica en el momento de presentar el producto final y en donde se trabajará en base a los requerimientos anteriormente capturados al cliente. 3.1. Tecnología del Software Para ASD la tecnología más usada y más efectiva a la hora de programar y realizar el proyecto es la orientada a objetos ya que hoy en día ya no se aplica solamente a los lenguajes de programación, además se viene aplicando en el análisis y diseño con mucho éxito. Es que para hacer una buena programación orientada a objetos hay que desarrollar todo el sistema aplicando esta tecnología, de ahí la importancia del análisis y el diseño orientado a objetos. En cuanto a la programación, la orientada a objetos (POO) es una de las formas más populares de programar y viene teniendo gran acogida en el desarrollo de proyectos de software desde los últimos años. Esto se debe a sus grandes capacidades y ventajas frente a las antiguas formas de programar. 8 Luego de esta introducción surge la pregunta: ¿Cuáles son las ventajas de un lenguaje orientado a objetos? Las ventajas más importantes son las siguientes: • • • • • • • • Fomenta la reutilización y extensión del código. Permite crear sistemas más complejos. Relacionar el sistema al mundo real. Facilita la creación de programas visuales. Construcción de prototipos Agiliza el desarrollo de software Facilita el trabajo en equipo Facilita el mantenimiento del software Lo interesante de la POO es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible y mas importante aun, se adapta perfectamente a la metodología de desarrollo ASD tomando en cuenta que el agilizar el desarrollo de software y la construcción de prototipos, por nombrar algunas características, es propio de las metodologías ágiles. Dentro de la tecnología de software distinguimos las siguientes la plataforma, el lenguaje y el sistema operativo. 3.1.2. Plataforma Respecto a la plataforma, el grupo de trabajo debe poder elegir la mas adecuada para satisfacer las necesidades y compatibilizar esto con el lenguaje de programación que se usará para dar solución a los requerimientos del cliente. 3.1.2. Lenguaje Hay una buena variedad de lenguajes de programación orientados a objetos que se adaptan perfectamente a las metodologías ágiles .Por nombrar las mas usadas y conocidas tenemos C++ que es una adaptación de C pero con conceptos de POO, también está JAVA que hereda los conceptos introducidos a C++ y por ultimo tenemos C# que combina los mejores elementos de C++ y JAVA. 3.1.3. Sistema Operativo El sistema operativo en donde se ejecutará el proyecto será el cual el cliente pida y el grupo de trabajo debe ser capaz de lograr realizarlo y ejecutarlo bajo el SO deseado. 9 4. Técnicas y herramientas Esta metodología no propone técnicas ni tareas al momento de llevar la construcción, simplemente ocuparemos las prácticas que sirvan para reforzar el desarrollo del sistema., siguiendo de esta forma la línea de las metodologías ágiles respecto a la orientación a componentes. El énfasis se ubica en las relaciones entre las personas, las cuales deben estar lo suficientemente buenas para lograr sacar lo mejor, si estamos en momentos críticos del desarrollo. En la fase de la especulación, se recomienda utilizar un Component Breakdown Structure (CBS) en el cual mediante una grilla u hoja de cálculo se pueda conocer la funcionalidad que será entregada en cada ciclo desarrollado. Otra técnica que se recomienda son las sesiones JAD para capturar los requerimientos del software y la realización de prototipos para descifrar ambigüedades que se presenten en el desarrollo. Algunas de las técnicas de planificación y de control de actividades más empleadas en las metodologías de desarrollo son la carta Gantt y el diagrama Pert. Las herramientas para emplear las técnicas mencionadas tienen que ser las que mejor se adapten o en las que mejor dominio se tenga. 5. Actividades de gestión Dentro de las actividades de gestión tenemos la definición del equipo de trabajo, los roles, responsabilidades, la documentación y la comunicación. 5.1. Equipos de trabajo El grupo se dividirá en equipo de trabajo, los cuales tendrán designados roles específicos llevando así determinadas responsabilidades para lograr una eficiente creación del sistema. Los equipos de trabajo deben ser pequeños, para facilitar la comunicación, deben estar bien capacitados para no bajar el nivel en general, ya que si uno de los integrantes no está haciendo bien su labor, se ve reflejado en el trabajo completo del equipo. 5.1.1. Roles y responsabilidades Los roles y responsabilidades serán: • Clientes: Este rol juega un papel muy importante, ya que este será parte activa del equipo de trabajo, aportando y funcionalidades al sistema. Además es esencial para el éxito del mismo, ya que un software que no tiene aceptación dentro de la organización jamás llegara a ser construido a tiempo, forma y con consentimiento de los usuarios. • Líder del proyecto: Tiene a cargo la planificación del proyecto a lo largo de todo el ciclo de vida, asigna recursos y delega responsabilidades en los mismos; fomenta la unión del grupo haciendo actividades destinadas a eliminar roces dentro de este, además monitorea el progreso del proyecto y establece estrategias para mitigar los riesgos que puedan presentarse dentro del desarrollo. El líder del 10 proyecto representa la cara visible del equipo de desarrollo, vendría siendo como un nexo entre cliente y el equipo desarrollo. • Programador: Tiene a cargo la codificación de los componentes a desarrollar en cada iteración, el posee los materiales y lleva a cabo la implementación de los requerimientos capturados. • Desarrolladores: Tiene a cargo la construcción lógica del software y la continua refinación de la misma en cada iteración. Estará a cargo de la creación de la interfaz del software. • Tester: Tiene a su cargo la generación de pruebas al sistema a partir de los requerimientos extraídos y analizados. La importancia radica en la necesidad de construir un software de calidad que cumpla con los requerimientos del usuario. 5.2. Documentación Si bien es sabido que las metodologías ágiles no tienen mucha ceremonia en ASD se entregan dos tipos de documentos: En el primero se incluye una visión del proyecto, una hoja de datos, un perfil de la misión del producto y un esquema de su requerimiento, este se entrega cuando el equipo tiene una idea general de lo que tratará el sistema para poder realizar la iniciación del proyecto. En el segundo se entrega una descripción del sistema, esta se entrega al finalizar el proyecto para analizar el software conjuntamente con el usuario. 5.3. Relaciones Esta metodología necesita una constante forma de comunicación entre los desarrolladores y el cliente. Tanto para facilitar al usuario expresar lo que necesita como para que los diseñadores puedan plasmar todo lo que les pide el usuario. 5.3.1.Con el grupo de trabajo Se deben realizar reuniones semanales para estar al tanto en los avances del proyecto y en lo que se debe realizar para este. También al final de cada ciclo se hace una reunión para analizar lo aprendido y ver los errores que se cometieron. 5.3.2. Con el usuario Se tienen reuniones aproximadamente cada dos semanas, para ver si cliente tiene nuevos requisitos para el proyecto o para aclarar algunos que no se hayan dejado muy claros, si fuese así todo esto podría cambiar el rumbo del proyecto. 11 6. Conclusión La característica, quizás de mayor importancia de la metodología ASD es el Feedback que plantea en la fase de aprendizaje, el cual nos da la posibilidad de entender mas respecto al dominio y construir el sistema que satisfaga de mejor manera las necesidades del cliente. El creador de esta metodología expone esto claramente en la siguiente frase: “En ambientes complejos, el seguir un plan al pie de la letra produce el producto que pretendíamos, pero no es el producto que necesitamos” Esta metodología de desarrollo nos permite encarar la construcción del software en forma ágil utilizando las técnicas y herramientas que nos resulten conveniente en cada caso. 12 7. Referencias RIEHLE, Dirk. A Comparison of the Value Systems of Adaptive Software Development and Extreme Programming: How Methodologies May Learn from Each Other [en linea]. Disponible en World Wide Web: <http://www.riehle.org/computer-science/research/2000/xp- 2000.html>[consulta: Viernes 7 de Septiembre 2007]. - ABRAHAMSSON, Pekka. Salo, Outi and Ronkainen, Jussi; Agile Software Development methods, review and analysis [en linea]. Disponible en World Wide Web: <http://www.vtt.fi/inf/pdf/publications/2002/P478.pdf> [consulta: Viernes 7 de Septiembre 2007]. - FOWLER, Martín. The New Methodology, Abril 2003 [en linea]. Sierra Alejandro [traducción]. Disponible en World Wide Web: < http://www.programacionextrema.org/articulos/newMethodology.es.html> [consulta: Domingo 9 de Septiembre 2007]. - REYNOSO, Carlos. Métodos Heterodoxos en Desarrollo de Software, Abril 2004[en linea]. Disponible en World Wide Web: < www.sel.unsl.edu.ar/ApuntesMaes/2004/Metodologias%20Agiles.doc > [consulta: Lunes 10 de Septiembre 2007]. - SCHENONE, Marcelo. Diseño de una Metodología Ágil de Desarrollo de Software [en linea]. Disponible en World Wide Web: < http://www.fi.uba.ar/materias/7500/schenone-tesisdegradoingenieriainformatica.pdf> [consulta: Sabado 8 de Septiembre 2007]. - CANOS, Jose. Letelier, Patricio and Penadés, Mª Carmen; Metodologías Ágiles en el Desarrollo de Software [en linea], Disponible en World Wide Web: < http://www.willydev.net/descargas/prev/TodoAgil.Pdf > [consulta: Sabado 8 de Septiembre 2007]. 13 8 Glosario Adaptabilidad. Facilidad con la que un sistema o un componente puede modificarse para corregir errores, mejorar su rendimiento u otros atributos, o adaptarse a cambios del entorno. Análisis de requisitos. (1) Proceso de estudio de las necesidades del usuario para conseguir una definición de los requisitos del sistema o del software. (2) Proceso de estudiar y desarrollar los requisitos del sistema o del software. Ciclo de vida. Periodo de tiempo que comienza con la concepción del producto de software y termina cuando el producto esta disponible para su uso. Normalmente, el ciclo de vida del software incluye las fases de concepto, requisitos, diseño, implementación, prueba, instalación, verificación, validación, operación y mantenimiento y, en ocasiones, retirada. Nota: Esta fases pueden superponerse o realizarse iterativamente. COCOMO. (Construvtive Cost Model) Modelo constructivo de costes, desarrollado por B.W. Boehm a finales de los 70, y expuesto en su libro “Software Engineering Economics”. Es una jerarquía de modelos de estimación de costes que incluye los submodelos: básico, intermedio y detallado. Codificación. (1) Proceso de descripción de un programa de ordenador en un lenguaje de programación. (2) Transformación del diseño lógico y demás especificaciones de diseño en un lenguaje de programación. Compatibilidad. (1)Preparación de dos o más componentes o sistemas para llevar a cabo sus funciones mientras comparten el mismo entorno de hardware o software. (2) Capacidad de dos o más sistemas o componentes para intercambiar información. Componente. Es un grupo de funcionalidades a ser desarrolladas durante un ciclo iterativo. Descripción del sistema. Documento orientado al cliente que describe las características del sistema desde el punto de vista del usuario final. El documento se utiliza para coordinar conjuntamente los objetivos del sistema del usuario, cliente, desarrollador e intermediarios. También se denomina: ConOps (Conceptof Operation std. IEEE 1362). Requisitos del sistema (ISO IEC 12207 1995, 5.1.1.2) Diseño. (1) Proceso de definición de la arquitectura, componentes, interfaces y otras características de un sistema o de un componente. (2) El resultado de este proceso. Diseño de arquitectura. (1) Proceso que define una colección de componentes de software y hardware junto con sus interfaces, para definir el marco de desarrollo de un sistema. Ver también: diseño funcional. (2) El resultado del proceso de (1). Diseño funcional. (1) Proceso de definición de las relaciones de trabajo entre los componentes de un sistema. (2) El resultado del proceso (1) 14 Emergencia. Es una propiedad de los sistemas adaptativos complejos que crea alguna propiedad más grande del todo a partir de la interacción de las partes. Gracias a esta propiedad los grupos de desarrollo logran sacar lo mejor de sí en el borde del caos. JAD: taller en el que programadores y representantes del cliente se encuentran para discutir rasgos del producto en términos no técnicos, sino de negocios. Mantenimiento. (1)Proceso de modificación de un sistema de software o de un componente, después de su puesta en funcionamiento para corregir fallos, mejorar el rendimiento u otros atributos, o adaptarlo a modificaciones del entorno. (2) Proceso primario del modelo de ingeniería que desarrolla tareas de mantenimiento (1). Modelo de ciclo de vida. Representación del ciclo de vida del software. Obtención. (aplicado a requisitos). Proceso en el que se implican las partes cliente y desarrolladora para descubrir, revisar, articular y comprender las necesidades y limitaciones que el sistema debe ofrecer a los usuarios. POO (Object-Oriented Programming) Programación orientada por objetos. Método de implementación de los programas que los organiza como grupos cooperativos de objetos, cada uno de los cuales representa instancias de una clase, que a su vez forman parte de una jerarquía a través de relaciones de herencia. PERT. (Program Evaluation and Review Technique) Método para el control de los tiempos de ejecución de diversas actividades integrantes de proyectos. Fue desarrollado en 1957 por la armada de los Estados Unidos. Actualmente se utilizan sus principios en combinación con los del método CPM en lo que se conoce como PERT/CPM Prototipo. Versión preliminar de un sistema que sirve de modelo para fases posteriores. Rapid Application Development. (RAD) Denominación genérica para técnicas y herramientas de desarrollo de software que permiten el desarrollo rápido de aplicaciones. Requisito. (1) Condición o facultad que necesita un usuario para resolver un problema. (2) Condición o facultad que debe poseer un sistema o un componente de un sistema para satisfacer una especificación, estándar, condición de contrato u otra formalidad impuesta documentalmente. (3) Documento que recoge (1) o (2). Sistema. Conjunto de procesos, hardware, software, instalaciones y personas necesarios para realizar un trabajo o cumplir un objetivo. Sistema de software. Conjunto de programas de ordenador, procedimientos y opcionalmente la documentación y datos asociados, necesarios para el funcionamiento de un sistema. Software. Los programas de ordenador, procedimientos, y opcionalmente la documentación y los datos asociados que forman parte de un sistema. 15 16