12.09.2011

Lejos

Me llama mi madre o mi hermano y después del típico "qué tal estás" muchas veces ya no tengo mucho más que decirles y lo que es peor, ellos tampoco saben que decirme. A veces mi madre hace el esfuerzo de preguntarme, en vano, qué es lo que hago en el trabajo, imagino que en un intento de hablar conmigo algo más de los 30 segundos que dura el qué tal estás. Estoy acostumbrado a tratar con máquinas y con personas que normalmente solo hablan con máquinas y me pregunto si no estaré tan acostumbrado que he olvidado que el resto de humanos no son así.

10.17.2011

El síndrome del repetidor

El primer mes de carrera fue bastante confuso, imagino que igual que para el resto de personas, gente nueva, la primera vez que salía de casa, el acojone de estar solo ante el peligro... ya sabéis. Las clases empiezan, te juntas más o menos con los que parecen que son como tú y 1 semana después ya tienes posiblemente el círculo de personas que configuren tus próximos 3/5 años.

Entre esos posiblemente hay algún repetidor, buen chaval él, al que escuchas con cierto interés ya que él sabe todos los trucos, ya sabes, asignaturas chungas, profesores majos, los hijos de la gran putísima (ahora me doy cuenta que muchos de aquellos no eran más que unos inútiles)

Algunas de las cosas que a mi me dijo aquel chaval fue: "esta asignatura es _imposible_ aprobarla sin ir a la academia" o "es imposible ir a curso por año". Por aquel entonces ni tenía dinero para pagar la academia -suficiente apretada estaba ya mi familia como para apoquinar otro poquito más al mes- y lo que más me jodía, que alguien me dijese que "eso era imposible". Aquel día se me hincho la vena y enrabietado para mis a adentros me dije "y por qué esto no va a ser posible?". 

Fue posible.

Así que cuando algún "repetidor" llegue y te diga que algo es imposible, tómatelo como algo más a anotar en la lista de cosas a tener no muy en cuenta. Eso sí, no piensas que no te va a costar trabajo.


5.21.2011

Por qué deberías contratar a gente que tenga proyectos opensource

Podemos recrearnos en lo bonito que es el opensource, qué comunidad más interesante, la filosofía, blablabla, las sinergias colaborativas que provoca ... y demás palabras que tanto nos gustan, pero la realidad es que si un desarrollador tiene proyectos de código abierto lo más probable es que sepa un poco de todas estas cosas:

- Lo importante de escribir documentación. No hablo de esa documentación que todos esperamos, no de esa que se genera a partir del código, ni de esa que va encuadernada de 200 páginas con imágenes obsoletas. Hablo de ese README donde están los primeros pasos para empezar con el proyecto. Aquí es donde vendes tu producto. Recomiendo una charla muy buena de jacob kalplan-moss, writting great documentation. De hecho creo que uno de los grandes éxitos de github es tener una portada de proyecto con el README renderizado desde un fichero de texto.

- Cerrar código: un código cerrado no es lo mismo que un código terminado. El típico caso de "no, es que tienes que poner el fichero XXXX.cnf en tal ruta, habilitar el puerto serie, ejecutar tal demonio, cambiar config.h y ya"

- Lo importante de testear. Si una persona quiere aportar a tu proyecto y no hay tests no podrá estar seguro de cada cambio que haga.

- Enseñar tu código te obliga a hacer las cosas lo mejor que puedes, o por lo menos no pasar por alto esas situaciones de "ya lo haré bien". Si tu quickstart son 10 comandos algo no va bien, no?

- Trabajar en un entorno distribuído. Cuando me bajo y uso jquery no tengo a john resig en la mesa de al lado, así que me las tengo que apañar como pueda para solucionar mis problemas. De la misma forma otros no me tendrán a su lado cuando empiecen a usar tus proyectos y la mejor forma de hacer esto es dejar las cosas bien (esto tiene mucho que ver con los anteriores puntos).

