lunes, 29 de abril de 2013

Comentar el Código... o la Magia de Ponerse en el Lugar del Otro

En el ámbito del desarrollo de Software, se denomina Código Fuente a una secuencia de instrucciones de computador escritas en un lenguaje comprensible por un ser humano, típicamente, como texto. Haciendo la analogía con el mundo real, el Código Fuente es similar a la descripción de un procedimiento. Por ejemplo, consideremos el siguiente procedimiento de control de acceso:

1. Acérquese a la puerta.
2. Digite su número de identificación.
3. Coloque su mano en el lector biométrico.
4. Espere la validación exitosa.
5. En caso de ser exitosa, abra la puerta.
6. En caso contrario, reingrese su código y comience nuevamente desde el paso número 2.

En el caso del Código Fuente, éste describe (similar a un procedimiento) lo que debe hacer el computador para lograr un objetivo. Está diseñado para facilitar el trabajo de los programadores o desarrolladores de software, que son los profesionales responsables de "traducir" las necesidades de los usuarios en Código Fuente. Una vez que el Código Fuente está listo, es traducido en lenguaje de bajo nivel (lenguaje comprensible por el computador) utilizando un Software denominado Compilador. El compilador actúa como un traductor Inglés-Español, por ejemplo, traduciendo desde el lenguaje procedural (Código Fuente) comprensible por un humano (desarrollador), al lenguaje de máquina comprensible por el computador. El resultado del compilador es lo que se denomina un Ejecutable o Aplicación, y es lo que, finalmente, usan las personas.

En términos generales, el Código Fuente siempre va a estar en fase de Desarrollo y/o Mantención. La fase de Desarrollo corresponde a la fase de construcción inicial de una aplicación, es decir, desde cero. La fase de Mantención corresponde a la fase posterior al término de la aplicación y que, básicamente, se dedica a la tarea de corregir pequeños errores e incorporar funcionalidades nuevas a la misma. En este sentido, es importante tener presente que, a menos que se esté desarrollando una tarea y/o una aplicación muy pequeña, siempre el Código Fuente estará siendo manipulado por varios desarrolladores al mismo tiempo. En el mejor de los casos, desarrolladores en una misma ubicación geográfica. En el peor de los casos, desarrolladores distribuidos globalmente.

En cualquiera de las fases, desarrollar Código Fuente requiere tener capacidad lógica, conocer el lenguaje de programación, ser ordenado, metódico y creativo, aunque suene contradictorio. Y, adicionalmente, exige ser capaz de incorporar Comentarios al Código Fuente que permitan aclarar, declarar, ejemplificar y/o documentar alguna condición particular o específica que no sea evidente para un tercero. Incluso, debiera realizarse en aquellos casos en que no participe nadie más en el desarrollo.

Los Comentarios cobran mayor relevancia cuando se está en un proceso de Mantención. En general, la Mantención implica ser capaz de arreglar y/o mejorar algo sin generar nuevos problemas. Haciendo una analogía con el mundo físico, es como intentar cambiar una rueda con el auto andando. La Mantención es una tarea compleja, en especial, para aquellas aplicaciones que han sido desarrollados hace ya mucho tiempo y/o que han sido mantenidos por variadas personas y, peor aún, para aquellos que no tienen ningún tipo de documentación disponible.

Cuando se realiza mantención de un Código Fuente, un desarrollador debería ser capaz de entender la lógica de la aplicación fácilmente. Cualquier detalle, dependencia y/o vinculación que no sea detectada a tiempo, implicaría de inmediato la posibilidad de incorporar nuevos problemas al intentar hacer una corrección.

La primera manera de evitar esto es, como mencioné antes, incorporando Comentarios al Código Fuente. La segunda manera, y más importante aún, es incorporar Comentarios que realmente hagan sentido. Esto, claramente, es lo más difícil de lograr.

Veamos algunos ejemplos.

1. Tiempo Verbal
Es fundamental comprender que al momento de comentar el código fuente, lo que se requiere es describir lo que hace el código (procedimiento), no lo que "yo he decidido hacer", desde el punto de vista del desarrollador. En este contexto, los comentarios, siguientes son incorrectos.

// Recorro el arreglo
for( int i = 0; i < 10; i++ )
...

