jueves, 16 de octubre de 2014

Regla N° 6: Lo importante es el "Que hace" y no el "Como lo hace"

Tradicionalmente cuando uno estudia programación por primera vez, en la carrera de Informática o afines, por algún motivo desconocido para mi, se comienza estudiando programación estructurada, a veces en pseudocódigo, en Pascal, en C, o quizás en Java, pero orientado de alguna forma estructura. Se ven bonitos diagramas de flujo (Flowchart), donde todo tiene un orden y una secuencia determina. Nos enseñan que un algoritmo es un proceso, pasó a paso, que con una misma entrada, produce una misma salida. Datos entran y datos salen.

Y después cuando ya está adaptado nuestro celebro para hacer las cosas de una determinada manera, ¡Bang!, nos cambian el paradigma a una la programación orientada a objetos, que curiosamente es el paradigma de programación que ofrece mayores virtudes en el desarrollo de software, es mas casi todos los lenguajes modernos de programación vienen con la coletilla "Todo es un objeto", frase que aunque ciertamente relativa, nos hace ver la importancia de este paradigma.

Pero ¡Ay!, todo se ve con el prisma de programación estructurada, incluso se aprende la programación orientada a objetos desde este enfoque, haciendo comparaciones, diferencia y similitudes. Todo esto hace que el aprendizaje este condicionado y limitado por un enfoque previo.

Hagamos un paréntesis en este punto para contar una pequeña anécdota. Hace años, tuve un maestro de historia, que nos comento el gran avance industrial que supuso la creación telar mecánico, que simplifica y automatizaba la creación de tejidos de distintas formas y colores, con lo que se vio una mejora en los tiempos en la fabricación, y una rebaja en su costo. Era como el principio de la industrialización, en la que mejores procesos, y avances se iba incorporando en la vida diaria de la producción de nuevos elementos, desde las mencionadas telas, a la fabricación de coches, hasta la llegada de microprocesadores y computadoras. También nos señalo que seria ridículo, que si exigiera un país en vías de industrialización, comenzara por los telares y continuara implantado poco a poco todos los avances tecnológicos de otros países, como queriendo recorrer su mismo camino, porque este jamás alcanzaría un mismo estatus industrializado (llego tarde a la carrera). La única solución posible seria que comenzara en el mismo punto tecnológico que corresponde a la actualidad, para que ambos pudieran progresar a la par.

Lo mismo pasaría con lo programación, que se quiere enseñar aparentemente en el mismo orden en que evoluciono esta disciplina, (Curiosamente cuando estudie sistemas, nos enseñaron, en este orden, los siguientes lenguajes de programación: Pascal, Fortran, C, Prolog, ADA, C++, Visual Basic 6 y Java, que básicamente fue el orden en que fueron creados, salvo los dos primero).

El problema del enfoque de la programación estructurada es que se enfoque demasiado en la forma de trabaja que tiene las computadores, esto es "Lo importante es como lo hace", ejecutando una por una las líneas de programación de un sistema, y realizando saltos en el flujo según determinadas instrucciones.

Los "humanos", no resolvernos problemas de esta manera, o por lo menos no generalmente, nosotros descomponemos un problema en elementos mas pequeños, a los que podemos catalogar, y les atribuimos características y propiedades, olvidando además aquellas datos y circunstancia que no su útiles para el problema, después generalizamos dichos elementos para que nos sirva en solucionar otra problemas parecidos. Este forma de pensamiento es donde prima "Lo importa es lo que hace", y es uno de los pilares de la programación orientada a Objetos.

En la programación orientada a objetos, se diseñan elementos, donde prima la representación de "Que es lo que hace" y "Que son", principalmente, a través de sus atributos y sus métodos. también se establece como se relacionan con otros tipos de elementos (o clases), ya sea mediante técnicas como la composición, la herencia, o el envió y recepción de mensajes.

De esta forma centrándonos en "Que hace" obtenemos una comprensión mas clara del sistema, y de sus requisitos, además construiremos un sistemas más escalable (debido a que no nos estamos centrando en "Como lo hace"). Inclusive tendremos muchas más posibilidades de conectarnos a otros sistemas, puesto que queda mas claramente establecidos los limites y conectores de estos.

Cuando nos centramos al contrario en "Como lo hace", obtenemos, entre otros, los siguientes problemas:

  • Un código lleno de sentencias if, y totalmente ausente de herencia y polimorfismo (la herencia se sustituye con bloques if, que se repiten en cada función).
  • Igualmente total falta de Interfaces, que son la máxima expresión del pensamiento "Lo importante es lo que Hace".
  • Un código lleno de clases estáticas, con simples métodos expuestos.
  • Funciones que en lugar de recibir objetos y trabajar con ellos, recibe una lista indeterminada de parámetros, con tendencia a crecer, uno detrás del otro y con ausencia de sobrecargas.
  • Separación de los datos y el negocio del sistema (en la programación orientada a objetos los datos (atributos) y el negocio son indivisibles).
  • Clases muy grandes cuyos métodos no tiene ninguna relación.
  • Clases muy pequeñas, porque no se tiene claro dónde colocar los métodos, y se crean nuevas clases para albergar pocos métodos.
  • Métodos desproporcionados (tanto por grandes, como por pequeños), con excesiva dependencia entre ellos.


