Charlas de presentación del máster Telefónica en desarrollo avanzado

Como lo prometido es deuda, por fín han anunciado los horarios y la programación de las charlas de promoción del máster que podéis encontrar resumidas a continuación y en detalle en el enlace anterior:

Todas las charlas son en el edificio Oeste 1, sala F11 a las 09:30h. Mi recomendación es que lleguéis con tiempo para gestionar el permiso de entrada.

¡Nos vemos allí!

Master Telefónica en desarrollo de software avanzado en la U-TAD

Los que sigáis este blog sabéis de sobra que soy desarrollador de Firefox OS en Telefonica I+D y profesor de JavaScript en mis ratos libres. Empezando este Octubre también impartiré, junto a compañeros de profesión, parte del Máster en desarrollo de Software Avanzado en la U-TAD.

Podéis leer la información oficial del máster en la página de la U-TAD y la no oficial, a continuación…

Seguir leyendo “Master Telefónica en desarrollo de software avanzado en la U-TAD”

LaTeX Keyboard in the Firefox OS Marketplace!

Google Summer of Code 2014 is about to end and next Monday is the official pencils-down date in which our students should stop producing code. Fortunately, I’m proud to announce my mentee, Raniere Da Silva, has released his LaTeX Keyboard for Math in the Firefox OS Marketplace. Notice you need Firefox OS 2.0 or greater to use it.

The keyboard includes:

  • Five layouts for a default English input, numbers and symbols, greek letters (with uppercase variations), functions and operators.
  • The common forms of functions and operators contain alternatives for less common variations of themselves.
  • An input assistant to automatically enter and leaving LaTeX math contexts.
  • Placeholder navigation between LaTeX math commands.

Seguir leyendo “LaTeX Keyboard in the Firefox OS Marketplace!”

Un año en Telefónica I+D

Pues así de sencillo: un año en Telefónica I+D. Y cumpliendo los 6 años trabajando.

Y ha sido un año bastante intenso, vaya. Comencé programando en Python y he acabado con JavaScript. Pero no me quejo. Al contrario, estoy muy contento con mi proyecto actual: OWD y B2G (sí, sí, con Mozilla y Telefónica I+D. Ya le dedicaré un post sólo a él, lo prometo).

Durante este año he tratado infructiosamente de sacarme un máster (ojo, que aun queda septiembre, x) y me he independizado (dos veces que no es poco). He conocido a gente muy interesante en charlas y eventos y he tenido la oportunidad de trabajar en tareas realmente desafiantes que han mejorado mis conocimientos y expandido mis horizontes.   Me ha ido bien. De hecho, visto cómo está el país, me ha ido de p*t* madre. Pero mal de muchos, consuelo de bobos y más cuando uno de esos muchos también soy yo.

Política aparte. ¡Qué duro es cambiar! Un comentario de una compañera me indujo a la siguiente reflexión. Ella dijo que le daba pereza cambiar de proyecto porque había que demostrar lo que vales de nuevo. Ahora que me he cambiado puedo perfilar que realmente, te tienes que demostrar que vales. He pasado unos días muy intranquilo, porque el proyecto actual es inmenso, las reuniones son en inglés, recibo 30 correos diarios y casi me ahorco más de una vez con Git. Y encima me sentía un lastre para los compañeros que me proporcionaban ayuda preguntando todo el rato y discutiendo lo que no veía del todo claro o lo sobre lo que no estaba del todo de acuerdo

Pero después de superar la tarea entre manos, que ha sido dura y no en una semana especialmente tranquila, me doy cuenta de que sigo valiendo y eso me alegra y renueva mis energías. Luego insisto, estoy muy contento con el curro.

En fin, me permito felicitarme y desearme a mi mismo un mejor nuevo año. Para terminar, decir que además este proyecto está lleno de viajes chulos o al menos, oportunidades. Ahora tendremos una semana desarrollando con la gente de Mozilla codo con codo y para Agosto quizá un viaje a Brasil.

Codemotion Madrid 2012

El sábado pasado asistí a la Codemotion que se celebró en la Escuela de Ingeniería Informática de la Universidad Politécnica, allá a 12 minutos en coche y hora y media en tren (mal para mí que no tengo carné).

Hay que decir que no pude asistir a todo el evento: de los ocho ciclos de conferencia que se presentaban, estuve en 4, con tiempo para socializar un poco, pasarme a visitar a los patrocinadores y celebrar el día del padre (dado que el pasado fin de semana no pudo ser).

