28 ene 2011

Esa Cosa Llamada Documentación Técnica

No recuerdo que, cuando estudiaba, nada me hablara nunca de la Documentación Técnica. De hecho, en el Proyecto Fin de Carrera (lo más parecido a un proyecto real que se hacía), recuerdo como entregables cosas como la Especificación de Requisitos, el Análisis, el Diseño, los Fuentes y el Manual de Usuario, pero nada de Documentación Técnica...

Fue al empezar a trabajar cuando me enteré de que, después de hacer un programa (en RPG), se esperaba de mí que creara (o modificara... que como programador nuevo uno no hacía muchos programas nuevos) un documento de Word explicando los detalles internos del programa (algo de pseudocódigo, descripción de las validaciones, diseño de pantallas, ejemplos de llamadas...). La creación y mantenimiento de este tipo de documentación rivalizaba con la Documentación de Usuario por el premio a la tarea menos deseada de todo el proceso de desarrollo.

Más o menos por esa misma época (quizá un año antes...), oí hablar en un cursillo de Java por primera vez de una herramienta que hacía algo muy curioso: javadoc. Que a partir del código fuente y una serie de comentarios especiales, se pudieran generar automáticamente una serie de documentos HTML describiendo la estructura y detalles de las Clases empleadas, con el mismo formato que la propia ayuda estándar de Java, parecía casi cosa de magia.

A la primera versión de la Documentación Técnica reconozco que le veo poca utilidad: no deja de ser un duplicado del código fuente en un formato más legible. Aún asumiendo que el RPG es un lenguaje poco legible (o menos legible que otros, que no se me enfade nadie...), lo que se logra con esta documentación no es nada que no pueda lograrse con unos comentarios apropiados en los fuentes. Si es por un problema de acceso a los fuentes (era más fácil acceder a los documentos Word que a los fuentes de un programa RPG), hubiera visto más práctico generar automáticamente un listado de texto de los fuentes RPG cada vez que se pone un programa en producción. En todo caso, el peor problema de este tipo de Documentación Técnica es el de mantener sincronizadas las versiones de los fuentes y los documentos. Tarde o temprano, un documento se va a quedar desactualizado y examinarlo no va a servir de nada y no va a haber más remedio que acabar acudiendo a los fuentes.

Más útil es la segunda versión comentada de la Documentación Técnica, generada automáticamente. Quizá no lo sea tanto para uso interno, pero sí en entornos más "compartimentalizados" en los que se proporcionen componentes o librerías a otros grupos de desarrollo (o, evidentemente, si se desarrolla ese tipo de software para el usuario final). Así, nuestros clientes pueden usar nuestros componentes con el apoyo de una buena ayuda, y sin necesidad de acceso a nuestros fuentes: una situación idealmente perfecta.

Las ventajas de este tipo de documentación son principalmente dos. La primera es que se apoya en la que debería ser la principal fuente de documentación y resolución de dudas para el desarrollador: los comentarios del propio código fuente. Puede parecer una perogrullada, pero vale la pena repetirlo y destacarlo: la mejor Documentación Técnica es el código fuente (comentado adecuadamente). Evidentemente, esto obliga a desarrollar una disciplina a la hora de programar y comentar. Esto debería tenerse ya, pero la necesidad de crear unos comentarios que deban ser "compilados" por un sistema automático lo que logra es reforzar la necesidad de esa disciplina. Por duro que se haga comentar el enésimo método de acceso a una propiedad (El método getDato sirve para obtener el valor del dato...), vale la pena hacer el esfuerzo y acostumbrarse a dejar todo documentado: se gana en claridad y en tranquilidad. Si algo no está documentado ya no cabe la duda de si se debe a que es muy trivial o se trata de un olvido: ya no existe nada trivial.

El segundo punto a favor de estos métodos automáticos de documentar es, precisamente, que son automáticos. La generación de documentación se convierte así en un paso más del proceso de desarrollo, como el compilar para generar un ejecutable. ¿Qué inconvenientes se le puede poner a un sistema que automatiza la realización de una tarea que se considera desagradable? Ahora mismo no se me ocurre ninguna...

En resumen, la generación automática de Documentación Técnica permite generar fácilmente uno de los entregables que se le exigen al desarrollador, con el efecto secundario de reforzar la disciplina a la hora de comentar el código fuente. Todo son ventajas.

