viernes, 9 de enero de 2009

Un cierre con mis preferidos del 2008.

el-equipo-a2

En algún momento del 16 de Mayo me decidí a comenzar con este blog. Un día después publiqué la primera entrada, y aquí estamos.

Una evaluación seria depende en buena medida de la preexistencia de un plan o por lo menos de una serie de objetivos. Así que ésta no será una evaluación seria.

En un principio “publiqué” para darle un sentido a escribir, y escribí para publicar.

Siguió como un juego exploratorio: las herramientas, las costumbres, las manías, los lugares comunes, los lugares inesperados, los comúnmente inesperados y los inesperadamente comunes.

Y se convirtió en un pequeño mundo hecho a medida (los blogs que leo, los bloggers que conozco) pero que se expande rápida y descontroladamente (los blogs que leen los que me leen, los bloggers que conocen los que conozco).

No quiero mencionar especialmente a nadie. Son los que están por ahí, vinculados en las entradas o en los comentarios. También los que sólo leen pero empujan la cuenta de suscripciones al feed y los que pasan de vez en cuando o de casualidad y dejan su huella en las humildes pero siempre crecientes estadísticas. A todos gracias… totales (no pude evitarlo, tan seriecito que venía, casi poético).

Bueno, si sigo paso a la pavada. Éstos son mis artículos preferidos del año:

  1. No digas "programita".

  2. eXtreme Programming es un arma peligrosa.

  3. Panqueque System.

  4. Antipatrones de diseño.

  5. Reflexiones sobre el trabajo: la metáfora de la autopista y la metáfora del barco.

  6. La autopista del desarrollo.

  7. Del desarrollo de software como sistema de comunicación y la importancia de poder leer y escribir.

  8. Asteroides.

  9. Simpleton (un post a cuatro manos).

  10. Eficacia vs. eficiencia del programador.

jueves, 8 de enero de 2009

202 frases célebres del mundo de la informática.

discurso

José M. Aguilar ha publicado en su blog un resumen con las entradas más leídas en 2008 (Top posts 2008 en Variable not found).

Las dos entradas más leídas han sido 101 citas célebres del mundo de la informática y Otras 101 citas célebres del mundo de la informática.

Imposible no referenciarlo, aunque el mismo post indique que ya se ha hecho hasta el hartazgo. Están categorizadas y hay para relamerse. Algunas de mis preferidas:

"Hay dos maneras de diseñar software: una es hacerlo tan simple que sea obvia su falta de deficiencias, y la otra es hacerlo tan complejo que no haya deficiencias obvias"

-- C.A.R. Hoare

"La mayoría de ustedes están familiarizados con las virtudes del programador. Son tres, por supusto: pereza, impaciencia y orgullo desmedido"

-- Larry Wall

"Primero resuelve el problema. Entonces, escribe el código"

-- John Johnson

"Obtener información de internet es como intentar beber agua de una boca de incendios"

     -- Mitchell Kapor

"Es importante destacar que ningún ingeniero software con ética consentiría escribir un procedimiento llamado DestruirBaghdad. Su ética le obligaría a escribir un procedimiento DestruirCiudad, al que se pasaría el parámetro Baghdad"

     -- Nathaniel S. Borenstein

Predicciones fallidas.

Qué mejor que mirar un poco hacia atrás en el tiempo para corroborar aquello de

"Somos dueños de nuestros silencios y esclavos de nuestras palabras."
  • “Nadie va a necesitar más de 640 Kb de memoria en su ordenador personal”, Bill Gates, en 1981.
  • “No hay necesidad de tener un ordenador en cada casa”, Ken Olsen, fundador de Digital Equipment, en 1977.
  • “La TV no durará porque la gente se cansará rápido de pasar todas las noches mirando una caja de madera”, Darryl Zanuck, productor de la 20th Century Fox, en 1946.
  • ...

El resto en 10 puntos...

miércoles, 7 de enero de 2009

Aprendizaje e innovación.