- "Compartir es vivir". Si tu desarrollador libera código habrá entendido que compartir es bueno para los demás y para él mismo.

Por tanto, haz que tu empresa libere código y haz que el funcionamiento interno se parezca lo más posible al sistema open source. Ya sabes, empieza por hacer que crear un repositorio y un tracker sea tan simple como en github/bitbucket y da alas a tus empleados a que suban allí su código.

4.27.2011

Ejercicio para gente que no desarrolla

Este es un ejercicio para que lo realicen a modo de prueba la gente relacionada con el desarrollo de software pero que no desarrollen. No te llevará ni un minuto. Asegúrate que estás solo y sin distracciones.

Pasos:

1.- plantea una suma de dos números de 10 cifras, en una hoja de papel, como lo hacíamos cuando estábamos en el colegio

2.- hazla con tranquilidad, cronometrándote. Cuando termines, anota el tiempo

Te planteo ahora dos retos:

Reto 1: Ahora plantea otra suma, pero entre columna y columna que sumas, cuenta de 1 a 5. Cronometrate y compara con el tiempo anterior

Reto 2: Plantea ahora dos sumas de números de 10 cifras. Haz las dos sumas, pero salta de una suma a otra cada 2 columnas. Al igual que antes cronometrate.

Reto Bonus: Planteate otra suma y dile a alguien que cada dos números te haga una pregunta simple, por ejemplo, tu numbre, apellido, calle donde vives o número de DNI.

Y este post no tiene nada que ver con las sumas :)

4.08.2011

whitebrd.me - detalles técnicos

El pasado fin de semana (primero de abril del 2011 por si lees esto en un futuro lejano) organizamos alltogethernow, un encuentro de un fin de semana para hacer una aplicación en 48 horas. La aplicación que hicimos nosotros (@flopezluis y yo)fue whitebrd.me, una pizarra compartida en tiempo real. Voy a dar una pinceladas de los detalles técnicos y un pequeño post-morten después de 1 semana funcionando.

Para empezar optamos por usar toda la tecnología del servidor asíncrona. Pensarás que lo hicimos porque es lo que mola, ahora lo asíncrono está en todos lados, si no tienes algo asíncrono no puedes montar algo como dios manda... si toda la gente que se le llena la boca con "asíncrono" hubiese leído la famosa (en mi época) "beej's socket guide"... :).

El caso es que tornado, un pequeño framework web creado por friendfeed (después comprada por facebook) y ahora matenido por facebook, hizo las veces de servidor web y redis como sistema de persistencia. La elección de redis fue por dos razónes. La primera por hypearnos a más no poder y la segunda es que permite escribir muy rápido, tiene funcionalidad de publisher/sibscriber y un sistema de VM que encaja muy bien (luego veremos cómo). Para rematar usamos nginx como frontend. Se puede ser más asíncrono? :)

La razón para usar asíncrono realmente es muy sencilla: es una aplicación con MUY poca carga de CPU y mucha E/S, así que el paradigma encaja perfectamente.

En la parte de cliente usamos websockets para enviar todos los comandos y canvas para dibujar. Es una tecnología novedosa, así que sabíamos que muchos navegadores no lo soportarían (FF4 lo tiene desactivado por defecto, primer #FAIL).

Manos a la obra, nos pusimos y en 48 horas teníamos el código en cuestión. Más que comentar el código, prefiero centrarme en las cosas que han pasado en estos días y algunas conclusiones técnicas que he sacado.

- El segundo día a la gente de github les dio por poner un enlace en su blog. No sé cual será el tráfico de ese blog, pero en el nuestro generó 4.5Gb de tráfico en 12 horas. Iluso de mi, no había activado la memoria virtual en redis, de forma que redis no podía tirar a disco las pizarras ya no usadas (se almacenan todos los comandos que genera una pizarra), así que empezó a "swapear" como un demonio. Suerte que teníamos el deploy automático, así que la activé rápido y medio solucionado. Finalmente la clave que almacenaba esa pizarra terminó con más de 20mb de datos. He tenido que eliminarla porque el VPS de 256mb no da para mucho más :). La CPU de la máquina no pasó de un 8%.