Así, aunque no se programe en Java, vale la pena buscar algún sistema similar a javadoc, por no hablar que la mayoría de lenguajes y entornos "modernos" (de Python a .NET) ya incluyen este tipo de herramientas. Y si no, es posible que existan de manera independiente. Ahora mismo trabajo en un proyecto desarrollado en Visual C++ (eMbedded) y empleo DoxyS para generar periódicamente la documentación de unas 200 Clases con un total de alrededor de 100.000 líneas de código. Es un programa sencillo (seguro que los hay más configurables y flexibles) para la sintaxis que requiere es muy poco intrusiva y lo que produce es más que suficiente para mis necesidades. Para hacer frente a algunas de sus carencias más problemáticas he programado unos scripts en Python para "preparar" los fuentes antes de llamar a la generación de la documentación. El resultado final es que, tras unos 20 minutos de procesamiento, se dispone de la Documentación Técnica de mi proyecto en un servidor web. La documentación es totalmente navegable, buscable, y va desde gráficos de llamadas de más alto nivel hasta la posibilidad de consultar el código fuente de un método concreto. Y todo eso sin más que ejecutar una sentencia en la línea de comandos: ¿qué más se le puede pedir?

17 ene 2011

Documentación de Usuario

Empecé a trabajar como miembro de una Horda Mongola en la época del Efecto 2000 y la adaptación al Euro. Muy pronto a alguien se le ocurrió que era un buen momento para establecer un nuevo sistema de documentación del software de la empresa, y fui el elegido gracias a que era el que más HTML sabía en el grupo. Se podría decir que diseñé un procedimiento y una metodología de trabajo por la que todos los programas que se hacían o modificaban se documentaban en forma de página HTML que, además de servir como el típico manual de usuario, incluía una pequeña simulación del proceso del programa (nada espectacular: sólo una sucesión de "pantallazos" estáticos con enlaces para pasar de uno a otro). Dado que estábamos hablando de software desarrollado en RPG III o RPG IV, hay que reconocer que la documentación resultaba bastante más vistosa que los propios programas. Sin embargo, fue entonces cuando descubrí, una vez acabada la excitación y el interés provocado al tener que elaborar todo el sistema, que realizar la documentación de usuario era un rollo. (Supongo que unos cuantos de mis compañeros también lo descubrieron, aunque quiero pensar que al menos la experiencia les sirvió para aprender algo de HTML básico, así que espero que no me guarden rencor por la parte que me toca). Incluso habíamos gente que nos dedicábamos íntegramente a documentar los programas creados por programadores más experimentados que no interesaba que "perdieran el tiempo" documentando. De ahí a que el documentar fuera casi considerado un castigo, sólo iba un paso...

Encuentro comprensible que a nadie (o casi nadie: no se puede generalizar) le guste la elaboración de la documentación de usuario. A los que nos dedicamos a esto del desarrollo de software nos gusta crear cosas que hagan algo. Tener que explicar luego en un documento de texto como utilizar nuestro software, con múltiples ilustraciones capturando todas y cada una de las pantallas del proceso (eso si no hay que retocarlas para que no muestren datos inapropiados), y listando obviedades varias (el botón de "Añadir Producto", sorprendentemente, ¡añade un producto!), es casi una tortura que resulta casi más costosa que el desarrollo de la aplicación en sí.



Un inciso necesario a raiz del último párrafo: la documentación de usuario debe ser exageradamente detallada, aún a riesgo de acabar creando un documento para tontos. Muchas cosas que el desarrollador considera obvias (y que lo son...), no las verá de la misma forma el usuario, así que vale la pena explicarlo todo hasta el más ínfimo detalle. Así, reduciremos las consultas de los usuarios o, por lo menos, no les daremos la excusa de que "en el manual no lo explica"



Por otra parte, en los propios procesos de las empresas es normal que haya previsto un tiempo insuficiente para el desarrollo de esta documentación (si es que hay previsto alguno). En el entorno de trabajo habitual, cuando un desarrollador finaliza un programa lo normal es que tenga unos cuantos esperando en cola y, una vez más, ni a él le interesar perder el tiempo en la desagradable tarea de documentar, ni a sus superiores les interesa que pierda el tiempo en vez de estar resolviendo problemas o creando nuevas funcionalidades que exigen los usuarios. Por supuesto, asumo que no se dispone de una persona dedicada exclusivamente a la redacción de documentación de usuario (Incluso si se dispone de personal especializado en la formación al usuario, la documentación se la debe proporcionar normalmente el propio desarrollador).

La consecuencia de todo esto es inmediata: montones de programas no disponen de sistemas de ayuda o manuales de usuario. O, lo que es peor todavía, disponen de ellos pero están obsoletos. Y esto hace que los usuarios ni se molesten en consultar la ayuda o los manuales: resulta mucho más efectivo llamar al departamento de Informática y consultar con el desarrollador.