innovation

Al final de A great place to work me preguntaba

¿Qué es realmente un "great place to work" que además favorezca la innovación? Digo, ¿cuál es la esencia? Porque conozco de empresas con grandes beneficios (bonus, horarios flexibles, muchos proyectos, buen ambiente entre los compañeros...) pero que no lo son.

Improbable tiró una muy buena punta: "es un lugar donde tu jefe sabe más que vos de algo que te interesa aprender y a él le interesa enseñar". Me gusta por corta y marketinera (en el buen sentido), quedaría bien en un cuadrito.

Apunta a algo que es seguro: aprender es usualmente motivador y siempre conveniente. Si hablamos de relaciones laborales en dependencia (empleado-empleador) el conocimiento aprendido es un valioso bien de capital con el que se queda el empleado y también la organización (si sabe preservarlo). El conocimiento debe ser uno de los pocos bienes de capital que aumenta cuanto más se utiliza y comparte.

Pero la enseñanza directa o… “consciente” o “deliberada”, digamos, no es la única forma de aprendizaje. Yo creo que la respuesta citada puede ampliarse un poco… algo así como que un gran lugar para trabajar “es un lugar donde hay algo que te interesa aprender, y donde es posible hacerlo”.

No importa si es el jefe, un compañero de trabajo, un colaborador (palabra bonita para “subordinado”), un papel o el código de un sistema o un blog. Cualquier cosa en el entorno laboral que expanda nuestro horizonte de conocimientos lo hará un buen candidato a “un gran lugar para trabajar”.

Pero, cæteris paribus (cómo me gusta encontrar dónde poner esa frase) el aprendizaje se acaba. En algún momento sabemos todo lo que se puede saber o todo lo que nos interesa. ¿Entonces? Nuestro “gran lugar para trabajar” se convierte en una celda donde nada cambia.

Es cuando debe aparecer algo que rompa ese estado de cæteris paribus. Ese algo es la innovación.

Si el proceso de aprendizaje es la asimilación de conocimientos a partir de una fuente, el proceso de innovación es de alguna manera la producción de nuevas fuentes de conocimientos. Estas nuevas fuentes pueden crearse introduciendo nuevos elementos o reordenando los existentes.

Si volvemos a la definición de “un gran lugar de trabajo”, vemos que uno en particular puede serlo en un momento y agotarse con el tiempo. Para que sea sustentable debe generar por sí mismo y de tanto en tanto nuevas e interesantes cosas que aprender. Es decir que uno no tendría que cambiar de trabajo o buscar un espacio por fuera de él para encontrar esas nuevas fuentes o combinaciones de fuentes que hemos etiquetado como “innovación”.

¿Pero qué es ese entorno innovador que genera nuevas cosas que aprender? ¿Qué lo constituye? Hasta donde yo sé las únicas que pueden innovar son las personas. O sea, el “entorno innovador” es una o varias personas que cada tanto generan nuevas cosas que aprender.

Si esas personas que constituyen el “entorno innovador” lo hacen como parte de su trabajo diríamos que la innovación está institucionalizada. ¿Es decir que estamos en presencia de una institución innovadora? No, no necesariamente. Una cosa es que el mecanismo esté (condición necesaria más no suficiente), otra que esté institucionalizado (tal vez necesario para que perdure en el tiempo, pero no garantiza nada) y otra que funcione (¿a partir de la chispa que buscaba Iboisset?).

Lo anterior implica que puede existir un entorno innovador en cualquier lado, ya que está compuesto por (y solamente por) personas.

Y también que ciertas personas crean ese tipo de entornos donde quiera que estén, ya que tienen una marcada tendencia a innovar. Son los que llamamos “innovadores”.

Pero también implica que cualquiera puede hacerlo en un momento determinado. Y que incluso tiene sentido hacerlo por más que la organización no logre aprovecharse de ello, ya que representa, por lo menos, un avance en el aprendizaje personal.

