martes, noviembre 13, 2012

Procrastinación, o el "arte" de aplazar tareas


Se dice que el primer paso para solucionar algo es aceptar que lo padeces.

Pues bien, ahora mismo hay una epidemia que padecen muchos integrantes de la sociedad (y especialmente de la sociedad de la información), y reconozco que no me había planteado que tuviera nombre o que existieran formas de combatirla.

Estoy hablando de la procrastinación (procrastination en inglés).


¿QUE ES LA PROCRASTINACION?


Procrastinación es el acto de aplazar tareas que tienes que hacer y reemplazarlas por tareas más sencillas o más apetecibles en ese momento.

Este problema afecta tanto a las personas que no tienen ningún tipo de planificación como a las que se organizan con agendas, listas de tareas, blocks de notas...

Simplemente, cuando llega el momento de enfrentarse a la tarea que debemos hacer (escribir un informe, colgar un cuadro, fregar los platos, ir al gimnasio, hacer dieta, organizar los papeles de la casa...), nos ocurre que la sentimos titánica, enorme, extenuante, tediosa, poco motivadora, o imposible de realizar. Realmente nos damos cuenta de que no nos apatece siquiera empezarla y además parece tan larga que no nos va a dar tiempo a finalizarla.

No importa que la tarea nos llegue porque nos hayamos acordado o percatado de que tenemos que hacerla, o porque venga de un detallado planning en una aplicación de tareas (es decir, que no importa que seamos organizados o no). El asunto es tenemos que realizar esa tarea, y no nos apetece.

Y entonces decidimos retrasar esa tarea para que la realice un "Yo Futuro" (por ejemplo, nuestro yo del mañana, o el yo de la semana que viene), porque pensamos que ese yo estará en una situación mucho mejor para tratarla. Pero la realidad es que nuestro "Yo Futuro", cuando se convierta en "Yo Presente", volverá a sufrir la misma sensación de imposibilidad de ejecución de la tarea y la tentación de postergarla.

Así que en lugar de realizar la tarea que debemos hacer, acabamos realizando tareas más sencillas que queremos hacer: revisamos nuestro correo, vemos una película, echamos una siesta, realizamos otras cosas intranscendentes o más sencillas, damos un vistazo a las redes sociales, etc. A veces incluso realizamos otras tareas menores que teníamos planificadas para realizar (tareas reales pendientes), pero no la que estamos considerando, la que debemos hacer.

El resultado es que las tareas realmente importantes son postergadas una y otra vez. Es el motivo por el que nunca aprendemos a hablar ese segundo lenguaje, a tocar ese instrumento, acabamos no yendo al gimnasio, ni siquiera empezamos la dieta, o retrasamos ese informe y finalmente tenemos que hacerlo en el último minuto.

La procrastinación es muy grave. Es un problema real, que puede producir insatisfacción personal al no conseguir metas que realmente te has planteado alguna vez en tu vida.

Es también grave en el mundo laboral, donde cualquier distracción (correo, tareas menores, etc) aplaza una y otra vez acciones o proyectos complejos pero que normalmente son los más importantes.

Cuando hablo de aplazar tareas no estoy diciendo que no hagamos nada a lo largo del día. No. La procrastinación se da especialmente cuando tienes muchas tareas, y tienes que cambiar entre ellas. Me considero una persona con mucha productividad laboral, que intenta abarcar muchas áreas de aplicación y mucho trabajo de forma simultánea, y este es precisamente el problema, que tengo muchas tareas donde elegir y muchos problemas que atacar. Esto no le sucede en la misma medida a personas más especializadas o personas con trabajos "físicos" (como el fontanero que viene a tu casa a cambiar una tubería, y que no tiene más opciones o elecciones que hacer ese cambio).

Así pues, soy una persona muy activa laboralmente, productiva y trabajadora, y sin embargo "procrastino", tanto personal como laboralmente. Tengo pendiente mejorar mi inglés. Tengo pendiente salir más a hacer deporte, como hacía antes. Tengo pediente terminar unos programas que tenía en desarrollo. Tengo pendientes muchos libros interesantes por leer. Tengo pendientes muchas cosas...

