¿Cuánto vale una web?

De vez en cuando algún conocido-amigo que sabe que me dedico a algo que tiene que ver con esto del interné me hace esta temida pregunta... Está bien que gente de fuera del sector se empiece a interesar en introducirse e invertir parte de sus ahorros, pero algo mal hemos hecho como sector para que se crea que es barato montar algo en internet.

Tengamos en cuenta que, sobre todo para alguien que no conozca el sector, tendrá que contratar cosas relacionadas con: Diseño, programación, contenido y marketing. Y esperemos que conozca o, al menos, tenga contactos en el nicho al que se pretende dirigir.

Entonces, ¿Cuánto vale una web? Mi respuesta inicial, suele ser algo del estilo:

  • Ufff!!
  • Eeeeh...
  • Pfff!!
  • Mmmmm...

Y termino con algo como "A saber, si quieres algo en plan presencial y serio, desde 1000 y pico o 2000 euros. Si es más, hasta lo que tengas. Depende". A veces la gente se asusta.

Lo mismo me pasa recibiendo algunas peticiones de presupuesto por email, que se limitan a "quiero una web", "un ecommerce", "una red social"... Pareciendo esperar que les mandes una propuesta detallada, hasta el último euro.
O por otro lado a gente pidiendo que les hagas un clon de alguna killer application; usando wordpress, joomla, ruby on rails... sin tener ni idea de lo que supone, y por 3000 euros, por supuesto. Y lo preocupante es que a veces llegan ese tipo de peticiones de gente que, aparentemente, llevan un tiempo moviéndose en eventos relacionados con el sector.

Seamos serios, también en internet si quieres algo que se parezca a un negocio, te puede costar lo mismo que montar un bar. Y sí, como a los bares también les pasa, si no entra nadie a consumir, tendrás que cerrar.

- ¿Y cuanto cuesta montar un bar?
- Depende.

¿Cuánto vale una web?

En fin, que si tu intención NO es hacer algo serio donde pueda ayudarte programando y/o colaborando en la conceptualización del producto, ahorremos nuestro tiempo y nos vemos en los bares.

Reutilizar un custom validator en Grails

En estos momentos ando colaborando con Sergio del Amo en un producto propio para su empresa Softamo, un producto que estamos desarrollando con Grails.

El tema es que teníamos un puñado de clases de dominio que están relacionadas con un propietario, una clase User. Cada instancia de esa clase de dominio debía tener un nombre único por propietario, por lo que debíamos usar un custom validator. Al final, tras varias refactorizaciones llegamos a una solución que creo que quedó bastante elegante.

Las clases de dominio heredan de una clase padre con varios métodos comunes, además de una clausura estática que contiene la lógica de la validación uniqueByUser, que es lo que nos interesa para esto.

static uniqueByUser = { value, object ->
   propertyName = propertyName[0].toUpperCase() + propertyName[1..propertyName.size()-1]
   def methodName = "findByUserAnd${propertyName}"
   def obj = object.class."$methodName"(object.user, value)
   if(obj && (obj.id != object.id)) {
     return 'unique'
   }
}

Vale, por si no queda del todo claro, intento detallar que hace el código:

  • propertyName, es el nombre de la propiedad/atributo sobre la que se ejecutará la validación, variable que está implícita en la clausura.
  • propertyName[0].toUpperCase() + propertyName[1..propertyName.size()-1], ponemos en mayúscula el primer carácter del nombre del atributo (por ejemplo "name" pasa a "Name").
  • def methodName = "findByUserAnd${propertyName}", ponemos el método al que vamos a llamar para saber si ya existe un valor con mismo usuario y atributo buscado (por ej: findByUserAndName).
  • def obj = object.class."$methodName"(object.user, value), ejecutamos ese findBy* estático sobre la clase del objeto instanciado que se está validando, pasándole el usuario relacionado y el valor del atributo (algo que podría ser equivalente por ejemplo a Drink.findByUserAndName(drink.user, "vodka")).
  • if(obj && (obj.id != object.id)), comprobamos que si se devuelve un valor, no sea el mismo que la instancia del actual.
  • return 'unique', en este caso devolvemos el código de mensaje de validación como unique, por lo que aprovecharemos los mismos mensajes i18n del unique estándar de grails.

Entonces, en nuestras clases de domino que hereden de ahí, para el atributo donde queramos utilizar ese constraint simplemente deberemos indicar validator: uniqueByUser. Algo como:

static constraints = {
   name blank: false, validator: uniqueByUser
   description blank: false
}

Lo único que no contempla ahora mismo esta solución es tener más de un custom validator, principalmente porque no nos ha hecho falta. Si lo llegamos a necesitar, veremos como lo hacemos, claro :P.

Mejoras y propuestas bienvenidas.

ACTUALIZACIÓN: Mejor que darle tantas vueltas como hicimos nosotros, es utilizar el soporte multi-column de la constraint unique (Nota mental: No dar por supuestas según que cosas, e ir a verlo a la documentación). Gracias al comentario de @jneira.