// Valido el largo del texto
if( sText != null && sText.length() == 0 )
...

La solución consiste en escribir los comentarios anteriores como sigue (aún cuando siguen siendo incorrectos como se describe en el siguiente punto):

// Recorrer el arreglo
// Validar el largo del texto

2. Comentarios con Sentido
Los comentarios deben incorporar información relevante. El comentario siguiente, no entrega ningún antecedente que un desarrollador con algo de experiencia no pueda identificar de inmediato.

// Recorro el arreglo
for( int i = 0; i < 10; i++ )
...

Ahora bien, si recorrer el arreglo anterior es importante, el comentario se debe reescribir adecuadamente:

// Recorrer el arreglo para determinar la fecha
// de ingreso menor de los documentos elegidos
for( int i = 0; i < 10; i++ )
...

3. Inicialización de Variables
Probablemente, el comentario más inútil y más utilizado por los desarrolladores novatos. Cualquiera de las variantes siguientes son innecesarias.

Form oForm = new Form(); // Inicializo la variable

// Inicializar las variables
String name = "";
String region = "";

// Abro la Conexión con la Base de Datos
Connection oConn = db.GetConnection();

4. Comentar Omisiones Controladas
Durante el desarrollo del Código Fuente, hay condiciones que serán ignoradas. Las razones pueden ser variadas, pero, en aquellos casos en que no son obvias, debe dejarse por explícito la omisión. A continuación, algunos ejemplos.

switch( status) {
  case 1:
    mes = "Encendido";
    break;
  case 0:
    //Fall-Through - Cualquier otro valor
  default:
    mes = "Apagado";
}

En el caso anterior, se deja explícito que, cualquier valor distinto de 1, se considera "Apagado".

try {
  :
  :
}
catch( Exception ex ) {
  // Dummy, no se hace nada
}

En el caso anterior, se deja explícito que no se va a procesar ninguna Excepción ocurrida durante el procesamiento. Si no se incluye el comentario, un desarrollador podría considerar relevante el procesamiento de alguna excepción y romper el flujo normal del programa.

5. Yo Pensé que Tú Pensaste
El uso e inclusión de estructuras de datos, bibliotecas de terceros, etc., es casi una obligación hoy en día. Gracias a fundaciones como Apache y al movimiento OpenSource, no es necesario partir desde cero al momento de realizar un desarrollo, sin embargo, si es necesario documentar las razones por las cuales se realizaron las elecciones correspondientes.

Veamos un ejemplo para el uso de una estructura de datos determinada.

// Inicializo el Hashtable
Hashtable oHT<..., ...> = new Hashtable<..., ...>();

Un programador inexperto, podría considerar que es mejor usar un Hashmap que un Hashtable porque "básicamente proveen las mismas operaciones". El comentario, debe ser explícito para aclarar esto.

// Se usa un Hashtable para evitar problemas de
// concurrencia en el acceso a los datos
Hashtable oHT<..., ...> = new Hashtable<..., ...>();

En el caso de las bibliotecas de terceros, la situación es la misma.

// Recuperar la interfaz del Logger
static Logger log = Logger.getLogger(...);

En este caso, se requiere declarar que se está utilizando una versión de Log4j determinada.

// Se utiliza Log4j 2, para evitar problemas de rendimiento
static Logger log = LogManager.getLogger(...);

En el ejemplo anterior, probablemente el ambiente de desarrollo (IDE) declararía que el método no está presente con otras versiones, sin embargo, es necesario incorporar este tipo de comentarios cuando hay una razón explícita para utilizar una biblioteca determinada.

En términos generales, lo más importante al momento de incorporar Comentarios al Código Fuente, es tener presente que deben ser útiles para otra persona. No son comentarios para (desde el punto de vista del desarrollador) y, al momento de escribirlos, es fundamental ser capaz de ponerse en el lugar del otro, el que, probablemente, mantendrá el Código Fuente.

Como indican Kernighan & Plauger en el libro The Elements of Programming Style:

"No documentes código malo - reescríbelo"

Y, como dice Steve McConnell, en su libro Code Complete:

"Buenos comentarios no repiten el código ni lo explican. Clarifican su intención. Los comentarios debieran explicar, en un nivel de abstracción más alto que el código, lo que se está haciendo".

