Complejidad


En los últimos días he dedicado algún tiempo a buscar información sobre mecanismos de Estimación Objetiva de proyectos de construcción de software.

 Es algo recurrente en mí. Cada año, más o menos, me entra esta ansiedad por encontrar la bola de cristal que me permita saber cuanto tiempo y esfuerzo va a costar construir el sistema A, B o C. Y cada año, tras el peregrinaje de rigor por las páginas, artículos y libros que versan sobre el tema, regreso a casa con la misma frustración.

El “Secreto de la Estimación Objetiva” dice:

Utiliza algún sistema homogéneo para medir el tamaño de un sistema.

¡Já! Empezamos por algo fácil. Es sencillo utilizar un sistema de medida homogéneo cuando las aplicaciones a medir son también homogéneas. Se pueden contar páginas, si se trata de aplicaciones web o, refinándolo más, contar los elementos que las generan (JSPs, ASPs, ficheros HTML, clases, EJBs, o lo que sea), asignándoles incluso un orden de complejidad. Esto nos permite comparar el tamaño de dos aplicaciones (“la aplicación A es el doble de grande que la aplicación “B”).

Pero ¿qué hacer si se trata de medir cosas algo diferentes? Hala! Compárenme una aplicación COBOL/CICS, con sus pantallas, transacciones, y todas sus cositas, con la aplicación web de antes. En este caso cuesta algo más comparar los tamaños de ambas.

Para salvarnos de este aprieto, aparece allá por 1979 (gracias, Allan Albrecht), los Puntos Función. En todos los casos, con algo de práctica, seremos capaces de contar los EO, EI, EQ, ILF, EIF y demás elementos. Aunque al no tratarse de pantallas, programas, rutinas, páginas, clases, etc. sino un nivel de abstracción superior, cuesta algo más de esfuerzo tomar las medidas.

Esto es otra muestra más de que cuando intentamos simplificar algo, como es el homogeneizar la medida de tamaño de sistemas heterogéneos, nos llevamos la complejidad a otra parte. Vamos, que hay que hacer un curso para medir bien con Puntos Función.

Traduce la medida resultante a algo tangible.

Es posible, por tanto, obtener una medida de tamaño de un sistema de software. Eso sí, no se consigue el tamaño en líneas de código, megabytes de los ficheros de código fuente o, lo que es mucho más util, horas de esfuerzo a realizar por un equipo de trabajo con una productividad media (otra variable más).

Para convertir los Adjusted Function Point -que tendremos que calcular a partir de los Unadjusted Function Point considerando los parámetros del entorno del proyecto- en algo útil, habrá que multiplicarlos por un “Número Mágico” que nos dará una aproximación al esfuerzo necesario de desarrollo, es decir, su coste (es decir, su precio).

Para obtener este factor -que, además no es inmutable- es preciso contar con una cierta historia en desarrollo de software. Si se conoce el esfuerzo que resultó necesario y los puntos función de cada uno de los sistemas desarrollados en el pasado, es posible obtener un factor de conversión suficientemente fiable como para ser capaces de predecir lo que costará un sistema nuevo.

Claro que es preciso que los proyectos analizados sean más o menos homogéneos, que no hayan tenido circunstancias excepcionales que desvirtúen la estimación, desarrollados preferiblemente en la misma compañía y entorno, y preferiblemente por el mismo equipo o equipos de cualificaciones semejantes.

Fácil ¿eh?

En resumen, que yo sigo contando pantallas y multiplicando por cincuenta.
Tags: Métricas, Metodología

He recibido tanto comentarios en mi bitácora como en persona sobre mi – crítica – opinión sobre el concepto “Menos es más”. Por lo tanto, creo que debo extenderme algo más en mis razonamientos.

Hay sin duda aplicaciones, muy sofisticadas, de los que el 80% de los usuarios utilizan sólo un 20% de la funcionalidad. O porcentajes parecidos. Por lo que para las pocas cosas que se utilizan se complica demasiado su uso. Además, el software se llena de errores. Y de ahí nace el concepto.

Un caso paradigmático de esto es el famoso editor de ecuaciones de Microsoft Word. ¿Cuantos habéis utilizado ese editor? Yo, algunas veces, pero muy pocas. Antes era parte del software, ahora es un add-in, o add-on, o complemento, o como se llame.

Siguiendo con el ejemplo: ¿alguien se imagina un tratamiento de textos que no permita cambiar el tipo de letra, la justificación, la corrección ortográfica o la creación automática de índices? Yo no.