Lo peor del evento fue el espacio o el exceso de gente, según se mire. En cuanto al espacio elegido, demasiado lejos de todas partes: si bien contaba con línea directa a Sol por línea 1 y en cercanías, los autobuses universitarios no estaban en funcionamiento dado que era Sábado. Pero esto es un problema menor.

El mayor de los problemas radicaba en la abrumadora cantidad de personas que éramos en un espacio muy reducido, termómetro también del éxito del evento y que reflejaba la buena acogida de la iniciativa por parte de la comunidad española.  Pero el espacio era un problema: charlas abarrotadas de personas que se salían del propio aula, pasillos estrechos para los patrocinadores que formaban cuellos de botella entre las salas de conferencias y un circuito reducido (dado que la mayoría de los pasillos y salidas ajenas al evento permanecían cerradas) que impedía la libre movilidad de los asistentes.

Las charlas a las que sí pude asistir fueron Metaprogramación en Ruby, de Sergio Gil; Todo Microsoft Kinect en 45 minutos, de Vicenç García y Bruno Capuano; Template animation & OO CSS: Be nice with your Web Designer de Enrique Amodeo y Boot2Gecko, la Web es la plataforma de Rubén Martín y Guillermo López.

Con diferencia, la mejor de las charlas fue la de Sergio Gil por utilidad, claridad y simpatía. Mención especial tienen por mi parte los voluntarios de la comunidad Mozilla, desarrolladora de Boot2Gecko, Rubén Martín y Guillermo López que presentaron muy bien aún cuando el portátil los dejó tirados en más de una ocasión.

A nivel de utilidad, obtuve algunas ideas interesantes que compartiré con vosotros durante esta semana: adaptaré la charla de metaprogramación para Ruby a Python y JavaScript y subiré un plug-in para jQuery y Django inspirado en la charla de Enrique Amodeo sobre Template Animation. Hablaré también sobre lo desafortunado del nombre cuando llegue el momento.

Eché de menos quizá más tiempo para socializar, quizá alguna actividad / juego, grupos de interés, debates o sencillamente, más tiempo en los descansos. Por los patrocinadores, ninguna queja, se podía hablar con ellos y, al menos a mí, me informaron correctamente de todo, intercambiamos tarjetas y currículos y en general fue una experiencia de lo más provechosa.

Particularmente creo que eventos así valen la pena. La próxima vez espero que dure un par de días en algún lugar más amplio y quizá más talleres o charlas de nivel avanzado… Como sea, espero que sea pronto.

Nuevo diseño y más proyectos

Bueno, pues como se ve a simple vista, he estado entretenido cambiando un poco la apariencia de la página porque la anterior me parecía algo pequeña y recargada. También he creado un logo que espero poder tener pronto en forma de tarjeta de presentación para enseñarlo.

Además, he añadido nuevos proyectos a mi haber que podréis encontrar tanto en la página dedicada a tal efecto como en mi perfil en github.com.

Espero que los cambios sean de vuestro agrado y lo que espero aún más es volver a las andadas con artículos técnicos de interés.

¡Hasta pronto!

Mi primera entrevista con Google

Bueno, el pasado Jueves pasé mi primera entrevista con Google y el Viernes me dijeron que la había hecho satisfactoriamente y que a la semana siguiente me pasarían otra. ¡Algo es algo!

Fueron unos 45-50min de entrevista en Inglés con uno de los ingenieros de Google. Para mi el tiempo se me hizo eterno y entre los nervios, el calor, el teléfono y mi dicción inglesa, me dio la impresión de que lo había hecho fatal aunque reconocía que era fácil. De hecho la sensación era “avergonzado de lo mal que lo había hecho para lo fácil que era”. Afortunadamente no fue así.

La entrevista se dividión en tres partes: una parte de teoría y dos problemas. Aunque me habían pedido Java o C++, me pude defender perfectamente en Python y a continuación os cuento un poco la entrevista, cómo respondí y cómo me hubiera gustado responder…

Seguir leyendo “Mi primera entrevista con Google”

Preguntas de entrevista de Google (con respuestas) II

Seguimos con otras diez preguntas de entrevista de Google tras la primera entrega de esta serie. Insisto en que si conoceis mejores respuestas o soluciones las pongais en los comentarios.

#11 ¿Cómo se pasan las cookies en el protocolo HTTP?

