martes, 11 de julio de 2017

Curso Patrones de Software


En las últimas semanas, he estado impartiendo un curso de “Patrones de Software”, en el cual pretendía explicar una colección de patrones, a la vez que se establecían las bases para el desarrollo de un código empresarial sostenible y de alta calidad.

Los materiales del curso están en GitHub. Esperando que pudieran ser de utilidad, lo hago de código libre (tanto los ejemplos como la documentación). Se les puede dar el fin que se desee.



El temario del curso fue el siguiente:



Acerca de este documento


La misión de este documento es exponer los objetivos, mecánica y temerarios planteados para el curso de CreSer “Patrones de Software”.


Objetivos del curso


Los patrones de software son soluciones previamente establecidas (y probadas como optimas) a problemas conocidos y repetitivos dentro del desarrollo de software.

El curso de “Patrones de Software” pretende proporcionar herramientas para crear un escenario en el que se favorezca la creación de software de calidad, escalable y funcional.

A la vez que se revisan conceptos básicos para la ingeniera de software (para establecer un contexto de inicio) se estudiaran una selección de los más útiles patrones de software. Por otro lado y a modo de complemento se revisar una colección de los “peores” patrones de software, o anti-patrones (comportamiento y metodologías perjudiciales para la construcción de sistemas), de forma que sirva como elementos comparativo.


Metodología


Se distribuirá el curso en tres sesiones de tres horas cada una en las cuales, después de una introducción de los temas a plantear, se realizan talleres prácticos de los patrones de software, los cuales serán realizados en equipos de a dos ( dos personas compartiendo una computadora ).

Requisitos


Es necesario una laptop por cada dos personas, y tener conocimientos promedios de programación en C#. La computadora debe tener instalador Visual Studio 2010 o superior.




  • Les proporcionare igualmente un script de Ruby para facilitar la configuración a base de datos, si desean usarlo, deben instalarse Ruby, si no deberán hacer la configuración manualmente.


Temario


  1. Presentación de objetivos

  2. El desarrollo de software en la empresa

  3. En este apartado se trataran temas propios de la ingeniera de software y el desarrollo de software en la empresa con intención de establecer un contexto previo

    a) Acerca de la ingeniería de software


    b) Escenarios dentro del desarrollo de software


    c) Construcción de una fábrica de software


  4. Acerca de los programación orientada a objetos

  5. Se analizara los principios básicos de la programación orientada a objetos, para establecer los fundamentos solos los que se sustentan los patrones de software

    a) Principios generales de la orientación a objetos


    b) Principios SOLID



  6. Introducción a los patrones de software


  7. Breve introducción a los patrones de software, su origen y su utilidad.

    1. Breve historia de los patrones de software.
    2. Tipos de patrones de software.
    3. Anti patrones de software.

  8. Explicación de patrones de software

  9. Hediondez del código


  10. En este apartado se trata la “hediondez del código”, un concepto por el cual un software que aparentemente funciona bien, oculta graves problemas en su interior que pueden emerger en cualquier momento. Se revisaran los siguientes conceptos


  11. Anti-patrones de software

  12. Los anti-patrones de software son la mejor forma de hacer algo mal. Aquí se estudiaran con intención de evitarlos.


    Los anti-patrones para estudiar a:

    • Base de datos como comunicador de procesos.
    • Clase Gorda.
    • Re-dependencia.
    • Acoplamiento secuencial.
    • Modelo de dominio anémico.
    • YAL (Yet Another Layer, y otra capa más).
    • Ancla del barco.
    • Código espagueti.
    • Reinventar la rueda.
    • No inventado aquí.
    • Otra reunión más lo resolverá.
    • Proyecto del día de la marmota.
    • Si funciona, no lo toques.

  13. Conclusiones

domingo, 2 de julio de 2017

Ventajas económicas del desarrollo ágil de software para la empresa


Hace una semanas se me presento un curioso desafío, debía demostrar que el desarrollo ágil de software es beneficioso, pero desde el punto de vista de la empresa que va a usar los sistemas construidos y no desde el punto de vista del desarrollo o de la metodología empleada.

La explicación está basada en empresas que tienen su propio equipo de desarrollo de software, es decir empresas que tiene un negocio en particular, y un departamento de desarrollo que cree el software que sustente ese negocio.

Este escenario es complicado porque no se aprecia directamente el costo y valor del software. esto es debido a que el gasto para el desarrollo de software es realmente la nomina de los empleados del departamento y no directoramente el software en sí. Por otro lado las ganancias son atribuidas al progreso del negocio, y no a la implementación del software.

Siendo francos siempre es complicado dar el valor correcto al software, pero hay tener en cuenta que el software "siempre" tiene un costo. Las personas que crean software dedica tiempo a él, tiempo que vale dinero (Si ese tiempo no les reporta una ganancia, no solo "no" están ganando dinero, sino que están perdiendo el tiempo en el podrían estar haciendo otra actividad que les genera un beneficio). Esto aplica para todo tipo de software e incluso el software libre o gratuito, el costo del software existe, aunque al final se supla de forma indirecta, ya sea mediante donativos, prestación de servicios cobrados o la obtención de una posición en el mercado.