Y lo más importante dificultad para modificar y comprender el código.

viernes, 10 de octubre de 2014

Claves del la Calidad: El equilibrio

Una de las claves de la calidad de un sistema, es el equilibrio entre tres factores principales: Tiempo, Recursos y Alcance. Juntos forman una especie de taburete de tres patas, sobre el cual esta nuestro desarrollo y donde si una de ellas esta desproporcionada, puede llevarnos al fracaso en la construcción de nuestro software.

El tiempo

El tiempo posiblemente sea el factor más difícil de manejar, es más, el tiempo en el desarrollo de software se curva en contra de toda ley de la física, y así dos meses se pueden convertir en seis y seis meses de trabajo deben caben en dos.

Es más posible que te toque la lotería, el día de tu cumpleaños, un 29 de febrero, sin comprar boleto, a estimar correctamente un proyecto.

Este factor hace referencia al espacio de tiempo que tenemos disponible para sacar un producto al mercado en el momento oportuno para que nos genere beneficios. Por ejemplo, el tema de la facturación electrónica en México, hace años era un bien escaso y la gente que le entro pronto a este mercado tuvo bastante éxito, pero en estos momento el mercado está saturado de proveedores de factura electrónica, y con una dura competencia, con lo que sería bastante difícil entrarle de cero a vender un nuevo producto de facturación.

Debido a que lo importante, como decimos es llegar en el momento justo, generalmente tiempo es el factor que más escasea.


  • Cuando tenemos poco tiempo

Se da generalmente un uso excesivo de los recursos, esto es, los involucrados en el sistema se ven obligados a hacer horas extras (con lo que se fabrica tiempo, se convertirán jornadas de 8 horas en jornadas de 10, 12 o más horas, aquí es donde caben seis meses de trabajo en dos), lo que principalmente provoca desanimo, cansancio en el equipo y software de baja calidad con multitud de errores.


  • Cuando tenemos demasiado tiempo

Se pierde el objetivo del sistema, y el interés en el mismo, igualmente el equipo se acaba sintiendo alejado del mismo proyecto (incluyendo al cliente), al no ver una producción real de su trabajo, y la meta queda diluida. Se baja la calidad del sistema al no tener un resultado real y tangible. Igualmente puede ser que el producto pierda su significado al no haber salido en el tiempo adecuado


  • ¿Cuál es la medida correcta?

Va ligado con el alcance, hay que tener tiempo reducidos en los que se desarrolle una iteración (entrega) que le haga sentido al cliente (o usuario), pero que sea los suficiente amplio para no caer en las horas extras innecesarias.

La primera entrega siempre debe ser la más larga, porque si bien no incluye toda la funcionalidad, es necesario que ya está sostenida sobre una arquitectura firme y concisa para todo el proyecto (sobre todo por se va a aplicar la regla "Va a cambiar", y si no se tiene en cuanta nos afectara a posterior).

Los recursos

En los recursos, se hace referencia a elementos tales como maquinas de cómputo, licencia de software, equipos especiales, dinero, y también a las personas "recursos humamos".


  • Cuando tenemos pocos recursos

Si tenemos pocos recursos "físicos", como equipos hardware (o elementos de software que se deben compartir como bases de datos), puede ser que los participantes del proyecto compitan por ellos, con lo que más que un elemento de cooperación se convierte en uno de contienda, generando roces y malestar en general.

Si se tiene menos personas de las necesarias, se produce una sobrecarga de trabajo de dichas personas, es decir, hacen horas extras. Al final por el cansancio es normal tener descuidos y fallos, y estos a su vez provocan retrabajos, (y más horas extras).

Si no se aplicaran horas extras, no queda de otra que reducir el alcance (si un es una "pata" es otra).


  • Cuando tenemos demasiados recursos

Que al final tenemos recursos que no hacen nada, y por lo tanto tenemos perdidas de dinero (o lo gastamos innecesariamente)

¿Puede llegar un punto donde haya demasiados recursos? Si, generalmente hay personas claves en los proyectos (como los lideres), que no pueden gestionar apropiadamente un número determinado de recursos o personas si este es excesivo, con lo que se provoca un descontrol en la gestión del proyecto , o se crean estructuras jerárquicas (en forma de árbol), en las que se depende de otras persona, que delegan trabajo a su vez en otras, al final se pierde facilidades de comunicación, y se generan mecanismos demasiado burocráticos para controlar el proyecto (lo que influye principalmente en el tiempo y en conocer realmente las necesidades del cliente).


  • ¿Cuál es la medida exacta?