Incorporar comentarios en el Código Fuente es un proceso importante y, en muchos casos, el proceso de reflexión requerido para determinar qué y cómo incluir un comentario puede ser una ayuda, incluso, para determinar si el código está bueno o malo.

domingo, 28 de abril de 2013

El Esfuerzo


"Cristiano Ronaldo es el mejor, no sólo porque mete goles, sino porque se esfuerza permanentemente, es el primero en llegar y el último en irse" -- Emilio Butragueño en entrevista como director de relaciones institucionales del Real Madrid.

lunes, 22 de abril de 2013

Chile Amable

En el siguiente aviso, la rabia y la frustración, se transmite de una persona a otra sucesivamente.


Por el contrario, en el siguiente aviso, es la amabilidad la que se transmite de una persona a otra generando, obviamente, incertidumbre y sorpresa.



En un país "agitado, frenético y competitivo" como el nuestro,

¿Cuál ejemplo crees que vale la pena seguir?

lunes, 8 de abril de 2013

La Inteligencia

Qué sucede al escuchar la siguiente afirmación:

- Esta persona es muy inteligente... sabe sumar 2 + 5...

La primera impresión es que es una afirmación errónea, en términos de que cualquier persona debiera saber el resultado de la operación indicada. Veamos el mismo ejemplo pero con más información:

- Este niño es muy inteligente... sabe sumar 2 + 5...

¿Distinto cierto? En este caso, probablemente, se considere que la afirmación es verdadera y que, efectivamente, el niño es inteligente. Dependiendo de la edad del niño, probablemente, se tienda a minimizar o maximizar el atributo de la inteligencia de manera acorde: si el niño tiene quince años será muy distinto a si tiene tres.

Si omitimos el "juicio" existente por parte de la persona que emite la afirmación (mamá del niño, hermano, conocido, jefe, etc.) ¿Qué determina que una persona sea inteligente?

La palabra Inteligencia proviene de intellegere en Latín, término compuesto de inter (entre) y legere(leer, escoger), es decir, quien sabe escoger. El diccionario de la Real Academia Española define inteligencia como la "capacidad para entender o comprender" y como la "capacidad para resolver problemas". Otra definición es como "una capacidad mental muy general que permite razonar, planificar, resolver problemas, pensar de modo abstracto, comprender ideas complejas, aprender con rapidez y aprender de la experiencia".

Desde un punto de vista operativo, la inteligencia siempre se ha asociado con la medición de un número conocido como Coeficiente Intelectual (CI o IQ en inglés). El CI se mide por medio de un examen de alternativas (un ejemplo se puede ver aquí). Según este test, una persona normal debiera tener un CI cercano a los 100 puntos. Einstein tenía un CI de 150. Ahora bien, considerando una persona con un CI alto, ¿Es suficiente?

En el libro Outliers de Malcolm Gladwell, se describe un estudio realizado por Lewis Terman a partir de 1921 en los Estados Unidos. El objetivo principal del estudio era determinar cuánto influía el CI en la vida de una persona y en los logros que pudiera realizar a lo largo de su vida. La hipótesis era simple, un niño con el CI alto, debiera ser una persona exitosa, influyente, importante, etc., a lo largo de su vida y, en este sentido, el CI podría/debería actuar como un predictor del éxito. El estudio contempló la identificación de un grupo de niños años con un CI superior al promedio y el correspondiente seguimiento a lo largo de su vida.

De 250.000 niños examinados, se seleccionó a 1.470 con el CI sobre 140, denominados, de ahí en adelante, Termitas en el contexto del estudio en referencia a Lewis Terman. Durante años se acompañó a los Termitas para ver sus logros y avances y, casi al final del estudio, el resultado fue devastador. Si bien los Termitas publicaron libros, fueron exitosos en sus negocios y alcanzaron algunos puestos de cierta relevancia, pocos de estos genios eran conocidos a nivel nacional. La hipótesis no se cumplía. Posteriormente, incluso, el sociólogo Pitrim Sorokin, demostró que si Terman hubiera elegido al azar un grupo de niños con entornos familiares similares a las Termitas, habría reunido a un grupo autor de logros casi equivalente. Por otro lado, también se descubrió que dos estudiantes que habían sido descartados en la selección inicial de Terman porque su CI no era lo suficientemente alto, posteriormente habían ganado el premio Nobel (William Shockley and Luis Alvarez).