Open Space. Código como Expresión.

Este fin de semana estuve en Valencia en el open space convocado por agilismo.es, que llevaba por nombre Código como Expresión. La verdad que hacía tiempo que me apetecía asistir a un open space exclusivo sobre código, además de volver a visitar Valencia, conocer un poco la escena de desarrolladores y ver las oficinas de beCode (aún tengo pendiente pasar unos días con ellos).

Finalmente fui desde Zaragoza con Miguel Ángel Baztan y Fernando Pérez, 2 de los habituales del grupo Agile Aragón. En el evento también había gente llegada desde Castellón, Madrid, Segovia... incluso Pepe que se pegó una auténtica paliza de viajes desde Santiago de Compostela. Entre unos y otros, estuvimos algo más de 30 personas.

A niveles generales, me gustó bastante el evento, salvo un par de detalles/sensaciones que tuve durante algunos debates. He intentado hacer un pequeño resumen de cada sesión, pero por el formato del evento y mi torpeza, no he sido capaz.

Tablón. Open Space Código como Expresión

¿De qué se habló?, en las conversaciones y debates que estuve yo:

  • De la (poca) expresividad de las APIs REST, aunque para exponer e integrar sistemas diferentes, hasta el momento, es habitualmente la mejor alternativa.
  • Del spaghetti code relacionado con el uso de javascript asíncrono y algunas buenas prácticas para mejorar ese código.
  • De lenguajes y paradigmas de programación (orientado a objetos, funcional, procedimental); y como conocer varias opciones nos hacen enfocar soluciones desde más puntos de vista.
  • De la nomenclatura y expresividad en los tests. De frameworks de testing tipo BDD para diferentes lenguajes.
  • De identación y comentarios en el código.
  • De herramientas: IDEs, editores, tableros tipo kanban, software para hacer pair programming...

Os dejo las fotos que ha publicado Emma del evento.

#Developars: Miriam Muros

-Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?…

Soy Miriam Muros (@miriammuros) y soy de Madrid. Siempre he vivido en Madrid aunque estoy deseando vivir en otros lugares. Ahora mismo dedico mi tiempo a diferentes proyectos propios. Soy freelance, desarrollando algunos proyectos propios que espero que vean pronto la luz, intento levantar un centro de coworking y en ocasiones hago de advisor para otros proyectos. Pero en mi curriculum están empresas como Tuenti y Grupo Prisa.

- ¿Desde cuando y cómo te picó el gusanillo de la informática?

Recuerdo tener un ordenador en casa desde siempre, y estar trasteando con el. Jugar a Prince of persia y siempre perder por lo que en los ratos que me aburría lo dedicaba a otras cosas. Pero a programar y a saber que realmente este era mi campo, a los 12 años, cuando realicé mi primera web! Y desde entonces ya sabía a que me iba a dedicar en el futuro.

- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?

Aunque mucha gente me critique por decir esto: php. Todo el mundo se mete con el porque no es un lenguaje estructurado, y blabla, pero se olvidan de que todas las grandes empresas de internet que han triunfado prácticamente todas tenían base en php y de echo, es de lo que más se pide trabajo… por algo será! y.. aparte de php, javascript ;) Soy una programadora web en toda regla!

- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones…)

Netbeans, git, jquery, firebug, vi creo que no podría vivir sin estos cinco...

- Recomienda alguna lectura técnica que no nos deberíamos perder.

He de decir que no soy una gran lectora sobre todo de lecturas técnicas, me parece que no tiene mucho sentido leer un libro técnico de principio a fin, ya que realmente son manuales, y los manuales sirven para instruirte en los puntos que tu necesitas ;) pero… ya que me lo preguntáis… The pragmatic programmer

- Añade lo que quieras.

Invito a todas las chicas developars, a que entren en BetaBeers, es una reunión de programadores para hablar de programación y de proyectos que se realiza cada mes y están por casi toda España! Es muy interesante, e incluso ahora han empezado a hacer concursos de programación, y... me gustaría no ser siempre la única chica! :D

#Developars: Lucía Manescau

- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?...

Soy Lucía Manescau García, tinerfeña de 31 años (aunque nací en Las Palmas de Gran Canaria, pero vivo en Tenerife desde los 3 añitos) e Ingeniera Superior Informática por la Universidad de La Laguna. Actualmente trabajo en GMR Canarias, una empresa pública de la Consejería de Agricultura, Ganadería, Pesca y Aguas, como analista desarrolladora en Java y jefa de proyectos.

- ¿Desde cuando y cómo te picó el gusanillo de la informática?

