Archivo

Archivo de la etiqueta: cita

El artículo publicado ayer en el que comentaba los beneficios de la refactorización, lo contextualicé con una cita de Ron Jeffries en la que venía a decir que una aplicación bien diseñada y programada de base podría convertirse en un elemento complicado de mantener si no se revisaba con la frecuencia necesaria el código, sobre todo en contextos iterativos, evolutivos o de mantenimiento del sistema.

Y es que queramos o no, si no se hace esta tarea el programa se convierte en un conjunto de parches cada uno de ellos con el sello de su programador y cada vez resulta más costoso de mantener a la vez de que se incrementarán las posibilidades de efectos colaterales.

Jeff Atwood realiza la siguiente cita que complementa perfectamente a la de Jeffries: “Si no te paras de vez en cuando (frecuentemente, en realidad) en revisar y limpiar el código que ya has escrito, terminará convirtiéndose en una gran y descuidada bola de código”.

No es necesario poner ejemplos sobre esto porque la mayoría de vosotros habréis tenido la oportunidad de padecer y sentir las consecuencias de código de baja calidad y/o parcheado. Pese a esto y como ya comenté en el artículo de ayer no se le presta en la mayoría de los casos la atención que se merece a la refactorización, algo que resulta todavía más sangrante cuando el producto que desarrollas es para tu organización ya sea de uso interno o para comercializarlo ya que en estos casos no se tiene la excusa de que el cliente no valora este tipo de esfuerzos.

La reducción de la deuda técnica y la mejora en la legibilidad del código, así como evitar la consolidación de antipatrones del tipo ancla de barco o lava seca son algunos de los objetivos principales de la refactorización.

Hay quienes incluyen la refactorización como una fase final del desarrollo de una determinada tarea y otros que la incluyen como tareas concretas. Habría que analizar qué es más conveniente en cada caso, lo que en cualquier caso resulta incontestable son los beneficios de la refactorización. Pese a ello, muchos equipos de desarrollo no la tienen en cuenta entre sus hábitos de desarrollo y muchos clientes no valoran la realización de este tipo de actividades (tal vez porque no se les ha explicado bien sus ventajas).

La siguiente cita de Ron Jeffries contextualiza perfectamente la refactorización: “La razón por la cocina es un desastre no es porque la cocina esté mal diseñada sino porque no se lavan los platos después de cada comida”.

La automatización del testing permite ahorrar importantes esfuerzos tanto para el equipo de programación como para los testers. Ahora bien, ¿dónde está el límite?, ¿conviene automatizar todo?.

Sobre esto habrá opiniones de todo tipo. La mía va muy en la línea de la que describe Ron Jeffries en la siguiente cita: “La automatización en el testing es algo bueno, eso es seguro. Pero no podemos y no deberíamos automatizarlo todo. Entonces, ¿por qué pedimos a los equipos que automaticen todos los tests?”.

Automatizarlo todo tiene un coste y además, teniendo en cuenta que el desarrollo de software es evolutivo, en cada evolución necesitaríamos de nuevo realizar ajustes en los tests automatizados. Además, el coste de automatizar la comprobación del funcionamiento de determinadas funcionalidades puede ser excesivo en sí o puesto en una balanza con los beneficios que se obtienen con dicha automatización.

¿Por qué se pide la automatización de todo? Pues porque no se evalúa la dificultad y esfuerzo que tiene realizar esa tarea. Es importante automatizar tests pero sabiendo elegir las áreas del código y del sistema de información donde se puede obtener el mayor aprovechamiento de los mismos (por su impacto y por el esfuerzo que requeriría una verificación manual) con el menos coste posible (elegir bien no es trivial).

Muchas veces creemos que el proyecto va de una determinada manera y posiblemente estemos próximos a lo que es la situación real del mismo, sin embargo, cuanto mayor sea el número de proyectos en los que participamos y mayor sea su tamaño, complejidad y heterogeneidad, más probabilidad existirá de que nuestra visión no se ajuste a la realidad, ya que por estas circunstancias estaremos cada vez más lejos del día a día del proceso de desarrollo.