- tornado funciona excepcionalmente bien, además de ser un framework muy interesante para cosas "sencillas" (no tiene ORM por ejemplo) es realmente rápido. Además el nucleo es fácil de entender y está bien documentado. Podríamos haber optado por twisted, gevent o algún otro sistema asíncrono en python.

- tratamos de usar el mecanismo pub/sub de redis, pero la librería asíncrona cliente redis para python es completamente inestable, así que terminamos por implementar lo misma funcionalidad en una pequeña clase . Moraleja: a veces la solución más simple es la mejor.

- no conocía redis, pero es realmente un descubrimiento. Funciona muy bien: el setup es muy rápido, prácticamente configuración 0, la integración con los tipos de python buena y además rápida. El model de memoria virtual encaja muy bien ya que si es necesaria más memoria las claves que no se usan las vuelca a disco, de forma que todas las pizarras que ya no se usan no están malgastando los 256mb memoria.

Ahora mismo hay más de 1000 pizarras creadas y la mayoría de ellas tienen dibujos de aparatos reproductores masculinos :)




2.01.2011

Montar una empresa, desde cero

Resumen: haz algo y véndelo (no lo regales)

Hace ya unos años que vengo leyendo y escuchando que lo de montar una empresa de base tecnológica en España es una utopía, que si no dan dinero, que si el papeleo, la burocracia, los socios, la competencia y la madre que lo parió.

Bien, pongamos que vas a montar una empresa de tecnología y vas a vender un producto o servicio. Partamos de dos supuestos:

1) No estás trabajando y nunca has trabajado: El primer paso es que te dejes de leer esto, busques un trabajo y veas de que va. Quizás no sea necesario, pero yo lo recomiendo. Sobretodo, si eres técnico, no te fijes en lo que hacen tus compañeros técnicos, fíjate en los comerciales, gerentes y otros que salen a vender el pescado.

2) Estás trabajando y/o tienes experiencia: se supone que ganas un salario y que además sabes de que va lo de trabajar: momentos duros, horas, esfuerzo, dolores de espalda, el sueldo de final de mes, las retenciones, la SS, los compañeros, jefes, comerciales, etc.

primer tópico: Nadie me va a dar 200k€ que necesito para levantar mi empresa. Ya, no has pensado que antes de correr tienes que aprender a andar? Realmente necesitas 200k€ para probar? Tranquilo, cuando factures un poco y la gente vea que funciones vendrán a ofrecerte dinero, palabra. Agroguía lo empezamos con 400€, para comprar un equipo con el que hacer demostraciones y para imprimir unos carteles y pegarlos por los pueblos usando el coche del padre de novia.

segundo tópico: Mi trabajo no me deja tiempo. Bien, trabaja a media jornada (vive con menos dinero) y usa tu tiempo libre para desarrollar tu producto/servicio. Lee el post de Martín Pérez sobre el emprender full time. Yo desarrollé agroguía terminando el PFC y trabajando a media jornada.

Te pones a desarrollar tu negocio, piensas que puede haber un buen hueco donde vender tu producto y lo haces. Posiblemente no sepas muchas cosas y dudarás, no pasa nada, vete a hablar con un posible cliente, o dos, o tres... y preguntale qué necesita. Te vas a sorprender de lo amable que es la gente cuando le preguntas por un tema que le interesa. Sí, lo mismo necesitas quedar con él en horario laboral y tengas que pedirte un día de vacaciones en tu trabajo. Regalale tu producto en agradecimiento (pero luego cobra por él eh?), si confías en tí no hay porque tener miedo. Nadie dijo que no llevase esfuerzo. Lo mismo te da vergüenza, tienes miedo o "yo es que no soy comercial". Si es así olvida montar algo, dejalo para cuando tengas más experiencia.

