sábado, 21 de abril de 2018

Acerca de lo urgente y lo importante en el desarrollo de software

Lo importante es tener detectores de humo que funcionen correctamente, lo urgente es salir corriendo de tu casa si se está quemando.

"I have two kinds of problems, the urgent and the important. The urgent are not important, and the important are never urgent.", Dwight D. Eisenhower

Matriz de Eisenhower

En nuestra profesión, el desarrollo de software, nos enfrentamos casi exclusivamente a tener que resolver dos tipos de problemas, los urgentes y los importantes.

Los problemas urgentes son aquellos que tenemos que resolver de forma inmediata para que el negocio que soporta nuestro sistema siga operativo. Si estos no se resuelven, se puede generar una situación que conlleve una grave crisis, incluyendo pérdidas materiales (o en el peor de los casos humanas), y que en última instancia nos acabe sacando del mercado, con consecuencias de diversa índole.

La resolución de temas importantes, son los que nos ayudan a que nuestros sistemas siguán vigentes en el futuros, nos ayudan a proyectarnos hacia delante, es la planeación a gran escala y a mediano y largo plazo.

En la práctica hay que saber balancear adecuadamente las tareas importantes y urgentes. Una mala gestión de lo que es importante y urgente, lleva siempre al desastre.

Es muy común, olvidarse de las tareas importantes, para ocuparnos exclusivamente de lo urgente, pero una cosa es innegable, cuando mas postergamos las tareas importantes, mas se van a convertir en urgentes (además de importantes).

Las tareas importantes son las que generan beneficios (en el negocio) de un sistema, son las que nos permite adaptarnos adecuadamente y de forma proactiva al mercado, ser innovadores y poder marca una diferencia y posición.

Las tareas urgentes son tareas enfocadas la reactividad, a reaccionar al mercado (en lugar de incidir en el), hace que tengamos que centrarnos en la "supervivencia", y no generan beneficios, son cosas que "tienen que hacerse".

Si clasificamos nuestros issues en mejoras y defectos de nuestros sistemas productivos, las mejoras serian los cambios importantes, los que generan benéficos (económicos en última instancia), es la evolución de un sistema hacia nuevos retos y horizontes, los defectos por otro lado son los elementos urgentes, lo que hacen que un sistema funcione mal. Corregir defectos no genera beneficios, sino que hace que un sistema funcione como se supone que debiera funcionar. Todo el tiempo (y dinero) invertido en corregir un error, son recursos que no se van poder recuperar y que no van a generar nada.

Otro ejemplo acerca de lo que es importante, es el ejercicio físico y cuidar nuestra alimentación, eso nos proporciona una vida sana y más placentera, hacia el futuro y a largo plazo, una enfermedad es algo urgente y que debe ser atendida, en el mejor de los casos al tratarnos recuperarnos nuestro estado inicial (antes de la enfermedad), pero nuestro cuerpo no va estar mejor (en todo caso igual), es la diferencia entre prevenir y curar. Los sistemas, son iguales, pueden considerarse elementos orgánicos (por eso hablamos del "tiempo de vida de un sistema"), en los que si invertimos en lo importante (como la arquitectura), nuestro sistema va a estar más sano, mas adaptable y menos propenso a fallos, que si nos dedicamos solo a lo urgente, el negocio. Los "urgente", será cada vez mas rápido y sencillo de atender, y podrá ser resuelto con menos recursos y esfuerzo. Al igual que en el cuerpo humano, si no atendemos lo urgente, el sistema tampoco funcionara a corto plazo, pero una vida sana, a la vez que un sistema sano, podrá hacer frente con mas capacidad a los problemas inmediatos e imprevistos.

Los temas urgentes e importante, se pueden clasificar, según la matriz de Eisenhower, en los siguientes elementos:


  • Urgente e importante: Es necesario realizarlo inmediatamente, con una supervisión cercana, disminuyendo la burocracia y aumentando las facilidades de comunicación entre los diversos miembros del equipo. Las tareas importantes no atendías a tiempo se convierten en urgentes, el negocio (sobretodo) y la arquitectura (en menor media) entran en este rublo.
  • No urgente e importante: Es necesario planearlo adecuadamente, decidir cuándo deben realizarse, antes de que se convierta en urgente. Atender un tema aquí es mucho más barato que dejar que se convierta en un problema. La arquitectura (principalmente) y el negocio (en menor medita) entra en este rubro.
  • Urgente, pero no importante: Es necesario delegarlo en la medida de lo posible, si no es posible delegarlo, hay que establecer unos tiempos, y espacios de resolución, y resolverlos adecuadamente, suele ser llamadas o correos o interrupciones. El consejo es dedicar una fracción del día en resolver esto problemas, como por ejemplo, una hora en contestar email y llamadas, y el resto de tiempo dedicarlo a la planeación (y ejecución) o los temas urgentes.
  • No es importante, ni urgente: No lo hagas, estas tareas no aportan nada, es necesario eliminarlas después de identificarlas apropiadamente .

Un mayor detalles de la matriz.


Mi organización personal de día a día, en estos asuntos, es de la siguiente forma:

Reunión general de equipo, aquí surgen los temas importantes y urgentes del día a día, lo que se tiene que resolver en el momento y lo que tiene que postergar

Segundo revisar el correo para realizar una planificación del día, es necesario comenzar a leer los correos, desde el ultimo al primero, el correo más urgente siempre es el último en ser recibido. Créeme que si tienes un correo importante que has recibido el primero, te vas a enterar por otro medio, ya sea telefónico o en persona. Los últimos correos siempre tiene la información más reciente y más importante, no hay nada más molesto y caótico que alguien que contesta un correo intermedio de una conversación.

Al leer los correos decide, en ese momento, si es urgente y atiéndelo o si es importante. si es importante ponle una fecha o delégalo, si no es importante ni urgente bórralo. A esto le dedico una hora o menos

Si tengo muchos asuntos urgentes que atender… bueno es que estoy haciendo realmente mal mi trabajo.

Después reviso mis tareas, ya sea por planeación o por un sistema de ticket, si puedo delegarlo, siempre lo delego, y siempre con una fecha.

Para una planeación correcta es necesario liberar siempre las tareas que crean dependencia con otras, es decir las tareas que hay que resolver forzosamente antes que otras. Por ejemplo al momento de crear una componente que sea una API consumible por otros, hay que definir antes la interfaz, y después implementarla. Es decir, si primero liberamos la interfaz (entiéndase no la grafica, si no la interfaz de consumo, las estructura de nuestro sistema), los consumidores de nuestra funcionalidad ya podría comenzar a desarrollar sus propios componentes, aunque nuestro componente no haga nada, es decir sean simplemente clases vacías, así es posible realizar un desarrollo en paralelo en lugar de secuencia.

Aquí se ve otro ejemplo de lo urgente y lo importante, lo urgente es la interfaz (la API, lo que define lo que hace el negocio), la implementación de dicha API (lo que realmente hace) no es urgente, es importante y puede ser resuelto mas tarde

Una vez resuelta la planeación es el momento de ponernos manos a la obra, ya hemos resuelto lo urgente, y podemos dedicarla el tiempo a los seria "trabajar", a implementar nuestro sistemas o sus mejoras, en mi caso comienzo mis labores de supervisión y verificación de código