Como medida para atacar ese problema tenemos la retrospectiva y análisis de la situación con el equipo de personas que participa en el proyecto, sobre todo el equipo de desarrollo y los usuarios responsables de realizar la definición del sistema. Si tenemos ese instrumento, es conveniente utilizarlo y no especular, ya que no solo detectará puntos de mejora sino que se podrán consensuar cómo llevar a cabo las mismas.

Sobre esto, Ron Jeffries realizó la siguiente reflexión (traducción libre): “Incluso si usted sabe exactamente lo que está sucediendo en su sistema, analice la situación, no especule. Vas a aprender algo, y nueve de cada diez veces, comprobará que no tenía razón”.

Estoy harto de ver sistemas de información sobrecargados de funcionalidades que no se utilizan y en las que las funcionalidades realmente esenciales no terminan de funcionar bien y/o ofrecer una experiencia de usuario adecuada. Es cierto que las directrices del área usuaria nos llevan muchas veces por ese camino pero también somos muy culpables de todo esto en cuanto a que muchas veces alentamos a que se realicen esas funcionalidades (ya sea por nuestro “espíritu creativo” o porque interesa económicamente que el desarrollo se alargue y así poder seguir facturando) y a que no hacemos pedagogía con el área usuaria en cuanto a que se centren en lo realmente importante.

Toda funcionalidad de más es esfuerzo innecesario, más deuda técnica y más elementos que mantener. Todo ese esfuerzo no se invierte en lo realmente importante que no es otra cosa que satisfaces las expectativas del usuario y para ello los aspectos principales del proceso o procesos que se informatizan deben tener el mejor acabado posible (funcional y no funcional).

Alan Shalloway ofrece algunos datos de interés que avalan que lo simple y la actuación sobre lo realmente necesario marcan el camino hacia un desarrollo de software que lleve a un producto de calidad en concordancia al presupuesto disponible o que potencialmente se está dispuesto a invertir (traducción libre): “La manera más fácil de construir algo simple consiste en no construir cosas que no necesitas. El 64% del software desarrollado se utiliza muy poco. La aproximación a la construcción del 20% del sistema generando el mayor valor posible (80%) y una vez hecho eso estudiar en qué posición nos encontramos y construir el siguiente 20% tiene grandes ventajas”.

Podríamos entrar en un debate muy interesante sobre qué se considera mantenimiento porque muy probablemente el enfoque que tengamos cada uno de nosotros puede ser distinto.

De manera clásica se considera mantenimiento (ya sea evolutivo, adaptativo, perfectivo, etc…) a actividades que se realizan sobre un componente software una vez que se pasa a producción.

Esta definición podría ser también válida para enfoques ágiles, aunque personalmente en estos casos prefiero llamarlo evolución independientemente de la naturaleza del mantenimiento.

