Alba on Tech

Talking about technology

Comic Magic Reader

Una de las mejores cosas que tiene Kaleidos son las PI WEEKs (Personal Innovation Week). Se trata de una idea original nuestra, que consiste en permitir a los empleados de las diferentes empresas que participan dejar de lado su trabajo del día a día, y dedicar una semana a proyectos personales. Como resultado de la PIWEEK de diciembre del 2013, y de un montón de horas adicionales, estoy muy contento de tener por fin mi primer proyecto en Google Play: Mi lector de comics Comic Magic Reader.

Imagen

Continue reading

14 January, 2014 Posted by | Uncategorized | | 1 Comment

Kata: Intercambio de variables

Es de sobra conocido el mito de que las personas ciegas agudizan el resto de sentidos para compensar su ceguera. En realidad, el resto de sus sentidos no están más agudizados. Simplemente, les prestan mayor atención, trabajan más con ellos, y los exprimen al máximo. Eso mismo ocurre en muchos aspectos de la vida. Cuando tenemos una carencia, optimizamos los recursos que tenemos. En nuestra profesión nos encontramos con carencias con frecuencia: consumo de memoria, velocidad de procesador, transmisión de datos… Hay muchos aspectos que pueden provocar un problema, y nos vemos forzados con frecuencia a utilizar el ingenio para solventarlos. Un ejemplo que me gusta mucho es este artículo: 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond, donde explican como solventaron los problemas de sincronización del juego Age of Empires frente a las carencias de red. Es largo, pero merece la pena, os lo recomiendo.

Así que, para aguzar un poco nuestro ingenio, os propongo una Kata con una carencia artificial. Es un problema clásico, así que puede que ya lo conozcáis. Se trata de intercambiar dos variables. Lo habitual es hacer esto de la siguiente forma:

a = 2
b = 3
temp = a
a = b
b = temp

Lo que os propongo es que penséis la forma de conseguir esto mismo, pero sin usar ninguna variable adicional. En los comentarios pondré las dos soluciones que conozco, pero seguro que hay más. ¿Se te ocurre alguna?

Y recuerda, no se trata de un concurso. Se trata de una kata. Practica y mejora. Siempre

22 October, 2013 Posted by | Kata | 3 Comments

Soy un ingeniero, no un artesano

Últimamente está muy de moda la expresión “artesano de software”. Desde la primera vez que la leí, esa expresión me chirrió. Entiendo que es una idea romántica, que suena bien, y se refiere a la parte del cuidado y el cariño que ponen los artesanos en su trabajo. No obstante, creo que hay algo fundamentalmente erróneo en ese concepto.

Según la wikipedia, artesanía se refiere al trabajo del artesano (normalmente realizado de forma manual por una persona sin el auxilio de maquinaria o automatizaciones). Dejando de lado el oxímoron de hacer software sin maquinaria, quiero centrarme en la parte de automatizaciones.

Salvo en raras ocasiones, los proyectos grandes los abordo utilizando un framework de desarrollo. En Kaleidos usamos principalmente python/django y groovy/grails. Obviamente, utilizamos cientos de bibliotecas de software que nos proporcionan piezas comunes, como envío de mails, abstracciones de la base de datos, o comunicaciones remotas. Además, seguimos convenciones de código, para crear un resultado lo más mantenible y uniforme posible. Por supuesto, utilizamos un sistema de control de versiones distribuido, git, con un protocolo de ramas que nos permite trabajar en paralelo con máxima eficiencia. Ni que decir tiene que somos grandes defensores de los test automáticos, de forma que nuestros proyectos rebosan de test unitarios y de integración. Eso nos lleva al uso de herramientas de integración continua, como Jenkins, que no sólo se encarga de pasar los tests en las diferentes ramas, sino que incluso realiza despliegues automáticos a preproducción.

Claramente, ¡las automatizaciones son básicas para el desarrollo de software de calidad!. Permiten no sólo ser muchísimo más eficiente, sino, y esto es lo más importante, ser consistente en el desarrollo. Y eso lleva a una calidad claramente superior. Hace el código mantenible, legible, y permite el trabajo en equipo.

¿Sabéis cómo se llama al proceso de creación, perfeccionamiento e implementación de estructuras para la resolución de problemas? Ingeniería.

Estoy muy orgulloso de todas las automatizaciones que utilizo al desarrollar software. Y siempre estoy en el proceso de mejorar aún más el sistema. Y por supuesto, le pongo mucho cariño y cuidado a lo que hago. Pero el cariño y el cuidado por sí solos no bastan. Hay que hacer las cosas bien. Hay que tener procesos claros, y estar siempre dispuestos a refactorizarlos y mejorarlos. Hay que automatizar las tareas para mejorar la calidad. Hay que ser ingenieros1.

Así que lo digo convencido: Soy un ingeniero, no un artesano.

 

 

 

(1) Disclaimer: Estoy hablando de la forma de trabajar y abordar los problemas, no de titulaciones. Conozco gente que ha estudiado módulos de FP y son magníficos ingenieros, y gente con titulación superior en informática a los que no les dejaría acercarse a un teclado.

10 October, 2013 Posted by | Software | 5 Comments

Kata: Media inversa

Todo el mundo sabe hacer una media. Es uno de los primeros ejercicios de programación que se hacen. Pero en un caso real he tenido que calcular una media inversa, y me ha parecido muy interesante para plantearlo aquí como kata.
Continue reading

25 June, 2012 Posted by | Kata, Programación | 17 Comments