Bueno, esta me parece bastante fácil. Las cookies, que no son más que pares clave=valor se pasan como texto plano en las cabeceras de cualquier petición o respuesta HTTP. Cuando el explorador realiza una petición, pasa las cookies tal cual se las mandó el servidor simulando así una suerte de “estado persistente”.

Puede encontrarse información sobre el protocolo HTTP y las cookies en particular en Wikipedia.

#12 Escribe una expresión regular que acepte direcciones de correo

Divide y vencerás: la estructura de un correo electrónico es [usuario]@[host] así que ya podemos hacer una versión inicial de la expresión regular:

()@()

Tenemos que rellenar esos corchetes. Vamos con el host que tiene una forma como [subdominio].[dominio]. Ese punto final es optativo (se supone que todos los FQDN lo llevan en su normalización) así que la expresión regular para el host será algo como:

([a-zA-Z0-9][a-zA-Z0-9-]*\.)+[a-zA-Z]+(\.)?

Es más o menos correcto. El primer grupo entre corchetes obliga a que el nombre del dominio empiece por un carácter alfanumérico. El segundo acepta el resto de caracteres (alfanuméricos y el guión) y hace terminar la cadena en punto. Todo esto podemos repetirlo indefinidamente (en realidad un nombre de dominio sólo puede tener hasta 253 caracteres). Debemos terminar con una extensión que representa un dominio de primer nivel formado por caracteres alfabéticos (al menos, uno) y el punto optativo final. Los puntos están precedidos de la barra para que no sean considerados caracteres especiales.

Ahora, el nombre de usuario depende. Pongamos algunas reglas. Supongamos que solo permitimos caracteres alfanuméricos, guiones bajos, puntos y símbolos de sumar y restar y que debe comenzar por un carácter alfanumérico o guión bajo . Su longitud mínima será de 1 caracter. Tenemos pues:

[_a-zA-Z0-9][_a-zA-Z0-9-+.]*

Ahora, combinando las tres, tenemos:

([_a-zA-Z0-9][_a-zA-Z0-9-+.]*)@(([a-zA-Z0-9][a-zA-Z0-9-]*\.)+[a-zA-Z]+(\.)?)

Y listo, ese churro valida direcciones email.

Os invito a probarlo en RegexPal.

#13 Escribe una función f(a, b) que toma dos cadenas de caracteres y devuelve otra sólo con los caracteres comunes en el orden en el que aparecen en a. Escribe una versión que ejecute en orden N cuadrado y otra en orden N.

Vamos a suponer caracteres alfabeticos y en minúscula:

La primera solución que se nos puede ocurrir es algo como esto (en Python).

def f(a,b):
  r = ''
  for c in a:
    if c in b and c not in r:
    r += c

  return r

Esta solución es N cuadrado pues el hecho de comprobar si el caracter c está o no en b supone un recorrido por los caracteres de b. Así que tenemos un bucle de longitud(b) dentro de otro de longitud(a) luego longitud(a)*longitud(b) pertenece a O(N^2). Esto es notación O que supongo que a cualquier ingeniero le sonará de algo.

La solución N es también muy fácil. Para ello necesitamos una función auxiliar que haga a=0, b=1, c=2…

def alpha_to_index(c):
  return ord(c)-ord('a')

def f(a,b):
  l = [0]*26
  for c in b:
    i = alpha_to_index(c)
    if not l[i]:
      l[i] = 1 # Indica aparición en b

  r = ""
  for c in a:
    i = alpha_to_index(c)
    if l[i] == 1:
      r += c
      l[i] = 2 # Indica ya añadida al resultado

  return r

Este algoritmo se ejecuta en longitud(a)+longitud(b) que pertenece a O(n) Para quitar las restricciones de minúscula y caracteres alfabéticos, en vez de un array se usa un hashmap (un diccionario en Python) para albergar el estado de los caracteres.

En breve dedicaré un post a la notación O y a cómo calcular el coste de un algoritmo.

#14 Te dan un código fuente que se rompe en cada ejecución. Tras ejecutarlo 10 veces en un depurador te das cuenta de que nunca se rompe dos veces por el mismo sitio. El código fuente sólo usa un hilo y la biblioteca estándar de C. ¿Qué errores de programación podrían estar causando los problemas? ¿Cómo podrías probar cada uno?

A mi se me ocurre que las causas pueden ser principalmente dos:

  1. Desbordamientos (y son un caso particular del segundo)
  2. Comportamientos indefinidos