Sin embargo, a veces echo de menos un micro-editor en el que pueda fijar qué estilos y cuándo se pueden utilizar, en el que el formato, aspecto y estructura estén previamente determinados y en el que los usuarios no hagan mas que “rellenar” lo que les toca.

Odio que alguien pueda escribir en Comic Sans negrita, color naranja sobre fondo amarillo…

En resumen, lo único que intento decir es que:

Menos es menos pero, a veces, es mejor.

Alejandro André

Tags: Complejidad

Me he permitido copiar y traducir un pequeño fragmento del libro “Implementing and Integrating Product Data Management and Software Configuration Management” de Ivica Crnkovic, Ulf Asklund y Annita Persson Dahlqvist

Transformar [dividir] un problema grande en muchos problemas pequeños, normalmente implica que las relaciones entre las partes se hacen complejas. Las relaciones entre componentes pueden ser tan complejas que se haga casi imposible manejarlas.

Es otra forma de expresar la Ley de Tesler.

En el fondo refuerza la idea de que la complejidad de un sistema no desaparece por el método de dividirlo en subsistemas más simples. Es decir, la complejidad no se “destruye”, sino que se traslada de los componentes a las relaciones entre ellos.

Por cierto, interesante libro…

Tags: Complejidad

Últimamente se ha estado hablando mucho del principio “Menos es más”. Es uno de los los pilares de 37signals. La paradoja está en la peligrosa simplificación de ese principio: ¿Menos qué es mas qué?

Podemos pensar en:

  • Menos código.
  • Menos complejidad.
  • Menos funcionalidad.

Menos código.

Como decía en otra entrada de esta bitácora, a veces menos código consigue mejorar las características del software, ya sea en términos de flexibilidad, funcionalidad o rendimiento. Pero esto siempre implica dos pasos:

  • Eliminar la complejidad “sobrante”, es decir, limpiar y reducir hasta la complejidad intrínseca.
  • Añadir complejidad – intrínseca – que permita mejorar las características buscadas.

El saldo puede ser negativo en términos de tamaño. Pero la complejidad primordial siempre aumenta.

Menos complejidad.

Esta opción no significa que realmente el software sea menos complicado, sino que siguiendo la Ley de Tesler, hemos trasladado la complejidad a zonas del software alejadas del interfaz de usuario. Es decir, hacemos más sencillo el uso a base de complicar el funcionamiento interno. El saldo suele ser positivo en términos de complejidad total, del mismo modo que producimos calor fuera de un congelador para mantener el frio dentro.

Menos funcionalidad.

Esta es más fácil. Menos funcionalidad es menos funcionalidad. En el software Ta-Da List de 37signals no hay modo de asignar una tarea a alguien, o de indicar una fecha máxima de finalización, o clasificar tareas en categorías aunque se plantean “alternativas” imaginativas para resolver esas necesidades. La excusa es la de pretender soluciones humanas y no soluciones de software.

Pero a mi me gusta poder asignar tareas a mis colaboradores, y saber cual es la fecha de entrega máxima, o clasificar las tareas por proyectos, áreas o lo que me interese. Para mí, eso es menos. Mucho menos.

Conclusión

Creo que habría que evitar simplificar demasiado el principio “Menos es más”, y redactarlo de modo que se revele todo su significado. Mi interpretación de este principio es – y se puede no estar de acuerdo - la siguiente:

Menos funcionalidades no usadas y menos complejidad en el uso es más atractivo para el usuario pero más complejo para quien lo construye.

Tags: Complejidad

Esta curiosa anécdota puede servir para ilustrar como las medidas de productividad de la Ingeniería de Software a veces nos llevan en la dirección contraria a la que quisieramos ir.

Es muy habitual medir la funcionalidad o la complejidad de un determinado software y, por tanto, la productividad de quienes lo han escrito, en número de líneas de código. Pero a veces se puede hacer más con menos.

Bill Atkinson, autor del programa QuickDraw, en el año 1982 estuvo trabajando en su optimización. Tras escribir de nuevo ciertos algoritmos para hacerlos más simples y generales, consiguió que éstos se ejecutaran 6 veces más rápido, resultando además que la nueva versión tenía dos mil líneas de código menos que la anterior.

Cuando tuvo que rellenar el parte de trabajo y llegó a la casilla de número de líneas de código producidas escribió: -2000.

Dicen que desde ese día no le hicieron rellenar el informe nunca más.

Tags: Complejidad, Programación

Entradas siguientes »