Blogia
Desarrollo de Software y formación en Zaragoza

El proyecto DNDZGZ visto desde fuera (desafío abredatos)

El proyecto DNDZGZ visto desde fuera (desafío abredatos)

Se ha escrito bastante ya sobre el desafío abredatos y sobre el equipo maño que ha participado: dndzgz (Dónde en Zaragoza)

A mi me gustaría entrar en la vertiente técnica (manteniendo el post "todos los públicos") y hacerlo desde fuera, ya que Daniel y Alberto nos han contado muchas cosas desde dentro.

1) Primeras impresiones, introducción

Estaba muy interesado en conocer el código asociado a un proyecto que se concibe y ejecuta en 48 horas por un equipo en el que apenas se conocen sus miembros.

Detrás de este proyecto había buenos profesionales, pero sinceramente, esperaba encontrar eventualmente "spaghetti code", "hacks" buscando atajos rápidos para solucionar problemas complejos (recordemos: sólo 48 horas - un exigente "deadline" que cumplir, sueño acumulado, muchas horas de programación seguidas, nulo trabajo en equipo anterior), etc..

Mi sorpresa fue agradable al encontrar en el repositorio de código público  (el código está disponible para descarga y revisión)

  • Una elección de plataforma tecnológica innovadora y muy adecuada para el desafío (bueno, esto ya lo conocía "a priori")
  • Una elección de lenguaje de servidor muy acertada: Python
  • Una ejecución realmente concisa, elegante y brillante

2) Apuesta tecnológica: AppEngine

AppEngine, de Google, es una plataforma de desarrollo que permite al programador abstraerse del trabajo asociado a poner un proyecto web en marcha (instalación, configuración de base de datos, etc), y del asociado a su crecimiento (Google te garantiza escalabilidad de forma transparente) y centrarse en el desarrollo (por ahora limitado a los lenguajes Java y Python).

AppEngine gestiona de manera transparente la escalabilidad del proyecto en un entorno distribuido. Perfecto para un desafío de 48 horas, donde no puedes perder el tiempo con la configuración de los servidores ni con la puesta en marcha!!

3) Python, lenguaje de programación utilizado en el "backend" (el servidor)

Usando AppEngine puedes elegir dos lenguajes de programación: Java y Python. Dani y Alberto son "javeros", así que os podéis imaginar el lenguaje que usaron.... pues.. eligieron Python!!.

Eso dice mucho y muy bien de ellos. Python es un lenguaje muy conciso y potente en el que "cunde mucho la faena" (se hace mucho en pocas líneas de código) y es excelente para obtención y tratamiento de cadenas de texto y recursos remotos accesibles por HTTP (URLS).

Con Python, obtener una URL de Bizi y obtener el conjunto de datos deseado mediante "scrapping" se convierte en una tarea de unas pocas líneas de código. Ejemplo extraído de Dndzgz (perdonad que el formato haga que no encaje correctamente en el blog):

class FecthBizi(BaseHandler): 
def get(self):
response = urlfetch.fetch(’http://www.bizizaragoza.com/localizaciones/station_map.php’).content
self.response.headers[’Content-Type’] = ’text/plain’
response = response.replace(’r’, ’ ’)
response = response.replace(’n’, ’ ’)
response = response.replace(’t’, ’ ’)
regex = ’GLatLng((-?d+.d+),(-?d+.d+).+?idStation="+(d+)+"&addressnew=([a-zA-Z0-9]+)’
matchobjects = re.finditer(regex, response)
result = []
import base64
for match in matchobjects:
s = match.group(4)
result.append({"name": base64.decodestring(s + ’=’ * (4 - len(s) % 4)),
"lat": float(match.group(1)),
"lon": float(match.group(2)),
"id": match.group(3)})

self.create_service("bizi", result)

4) Un impecable trabajo de cliente: jQTouch, jQuery, HTML5, CSS

Una vez que los datos son recuperados mediante el acceso a las diferentes URLS y limpiados ("scrapping"), estos datos están ya preparados para ser "digeridos" por la aplicación ya en el entorno local. 

Daniel y Alberto usaron jQTouch para crear el interfaz de usuario de manera que de la impresión de que la aplicación se comporta como una "aplicación nativa" (es decir, desarrollada específicamente para cada terminal), aunque no haya sido así (por cierto, en este momento me consta que se está trabajando en versiones nativas para Android y iPhone)

A destacar el uso de una base de datos local (localStorage) utilizando la potencia de HTML 5 para guardar los favoritos. Más información sobre "Web SQL Database" en el blog de Daniel Latorre: http://www.danilat.com/weblog/2010/05/18/sql-con-javascript-web-sql-database/

Notas finales

Creo que dndzgz, tanto por su abordaje innovador (arquitectura distribuida autogestionada - App Engine, la "nube" de Google), como por su brillante ejecución (código conciso, eficiente, elegante), es un proyecto a ser utilizado como ejemplo en talleres de desarrollo de aplicaciones  basadas en consumo de servicios, geoposicionadas y orientadas a dispositivos móviles.

Es brillante lo que este equipo ha conseguido en tan poco tiempo y con tan sólo unos pocos Kbytes de código.

Este proyecto, prueba una afirmación que defiendo profundamente:

"In our field, the top 1 percent of the work force can easily be 10 times as productive as the average developer. The best developers invent new products, figure out shortcuts that save months of work, and, when there are no shortcuts, plow through coding tasks like a monster truck at a tea party" Joel Spolsky - Artículo completo

Por supuesto, aunque quede fuera de este humilde mini-análisis técnico quiero destacar también el  brillante trabajo de Diseño y Marketing de Mamen y Lucas (respectivamente).

Referencias

3 comentarios

ivan -

Hola belano,

No lo sé, simplemente es un hecho.

Tampoco es todo blanco o negro. Habrá muy poquitos de esos "Van Gogh" y también muy pocos que aportan productividad negativa.

En el medio estamos casi todos, en una entretenida escala tonal de grises. Es lo bonito (y a veces triste) de esta profesión.

El corolario yo creo es identificar, retener y compensar a esos poquitos, que no abundan, más que "tener que hacer algo" con el resto.

belano -

Hola, estoy de acuerdo con la afirmación de Spolsky pero me resulta un tanto deprimente... qúe hacemos entonces el 99% restante de desarrolladores mediocres??
Saludos!