Para probarlos cogería un lista de comportamientos indefinidos y probaría que no se están ralizando asunciones erroneas. Para los desbordamientos comprobaría los casos típicos (desbordamiento de array, de paso de parámetro, copia de arrays…).

#15 Explica cómo funciona el control de congestión en el protocolo TCP

La verdad es que este no es mi fuerte así que si alguien se sabe otra forma más sencilla de explicarlo, estaré encantdo de rectificar la respuesta. Entre lo que recuerdo de redes y lo que he sacado de la Wikipedia, la explicación se parece a esto:

El típico (porque hay varios) consiste en variar el tamaño de la llamada ventana de congestión mediante un algoritmo llamado Slow-Start. La necesidad del protocolo surge porque los extremos de una conexión TCP no tienen manera de saber a priori la calidad la red. En principio, no pueden saber el tamaño máximo del datgrama (los datos enviados en TCP)  que causaría la mayor tasa de transferencia sin desbordar la capacidad de la ruta seleccionada.

Encontrar este óptimo es tarea del algoritmo de control de congestión. Para ello, el emisor cuenta con una ventana de congestion que especifica cuántos datagramas enviará de golpe. La ventana comienza al tamaño máximo de un datagrama y cada vez que se acusa un recibo se dobla. Eventualmente se superará un umbral llamado sstresh que hará que la ventana aumente linealmente. En el momento en que la cantidad de datagramas satura la red se comienzan a perder paquetes y se produce una de las siguientes situaciones:

  • Si se detecta un timeout, la ventana se reestablece al tamaño máximo de un datagrama.
  • Si en vez de un timeout, se detectan tres acuses iguales, la ventana se reduce a la mitad del mínimo entre la ventana de congestión y la ventana de recepción (el tamaño máximo del datagrama que el nodo está dispuesto a aceptar por vez).

#16 En Java, ¿cuál es la diferencia entre final, finally y finalize?

Yo me sabía dos (final y finally):

  • final es un modificador de tipo. En variables indica que, una vez inicializada en el constructos, no puede volver a ser modificada. En clases indica que no se puede heredar de ella.
  • finally es una clusula del bloque try / catch que indica qué se debe hacer finalmente, antes de continuar la ejecución
  • finalize es el método al que invoca el recolector de basura al ir a destruir un objeto

Fuente: http://www.janeg.ca/scjp/gc/finalize.html

#17 ¿Qué es la programación multihilo? ¿Qué es un deadlock?

La programación multihilo hace referencia a distintas líneas de ejecución dentro de un programa. Cada línea de ejecución es un subprograma que mantiene su propio estado y es independiente de los demás. La comunicación se realiza mediante el traspaso de mensajes o a través de recursos compartidos. El acceso a estos recursos compartidos promueve toda una nueva serie de problemas relaccionados con el acceso simultáneo a los mísmos.

Un deadlock o interbloqueo es un problema de sincronización que se da cuando el hilo A se encuentra esperando un recurso del hilo B y viceversa. He encontrado un ejemplo muy claro de interbloqueo en el blog de JASoft.org

En él se nos invita a pensar en un proceso que transfiere dinero entre dos cuentas. Obviamente el proceso trata de obtener un acceso exclusivo a cada cuenta al comienzo de su ejecución por si ya hay otro proceso manipulando dicha cuenta. Si una cuenta está en uso, el hilo que la requiere esperará (haciendo nada) hasta que sea liberada.

Ahora supongamos que se producen dos transferencias en sentidos contrarios. Ambos procedimientos comenzarán por bloquear sus cuentas origen pero al tratar de bloquear las cuentas destino se encontraran con que tal cuenta ya se encuentra bloqueada. Y lo que es peor, de esta situación no saldrán nunca.

Fuente: http://geeks.ms/blogs/jalarcon/archive/2011/04/29/191-qu-233-es-un-deadlock-o-interbloqueo.aspx

#18 Escribe una función toExcel(v) que coja el valor de una columna excel (A, B, C, …, AA, AB, …, AAA) y devuelva su valor entero (A=1, B=2, C=3, …, AA=27…)

Este ejercicio es muy interesante pero aun lo es más el contrario. Para abordarlo, vamosa reducir al conjunto de letras a A, B y C. Ahora tenemos que A=1, B=2 y C=3 y la secuencia es A, B, C, AA, AB, AC, BA, BB, BC, CA, CB, CC…