Lo recursos para un proyecto deben llegar en el momento adecuado, si llegan demasiado pronto, es posible que estén en desuso y si llegan demasiado tarde, es posible que lleguen a ser inútiles (o que el proyecto ya se haya cancelado por falta de estos). Los recursos deben llegar en el momento que puedan ser usados, y liberarse cuando ya no son necesarios.

El alcance

El alcance representa la cantidad de funcionalidad que se va a liberar.


  • Cuando nuestro alcance es demasiado pequeño

Generalmente el sistema no sirve para aquello que el cliente quiera que sirva. Este nunca estará satisfecho con el sistema y le generada una sensación de descontento (Por no hacer el sistema lo que él quiere que haga).


  • Cuando nuestro alcance es demasiado grande

Cuando esto ocurre generalmente se crea una proyecto inacabable, en el que ni el cliente, ni el equipo de desarrollo ven un producto tangible, y es muy probablemente que se abandone el proyecto.


  • ¿Cuál es la medida exacta?

Entregas continúas de corto alcance, en el que se libere una funcionalidad nueva en cada iteración, de forma que los retos y las metas sean alcanzables a la vez que interesantes para todos los implicados en el desarrollo del sistema.

sábado, 4 de octubre de 2014

¿Qué es la calidad?

La palabra "calidad" tiene muchas definiciones y criterios según el ámbito o la persona que este proporcionando dicha definiciones.

Según la rae calidad es "Propiedad o conjunto de propiedades inherentes a algo, que permiten juzgar su valor", otras definiciones son por ejemplo "Es la aptitud de un producto o servicio para satisfacer las necesidades del usuario.".

A lo largo de mi carrera he recibido diferente opiniones sobre que es la calidad, con mayor o menor atino, me quede con la que recibí cuando desempeñaba labores de tester, al inicio de mi vida profesional.

Estaba en mi primer trabajo, en el que mi labor era realizar pruebas de diversos tipos sobre el portal Web de la empresa (era un servicio de búsqueda), hacíamos pruebas de stress, de volumen, o de carga entre otros tipos de pruebas. en mis primeras semanas de capacitación, el líder del equipo de pruebas me pregunto, "¿Cuántas peticiones web debiera poder soportar el sistema?", "Todas" conteste yo, a lo que él me volvió a preguntar, "Es decir si tenemos 100 peticiones en un minuto, debemos responderlas todas, y si tenemos 2000 en un minuto también ¿no?, y ¿si tenemos un millón en un minuto, también verdad?", a lo que yo contestaba que si, a todo, cada vez menos convencido de mi mismo, "Ok", prosiguió, "y si solo recibimos de media 100 peticiones al minuto y si la infraestructura para contestar ese millón de peticiones sea demasiado costosa para nosotros y no se podría amortizar, ¿debiéramos seguir respondiendo ese millón de peticiones?", y allí se plateo la primera duda sobre la calidad, el responder unas 100 peticiones al minuto, parecía suficiente, debido al tráfico que tenia la pagina actualmente, pero si se llegara a un irreal caso de un millón de peticiones al minuto, el sistema no podría responderlo. entonces ¿Era buena o no la infraestructura sobre la cual estaba el sistema?. Aquí descubrí una nueva definición de calidad relacionada con el ámbito real de trabajo.

La calidad es una medida de aceptación, por la cual se contrapone los fallos de los sistemas, con respecto a su aciertos, y en base a dicha relación se decide sobre la viabilidad de un producto. Por ejemplo nuestro sistema permitía contestar apropiadamente 500 peticiones en un minuto (mas que las 100 que recibíamos realmente), a partir de las cuales comenzaba a tardase en responder al cliente. Esto nos daba un posible punto de control y un enfoque sobre cómo y por qué tenemos que tomar medidas de recuperación y prevención.

Una vez identificada la calidad del sistema, (por ejemplo un marguen o limite de respuesta de 100% en menos de 500 peticiones en minuto, y descendiendo a partir de allí), hemos establecido los márgenes reales sobre los que puede operar este y en base a esa "medida" de calidad, podemos establecer si aceptamos el sistema o no (es decir si el sistema satisface nuestras necesidades)

Me gusta este enfoque particularmente por qué parte de la regla "Va a fallar" y en base a esa establece en que términos fallaría, y como lo haría, lo cual no da un posible escenario de trabajo y estar listos en cuando un comportamiento anómalo del sistema, a la vez que desarrollar un plan de contingencia adecuado. Dicho de otra manera enfoca la calidad en descubrir sus deficiencias, y no en ensalzar sus virtudes.