Lo desarrollas (aquí pueden pasar meses, tú sabrás, se supone que es tu fuerte ¿no?) y te pones a venderlo. Pero tienes que ser realista, debes centrarte mucho en algo concreto y pequeño. Tienes poco tiempo y por muy bueno que seas los milagros no existen.

tercer tópico: Para vender y facturar necesito tener una base legal, una empresa y me han dicho que en España se tardan un montón de meses y se necesita mucho dinero para montar algo. Mentira, para facturar con ser autónomo (y con menos) tienes suficiente. Son 200 y pico € al mes de seguridad social, tienes que hacer el IVA cada trimestre y la declaración de la renta como todos los años. En un día tienes todo el papeleo hecho. Lo normal es que hables con una gestoría que te lleve los papeles, no es caro. Si piensas que una gestoría es cara, olvidate de montar el negocio.
Hazte ver, ya sea haciendo una web y dando la chapa en un foro, poniendo carteles en la tiendas o lugares donde tus clientes pasan, por twitter, por facebook, cara a cara... te sorprenderías de lo amable que es la gente y lo que te ayuda. Nosotros hemos ido a cooperativas y tiendas para agricultores y NUNCA nos han negado poner un cartel o publicidad, todo lo contrario, cuando la gente ve que necesitas ayuda, te ayuda, y mucho. Vendete como puedas.

Pongamos que haces el primer cliente, de potra, porque de vender no tienes ni idea. Tu producto será posiblemente no demasiado bueno, pero la persona ha confiado en tí, no le falles.

cuarto tópico: es que soy técnico y no sé nada de marketing, ni comercial, ni nada. Necesito tener empleados/socios que sean comerciales, de marketing o lo que sea. Está claro que contar con gente que sepa de su campo está muy bien, pero haz tú esos roles. Aprenderás muchas cosas que necesitas saber.
Ahora es cuando empieza lo duro. Tu cliente te necesitará, tendrá problemas, tendrás que esforzarte, pero si lo haces obtendrás lo que necesitas
1) feedback con muy buenas ideas para seguir desarrollando tu negocio y seguir vendiendo
2) Ese cliente, si está contento, será tu mejor comercial

Y preparate para recibir ostias por doquier, preparate para trabajar mucho, para tener el sentimiento de que estás fallando, de que esto es una mierda, de "qué bien estaba yo trabajando por cuenta ajena", de que echas un montón de horas, etc.

Eso sí, el momento en el que un cliente usa algo que tú has creado, y le es útil, te recomienda y te llama para felicitarte. Aún recuerdo cuando me llamaron la primera vez para felicitarme porque se había ahorrado una verdadera pasta en simiente por usar mi producto, cuando otros que admiras te reconocen, ganas premios, cuando te sacan en el periódico o en TVE y te llama tu tío de Bilbao con lágrimas en los ojos para decirte que te ha visto o creas pequeños side-projects. Sientes el proyecto como tuyo, eso no se paga con una nómina.

Bien, ahora haces una serie de clientes, facturas una cantidad que hace que merezca la pena. Quizás ahora es cuando puedas dejar de trabajar y ponerte full-time, buscar comerciales, socios, inversores para irte a una oficina en condiciones, o simplemente mantenerte ahí y hacer lo que te venga en gana. Nadie dijo que tuvieses que crecer (yo sigo trabajando full-time para una empresa, soy un cobarde :)

Si crees que teniendo un montón de pasta de capital riesgo va a ser más fácil, lo llevas claro: los vas a tener con el aliento en tu cogote y desde luego el resto de cosas las tendrás que hacer, aunque eso sí, con la seguridad de tu nómina al final de mes y una tarjeta de visita estupenda donde pondrá que eres CEO de uberspainsoft S.L. Todo tiene sus ventajas, no digo que no sea una buena idea. Seguramente si quieres montar algo con cierta entidad o equipación cara necesites cierta pasta para empezar.

