Dan Pink en la sorprendente ciencia de la motivacion

28 de septiembre de 2009

En esta conversación para TED, el analista laboral Dan Pink nos habla de la ciencia de la motivación y el nuevo modelo para incentivar a los trabajadores en las empresas, empezando con un hecho que los sociólogos conocen pero no así la mayoría de los gerentes: Los métodos tradicionales de recompensas no siempre son tan efectivos como pensamos, poniendo en la balanza el modelo Recompensa y Castigo versus el nuevo modelo propuesto para el siglo XXI: Autonomía, Maestría y Propósito.


Expone que, en resumen:


1.       Existe una discordancia entre lo que la ciencia dice y las empresas hacen (en lo que a motivación se refiere).
2.       Las recompensas del siglo XX, esos motivadores que creemos son parte natural de los negocios funcionan pero sólo en una sorprendente y estrecha franja de circunstancias.
3.       Las recompensas condicionadas a menudo destruyen la creatividad.
4.       El secreto del alto desempeño no está en imponer recompensas y castigos, sino en una fuerza intrínseca invisible, la fuerza de hacer las cosas por propio interés, la fuerza de hacer las cosas porque importan, porque te hacen sentirte importante, y que formas parte de algo mayor que ti.



Este tema tendrá un impacto profundo en el mejoramiento del ambiente laboral y desempeño, puntos que están a la orden del día en todas las medianas y grandes empresas.

Un poco de Teoría de la Computación (parte 1)

25 de septiembre de 2009

Hola a todos! la motivación del presente artículo nace de la necesidad de comprender algunos temas relacionados con las teoría de la computación, antes de asimilar los nuevos lenguajes multiparadigma, como es el caso de F#, Scala y otros, que se perfilan como herramientas para el futuro del desarrollo de software comercial y empresarial.

Atención! para comprender estos temas sólo requerimos haber programado alguna vez en algún lenguaje de programación, y entender la estructura y funcionamiento general de un programa.

Sus comentarios y aportes serán bienvenidos! Pues bien, en esta ocasión empezaremos con dos conceptos simples: objetos de primera y segunda clase, y variables libres y vinculadas.




Objetos de primera y segunda clase



En las ciencias de la computación, en el contexto de cualquier lenguaje de programación, un objeto de primera clase es una entidad que puede:

  • Ser parámetro de alguna subrutina.
  • Ser el resultado de alguna subrutina.
  • Ser asignado a una variable.


Por ejemplo, en el contexto de Visual Basic, diríamos que los objetos de primera clase son los datos básicos tales como los Enteros, Decimales, Cadenas, y los Objetos (estructuras de datos y subrutinas).

Los objetos de primera clase requieren también que se puedan:

  • Construir en tiempo de ejecución. Ejemplo:

// codigo en javascript
var s = "Hola";
var saludo = new String(s + " " + s + "!");

Aquí es claro que estamos construyendo una secuencia de caracteres con el valor “Hola Hola!”, la estamos grabando en la memoria, y la estamos etiquetando con el nombre de “saludo” (variable de tipo cadena). Otro ejemplo de construcción:

' codigo en Visual Basic
Set Jefe = CreateObject("MiClase.Empleado")
Set Asistente = CreateObject("MiClase.Empleado")

  • Expresarse como valores anónimos (o literales).

Un valor anónimo es aquel que no está etiquetado (asignado) con algún nombre o descripción en particular. Por ejemplo:

// codigo en C#
MessageBox.Show( "No me gusta programar" );
# codigo en Ruby, imprime 12
puts "Cadena Larga".length



En ambos casos hemos construido el valor directamente, sin ninguna variable de por medio, por eso se les conoce como “anónimos”.
De otro lado, en C y C++ por ejemplo, no es posible crear nuevas funciones en tiempo de ejecución. Como resultado, las funciones no son Objetos de Primera Clase, sino que son indirectamente manipulados a través de los muy "temidos" punteros a funciones (o como los delegados en C#). También se les conoce como objetos de segunda clase.




Variables Libres y Vinculadas



Veamos, en las ciencias de la computación, una variable libre es aquella que, en el contexto de una rutina o función, no es local, ni tampoco se obtiene como argumento de la misma. Mmm a ver expliquemos algo más. ¿Qué tipo de variable podría ser esta? Veamos un ejemplo:


     Public Function PromedioSimple( ByVal X as Integer, ByVal Y as Integer )
         Dim Z as Integer
         Z = 2
         PromedioSimple = (X + Y ) / Z
     End Function


Aquí vemos claramente que ni X, ni Y (argumentos de la función), ni Z (variable local) son variables libres. Podríamos hacer que Z sea libre si lo cambiamos así:


     Global Z As Integer
     Z = 2



     Public Function PromedioSimple( ByVal X as Integer, ByVal Y as Integer )
         PromedioSimple = (X + Y ) / Z
     End Function


Ciertamente Z es libre en este contexto, toma independientemente cualquier valor previo a la ejecución de la función. Al resto de las variables (X & Y) se les conoce como variables vinculadas.

Tomemos otro ejemplo del lenguaje cotidiano, analicemos la oración:

     Jorge encontró su libro

Esta oración puede significar dos cosas:

a)   Jorge encontró su propio libro que andaba buscando de hace rato, ó
b)   Jorge encontró el libro de alguien más.