Dejemos de lado, por un momento, el problema en la definición de éxito. Los resultados del estudio arrojaron que la hipótesis no se cumplió y que, gran parte de esos niños, no había logrado resultados mejores que el promedio. En otro capítulo del libro se cuenta la historia de un niño superdotado, aficionado a la ciencia, el que, al no tener una beca, no había logrado seguir sus estudios y, por lo tanto, se había quedado a medio camino. ¿La razón? Básicamente, que no había tenido las oportunidades correctas para acceder a las becas pero, más importante aún, que no había tenido las habilidades sociales requeridas para conseguirla. En términos simples, su inteligencia le había jugado en contra en cosas de ámbitos más superficiales.

Veamos un ejemplo relacionado. Considere el siguiente ejercicio:
Escriba todos los usos diferentes que se le ocurran para los siguientes objetos: un ladrillo y una manta.
El anterior es un ejemplo de lo que se denomina "prueba de divergencia". El objetivo principal, a diferencia de las pruebas de CI, es hacer que la imaginación se diriga (diverja) en todas las direcciones posibles. Una prueba de este tipo no mide inteligencia. Lo que mide, en cierta medida, es la creatividad. No hay una respuesta correcta, obviamente, lo que importa es la cantidad y singularidad de las respuestas. Veamos las respuestas de dos estudiantes diferentes:

Respuesta A
(usos de un ladrillo) Hacer la compra cuando la tienda está cerrada. Ayudar a sostener en pie las casas. Para jugar a la ruleta rusa y mantenerse en forma al mismo tiempo (diez pasos ladrillo en mano, media vuelta y lanzamiento; prohibida toda acción evasiva). Para poner encima de la manta y que ésta no se caiga de la cama. Para romper botellas de Coca-Cola vacías. O llenas.
 
(usos de una manta) Para tapar una cama. Para practicar sexo ilícito en el campo. Como tienda de campaña. Para hacer señales de humo. Como vela para un barco, carro o trineo. Como sustituto de una toalla. Como blanco de tiro para miopes. Como salvavidas para gente que salta de rascacielos en llamas.

Respuesta B
(usos del ladrillo) Construcción. Lanzamiento.
 
(usos de una manta) Proteger del frío. Sofocar un fuego. Como una hamaca o parihuela improvisada.

Mirando las respuestas anteriores... ¿Cuál corresponde a una persona con el CI superior? ¿La A? ¿La B?

La respuesta que corresponde es la B. Esto es lo que respondió uno de los estudiantes con el CI más alto de una escuela. Se puede apreciar que la respuesta es extremadamente concreta a diferencia de la anterior. Ahora, olvidando el CI, ¿Cuál respuesta permite identificar a una persona más creativa? Obviamente la A.

Si volvemos a la definición de inteligencia anterior, ¿Es la creatividad un atributo requerido para una persona inteligente? ¿O simplemente basta que sepa aplicar lo que ha aprendido sin errores?

La inteligencia, como atributo medible única y exclusivamente por el CI, no me parece adecuado. Al final, el CI por sí solo, no sirve si es que la persona no tiene otros elementos necesarios para, por ejemplo, comunicarse, convivir en sociedad, respetar a los otros, etc. No sirve que una persona sea un experto en matemáticas si no puede, por ejemplo, hacer algo tan básico como comunicar y compartir sus resultados con el resto del mundo.

Hay diversos atributos que se podrían considerar relevantes para complementar el concepto de inteligencia. Además de la Creatividad, uno de los atributos que siempre me ha parecido característico de personas denominadas "inteligentes", es la Flexibilidad. No desde un punto de vista corporal si no, más bien, que tengan la habilidad de adaptarse a situaciones o escenarios cambiantes. Que no sean rígidos en su manera de ver el mundo.

Conectado con esta reflexión, el otro día me enviaron el siguiente video que muestra una mirada, muy particular, de la Inteligencia y otro atributo relacionado.


¿Qué otro atributo crees que es importante para considerar a una persona inteligente?

Nota: En YouTube, los comentarios del video son realmente sorprendentes. Vale la pena mirarlos y, nuevamente, reflexionar acerca de la denominada "inteligencia" de las personas.

