Técnica, P rogreso de México
Desarrollo de Software Sustentable M.C. Juan Carlos Olivares Rojas
Sombrerete, Zacatecas, Octubre 2010
agENDA
• Introducción Software Sustentable • Problemática • Métodos sustentables • Azúcar Sintáctico • BDD • Conclusiones
Software Hoy en Día • Mito: programadores ahora ya programan como de antes.
los de no los
• Herramientas más fáciles y productivas • El software es cada día más complejo
Software de hoy
• ¿Si su software fuera un edificio, se parecería más a uno de la izquierda o de la derecha?
Software de Hoy en Día
• Aplicaciones como el edificio de la derecha padecen de malas prácticas en el desarrollo de software como: • “Código mutante” • “Diseño roto” • El código es antiguo y muy grande • Falta de planeación y documentación
Desarrollo de sw sustentable
• Sustentable: Sustainable, Sostenible. Engloba el concepto de medioambiente, sociedad y economía. La Tecnología es el factor mediador. • El Desarrollo de Software trata de ser una actividad 100% perfectible de mejora. En general es una actividad intelectual muy creativa. • ¿Cómo lograr que sea sustentable?
• Reducir
Software Sustentable
• Reusar • Reciclar • 80% Desarrollo de Software es para mantenimiento. Por lo tanto se necesita de un código simple, legible y bien diseñado para que en un futuro pueda ser extensible.
Reducción de software
• En el pasado las prioridades eran tener un código rápido, pequeño (ocupa poca memoria), optimizado, utilizando los algoritmos mas eficaces etc...
• Hoy en día, se debe tener un código y diseño minimalista. Lo importante es utilizar lo menos posible la computadora siempre y cuando está agilice notablemente el desempeño de las actividades realizadas.
Reuso de Software
• El reuso es una de las técnicas de resolución de problemas que más utilizamos los humanos. De hecho es lo primero que verifica nuestro cerebro. • El reuso en software nos ayuda a mejorar la producción y calidad del software al “no reinventar la rueda”. • Desafortunadamente no todo se puede reutilizar.
Reuso de Software
• La reutilización es la propiedad de utilizar conocimiento, procesos, metodologías o componentes de software ya existente para adaptarlo a una nueva necesidad, incrementando significativamente la calidad y productividad del desarrollo.
• Para que un objeto pueda ser reusable se necesita de un alto nivel de abstracción. Entre mayor es su nivel de abstracción, mayor es su nivel de reuso.
Reuso de software
• Refactoring (Reestructuración) es modificar el comportamiento interno (generalmente código fuente) sin modificar su comportamiento externo (apariencia, funcionalidad).
• El término se creó como analogía con la factorización de números y polinomios. Por ejemplo, x² − 1 puede ser factorizado como (x + 1)(x − 1).
Ejemplo de Refactoring
• Es correcto el siguiente modelo
• ¿Se puede mejorar?¿cómo?
Ejemplo de Refactoring
• Si. Subiendo el método a la clase padre
• ¿En qué casos no sería conveniente esta refactorización? • Cuando los métodos difieren en su implementación. ¿Pero aun así es mala?
Patrón de Diseño
• Par Problema-Solución. Mejores prácticas.
• Patrón Singletón • Problema: se admite exactamente una instancia de una clase. Los objetos necesitan un único punto de acceso global. • Solución: Defina un método estático de la clase que devuelva el Singleton
Singleton
Singleton
public class Singleton { private static Singleton INSTANCE = null; private Singleton() {} private synchronized static Singleton createInstance() { if (INSTANCE == null){ INSTANCE = new Singleton(); } return INSTANCE; }}
Patrón de Diseño de un Menú
Reciclaje de Software
• Es un concepto muy abstracto. En general no se puede utilizar las “materias primas” de un software.
• Generalmente se maneja a nivel de reuso de software o bien a nivel de reingeniería de software, donde una aplicación puede ser mejorada considerablemente a través de varios procesos como la ingeniería inversa así como ingeniería directa.
agENDA
• Introducción Software Sustentable • Problemática • Métodos sustentables: • Azúcar Sintáctico • BDD • Conclusiones
Problemática
• La principal desventaja del software es que es un proceso sociotecnologico que produce cosas abstractas. • La materialización de este producto se ve hasta que está finalizado.
• El desarrollo de software es una actividad consumidora de tiempo donde el 90% se trata de desarrollos a la medida.
Problemática Análisis Requerimientos Diseño del Sistema Diseño de Objetos Codificación
Pruebas
Instalación
Mantenimiento
Modelo Lineal/Cascada
Modelos de Ciclo de Vida Análisis de los Requerimientos Mantenimiento
Diseño del Sistema
Instalación
Diseño de Objetos
Pruebas
Codificacion
Realmente no es tan lineal
¿Por qué odiamos la Ing. Sw?
• Más tardado en planificar y modelar que en construir…
Puede hacerlo una sola persona Requiere: Modelado mínimo Proceso simple Herramientas simples $
¿Por qué odiamos la Ing. Sw?
• Cómo que ya vale la pena...
Construida eficientemente y en un tiempo razonable por un equipo Requiere: Modelado Proceso bien definido Herramientas más sofisticadas $$$
¿Por qué odiamos la Ing. Sw?
• No es que queramos, !Se tiene que hacer Ingeniería de Software!
No cualquier persona o grupo de persona lo realiza. Imposible sin técnicas de Ingeniería $$$$$$$$$$$$
agENDA
• Introducción Software Sustentable • Problemática • Métodos sustentables: • Azúcar Sintáctico • BDD • Conclusiones
Definiciรณn del Problema/Reto
โ ข Cada buen final requiere de un buen inicio
Planteamiento del problema/reto
• La parte más difícil de cualquier proyecto es la definición del mismo. Si se tiene definido el problema se dice que se tiene el 90% de la solución. • El planteamiento del problema surge del análisis y se refleja en el diseño. • Se debe tener una motivación extra para el desarrollo del software (metáforas, valores)
Modelos de Desarrollo
• ¿Qué camino seguiremos?
Modelos de Desarrollo
• Lo primero es plantearse una metodología a seguir.
• Esta metodología puede ser cualquiera. Lo más utilizado hoy en día son esquemas LeanAgile. • Lo importante como toda en la vida es la disciplina y la constancia. Una buena metodología nos ayuda a tener éxito.
AnĂĄlisis de Requerimientos
• El planteamiento es lo importante, no la velocidad
Análisis de Requerimientos
• Lo más difícil para plantear un problema de software son los requerimientos.
• Se sugiere utilizar técnicas de especificación de requerimientos como: casos de uso, historias de usuario, spikes entre otras. • Los requerimientos deben de ser encontrados, especificados, analizados y validados
• ¿Cómo debo de hacerlo?
Diseño del Software
Diseño del Software
• El diseño de software debe especificarse a través de modelos, de preferencia visuales como UML.
• Se pueden utilizar arquitecturas dirigidas por modelos para desarrollar software. • El diseño de software debe de estar libre de cualquier implementación.
Sistemas de Alta Integridad
• Sigamos un mÊtodo confiable y seguro
Software Seguro
• El desarrollo de software debe de hacerse a través de supervisión, no se trata de tirar líneas de código por tirar.
• El software de hoy debe de probarse para que esté libre de errores así como debe de garantizar las premisas básicas de seguridad: confidencialidad, integridad y disponibilidad.
Métodos formales
• Cálculos precisos, especificación matemática.
Métodos Formales
• Entre más formal sea nuestra especificación más claro será el validarlo. • EJEMPLO • Requerimiento: método de ordenamiento de forma ascendente.
• Entradas: dos arreglos de tamaño n: p y q, donde p es el arreglo original y q el resultado.
Especificación Formal
• Salida: q[o] <= q[1] <= q[2] … <= … q[n] • ¿cuál es el problema? • Es válido lo siguiente: public int [] ordenar(int p[]){ int q[] = new int [p.length]; for(int i=0; i<p.length; i++) q[i]=0; Return q;}
Administraciรณn de Proyectos
โ ข Una buena administraciรณn siempre nos llevarรก por el camino adecuado
Administración de proyectos
• La planeación es vital para el desarrollo de proyectos pero aun más es el proceso de organización, control y dirección (coaching). • La planeación se maneja de forma colaborativa como en el Poker Planning • La comunicación grupal es sumamente importante en los equipos de trabajo.
Planificación
GESTION DE PROYECTOS
PLANIFICACIÓ N
Planificación del tiempo (calendarización) Estimación de costos (esfuerzo)
• Propuesta • Planificación • Supervisión • Personal • Informal
Gestión de riesgos y control de calidad Gestión de la configuración de sw
Scrum taskboard
Planeaci贸n de actividades
Aseguramiento Calidad (SQA)
â&#x20AC;˘ Se debe tener un buen manejo de calidad
Calidad del Software
• La calidad del software debe de medirse no sólo por el número de defectos encontrados ni por el costo que ello implica sino estar más orientados a la satisfacción del cliente. • La calidad del software debe darse en el proceso para que el producto la tenga.
Ambientes de Desarrollo Sw
â&#x20AC;˘ Una buena herramienta de Sw no tiene precioâ&#x20AC;Ś
Herramientas de Desarrollo
• Actualmente se deben manejar herramientas integradas que permitan desarrollar todo el proceso.
• Las herramientas de software deben de ser explotadas de acuerdo a la capacitación de las personas. • La experiencia en el desarrollo de software es algo fundamental.
Mantenimiento y EvoluciĂłn
â&#x20AC;˘ El modelo de mantenimiento debe de ser preparado
Mantenimiento y Evolución
• El software de hoy debe de estructurarse para que el día de mañana sin ningún problema pueda crecer fácilmente.
• El software de hoy debe de satisfacer al cliente de mañana. • El software debe de arreglarse para que pueda trabajar de forma adecuada después de un tiempo de uso.
Mantener el Éxito
• Cada buen final requiere de un buen inicio…
agENDA
• Introducción Software Sustentable • Problemática • Métodos sustentables: • Azúcar Sintáctico • BDD • Conclusiones
Azúcar Sintáctico
• Es una facilidad dada por los desarrolladores del lenguaje para escribir menos. El ejemplo más sencillo es el operador ++, C++ es equivalente a C=C+1 • Ciclo for (implementación while) • IF como operador ternario ?: • Goto en java, etiquetas:
Azúcar sintáctico
public static void imprimir(String ... cadenas) { for (String cadena : cadenas) System.out.println(cadena); } }
• Boxing automático de Datos Primitivos a Objetos: Integer a int • Anotaciones: @deprecated • Arreglos Triangulares
Azúcar Sintáctico
• El manejo del recolector de basura sólo deberá hacerse cuando la aplicación sea muy compleja.
• Se deberán verificar los métodos finalizadores de los objetos. • Se deberá tener cuidado con estructuras de datos como String y char[] que consumen mucha memoria y tardan en ser liberada dicha memoria.
Azúcar Sintáctico
• El uso de objetos sincronizados hace más lento el desempeño de las aplicaciones. Si la aplicación no maneja concurrencia no hay necesidad de utilizarlas (en java Vector y ArrayList hacen exactamente lo mismo sólo que Vector es sincronizada). • El monitoreo de los recursos es parte fundamental del profiling.
Profile Testing
• El manejo cadenas constantes en Java por ejemplo String cad=“hola” es única a diferencia de cadenas creadas con el operador new.
• Se pueden utilizar reductores de clases como: DashO-Pro, Jax o Jsrink. Muchas de estas herramientas funcionan como ofuscadores al igual que SourceGuard.
agENDA
• Introducción Software Sustentable • Problemática • Métodos sustentables: • Azúcar Sintáctico • BDD • Conclusiones
Conceptos básicos
• FTDD (First-Test Driven Development) • TDD (Test Driven Development) • BDD (Behaviour Driven Development)
• El código se lee más de lo que se escribe, por eso es importante el uso de estilos de codificación • Utiliza sólo espacios en blanco o tabuladores al indentar.
• Utilizar un número máximo de caracteres 80 • Limitar el tamaño de nuestras unidades fundamentales de programación (métodos, funciones, servicios, etc.) a una pantalla de largo (25 líneas) • Design Thinking: pensar en lo que los usuarios quieren de innovación, después se ve la forma de cómo hacerlo.
Conceptos básicos
• BDD recomienda la siguiente estructura para los requerimientos (historias de usuario) – As a, – I want, – so that
• Los requerimientos son comportamientos: Given, When, Then
• Se recomienda utilizar “mocks” pruebas sintéticas • Se pueden utilizar frameworks específicos para BDD, por ejemplo en Java está la herramienta JBehave. • También se pueden utilizar las herramientas básicas de pruebas unitarias como JUnit.
Ejemplo
• Requerimiento 1: Nuevas Listas están vacías • Dada una nueva lista • Entonces la nueva lista debe de estar vacía.
• Requerimiento 2: Listas con elementos dentro no están vacías. • Dada una nueva lista • Cuando agregamos un objeto • Entonces la lista no debe de estar vacía
Ejemplo
• Nótese que los dos ejemplos describen el comportamiento del método isEmpty() del objeto lista.
• Nótese además de que lo que se está comprobando es el comportamiento externo de dicho método. Si se requiere comprobar el comportamiento interno (por ejemplo que se estén agregando en el formato adecuado los datos), se necesita crear otras pruebas.
public class ListTest { @Test public void shouldKnowWhetherItIsEmpty() { List list1 = new List(); assertTrue(list1.isEmpty()); //Test2 List list2 = new List(); list2.add(new Object()); assertFalse(list2.isEmpty()); }}
ejemplo
agENDA
• Introducción Software Sustentable • Problemática • Métodos sustentables: • Azúcar Sintáctico • BDD • Conclusiones
Conclusiones
• El desarrollo de software de hoy en día debe de ser sustentable
• La sustentabilidad va más haya de la calidad • Los desarrollos de software son hoy una necesidad en todas las empresas por lo que su desarrollo debe de ser integral: funcionales, costo-efectivos, satisfacción del cliente y sobre todo mantenibles.
• M.C. Juan Carlos Olivares Rojas • jcolivar@itmorelia.edu.mx
dudas
• MSN: juancarlosolivares@hotmail.com • @jcolivares • Skype: juancarlosolivares • http://antares.itmorelia.edu.mx/jcolivar