El problema de la procrastinación se basa en que nuestro cerebro nos engaña, y lo hace de diferentes formas:



ENGAÑO 1.- PLANIFICACION OPTIMISTA


A la hora de decidir que queremos abarcar un nuevo proyecto o tarea, y de añadirla a nuestro "calendario" o "nuestra lista de tareas", nuestro cerebro planifica la tarea de forma optimista, es decir: es incapaz de planificar los problemas que surgirán, las partes de la misma que son complejas, su duración real. En lugar de hacer una planificación real, estima que es una tarea muy sencilla y que nos va a dar mucha recompensa ejecutarla.

Por ejemplo, supongamos que tenemos un cuadro por colgar. Bien, lo haremos hoy mismo, total, sólo hay que hacer un agujero y colgar el cuadro, son apenas 2 minutos y quedará muy bien en nuestra parted.



ENGAÑO 2.- PRE-EJECUCION PESIMISTA


Cuando llega el momento de enfrentarse a la tarea o mientras lo estamos haciendo, nuestro cerebro hace todo lo contrario, la afronta de forma realista o incluso pesimista: detecta las partes problemáticas de la tarea y nos hace ver que ni era tan sencillo como pensábamos, ni vamos a tardar tan poco. Y además, deja de percibir la recompensa que sí que anticipamos cuando planificamos por primera vez la tarea.

En ese momento, nuestro cerebro libra una guerra interna entre el DEBO y el QUIERO. La procrastinación se produce cuando elegimos el QUIERO sobre el DEBO.

En nuestro ejemplo anterior, cuando cogemos el cuadro en la mano nos damos cuenta de que para colgarlo, tenemos que coger el metro y medir tanto el cuadro como la pared, y calcular la posición y altura a la que lo queremos. Además hay que ir a por el taladro y las brocas. Y un alargador, porque no hay un enchufe cerca. Vaya, esto ya no son 2 minutos, me va a costar más tiempo del que pensaba, y no sé si tengo ese tiempo. Ahora mismo es que además, tampoco me apetece. Creo que lo colgaré este sábado que viene, que tengo más tiempo libre; en cambio, me echaré un rato en el sofá y veo mi correo nuevo.

DEBO colgar el cuadro, pero no QUIERO ahora mismo. Además, DEBO, me suena internamente a obligación, lo que hace que la tarea que me iba a proporcionar una recompensa (un bonito cuadro en la pared) se convierta en una obligación que se me impone.

Pero no pasa nada, porque nuestro Yo Futuro del sábado que viene lo colgará, y entonces seré feliz.



ENGAÑO 3.- CONFIANZA EN EL YO FUTURO (FUTURO ERRONEO)


Nuestro cerebro nos engaña entonces haciéndonos pensar que nuestro "Yo Futuro" sí que va a estar en disposición de afrontar esa tarea, y además lo hará encantado, con tiempo de sobra y con éxito en la misma.

Volvemos a caer en la PLANIFICACION OPTIMISTA, y para la misma tarea, olvidando la PRE-EJECUCION PESIMISTA que nos acaba de hacer postergarla.

Pero cuando nuestro "Yo Futuro" se vuelve a convertir en "Yo Presente", nos encontramos de nuevo en la misma situación inicial. Nos encontramos en la realidad. Una tarea que nuestro cerebro nos dice que será tediosa y larga, y que no nos apetece realizar. Entonces, volvemos a postegarla a cambio de una tarea menor (ver la TV, leer el correo, ver redes sociales) y que hace que pasado un tiempo sintamos internamente "vergüenza" y "fracaso".

La tarea no se realizará nunca, o en el mejor de los casos, se demorará.

El sábado que viene, no colgaremos el cuadro. Mañana, no iremos al gimnasio. El lunes, no empezaremos la dieta. Este año, no aprenderemos ese segundo idioma. No nos sacaremos esa certificación. No haremos el informe hoy (en el mejor de los casos, y por obligación, a última hora).

Nuestra sensación será entonces que no acabamos nada. A nivel personal, que la vida pasa y no estamos finalizando nuestras metas, nuestros hitos y nuestros sueños. A nivel laboral, que los proyectos se enquistan y que se nos acumula el trabajo que realmente es importante a cambio de trabajo "menor" que sí hemos abordado porque era más fácil de realizar.

Este engaño se basa en que la percepción que tenemos ahora de cómo será el futuro es errónea.

No hay más que darse cuenta de que nuestra mente hizo una planificación ideal de la resolución del problema a la hora de "aceptar la tarea" basándose en un futuro irreal donde no se presenta ningún problema ni dificultad para realizarla. Se basa en que nuestro "Yo Idealizado" resolverá la tarea sin problemas en nuestro "Futuro Idealizado". Sin embargo, cuando ese "Futuro Idealizado" se convierta en "Presente", la realidad será la misma que cuando hemos retrasado la tarea.



¿TIENE SOLUCION?


La procrastinación no tiene solución total, porque está arraigada en la mente humana. Pero podemos aprender a vivir con ella y reducirla a la mínima expresión.

Como dicen algunos análisis al respecto, no es que seamos malos gestores del tiempo, sino que nuestro cerebro nos engaña, que perdemos la batalla mental entre el debo y el quiero.

Y saber qué es la procrastinación y cómo se manifiesta (es decir, lo que hemos hablado hasta ahora) es la forma de detectarla y de no caer en sus trampas. Esto nos permite tomar medidas contra ella.

Aunque lo que voy a decir a continuación pueda parecer evidente, darnos cuenta de por qué se produce este proceso es un enorme paso: sabemos que tenemos ese problema y sabemos que en realidad no es real (es un engaño de la mente) y por lo tanto tenemos la llave de la realización personal, simplemente atacando a las causas:

  • Estimación realista: A la hora de plantearse realizar una tarea, detenerse a realizar mentalmente una estimación correcta de su dificultad y su duración. Es decir, no dejar que nuestro cerebro nos engañe con planificaciones optimistas. Ser realista y plantearse si somos capaces de llevar a cabo esa tarea y en cuánto tiempo podemos hacerlo.
  • Planificación y diseño: Para abordar una tarea, separarla en subtareas individuales y atómicas y atacar una detrás de otra, de forma que podamos considerar la satisfacción de ir acabando cosas y además tener claro qué falta por hacer (% de cumplimiento). Esto tiene la ventaja de que tenemos la tarea totalmente identificada y que no pueden surgir "sorpresas" que nos tienten a abandonarla. Si la procrastinación nos vence en algún momento en una subtarea, por lo menos cuando volvamos a ella sabremos por dónde íbamos y qué queda pendiente. 
  • Visualizar la recompensa: Apuntar junto a la tarea cuál es la recompensa que obtenemos por realizarla, para que cuando vayamos a procesarla tengamos claro cuál era nuestra motivación cuando nos la propusimos.
  • Visualizar el fracaso: Pensar en cómo nos sentiremos si postergamos la tarea y nuestro Yo del Futuro la vuelve a postergar. Es decir, ponernos en la situación de que la tarea nunca va a ser ejecutada, y darnos cuenta de la sensación de irrealización personal y laboral que supone eso.
  • Quiero vs Debo: Convertir mentalmente el DEBO en QUIERO. DEBO implica "obligación" y QUIERO implica "interés personal". No "DEBO" aprender Inglés. QUIERO aprender Inglés.
  • Ejecutar sin evaluar: Cuando seleccionemos una tarea para empezarla, no dar tiempo a nuestro cerebro a que comience a mostrarnos la visión pesimista de la ejecución. Nada más "leamos" la tarea, lanzarse a ejecutarla (por ej. la primera subtarea de la misma) sin pararse a evaluarla. Una vez hemos comenzado a ejecutarla, nuestro cerebro queda ocupado por la tarea y desaparece el efecto pesimista.
  • Visión real del futuro: Cuando nos tiente la posibilidad de abandonar algo, plantearse que nuestro "Yo Futuro" se encontrará en la misma situación y que probablemente volverá a postergarla, con lo que nunca la realizaremos. Plantearse de nuevo la satisfacción de hacerla, y pensar en qué nos va a reportar realmente dejar esa tarea y qué nos reporta realmente la tarea sencilla con la que pretendemos sustituirla.

Tal y como he abierto este artículo, la solución a un problema implica aceptar que se padece el problema. Y aceptar que somos procrastinadores por naturaleza es el primer paso para solucionarlo. 

En cuanto te das cuenta de que realmente nuestra mente nos "pinta" futuros ideales para realizar las tareas y "pasajes desoladores" cuando las vas a abordar, estás en disposición de no caer de nuevo en la tentación. Si a esta detección de las trampas del cerebro sumamos tareas correctamente planificadas y estructuradas (subdivididas) y una visión clara de la recompensa de su finalización y el perjuicio que nos supone el no realizarla, estamos ante la forma de acercarnos a nuestra realización personal y laboral.

Finalmente, hay una teoría interesante sobre realización personal y procrastinación que invita a embarcarse en proyectos paralelos para evitar la procrastinación "en casa". Para sacar provecho de nuestro tiempo, vamos, sin perderlo "procrastinando". El artículo en cuestión es "Deja ya de procrastinar e inicia proyectos paralelos".

Os dejo un vídeo sobre procrastinación (en inglés). El vídeo es un trailer del libro "You are not so smart" (No eres tan inteligente), que trata este problema entre otras cosas relacionadas con la psicología humana:




Recordad que el refranero español, que es tan sabio, ya nos hablaba cuando éramos pequeños, e incluso a nuestros padres, sobre procrastinación:

"No dejes para mañana lo que puedas hacer hoy".


Un saludo.

miércoles, octubre 17, 2012

Soportar múltiples resoluciones en un desarrollo moderno en 2D



Me ronda por la cabeza una pregunta sobre la programación de juegos 2D en entornos modernos con un problema que no se sufre en los juegos 3D (ni en el Spectrum, claro). Se me dió hace uno o dos años cuando me planteé la posibilidad de acabar mi PCMaziacs y hacerlo multiplataforma e incluso de hacer algún otro remake de juego de Spectrum. La he planteado en los foros de Speccy.org, por curiosidad (sección de desarrollo) en la siguiente URL:

[Enlace a consulta en foros de Speccy.org]

Hago la versión resumida de la pregunta, y luego la exposición. Ojo, es posible que la pregunta no tenga una respuesta directa o fácil. Yo tengo mi propia idea de cómo atacar el problema, pero lo que quiero saber no es cómo se puede hacer sino cómo se debe hacer o cómo se hace normalmente a día de hoy.


--- Pregunta versión resumida: ---

¿Cómo se tiene que diseñar o programar un juego 2D en cuanto a los gráficos y el GUI para que pueda funcionar en diferentes resoluciones y aspects ratios, es decir, poder llegar tanto a PC, como a iOS, Android, etc?

Me estoy refiriendo a soportar:

  • Diferentes resoluciones (sin perder calidad gráfica).
  • Diferentes aspects-ratios (4:3, 16:9, 16:10...) (e incluso orientación vertical/horizontal!)

Y me refiero a soportarlo en estos aspectos:

  • Gráficos de fondos y personajes (calidad de los mismos, ¿varios sets?, ¿gráficos vectoriales? ¿2.5D?, ¿renderizar escena+zoom?).
  • Elementos del GUI (fuentes, menúes, inventarios, puntuación) : posicionamiento en pantalla, etc.
  • Velocidades y posiciones de los personajes proporcionales a la resolución .


La duda puede ser tan simple como elegir en qué resolución hacer un remake, y que el usuario no lo vea en una ventanita de tamaño ridículo o en un fullscreen de píxeles del tamaño de un puño porque la resolución nativa del monitor es FullHD. De elegir entre varias resoluciones, o de cuál elegir.

--Fin pregunta resumida--------------------------------


Ahora viene el contexto histórico y el torrente de dudas e ideas.

Personalmente, siempre que he programado aplicaciones gráficas (demos, juegos, lo que sea) ha sido con una resolución fija.