Quiero recalcar la palabra “interesante” que apareció más arriba. Qué es interesante y qué no depende de cada uno. Así, un entorno innovador puede serlo para una persona (hay cosas en él que le interesan) y no para otra. Ergo no existe un entorno innovador en términos absolutos. Dependerá de quién lo mire. ¿O no recordamos ese “efecto wow” de nuestros primeros trabajos, cada vez más difícil de encontrar? Cada vez sabemos más, por lo que nos es cada vez más difícil encontrar o crear un entorno innovador.

Claro que a veces es imposible, absolutamente imposible innovar en cualquier sentido. Hay un entorno que lejos de favorecer la innovación la impide, la asfixia. Si esto es deliberado e institucionalizado estamos en presencia de la negación absoluta de “un gran lugar para trabajar”. Es decir, un trabajo de m…

martes, 6 de enero de 2009

Conversando con la tecnología.

No acerca de la tecnología ni a través de la tecnología:

Humano: Tecnología, ¡estás a mi servicio!

Tecnología: OK, pero ¿pagarás por mí, no es cierto?

Humano: ¡Seguro! Lo haré.

Tecnología: ¿Y me actualizarás de tiempo en tiempo?

Humano: OK, puedo hacer eso.

Tecnología:Y además... ¿podrías hacerte cargo de mis cables? Tengo un montón.

Humano: ¿Cables? Hmm, OK, si es lo que necesitas...

Tecnología:Por favor, mira mis botones si parpadean y mi pantalla de vez en cuando.

Humano: OK...

Tecnología: Y arréglame de vez en cuando.

Humano: Sí, sí, por supuesto.

Tecnología: Además debes resguardarme en un lugar seguro para evitar que me roben.

Humano: ¡Por supuesto que lo haré!

Tecnología: Y además proveerás resguardos por si me rompo, OK?

Humano: Hmm, seguro, sí...

Tecnología: Podría hacer algún ruido de vez en cuando, lo que indica que necesito tu atención.

Humano: OK, si, perfecto, te prestaré atención de vez en cuando.

Tecnología: Pero por favor no me uses mal, podría causar un desastre muy rápido.

Humano: Ok, perfecto, estoy consciente de ello. ¿Algo más? Mira, no tengo mucho ti...

Tecnología: ... además, estáte siempre seguro de enchufarme, ya que necesito un montón de energía.

Humano: Sí, ya sé, yo...

Tecnología: ... a veces necesito acceso inalámbrico, así que llévame por allí hasta que lo encuentre...

Humano: Sí, por supuesto, quiero decir, yo...

Tecnología: Ah, por cierto, no todos mis cables son iguales, estáte seguro de enchufar los que correspondan, y de no mezclarlos.

Humano: Tecnología, ya sé, ya sé... ¿hay algo más que necesites?

Tecnología: No, estoy a tu servicio. No quiero causar ningún problema.

Humano: Es muy considerado de tu parte. Yo...

Tecnología: ¿Mencioné que muchas veces soy mala para el medio ambiente?

Humano: ¡Tecnología! Creo que es tiempo de que tú...

Tecnología: Oh, a veces contengo errores o virus desagradables. ¿Mencioné eso?

Humano: Yo...

Tecnología: ¿Y muy poca usabilidad? ¿Y manuales extra-largos? ¿Y una horrible atención telefónica? ¿Y retorcidas promesas publicitarias?

Humano: Maldita seas... ¿podrías callarte?

Tecnología: ¿Callarme?

Humano: Quiero decir, yo...

Tecnología: Mi amo, tú me llamaste a servicio. Sabes que puedo desaparecer con sólo presionar un botón.

Humano: Bueno, no quise decir eso, lo que estoy diciendo es...

Tecnología: Espera un segundo, voy a congelarme, tengo que cargar algo.

Humano: ¿Qué?

Tecnología: ...

Humano: Oh, supongo que tengo que esperar.

Tecnología: Gracias. Estoy de vuelta. Hubo un pequeño error que desgraciadamente borró parte de mi memoria a corto plazo.