La verdad es que siempre me llamó la informática. Tengo incluso una curiosa foto a los 5 añitos frente a un ordenador, un MSX, que lo demuestra :), y recuerdo también, pocos años después, incluso hacer mis pinitos con el DOS. Pero la decisión final de estudiar informática llegó algo tarde. Curiosamente, hasta COU (sí, soy del viejo sistema, e incluso lo digo con orgullo jeje), estaba decidida a estudiar Bellas Artes, una carrera bastante diferente, lo admito. Pero cuando en COU nos llevaron a visitar las facultades, quedé prendada por informática, y en ese último año cambié de opinión y me matriculé en informática. Aunque los primeros años fueron algo decepcionantes (me faltaba verle la parte práctica), cuando empecé a hacer la Ingeniería Superior empecé a ilusionarme más y ,una vez trabajando, me di realmente cuenta de que la decisión había sido la correcta, hasta convertirme en una apasionada de mi trabajo.

- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?

Sin duda alguna, Java. Realmente me encanta trabajar con ese lenguaje. Me resulta muy práctica las posibilidades que da para la estructuración de los programas, para su modularización, me resulta muy sencillo en ese lenguaje entender la abstracción (lo cual en si puede parecer una frase algo rara, pero, no se por qué, en Java lo veo más claro que en otros lenguajes),... en definitiva, me siento cómoda y más imaginativa trabajando en Java. Además, otra gran ventaja que pienso que tiene, son la cantidad de frameworks y librerías que hay en ese lenguaje, la cantidad de colaboración que permite entre desarrolladores, lo cual, en los tiempos que corren, creo que es indispensable, pues ha quedado más que claro que el sistema completamente cerrado de "yo programo mis cosas y que nadie sepa como las he hecho ni pueda trabajar sobre ellas" ya no sirve (si hasta Apple, que siempre abogó por sistemas cerrados, tuvo que dejar abierta la posibilidad de que programas de desarrolladores externos se pudieran ejecutar en sus sistemas como el IPad, sería ilógico que otras empresas o desarrolladores siguieran pensando que los sistemas cerrados tienen futuro).

- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones...)

Como IDE soy completamente fan de Eclipse, y especificando más, de MyEclipse (que vale que tiene la desventaja de ser de pago, pero siendo sincera entre uno y otro no hay color). En cuanto a frameworks me gusta mucho Spring, porque cubre una gran cantidad de necesidades del desarrollo y lo facilita muchísimo (el uso de anotaciones con Spring, desde que empecé a utilizarlo, me pareció una verdadera gozada :) ), además de permitir una muy cómoda integración con otras herramientas como JUnit a la hora de hacer los tests unitarios (aunque en este aspecto he de confesar que hace poco, gracias a una charla de Yeray Darias, conocí los Specs de Scala, y me han dado muchas ganas de ahondar más en ellos, pues me ha parecido que tienen muy buena pinta ). No me gustaría terminar este apartado sin nombrar por una parte Maven, que me parece una herramienta realmente genial y completa tanto para el tratamiento de librerías, como para empaquetar, deployar o publicar librerías propias; por otra parte Git como control de versiones pues, aunque el paso de SVN a Git cuesta un poco por tener que "cambiar el chip", la gran utilidad de poder controlar tus propios versionados, tus propias ramas, me encanta; y por último las herramientas de Atlassian (Jira, GreenHopper, Fisheye, Crucible), que pienso que facilitan muchísimo la organización de proyectos.

- Recomienda alguna lectura técnica que no nos deberíamos perder.

Si tuviera que recomendar alguna lectura, me decantaría por "Java Puzzlers", quizá no tanto porque enseñe en sí, ni desde luego por ser novedoso, sino porque te hace pensar un poquito más allá de aquellas cosas con las que te enfrentas diariamente como desarrollador, y te hace plantearte si a veces no nos adentramos lo suficiente en qué está haciendo realmente nuestro código. De todas formas, lo que realmente recomendaría como lectura es Google, y con esto me refiero a búsquedas continuas, a estar pendiente de qué es lo nuevo que sale, de qué nuevas posibilidades tenemos,... Desde mi punto de vista, más importante que "una lectura obligatoria", es no dejar de leer nunca.

- Añade lo que quieras.

En este apartado, en primer lugar, me gustaría darte las gracias Daniel por esta iniciativa de "developars", porque creo que las mujeres desarrolladoras en parte somos como las meigas, "haberlas haylas", aunque muchas veces estemos algo más escondidas, seguramente porque siendo sincera seguimos siendo minoría. Pero la pasión por la informática no tiene sexo, o la sientes o no la sientes :). Yo personalmente me siento afortunada por sentirlo, por disfrutar por mi trabajo, por que me nazca gritar un "ole, ole" mientras aplaudo cuando resuelvo un problema complejo, tengo una "idea feliz", pruebo un nuevo framework que me sorprende gratamente o veo un gran trabajo de un compañero. Sobre todo porque hace poco tuve una temporada algo de "bajón" de la que resurgí con ganas renovadas y con más pasión que nunca. De aquí ha salido mi twitter @luciamanescau (con el que aún me estoy peleando un poco :) ) y mi blog Renacer de una informática, que aunque aún esté en pañales, pues lleva poquito tiempo, espero que poco a poco vaya creciendo y madurando.