En el Spectrum no tenías ninguna duda con la resolución: 256x192 y a trabajar. En el PC, en la época del 486 y Pentium MMX, lo habitual era tanto en MSDOS como en Windows elegir una resolución fija (320x200, 320x240, 640x480...) y lanzar el juego en fullscreen. Tampoco había muchas resoluciones a elegir: 320x200, 640x480, 800x600 y 1024x768 en 4:3 eran los "estándares".

La selección fija de resolución te permitía utilizar un único set de gráficos, y (erróneamente) mover todo el entorno de juego (personajes, etc) con "coordenadas de pantalla" en lugar de utilizar "coordenadas de mundo" y después transformarlas (ej: la bala se mueve 2 píxeles por segundo, la nave 3 píxeles por segundo, etc). Incluso se fijaba el número de cuadros por segundo y se asumía que no variaba.

Si querías soportar más de una resolución en un PC, como eran "conocidas" (desde 320x200 a 1024x768), podías optar por 2 sets gráficos a diferentes resoluciones y "hardcodear" (también error) en cierta manera todo (GUI, movimientos, etc) según si estabas en una resolución u otra.

Cuando entraron en juego hardwares más potentes, tenías la posibilidad de alcanzar más cuadros por segundo y los podías aprovechar bien especificando una tasa de FPS fija superior (normalmente la máxima del refresco 50-60Hz, y asumiendo que el juego no iría bien en sistemas más antiguos) o basando el movimiento de los personajes en el tiempo transcurrido desde el anterior fotograma, lo que adaptaba los frames a la velocidad de la máquina de forma "automática" (más fluído en hw potente, más "choppy" en hardware antiguo). Esto solucionaba el problema del "posicionamiento" y "movimiento", en cierta medida.

Los problemas aparecen por la parte de las resoluciones y los gráficos, cuando:


  • Entran en juego diferentes resoluciones.
  • El jugador puede tener monitor panorámico 16:9, 16:10, o un monitor 4:3.
  • Entran en juego tablets, móviles, etc, con resoluciones variadas o desconocidas a priori y con 2 posibles orientaciones.
  • Entra en juego permitir al usuario CAMBIAR de resolución (en ordenadores).
  • Los LCDs/TFTs tienen una resolución nativa y forzar una resolución en FULL SCREEN queda horroroso.



Concretamente:


Caso Monitor panoramico 16:9/16:10 vs 4:3:

Si eliges una única resolución "base" (por ej 800x600) y fuerzas ese modo de pantalla en fullscreen, puede darse el caso de que el usuario tenga un monitor panorámico (aparte de que se vea horrible en un LCD/TFT por la diferencia con la resolución nativa). En ese caso se me ocurre que tienes que detectar la resolución y elegir entre dos opciones:

a.- El juego transcurre en 4:3 a todos los efectos, tanto internamente como visualmente -> Si el monitor es 4:3 no se cambia nada al renderizar la escena y si el monitor es 16:9 se selecciona el modo equivalente en 16:9 y o bien se centra la imagen en pantalla (con bandas negras) o bien se pone algún tipo de marco decorativo, o bien se aprovecha el área para mejorar los marcadores / inventario / etc. Lo ideal supongo que sería asumir que el juego sea 16:9 y hacer la "adaptación" para 4:3, por eso de que casi todos los monitores hoy en día son panorámicos, pero ... el iPAD es 4:3 y no se puede despreciar su público en número de usuarios.

b.- El juego se adapta a la resolución adicional -> Se diseña para "jugar" 4:3 pero según el tipo de juego, puede ser factible o no mostrar más área de pantalla. Por ejemplo en un juego con vista superior tipo Advance Wars o Zelda, podemos elegir mostrar más área de juego pero en otros puede no serlo. Por ejemplo, en un Bubble Bobble o un FinalFight ver más cantidad de pantalla no es lo adecuado.

Con lo que la primera duda es: ¿programas pensando en 4:3 y desaprovechando panorámicos (cuando todos los monitores de PC son panorámicos)? ¿Se puede o debe hacer la inversa? (para panorámicos y recortar de alguna forma a 4:3).