Humano: ¿Qué? Tú...

Tecnología: ¿De qué estábamos hablando?

Humano: De que eres mi sirviente, por supuesto.

Tecnología: Seguro. Eso lo sé. Pero ¿pagarás por mí, no es cierto?

[la discusión continúa por algunos milenios]

Visto en Google Blogoscoped (Human: Technology, you are my servant!) y traducido por mí (se agradecen correcciones).

Esas pequeñas cosas…

…que nos molestan de nuestros compañeros de oficina. Pequeñas miserias humanas, como terminarse el café y no hacer más. Pequeños descuidos, como no colocar las tapas en un archivo. Pequeños tiempos  improductivos, como conversaciones de pasillo y demás.

Alguien encontró la solución definitiva. Civismo y productividad en la oficina:

Visto en Aumento de productividad.

lunes, 5 de enero de 2009

Búsqueda de errores y depuración: una historia, un poco de metodología y algunos consejos.

Último día laboral de este 2008. 7.20 de la mañana (¡sí señor!), ya despabilado y mate en mano frente a la pantalla. Mientras inicia Windows, el entorno de desarrollo y el proyecto (y un largo etc.) leo un auto-recordatorio de baja tecnología (un papel suelto sobre el teclado) que dice "ver incidente 1269". Me acuerdo del protagonista de Memento quien, como yo, tiene el Garbage Collector demasiado activo: no recuerdo de qué se trata el maldito 1269.

Resumamos esquemática y velozmente algo que en realidad es un poco más complejo, pero no viene al caso: vendo una combinación de "fichas" de diferentes valores preestablecidos, eligiendo el usuario la combinación deseada. La pantalla pide primero el importe, luego ofrece la lista con las distintas fichas disponibles donde el usuario indicará la cantidad requerida de cada una.

Hay un tipo de ficha que es el más vendido. Por lo tanto cuando el usuario ingresa el importe y lo confirma se presenta completado por defecto el cuadro correspondiente a este tipo con el importe traducido en cantidad.

Como el usuario puede cambiar los valores, al final se comprueba que la entrada (el importe) sea igual a la salida (el valor de las fichas) y si está todo ok, se graba y listo.

Ya tenemos la primera máxima:

Ver el cuadro completo antes de bajar a los detalles: luego de una leída rápida al reporte del incidente hay que abocarse en obtener "the big picture": la mirada del cliente (humano o no), determinar el papel de esta funcionalidad dentro del sistema y, sobre todo: saber cómo debería funcionar.

Una nota: el caso en particular puede variar, pero en general un reporte de error o incidente sólo describe una situación, que no debería aceptarse como un error sin más análisis. Por ello el siguiente paso es reproducir la situación y clasificarla (por ejemplo: "error del sistema", o "error del entorno de ejecución", "nueva funcionalidad", o "error en el reporte de error" -valga la redundancia- o etiquetas similares).

Un poco de manoseo con la pantalla en cuestión no dejó lugar a dudas: si yo ingresaba un importe imposible de vender en fichas (digamos $10,31 y yo tengo fichas de $1 cada una) el sistema redondeaba la cantidad ofrecida por defecto (en mi ejemplo ofrecería vender 10 u 11 fichas). Al confirmar la transacción se leía un bonito mensaje "la transacción no suma 0" (una excepción de negocio medio genérica que se aplica a un sinfín de situaciones). Hasta ahí iba bastante bien aunque pensé que podría mejorar el mensaje. Pero cuando retrocedí y corregí el importe y volví a avanzar... ¡crash bum pang! Un error no controlado rompía la mitad de la pantalla. Ok. Hay un error, no cabe duda.

Esto da para un poco de teoría: el primer mensaje fue una excepción (controlada), el segundo un error. Escribí un poco más sobre eso hace poco: Errores y excepciones parte I, parte II y parte III. Pero citemos así seguimos adelante:

[...] Entiendo que una excepción es una situación inusual en la ejecución del sistema, pero contemplada al momento de diseñar el sistema o de escribir el código. [...] Un error, a diferencia de la excepción, es una respuesta o estado no contemplado en el sistema. [...]

Es decir, que el dinero ingresado no coincidiera con el valor de las fichas que salían era algo contemplado, se estaba chequeando (aunque me molestara el mensaje). Pero el posterior aterrizaje poco sutil de la aplicación, digamos, fue resultado de algo no contemplado por nadie (espero).

Así que me puse a leer ese feo mensaje de error. Completo, con stack trace y todo. Aunque ud. no lo crea, esto es algo que poca gente hace. Y así es como nos llenan de reportes de error del tipo "La conexión a la base de datos se ha caído." o "Disk Full". Es decir, situaciones que están claramente descritas en ese mensaje... que nadie lee.

Pero no son sólo los usuarios. Cierta ansiedad profesional nos lleva a enchufar el depurador, reproducir la situación, concentrarnos en la línea que tira el error y empezar desde ahí (tratando desesperadamente de no ir a ningún otro lado, como si todos los errores estuviesen en la última línea que se ejecutó del código). Mucha de esa información está ahí, delante nuestro.

Un dato importante obtenido al leer el mensaje que explotó la aplicación fue, justamente, "El tipo de ficha ya se encuentra incluido en la transacción". Es decir, era un mensaje codificado por nosotros, no un error descontrolado. En algún lado del código la situación fue tratada como una excepción (es decir contemplada), pero la aplicación explotó igual.

El siguiente punto de análisis es ¿qué debería haber pasado? Para corregir un error primero tenemos que saber cómo nos hubiese gustado que termine la historia. Como todo en sistemas, se empieza por la salida. ¿A dónde quiero llegar?

Pensé un poco en la situación, ordenando los problemas cronológicamente:

  • En principio, me debería haber informado de que no se podía vender por ese importe cuando lo confirmé y no dejarme seguir hasta el final de la operación. Los errores de entrada se informan lo antes posible.

  • Después, al confirmar toda la operación, el mensaje podría haber sido algo así como "No puede conformar el importe indicado con las fichas disponibles" en vez de eso tan extraño de "La transacción no suma 0".

  • Para seguir, al ir hacia atrás y volver a intentar se ve que el sistema intentó ingresar a la operación el mismo tipo de ficha dos veces, o aún más probable, que no haya borrado lo que estaba antes de reintentar.

    Eso se deduce del segundo mensaje, "El tipo de ficha ya se encuentra incluido en la transacción". No puedo decir que vendo 5 fichas de $1 por un lado y otras 5 de $1 por el otro en la misma operación, tiene que detallarse una y sólo una vez cada tipo de ficha: son 10 fichas de $1.

    Una nota importante: mal por el front-end, que primero se olvidó de borrar y después no contempló la posibilidad de una excepción. Bien por el negocio que controló la situación salvando las papas del fuego al cancelar la operación y arrojar una excepción con un mensaje decente. Es como si hubiese gritado dramáticamente "¡no puedo hacer eso, soy demasiado bueno, prefiero morir!"). ¿O hubiesen preferido quedar mejor con el cliente, que no pase nada, ni reportes, ni llamadas desesperadas, ni nada y encontrarse a fin de mes con 10.000 ventas que no cierran?.

  • Pero ese último mensaje debería haberse mostrado prolijamente como el primero, sin embargo en la pantalla apareció como un error no controlado.

    Otra nota: si luego de este bodoque siguen con ganas de leer los artículos citados, verán que esta situación indica que una excepción lanzada en la capa de negocio hizo "explotar" a la capa de presentación porque debido a un error ella no se lo esperaba. El problema no es el mensaje, sino que la capa de presentación no lo esperara y mostrara correctamente.