Un scriptillo para renombrar subtítulos

Una de las formas más agradables de aprender inglés es viendo series en inglés. Y como reconozco que mi oido no es lo bueno que debería ser, me apoyo en subtítulos (también en inglés). Pero para que el reproductor muestre el subtítulo adecuado, tanto el archivo de vídeo como el de subtítulos deben tener el mismo nombre, con distinta extensión.
Continue reading

2 June, 2012 Posted by | Programación | Leave a comment

Kata: Ordenar un array ¡sin bibliotecas ni internet!

Hoy en día estamos muy acostumbrados a contar con infinidad de bibliotecas que nos ofrecen soluciones a muchos de los problemas de programación más comunes. Esto es algo maravilloso, que permite centrar el desarrollo en los problemas específicos de una aplicación, y no tener que reinventar la rueda. Pero ¿por culpa de estas facilidades hemos olvidado cómo hacer las cosas nosotros mismos?.
Continue reading

23 February, 2012 Posted by | Kata, Programación | 8 Comments

Kata: Conoce tu lenguaje: Excepciones

Voy a proponeros una Kata, pero antes tengo que poner el contexto.

Una de las cosas más importantes para escribir código eficiente, es conocer bien el lenguaje que estamos utilizando. Esto parece muy obvio, pero no lo es tanto. Hay normativas de codificación que se dan por supuestas, y no necesariamente son iguales en todos los lenguajes.

Un ejemplo de esto es el tema de las excepciones. No voy a hablar de la horrible práctica de los catch vacíos. Voy a hablar de eficiencia.

Continue reading

20 January, 2012 Posted by | Kata, Programación | 1 Comment

Weather Prophet

Esta semana en Kaleidos ha sido la Π Week (Personal Innovation Week). Hemos estado “cerrados por innovación”: hemos presentado ideas de proyectos personales, nos hemos dividido por equipos, y hemos dedicado toda la semana de forma intensiva para conseguir una implementación funcional de 5 nuevos proyectos. Y nos lo hemos pasado genial.

Yo fui uno de los que presentaron una idea de proyecto, y conseguí convencer a suficiente gente para montar un equipo de desarrollo muy potente. Se trata de una idea que implementé de manera rápida y sucia, y he tenido la oportunidad de tenerla bien hecha. A pesar de algunos problemas tecnológicos importantes (digan lo que digan, Grails 2.0.0 NO es estable), estoy muy contento de anunciar la salida (en beta) de Weather Prophet.

Continue reading

21 December, 2011 Posted by | Uncategorized | Leave a comment

Kata: add arrays

Now in english, thanks to Pablo Ruiz :)

Let’s start with something simple to loosen up the muscles.

Many times, when we code with a deadline and we need to solve problems with urge we don’t pay attention to performance. At most, we promise to refactorize later on if needed. It would be great to have some coding ruotines embedded in ourselves that will allow us to code in a more efficient way, without even thinking of it.

So the kata I’m proposing is the following:

We have ten large arrays, with 500 integers each. We want to obtain the number that results from adding each of those 10*500=5000 integers. Easy, right?

Choose your favourite programming language and think about two distinct ways of reaching that sum. For instance, you can sum each array separately and then add up the results. Or you can do partial sums between each array’s position. Or blend all arrays in one and then add up all the numbers. Or whichever way that comes to your mind (a recursive function would make sense?). Implement them.

Now, using a loop, measure the time it takes to execute 1000 iterations of each of them.

What are the results? The way you thought was the fastest, was it? Really?

Bonus I: Upon results, do you conceive a third way that could outmatch the performance?

Bonus II: Repeat the exercise in a language you’ve never coded in.

And remember, this isn’t about a competition. It’s a Kata. Practice and improve. Always.

30 October, 2011 Posted by | Kata | | Leave a comment

Kata: Sumar arrays

Empecemos con algo sencillo, para desentumecer los músculos.

Muchas veces, cuando programamos con una fecha límite, y tenemos que resolver los problemas con prisa, no nos preocupamos por el rendimiento. Como mucho, pensamos en refactorizar más adelante si hace falta. Sería muy bueno tener integradas ciertas rutinas de programación que nos permitan programar de forma más eficiente sin pensarlo.

A si que la kata que propongo es la siguiente:

Tenemos diez arrays largos, de 500 enteros cada uno.  Queremos obtener el número que obtenemos al sumar cada uno de esos 10*500=5000 enteros. Sencillo, ¿verdad?

Elige tu lenguaje de programación preferido. Y piensa dos formas distintas de obtener la suma. Por ejemplo, puedes sumar cada uno de los arrays por separado, y luego sumar los resultados. O puedes hacer sumas parciales de cada una de las posiciones de los arrays. O fundir los arrays en uno, y luego sumar todos los números. O cualquier otra forma que se te ocurra (¿una funcion recursiva tendría sentido?). Implementalas.

Ahora, mediante un bucle,  mide el tiempo que tarda en ejecutarse 1000 veces cada una de ellas.

¿Cuales son los resultados? ¿La forma que pensabas que sería más rápida, lo era de verdad?

Bonus I: A la vista de los resultados, ¿se te ocurre una tercera forma capaz de conseguir un mejor rendimiento?

Bonus II: Repite el ejercicio en un lenguaje en el que nunca hayas programado

Y recuerda,  no se trata de un concurso. Se trata de una kata. Practica y mejora. Siempre

27 October, 2011 Posted by | Kata | 6 Comments

Follow

Get every new post delivered to your Inbox.

Join 286 other followers