lunes, 1 de abril de 2013

¿El Producto o el Servicio?

La Sustentabilidad es un tema que desde hace mucho tiempo permea las declaraciones respecto a la manera de producir y exportar productos. Frases como las siguientes son repetidas una y otra vez:
  • Debemos hacer un desarrollo sustentable de los recursos naturales.
  • Es necesario dejar de exportar productos básicos y comenzar a exportar valor agregado.
En todas estas afirmaciones, el mensaje subyacente es que es necesario tomar las precauciones para que el proceso productivo sea permanente en el tiempo y, además, las consecuencias no sean peores que las ganancias. En términos simples, si se va a talar un bosque para hacer madera, un proceso sustentable se preocuparía de plantar otro bosque similar para asegurar la disponibilidad del recurso en el futuro. Además de, obviamente, preocuparse de los temas medioambientales.

La segunda afirmación, además, incorpora el concepto de valor agregado. En términos económicos, el Valor Agregado se define como "una característica o servicio extra que se le da a un producto o servicio, con el fin de darle un mayor valor comercial, generalmente se trata de una característica o servicio poco común, o poco usado por los competidores, y que le da al negocio o empresa, cierta diferenciación". En general el Valor Agregado se ve reflejado en el precio. A mayor valor agregado, mayor precio. Por ejemplo, la diferencia entre exportar Silicio o exportar procesadores de computador. El gran desafío, entonces, es poder generar productos y servicios con el mayor valor agregado posible.

Este verano decidimos ir al sur de vacaciones, precisamente a Chiloé, Puerto Varas y sus alrededores. Hace 10 años que no íbamos al sur ya que, aunque suene un poco "snob" y por razones que no vale la pena detallar, decidimos tomar nuestras vacaciones en el extranjero.

Las realidades de Chiloé y Puerto Varas fueron muy distintas. En Chiloé nos quedamos en unas cabañas en la isla Lemuy, un poco más al sur de Castro, en un lugar que se llama Parque Yayanes. Un lugar muy tranquilo y que vale la pena conocer. La Isla, para mi sorpresa, está llena de caminos que unen distintos pueblitos lo que permite recorrerla fácilmente. Es un lugar que permite bajar las revoluciones al mínimo y disfrutar los estímulos de la naturaleza, además de disfrutar de la rica cocina del restaurant del lugar atendido por su dueña. Por ejemplo, un increíble Pastel de Papas con Centolla... una delicia.

En Puerto Varas, por el contrario, nos quedamos en el Hotel del Casino Dreams. Es un hotel cinco estrellas y que, según yo, se las merece. Está ubicado frente al lago y ofrece una vista privilegiada del volcán y la bahía. Está a pasos de la plaza de armas y del centro. Las habitaciones son lujosas y llenas de detalles. Es el ritmo de la ciudad en un paisaje espectacular.





El viaje nos permitió, obviamente, descansar y desconectarnos. Nos permitió apreciar los maravillosos paisajes del sur: los volcanes, los lagos, los bosques, etc. También pudimos comer cosas distintas y disfrutar los sabores típicos de esos lados: Kuchen y Mariscos principalmente. En general, el entorno, la infraestructura y la comida, estuvieron espectaculares. Pero hay algo que, definitivamente, no estuvo a la altura y que, claramente, no ha progresado en los últimos diez años: el Servicio.

Volviendo a la discusión de la sustentabilidad y aplicándola al contexto del turismo, me parece que realmente se debe hacer un esfuerzo por pasar de una oferta centrada en la Oferta (Producto) a una oferta que ofrezca una Experiencia (Servicio + Producto) de primer nivel. Esto, en el contexto de la experiencia del Cliente (turista), realmente lo haría sustentable, es decir, permanente en el tiempo. Todos sabemos que un cliente satisfecho no sólo va a recomendar el lugar si no que, además, probablemente va a volver.

Veamos el siguiente video realizado por Sernatur para promocionar Chile como destino turístico.