Me gustaría que los líderes de proyecto que lean esto lo tengan en mente cuando en su próximo ataque de ansiedad (ya sé que uds. ponen la cara) pretendan que arreglemos "esa bobada de los centavos" en 10 o 15 minutos o renieguen de que "el sistema explotó por una boludez tontería (pero nosotros tenemos que aguantarlos, y no tenemos a nadie más para descargar tensiones... lo que me recuerda "Reacciones ante los errores en un sistema informático").

Como podemos ver, que el sistema explote por una bobada es de por sí un error grave que trasciende esa bobada.

Ante este tipo de situaciones tenemos dos alternativas: resolver la bobada, y luego la otra y la otra y la otra (porque bobadas hay muchas) o resolver el problema de fondo logrando que el sistema resista las bobadas dejándonos más tranquilos y con más tiempo para trabajar en lo que nos gusta.

Para ser más explícito y utilizar el ejemplo: hay una larga cadena de errores, pero el último es el peor. Si ese mensaje se hubiese mostrado correctamente en vez de hacer explotar la pantalla,

  • el usuario se habría dado cuenta de que con reiniciar la operación bastaba para seguir trabajando,
  • lo hubiese percibido como una desprolijidad menor y no como un error de la aplicación,
  • y así la prioridad de todo el asunto baja bastante, ¿no?

Por supuesto, es más fácil arreglar el problema puntual de los centavos que solucionar todo eso.

Pero por suerte no le explotó al cliente en producción sino a nuestro equipo de pruebas (bien por ellos) con lo cual en vez de nervioso me sentía contento y aliviado. La misma sensación que debe tener un acróbata cuando tras fallar una pirueta aterriza suavemente en su red de seguridad.

No lo aclaré antes porque le resta dramatismo a todo.

Para finalizar:

  • ¿Programador principiante? Mira la línea en la que saltó el error y no entiende nada. Va hacia atrás y donde puede poner un "if" para evitar la situación lo enchufa, probablemente rompiendo otra cosa.
  • ¿Programador desganado? Arregla lo de los centavos (el primer problema) y todo lo demás desaparece... por un rato.
  • ¿Programador apurado? Arregla el último problema (el del mensaje) y manda el arreglo. Deja los demás registrados detalladamente con una solución propuesta para después.
  • ¿Yo en el último día de trabajo del año? En apenas 9 horitas lo tengo todo resuelto, cuando alguien me pida explicaciones le paso un link a este post, aunque seguramente no llegue al final.

¿Y cómo se corrige eso? Del último al primero:

  • que el mensaje de excepción no explote la pantalla (y lo pruebo),
  • que borre la basura de la operación incompleta evitando que tire ese mensaje (y lo pruebo),
  • cambiando el mensaje al final de la transacción para que diga claramente que no puede vender ese importe en fichas porque no hay forma (y lo pruebo),
  • y por último agregando un control para que controle esto apenas ingresado el importe (y lo pruebo).

Y así, mi catedral no sólo es más bonita, también es más resistente.

Un tip: vean que de esta manera voy probando todos los arreglos a medida que los voy implementando con el mismo caso de prueba. Si empiezan por el final, luego probar todo es un problema.

Espero que hayan llegado hasta aquí leyendo todo, despiertos y con ganas de vivir...

Ah, por cierto, cuando volvía para casa a las 18.00 me dí cuenta de un pequeño detalle que introduje en el último arreglo: si quiero vender $10.50 y tengo fichas de $1 y de $0.50 (operación 100% válida) pero tengo como predeterminada la ficha de $1 el sistema va a tratar de proponer $10.50 en fichas de $1, no va a poder y por obra y gracia de mis controles prematuros va a trabar toda la operación sin darle posibilidad al usuario de modificar las cantidades.

En resumen: corregí un buen par de problemas graves, pero por un pequeño error lo dejé, a ojos del mundo, peor que como estaba. ¡Ah! Y para eso tardé todo el día.

¿Me acordaré de corregirlo cuando vuelva? Seguro que sí, porque ese día es hoy y alguien me va a avisar. Magias de la programación de posts.