Dan Pink en la sorprendente ciencia de la motivacion
Un poco de Teoría de la Computación (parte 1)
Objetos de primera y segunda clase
- Ser parámetro de alguna subrutina.
- Ser el resultado de alguna subrutina.
- Ser asignado a una variable.
- Construir en tiempo de ejecución. Ejemplo:
- Expresarse como valores anónimos (o literales).
Variables Libres y Vinculadas
Siguientes pasos
Cómo empezar con F#?
¿Qué necesitamos?
Pasos a seguir

Para terminar
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.
Programacion Paralela
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.