Debido a esto, se dice que el pronombre su es una variable libre, ya puede tomar cualquiera de los dos significados sin problemas.


Siguientes pasos


En un siguiente post hablaremos acerca de la transparencia referencial y los efectos paralelos en un lenguaje de programación, asi como las funciones puras e impuras, conceptos que serán fundamentales en el contexto de la programación funcional.

Gracias por su atención!

Cómo empezar con F#?

18 de septiembre de 2009

Hola a todos! En esta ocasión vamos a dejarlos con un mini-tutorial para que puedan escribir sus primeros scripts con la versión beta de F#, el nuevo lenguaje multiparadigma (imperativo, objetos y funcional) que saldrá en la versión de Visual Studio .NET 2010 y el .NET Framework 4.0, pero con el cual ya podemos ir practicando un poco. Demostraremos como ejecutar nuestra primera aplicación, paso a paso, desde cero.

¿Qué necesitamos?


Para los usuarios que ya tienen instalado Visual Studio versión 2008, pueden descargar la actualización en:

Para los que no lo tienen instalado, pueden descargar Visual Studio Beta 2010 (que incluye F#) en:

La instalación es del tipo next next next así que no creo que tengan muchos problemas aquí.

Pasos a seguir


1. Una vez instalado, abrir el visual studio, clic en File > New > Project, para que aparezca la siguiente ventana:


Imagen1

Le damos un nombre a la solución, en mi caso es Tutorial0. La localización que elegí es C:\Aplicaciones, pero puede ser cualquiera. Al darle clic en OK nos quedara así:


Imagen2


2. Perfecto! ahora lo siguiente es activar el FSI (F Sharp Interactive) que es una ventana de depuración adicional que cumplirá dos funciones fundamentales:
     a. Mostrar el resultado de las comandos de F# que vayamos escribiendo (parecido al Inmediate Window), y
     b. Mostrar los tipos de datos que se usan en dicho comando.

Este ultimo punto cumple un rol didáctico importante ya que, como les comenté en el articulo anterior, F# maneja nuevos tipos de datos que son muy, muy "diferentes" (al menos a todo lo que había visto hasta ahora, personalmente).

Sigamos, clic en View > Other Windows > F# Interactive, o simplemente Ctrl+Alt+F

La ventana nos queda asi:


Imagen3


3. Pues bien, ahora sí estamos listos para ingresar nuestras primeras lineas de código!!! empezaremos dandole el honor al que ya es todo un clásico, el popular HOLA MUNDO que no podía faltar en nuestro tutorial.

Para poder visualizar el resultado de cada linea de manera independiente, sombrear la linea y luego hacer clic derecho > Send to Interactive para ver el resultado en la ventana FSI, tal como muestra la imagen:

System.Console.WriteLine "Hola Mundo!"
printfn "Hola Mundo!"


Imagen4


Cosas para notar:

La primera linea es la forma estándar de C# de enviar una cadena de caracteres al "stream" por defecto, que en este caso es la ventana del FSI (o la pantalla de la PC, cuando ejecutamos la aplicación).
La segunda es la forma estándar para el lenguaje F#

Y bueno qué rayos significa val it : unit = ( ) ??? pues es la descripción del modelo o patrón que está utilizandose en esta sentencia de F# en particular... mmm osea es como una descripción de los tipos de datos que intervienen, y la relación que tienen. Sí, lo mismo pienso... pero espero darles mejores explicaciones pronto...


4. Para evitarnos problemas con futuros ejemplos mi consejo es que agreguen las referencias a las siguientes librerias (clic en Project > Add Reference)

System.Windows.Forms
System.Net

Asimismo, importar las librerías base al inicio de nuestras aplicaciones en F#:


open System
open System.IO
open System.Net

Imagen5



con lo que nuestro HOLA MUNDO se vería así:


open System
open System.IO
open System.Net





Console.WriteLine "Hola Mundo!"
printfn "Hola Mundo!"




Para terminar


¿Qué creen que pasará cuando ejecuten las siguientes líneas?


let f = new System.Windows.Forms.Form(Visible=true, Text = "Hola Mundo!")
f.Text <- "No Me Gusta Programar"
f.Click.Add( fun _ -> printfn "Click!" )




Oh! este código me trae algo de nostalgia, puesto la sentencia LET es la primera que aprendí a utilizar cuando me enseñaron lenguaje BASIC, hace muuuchos años :_( ... en ese entonces también servía para asignar valores a variables, algo así como en LET X = 10

Weno ya dejándonos de cosas... pues prueben ustedes mismos a ver qué pasa (pueden adjuntar sus resultados).

Pues bien gracias por seguirnos hasta aquí, y plsss por favor espero sus comentarios!

Saludos a todos.

Programación Funcional

17 de septiembre de 2009

Todos sabemos que es la Programacion Orientada a Objetos y todos los beneficios que nos brinda, por años hemos utilizado este paradigma en diversidad de plataformas y lenguajes. Sin embargo, debemos de saber que los lenguajes de programación tienen su origen en las ciencias de la computación y las matemáticas. La programación funcional es un paradigma diferente, representado en lenguajes como ML, OCalm, Haskell y otros, que es muy poco utilizado de manera comercial, aunque de mucho valor para la comunidad científica, siendo muy potente y concreto para realizar determinadas tareas de cómputo.

Microsoft promete un nuevo lenguaje multiparadigma que juntará lo mejor de ambos mundos, la programación imperativa, la programación orientada a objetos y la funcional en uno solo: Functional# o F#. la idea es unirlos en un único lenguaje que promete ser elegante, potente y altamente productivo. Este nuevo lenguaje estará disponible para Visual Studio 2010 y .NET Framework 4 (aunque ya está disponible la beta en el site oficial).

La programación funcional es la herramienta utilizada por programadores científicos que desean modelar dinámica de fluidos, reacciones químicas y modelos mecánicos. La programación imperativa y orientada a objetos es usado ampliamente por los desarrolladores de software comercial que son quienes escriben sistemas operativos, aplicaciones empresariales y paquetes como procesadores de texto, hojas de cálculo, juegos, reproductores multimedia, y más.

Pero, ¿Qué es la Programacion Funcional?
Podemos dar un acercamiento un poco tosco y decir que en la programación funcional:
  • Las funciones se tratan como si fueran otro tipo de dato más (parecidos a los delegados de C# o los punteros a funciones en C, pero con mucha más utilidad y poder combinatorio).
  • Los datos son inmutables (osea, no podemos alterar el valor de una variable, una ves que éste ha sido asignado).
  • Las funciones pueden aplicarse a todo un conjunto de datos, sin necesidad de iteraciones o bucles.
  • Con las funciones podemos realizar aquellas operaciones matemáticas que nos enseñaban en el cole (recuerdan: composición de funciones, funcion inversa, funciones parciales... etc, etc)
  • Nuevos tipos de estructuras comunes, como Tuplas, Opcionales, etc.
  • Expresiones Lambda.
  • Inferencia de tipos (no necesitamos declarar el tipo de la variable, F# decide cúal es el tipo correcto, por nosotros).
  • Asimismo, la programación paralela (ver arrticulo anterior) y asíncrona se hacen más fáciles.

Es cierto, es dificil comprender a primera vista porqué estas características nos darán más potencia en nuestras aplicaciones (me refiero a escribir menos lineas de código para hacer tareas más eficientes y elevar nuestra productividad), para quienes no estamos familiarizados con la programación funcional, por lo que tenemos que ir un poco más allá con ciertas definiciones, así que trataremos de ir viéndolas en futuros artículos, trataremos también de realizar un paso a paso para hacer nuestra primera aplicación de este tipo.
Saludos,

Programacion Paralela

16 de septiembre de 2009

Para muchos en el mundillo de la programación, hablar de "hilos, concurrencia, semáforos" es algo demasiado friki y con importancia sólo para los "gurús" (o aquellos que si atendieron las clases de sistemas operativos en la universidad). En realidad quizás no había razón porque, desde siempre, nuestras Laptop's y PC's de escritorio han venido con un sólo procesador. Algo sin importancia... hasta ahora.

Antes de explicar el porqué nos debe de interesar, vamos a hacer una analogía:

Imaginemos que la PC es como una agencia bancaria, el procesador puede compararse con un plataformista en un banco, que realiza actividades o tareas, y las aplicaciones se asemejarán a un cliente que se pone en la cola, convirtiéndose en una tarea pendiente para el plataformista.

¿Qué pasa cuando ingresa un segundo cliente a la agencia?

Pues el plataformista las atiende "a la vez", imaginemos como:

¿Señora, que se le ofrece? quiero un crédito hipotecario para... -un momento por favor
¿Señor, dígame? sí quiero retirar 1000 dólares en billetes de... -un momento por favor
¿Señora, me decía? ah bueno, si para una casa en surco, que cuesta -un ratito
¿Señor, en que estábamos? oh si, en billetes de 50 soles, por favor...

Vemos aquí que el plataformista "simula" atender a varios clientes a la vez, recordemos que hasta el momento las agencias venían con un solo plataformista en cada una de ellas.

Ahora, qué pasa cuando agregamos un segundo plataformista?

El gerente de la agencia debe de estar muy contento. ¡Seremos más eficientes! piensa... así que el segundo plataformista se
instala al costado del primero, y se abre una segunda cola de clientes.

Tremenda es su desilusión cuando ve que todos los clientes se arremolinan en la cola del ya cansado y antiguo plataformista. Lo intenta todo, coloca carteles y hasta sale de su oficina para invitarlos a cambiarse… nada, los clientes, ya "acostumbrados" a este tipo de atención, se reúsan a ponerse en la segunda cola.

Pues vale decir que esto ya le está sucediendo a nuestras aplicaciones con el advenimiento de los nuevos "dual core", "quad core" y todos los n-cores (n-procesadores) que quieran, puesto que ya no hay Laptop, PC o "Blade"  nuevo que no los incluya. Esto es, mis sistemas no están aprovechando (distribuyendo) sus tareas entre todos los procesadores existentes, significa que no estamos explotando las capacidades ni la velocidad que el hardware actual nos permite. Como resultado, tenemos un procesador sobre saturado, y varios un poco más que holgazanes.

Entonces quieres decirme que yo (o mi personal a cargo, je je) tendremos que convertirnos en frikis nerds de algún tipo? oh por Dios!

Bueno, quizás no sea del todo cierto. Que tendremos que comprender un poco mejor el tema, seguramente. Pero afortunadamente ya tenemos esfuerzos de la industria del software para acercar estos temas a los desarrolladores convencionales, y hacerlos un poco más triviales.

Justamente uno de esos esfuerzos es el desarrollo de .NET Framework 4 (actualmente en versión beta), que vendrá con una arquitectura completa para soportar los modelos de programación paralela y hacerla más simple. "!Oye, pero esto me sigue sonando muy complicado!". Pues la verdad es que es muy simple, tanto como el ejemplo que les voy a mostrar:


' Visual Basic .NET

' Version Secuencial

For Each item in MiColeccion Procesa(item)


' Versión Paralela

Parallel.ForEach(miColeccion, Sub(item) Procesa(item))


En este código, la versión equivalente logra efectivamente distribuir la carga entre todos los procesadores disponibles, ¡sin agregar ninguna línea de código! Inclusive, si en el futuro agregamos/quitamos procesadores, la carga se distribuirá entre todos los que queden, ¡sin volver a compilar la aplicación!

Ahora la atención de la agencia bancaria se parece más a la de un sitio de comida rápida, donde apenas escuchan tu pedido y estás pagando, ya te están sirviendo las papitas y llenando el vaso de cola.

Incluso, distribuir  tres tareas a la vez (realmente a la vez) es tan sencillo como:



' Visual Basic .NET


Parallel.Invoke(Sub() Metodo1(), Sub() Metodo2(), Sub() Metodo3())


Cierto es que no todos los algoritmos son candidatos para el paralelismo, puesto que antes debemos de tener ciertos conocimientos básicos del tema (bloqueos, concurrencia, y como éstos afectan a nuestros datos y procesos). No dudo que existan o se estén desarrollando otros frameworks similares en Java y otros lenguajes (si me entero les estaré comentando),  lo que sí podemos ver es que el tema está ganando fuerza y se hace necesaria su comprensión.

Conclusiones

La programación paralela está dejando de ser un tema reservado y va a tener que formar parte de nuestro arsenal de herramientas al momento de diseñar y codificar nuestras soluciones.  Aparentemente complicada, promete serlo menos gracias al esfuerzo de la industria por tratar de hacernos las cosas más fáciles y permitirnos explotar realmente todo el potencial del hardware que se dispone en estos días.