Este es un problema con difícil solución, pues precisa que el desarrollador se conciencie de la necesidad de elaborar (y, más importante aún, mantener) la documentación de usuario y, por otra parte, precisa que los jefes de proyecto y similares tengan en cuenta que el manual de usuario es un entregable como otro cualquiera, y al que se le debe dedicar el tiempo necesario. Conseguir esto es donde está la principal dificultad, y aquí incluyo algunas de las razones por las que creo que es conveniente tener una buena documentación de usuario.


  • Herramienta de Ventas. El manual de usuario es una buena forma de vender el software que describe, de manera que el potencial cliente se haga una idea de lo que es capaz de realizar sin necesidad de proporcionarle acceso (Aunque, obviamente, nunca va a ser tan bueno como una demo). Cuando se trata de presentar ofertas y similares, se vuelve imprescindible (además de ser una manera fácil de añadir peso a la oferta...). De hecho, no es raro que a la hora de presentar una oferta a clientes, el jefe de proyecto o de departamento se dé cuenta de la utilidad de disponer de una documentación de usuario extensa y completa.
  • Reducción del Ruido Telefónico. Los que nos pasamos buena parte del día dando soporte a usuarios de nuestro software (o de software del que somos "responsables"), deberíanos arrepentirnos cada vez que suena el teléfono por no haber desarrollado un buen sistema de ayuda. Si los usuarios (o, si se dispone de ellos, el personal de soporte al usuario) tuvieran acceso a documentación que les permitiera resolver sus dudas y problemas por sí mismos, no llamarían tanto (o incluso, por utópico que suene, no llamarían nunca). De todas maneras, una vez el usuario ya no tiene confianza en la documentación y se acostumbra a resolver sus dudas por teléfono, el problema tiene mala solución...
  • Recapitulación. La elaboración de la documentación de usuario tras un desarrollo o una modificación puede servir para asegurarnos de que el programa hace lo que debe, como debe, y como se pidió. No debería ser ese el momento, claro, pero el necesario repaso de las funcionalidades puede servir para descubrir lapsus y otros errores pendientes.

Reconozco que me cuesta encontrar más razones para justificar la necesidad de realizar la documentación de usuario (además de las obvias): supongo que no soy capaz de no verla como un "mal necesario". Es algo que hay que hacer, puedo racionalizar su necesidad, pero eso no hace que me guste...

Otro día hablaremos de la documentación técnica...

7 ene 2011

Toma de Requerimientos

Empezaremos por explicar el origen e intenciones de este blog.

Todo nace de la lectura de un libro: The Passionate Programmer, una recomendable mezcla de libro técnico (sección "prácticas y metodologías") y libro de auto-ayuda (sin rollos místicos). Aunque algunas cosas son probablemente poco aplicables a la situación de la industria en España (lógico: el libro es estadounidense), sigue siendo un texto más que interesante.

Varios de los consejos del libro en cuestión se refieren a llevar un blog en el que anotar las propias experiencias (relacionadas con el desarrollo de software, claro está), aunque sólo sea como cuaderno de bitácora para consulta propia. Y ese es el principal objetivo de este blog: servir ejercicio y herramienta de reflexión del que esto escribe. Si además alguien encuentra algo interesante o útil, bienvenido sea, pero el blog no pretende ser referencia de nada.

Y eso lleva a una necesaria presentación del autor. El que esto escribe lleva más de 10 años trabajando en el desarrollo de software en una empresa de servicios, integrado en el departamento de informática de dicha compañía. A pesar de ser un departamento relativamente grande, las circunstancias han hecho que haya desarrollado casi siempre mi trabajo de forma independiente, como un equipo de una sola persona, y habitualmente en entornos de desarrollo situados en los límites de lo considerado "corporativo". Es decir, por ejemplo, que mientras el software de la empresa se desarrollaba en RPG, yo me dedicaba a hacer programas en Visual Basic o C++.

En consecuencia, mis experiencias (como las de cualquiera) han marcado mis puntos de vista sobre como se funciona en el mundo real del desarrollo de software (y como se debería funcionar...). Esos puntos de vista son los míos, los de nadie más, y no pretenden sentar cátedra de ninguna manera: uno no es un gurú de nada. Si alguien los encuentra equivocados, probablemente tenga razón: la subjetividad es lo que tiene.

Dicho todo esto, uno de los ejercicios propuestos por el libro mencionado al principio de este post era hacer una lista con unos 10 temas sobre los que escribir y dedicar cada día una entrada a uno de dichos temas. No tengo aún hecha la lista (aunque un par de temas ya me rondan por la cabeza), y este mes de Enero promete ser intenso, así que no pienso comprometerme a seguir esas instrucciones al pie de la letra. Eso sí, espero que el blog cuente con alguna entrada más antes de que llegue Febrero.

Por supuesto, el nombre del blog procede de la genial serie británica The IT Crowd y es lo más parecido al "Hello, IT" de Roy que he podido encontrar libre.