Ahora bien, ¿no es mantenimiento cuando cuando corregimos errores antes en el proceso de desarrollo?, ¿no es mantenimiento si refactorizamos un componente antes de entregarlo?, ¿no es mantenimiento mejorar una determinada funcionalidad mientras se programa?. Desde esta perspectiva la frontera entre la construcción y el mantenimiento es bastante difusa por no decir inexistente (Andy Hunt tiene una cita donde exagera de manera voluntaria lo que está diciendo pero que viene a expresar perfectamente su opinión sobre la inexistencia de ese límite (traducción libre): “solo durante los diez primeros minutos se puede considerar un código como original que es cuando lo estás escribiendo por primera vez”.

El enfoque de planifico todo el proyecto, realizo todo el análisis y después diseño, construyo e implanto está todavía presente en una gran cantidad de personas de nuestra industria.

Muchos desarrolladores recién llegados ven el proceso de desarrollo con ese enfoque, sin embargo el problema no son ellos, tienen todavía mucho tiempo para cambiar, sino personas que se dedican a esto desde hace mucho tiempo y que, como suele pasar en las organizaciones, con el paso de los años han alcanzado responsabilidades directivas.

Quien se ha criado en metodologías clásicas, quien ha trabajado durante muchos años con ellas le resulta muy complicado cambiar sobre todo si se está alejado ya del día a día de los proyectos de desarrollo de software. Con el paso del tiempo todo se idealiza, algo que además si no tiene mucho espíritu crítico te puede llevar a pensar que realmente no fueron tan mal todos esos proyectos en los que trabajaste y que utilizaron enfoques clásicos.

Por otro lado, en el área usuaria o funcional, el enfoque de los proyectos en los que trabajan que serán en su mayoría no software también será, por regla general, de tipo totalista, es decir, contrato un trabajo, lo ejecutas de una vez y adiós.

La aplicación de enfoques ágiles se encuentra con esta resistencia, personas que no terminan de entender por qué aplicas esa estrategia, personas que se sienten más cómodas trabajando sobre una planificación general, independientemente de que la misma nunca se cumpla o que el producto final se parezca bien poco a las expectativas que se tenían sobre el mismo.

Para que proyectos con este enfoque puedan llevarse a cabo es fundamental que todas las partes implicadas en él entiendan, comprendan y compartan que esta forma de entender el desarrollo de software es la que mejor se adapta a su incertidumbre inherente y por tanto, es la que de forma más probable te llevará al cumplimiento de los objetivos.

En general, apliques la metodología que apliques es fundamental que todas las partes remen en la misma dirección, de lo contrario a las resistencias que te vas a encontrar en el propio proceso de desarrollo tendrás que sumarle que estaréis solos tu equipo y tú para poder vencerlas y que las otras partes, por regla general, lo que harán será sumar más resistencia.

Kent Beck, describe todo esto de la siguiente manera: “El software es inherentemente poco fiable y los clientes están condicionados a aceptarlo. Los desarrolladores están condicionados a aceptarlo. Los testers están condicionados a aceptarlo”.

Muchos críticos de los enfoques y/o metodologías ágiles lo son porque no terminan de entender como “algo serio” unas actividades de desarrollo de software que no están sustentadas sobre unos procesos sólidos, resultados de años y años de experiencia e investigación en este campo.

Las metodologías ágiles sistematizan determinadas actividades (lo que de por sí podría encajar en el concepto de proceso) pero los que las aplican tratan de ajustar su práctica y sus actividades al contexto organizativo en el que se trabaja y a la naturaleza de los proyectos, en un enfoque orientado a la mejora continua de las mismas porque a través de ellas se conseguirán mejores resultados.

No se trata, por tanto, de normas o procedimientos absolutamente ortodoxos que siguiéndolos a modo de receta de cocina nos llevan hacia el éxito del proyecto. El desarrollo de software sabemos que no es así.

Me gusta mucho la siguiente cita del desarrollador Marc Hamann ya que resume en pocas palabras este punto de vista: “La agilidad no es una ley ineludible de pureza, pero sí un principio práctico de efectividad”.

Pocas citas reflejan de manera tan contundente la realidad del proceso de desarrollo de software (traducción libre): “De lejos, el motivo principal para no liberar pronto es la resistencia a pasar del sueño del éxito a la realidad del feedback”.

Y esto es así, en los papeles todo puede llegar incluso a encajar y podemos dejarnos seducir por el pensamiento de que ya solo queda traducir a un lenguaje de programación (que no es poco) las especificaciones recogidas al usuario.

La realidad es bien distinta cuando el usuario se enfrente al producto y este no hace lo que esperaba y/o su experiencia de uso es nefasta y la probabilidad de que esto ocurra es mayor cuanto más tiempo pase desde que se realizó el análisis y cuanto más inestable sea la estructura organizativa del cliente y/o sus procesos.

El camino no es otro que asumir que el desarrollo de software es evolutivo, siempre con intención, siempre tirando a dar, admitiendo que a veces será necesario desandar parte del camino con el objetivo de no perdernos y llegar a la meta.

El fracaso no es el fin sino que perfectamente se puede considerar, si se aprende de él, como el principio de todo.

Hay muchos que consideran que pensar de esta manera es de perdedores. Para mi es precisamente todo lo contrario. Tener presente que el error y el fracaso es parte de la vida y tener el coraje de levantarte tras la caída, es de ganadores.

Claro que hay ejemplos de personas que han alcanzado el éxito sin apenas mancharse las manos pero también los hay y muchos más que lo han logrado cimentándolo desde las cicatrices de los fracasos.

Me gusta mucho la siguiente cita de Kent Beck que refleja perfectamente este sentimiento: “Si tienes problemas para alcanzar el éxito, fracasa”.

Seguir

Get every new post delivered to your Inbox.

Únete a otros 1.342 seguidores