Tenemos dos grandes versiones del desarrollo del software, de un lado las metodologías pesadas y del otro las metodologías agiles.


Metodologías Pesadas

Se divide el sistema en fases más o menos secuenciales y de larga duración como análisis, definición, construcción, pruebas, y despliegue.

Hasta que no se llevado a cabo todo el ciclo no se entrega el producto al cliente además solo hay contacto con él en la fases de análisis y posiblemente en la diseño.

Se documenta cada paso de forma más o menos completa.


Metodologías Ágiles.

El contacto con el cliente es continuo, cada poco tiempo se entrega un software que agrega un valor al sistema, que en principio, se entrega incompleto pero funcional.

Las constantes entregas y pruebas agregan comprensión al problema y la verdadera necesidad del cliente. Cada iteración está más cerca del resultado final.

Es importante señalar que no hay una solución correcta a cada problema, sino que hay elegir la metodología mas correcta para cada tipo de circunstancia.


Ejemplo de comparación de proyecto Ágil / Pesado


Tengamos un supuesto de un proyecto de las siguientes características:

Parámetros del sistema
Valor
Comentarios
Número de personas asignadas
6
Personas involucras en el proyecto
Costo persona/mes
$ 2,000.00
Costo mensual por cada persona.
Duración (meses)
5
Duración de proyecto.
Funcionalidad a entregar
200
Cada unidad representa una funcionalidad identificada que le da valor al proyecto.
Ingreso mensual esperado
$ 10,000.00
Cantidad de dinero mensual que espero ingresar después que estén en producción el sistema.

Parámetros Calculados
Valor
Comentarios
Costo persona/Día
$ 66.67
El costo de una persona, por día
Costo total persona/Día
$ 400.00
El costo de todas las personas por día
Costo total persona/Mes
$ 12,000.00
El costo de todas las personas por mes
Costo total proyecto
$ 60,000.00
El costo total de proyecto
Ingreso mensual esperado / Funcionalidad
$ 50.00
Lo que espero ingresar por cada característica liberada

En resumen el objetivo es la construcción de un sistema, con seis personas asignadas, durante cinco meses, con un costo total para la empresa de $ 60,000.00.



Flujo de dinero con metodología pesada

Aquí no hay duda en como fluye el dinero; todo el proyecto es gasto (los seis meses) hasta la finalización, en la que comienza a generar ganancia mensual ($ 10,000.00).

Metodología Pesada
Fecha
Funcionalidad
Egreso
Ingreso
Beneficio
01/01/2018
0
0
0
0
01/02/2018
0
$ 12,000
$ -
-$ 12,000
01/03/2018
0
$ 12,000
$ -
-$ 12,000
01/04/2018
0
$ 12,000
$ -
-$ 12,000
01/05/2018
0
$ 12,000
$ -
-$ 12,000
01/06/2018
200
$ 12,000
$ 10,000
-$ 2,000
Totales
$ 60,000
$ 10,000
-$ 50,000





Flujo de dinero con metodología ágil

Aquí es mas difícil de analizar el flujo de dinero, pero supongamos que al ser una metodología ágil, se van entregando funcionalidad a nuestro cliente, de manera que se comienza a crear beneficio desde el primer mes, con lo que parte del gasto de la nomina de los codificadores es absorbido por el dinero ingresado por la aplicación (la cual no está completa al 100%)

Metodología Ágil
Fecha
Funcionalidad
Egreso
Ingreso
Beneficio
01/01/2018
0
0
0
0
01/02/2018
67
$ 12,000
$ 3,333
-$ 8,667
01/03/2018
100
$ 12,000
$ 5,000
-$ 7,000
01/04/2018
133
$ 12,000
$ 6,667
-$ 5,333
01/05/2018
167
$ 12,000
$ 8,333
-$ 3,667
01/06/2018
200
$ 12,000
$ 10,000
-$ 2,000
Totales
$ 60,000
$ 33,333
-$ 26,667




Conclusiones

La más evidente es que con la metodología ágil, al final del proyecto este nos ha constado $ 26,667, en lugar de los $ 60, 000, mientras que en la metodología pesada, no tenemos ningún benéfico hasta que el programa está completamente funcional.

Aunque el análisis mostrado aquí es puramente económico, y muy simplista en cuenta a su linealidad, al margen del tema económico, las ventajas de las metodologías agiles, están mas enfocadas en aumentar la calidad del software, y disminuir los tiempos de entrega, motivo por el cual habría de hecho una mejora económica indirecta (más que por el hecho de poder usar el software productivamente en las primeras etapas)

El archivo usado para los cálculos de los montos, se encuentra en el siguiente enlace: