¡Bienvenidos coders!
RSS

16 oct 2014

¿El analista es un programador jubilado?


Reflexiones sobre la vocación de los desarrolladores, y sobre la importancia de mantener la pasión por crear software a lo largo de nuestra carrera.

Empecé a programar a los 13 años. Empezó siendo un juego, y lo fue por mucho tiempo, hasta que empezaron a pagarme por hacerlo.

Entonces tuve que empezar a programar lo que me pedían, en lugar de programar lo que yo quería. Así y todo, seguía disfrutando de la tarea de programar; era algo que hacía con naturalidad y que me “salía solo”, como quien tiene algo de habilidad para tocar un instrumento musical. De todos modos tuve que estudiar para perfeccionarme y justificar lo que me pagaban por programar.

Con el tiempo y la experiencia, me volví “senior”. Eso significaba que recibía encargos más difíciles de hacer, y que podía resolverlos. Después comencé a repartir mi tiempo entre programar y especificar tareas para otros programadores.

Hasta que un día dejé de programar. Y me volví analista.

Hoy digo (mitad en broma mitad en serio) que “me jubilé como programador”.

¿Por qué? Dos motivos:

1. El conocimiento funcional que adquirí sobre determinados dominios hizo que mi tiempo fuera más valioso haciendo análisis que programando.

2. La actualización tecnológica me pasó de largo. Lo digo dejando caer una lágrima, pero hoy el esfuerzo que me demandaría ponerme al día con todas las herramientas y tecnologías de programación sería excesivo, y me distraería de las actividades de análisis que (por lo dicho en el punto anterior) me veo obligado a hacer. Sí debo mantenerme al día en el conocimiento de las nuevas herramientas y tecnologías, para saber qué potencial tienen; esa es una obligación ineludible de todo analista.

Nostalgias informáticas
A veces, las circunstancias me obligan a programar un poco. Y es entonces cuando me agarra un poco de nostalgia, que debe ser semejante a la que les da a los directores técnicos/ex futbolistas a quienes les cae una pelota a los pies y se ponen a hacer jueguitos.

Entonces me pregunto qué fue lo que me atrajo de la programación desde un principio. Y pienso que debe ser la posibilidad de construir cosas que funcionan (maquinarias, podría decirse) y hacerlo de una manera virtual, sin necesidad de ensuciarse las manos ni dominar herramientas y aparatos “físicos” que siempre me parecieron ruidosos, inmanejables y hasta peligrosos. Hay un placer innegable en escribir un programa y verlo funcionar en forma efectiva, sin errores. No importa que sea un juego o un sistema de facturación; es lindo ver una creación propia que funciona, y bien.

Pero uno se vuelve grande, y pierde la habilidad para salir a la cancha y correr atrás de la pelota. Hay que quedarse junto al banco y dar instrucciones. Entonces, la satisfacción no viene de construir algo y verlo funcionar, sino de dar instrucciones para que otros lo construyan, y ver que lo construyen bien, y que funciona, y darle una palmada en el hombro al que lo hace, y decirle: “lo estás haciendo bien siguiendo mis instrucciones”.

Convengamos que no todo analista es un programador jubilado (así como no todo DT es un ex jugador). Hay quienes salen de la facultad y comienzan a trabajar de analistas, sin haber estado dentro de la cancha corriendo atrás de la pelota. ¿Son mejores o peores analistas que los ex programadores?

Quién sabe. Quizás no tienen vicios de programador, entonces no tratan de que el programador haga las cosas como ellos lo harían, sino que le dejan libertad para que lo haga de la forma que le parezca mejor. Pero también puede ser que les cueste más trabajo encontrar un idioma común para transmitirle fielmente sus ideas al programador.

Todos somos traductores. El analista traduce lo que pide el cliente en modelos conceptuales; el diseñador y el programador traducen los modelos conceptuales en modelos de clases y finalmente en código de programación. A veces esas tres personas son en realidad una, a veces son dos, o tres.

Sería bueno saber en qué condiciones se obtienen las traducciones más fieles, si cuando los roles están en personas separadas, si cuando están en una o en dos, si cuando el analista es ex programador, o cuando el analista es sólo eso: analista y punto.

En cualquier caso, creo que lo importante es rescatar eso que nos atrajo a la actividad del desarrollo de software desde un principio, independientemente de que estemos en el sillón del analista, dibujando diagramas y narrando casos de uso, o en el del programador, tirando líneas de código: disfrutar de la satisfacción de ver funcionando a nuestras creaciones de software.

8 oct 2014

Ingeniería de requerimientos: cómo hacer una buena entrevista

Las técnicas periodísticas para entrevistar al cliente pueden ser de utilidad a la hora de relevar rquerimientos, con miras a obtener una descripción completa y enfocada en la solución que realmente se necesita.

Últimamente estuve leyendo algunas cosas sobre herramientas para ingeniería de requerimientos y otras yerbas, y me encontré con algo por demás interesante: el análisis lingüístico de textos. Resulta que uno somete a las transcripciones de lo explicado por el cliente a una de estas herramientas y, como por arte de magia, la herramienta devuelve una lista de las cosas candidatas a convertirse en clases conceptuales del modelo de dominio. De ahí en adelante es todo cuesta abajo. Genial, ¿no?

No.

Lo que las herramientas automáticas pasan por alto es que quienes describen el sistema a desarrollar son seres humanos. No son máquinas, ni son Sheldon Coopers, ni Mr. Spocks. Son seres humanos, y como tales, sus explicaciones están cargadas de defectos. No sólo por las ambigüedades y demás complicaciones propias del lenguaje natural, sino por las múltiples circunstancias que enturbian las narraciones y explicaciones de quienes tienen a su cargo relatar lo que necesitan en términos de sistemas.

Los ejemplos que se encuentran en libros de análisis y diseño suelen mostrar situaciones ideales, con casos de uso en los que los escenarios están descriptos minuciosamente, en forma concisa y completa, sin dejar escapar ni un detalle. Pero la realidad del día a día es muy distinta.

Lo que solemos encontrar cuando nos reunimos con el cliente (sin importar que el cliente esté representado por sponsors, stakeholders, expertos en la materia o incluso futuros usuarios del sistema) es que quien nos tiene que contar lo que se necesita incurre en una o más de las siguientes fallas:

-          No sabe lo que quiere en términos del sistema a desarrollar.
-          Tiene una idea de lo que quiere pero no la sabe explicar.
-          Sabe lo que quiere, pero no sabe lo que su empresa u organización realmente necesita.
-          Tiene sólo una idea parcial de lo que la empresa necesita, y la relata como si fuera el todo.
-          Sabe lo que la empresa necesita, y lo sabe explicar, pero su explicación está sesgada y prioriza aspectos del sistema que no son los más importantes para la empresa.

Si sometemos al análisis lingüístico a los relatos de una de estas personas, obtendremos una serie de correctas sugerencias de las clases que tiene que contener el modelo de dominio. Aclaremos: las sugerencias son correctas, pero están fundamentadas en una narración defectuosa. Un amigo mío suele decir: las herramientas automáticas se equivocan automáticamente.

Para corregir el factor humano que causa defectos en los inputs, lo que se necesita es un factor humano opuesto. Aquí es donde aparece la figura del entrevistador.

Quienes llevan años o décadas relevando requerimientos han desarrollado un instinto para entrevistar, y saben cómo interactuar con el cliente para obtener la información que necesitan y avanzar con el análisis por las sendas correctas. Pero quienes somos más novatos, corremos el riesgo de tomar al pie de la letra las declaraciones del cliente y utilizarlas como única, veraz y completa base para el posterior análisis.

En mi caso, tengo la suerte (?) de haber pasado algunos años trabajando en la industria editorial, escribiendo artículos y haciendo entrevistas periodísticas. Y aprendí algunas cosas que pueden ser de utilidad a la hora de relevar requerimientos.

La labor periodística
El verdadero periodista se enfrenta todos los días con la necesidad de entrevistar a personas y sacarles información que no quieren dar, o que no saben dar, o que no pueden dar. Pero se las tiene que ingeniar para salvar ese obstáculo y obtener la información a como dé lugar. Si no, se queda sin trabajo. Entonces, ¿qué mejor que emplear técnicas periodísticas para entrevistar al cliente y extraerle todos los conocimientos posibles?

A continuación detallo algunos consejos de verdaderos periodistas que pueden ser de gran utilidad a la hora de hacer ingeniería de requerimientos.

Lo primero que se debe hacer antes de encarar una entrevista es seleccionar el tema a tratar. Desde el punto de vista de un relevamiento, esto significa interiorizarse con la problemática que debe resolver el sistema a desarrollar. Simple y obvio.

Elegir a la persona a quien entrevistar. Esto no siempre está en nuestras manos; a veces la persona es designada por alguna “autoridad superior” y debemos atenernos a trabajar únicamente con esa persona (aunque no se descarta la posibilidad de que propongamos a otras personas para que aporten información adicional).

Diseñar un cuestionario con preguntas claves. Muy recomendable para encaminar el diálogo y evitar olvidos. El cuestionario, sin embargo, debe tomarse como una ayuda-memoria, ya que las preguntas más interesantes (y sus respuestas) suelen nacer en el diálogo dinámico.

Establecer una conversación relajada antes de abordar los temas claves. Esto lo sugieren los periodistas para establecer un vínculo con el entrevistado. No está de más tenerlo en cuenta; es bueno que exista una amistad con quienes deben suministrarnos información valiosa, y con quienes vayamos a trabajar todo a lo largo del proyecto.

No orientar, condicionar o sugerir respuestas. De lo contrario, corremos el riesgo de que nuestros preconceptos distorsionen la información. Hay que asumir que el que sabe es el entrevistado, lo cual no quita que debamos empaparnos con anticipación en el tema a tratar.

¡Que no se escape nada! Conviene tener a mano un grabador de periodista para que no haya información “off the record”. Para los periodistas, esta es una cuestión legal; para los analistas, es bueno tener un respaldo para recordarle al cliente lo que dijo y pidió.

Algunos otros detalles: colocarse en un nivel de igualdad con el entrevistado, sin faltar al respeto, pero dialogando de igual a igual; ir de lo más sencillo a lo más complejo; manifestar interés por la información vertida; dar al entrevistado el tiempo que necesite para pensar las respuestas.


Quizás estas ideas no sean herramientas infalibles, pero de seguro ayudarán a arrancar un proyecto de desarrollo con el pie derecho. 

1 oct 2014

La habilidad más importante que un desarrollador debe tener

(ante todo, una aclaración: el título se refiere únicamente a desarrolladores -analistas, diseñadores, programadores, arquitectos- que utilizan metodologías orientadas a objetos, si bien hoy en día son pocos los que no lo hacen)

Craig Larson, en su libro "Applying UML and Patterns" hace una pregunta: si debiéramos elegir la actividad práctica más importante entre todas las que componen el proceso de desarrollo orientado a objetos, ¿cuál sería?

Su respuesta es: la habilidad para asignar responsabilidades a los objetos de software. O sea, hay muchas habilidades valiosas, como por ejemplo diseñar eficientes bases de datos relacionales, escribir casos de uso completos y claros, o dibujar impecables diagramas de secuencia, entre muchas otras; pero la asignación de responsabilidades a objetos es la más importante de todas.

La razón (explica Larson) por la que dicha habilidad es tan importante es que debe llevarse a cabo en todo momento del proceso de desarrollo -ya sea mientras se dibuja un diagrama UML o mientras se está escribiendo código- y que influye fuertemente en la robustez, facilidad de mantenimiento y posibilidad de reutilización de los componentes de software.

Larson observa también que la asignación de responsabilidades tiende a ser una actividad desafiante para dominar, y su importancia es vital. "En un proyecto real, un desarrollador puede no tener la oportunidad para llevar a cabo ninguna otra actividad de modelado, por el frecuente 'apuro por programar'. Pero incluso en tal situación, la asignación de responsabilidades es inevitable".

Ahora, la pregunta es: ¿se puede cultivar esa habilidad, o se nace con ella?

Una forma de intentar responder a esa pregunta es jugar al DT (esto no es sugerencia de Larson, es pura cosecha propia). Jugar al DT significa imaginar que los objetos de un sistema son el plantel de un equipo de fútbol, y uno, como analista, es quien debe diseñar la estrategia de juego, acordando con cada jugador (u objeto) lo que debe hacer.

Un pequeño ejemplo: nos toca diseñar una herramienta para hacer el picking de pedidos en un depósito de mercaderías. Como directores técnicos, primero armamos el "plantel" imaginario con los objetos que van a formar nuestro equipo: un depósito, muchos artículos, muchas ubicaciones, un pedido que debe armarse. Hay un actor principal que es el preparador del pedido.

Comenzamos a armar nuestra estrategia de juego. Reunimos imaginariamente a nuestros objetos frente a un pizarrón (en el que imaginamos que está dibujado el bosquejo del modelo de dominio) y les decimos, señalando el dibujo: "el preparador llega con una hoja impresa en la que figura el detalle de artículos que debe reunir para armar el pedido. El preparador tiene una necesidad clara: armar el pedido lo más rápido posible, ya sea para poder seguir armando otros pedidos o para poder irse a su casa temprano. El preparador se fija en el primer artículo del pedido, y necesita averiguar rápido en qué parte del depósito encontrarlo".

Entonces miramos a nuestros jugadores y les preguntamos:

-¿Quién se encarga de decirle en dónde encontrar el artículo que busca?

-¡Yo! -contesta el objeto Depósito con firmeza.

-¡Bien! -gritamos entusiasmados. Ya tenemos asignada una importante responsabilidad a un objeto igualmente importante. Pero no es suficiente. Nos dirigimos a Depósito y le preguntamos:

-¿Qué información le das al preparador para ayudarlo a encontrar ese artículo?

-¡Le muestro todas las ubicaciones en donde hay almacenadas unidades del artículo que busca! -contesta Depósito enérgicamente-. ¡Ordenadas por cercanía, para que tenga que recorrer el menor camino posible!

-¡Perfecto! -replicamos palmeando a Depósito en el hombro. Volvemos a señalar el pizarrón y continuamos el relato estratégico-. Entonces el preparador se dirige rápidamente a la ubicación más cercana de las que le mostraste y allí encuentra el artículo. Toma las unidades que necesita y las coloca en el carro. Ahora necesitamos que el sistema se entere de que esas unidades fueron retiradas de su ubicación. ¿Quién se encarga de esto?

-¡Yo! -contestan a coro los objetos Artículo.

-¿Y cómo lo hacen?

-¡Le mostramos al preparador nuestros códigos de barra, para que los lea con su escáner, y el sistema sepa que ya no estamos en la estantería, y ahora formamos parte del pedido!

-¡Excelente!

Y así sigue nuestra imaginaria charla motivadora con nuestro plantel de objetos hasta que cada uno de ellos tiene perfectamente claro lo que tiene que hacer para llegar a cumplir con lo que necesita el actor (en este caso, el preparador).

Una curiosidad lingüística que ayuda en la metáfora del equipo de fútbol: en la terminología del UP (Proceso Unificado), se habla de los "goals" (metas u objetivos) de los actores para identificar requerimientos. Nuestro equipo imaginario, en lugar de tratar de convertir goles, busca materializar goals.

No me atrevería a proponer en recintos académicos la costumbre de dar vida, actitud y personalidad a los objetos como una forma de diseñar software; pero de seguro sirve como ayuda para ver a los sistemas como conjuntos de entidades con comportamiento, que colaboran en pos de un objetivo común.

Al fin y al cabo, si a los escritores de novelas les pasa que sus personajes parecen cobrar vida y decidir por sí mismos cuáles serán sus destinos, ¿por qué los objetos de software no pueden hacer lo mismo y decidir por sí mismos cuáles serán sus responsabilidades?