Si recordais el post con el que (casi) abrimos el blog, relacionado con las bases de numeración y con el hecho de que la suma de 1 y 1 sea 10 en binario, vereis que esto se acerca mucho a contar en base 3. El problema es que los dígitos en base 3 son 0, 1 y 2; y no 1, 2 y 3 (o A, B y C) como ocurre en este caso. Resulta que en este problema no contamos con ningún dígito que represente el 0 pero sí con uno que representa la base.

Bien, vayamos primero con el problema contrario. Transformemos, por ejmplo, 12 en CC.

El número 12, escrito en base tres tiene la siguiente pinta: 110 dado que puede expresarse como 1*3^2 + 1*3^1 + 0*3^0 Ahora bien, como no contamos con ningún símbolo para representar el 0 pero sí par representar el 3, vamos a ajustar 110 tratando de quitar los 0s. Podemos quitar una “decena” y añadir 3 unidades lo que resulta en 103 cuya descomposición sería 1*3^2 + 0*3^1 + 3*3^0 que sigue siendo 12. Ahora tenemos un 0 más así que quitamos 1 “centena” y ponermos 3 “decenas” quedando 033. Como los 0s a la izquierda no importan pues ya hemos terminado y su descomposición es 0*3^2 + 3*3^1 + 3*3^0 que sigue siendo 12. Ahora reemplazamos cada dígito por su letra quedando CC.

De aquí puede inferirse fácilmente el algoritmo de transformación que nos piden y puede resumirse en dos sencillos pasos:

  1. Reemplazar cada letra por el dígito correspondiente (A=1, B=2, C=3…)
  2. Interpretar en base 3 (o, generalmente, en base la longitud del conjunto de símbolos)
def char_to_index(c):
  return ord(c) - ord('A') + 1

def toExcel(v):
  l = len(v)
  r = 0
  for i in range(l):
    c = v[i]
    r += char_to_index(c) * (26**(l-i))

  return r

El caso contrario requiere el estudio de un caso más. Pongamos que queremos transformar 9 en BC. 9 en base tres es 100. Empezamos quitando 0 de más a la derecha: quitamos 1 “decena” y añadimos 3 unidades resultando en 1-13 cuya descomposición sería 1*3^2 – 1*3^1 + 3*3^0 que sigue siendo 9. Como tampoco tenemos símbolos para números negativos quitamos 1 “centena” y añadimos 3 “decenas” quedando 023 cuya descomposición es 0*3^2 + 2*3^1 + 3*3^0 que sigue siendo 9. Ahora reemplazamos cada dígito por su letra lo que nos lleva a BC.

El algoritmo supone modificar ligeramente el clásico de las divisiones y restos utilizado para transformar a una base dada (comprobado que funciona):

def char_to_index(c):
  return ord(c) - ord('A') + 1

def index_to_char(i):
  if not i:
    return ''

  return chr(ord('A') + i - 1)

def fromExcel(n):
  res = []
  d = n
  fixmode = False # Indica que estamos en modo ajuste (restar 1 al siguiente resto y añadir 26 al actual)
  while d >= 26:
    r = d%26

    # Si estamos ajustando los restos, asumimos que ya hemos añadido 3 al anterior y le quitamos uno a este
    if fixmode:
      r -= 1

    # Si es (o queda) negativo, le sumamos veintiseis y pasamos (o conservamos) el modo de ajuste
    if r<=0:
      r += 26
      fixmode = True

    # Si no lo es, dejamos el modo de ajuste
    else:
      fixmode = False

    res.insert(0, r)

    d = int(d/26)

  res.insert(0, d)
  return ''.join(map(index_to_char, res))

#19 Si tienes 1 millon de enteros. ¿Cómo los ordenarías eficientemente? Modifica un algoritmo conocido para hacerlo.

Dedicaremos en breve otro post a los algoritmos de ordenación. Baste decir que para tal cantidad de datos se prefieren estrategias “divide y vencerás”. Primeramente el milllón de datos puede separarse en tramos (digamos de 10000 ó 100000) enteros y ordenarse separadamente mediante qsort. Luego pueden mezclarse con merge sort.

También se podría haber aplicado merge sort directamente.

Ojo, si nos dan límites de memoria entonces tendremos que ir poco a poco. Leer unos cuantos, aplicar una técnica anterior, escribir el resultados; leer otros pocos, volver a aplicar una técnica y volver a escribir el resultado… Al final, habrá que mezclar los archivos ordenados.

