@ agnasg

agnasg


Cómo dejé de preocuparme y comencé a programar

05-09-2011 4:05 PM

Cuando programo no me preocupo porque la programación requiere el 100% de las pocas neuronas que me quedan, así que no hay ninguna preocupándose. Estoy tratando de entender cómo se usa CGUISkin::draw3DWindowBackground (), uno de los más misteriosas funciones del api de irrlicht. Luego hice ejercicios de relajación (es decir, puse la mente en blanco, lo cuál no es tan difícil en estos días) y comencé a escribir los siguientes

Enlaces de los que esperan que les quiten el yeso

  • Legend of Grimrock un clone de DungeonMaster, un interesante juego recomendado por Notch (el programador detrás de Minecraft). El video es impactante. Si no tuviera suficientes proyectos este sería algo interesante para probar. De hecho lo voy a colocar en la lista (quedaría en el puesto 8, uff).
  • Más noticias sobre Carmarck: anunció en el reciente Quakecom que el código fuente de Doom 3 será liberado. Carmack había anunciado que continua trabajando en Doom 4, que será lanzado luego de Rage.
  • Hablando de motores: paladin, un nuevo motor 3d para juegos, javascript. Ya hay tantos de estos que no se por cuál comenzar. Lo voy a colocar en la lista (tendría que ver exactamente cuál) … Estaba incentivado para probarlo pero mi git clone no funcionó. Error.
  • Bastion (video, wikipedia) un juego isométrico de aventuras,  RPG, con profundidad, gráficos con excelentes colores, y un narrador que explica y comenta las acciones con el personaje como centro de la historia. Define innovación. Disponible en Steam, ha tenido una excelente recepción por comentadores y jugadores. Dice ser independiente, pero en los videos aparece el sello WB game, por lo que no es independiente. Un desarrollador que recibe financiación de Warner Brothers no es independiente. ¿Correcto? Como quiera que sea es un juego excelente, original, atractivo. Me hace pensar sobre mi opinión de los juegos isométricos. Ya no me parece que sea tan mala idea esta perspectiva.
  • Goggle Code está lleno de perlas escondidas. Un paseo rápido por el área de cursos revela un grupo interesante de artículos sobre programación: análisis, algoritmos, ordenamiento, árboles balanceados, hashing. Para el principiante este es el primer artículo. Cómo medir el desempeño de un programa, análisis matemático. ¡Ey! un programador tiene 7/8 de matemático, si no te gusta la matemática, olvida la programación!
  • ¿Puedo pagar mis gastos de adwords con mis ingresos de adsense? ¡No! Parece que la tecnoburocracia inservible no es un privilegio del trópico…

Cómo hacer lo que tienes que hacer

28-08-2011 7:51 AM
  1. Escribe un diario donde te repites una y otra vez lo que debes hacer y por qué lo debes hacer hoy, no mañana, no más tarde sino ahora.
  2. Escribe un blog donde explicas cómo hacer lo que tienes que hacer, ahora.
  3. Lee tu diario y tu blog cada vez que no tengas ganas de hacer lo que tienes que hacer.
  4. Pregúntate qué haces leyendo tu diario o tu blog cuando deberías estar haciendo lo que debes hacer.
  5. Lee los blogs de otros donde explican sus tontas razones de por qué deben hacer lo que deben hacer.
  6. Reflexiona el por qué decidiste hacerlo: llegarás a la misma conclusión: tienes que hacerlo, no hay excusas ni coartadas.
  7. Haz una lista con posibles alternativas: lánzala a la basura cuando termines.
  8. Abre tu navegador y dirígete a alguna de esas redes sociales para que te sientas avergonzado de perder el tiempo, en vez de estar haciendo lo que tienes que hacer.
  9. Enciende la televisión: cuando descubras que están transmitiendo el mismo programa que la última vez, la apagarás en unos minutos.
  10. Si nada funciona ponte a hacer lo que debes hacer: en unos minutos ya no te acordarás por qué no lo hacías.

Si eres un programador (o chef) prepara un Wiki personal

23-08-2011 9:35 AM

Ayer estaba trabajando un sistema de manejo de anuncios web utilizando el IDE de Eclipse. Es un sistema muy grande, ~50k líneas de código. Con frecuencia me pierdo en el código porque algunos de los archivos tienen 3k loc. En estos casos lo ideal es un bookmark para ir rápidamente a un sitio en el código. A veces tenemos que movernos entre 3+ sitios para implementar algo. ¿Cómo demonios se guarda un bookmark? ¿Cómo  demonios se ven los bookmark? Pues esta es un guía para hacer todo eso. En resumen, Window > Show View > Other… ->“Bookmarks”. Esto debería estar en “Navegación” o en “Editar” pero no, ¿para qué hacerlo fácil?. Lo peor es que ya yo sabía esto pero lo había olvidado. Entonces encontré esta recomendación “Todo programador debe tener un Wiki“. En este Wiki debemos guardar esos detalles que siempre olvidamos o que son difíciles de recordar.

En mi lista están cosas como:

  • Cómo deshabilitar el despliegue de caracteres especiales en MS Visual Studio (este es uno difícil)
  • Cómo hacer un unwrap de un objeto en Blender 2.49
  • Cómo hacer para trazar una simple línea recta en Paint Shop Pro 8.

Y la lista continúa. En mi caso yo he estado guardando estas cosas aquí en el blog. No justifico tener un wiki aparte (o quizás sí) pero como quiera que sea necesitamos algún mecanismo para guardar estos recipes y encontrarlos con facilidad. Voy a inaugurar una etiqueta para eso, que llamaré wiki. Todo esto resulta obvio… pero estoy seguro que Ud. programador, no tiene un wiki personal…

Es como picar una patilla por la mitad… con las manos

21-08-2011 1:26 PM

Ya he mencionado que tuve un enfrentamiento con la realidad el pasado 22 de julio, así que muchos de mis side projects quedaron congelados por aquélla época. Como lentamente estoy volviendo a la normalidad, he comenzado a revisarlos uno por uno. Lo siguiente aparece como última anotación  en la bitácora de panicputc:

17-07-11 · (P) Implementación de una ventana que permita seleccionar un icono de una lista y que devuelva el código (id) del icono seleccionado. Colocar en CWIndows.

La (P) significa que es una actividad pendiente, por supuesto. Me quedé leyendo aquello varios minutos recordando todo el trabajo alrededor de esta actividad y la importancia que tiene para la continuación del proyecto. El conocedor de cómo funcionan los video-juegos entenderá rápidamente que esto es la piedra angular de las interfases de los juegos modernos. Esta ventana puede ser usada para seleccionar un objeto en el inventario, un hechizo en el libro de hechizos, un arma, una poción, etc. De hecho, puesto que esta es una función que puedo reutilizar en otros juegos sería ideal que esté en una clase multipropósito. Afortunadamente he estado balanceando la necesidad de que las clases sean de uso general y que efectivamente cumplan sin tantos rodeos el requerimiento que tengo, así que la mencionada clase CWindows tiene un diseño razonablemente genérico. Algunos blogguers (yo incluído) han enfatizado la necesidad del delivery: lo que sea que estemos haciendo debe satisfacer  el requerimiento sin dilaciones, sofisticaciones u optimizaciones prematuras. Por otro lado, por mi experiencia, estas clases genéricas  difícilmente van a satisfacer el 100% de los casos, eso ni siquiera lo logra el mejor de los APIs. Así que hay un límite invisible entre estas dos fuerzas, un límite que no debemos quebrantar más, ni siquiera por nuestra búsqueda de la perfección.

Algo que mi bitácora no indica es dónde se supone que esta rutina es necesaria con prioridad. Esto no resultó gran problema pero hubiese sido agradable algún contexto. Descubrí para mi alivio que la rutina ya estaba bien adelantada así que no tuve que pensar mucho. De hecho se parece a otra rutina que hace algo similar, pero devuelve un mensaje del usuario. Ambas rutinas tienen una parte de inicialización similar. Estuvo lista rápidamente, pero presentaba un bug. Solamente se podía invocar una vez.  La segunda vez la ventana no se abría. Dos horas después descrubrí que la rutina requiere que la variable m_status esté inicializada en false. De hecho, la otro rutina tiene un:

m_status = false;

muy ufano al comienzo. ¿Cómo es posible que estuvo ahí invisible durante dos horas? Varias razones:

  • Estaba antes de las declaraciones de las variables, a veces esto resalta las instrucciones, otras veces las oculta.
  • Le dediqué mucho tiempo a perseguir algún error a los IDs de las ventanas pensando que ahí radicaba el error. Esta parte del código es extremadamente asincrónico, dado que el programa se detiene y espera a que el usuario cierre la ventana o presione “OK”.
  • No había una línea de documentación indicando “esto es importante porque …”
  • Transcurrió un mes desde la última vez que estuve tocando este código, realmente había olvidado la importancia de la variable m_status y quedó de última en la lista de cosas por revisar. De hecho, m_status suele ser una variable inofensiva, pero no esta vez.

¿Qué hemos aprendido, mi querido saltamontes?

  • Una buena descripción de la actividad es importante. Si viene acompañada del contexto, mucho mejor. Pero la descripción debe ser breve.
  • Las fuerzas imperiales de la programación a objetos nos obligan a producir clases genéricas y multipropósito. Las fuerzas revolucionarias de nuestro proyecto nos obligan a terminar y cumplir con el objetivo del proyecto lo antes posible. Conseguir una solución diplómatíca y en equilibrio de estas dos fuerzas antagónicas es nuestro trabajo y no lo debemos perder de vista
  • Las instrucciones deben ser colocadas en el lugar correcto. Si están en medio de declaraciones de variables deben ser remarcadas con un comentario. Las declaraciones deben ser retrasadas al máximo para ayudar al compilador a optimizar pero esto no debe comprometer la claridad del código. Una vez más hay dos directivas contradictorias aquí y es nuestra tarea colocarlas en equilibrio.
  • No hay variables inofensivas.