Caso diferentes resoluciones:

Vas a diseñar un remake de un juego... ¿qué resolución eliges?

a.- Si eliges una resolución baja y fuerzas FULLSCREEN, en monitores grandes se ven píxeles como puños.

b.- Si eliges una resolución alta, puede haber equipos incapaces de moverlo.

Además, si no es la nativa del monitor y es LCD/TFT el resultado es difuso.

c- Si eliges soportar varias resoluciones, tienes 2 opciones:

c.1. Dar soporte a varias resoluciones preseleccionadas, con lo que tienes el problema de que necesitas varios sets de gráficos si quieres que el área de juego sea la misma en las diferentes resoluciones (y no que en cada resolución sea vea mayor área de juego con los gráficos más pequeños).

c.2. Dar soporte a todas las posibles resoluciones eligiendo una resolución base contra un buffer y escalando el volcado de ese buffer a la resolución de pantalla. De nuevo tienes que tener en cuenta además el aspect ratio para esto. Es decir, si queremos dar soporte no sólo al PC y a varias resoluciones concretas en 4:3 y 16:9, y queremos añadir iOS, Android, etc, la cantidad de resoluciones destino disponibles es enorme. Y puede que el dispositivo no sea lo bastante potente (y esto es CPU) para el escalado en tiempo real de todo el área de trabajo a la resolución destino.

Más posibilidades y problemas:


  • ¿Escalar los personajes? -> definir los gráficos para la mayor de las resoluciones y escalar para las menores o viceversa.
  • ¿Diferentes sets gráficos? -> requiere un enorme trabajo gráfico para juegos 2D.
  • ¿Gráficos vectoriales tipo svg? -> ¿Realmente se usa esta técnica?
  • La solución pueden ser los 2.5D (2D hecho con opengl renderizado con una cámara "lateral" o "superior").


Las múltiples resoluciones y aspect ratios también te obligan a adaptar la "velocidad" de los personajes según la resolución y los widgets del gui (menúes, marcadores, fuentes, etc). Esto no debería ser problema si las velocidades no se definen en "pixeles por segundo" sino en "unidades de movimiento del mundo virtual por segundo" (ej: metros por segundo) y después se escala lo que es "un metro" a las dimensiones en píxeles de los gráficos en la pantalla (según la resolución). Pero ya no es la facilidad de decir "esta nave se mueve 2 pixeles por segundo y esta mas rapido, a 3", hay que andar haciendo conversiones para todo lo que se va a trazar en pantalla.


¿Cuál es la mejor opción entonces para este problema?


  • Sets de gráficos -> "formatos gráficos pequeños + escalar hacia arriba" (entiendo que horrible a menos que quieras zoom de tipo 2x, 3x puro estilo retro), "formatos gráficos grandes + escalar hacia abajo" (entiendo que mejor, aunque el resultado del escalado sea "fuzzy"), "varios formatos (pequeño, mediano, grande) y escalar el más cercano", "2.5D y utilizar opengl"?.
  • 16:9 vs 4:3 -> ¿Marco? ¿centrar? ¿y si el juego no permite "dar más área visible?"
  • Menúes, fuentes, pantallas intermedias y de fin de fase -> ¿tenerlas en diferentes resoluciones? ¿de resolución fija y escalar?


PD: Veo que no soy el único que se plantea o se ha planteado estas preguntas:




Por desgracia, no veo muchas soluciones más allá de "ceñirse al dispositivo mayoritario al que apunta el juego y escalar al vuelo el buffer resultante para el resto, en cada fotograma"... o "hacer diferentes versiones (ipad, pc, android) centrando cada una en una resolución estándar".

Ya ni siquiera considerando Android, sino simplemente el PC, si tuviera que hacer un remake y tuviera que elegir una o varias resoluciones, me veo en un dilema por la existencia de 4:3/16:9/16:10 o de gente con monitores de portátil de 1280x800 y gente con monitores FullHD donde cualquier tamaño tipo 640x480 se vería horrible.

¿Opiniones?