Prefacio

"Si en los inicios no puedes alimentar a tu equipo con 2 pizzas, es que es demasiado grande" - Jeff Bezos de Amazon.

El desarrollo en el ámbito del software se basa en transmutar un modelo abstracto en productos que aporten una utilidad específica y que puedan ser utilizados para generar nuevas habilidades en sus usuarios o hacer más eficientes las ya existentes.

Cuando se trata crear un nuevo software para el gran público o un determinado perfil de usuario, la principal prioridad (en cuanto a desarrollo de producto se refiere) es generar un prototipo con una funcionalidad básica que nos aporte una idea pragmática de cual puede ser el impacto y potencial de dicho software. En definitiva, estos “experimentos” requieren de agilidad desde que la idea empieza a incubarse. Agilidad en la forma que los miembros del equipo tienen de comunicarse entre si, agilidad en los procesos de negocio y sobre todo agilidad en las tecnologías que servirán de soporte en nuestro desarrollo.

En este Documento me centraré en el tercer requerimiento ágil. Y es que la tecnología usada para hacer posible nuestra idea ha de ser tratada como una herramienta y no como un elemento burocrático y heterogéneo que nos ralentice en cada módulo o funcionalidad añadida. No quisiera generar mal entendidos; patrones de diseño, tests y demás elementos que aportan calidad a nuestro software conviven perfectamente con nuestros desarrollos ágiles. Me refiero a las tecnologías sobre las que se implementan todos estos modelos, paradigmas de desarrollo diferentes para cada entorno, frameworks absurdamente enormes para funcionalidades minúsculas, y librerías con configuraciones eternas que impiden que la complejidad de nuestro software crezca acorde a los requerimientos del desarrollo. Y que lo que consiguen es que invirtamos más tiempo y nos focalicemos en dominar las herramientas que en desarrollar nuestro modelo.

Trataré de abordar todos los elementos que componen la logica de una aplicación web moderna desde persistencia hasta la interación con el usuario. Y aportar para cada uno de los diferentes bloques una tecnología particular, que tratada en conjunto como un ente global nos aporte como resultado una aplicación compacta, modular y dotada del dinamismo requerido por un buen prototipo.