Fuente: teneis aquí una solución por Guido van Rossum con código en Python 3.0

#20 Tienes un flujo continuo e infinito de consultas (las consultas de Google que la gente introduce). Describe como podrías tomar una buena estimación de 1000 muestras de este conjunto inagotable de datos.

Esta pregunta no la entiendo y, sencillamente, preguntaría por más información. ¿Qué característica tienen que cumplir estas mil muestras? Supongo que se referirá a las 1000 consultas más solicitadas. Para ello se puede usar una estructura de datos (que acabo de descubrir) llamada splay-tree o árbol biselado que no es otra cosa que un árbol binario con la propiedad de que los elementos más recientemente accedidos pueden recuperarse más rápidamente.

Esta solución del árbol biselado requiere alguna normalización que convierta las consultas en números. Se podría utilizar alguna función hash.

Si esta no es la característica que deben cumplir las muestras, entonces la solución cambia. Por ejemplo si tiene que ser aleatoria se puede dividir el conjunto de consultas en 1000 segmentos y seleccionar un elemento al azar de cada uno.

EDIT: Según un comentario (con el que estoy de acuerdo) de Jisakiel en Facebook, la muestra debería cumplir normalidad. Ahora bien, estamos en las mismas, normalidad sí pero ¿respecto de qué? Si nos asaltan con esta pregunta, es nuestra obligación fusilar al entrevistador con aclaraciones hast que sepamos exactamente las propiedades de la muestra.

Startup Weekend Madrid 2011

Startup Weekend 2011 Madrid
Startup Weekend 2011 Madrid

Este fin de semana estuve en el Startup Weekend de Madrid organizado por Ellas 2.0. Formamos parte del grupo de joinjoin.mey, a parte de llevarnos un par de premios, fue de lo más divertido y enriquecedor.

Aconsejo a todo aquel que quiera comenzar a emprender que acuda a este tipo de eventos donde no sólo se conoce a un montón de profesionales interesantes sino que además se cuenta con la inestimable ayuda de nuevos y veteranos emprendedores e inversores.

Por mi parte, tuve el placer de colaborar con Jorge, Gonzalo, Alberto y Leire que nos aportaron a Adriy a mi los perfiles que nos faltaban. Juntos desarrollamos una idea nacida en un Starbucks del centro dos días antes y la convirtieron en algo creible y rentable sin perder de vista su utilidad inicial. Baste ahora con dejaros su logo y enlace, invitaros a conocer el prototipo (que podeis descargar en PDF) e insistiros con que nos proporcioneis todo el feedback que creais necesario.

JoinJoin es el proyecto que presentamos al Startup Weekend ganador del premio Sage y nominado al de LinktoStart

La aplicación, que pretende revolucionar la forma de hacer networking en convenciones, conferencias y reuniones de profesionales mediante el intercambio de perfiles profesionales y la recomendación e identificación de perfiles afines, fue ganadora de dos premios:

  • Premio del patrocinador SAGE.
  • Nominación a LinkToStart lo que supone 8 meses de mentorización online ¡que comenzaremos en Enero!

EDIT: Adri, que es más crítico que yo ha dado una opinión sobre el Startup Weekend bastante interesante.

¿Por qué el project manager cobra más que el programador?

Leo en hackerdou.com una entrada con título ¿Por qué los programadores y analistas cobran más que los programadores?

Os recomiendo leer la traducción que hacen en hackerdou.com, en ella se insta a pensar en que

en nuestra sociedad, aún pensamos que el salario está sujeto a la posición en la jerarquía

Y a partir de aquí habla de dos formas de organización (la negrita es mía):

Las manufactureras nacen de la escuela de pensamiento caracterizada por la teoría X propuesta por McGregor: Los empleados son flojos y requieren de control y supervisión constantes; los trabajos se mantienen solo por la paga; los managers son siempre capaces de hacer el trabajo de sus subordinados incluso mejor que ellos. (…)

(…)

También existen los “equipos cinematográficos”. Estos están basados en la noción de que la gente es inteligente, auto-motivada, trabajadora y que realmente disfruta su trabajo. Los equipos cinematográficos, reconocen que, debido a la especialización, las habilidades individuales pueden sobrepasar las habilidades del equipo que coordina y dirige el trabajo. (…)

Realmente una reflexión muy interesante sobre organización.