El video es realmente excelente. Tiene un mensaje claro y preciso y, además, una dosis de humor. Pero si revisamos el video con un poco más de calma, se puede apreciar que la "oferta" está basada en productos: un entorno precioso, Curanto en Chiloé, Termas en Puerto Natales, Cordero Magallánico y Trekking por los Glaciares. Paisajes y productos espectaculares, sin embargo, no se hace mención al Servicio. Sería ideal que en algún momento el mensaje incluyera una frase del tipo "Y el servicio fue simplemente espectacular". Pero, lamentablemente, no es así.

Mi impresión es que si realmente queremos convertir a Chile en un destino turístico de primer nivel, es necesario que el Servicio suba de nivel también, porque, honestamente, si no fuera por la geografía y los paisajes que son sencillamente espectaculares, el turismo no tendría ninguna posibilidad.

Es un hecho que al salir de vacaciones, uno de los objetivos es conocer lugares y hacer cosas que típicamente no se pueden hacer durante el año: trekking, escalar, nadar, bucear, etc., y mil cosas más, sin embargo, si estas actividades no están acompañadas de un Servicio acorde, es decir, un nivel de atención que realmente permita mantenerse relajado, toda la experiencia no vale la pena.

¿De qué sirve, por ejemplo, hacer alguna actividad y pasarlo bien si al momento de ir a comer la experiencia será desastrosa? 

Experiencia = Producto + Servicio

En términos simples, la Experiencia (desde el punto de vista de un consumidor) se define como la combinación de un producto y un servicio que satisfaga sus necesidades. Hoy, gracias a la globalización y a la democratización de la información, los consumidores están más informados y, por lo tanto, son, y debieran ser, más exigentes.

Hay cinco atributos que diferencian a un Producto de un Servicio:
  • Intangible. Un servicio antes de ser comprado, no se puede ver, oler, degustar, palpar ni sentir. La principal consecuencia de este atributo es que el cliente requerirá referencias concretas del servicio para tomar una decisión: encuestas de satisfacción, comentarios de otros clientes, etc.
  • Inseparable. Un servicio se produce y consume al mismo tiempo. Los productos son fabricados, almacenados, distribuidos por múltiples vendedores, distribuidores, etc.
  • Variable. A diferencia de un producto, los servicios dependen de quién, cuándo y dónde se provean. La principal consecuencia de este producto es la dificultad para ofrecer una calidad permanente en el tiempo.
  • Perecible. Los servicios no se pueden almacenar ni inventariar. Si no se utilizan cuando se ofrecen se pierden. La principal consecuencia de este atributo, al igual que en el caso de los productos, es que es necesario equilibrar la oferta con la demanda.
  • Interacción. Dado que el proveedor y cliente están juntos cuando se produce el servicio, es fundamental cuidar esta relación. En el caso de un producto, el fabricante no necesariamente debe preocuparse de cómo se realiza la venta de su producto por parte de los distribuidores.  
Este último atributo, probablemente, sea el más importante y el que explica la diferencia fundamental entre "vender un producto" o "entregar un servicio". La necesidad de "evaluar" constantemente la calidad de servicio y realizar una mejora continua.

Hoy todas las empresas están intentando ofrecer Experiencias como una manera de diferenciarse. La competencia es muy intensa y, por lo tanto, el producto por si solo no es suficiente. Un ejemplo concreto: Starbucks. Los que han tenido la posibilidad de ir saben que lo que vale en este lugar no es el café, sino la experiencia: el lugar, la atención, la posibilidad de "fabricar" el café, etc. Otro ejemplo, es la variación de los hoteles, que pasaron de ofrecer símples habitaciones a paquetes All-Inclusive o los Cruceros que, también, ofrecen una experiencia completa (sería una muy mala experiencia ir a un Crucero y tener que llevar la comida por ejemplo).

Me gustan los paisajes del Sur, pero, más me gustaría si el Servicio fuera acorde. Ojalá los esfuerzos se enfoquen en producir un cambio para que dejemos de ser un país orientado al Producto y pasemos a ser un país orientado al Servicio. En el caso del Cobre, por ejemplo, sabemos que es una tarea urgente y pendiente.

Para esto, aunque parezca extraño, se requiere que las empresas consideren el Servicio como una variable importante de su oferta pero, tanto o más importante aún, es que las personas comunes y corrientes (clientes, consumidores) estén informadas y sean capaces de exigir un Servicio como corresponde... como decía la famosa frase, "Sin odio. Sin violencia. Sin miedo...".