En resumen: tiempo, esfuerzo y dinero, si no tienes dinero, ya sabes qué opciones te quedan. Déjate llevar, lanza algo aunque sea pequeño y verás como crece o falla mientras aprendes. Seguramente no lo hagas todo bien, nadie nace aprendido, así que no pasa nada.

Qué lo que te he contado es cutre, poco profesional o poco serio. Es una forma, seguro que hay otras muchas mejores :)

Cosas que te pueden interesar:
- Linking paths sobre bootstraping.
- Datos de un pequeño negocio: lo que facturamos en agroguía
- devilishgames, una empresa que hace juegos en flash. Son un verdadero ejemplo, llevan la tira de años trabajando, al principio haciendo juegos gratis, pero poco a poco, con trabajo muy duro se están haciendo un hueco entre los mejores. Otra por el estilo es LemonTeam o Cokidoo con equipos de gente con mucho talento y trabajo duro.
- Hay muchos ejemplos interesantes, por ejemplo ukecosas, marcelino llano con sus servicios de desarrollo de producto, etc, etc.

1.17.2011

Las herramientas que uso

Una de las cosas interesantes del desarrollo es ver como trabajan los demás. Es difícil sentarte al lado de un desarrollador y no aprender ese pequeño truco o herramienta, siempre hay algún detalle que te puede servir o que puedes aportar, así que voy a comentar las que uso a diario y me hacen la vida más fácil.

Fundamentalmente uso Linux y OSX, aunque prácticamente uso las mismas herramientas en ambos. Aparte de las que todos conocemos, grep, ls, cp, mv... mis favoritas son las siguientes:

- vim: lo uso como único editor. No sé si será el mejor, pero usar el mismo editor para todo tipo de fichero es realmente eficiente.

- tmux: es una herramienta que permite tener varias terminales virtuales dentro de una. Es similar a GNU screen. Permite además conmutar rápidamente entre terminales (ctrl-b + NUM o ctrl-b + l), partir la pantalla vertical y horizontalmente (muy útil por si ejecutas un comando y quieres ver la salida de un tail -f).

- ack-grep: es un grep con esteroides, te saca las búsquedas coloreadas, ignora las carpetas .git .svn y demás especiales. Fundamental si eres programador

- git svn: es una parte de git, pero es tan útil para trabajar contra servidores subversion... :)

- gitk y gitg en linux, gitx en osx: son herramientas gráficas para ver las historia de un repo git, la mar de útiles cuando quieres ver los commit, hacer diffs y demás.

- rsync: espectacular herramienta para sincronizar ficheros entre carpetas, sobretodo entre diferentes máquinas.

- curl: para hacer peticiones web, permite hacer test, revisar las cabeceras (con -I, confieso que no puedo evitar echar un ojo a las cabeceras de los servidores web)

- ab (apache benchmark), para ir teniendo idea de las reqs/s, tiempo de respuesta, etc que tiene la applicación web.

- fabric: es una herramienta para automatizar tareas en servidores y permite hacer cosas un poco más complejas que con un simple ssh. Junto con bash y rsync automatizar es un gusto :P.

- firebug y web developer tools de chrome

- ipython: consola python con esteorides

Últimamente estoy probando vagrant (para gestionar máquinas virtuales), cada día trato de hacer músculo con vim, usar más los trucos de bash...

1.02.2011

objetivos 2011

Cada año que pasa esto de platearse unos objetivos me lo creo menos, pero todo sea por hacer el ejercicio mental. El año 2010 ha sido realmente malo, así que esperemos superarlo. Al tema:

- Recuperar la ilusión por desarrollar. He perdido mucha de la ilusión que tenía, no me encuentro muy motivado, no sé si es por los proyectos, porque me hago mayor, cada vez me cuesta más aprender cosas nuevas interesantes, no veo que mi trabajo sea efectivo y sirva para algo. Tal vez esto sea cuestión de tiempo, de encontrar un proyecto interesante o es que quizás haya llegado la hora de cambiar de "negocio"

- Mejorar mi inglés de una vez por todas. No necesita demasiada explicación.