July 2008 - Posts
Hace unas semanas ethernet publicó este meme en su blog y me puso en la lista, así que aquí van las respuestas :)
Cuántos años tenías cuando empezate a programar
Unos 14-15 años.
Cómo empezaste a programar
Como me pasaba todo el día pegado al PC de un amigo (un 386) mis padres me apuntaron a una academia de informática donde me enseñaron hicieron copiar programas de Basic. Como no aprendía nada de nada me cambiaron a otra donde sí que aprendí Basic y un poco de C (y Wordperfect O_o).
Cual fue el primer lenguaje que usaste
Basic y unos meses después C. Y el último año de bachillerato mucho Div Games Studio :)
Cual fue el primer programa real que programaste
Un curso de aprender C en C :p (mi proyecto de fin de academia). Luego matamarcianos y cosas así con Div.
Cual fue tu primera experiencia profesional
Pues fue bastante tardía la verdad: las prácticas de empresa en HP. Hice algunas cosas antes con la Fundación de Ayuda contra la Drogadicción y Juvenalia pero tuvieron muy poco de programación.
Si tú hubieras sabido lo que sabes ahora cuando empezaste a programar, ¿hubieras empezado a hacerlo?
Sí. Me encanta desarrollar software, me parece un reto muy entretenido y la verdad que no me arrepiento de la ruta que tome para mi vida en este aspecto.
Si tuvieras que decir una sola cosa de las que has aprendido a lo largo de los años a un nuevo programador, qué le dirías
No reinventes la rueda por favoooooor.
Qué es lo más divertido que has programado?
La librería de IA de Jad Engine. En particular la parte de algoritmos genéticos a la que di muchas vueltas y que creo que ha quedado bastante bien (aunque su utilidad para juegos sea muy discutible :p).
A quién le pasas el meme
A todos los demás coders que hay en Kartones.net (en particular a Kartones, flipper y Pedrito que les conozco más, pero vamos, va para todos ;)).
Hace un par de semanas por fin migramos Jade y Pluto de VS2005 a VS2008. Llevábamos bastante tiempo queriendo hacerlo pero muchas de las características del Framework 3.5 aún no estaban soportadas en Mono así que no nos decidíamos. Pero coincidiendo con el movimiento de Codeplex a Assembla y viendo que Mono 1.9 ya sí que soporta casi todo lo nuevo (excepto LINQ to SQL que no creo que usemos en la vida) decidimos migrar las soluciones a VS2008.
El migrarnos a 2008 tiene varias ventajas:
- El VS2008 funciona mucho mejor en Windows Vista que el VS2005.
- Podemos aprovechar las nuevas características del lenguaje (propiedades automáticas, métodos extensionales, expresiones lambda, LINQ to Objects,...) y las nuevas clases que se han añadido al Framework (HashSet,...).
- Con el SP1 tendremos un nuevo compilador que optimiza mejor los tipos por valor.
Las dos primeras ventajas son interesantes pero no son de vida o muerte. En cambio la tercera si que se merece unas líneas extra. Actualmente el compilador del Framework es incapaz de optimizar funciones que tengan en su firma un tipo por valor. Por ejemplo, si Vector3 es una estructura, no se podría optimizar esta función:
1: public static Vector3 operator +(Vector3 left, Vector3 right)
2: {
3: return new Vector3(left.X + right.X, left.Y + right.Y, left.Z + right.Z);
4: }
No poder optimizar significa:
- No se puede hacer un inline de la función.
- Como hay que realizar la llamada, y los tipos son por valor, hay que copiarlos.
Esto es lentísimo y la función sumar vectores (o cualquier otra operación matemática) es imprescindible para un motor 3D. Hasta ahora para solucionar este problema había que hacerse una función como esta (en XNA existe este mismo problema y se utiliza esta misma solución):
1: public static void Add(ref Vector3 value1, ref Vector3 value2, out Vector3 value)
2: {
3: value.X = value1.X + value2.X;
4: value.Y = value1.Y + value2.Y;
5: value.Z = value1.Z + value2.Z;
6: }
Donde los valores y el resultado van todos por referencia, con lo cual hay que pagar el coste de llamar a la función pero al menos no hay que copiar las estructuras. Pero el problema de funciones de este estilo es que escribir código matemático es horrendo. Por ejemplo:
1: public override Vector3 Calculate()
2: {
3: Vector3 result = Vector3.Zero;
4:
5: foreach (IMovableEntity target in _targets)
6: {
7: Vector3 targetPos = target.Position;
8: Vector3 ownPos = Owner.Position;
9: Vector3 direction = Vector3.Subtract(ref ownPos, ref targetPos);
10:
11: Vector3 desiredSpeed = Vector3.Multiply(ref direction, Owner.MaximumSpeed);
12:
13: Vector3 ownVel = Owner.Velocity;
14: Vector3 difference = Vector3.Subtract(ref desiredSpeed, ref ownVel);
15:
16: result = Vector3.Add(ref result, ref difference);
17: }
18:
19: return result;
20: }
Ese código deberían ser 4 operaciones encadenadas, pero como no podemos usar los operadores +,-,*,... hace falta utilizar un montón de valores temporales (y además es feo de leer de narices).
Hace poco Reed hizo benchmarks con el nuevo compilador del Framework 3.5 SP1 Beta usando los operadores y las llamadas se optimizan correctamente, con lo que ahora usar +,-,... es más rápido (porque se hace el inline) y además el código es mucho más cómodo de leer. Así que ahora iremos cambiando el código de Jade para que utilice los operadores matemáticos.
El primer mensaje en español del blog no va a estar relacionado con Jade :) Como puede que sepáis algunos de los que leeis estas líneas, además de Jade intento dar durante el año charlas sobre XNA e IA (sobre todo en universidades) y participar en los foros del tema que puedo (desgraciadamente el tiempo es finito).
Por estas cosas (y alguna otra más), a partir de hoy soy Microsoft MVP de XNA/DirectX :) La verdad que me ha hecho muchísima ilusión recibir el MVP (el año pasado también me nominaron pero no hubo suerte). Ahora tendré que seguir dándole caña a ambos temas y no dormirme en los laureles :)
Y poco más, solo mandar un agradecimiento a toda la gente que me ha apoyado en esta aventura, ¡muchas gracias!