<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AQuA.it &#187; Web</title>
	<atom:link href="http://blog.aquait.info/category/arquitectura/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aquait.info</link>
	<description>Blog técnico de AQuA.it</description>
	<lastBuildDate>Mon, 17 Oct 2011 12:15:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Como elegir un framework web</title>
		<link>http://blog.aquait.info/2009/09/como-elegir-un-framework-web/</link>
		<comments>http://blog.aquait.info/2009/09/como-elegir-un-framework-web/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 02:20:23 +0000</pubDate>
		<dc:creator>Alejandro</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=134</guid>
		<description><![CDATA[Hoy en día casi todo proyecto de desarrollo tiene alguna interfaz web como parte del producto. Esto no es ningún desafío si tenemos un equipo el cual ya ha trabajado con este tipo de  proyectos. ¿Pero que pasa si el equipo no tiene experiencia en el desarrollo de aplicaciones web?]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --><br />
<strong><em>¿Como puedo saber cual es el mejor framework web para mi proyecto?</em></strong><em> </em></p>
<p style="margin-bottom: 0in">Hoy en día casi todo proyecto de desarrollo tiene alguna interfaz web como parte del producto. Esto no es ningún desafío si tenemos un equipo el cual ya ha trabajado con este tipo de  proyectos. ¿Pero que pasa si el equipo no tiene experiencia en el desarrollo de aplicaciones web?</p>
<p style="margin-bottom: 0in"><span id="more-134"></span></p>
<p style="margin-bottom: 0in" align="left">Por ejemplo, viene del mundo enterprise, con años de experiencia en sistema de mediano y gran porte con clientes realizados con frameworks GUIs como ser Swing.</p>
<p style="margin-bottom: 0in" align="left">Al principio seguramente subestimemos el mundo web pensando que todo es es un juego de niños que cualquiera puede hacer y que contratando a un diseñador web nuestros problemas van a estar solucionados. Pero obviamente uno está equivocado y ni bien comienza a estudiar lo básico se encuentra con una cantidad de conceptos no menores como ser  manejo de sesión, AJAX, CSS, XSS, SQL-Inyection que uno debe entender antes de poder realizar cualquier sistema.</p>
<p style="margin-bottom: 0in" align="left">Una vez que terminamos de estudiar estos conceptos y que nos volvemos a sentir seguros para comenzar es recién ahí que nuestro problema comienza. En ese momento es cuando la gran pregunta surge ¿Qué framework web (FW) es el que debo utilizar para mis proyectos?</p>
<p style="margin-bottom: 0in" align="left">Hace un par de años atrás esto no hubiera sido un problema, la respuesta probablemente hubiera  sido si estamos trabajando en Java, utiliza <strong>struts</strong><span style="font-weight: normal">. Pero hoy eso cambió debido a que solo para Java en la página </span><a href="http://java-source.net/open-source/web-frameworks">http://java-source.net/open-source/web-frameworks</a> podemos encontrar más de 40 frameworks, dentro de los cuales el que yo utilizo no está. Y ni hablar si entramos considerar FW de diferentes lenguaje de programación como ser Ruby, Python, php y .net . ¿Entonces como podemos hacer para responder semejante pregunta hoy en día?</p>
<p style="margin-bottom: 0in" align="left">A continuación voy a definir lo que IMHO son los factores que yo he utilizado para responder está pregunta y que pueden ser de ayuda a otros que se enfrenten a una situación similar. Partiremos de la base  que tenemos un equipo de desarrollo con experiencia en un lenguaje determinado el cual debemos reconvertir al desarrollo de aplicaciones web. Algunos de los puntos que se plantearán no tienen sentido por ejemplo para un desarrollador independiente o si se está armando un equipo desde cero. Cuando se trabaja con un equipo ya formado hay factores a considerar que no dependen directamente de la tecnología y que pueden determinar que el mejor FW del mundo, no sea la mejor elección, lo cual hace que la solución del vecino no siempre sea la solución adecuada para uno. Por lo tanto debemos tener sumo cuidado con nuestros pares cuando con su mejor intención nos recomiendan “él FW” ya que probablemente ellos no conozcan el contexto donde usted lo debe utilizar. Por último hay que ser realistas y saber que probablemente al finalizar el proceso de selección haya más de un FW que pueda ser utilizado y que la definición terminará siendo un tema de preferencia con un grado de incertidumbre. La respuesta final solo la sabrá luego de estar avanzado en el primer proyecto, pudiendo equivocarse y debiendo reconsiderar su decisión. Por tal motivo es importante elegir como primer experiencia un proyecto  no crítico.</p>
<p style="margin-bottom: 0in" align="left">Los puntos que voy a nombrar a continuación no están en un orden especial.</p>
<p><strong><em>Puntos a tener en cuenta a la hora de elegir un FW</em></strong><br />
<strong>Conocimientos del equipo</strong></p>
<p style="margin-bottom: 0in">Es de suma importancia evaluar en que se siente cómodo el equipo trabajando. Es decir si tengo todos programadores Java muy probablemente lo mejor sea buscar una FW dentro de Java de esta forma el equipo podrá aprender rápidamente el FW ya que no tiene que perder tiempo estudiando los detalles de otro lenguaje. Por otro lado FW buenos hay en casi todos los lenguajes así que no debería ser un problema fijar este punto. La excepción a esta regla sería si estamos trabajando con un lenguaje desactualizado como ser Clipper o Cobol. Pero en este caso estaremos ante una problema mayor que es una reconversión tecnológica de los sistemas.</p>
<p><strong>¿Necesitamos algo que solucione solo la presentación o tenemos que trabajar en todas las capas?</strong></p>
<p style="margin-bottom: 0in" align="left">Es importante determinar que grado de libertad tenemos a la hora de elegir. Es decir, estamos ante un caso en el cual tenemos un sistema ya armado al cual solo debemos darle la presentación web o estamos ante un caso en el cual podemos elegir desde la forma de presentar los datos hasta la forma de persistirlos. Dependiendo de esto nos convendrá utilizar algo que soluciones todo nuestro requerimientos o simplemente centrarnos en lo que necesitamos que es solucionar la presentación web. En base a lo anterior podemos dividir los FW dividir en dos grupos y así descartar el que no sea de nuestro interés. Los grupos serían:</p>
<p><em>Frameworks full stack</em></p>
<p style="margin-bottom: 0in" align="left">Son los que presentan una solución completa que va desde la capa de presentación hasta la capa de persistencia de la información. Los más nuevos están basados en el patrón MVC. Algunos ejemplos de estos  son:</p>
<ul>
<li>Rails en ruby y que podríamos decir que es la estrella del momento</li>
<li> Grails en Groovy</li>
<li>CakePhp en php</li>
<li>Spring Roo y SEAM en Java</li>
<li>Django en Python</li>
</ul>
<p style="margin-bottom: 0in" align="left">Detallar cada uno no es nuestra intención, simplemente me limitaré a comentar que la mayoría está basado en los principios de CoC (convention over configuration), DRY (don&#8217;t repeate yourself) y que su composición básica consta de un procesador de templates para el diseño de las vista (que generarán las páginas dinámicas), un despachador de HttpRequests que siguiendo determinadas convención decide a que servicio despachar el pedido. Para el manejo de los datos cuentan con un framework ORM que ofrece creación de consultas dinámicas y una cantidad de facilidades que simplifican el trabajo.</p>
<p><em>Solo de presentación:</em></p>
<p style="margin-bottom: 0in" align="left">Estos son aquellos que están orientados solo a la capa de presentación.</p>
<p style="margin-bottom: 0in" align="left">Ejemplos de este tipo son:</p>
<ul>
<li>GWT- Google Web Tookit:el cual genera una aplicación 100% JavaScript pero que es	programada en Java</li>
<li>JSF: Java Server Faces, es el framework de componentes oficial de Java</li>
<li>ASP.NET: que es LA opción dentro de Microsoft</li>
</ul>
<p><strong>Soporte (comunidad, fabricante, libros, certificación, perspectiva a futuro)</strong></p>
<p style="margin-bottom: 0in" align="left">Un punto importante, sobre todo en los proyectos OS, es ver la comunidad que hay al rededor del framework a utilizar. Es importante investigar si hay una empresa invirtiendo recursos en el desarrollo del producto o está movido pura y exclusivamente por la comunidad. En el último casó es cuando “el tamaño si importa” y dependiendo del tamaño de la comunidad en que se sustenta depende el soporte que podemos tener. Para esto la mejor forma es en la página del framework buscar que tantos reporte de bugs hay, que tan rápido se solucionan, cuantos desarrolladores hay corrigiendo tickets. Siguiendo en esta misma linea hay que ver cada cuanto sale una nueva versión y si hay versiones destinadas a generar una versiones estables del framework o si solo salen versiones cuando hay nuevas funcionalidades. Visto que vamos a tener que aprender a utilizar el framework hay que estudiar la calidad de la documentación de este, ver que tantos libros publicados (por ejemplo en Amazon) hay sobre el tema y si se ofrece algún tipo de certificación y/o capacitación.</p>
<p><strong>Existencia de proyectos exitosos</strong></p>
<p style="margin-bottom: 0in" align="left">Como nuestra intención es utilizar el FW para un producto que en algún momento deberá salir en producción seguramente no queramos ser los conejillos de indias. Si el FW es  mínimamente serio entonces debe tener en su sitio web referencia a  sistemas que están implementado con este.  No es una mala idea de ser posible dar una mirada a estos y ver que tan bien funcionan. Sería excelente poder encontrar un blog de uno de estos proyectos en el cual se comente la experiencia durante el desarrollo del sistema.</p>
<p><strong>Integración con la plataforma existente</strong></p>
<p style="margin-bottom: 0in" align="left">Si el proyecto va a formar parte de un ecosistema más complejo entonces hay que tomar en cuenta las posibilidades de integración que tiene el FW y si estas son aceptables dentro de la arquitectura de nuestro producto. Por ejemplo si tenemos que interactuar con un sistema JEE es importante determinar que facilidades para invocar servicios EJB me da el FW. Claro está que siempre es posible desarrollar una capa que se encargue de la interacción, pero si el FW lo soporta nativamente no solo nos ahorramos trabajo sino que estamos reutilizando algo que está probado y utilizado por otros.</p>
<p><strong>Curva de aprendizaje</strong></p>
<p style="margin-bottom: 0in" align="left">Este punto hoy en día es engañoso debido a que los FW modernos tienen una curva de aprendizaje muy rápida inicialmente pero que para llegar a niveles de expertos hay que dedicarle mucho tiempo como a cualquier otro framework. Si ha esto le sumamos que la mayoría de los FW son OS con una documentación de mala calidad, que  probablemente no exista soporte local y que para capacitarnos tengamos que viajar muchos kilómetros (por lo menos si están el el Sur como yo). Lo cual hace que la capacidad de aprendizaje del equipo sea un factor importante. En algunos casos para poder llegar a solucionar un problema será necesario estudiar el código fuente del FW. Si llegáramos a tener la suerte de que el presupuesto nos permitiera poder capacitar parte del equipo y/o de contratar soporte entonces no hay que dudarlo. Los dolores de cabeza y el tiempo que se puede ganar  seguramente lo vale.</p>
<p><strong>Probar, probar y probar</strong></p>
<p style="margin-bottom: 0in" align="left">Inevitablemente para poder determinar el FW tendremos que destinar recursos y realizar algunas pruebas antes de poder llegar a una conclusión aceptable y fundamentada. No es necesario probar todos para estar tranquilo de que estamos utilizando el mejor. Cuando evaluemos recordar que estamos buscando el adecuado para el contexto donde hay que usarlo y no el mejor en general. Con un buen análisis previo probablemente no debamos probar más de dos o tres FW. Para que la prueba sea lo más comparativa posible debemos elegir un proyecto tipo y e implementarlo con con los FW que vayamos a evaluar..</p>
<p><strong><em>¿Como comparamos los FW?</em></strong><em> </em></p>
<p style="margin-bottom: 0in" align="left">Para la comparación de los FW he utilizado una herramienta que a mi me ha ayudado a la hora de evaluar  y puede ser de ayuda para ustedes también. La herramienta es una simple tabla en la que refleja la mayoría de los puntos vistos. En esta tabla calificaremos los FW dándoles un puntaje donde para cada punto tendríamos un máximo asignable y la suma de los máximos te todos los puntos suma 100. Al definir máximos diferentes por puntos estamos priorizando los puntos a evaluar de acuerdo a nuestro contexto. Por ejemplo si estamos en un caso en el cual tenemos una cantidad de sistemas existentes con los cuales debemos interactuar seguramente la capacidad de integración del FW sea uno de los puntos más importantes a evaluar mientras que si no tenemos que interactuar con otros sistemas, tenemos tiempos tiranos y un equipo ya formado con poca experiencia web  entonces la curva de aprendizaje es un punto determinante en nuestra elección.</p>
<p style="margin-bottom: 0in" align="left">Para dejar en claro este punto vamos a ver un ejemplo:</p>
<p><!-- 		@page { margin: 0.79in } 		TD P { margin-bottom: 0in } 		TH P { margin-bottom: 0in } 		P { margin-bottom: 0.08in } --></p>
<table border="1" cellspacing="0" cellpadding="0" width="100%" rules="true" bordercolor="#555555">
<tbody>
<tr valign="top">
<th width="24%"></th>
<th width="6%">
<p align="center"><em><strong>Max</strong></em></p>
</th>
<th width="17%">
<p align="center"><em><strong>FW 1</strong></em></p>
</th>
<th width="17%">
<p align="center"><em><strong>FW 2</strong></em></p>
</th>
<th width="17%">
<p align="center"><em><strong>FW 3</strong></em></p>
</th>
<th width="17%">
<p align="center"><em><strong>FW 4</strong></em></p>
</th>
</tr>
<tr valign="top">
<td width="24%">
<p align="left"><em><strong>Soporte</strong></em></p>
</td>
<td width="6%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">25</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left">15</p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">10</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">20</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">5</span></p>
</td>
</tr>
<tr valign="top">
<td width="24%">
<p align="left"><em><strong>Proyecto exitoso</strong></em></p>
</td>
<td width="6%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">10</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">5</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">10</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">10</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">0</span></p>
</td>
</tr>
<tr valign="top">
<td width="24%">
<p align="left"><em><strong>Integración</strong></em></p>
</td>
<td width="6%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">50</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">25</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">40</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">35</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">45</span></p>
</td>
</tr>
<tr valign="top">
<td width="24%">
<p align="left"><em><strong>Curva aprendizaje</strong></em></p>
</td>
<td width="6%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">15</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">15</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">10</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">10</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">5</span></p>
</td>
</tr>
<tr valign="top">
<td width="24%">
<p align="left"><em><strong>Total:</strong></em></p>
</td>
<td width="6%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">100</span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">60</span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;"><strong>70</strong></span></p>
</td>
<td width="17%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;"><strong>75</strong></span></p>
</td>
<td width="18%" bgcolor="#ffffff">
<p align="left"><span style="color: #000000;">55</span></p>
</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0in" align="left">
<p style="margin-bottom: 0in" align="left">La lectura que se pude hacer de la tabla anterior es que debemos realizar pruebas con el FW2 y el FW4 para definir cual de estos dos es el que vamos a utilizar. Gracias al estudio que realizamos redijimos por lo menos a la mitad la cantidad de FW a estudiar y tenemos una tabla que justifica nuestra elección.</p>
<p style="margin-bottom: 0in" align="left">Obviamente cuanta más filas le agreguemos a la tabla tendremos más información para justificar la elección.</p>
<p style="margin-bottom: 0in" align="left">Por las dudas aclaro que los máximos asignados son de ejemplos y ustedes deberían definir los suyos de acuerdo a sus necesidades.</p>
<p><strong>En resumen&#8230;</strong></p>
<p style="margin-bottom: 0in" align="left">En resumen a la hora de seleccionar un FW debemos seguir tres pasos:</p>
<ol>
<li>
<p style="margin-bottom: 0in; font-weight: normal;">Primero debemos evaluar 	los conocimientos del equipo y determinar que tipo de FW se quiere si uno que sea full-stack o solo presentación.</p>
</li>
<li>
<p style="margin-bottom: 0in; font-weight: normal;">Una vez tengamos esto y sabiendo el lenguaje de preferencia podemos buscar el subconjunto de FW a evaluar. Para facilitar la evaluación confeccionamos una planilla como la vista en el punto anterior.</p>
</li>
<li>
<p style="margin-bottom: 0in; font-weight: normal;">Por ultimo con los FW mejor ranqueados realizamos las pruebas las cuales se realizan con un mismo proyecto implementado en cada uno de los FW.</p>
</li>
</ol>
<p style="margin-bottom: 0in" align="left">Luego de todo esto podremos saber cual es el FW a utilizar. Parece mucho trabajo, no? Si seguro que lo es, pero es la única forma de poder tomar una decisión minimizando el riesgo de equivocarnos&#8230; y cuando la decisiones tecnológicas de una empresa depende de nosotros es bueno tener herramientas para justificar nuestras decisiones y sobro todo para asegurarnos el éxito de nuestro trabajo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/09/como-elegir-un-framework-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

