<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1481755160576909631</id><updated>2024-11-01T11:37:18.061+01:00</updated><category term="java"/><category term="tools"/><category term="ingenieria software"/><category term="webservices"/><category term="eclipse"/><category term="gestion equipo"/><category term="axis2"/><category term="buenas practicas"/><category term="spring"/><category term="testing"/><category term="blog"/><category term="mundo it"/><category term="historia de una integracion"/><category term="hibernate"/><category term="logging"/><category term="aop"/><category term="cvs"/><category term="maven"/><category term="podcast"/><category term="scm"/><category term="scv"/><category term="subversion"/><category term="tomcat"/><category term="about"/><category term="agile"/><category term="ci"/><category term="etl"/><category term="hudson"/><category term="jdbc"/><category term="jquery"/><category term="libros"/><category term="monitoring"/><category term="oracle"/><category term="pentaho"/><title type='text'>Blog de Julio César Pérez Arques</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>69</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-7184131490838996450</id><published>2009-12-31T19:40:00.000+01:00</published><updated>2009-12-31T19:51:39.541+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><title type='text'>Cierre y resumen del 2009</title><content type='html'>Finalmente este año 2009 llega a su fin. Ha sido un año que ha dado mucho de sí. Marcado, profesionalmente hablando, por La Crisis, Oracle compra Sun y el rugir de lo Ágil. Es tiempo de hablar con uno mismo, celebrar los éxitos, reconocer los errores, aprender de las experiencias y plantearse nuevas metas. Descansar el cuerpo y la mente, para volver ya el año que viene con renovadas fuerzas.&lt;br /&gt;&lt;br /&gt;En lo relativo a este blog, me quedo con la espinita clavada de no haber superado el número de posts del año pasado. 35 el año pasado, por 34 éste. Por poco. Y eso que iba por muy buen camino, pero en Agosto me mudé y con el ordenador en el suelo, aún a falta de elegir mi despacho, se hace muy duro escribir.&lt;br /&gt;&lt;br /&gt;Lo que sí han aumentado considerablemente han sido el número de visitas y el número de suscriptores. El primero se ha doblado (cerca de 35.000), aunque mucha culpa la tienen las visitas desde Google, y el segundo se ha quintuplicado (190). Pero lo que más me ha gustado han sido los debates que se han generado en algunos posts. Muchas gracias a todos.&lt;br /&gt;&lt;br /&gt;El top 5 de los posts más visitados de este año ha sido (1) &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/06/buenas-practicas-para-desarrollar.html&quot;&gt;Buenas prácticas para desarrollar Servicios web SOAP&lt;/a&gt;, (2) &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/07/esquema-de-un-sistema-de-gestion-de.html&quot;&gt;Esquema de un Sistema de Gestión de Desarrollo Software&lt;/a&gt;, (3) &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/08/chuleta-maven.html&quot;&gt;Chuleta Maven&lt;/a&gt;, (4) &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/05/10-formas-de-mejorar-tu-codigo.html&quot;&gt;10 formas de mejorar tu código&lt;/a&gt; y (5) &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/01/programacion-basada-en-google-pbg.html&quot;&gt;Programación basada en Google&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una de mis nuevas experiencias de este año ha sido gracias a &lt;a href=&quot;http://jorgerubira.blogspot.com/&quot;&gt;Jorge Rubira&lt;/a&gt;, que me invitó a participar en los podcasts &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/02/participacion-en-el-podcast-servicios.html&quot;&gt;Servicios web&lt;/a&gt; y &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/12/participacion-en-el-podcast-testing-de.html&quot;&gt;Testing de aplicaciones&lt;/a&gt; de javaHispano. Fue un auténtico placer contribuir en ellos junto al susodicho, a &lt;a href=&quot;http://weblogs.javahispano.org/artesanodeprimera/&quot;&gt;Alfredo Casado&lt;/a&gt;, Leonardo de Seta y Jorge Luis Bugarín.&lt;br /&gt;&lt;br /&gt;También me ha dado tiempo a hacer un experimento con AdSense. No es que quisiera monetizar el blog, simplemente tuve un ataque de emprendedor y quería ver, de primera mano, cómo funcionaba el tema de la publicidad en páginas web. De hecho, no ha llegado a generar ni 5 euros y no se cobra nada hasta que no se ganan al menos 70. En el próximo diseño del blog lo eliminaré.&lt;br /&gt;&lt;br /&gt;Otra opción que estoy meditando es si pasarme a contractor o freelance y anunciar mis servicios por el blog. Ya veremos...&lt;br /&gt;&lt;br /&gt;Llegados a este punto, sólo me queda desearos un &lt;span style=&quot;font-weight: bold;&quot;&gt;Feliz 2010&lt;/span&gt; y dedicaros un &lt;span style=&quot;font-weight: bold;&quot;&gt;brindis por el talento&lt;/span&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/7184131490838996450/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/12/cierre-y-resumen-del-2009.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7184131490838996450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7184131490838996450'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/12/cierre-y-resumen-del-2009.html' title='Cierre y resumen del 2009'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-3873695653337714617</id><published>2009-12-23T19:51:00.003+01:00</published><updated>2009-12-23T20:28:25.263+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="podcast"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>Participación en el podcast Testing de aplicaciones de javaHispano</title><content type='html'>En &lt;a href=&quot;http://www.javahispano.org/&quot;&gt;javaHispano&lt;/a&gt; han publicado las dos partes del podcast Testing de aplicaciones en el que tuve el enorme placer de participar durante una noche del ya lejano mes de Noviembre.&lt;br /&gt;&lt;br /&gt;El podcast fue en realidad una intensa tertulia, junto a &lt;a href=&quot;http://weblogs.javahispano.org/artesanodeprimera/&quot;&gt;Alfredo Casado&lt;/a&gt;, &lt;a href=&quot;http://www.consultorjava.com/wp/&quot;&gt;José Luis Bugarín&lt;/a&gt; y &lt;a href=&quot;http://jorgerubira.blogspot.com/&quot;&gt;Jorge Rubira&lt;/a&gt;, donde mezclamos la importancia y ventajas del testing automático de aplicaciones con experiencias, buenas prácticas, técnicas, frameworks y herramientas.&lt;br /&gt;&lt;br /&gt;La &lt;a href=&quot;http://www.javahispano.org/contenidos/es/javahispano_podcast__064__test_de_aplicaciones_parte_1/?utm_source=feed&amp;amp;utm_medium=feed&amp;amp;utm_campaign=podcasts&quot;&gt;primera parte&lt;/a&gt; se centra más en introducir el testing automático, los tipos de tests, buenas prácticas y la metodología TDD.&lt;br /&gt;Mientras que en la &lt;a href=&quot;http://www.javahispano.org/contenidos/es/javahispano_podcast__065__test_de_aplicaciones_parte_2/&quot;&gt;segunda parte&lt;/a&gt; se tratan herramientas y frameworks concretos, principalmente del mundo Java, para terminar comentando cómo explotar el testing al máximo desde un entorno de integración continua.&lt;br /&gt;&lt;br /&gt;Poco más que añadir a lo contado en el podcast y comentado en javaHispano. Sólo volver a animaros a dar el salto a hacer testing a los que aún no lo habéis hecho. Merece la pena.&lt;br /&gt;&lt;br /&gt;Espero que os haya gustado.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/3873695653337714617/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/12/participacion-en-el-podcast-testing-de.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/3873695653337714617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/3873695653337714617'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/12/participacion-en-el-podcast-testing-de.html' title='Participación en el podcast Testing de aplicaciones de javaHispano'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-2144506944760844864</id><published>2009-12-10T16:45:00.002+01:00</published><updated>2009-12-10T17:10:22.574+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>Un test para todos tus mapeos Hibernate v2.0</title><content type='html'>El otro día uno de mis chicos me dió un tirón de orejas. Resulta que &lt;a href=&quot;http://jcesarperez.blogspot.com/2008/06/un-test-para-probar-todos-tus-mapeos.html&quot;&gt;el test&lt;/a&gt; para probar todos los mapeos de las entidades &lt;a href=&quot;http://www.hibernate.org/&quot;&gt;Hibernate&lt;/a&gt; de un proyecto que publiqué en el pasado, no es correcto para la versión 3 de Hibernate. La culpa es del método &lt;a href=&quot;https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html#iterate%28%29&quot;&gt;iterate&lt;/a&gt; de Query, que si bien en la versión 2 de Hibernate hacía un &lt;span style=&quot;font-style: italic;&quot;&gt;select&lt;/span&gt; de todas las columnas, en la versión 3 sólo lo hace de aquellas que forman el identificador de la entidad&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Así que nueva versión del test, compatible con Hibernate 3 y un poco más sofisticada. Allá va.&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;public void testHibernateMappingsOk() {&lt;br /&gt;boolean allOk = true;&lt;br /&gt;Map metadata = sessionFactory.getAllClassMetadata();&lt;br /&gt;for (Iterator i = metadata.values().iterator(); i.hasNext();) {&lt;br /&gt;   EntityPersister persister = (EntityPersister) i.next();&lt;br /&gt;   String entityName = persister.getEntityName(); &lt;br /&gt;   try {&lt;br /&gt;      Query q = session.createQuery(&quot;from &quot; + entityName);&lt;br /&gt;      q.setMaxResults(1);&lt;br /&gt;      q.uniqueResult();&lt;br /&gt;   } catch (HibernateException e) {&lt;br /&gt;      logger.warn(&quot;ERROR probando el mapeo de la entidad &quot; + entityName, e);&lt;br /&gt;      allOk = false;&lt;br /&gt;   } &lt;br /&gt;}&lt;br /&gt;assertTrue(allOk);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/2144506944760844864/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/12/un-test-para-todos-tus-mapeos-hibernate.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/2144506944760844864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/2144506944760844864'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/12/un-test-para-todos-tus-mapeos-hibernate.html' title='Un test para todos tus mapeos Hibernate v2.0'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-6242795082428017591</id><published>2009-09-11T10:06:00.000+02:00</published><updated>2009-09-12T00:03:42.303+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><category scheme="http://www.blogger.com/atom/ns#" term="mundo it"/><title type='text'>¿Agil o Agilista?</title><content type='html'>2009 es el año &lt;span style=&quot;font-weight: bold;&quot;&gt;Agile&lt;/span&gt;. Se ha convertido en la nueva &lt;span style=&quot;font-weight: bold;&quot;&gt;moda&lt;/span&gt;, en el nuevo hype y para algunos en la nueva gallina de los huevos de oro. Ha llevado un tiempo desde que se escribió el &lt;a href=&quot;http://www.agilemanifesto.org/&quot;&gt;Manifiesto&lt;/a&gt; en 2001, pero finalmente Agile se ha convertido en una auténtica &lt;span style=&quot;font-weight: bold;&quot;&gt;revolución &lt;/span&gt;que está llegando -mejor o peor- a todas partes.&lt;br /&gt;&lt;br /&gt;Hasta en España -más vale tarde que nunca- se suceden los podcasts, encuentros, conferencias, cursos, seminarios y charlas. Por llegar, ha llegado hasta &lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://jmbeas.blogspot.com/2009/07/en-la-tenerife-lanparty-2k09.html&quot;&gt;a las LanParties&lt;/a&gt;! Lo próximo será un &lt;a href=&quot;http://www.agile-spain.com/que-es-como-hacer-open-space&quot;&gt;Open Space&lt;/a&gt; &lt;a href=&quot;http://www.agile-spain.com/agile-open-spain-2009&quot;&gt;en Madrid&lt;/a&gt;. Todo ello bien apoyado desde &lt;a href=&quot;http://www.agile-spain.com/&quot;&gt;agile-spain&lt;/a&gt;, la Comunidad Agile en castellano.&lt;br /&gt;&lt;br /&gt;Es una gran noticia. Está haciendo mucho ruido. Y eso es bueno. Es muy bueno. Porque ante todo, lo que Agile transmite es un &lt;a href=&quot;http://www.agile-spain.com/manifiesto_agil&quot;&gt;mensaje&lt;/a&gt;. Un mensaje que informa de que&lt;span style=&quot;font-weight: bold;&quot;&gt; existen mejores formas de desarrollar software&lt;/span&gt; y que por primera vez viene &lt;span style=&quot;font-weight: bold;&quot;&gt;de abajo a arriba&lt;/span&gt;, desde la gente que sabe desarrollar software a la gerencia y a los clientes.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Mi experiencia&lt;/h3&gt;Éste es un mensaje con el que estoy totalmente de acuerdo y que intento llevar a cabo en todos los equipos y proyectos por los que he pasado en los últimos años. No ha sido fácil. Sin apoyos, autoformándome en mi tiempo libre e introduciendo los cambios poco a poco, sacando horas de donde se podía.&lt;br /&gt;&lt;br /&gt;Primero adopé la visión y objetivo del &lt;span style=&quot;font-weight: bold;&quot;&gt;Manifiesto&lt;/span&gt; y los &lt;a href=&quot;http://www.agilemanifesto.org/principles.html&quot;&gt;Principios Ágiles&lt;/a&gt;.&lt;br /&gt;Luego fuí aplicando muchas de las llamadas &lt;span style=&quot;font-weight: bold;&quot;&gt;Prácticas Ágiles&lt;/span&gt; en el desarrollo de los proyectos, como el diseño y desarrollo dirigido a pruebas (TDD), automatización, integración continua, iteraciones, concepto de hecho, diseño simple y evolutivo, revisiones de código, retrospectivas y documentación inteligente o útil.&lt;br /&gt;Finalmente he utilizado algunas de las técnicas de las &lt;span style=&quot;font-weight: bold;&quot;&gt;Metodologías Ágiles&lt;/span&gt; para transformar la forma de organizar el trabajo del día a día y alcanzar un nivel de agilidad más completo.&lt;br /&gt;Consiguiendo así evolucionar la forma de desarrollar software, haciéndo proyectos más estables, eficaces y adaptables a los inevitables cambios, para satisfacción del cliente y propia.&lt;br /&gt;&lt;br /&gt;Hoy puedo decir que mis esfuerzos por ser Ágil me han ayudado a ser mejor profesional y, también, a formar equipos que &lt;span style=&quot;font-weight: bold;&quot;&gt;desarrollan mejor software&lt;/span&gt; y con los que da gusto trabajar. Aunque aún me queda mucho por aprender y mejorar, hoy soy consciente de que estoy en el camino correcto. Hace unos años no podía decir lo mismo.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Peligro&lt;/h3&gt;Sin embargo, últimamente noto el mensaje excesivamente -casi exclusivamente- dirigido a la implantación de las Metodologías Ágiles y principalmente &lt;a href=&quot;http://es.wikipedia.org/wiki/Scrum&quot;&gt;Scrum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Conviene recordar que las Metodologías Ágiles no son metodologías de desarrollo software en sí, sino simplemente de trabajo. Scrum (pej) no define qué entregables debe tener un proyecto, no define ni siquiera tipos de proyecto, si se debe usar UML, Diagramas Gantt, ni nada. Scrum es tan aplicable al desarrollo de software como a cualquier tipo de proceso divisible en tareas, pej. una mudanza! De hecho nuestro tan aclamado Scrum no es una metodología originalmente creada para el desarrollo de software.&lt;br /&gt;&lt;br /&gt;En mi opinión, para poder usar una Metodología Ágil, primero es necesario que el proyecto tenga un nivel técnico alto, basado principalmente en automatización, pruebas e integración continua. &lt;span style=&quot;font-weight: bold;&quot;&gt;Cómo podemos adoptar un desarrollo en iteraciones, si no tenemos modo de garantizar (al menos en parte) que el código que funcionaba en la iteración N sigue funcionando en la iteración N+1.&lt;/span&gt; ¿Mediante la repetición de fases de pruebas manuales? ¿Y eso es desarrollar mejor software?&lt;br /&gt;Citando a mi colega &lt;a href=&quot;http://planeta.javahispano.org/artesanodeprimera/&quot;&gt;Alfredo Casado&lt;/a&gt;:&lt;span style=&quot;font-style: italic;&quot;&gt; sin excelencia técnica no hay agilismo, sólo post-it pegados por las paredes&lt;/span&gt;. Y sinceramente el nivel técnico medio de los proyectos software a día de hoy deja bastante que desear.&lt;br /&gt;&lt;br /&gt;Por otro lado, no puedo dejar de preocuparme cuando leo mucha de la publicidad que se le está haciendo a las Metodologías Ágiles y a Scrum. Cosas del tipo&lt;span style=&quot;font-style: italic;&quot;&gt; sólo existen 2 tipos de metodologías: en cascada y ágiles&lt;/span&gt;, o &lt;span style=&quot;font-style: italic;&quot;&gt;sólo hay 2 formas de desarrollar buen software: trabajar en la NASA o usar Scrum&lt;/span&gt;, o &lt;span style=&quot;font-style: italic;&quot;&gt;si no obtienes beneficio de aplicar una Metodología Agile es porque no lo estás aplicando en su totalidad, por tanto debes contratar un experto en Agile&lt;/span&gt; o&lt;span style=&quot;font-style: italic;&quot;&gt; Scrum es el remedio contra la crisis mundial&lt;/span&gt;. Por supuesto todo rodeado de los nuevos buzzwords de turno, que así como que &lt;s&gt;engaña&lt;/s&gt; impacta más.&lt;br /&gt;&lt;br /&gt;Todas estas falacias -y otras más- no hacen sino distorsionar el mensaje original (mejores formas de desarrollar software) y dejar una imagen de vendedor de teletienda que no hace ningún bien, y sólo puede generar desconfianza. Supongo que va asociado al hype, pero ¿qué tal si intentamos todos ser un poco más responsables?&lt;br /&gt;&lt;br /&gt;También me preocupa -y mucho- el tema de las certificaciones en Scrum y el ansia de algunos por llegar a ser &lt;span style=&quot;font-style: italic;&quot;&gt;Agile Coach&lt;/span&gt;. Donde algunos ven la luz que iluminará el futuro, yo sólo veo una gallina; de huevos de oro, eso sí. Tiene toda la pinta de convertirse en el MBA de nuestro sector. Y si no, al tiempo.&lt;br /&gt;&lt;br /&gt;En realidad Scrum no es aplicable a más de la mitad de los proyectos. Entre otras cosas, requiere una enorme disponibilidad por parte del cliente (el &lt;span style=&quot;font-style: italic;&quot;&gt;Product Owner&lt;/span&gt; es parte del equipo), equipos con dedicación absoluta y de alto nivel técnico y una sala de reuniones por equipo disponible a primera hora. Al final tienes que adaptar Scrum a tus circunstancias, pero entonces yo pregunto: ¿y no será más fácil adaptar la metodología que se esté usando para agilizarla? Ah no, que eso no sería &lt;span style=&quot;font-style: italic;&quot;&gt;cool&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusión&lt;/h3&gt;¿Quiere ésto decir que las Metodologías Ágiles no aportan valor? En absoluto. Claro que aportan. Pero cada cosa en su sitio, sobre todo porque no siempre es posible y viable implantar una Metodología Agile oficial. Una Metodología Agile es la punta del iceberg, la guinda del pastel, debajo &lt;span style=&quot;font-weight: bold;&quot;&gt;necesitamos una sólida base construida a partir del Manifiesto, Principios y Prácticas Ágiles&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;No podemos dejarnos llevar por el hype de las Metodologías Ágiles, un hype que cada día tiene más parecidos con la religión que con desarrollar software, tanto por el fanatismo como por el negocio generado. De hecho hasta el nombre de Agilismo ha calado. Pero yo no quiero ser Agilista, yo no necesito creer en ninguna Metodología concreta ni en guías espirituales.&lt;br /&gt;&lt;br /&gt;Yo quiero ser Ágil. Y se puede ser Ágil sin seguir fielmente una de las Metodologías Ágiles oficiales. Porque el valor de ser ágil es evidente: automatización, pruebas, integración continua, entregas periódicas de un software que funciona, equipos orgullosos y comprometidos con su trabajo, código de mejor calidad, documentación útil, respuesta frente a cambios en los requisitos, compresión y colaboración del cliente,... entre otros. Ésto sí son mejores formas de desarrollar software!</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/6242795082428017591/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/09/agil-o-agilista.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/6242795082428017591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/6242795082428017591'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/09/agil-o-agilista.html' title='¿Agil o Agilista?'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-5232331871891081162</id><published>2009-08-14T19:35:00.000+02:00</published><updated>2009-08-16T19:59:18.343+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><title type='text'>Tip Eclipse: Renombrar atributo junto a sus métodos get/set</title><content type='html'>Uno de los refactorings que más me gustan de Eclipse es el de Renombrar sobre el propio editor de código, sin necesidad de usar un diálogo o nueva pantalla. El genial &lt;span style=&quot;font-style: italic;&quot;&gt;Alt+May+R&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pero como soy muy maniático con los nombres, muchas veces me da por cambiar el nombre de los atributos, por lo que tengo que ir a sus correspondientes métodos get/set y renombrarlos a mano. En el colmo de la perrería, a veces lo que hago es borrarlos y volver a generarlos automáticamente.&lt;br /&gt;&lt;br /&gt;Ahora, con Eclipse 3.5 Galileo es mucho más sencillo. Basta con pulsar 2 veces el mismo atajo &lt;span style=&quot;font-style: italic;&quot;&gt;Alt+May+R&lt;/span&gt; sobre el nombre del atributo y aparecerá un diálogo con las opciones de renombrar también sus métodos get y set.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SoVPC63Q0zI/AAAAAAAAADk/RjBbGsxHEgc/s1600-h/renombrar.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 206px;&quot; src=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SoVPC63Q0zI/AAAAAAAAADk/RjBbGsxHEgc/s320/renombrar.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5369785042288562994&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Encima tiene memoria y te guarda tus preferencias. Esta gente piensa en todo!</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/5232331871891081162/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/tip-eclipse-renombrar-atributo-junto.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/5232331871891081162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/5232331871891081162'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/tip-eclipse-renombrar-atributo-junto.html' title='Tip Eclipse: Renombrar atributo junto a sus métodos get/set'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_wU4MuFZcKsM/SoVPC63Q0zI/AAAAAAAAADk/RjBbGsxHEgc/s72-c/renombrar.gif" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-6445486165561113599</id><published>2009-08-14T10:50:00.005+02:00</published><updated>2009-08-14T12:26:12.838+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="tomcat"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><title type='text'>Cómo configurar el uso de memoria de un servidor en Eclipse</title><content type='html'>Antes de irme de fin de semana -qué ganas- dejo una chuletilla sobre cómo modificar la configuración de arranque y el uso de memoria de un servidor en Eclipse y en general.&lt;br /&gt;&lt;br /&gt;Recuerda que la JVM usa 2 tipos de memoria. La memoria &lt;span style=&quot;font-style: italic;&quot;&gt;Heap &lt;/span&gt;donde se crean los objetos y que es gestionada por el &lt;span style=&quot;font-style: italic;&quot;&gt;GargabeCollector &lt;/span&gt;que se encarga de liberar memoria en caso necesario. Y la memoria &lt;span style=&quot;font-style: italic;&quot;&gt;PermGen &lt;/span&gt;que se utiliza principalmente para cargar las definiciones de las clases de forma permanente, pero también para trabajar con código nativo.&lt;br /&gt;&lt;br /&gt;1) En Eclipse, ir a: Run -&gt; Run configurations -&gt; &lt;span style=&quot;font-style: italic;&quot;&gt;TuServidor&lt;/span&gt; -&gt; Arguments -&gt; VM Arguments&lt;br /&gt;&lt;br /&gt;2) Para evitar el clásico&lt;span style=&quot;font-weight: bold;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;java.lang.OutOfMemoryError: Java Heap space&lt;/span&gt;, usar las opciones de la VM:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-Xms64m&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-Xmx256m&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es un ejemplo que asigna 64mb a la memoria heap de inicio y le permite crecer hasta un máximo de 256mb. Esta configuración debería ser más que suficiente si estás en desarrollo y sólo tienes una aplicación configurada para arrancar en el servidor. Antes de incrementarla, tómate unos segundos para meditar si el fallo pudiera ser causa de un memory leak.&lt;br /&gt;&lt;br /&gt;3) Para evitar el igualmente clásico &lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;java.lang.OutOfMemoryError: PermGen space&lt;/span&gt;, usar las opciones de la VM:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-XX:PermSize=64m&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-XX:MaxPermSize=128m&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es un ejemplo que asigna 64mb a la memoria perm de inicio y le permite crecer hasta un máximo de 128mb. De nuevo, este ejemplo debería ser más que suficiente si sólo tienes un par de aplicaciones configuradas en el servidor. Aunque todo dependerá del número de despliegues en caliente que realices habitualmente sin reiniciar el servidor.&lt;br /&gt;&lt;br /&gt;Otra opción es intentar que el garbage collector recicle la memoria permgen. Para ello prueba a activar el recolector concurrente con los siguientes parámetros:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-XX:+UseConcMarkSweepGC&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-XX:+CMSPermGenSweepingEnabled&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-XX:+CMSClassUnloadingEnabled&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finalmente un par de enlaces a las páginas oficiales de &lt;a href=&quot;http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp&quot;&gt;opciones de la VM&lt;/a&gt; y la&lt;a href=&quot;http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html&quot;&gt; guía de tuning del gc de la jvm 5&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/6445486165561113599/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/como-configurar-el-uso-de-memoria-de-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/6445486165561113599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/6445486165561113599'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/como-configurar-el-uso-de-memoria-de-un.html' title='Cómo configurar el uso de memoria de un servidor en Eclipse'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-9179220604029882725</id><published>2009-08-14T09:05:00.000+02:00</published><updated>2009-08-14T09:05:42.149+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="etl"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="pentaho"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><title type='text'>Primeras impresiones con Pentaho Data Integration (Kettle)</title><content type='html'>&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;UPDATE 090814:&lt;/span&gt; Se añade información sobre la ejecución de una transformación y su impact.&lt;/span&gt;&lt;br /&gt;&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: right; width: 242px; height: 80px;&quot; src=&quot;http://1.bp.blogspot.com/_wU4MuFZcKsM/SoPKZHQbT_I/AAAAAAAAADc/ucnQwrhAQ9c/s320/pentaho_logo.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5369357713549250546&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;A veces en un proyecto software es necesario extraer, transformar y cargar información de una o varias fuentes de datos.  A este proceso se le conoce como &lt;a href=&quot;http://es.wikipedia.org/wiki/ETL&quot;&gt;ETL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Los ejemplos típicos de procesos ETL incluyen (i) extracciones de datos desde ficheros con diversos formatos, bases de datos o servicios web, (ii) transformaciones como traducciones de valores, calculos de nuevos valores, cruces de fuentes de datos, filtrar registros, generación de claves, división de columnas o pivotar filas a columnas y viceversa, y (iii) cargas a ficheros o tablas de bases de datos.&lt;br /&gt;&lt;br /&gt;La tarea puede llegar a ser bastante compleja, no sólo por la diversidad de las fuentes de datos sino por la variedad de transformaciones a realizar. Sobre todo en el caso de las grandes organizaciones, las llamadas Enterprise, donde cada departamento funciona como le da la gana.&lt;br /&gt;&lt;br /&gt;Esta semana me ha tocado (lo que tienen las vacaciones, las de los demás claro) realizar un proceso ETL relativamente simple. Así que he aprovechado para probar la aplicación &lt;a href=&quot;http://www.pentaho.com/products/data_integration/&quot;&gt;Pentaho Data Integration&lt;/a&gt;, también conocida como Kettle o Spoon, que forma parte de la suite opensource &lt;a href=&quot;http://www.pentaho.com/&quot;&gt;Pentaho&lt;/a&gt; de Business Intelligence.&lt;br /&gt;&lt;br /&gt;La instalación es muy sencilla. Es una aplicación Java, así que necesita tener instalada una JVM. Por lo demás es simplemente &lt;a href=&quot;http://sourceforge.net/projects/pentaho/files/Data%20Integration/&quot;&gt;descargar&lt;/a&gt;, descomprimir y ejecutar el script de arranque.&lt;br /&gt;&lt;br /&gt;Con Kettle puedes crear transformaciones y trabajos (jobs) de forma visual arrastrando, uniendo y configurando los distintos pasos.&lt;br /&gt;&lt;br /&gt;Una transformación incluye pasos de extracción, transformación y carga del tipo anteriormente comentado y muchos más. Cada uno de estos pasos se puede previsualizar por separado. Una vez diseñada la transformación, se puede validar, ejecutar, debugear, monitorizar, analizar su impacto en el rendimiento y obtener el código sql que genera.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SoPIQ-zO81I/AAAAAAAAADM/yFquIKc1d3Y/s1600-h/PDI_transformation.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 144px;&quot; src=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SoPIQ-zO81I/AAAAAAAAADM/yFquIKc1d3Y/s200/PDI_transformation.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5369355374817112914&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Un trabajo te permite configurar cómo y cuando se ejecutará una transformación. Sus pasos incluyen, a parte de ejecutar una transformación existente, planificar el inicio, abortar, enviar y recibir emails, operaciones con ficheros, ejecutar un http get, evaluar condiciones sobre ficheros, servidores y tablas, ejecutar scripts sql, javascript y shell, validar xml, escribir log y usar ftp, entre otros.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_wU4MuFZcKsM/SoPIWHZ7oZI/AAAAAAAAADU/UQBOL-fpVCE/s1600-h/PDI_job.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 144px;&quot; src=&quot;http://1.bp.blogspot.com/_wU4MuFZcKsM/SoPIWHZ7oZI/AAAAAAAAADU/UQBOL-fpVCE/s200/PDI_job.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5369355463026254226&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Conviene tener en cuenta el impacto de la transformación sobre la base de datos a la hora de planificar su ejecución en Producción. Normalmente son tareas muy pesadas que pueden afectar al rendimiento general durante muchos minutos. Así que deben ser ejecutadas en horario de mínima actividad.&lt;br /&gt;&lt;br /&gt;El uso de Kettle es muy intuitivo y ágil desde el principio, como se puede en las &lt;a href=&quot;http://wiki.pentaho.com/display/EAI/Getting+started&quot;&gt;flash demos&lt;/a&gt; que hay disponibles en la &lt;a href=&quot;http://wiki.pentaho.com/display/EAI/Latest+Pentaho+Data+Integration+%28aka+Kettle%29+Documentation&quot;&gt;wiki&lt;/a&gt;. De hecho, en menos de una hora ya tenía hecha una primera versión de mi transformación a la que sólo le faltaban algunos detalles de formatos. Para ser mi primera vez estuvo muy bien!&lt;br /&gt;&lt;br /&gt;En la wiki también existe una buena cantidad de documentación. Además existe una&lt;a href=&quot;http://downloads.sourceforge.net/pentaho/Spoon_3_0_0_GA_User_Guide.pdf&quot;&gt; guía de usuario en pdf&lt;/a&gt; bastante completa que merece la pena tener a mano como referencia.&lt;br /&gt;&lt;br /&gt;Una sorpresa que me llevé fue que está traducida en parte al castellano. Aunque como todo no puede ser perfecto, el típico botón &lt;span style=&quot;font-style: italic;&quot;&gt;Ok&lt;/span&gt; o &lt;span style=&quot;font-style: italic;&quot;&gt;Aceptar&lt;/span&gt; ha sido traducido por &lt;span style=&quot;font-style: italic;&quot;&gt;Vale&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;En resumen, Kettle (Spoon) me ha encantado. Es muy completo, sencillo y eficaz. Me va a hacer la vida muy fácil cuando tenga que realizar tareas de ETL.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/9179220604029882725/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/primeras-impresiones-con-pentaho-data.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/9179220604029882725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/9179220604029882725'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/primeras-impresiones-con-pentaho-data.html' title='Primeras impresiones con Pentaho Data Integration (Kettle)'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_wU4MuFZcKsM/SoPKZHQbT_I/AAAAAAAAADc/ucnQwrhAQ9c/s72-c/pentaho_logo.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-822293935140777462</id><published>2009-08-05T22:34:00.017+02:00</published><updated>2010-01-26T12:30:22.865+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="maven"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><title type='text'>Chuleta Maven</title><content type='html'>&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;UPDATE 20100126:&lt;/span&gt; Añadido cómo configurar el máximo de memoria heap&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A continuación una chuleta con buena parte de lo que llevo aprendido usando Maven estos dos últimos meses más algunas referencias.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&gt; 1. CREAR PROYECTOS&lt;/h3&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Crear un proyecto jar&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn archetype:create -DgroupId=com.example -DartifactId=example-jar-project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Crear un proyecto war&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn archetype:create -DarchetypeartifactId=maven-archetype-webapp&lt;/span&gt; &lt;span style=&quot;font-family:courier new;&quot;&gt;-DgroupId=com.example -DartifactId=example-war-project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&gt; 2. ECLIPSE&lt;/h3&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Configurar plugin &lt;span style=&quot;font-style: italic;&quot;&gt;eclipse&lt;/span&gt; para descargar fuentes y javadocs de las dependencias&lt;/span&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-eclipse-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;!-- Ojo, la versión 2.6 tiene bugs con AJDT --&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt; &amp;lt;downloadSources&amp;gt;true&amp;lt;/downloadSources&amp;gt;&lt;br /&gt; &amp;lt;downloadJavadocs&amp;gt;true&amp;lt;/downloadJavadocs&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Crear variable M2_REPO&lt;/span&gt;&lt;br /&gt;Ir a  Window -&gt; Preferences -&gt; Java -&gt; Build path -&gt; Classpath variable -&gt; New&lt;br /&gt;Name: M2_REPO&lt;br /&gt;Path: /ruta/a/tu/.m2/repository&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Generar ficheros de configuración de un proyecto jar Eclipse&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn eclipse:eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Generar ficheros de configuración de un proyecto war Eclipse&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn eclipse:eclipse -Dwtpversion=1.5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Cargar un proyecto en Eclipse&lt;/span&gt;&lt;br /&gt;Ir a File -&gt; Import -&gt; General -&gt; Existing project into Workspace -&gt; Select root directory&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Borrar ficheros de configuración proyecto Eclipse&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn eclipse:clean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora más que nunca, se recomienda no subir a CVS o similar los ficheros de configuración del proyecto en el IDE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&gt; 3. CONFIGURACIÓN DE PLUGINS MÁS COMUNES&lt;/h3&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Configurar un plugin para este pom y sus hijos&lt;/span&gt;&lt;br /&gt;En build -&gt; pluginManagement -&gt; plugins&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Configurar un plugin sólo para este pom&lt;/span&gt;&lt;br /&gt;En build -&gt; plugins&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Configurar encoding y versión java de compilación&lt;/span&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.0.2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt; &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;&lt;br /&gt; &amp;lt;source&amp;gt;1.4&amp;lt;/source&amp;gt;&lt;br /&gt; &amp;lt;target&amp;gt;1.4&amp;lt;/target&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Configurar plugin surefire para ignorar fallos de tests, definir patrones de nombres de tests aceptados y configurar propiedades de sistema (locale) durante la ejecución de los tests&lt;/span&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.4.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt; &amp;lt;testFailureIgnore&amp;gt;true&amp;lt;/testFailureIgnore&amp;gt;&lt;br /&gt; &amp;lt;includes&amp;gt;&lt;br /&gt;    &amp;lt;include&amp;gt;**/*Test.java&amp;lt;/include&amp;gt;&lt;br /&gt;    &amp;lt;include&amp;gt;**/*Tests.java&amp;lt;/include&amp;gt;&lt;br /&gt; &amp;lt;/includes&amp;gt;&lt;br /&gt; &amp;lt;systemProperties&amp;gt;&lt;br /&gt;    &amp;lt;property&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;user.language&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;es&amp;lt;/value&amp;gt;&lt;br /&gt;    &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;property&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;user.country&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;ES&amp;lt;/value&amp;gt;&lt;br /&gt;    &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/systemProperties&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&gt; 4. COMANDOS ÚTILES EN EL DÍA A DÍA&lt;/h3&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Borrar carpeta de construcción&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn clean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ejecutar tests&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Construir proyecto&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn package&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Instalar proyecto en tu repositorio local&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Instalar (desplegar) proyecto en el repositorio de la organización (necesita configuración)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn deploy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ejecutar Maven saltándose los tests (unitarios e integración)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn xxxxxxx -Dmaven.test.skip=true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Mostrar el stacktrace de excepción&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn xxxxxxx -e&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Mostrar información de debug&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn xxxxxxx -X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Instalar una libreria de terceros en tu repositorio local&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;mvn install:install-file -Dfile=ruta/a/fichero/jar&lt;/span&gt; &lt;span style=&quot;font-family:courier new;&quot;&gt;-DgroupId=com.example -DartifactId=nombre_libreria&lt;/span&gt; &lt;span style=&quot;font-family:courier new;&quot;&gt;-Dversion=x.y.z -Dpackaging=jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Instalar (desplegar) una libreria de terceros &lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;en el repositorio de la organización (necesita configuración)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn deploy:deploy-file -Dfile=ruta/a/fichero/jar&lt;/span&gt; &lt;span style=&quot;font-family:courier new;&quot;&gt;-DrepositoryId=id_repositorio -Durl=url_repositorio&lt;/span&gt; &lt;span style=&quot;font-family:courier new;&quot;&gt;-DgroupId=com.example -DartifactId=nombre_libreria &lt;/span&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;-Dversion=x.y.z -Dpackaging=jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ver pom efectivo (suma de poms padres)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn help:effective-pom&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ejecutar Maven en modo offline&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn xxxxxxx -o&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Preparar Maven para poder ejecutarse en modo offline&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn dependency:go-offline&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ejecutar Maven con máximo de memoria heap configurable&lt;/span&gt; (ejemplo con 512m)&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn &lt;/span&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;xxxxxxx -DXmx512m&lt;/span&gt;&lt;br /&gt;o editar la variable de sistema MAVEN_OPTS=-Xmx512m&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&gt; 5. DEPENDENCIAS&lt;/h3&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Ver jerarquía de dependencias&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn dependency:tree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Ver dependencias en orden alfabético&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn dependency:resolve&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Analizar uso de dependencias&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;$ mvn dependency:analyze&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&gt; 6. RECURSOS&lt;/h3&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;Ciclos de vida&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&quot;&gt;http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Estructura estándar de carpetas&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html&quot;&gt;http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Propiedades&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide&quot;&gt;http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Pom&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://maven.apache.org/ref/2.2.1/maven-model/maven.html&quot;&gt;http://maven.apache.org/ref/2.2.1/maven-model/maven.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Plugins más comunes&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://maven.apache.org/plugins/index.html&quot;&gt;http://maven.apache.org/plugins/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Documentación oficial&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://maven.apache.org/guides/index.html&quot;&gt;http://maven.apache.org/guides/index.html&lt;/a&gt;&lt;a href=&quot;http://nexus.sonatype.org/index.html&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Libro gratuito: Maven La Guía Definitiva&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://www.sonatype.com/books/maven-book/reference/&quot;&gt;http://www.sonatype.com/books/maven-book/reference/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Gestor de repositorios Nexus&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://nexus.sonatype.org/index.html&quot;&gt;http://nexus.sonatype.org/index.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://maven.apache.org/guides/index.html&quot;&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/822293935140777462/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/chuleta-maven.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/822293935140777462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/822293935140777462'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/08/chuleta-maven.html' title='Chuleta Maven'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-1703971797239539267</id><published>2009-07-31T08:32:00.000+02:00</published><updated>2009-07-31T08:36:22.169+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><title type='text'>Esquema de un Sistema de Gestión de Desarrollo Software</title><content type='html'>&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;UPDATE 090731&lt;/span&gt;: Se mejora la imagen del esquema y se subraya la importancia de la automatización de la alimentación del Sistema.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Me encuentro sumido en un proyecto de consultoría para definir un Sistema de Gestión de Desarrollo de Proyectos o &lt;a href=&quot;http://www.manuelrecena.com/blog/archives/219&quot;&gt;Ecosistema Software&lt;/a&gt;.  Así que aprovecho para compartir una primera versión del esquema lógico sobre el que estoy trabajando.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SnKP4AwuWdI/AAAAAAAAADE/cqLIOAnGlSk/s1600-h/ecosistema+desarrollo+ii.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 225px;&quot; src=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SnKP4AwuWdI/AAAAAAAAADE/cqLIOAnGlSk/s400/ecosistema+desarrollo+ii.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5364508298591492562&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Wiki&lt;/h4&gt;Es el punto de entrada principal al Sistema.&lt;br /&gt;Contiene la información básica de cada proyecto y la organización.&lt;br /&gt;Redirige al resto de aplicaciones del Sistema.&lt;br /&gt;Permite la creación de documentación de forma colaborativa.&lt;br /&gt;Control de cambios automático.&lt;br /&gt;Documentación exportable a formato pdf.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Cms&lt;/h4&gt;Sistema de Gestión Documental para los documentos binarios, como word, powerpoint, etc.&lt;br /&gt;No toda la documentación puede estar en el Wiki.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Project Management&lt;/h4&gt;Visión de alto nivel de la gestión de proyectos.&lt;br /&gt;Cuadro de mandos ágil para directivos.&lt;br /&gt;Gestiona resto de estados de un proyecto que no son Desarrollo.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Issue Management&lt;/h4&gt;Gestión del desarrollo de cada proyecto con sus versiones, tareas, equipo, trazabilidad, etc.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Scm&lt;/h4&gt;Sistema de Gestión de Control de Fuentes (CVS, Subversion, Git,... etc.)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Continuous Integration Server&lt;/h4&gt;Descarga, construye, prueba, analiza el código, crea informes de estado y despliega en el Demos Server los proyectos de forma automática y periódica.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Demos Server&lt;/h4&gt;Servidor de demos del estado actual de cada proyecto.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Otros&lt;/h4&gt;Notificaciones vía RSS y e-mail.&lt;br /&gt;Single Sign On.&lt;br /&gt;Privacidad.&lt;br /&gt;Integración con el IDE del equipo de desarrollo para &lt;span style=&quot;font-weight: bold;&quot;&gt;automatizar la alimentación&lt;/span&gt; del Sistema y garantizar la trazabilidad.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora toca analizar alternativas y seleccionar la que más se ajuste a las necesidades del cliente.&lt;br /&gt;Los mayores problemas están en (1) el análisis del Wiki y el Cms por la cantidad de alternativas disponibles y (2) en la herramienta de Project Management porque cada organización tiene un punto de vista muy personal sobre la gestión de proyectos, lo que interesa y lo que no. Así que no descarto que haya que desarrollar una aplicación a medida como suelen tener todas las organizaciones.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/1703971797239539267/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/07/esquema-de-un-sistema-de-gestion-de.html#comment-form' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/1703971797239539267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/1703971797239539267'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/07/esquema-de-un-sistema-de-gestion-de.html' title='Esquema de un Sistema de Gestión de Desarrollo Software'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_wU4MuFZcKsM/SnKP4AwuWdI/AAAAAAAAADE/cqLIOAnGlSk/s72-c/ecosistema+desarrollo+ii.jpg" height="72" width="72"/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-4203633001565250785</id><published>2009-07-09T08:48:00.003+02:00</published><updated>2009-07-09T08:48:00.864+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mundo it"/><title type='text'>Cuanto vale un experto en programacion (ii)</title><content type='html'>Empezamos nuestra vida profesional programando. A muchos nos encanta. Va más allá de una obligación o un mal menor y temporal en un camino mezquino. Es una pasión. Disfrutamos construyendo buen software y cúanto mejor lo hacemos, más nos gusta. Por eso nos cuesta abandonar la rama técnica de nuestro sector. Aunque es una rama corta, torcida y con un techo salarial injusto.&lt;br /&gt;&lt;br /&gt;Hace unos dias&lt;a href=&quot;http://jcesarperez.blogspot.com/2009/07/cuanto-vale-un-experto-en-programacion.html&quot;&gt; os contaba&lt;/a&gt; que &lt;a href=&quot;http://es.wikipedia.org/wiki/Kent_Beck&quot;&gt;Kent Beck&lt;/a&gt; ofrecía sus servicios durante 2 horas de forma remota a través de ebay. Me pareció una buena prueba para saber dónde está este techo ahora. Para saber cúanto vale un experto en programación y animarme a no cambiar de rama.&lt;br /&gt;&lt;br /&gt;Finalmente la &lt;a href=&quot;http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&amp;amp;item=180375524276&quot;&gt;puja&lt;/a&gt; se cerró en 405 dolares americanos. No llega a 300 euros al cambio actual. Más o menos lo que cualquier consultora cobra por una jornada de un perfil técnico medio aquí en España. No sé a vosotros, pero a mi me parece poco. Me cuesta creer que haya faltado repercusión o que la cuestión del remoto haya sido un impedimento. Sinceramente me esperaba más dinero. Sobretodo teniendo en cuenta que por casi cualquier curso o seminario con un profesor anónimo ya se está facturando eso o incluso más. Y no es lo mismo un formador que un experto.&lt;br /&gt;&lt;br /&gt;La conclusión es tan clara como desmotivadora. &lt;span style=&quot;font-weight: bold;&quot;&gt;Un experto en programación vale poco en comparación con otros expertos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Por qué&lt;br /&gt;&lt;/h4&gt;Por un lado es un &lt;span style=&quot;font-weight: bold;&quot;&gt;problema de actitud&lt;/span&gt;. Nos quejamos mucho en nuestros circulos internos pero reivindicamos poco o nada en comparación con otros colectivos de trabajadores.&lt;br /&gt;&lt;br /&gt;Pero principalmente pienso que es un problema de&lt;span style=&quot;font-weight: bold;&quot;&gt; no saber reconocer la calidad ni importancia del trabajo de un programador&lt;/span&gt;. Me explico. Reconocer la calidad del trabajo de un diseñador gráfico es sencillo (gustos aparte). Reconocer la calidad del trabajo de un experto en usabilidad es sencillo. Reconocer la calidad del trabajo de un tester es factible con métricas sobre el número de bugs detectados. Reconocer la calidad del trabajo de un formador también es sencillo. Calcular la comisión del trabajo de un comercial se hace todos los dias.&lt;br /&gt;&lt;br /&gt;Sin embargo, reconocer la calidad del trabajo de un programador no es fácil para alguien que no sea también programador. Características como la eficacia, estabilidad y escalabilidad del código de una aplicación no son fácilmente medibles a primera vista. Ni siquiera para un programador. Ya sea sobre el código o sobre la aplicación funcionando. ¿Es culpa del análisis, del código propio de la aplicación, de alguna librería externa, del servidor, del proxy, de la base de datos,...?&lt;br /&gt;&lt;br /&gt;Mucho más dificil es responsabilizar de cualquier mérito o demérito a un programador concreto dentro de todo un equipo de desarrollo. ¿Trazabiliqué? Todos somos de excusa rápida para nuestros fallos y muy poco comprensivos para los de los demás.&lt;br /&gt;&lt;br /&gt;La complejidad se multiplica para el caso de aplicaciones enterprise donde existen numerosas fuentes de datos, cuya integridad y fiabilidad no dependen directamente del programador pero si pueden afectar a la aparente calidad de su trabajo. ¿A quién no le han abierto una incidencia que realmente era por un bug en un servicio externo, por inconsistencia de datos o simplemente porque estaba caido algún sistema externo?&lt;br /&gt;&lt;br /&gt;Al final el cliente termina por aceptar y convivir con que sus aplicaciones fallan y necesitan de grandes contratos en mantenimiento correctivo y funcional. Los comerciales hacen su trabajo. La empresa gana dinero. Y nosotros terminamos parcheando dinosaurios. Todo puede seguir como estaba.&lt;br /&gt;&lt;br /&gt;Aún así, nosotros, los que programamos, sabemos que un buen programador no es que valga x2 o x3. Vale mucho más. Mientras que un mal programador ya no es que sume poco, es que llega a restar. Lo sabemos porque lo vivimos a diario, pero comunicar esta lección a otros niveles no es fácil.&lt;br /&gt;&lt;br /&gt;Un futuro mejor pasa irremediablemente por &lt;span style=&quot;font-weight: bold;&quot;&gt;medir la calidad de un proyecto&lt;/span&gt;, y por tanto &lt;span style=&quot;font-weight: bold;&quot;&gt;medir la calidad de sus programadores&lt;/span&gt;. Con números delante, todo el mundo es capaz de  medir y comparar. Para ello se puede (1) medir la calidad del código mediante métricas de análisis estático, (2) medir la cobertura de tests unitarios del código y (3) definir tests de aceptación funcionales y de esfuerzo sobre la aplicación. Con lo primero medimos mantenibilidad, con lo segundo fiabilidad y con lo tercero eficacia, estabilidad y escalabilidad.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/4203633001565250785/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/07/cuanto-vale-un-experto-en-programacion_09.html#comment-form' title='20 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/4203633001565250785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/4203633001565250785'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/07/cuanto-vale-un-experto-en-programacion_09.html' title='Cuanto vale un experto en programacion (ii)'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-1557756090187653325</id><published>2009-07-02T07:54:00.000+02:00</published><updated>2009-07-02T01:33:33.176+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mundo it"/><title type='text'>Cuanto vale un experto en programacion</title><content type='html'>Estamos acostumbrados a enfrentarnos a nuevos problemas por nosotros solos a diario. No nos queda otra. El aprendizaje a base de &lt;s&gt;ostias&lt;/s&gt; investigación, prueba y error es una realidad por la que todos pasamos y que viene a cubrir las carencias de los sistemas de formación profesionales.&lt;br /&gt;&lt;br /&gt;Pero muchas veces podemos dedicar días y días, incluso semanas, para dar con la solución. Se soluciona sí. Se aprende también. Pero no es eficiente. Por un lado, tiene un coste psicológico en la persona o equipo en forma de stress, desmotivación y quemado. Por otro, tiene también un coste económico en las cuentas del proyecto. Y hasta puede tener un coste en imagen si el cliente se entera o simplemente por entregar con retraso.&lt;br /&gt;&lt;br /&gt;Contar con un experto podría resolver el problema de forma eficiente a la vez que mejoraría la formación del equipo. Por problema no sólo me refiero a un marrón, puede ser un conjunto de tareas importantes sobre las que el equipo no tiene aptitudes ni experiencia.&lt;br /&gt;&lt;br /&gt;Conozco algunas compañías donde se cuenta con esa figura de experto al más puro estilo &lt;span style=&quot;font-style: italic;&quot;&gt;Señor Lobo&lt;/span&gt; de Pulp Fiction. Aunque son muy pocas y a veces el experto no es tan experto. Pero siempre está la opción de subcontratar a un verdadero experto para resolver el problema. En España no se lleva. Una pena.&lt;br /&gt;&lt;br /&gt;Y todo este rollo al hilo de un&lt;a href=&quot;http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&amp;amp;item=180375524276&quot;&gt; sorprendente anuncio&lt;/a&gt; de &lt;a href=&quot;http://es.wikipedia.org/wiki/Kent_Beck&quot;&gt;Kent Beck&lt;/a&gt; en ebay, donde ofrece una sesión remota de programación en pareja de 2 horas. La sesión se hará mediante VNC para compartir la pantalla y Skype para comunicarse. Aunque puede ser para revisar código, las dos horas se pueden emplear en temas de diseño, testing o lo que se quiera. Va por 305 dolares pero aún faltan días para que se cierre la puja. Veremos como termina la cosa.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/1557756090187653325/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/07/cuanto-vale-un-experto-en-programacion.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/1557756090187653325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/1557756090187653325'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/07/cuanto-vale-un-experto-en-programacion.html' title='Cuanto vale un experto en programacion'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-8528992990391721384</id><published>2009-06-24T23:20:00.001+02:00</published><updated>2009-06-26T00:12:18.115+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><category scheme="http://www.blogger.com/atom/ns#" term="mundo it"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>Sobre pruebas y errores</title><content type='html'>&lt;img style=&quot;margin: 0pt 0pt 10px 10px; float: right; width: 200px; height: 131px;&quot; src=&quot;http://4.bp.blogspot.com/_wU4MuFZcKsM/SkI9L1k80HI/AAAAAAAAAC0/xEOoGRNm9Gw/s200/prueba_carga_puente.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5350906580839485554&quot; border=&quot;0&quot; /&gt;Veo en las noticias las imagenes de una prueba de carga en un nuevo puente de una autovía en Galicia (España). Durante un momento me quedo absorto mirando la larga flota de camiones sobre el majestuoso puente. Impresiona. No puedo evitar pensar: &lt;span style=&quot;font-style: italic;&quot;&gt;Vaya! eso sí que es una prueba manual. Y luego yo quejándome sobre las pruebas manuales que hacemos en el desarrollo de proyectos software...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bastan un par de segundos para darme cuenta de la tontería de mi reflexión. &lt;span style=&quot;font-style: italic;&quot;&gt;Si eso fuera una primera ejecución de una prueba exigente sobre un proyecto software recien construido, el puente se habría caido arrastrando a la flota de camiones tras él&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En el caso del puente, lo que no estamos viendo es todo el proceso de pruebas y control de calidad, que se ha realizado previamente en cada una de las fases del proyecto para evitar errores.&lt;br /&gt;&lt;br /&gt;Pero comparar nuestro mundo de desarrollo software -¿ingeniería software?- con el de la construcción o cualquier otra ingeniería es una &lt;span style=&quot;font-weight: bold;&quot;&gt;equivocación&lt;/span&gt;. Una equivocación torpe, injusta y desafortunada, porque, entre otras cosas, hace imaginarse a un programador como a un obrero. Así nos va.&lt;br /&gt;&lt;br /&gt;Aunque centrémonos en los errores. &lt;span style=&quot;font-weight: bold;&quot;&gt;Errar es humano&lt;/span&gt;. Obvio. A veces estamos distraidos, cansados, estresados, desmotivados o simplemente no somos perfectos y se nos escapan cosas.&lt;br /&gt;&lt;br /&gt;Otro hecho es que &lt;span style=&quot;font-weight: bold;&quot;&gt;los proyectos software salen a producción con demasiados errores&lt;/span&gt;. También obvio si estudiamos el ineficaz proceso de pruebas que se sigue en la mayoría de proyectos, basado en unas pruebas mínimas, manuales y sin documentar. Por lo que las pruebas dificilmente se repiten en el tiempo, aunque se modifique código afectado, haciendo aparecer nuevos errores o, peor aun, haciendo reaparecer viejos errores. ¿Vosotros compraríais algo cuyo proceso de pruebas fuera así?&lt;br /&gt;&lt;br /&gt;Lo primero no tiene solución. Pero sí se puede minimizar el efecto. Contratando &lt;span style=&quot;font-weight: bold;&quot;&gt;talento&lt;/span&gt; y con motivación.&lt;br /&gt;Lo segundo sí tiene solución. Aplicar un proceso &lt;span style=&quot;font-weight: bold;&quot;&gt;profesional&lt;/span&gt; de pruebas, basado en pruebas automatizadas, completas, independiente y repetibles. Los errores seguirán produciéndose, pero la mayoría serán detectados antes de llegar a producción.&lt;br /&gt;&lt;br /&gt;Por supuesto, siempre hará falta alguna prueba manual pero, al igual que en el puente, será más un mero trámite de aceptación que el actual infierno de prueba y error sin fin.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/8528992990391721384/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/sobre-pruebas-y-errores.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/8528992990391721384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/8528992990391721384'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/sobre-pruebas-y-errores.html' title='Sobre pruebas y errores'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_wU4MuFZcKsM/SkI9L1k80HI/AAAAAAAAAC0/xEOoGRNm9Gw/s72-c/prueba_carga_puente.JPG" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-7481151553269234523</id><published>2009-06-17T22:55:00.000+02:00</published><updated>2009-06-17T22:55:59.354+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><title type='text'>Nuevo cambio de look y AdSense</title><content type='html'>Aprovecho para anunciar un par de cambios en el blog: (1) nuevo cambio de look y (2) AdSense.&lt;br /&gt;&lt;br /&gt;Hacía tiempo que me había cansado del anterior &lt;span style=&quot;font-style: italic;&quot;&gt;template&lt;/span&gt;, un día sin querer dí con este &lt;span style=&quot;font-style: italic;&quot;&gt;The Journalist&lt;/span&gt; y hoy he decidido probarlo, tras unas mínimas modificaciones. No tiene más.&lt;br /&gt;&lt;br /&gt;El tema de AdSense sí requiere un poco más de explicación. No pretendo monetizar el blog. No creo ni que le fuera a sacar un euro aunque lo intentara. Sin embargo, sí quiero probar AdSense y ver cómo funciona de primera mano. Últimamente se me ha reactivado la vena emprendedora, así que quiero ver cómo va esto de la publicidad.&lt;br /&gt;&lt;br /&gt;Como siempre, cualquier opinión sobre alguno de los 2 temas será más que bievenido!</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/7481151553269234523/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/nuevo-cambio-de-look-y-adsense.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7481151553269234523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7481151553269234523'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/nuevo-cambio-de-look-y-adsense.html' title='Nuevo cambio de look y AdSense'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-4089725470066310636</id><published>2009-06-11T09:52:00.006+02:00</published><updated>2009-06-17T20:46:56.394+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="buenas practicas"/><category scheme="http://www.blogger.com/atom/ns#" term="webservices"/><title type='text'>Buenas practicas para desarrollar servicios web SOAP</title><content type='html'>Como complemento a mi último post, &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/06/arquetipo-de-wsdl-interoperable.html&quot;&gt;Arquetipo de WSDL interoperable&lt;/a&gt;, he decidido publicar este post con varias buenas prácticas para desarrollar servicios web SOAP. Como siempre, son sólo buenas prácticas según mi criterio, conocimiento y experiencia.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Analiza qué servicios web y con qué operaciones hay que desarrollar&lt;/span&gt;. Parece de perogrullo, pero es uno de los fallos más repetidos. Según mi experiencia suelen darse 2 esquemas a la hora de desarrollar servicios web: (i) el servicio web &lt;span style=&quot;font-style: italic;&quot;&gt;dios&lt;/span&gt; con todas las operaciones para él y (ii) un servicio web por operación. Ambos son malos. El primero incluso peor. Así que piensa y diseña servicios web con las responsabilidades bien repartidas, que sean cohesivos, extensibles, escalables y reutilizables.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Escribe tu mismo el fichero WSDL (&lt;/span&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://static.springframework.org/spring-ws/sites/1.5/reference/html/why-contract-first.html&quot;&gt;Contract-First&lt;/a&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;)&lt;/span&gt;. Es el interfaz, el contrato y, en definitiva, la clave para una interoperabilidad real e independiente de la tecnología. Además los generadores de WSDL pueden introducir dependencias con una tecnología concreta. Por eso merece la pena aprender a escribir WSDL (&lt;a href=&quot;http://www.w3schools.com/wsdl/&quot;&gt;aquí&lt;/a&gt;) y schemas XSD (&lt;a href=&quot;http://www.w3schools.com/schema/&quot;&gt;aquí&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A la hora de diseñar el interfaz de las operaciones, ten siempre en cuenta que es mucho &lt;span style=&quot;font-weight: bold;&quot;&gt;más eficiente un único mensaje enorme&lt;/span&gt; que el equivalente en multiples mensajes.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Sé coherente con la nomenclatura de namespaces de la organización&lt;/span&gt;. No hay nada que de peor impresión que un servicio web que no ha cuidado los namespaces.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;El WSDL debe ser compatible con el WS-I Basic Profile&lt;/span&gt;. El WS-I Basic Profile es un conjunto de especificaciones y buenas practicas definidas por la industria para obtener servicios web interoperables. Actualmente la última versión final publicada es la &lt;a href=&quot;http://www.ws-i.org/Profiles/BasicProfile-1.1.html&quot;&gt;1.1&lt;/a&gt;. Como mínimo, evita siempre los estilos RPC y sus tipos de datos no XML (SoapArrays), en su lugar usa el estilo Document/literal.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Usa &lt;span style=&quot;font-style: italic;&quot;&gt;http://localhost:puerto&lt;/span&gt; como dirección url del endpoint&lt;/span&gt; y deja que sea el motor de webservices el encargado de sustituirla por la real. Así evitarás tener un fichero WSDL por entorno.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Separa la definición de los mensajes del fichero WSDL&lt;/span&gt;. Para ello, diseña por separado un schema XSD donde se definan los mensajes y que sea importado por el fichero WSDL. Las principales ventajas son (1) reduce el tamaño/complejidad del WSDL, (2) permite utilizar editores especializados para el diseño del schema XSD y (3) permite reutilizar schemas y namespaces.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Define los mensajes de forma detallada mediante las &lt;/span&gt;&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://www.w3schools.com/schema/schema_facets.asp&quot;&gt;restricciones&lt;/a&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt; de los schemas XSD&lt;/span&gt;. De esta forma podrás validar los mensajes a nivel de XML mediante el api XML u OXM que uses, sin necesidad de implementar código propio.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A la hora de diseñar el schema XSD, &lt;span style=&quot;font-weight: bold;&quot;&gt;crea tipos y elementos globales&lt;/span&gt; (a nivel raíz) para poder reutilizarlos, tanto a nivel de elementos XML como clases del lenguaje de implementación del servicio web.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Además, &lt;span style=&quot;font-weight: bold;&quot;&gt;usa &lt;/span&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;minOccurs=0&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt; para definir un elemento como opcional&lt;/span&gt; y &lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;nillable=true&lt;/span&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;para indicar que un elemento puede ser vacío&lt;/span&gt; pero siempre estará presente en el mensaje XML. Ojo, no es lo mismo.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Si necesitas enviar ficheros adjuntos (attachments), hazlo a nivel de &lt;span style=&quot;font-weight: bold;&quot;&gt;http attachment&lt;/span&gt; y no como un elemento del mensaje XML.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Automatiza&lt;/span&gt; el proceso de generar el &lt;span style=&quot;font-style: italic;&quot;&gt;Skeleton&lt;/span&gt; y las clases OXM de mensajes del servicio web a partir del WSDL (wsdl2code).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Para realizar pruebas unitarias del servicio web no necesitas desplegarlo, puedes &lt;span style=&quot;font-weight: bold;&quot;&gt;programar tus tests a nivel de la clase Skeleton&lt;/span&gt;. Ahorraras mucho tiempo y ya desplegarás para las pruebas de integración o alguna demo.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Guarda log&lt;/span&gt; de los mensajes de entrada y salida junto con datos del cliente (ip, usuario), a nivel de fichero o base de datos.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Redacta un &lt;span style=&quot;font-weight: bold;&quot;&gt;documento Guía de pruebas de integración&lt;/span&gt; que sea completo e incluya casos de error y no sólo los casos básicos.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/4089725470066310636/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/buenas-practicas-para-desarrollar.html#comment-form' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/4089725470066310636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/4089725470066310636'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/buenas-practicas-para-desarrollar.html' title='Buenas practicas para desarrollar servicios web SOAP'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-8151390396562441382</id><published>2009-06-09T19:58:00.005+02:00</published><updated>2009-06-09T20:34:53.656+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="buenas practicas"/><category scheme="http://www.blogger.com/atom/ns#" term="webservices"/><title type='text'>Arquetipo de WSDL interoperable compatible con WS-I Basic Profile 1.1</title><content type='html'>En este post voy a publicar un WSDL de ejemplo que cumple con el &lt;a href=&quot;http://www.ws-i.org/Profiles/BasicProfile-1.1.html&quot;&gt;WS-I Basic Profile 1.1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La clave de la &lt;span style=&quot;font-weight: bold;&quot;&gt;interoperabilidad&lt;/span&gt; entre servicios web SOAP está en su interfaz &lt;a href=&quot;http://www.w3.org/TR/wsdl&quot;&gt;WSDL&lt;/a&gt;. El &lt;a href=&quot;http://es.wikipedia.org/wiki/WS-I_Basic_Profile&quot;&gt;WS-I Basic Profile&lt;/a&gt; es un conjunto de especificaciones y buenas prácticas definidos por la industria para desarrollar servicios web interoperables independientemente de la tecnología con que fueron desarrollados. Su última versión final es la 1.1 &lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;/span&gt;y debería ser un &lt;span style=&quot;font-style: italic;&quot;&gt;must-know&lt;/span&gt; para todos aquellos que tengan que definir un WSDL.&lt;br /&gt;&lt;br /&gt;El WSDL de ejemplo está diseñado para que use un schema XSD donde definir los mensajes de petición y respuesta de las operaciones. De esta forma se puede usar un editor de XSD como ayuda para diseñar la estructura de los mensajes, que es la parte más importante del WSDL y que requiere el verdadero esfuerzo intelectual. Dejando de esta forma el proceso de definir el fichero WSDL a un mero trámite de &lt;span style=&quot;font-style: italic;&quot;&gt;copy&amp;amp;paste&lt;/span&gt;.Además es una buena práctica en una SOA publicar los schemas xsd para reutilizar sus elementos.&lt;br /&gt;&lt;br /&gt;Este WSDL sólo tiene 1 operación. Además usa los siguientes literales como ejemplo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Nombre del servicio: &lt;span style=&quot;font-style: italic;&quot;&gt;nombreServicio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;Nombre de la operación: &lt;span style=&quot;font-style: italic;&quot;&gt;nombreOperacion&lt;/span&gt;&lt;/li&gt;&lt;li&gt;TargetNamespace del servicio: &lt;span style=&quot;font-style: italic;&quot;&gt;http://dominio/ws/nombreServicio&lt;/span&gt;&lt;/li&gt;&lt;li&gt;TargetNamespace del schema xsd: &lt;span style=&quot;font-style: italic;&quot;&gt;http://dominio/ws/nombreServicio/schema/msg&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;El fichero &lt;span style=&quot;font-weight: bold;&quot;&gt;schema&lt;/span&gt; xsd &lt;span style=&quot;font-style: italic;&quot;&gt;nombreServicio_msg.xsd&lt;/span&gt; sería el siguiente:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;schema xmlns:tns=&quot;http://dominio/ws/nombreServicio/schema/msg&quot;&lt;br /&gt;xmlns=&quot;http://www.w3.org/2001/XMLSchema&quot;&lt;br /&gt;targetNamespace=&quot;http://dominio/ws/nombreServicio/schema/msg&quot;&amp;gt;&lt;br /&gt;&amp;lt;element name=&quot;nombreOperacionRequest&quot;&amp;gt;&lt;br /&gt;&amp;lt;complexType&amp;gt;&lt;br /&gt; &amp;lt;sequence&amp;gt;&lt;br /&gt;  &amp;lt;element name=&quot;campo1&quot; type=&quot;string&quot;/&amp;gt;&lt;br /&gt;  &amp;lt;element name=&quot;campo2&quot; type=&quot;string&quot;/&amp;gt;&lt;br /&gt; &amp;lt;/sequence&amp;gt;&lt;br /&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;&amp;lt;/element&amp;gt;&lt;br /&gt;&amp;lt;element name=&quot;nombreOperacionResponse&quot;&amp;gt;&lt;br /&gt;&amp;lt;complexType&amp;gt;&lt;br /&gt; &amp;lt;sequence&amp;gt;&lt;br /&gt;  &amp;lt;element name=&quot;campo1&quot; type=&quot;string&quot;/&amp;gt;&lt;br /&gt;  &amp;lt;element name=&quot;campo2&quot; type=&quot;string&quot;/&amp;gt;&lt;br /&gt; &amp;lt;/sequence&amp;gt;&lt;br /&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;&amp;lt;/element&amp;gt;&lt;br /&gt;&amp;lt;/schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;La operación del servicio tiene 2 elementos de entrada y 2 de salida, todos de tipo string, a modo de ejemplo. Puedes modificar los mensajes existentes o crear mensajes para nuevas operaciones a tu gusto. No olvides modificar el targetNamespace.&lt;br /&gt;Si el schema xsd se complica puedes plantearte dividirlo por operaciones o por entrada y salida.&lt;br /&gt;Este fichero puede ser descargado &lt;a href=&quot;http://www.box.net/shared/a8auoid2vx&quot;&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El fichero &lt;span style=&quot;font-weight: bold;&quot;&gt;wsdl&lt;/span&gt; nombreServicio.wsdl sería el siguiente:&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;definitions name=&quot;nombreServicio&quot;&lt;br /&gt;xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot;&lt;br /&gt;xmlns=&quot;http://schemas.xmlsoap.org/wsdl/&quot;&lt;br /&gt;xmlns:wsaw=&quot;http://www.w3.org/2006/05/addressing/wsdl&quot;&lt;br /&gt;xmlns:tns=&quot;http://dominio/ws/nombreServicio&quot;&lt;br /&gt;xmlns:msg=&quot;http://dominio/ws/nombreServicio/schema/msg&quot;&lt;br /&gt;xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&lt;br /&gt;xmlns:ns=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;&lt;br /&gt;targetNamespace=&quot;http://dominio/ws/nombreServicio&quot;&amp;gt;&lt;br /&gt;&amp;lt;!-- Importacion de schemas --&amp;gt;&lt;br /&gt;&amp;lt;import namespace=&quot;http://dominio/ws/nombreServicio/schema/msg&quot;&lt;br /&gt; location=&quot;./nombreServicio_msg.xsd&quot;/&amp;gt;&lt;br /&gt;&amp;lt;!-- Definicion de mensajes --&amp;gt;&lt;br /&gt;&amp;lt;message name=&quot;nombreOperacionRequest&quot;&amp;gt;&lt;br /&gt; &amp;lt;part name=&quot;body&quot; element=&quot;msg:nombreOperacionRequest&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&amp;lt;message name=&quot;nombreOperacionResponse&quot;&amp;gt;&lt;br /&gt; &amp;lt;part name=&quot;body&quot; element=&quot;msg:nombreOperacionResponse&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/message&amp;gt;&lt;br /&gt;&amp;lt;portType name=&quot;nombreServicio&quot;&amp;gt;&lt;br /&gt; &amp;lt;!-- Relacion Mensaje-Operacion --&amp;gt;&lt;br /&gt; &amp;lt;operation name=&quot;nombreOperacion&quot;&amp;gt;&lt;br /&gt;  &amp;lt;input message=&quot;tns:nombreOperacionRequest&quot;&lt;br /&gt;   wsaw:Action=&quot;urn:nombreOperacion&quot;/&amp;gt;&lt;br /&gt;  &amp;lt;output message=&quot;tns:nombreOperacionResponse&quot;&lt;br /&gt;   wsaw:Action=&quot;urn:nombreOperacion&quot;/&amp;gt;&lt;br /&gt; &amp;lt;/operation&amp;gt;&lt;br /&gt;&amp;lt;/portType&amp;gt;&lt;br /&gt; &amp;lt;binding name=&quot;nombreServicioBinding&quot; type=&quot;tns:nombreServicio&quot;&amp;gt;&lt;br /&gt;  &amp;lt;soap:binding style=&quot;document&quot;&lt;br /&gt;    transport=&quot;http://schemas.xmlsoap.org/soap/http&quot;/&amp;gt;&lt;br /&gt;   &amp;lt;!-- Definicion de operaciones --&amp;gt;&lt;br /&gt;   &amp;lt;operation name=&quot;nombreOperacion&quot;&amp;gt;&lt;br /&gt;    &amp;lt;soap:operation soapAction=&quot;urn:nombreOperacion&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;input&amp;gt;&lt;br /&gt;     &amp;lt;soap:body use=&quot;literal&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/input&amp;gt;&lt;br /&gt;    &amp;lt;output&amp;gt;&lt;br /&gt;     &amp;lt;soap:body use=&quot;literal&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/output&amp;gt;&lt;br /&gt;  &amp;lt;/operation&amp;gt;&lt;br /&gt; &amp;lt;/binding&amp;gt;&lt;br /&gt;&amp;lt;service name=&quot;nombreServicio&quot;&amp;gt;&lt;br /&gt; &amp;lt;port name=&quot;nombreServicioPort&quot; binding=&quot;tns:nombreServicioBinding&quot;&amp;gt;&lt;br /&gt;  &amp;lt;soap:address location=&quot;http://localhost:8080&quot;/&amp;gt;&lt;br /&gt; &amp;lt;/port&amp;gt;&lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&amp;lt;/definitions&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo primero sería modificar los nombres del servicio, operación y targetNamespaces de ejemplo. Puedes añadir nuevas operaciones a tu gusto. Como puedes ver, he puesto comentarios indicando los sitios que deberían ser modificados.&lt;br /&gt;No cambies la url del endpoint. Por lo general, los servidores de webservices detectarán la url y realizarán la modificación de forma automática. De este modo te evitas tener una copia del WSDL por entorno (desarrollo, pruebas, producción, etc.).&lt;br /&gt;Este fichero puede ser descargado &lt;a href=&quot;http://www.box.net/shared/axkcv80p8o&quot;&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una vez realizadas las modificaciones convenientes no olvides validarlo todo, el schema xsd y el wsdl.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/8151390396562441382/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/arquetipo-de-wsdl-interoperable.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/8151390396562441382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/8151390396562441382'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/06/arquetipo-de-wsdl-interoperable.html' title='Arquetipo de WSDL interoperable compatible con WS-I Basic Profile 1.1'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-4669207265748017331</id><published>2009-05-30T23:46:00.000+02:00</published><updated>2009-06-17T22:29:35.912+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mundo it"/><title type='text'>Cuando la crisis golpea una consultora IT</title><content type='html'>Estaba cantado. La crisis ha llegado a nuestro sector. Va a quedarse y va a hacer daño. Ha tardado lo justo en que las empresas del resto de sectores ya en crisis se han recortado su presupuesto en proyectos IT, tanto nuevos como de mantenimiento. El resultado (previsible) es que el modelo de negocio de las grandes consultoras IT no se sostiene y no se sabe adaptar a la nueva situación.&lt;br /&gt;&lt;br /&gt;Son ya muchos años explotando un modelo de servicios desde un punto de vista basado unicamente en los números a corto plazo. Sin importar mucho más. Tecnología, conocimiento, proyectos, trabajadores o clientes. Son mentes financieras las que mueven los hilos al más alto nivel. Para ellas, el negocio IT no es muy diferente de cualquier otro, como podría ser el de las máquinas expendedoras.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Modelo de negocio Máquina expendedora&lt;/h4&gt;Existe una necesidad: el código. Y las consultoras hacen negocio con máquinas expendedoras de código. El código es un bien caro y se genera directamente dentro de las máquinas. Sin necesidad de comprar ninguna materia prima.&lt;br /&gt;&lt;br /&gt;Que un cliente necesita código, pues negocias cúantas máquinas de cada tipo le pones, por cúanto tiempo y, ala, a facturar.&lt;br /&gt;&lt;br /&gt;Las máquinas no tienen coste inicial, sólo de mantenimiento (salario) pero tampoco es que sea mucho. Como cualquier coste, se intenta reducir al máximo. No tiene mucha más preocupación. La prueba está en que existe una generalizada inversión de salario, donde no siempre a una máquina que aporta mayor valor le corresponde un mayor coste (salario).&lt;br /&gt;&lt;br /&gt;Las instalaciones tampoco es que sean excesivamente costosas (luz, agua, ordenadores, internet,...) o amplias, ni necesiten estar estrategicamente situadas. Además, con suerte, al cliente le da por tener las máquinas en sus propias instalaciones, por lo que es un gasto menos.&lt;br /&gt;&lt;br /&gt;En realidad no hace falta un modelo de negocio muy sofisticado. Ya es un negocio por si solo!&lt;br /&gt;&lt;br /&gt;Últimamente estaban teniendo el doble problema de que se iban demasiadas máquinas y que además habia escasez de nuevas máquinas. La solución (muy finaciera) ha sido (1) adquirir máquinas que no son expendedoras de código pero pueden pasar por ellas (o al menos se lo parece), (2) importar o usar máquinas de otros paises y (3) subcontratar a otras consultoras más pequeñas y baratas. En realidad nada grave que requiera cambiar el modelo.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;El golpe&lt;/h4&gt;El modelo era un éxito. Los records de facturación se han ido sucediendo año tras año. Hasta ahora. Al caer la economía de los grandes clientes de código, las consultoras se encuentran con excedentes de máquinas, los beneficios han caido y los objetivos se alejan.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Las primeras medidas&lt;/h4&gt;Una vez más, se toman medidas desde un punto de vista financiero. Dejar de contar con ese excedente de máquinas no es caro, mientras no sean muchas. Además las máquinas, de siempre, ni se quejan en exceso ni hacen mucho ruido. Así que no llevamos ni medio año de efecto crisis y ya asoman los primeros EREs. Y los que no se han dado ya es por no perder cotización en bolsa.&lt;br /&gt;&lt;br /&gt;Otras medidas a tomar, igual de rápidas que de injustas, son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Congelación de sueldos. El año pasado batiste record de facturación y se te paga congelándote el sueldo...&lt;/li&gt;&lt;li&gt;Invitaciones al personal en &lt;span style=&quot;font-style: italic;&quot;&gt;available&lt;/span&gt; para tomarse unas vacaciones sin sueldo aunque cotizando.&lt;/li&gt;&lt;li&gt;Reducción de la jornada laboral.&lt;/li&gt;&lt;li&gt;Reducir el número de días de vacaciones. Claro, todo el mundo sabe que aumentando en número de horas trabajadas, aumentas la productividad. Ésto último era puro sarcasmo.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;En realidad no dejan de ser meros parches para maquillar las cuentas. No son soluciones.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Alternativas&lt;/h4&gt;Se echa en falta un poco de imaginación y de conocimiento del sector. ¿Por qué no hacer?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Formación&lt;/span&gt;. Se &lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;puede impartir y recibir cursos en vivo u online. Personal más preparado sí es igual a mayor productividad.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Investigación&lt;/span&gt;. Se puede investigar y evaluar nuevas tecnologías, herramientas y metodologías que permitan un verdadero aumento de la productividad.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Desarrollo de productos&lt;/span&gt;. Para posteriormente intentar su venta. Vender productos no genera un beneficio tan inmediato como vender servicios porque primero hay que desarrollar el producto, pero da dinero y prestigio.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Desarrollo de aplicaciones internas&lt;/span&gt;. Ya se sabe que &lt;span style=&quot;font-style: italic;&quot;&gt;en casa de herrero, cuchillo de palo&lt;/span&gt;, así que seguro que las aplicaciones internas son más que mejorables. Mejores aplicaciones intenas también mejora la productividad.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Incrementar la dotación en los proyectos activos&lt;/span&gt;. Ésto supone perder dinero o ganar menos en estos proyectos, pero seguro que incrementaremos la satisfacción del cliente y nuestras opciones para obtener nuevos proyectos con él.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Dar soporte a compañeros de otros equipos&lt;/span&gt;. Pocas veces eres el primero en resolver un problema, en vez de preguntar a Google o probar por probar, por qué no preguntar a un compañero de otro equipo.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;¿Colaborar en proyectos open-source de los que tu empresa se lleva lucrando años? Ja, que me da la risa...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Futuro&lt;/h4&gt;La vida son ciclos. Al final la crisis se irá. Algunos habrán caido, otros se habrán mantenido a flote y los más preparados habrán crecido. Pero, ¿habremos aprendido algo?</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/4669207265748017331/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/05/cuando-la-crisis-golpea-una-consultora.html#comment-form' title='14 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/4669207265748017331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/4669207265748017331'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/05/cuando-la-crisis-golpea-una-consultora.html' title='Cuando la crisis golpea una consultora IT'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-7560480199943808339</id><published>2009-05-14T22:23:00.000+02:00</published><updated>2009-05-14T22:24:02.431+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Hacer accesible un método Java en tiempo de ejecución</title><content type='html'>No es habitual. Puede que incluso sea síntoma de un mal diseño OO. Pero en ocasiones nos puede venir muy bien ser capaces de hacer accesible un método en tiempo de ejecución. Por ejemplo, para hacer pruebas de un método privado.&lt;br /&gt;&lt;br /&gt;El truco está en usar &lt;span style=&quot;font-weight: bold;&quot;&gt;Reflection&lt;/span&gt;. Reflection es un API Java que forma parte del JDK (paquete &lt;span style=&quot;font-style: italic;&quot;&gt;java.lang.reflect&lt;/span&gt;) y que permite acceder y manipular la meta-información de las clases y objetos de tu código Java en tiempo de ejecución. No es algo que se use todos los días (a no ser que programes ides, debuggers o frameworks), pero conviene saber que existe y conocer sus capacidades, por si acaso...&lt;br /&gt;&lt;br /&gt;Pero vayamos al grano. El código es muy sencillo. A partir de una instancia, (1) obtenemos su objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Class&lt;/span&gt;, (2) obtenemos el objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Method&lt;/span&gt; que representa el método en cuestión, (3) modificamos su accesibilidad y (4) finalmente lo ejecutamos pasándole los argumentos necesarios y guardamos su salida si tiene. Un ejemplo de un método &lt;span style=&quot;font-style: italic;&quot;&gt;sayHello&lt;/span&gt; con un parámetro &lt;span style=&quot;font-style: italic;&quot;&gt;String&lt;/span&gt; y un return &lt;span style=&quot;font-style: italic;&quot;&gt;String&lt;/span&gt; sería éste:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;Method metodo = instancia.getClass().getDeclaredMethod(&quot;sayHello&quot;, new Class[]{String.class});&lt;br /&gt;metodo.setAccessible(true);&lt;br /&gt;String salida = (String)metodo.invoke(instancia, new Object[]{&quot;argumento1&quot;}));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;¿Y si fuera un constructor? Practicamente igual, pero usando esta vez el objeto &lt;span style=&quot;font-style: italic;&quot;&gt;Constructor&lt;/span&gt; y teniendo en cuanta que ahora no tenemos una instancia. Un ejemplo con un constructor sin parámetros sería éste:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;Constructor constructor = NombreClase.class.getDeclaredConstructor(new Class[0]);&lt;br /&gt;constructor.setAccessible(true);&lt;br /&gt;NombreClase instancia = (NombreClase)constructor.newInstance();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y esto es todo. Rápido y fácil. Ahora no lo uséis mal...</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/7560480199943808339/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/05/hacer-accesible-un-metodo-java-en.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7560480199943808339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7560480199943808339'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/05/hacer-accesible-un-metodo-java-en.html' title='Hacer accesible un método Java en tiempo de ejecución'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-3361199404182569939</id><published>2009-05-03T01:50:00.001+02:00</published><updated>2009-05-03T02:11:58.991+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="buenas practicas"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>10 formas de mejorar tu código</title><content type='html'>[ACTUALIZACIÓN 030509: Añadido ejemplo de Antiobjeto.]&lt;br /&gt;&lt;br /&gt;El otro día vi la presentación &lt;a href=&quot;http://www.infoq.com/presentations/10-Ways-to-Better-Code-Neal-Ford&quot;&gt;10 Ways to Improve your Code&lt;/a&gt; que Neal Ford hizo en la &lt;a href=&quot;http://qconsf.com/sf2008/&quot;&gt;QCon SF 2008&lt;/a&gt; sobre cómo escribir mejor código y que ha publicado el portal &lt;a href=&quot;http://www.infoq.com/&quot;&gt;InfoQ&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Es una presentación genial y muy práctica. Enseguida te das cuenta de que estás ante un gran programador que además sabe explicarse muy bien. Así que decidí tomar apuntes de estas 10 formas de escribir mejor código, que aprovecho para plasmar aquí y no olvidarlas.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;1 - Métodos compuestos&lt;/h4&gt;Divide tus métodos en métodos más pequeños que realicen una única tarea claramente identificada. Así se obtiene un código más intuitivo y fácil de probar formado por métodos pequeños, &lt;a href=&quot;http://es.wikipedia.org/wiki/Dise%C3%B1o_estructurado#Cohesi.C3.B3n&quot;&gt;cohesivos&lt;/a&gt; y reutilizables. Además es un código autodocumentado porque los nombres de los métodos se convierten en documentación.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;2 - Diseño y Desarrollo orientado a pruebas (TDD)&lt;/h4&gt;Piensa en cómo se usará una clase y diseñarás mejor su interfaz y su relación con otras clases.&lt;br /&gt;Una clase bien diseñada es fácil de probar.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;3 - Análisis estático&lt;/h4&gt;Usa herramientas de análisis de código, como &lt;a href=&quot;http://findbugs.sourceforge.net/&quot;&gt;Findbugs&lt;/a&gt;, para evitar bugs, no violar buenas prácticas y escribir código más fácil de mantener.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;4 - Buenos ciudadanos&lt;/h4&gt;En POO los ciudadanos son las clases. Una buena clase es aquella que se relaciona bien con las demás. Un ejemplo de mal ciudadano es el &lt;a href=&quot;http://es.wikipedia.org/wiki/Singleton&quot;&gt;Singleton&lt;/a&gt;. Los singletons mezclan responsabilidades (su funcionalidad más asegurar 1 única instancia), son difíciles (sino imposibles) de probar y aumentan brutalmente el acoplamiento entre clases al usarse como las antiguas variables globales. En lugar de un singleton, usa un pojo con constructor privado para la funcionalidad y haz que sea una factoría la responsable de crearlo (usando reflection para saltarse el constructor privado) y asegurarse que sólo haya 1 instancia. Más sobre el peligro de los singletons &lt;a href=&quot;http://www.ibm.com/developerworks/webservices/library/co-single.html&quot;&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;5 - YAGNI: you arent gonna need it&lt;/h4&gt;No programes lo que no vas a necesitar. Construye la funcionalidad más simple que necesites en cada momento.&lt;br /&gt;No desarrolles de forma especulativa, pensando en posibles necesidades futuras.&lt;br /&gt;Me encanta esta imagen:&lt;br /&gt;&lt;img style=&quot;margin: 10px auto; display: block; text-align: center; width: 169px; height: 200px;&quot; src=&quot;http://1.bp.blogspot.com/_wU4MuFZcKsM/SfuB1PfvbdI/AAAAAAAAACk/9FrUPvTOCcc/s200/yagni060524c.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5330997335615827410&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;6 - Cuestiona el porqué&lt;/h4&gt;No hagas las cosas porque sí. Piensa antes y comprueba.&lt;br /&gt;A menudo, dentro de una empresa o equipo, se toman como leyes invariables algunas recomendaciones o soluciones concretas y circunstanciales. Incluso cuando su creador ha desaparecido. Seguro que todos tenemos algúna historia con esto...&lt;br /&gt;Además a veces lo intuitivo no es cierto. Neal cita un estudio donde se observó que la programación por parejas produce código 15% menos rápido pero con 15% menos de defectos.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;7 - SLAP&lt;/h4&gt;Usa el mismo nivel de abstracción para las líneas de un método.&lt;br /&gt;Así conseguirás métodos compuestos de forma natural.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;8 - Programación poliglota&lt;/h4&gt;Domina distintos lenguajes para resolver cada problema con el lenguaje más apropiado.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;9 - Cada matiz&lt;/h4&gt;Aprende y aprovecha los matices especiales del lenguaje. Pej. en Java con &lt;span style=&quot;font-style: italic;&quot;&gt;reflection&lt;/span&gt; puedes hacer maravillas, como cambiar el modificador de acceso de métodos en tiempo de ejecución o construir objetos de clases definidas dinamicamente.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;10 - Antiobjetos&lt;/h4&gt;Solemos modelar los objetos a imagen y semejanza del mundo real. Sin embargo, en ocasiones, es útil obviar la realidad para crear soluciones menos complejas. Es lo que se conoce como &lt;a href=&quot;http://en.wikipedia.org/wiki/Antiobject&quot;&gt;antiobjetos&lt;/a&gt;. Por ejemplo, si pensamos en el famoso juego Pac-Man, es lógico imaginar que son los fantasmas los que calculan su camino hacia pacman en base al tablero, su posición, la de pacman y si se comió la fruta. Pero en realidad es el tablero quien mueve los fantasmas!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y tú, ¿conoces alguna otra forma?</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/3361199404182569939/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/05/10-formas-de-mejorar-tu-codigo.html#comment-form' title='15 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/3361199404182569939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/3361199404182569939'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/05/10-formas-de-mejorar-tu-codigo.html' title='10 formas de mejorar tu código'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_wU4MuFZcKsM/SfuB1PfvbdI/AAAAAAAAACk/9FrUPvTOCcc/s72-c/yagni060524c.png" height="72" width="72"/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-1653471681907069981</id><published>2009-04-27T08:42:00.000+02:00</published><updated>2009-04-27T08:30:01.333+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gestion equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="historia de una integracion"/><category scheme="http://www.blogger.com/atom/ns#" term="webservices"/><title type='text'>Historia de una integración (iv): Colaboración</title><content type='html'>&lt;img id=&quot;BLOGGER_PHOTO_ID_5328829009678669026&quot; style=&quot;FLOAT: right; MARGIN: 4px 0px 10px 10px;&quot; alt=&quot;&quot; src=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SfPNwD6xlOI/AAAAAAAAACc/mBgSSsrXwxQ/s200/gritar.jpg&quot; border=&quot;0&quot; /&gt;&lt;div&gt;La complejidad de un proyecto también radica en las &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;personas&lt;/span&gt; involucradas, y no sólo en la tecnología. A más personas, mayor complejidad.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Personajes&lt;/h4&gt;Esta historia tiene muchos personajes. Además de los usuarios, el cliente, mi equipo y mi jefe, están los distintos equipos de cada módulo SAP con su consultor a la cabeza. Y por supuesto el analista interlocutor del cliente, el llamado &lt;span style=&quot;FONT-STYLE: italic&quot;&gt;Product owner&lt;/span&gt; de Scrum, como nexo de todos.&lt;br /&gt;&lt;br /&gt;Él es el verdadero héroe de esta historia. Trabajador, comprometido, eficaz, comprensivo, dialogante mediador y afable. Rompe con todos las ideas preconcebidas que se pueden tener del cliente funcionario.&lt;br /&gt;&lt;br /&gt;La clave para vencer la &lt;em&gt;complejidad humana&lt;/em&gt; está en la &lt;strong&gt;colaboración&lt;/strong&gt;. Parece fácil, al fin y al cabo todos teniamos el mismo objetivo: sacar el proyecto adelante.&lt;br /&gt;&lt;br /&gt;Pero no sólo fue difícil, en algunos casos ha sido absolutamente agotador. Las personas mediocres tienden a adoptar una postura defensiva y esquiva, están más preocupados por salvar su culo que por el proyecto. Convierten cualquier asunto en una crisis y no se dan cuenta de que así sólo ponen más de manifiesto su ineptitud.&lt;br /&gt;&lt;br /&gt;Afortunadamente también había buenos profesionales con los que ha sido una satisfacción trabajar. En realidad me voy a ahorrar los detalles. Supongo que lo entenderéis.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Comunicación&lt;/h4&gt;En cualquier caso la mejor forma de colaborar de forma productiva es cuidando la &lt;strong&gt;comunicación&lt;/strong&gt; y las relaciones interpersonales. No hay por qué llevarse mal sólo por ser de diferentes empresas.&lt;br /&gt;Respecto a la comunicación me gustaría hacer una serie de observaciones/recomendaciones:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Usa el medio de comunicación más adecuado. Cara a cara, teléfono o correo electrónico. El correo electrónico es el más flexible pero también es el más frio y propenso a malentendidos, tanto de significado como de actitud.&lt;/li&gt;&lt;li&gt;Evita discusiones por correo, usa el teléfono y luego mandas un correo resumen.&lt;/li&gt;&lt;li&gt;Comunícate con la persona adecuada directamente. Evita los intermediarios, simplemente ponles en copia o al tanto.&lt;/li&gt;&lt;li&gt;Asegúrate 2 veces antes de señalar el fallo de otro.&lt;/li&gt;&lt;li&gt;Incluye siempre toda la información relativa que puedas, como mensajes, capturas de pantalla, fecha y hora, etc.&lt;/li&gt;&lt;li&gt;Ser amable o pedir disculpas no es pecado.&lt;/li&gt;&lt;li&gt;Sé comprensivo. Ponte siempre en el lugar del otro. Piensa que no eres el único que tiene trabajo y que tú también te equivocas.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Problemática de un proyecto de integración&lt;/h4&gt;Los problemas técnicos de colaboración en un proyecto de integración se resumen en &lt;strong&gt;disponibilidad&lt;/strong&gt; de entorno y de juegos de datos de pruebas. El entorno de desarrollo/pruebas no siempre está disponible. Y aún con el entorno disponible, no siempre existe el juego de datos requerido.&lt;br /&gt;&lt;br /&gt;Para minimizar esto lo mejor es usar &lt;strong&gt;Mocks&lt;/strong&gt; que simulen el entorno y devuelvan los datos requeridos. De esta forma te independizas del entorno hasta el último momento, las pruebas de integración. Es la evolución del llamado &lt;em&gt;hardcodeo&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Pero para que los Mocks sean realmente eficaces es necesario que los interfaces estén clara y explicitamente definidos. No sólo el nombre, tipo y orden de los campos de entrada y salida. También los formatos (fechas, cantidades, etc.). Esta definición debe hacerse en un lenguaje formal y procesable por una máquina para (1) evitar errores de interpretación y (2) automatizar la construcción de clientes y servicios. En el caso de los servicios web SOAP se usa el estándar WSDL.&lt;br /&gt;&lt;br /&gt;Finalmente me gustaría destacar la importancia del documento &lt;strong&gt;Pruebas de integración&lt;/strong&gt;. Debe estar actualizado y contener un completo juego de casos de prueba que cubra toda la casuística de entrada y salida. Incluidos los posibles errores. Además estas pruebas deben automatizarse cuanto antes para poder usarse como &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;pruebas de regresión&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En resumen, las personas somos más difíciles que la tecnología. Por lo que colaborar no es sencillo. Pero es la única forma de sacar un proyecto adelante. Haz más fácil el trabajo de los demás y el tuyo será más fácil. No seas mezquino.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/1653471681907069981/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/historia-de-una-integracion-iv.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/1653471681907069981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/1653471681907069981'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/historia-de-una-integracion-iv.html' title='Historia de una integración (iv): Colaboración'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_wU4MuFZcKsM/SfPNwD6xlOI/AAAAAAAAACc/mBgSSsrXwxQ/s72-c/gritar.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-7430275066722204002</id><published>2009-04-22T21:52:00.000+02:00</published><updated>2009-04-24T11:13:50.504+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="axis2"/><category scheme="http://www.blogger.com/atom/ns#" term="gestion equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="historia de una integracion"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><category scheme="http://www.blogger.com/atom/ns#" term="webservices"/><title type='text'>Historia de una integración (iii): El desarrollo</title><content type='html'>El &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/03/historia-de-una-integracion-el.html&quot;&gt;entorno de desarrollo&lt;/a&gt; estaba implantado, la &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/04/historia-de-una-integracion-ii-la.html&quot;&gt;arquitectura&lt;/a&gt; estaba definida, el análisis estaba en marcha. Era el momento de iniciar el desarrollo, antes de que el tiempo (y el cliente) se echara encima.&lt;br /&gt;&lt;br /&gt;Pero pronto quedó claro que &lt;span style=&quot;font-weight: bold;&quot;&gt;los servicios web SAP iban a tardar&lt;/span&gt; más de lo previsto. De hecho, ni siquiera disponiamos de los ficheros WSDL que describen el interfaz, que empezaron a llegar por cuenta gotas un par de meses después. Por supuesto, más de uno tuvo que ser modificado y remodificado. Esta situación nos obligó a ser extremedamente ágiles, cambiando la prioridad de los módulos, reconstruyendo los clientes webservices y modificando el modelo de la aplicación a menudo.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Metodología&lt;/h4&gt;No hemos seguido ninguna metodología concreta al pie de la letra. Aunque sí es cierto que nuestra forma de trabajar está ampliamente inspirada en &lt;a href=&quot;http://es.wikipedia.org/wiki/Scrum&quot;&gt;Scrum&lt;/a&gt; y las prácticas ágiles que promueve. Sobre Scrum podeis leer más &lt;a href=&quot;http://docs.google.com/Presentation?id=dg2n4368_15g4cvkxxp&quot;&gt;aquí&lt;/a&gt; y &lt;a href=&quot;http://weblogs.javahispano.org/artesanodeprimera/category/Scrum&quot;&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Os dejo algunas notas de la estrategia que utilizamos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Desarrollo incremental&lt;/span&gt; con una versión mayor por módulo. Empezando por el módulo de Administración.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Los requisitos fueron traducidos en nuestro JIRA a tareas de tipo &lt;span style=&quot;font-style: italic;&quot;&gt;New Request&lt;/span&gt; dentro de la versión correspondiente. Los cambios en los requisitos fueron añadidos como tareas de tipo &lt;span style=&quot;font-style: italic;&quot;&gt;Improvement&lt;/span&gt;. Desgraciadamente cuando la versión estaba cerrada no siempre se añadían como tareas hijas...&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Simulación de los servicios web SAP mediante &lt;a href=&quot;http://es.wikipedia.org/wiki/Mock_object&quot;&gt;Mocks&lt;/a&gt; de los clientes webservices&lt;/span&gt;. Como ya he dicho los servicios no estaban, pero nosotros necesitabamos ya disponer de datos que &lt;span style=&quot;font-style: italic;&quot;&gt;pintar&lt;/span&gt; en las pantallas! Así que simplemente implementamos los &lt;span style=&quot;font-style: italic;&quot;&gt;interfaces&lt;/span&gt; de los servicios con unas clases tontas que devolvian datos más tontos aún. Mocking manual pero efectivo.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Testing de la capa Middleware&lt;/span&gt;. Toda la lógica de la aplicación está en nuestras clases service que son llamadas desde las pantallas mediante DWR. Los controladores web (Actions de Struts) practicamente sólo realizan navegación y precarga de campos de formularios. Focalizar el testing en la capa Middleware permitió independizarse totalmente de la capa Presentación y el servidor de aplicaciones, aumentando así la velocidad de desarrollo global.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Testing de la capa Acceso a base de datos&lt;/span&gt;. Para probar los distintos daos de esta capa usamos un script sql para inicializar la bbdd a un estado conocido junto con los tests transaccionales de Spring que automaticamente hacen &lt;span style=&quot;font-style: italic;&quot;&gt;rollback&lt;/span&gt; evitando la modificación del estado y la fácil configuración entre datasources dependientes e independientes del servidor de aplicaciones. Una más del montón de cosas que te facilita Spring.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Integración contínua&lt;/span&gt;. Básico en cualquier fase de test seria. Además de actuar como control de calidad de nuestro código. Pero &lt;a href=&quot;http://jcesarperez.blogspot.com/2008/12/2-meses-despus-de-hudson.html&quot;&gt;de Hudson ya hablé en su día&lt;/a&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Estructura del proyecto&lt;/span&gt;. Para atajar la dificultad en un proyecto es básico tener una estructura inteligente y ordenada del mismo. Nuestra estructura de código fuente estaba formada por un gran paquete por módulo, más un paquete &lt;span style=&quot;font-style: italic;&quot;&gt;comun&lt;/span&gt;. Luego dentro de cada módulo, los subpaquetes &lt;span style=&quot;font-style: italic;&quot;&gt;web&lt;/span&gt;, &lt;span style=&quot;font-style: italic;&quot;&gt;dao&lt;/span&gt;, &lt;span style=&quot;font-style: italic;&quot;&gt;ws&lt;/span&gt;, &lt;span style=&quot;font-style: italic;&quot;&gt;modelo &lt;/span&gt;y &lt;span style=&quot;font-style: italic;&quot;&gt;services&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Tags, branches y merges&lt;/span&gt;. El cambio de prioridades entre módulos que sufrimos más el desarrollo incremental por módulos podrían habernos costado más de un disgusto serio sin una &lt;a href=&quot;http://jcesarperez.blogspot.com/search/label/scm&quot;&gt;buena estrategia de control de versiones&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Dificultades&lt;/h4&gt;Hasta aquí parece que ha sido un paseo, pero en realidad hemos sufrido lo nuestro también. A parte del tema de la colaboración con el resto de equipos, tuvimos que hacer frente a varias dificultades en:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Integración mediante webservices&lt;/span&gt;. Se veía venir. Sinceramente e IMHO, los servicios web SAP están, como mucho, diseñados regularmente. Abundan los datos duplicados e innecesarios, no existen namespaces ni schemas comunes y aún nadie me ha podido explicar por qué existe un servicio web por cada operación! Además los WSDLs son generados por alguna herramienta SAP de forma automática que no cumple el &lt;a href=&quot;http://es.wikipedia.org/wiki/WS-I_Basic_Profile&quot;&gt;WS-I&lt;/a&gt;. Lo que nos obligó a usar XMLBeans como OXM (Databinding Java-XML), aunque esto no tiene nada de malo, y también a tener que modificar a mano un par de WSDLs. Y luego está el tema de la infraestructura de red del cliente en producción y sus proxys, pero &lt;a href=&quot;http://jcesarperez.blogspot.com/2008/10/axisfault-transport-error-501-error-not.html&quot;&gt;ésto&lt;/a&gt; también lo he contado &lt;a href=&quot;http://jcesarperez.blogspot.com/2008/10/resolviendo-problemas-de.html&quot;&gt;ya&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Pruebas de los servicios web&lt;/span&gt;. Descubrimos muchos bugs en los servicios web SAP. Yo diría que sus equipos de desarrollo los probaban poco. Las modificaciones, a veces, ocasionaban nuevos bugs donde antes funcionaban. Pronto quedó claro que no tenían una fase seria de test. Al final tuvimos que programar nosotros las baterias de tests para los servicios web SAP.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Gestión de requisitos&lt;/span&gt;. Sabiamos que los requisitos iban a cambiar. Pero no tanto. El sistema de gestión de requisitos antes comentado no favorece el control de cambios en los requisitos, es demasiado frágil y requiere demasiado trabajo en mantener la descripción de la tarea inicial y las hijas, además de mezclarse aspectos de descripción de funcionalidad con pura implementación. En el futuro probaremos con una Wiki para los requisitos y el JIRA para las tareas exclusivamente con referencias al Wiki.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Formación&lt;/span&gt;. Inicialmente, y para mi sorpresa, el nivel de dominio del equipo en Spring e Hibernate era más bajo de lo esperado. Esto nos dió problemas especialmente en mapeos avanzados de Hibernate que provocaban que (1) algunas operaciones fallaran y (2) se realizaran más consultas de las necesarias. También destacar la dificultad, al principio, de trabajar con multiples ficheros de configuración Spring debido al número de módulos y las necesarias configuraciones para mocks y testing.&lt;br /&gt;Luego la cosa mejoro. Aunque a día de hoy Hibernate sigue sin convencer a más de uno pero con Spring todos han caido rendidos.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Proceso de sincronización&lt;/span&gt;. Todas las noches debe actualizarse una estructura de 7 tablas con PKs y FKs compuestas con casi 100 mil registros obtenidos mediante cientos de llamadas a 2 servicios web. Es una operación compleja y costosa, con o sin Hibernate. Fue necesario rediseñar los servicios web SAP para operaciones de consultas masivas que minimizaran el número de llamadas y optimizar los mapeos Hibernate así como los algoritmos usados. Al final pasamos de más de 1 hora de ejecución (tiempo inaceptable) a apenas 10 minutos.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Testing en la capa de presentación&lt;/span&gt;. En su momento no conseguimos hacer funcionar los tests funcionales web basados en Selenium en nuestro servidor de integración contínua, así que esta parte de test se hizo de forma manual. Como la aplicación era una aplicación web RIA bastante grande que tenía que funcionar en IE6, sumado a los cambios de requisitos y modificaciones en los servicios web, os podeis imaginar lo que hemos pasado...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Creo que no me dejo nada. Los temas de colaboración e implantación proximamente...</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/7430275066722204002/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/historia-de-una-integracion-iii-el.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7430275066722204002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7430275066722204002'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/historia-de-una-integracion-iii-el.html' title='Historia de una integración (iii): El desarrollo'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-2199425407385234152</id><published>2009-04-17T23:40:00.000+02:00</published><updated>2009-04-19T19:59:11.798+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gestion equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><title type='text'>Tipos de programador</title><content type='html'>Me gusta simplificar las cosas. Es algo que no puedo evitar, cúanto más simple es algo, más perfecto me parece. Por eso el otro día cuando leía a &lt;a href=&quot;http://www.codinghorror.com/blog/archives/000021.html&quot;&gt;Jeff Atwood&lt;/a&gt; exponiendo los &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001250.html&quot;&gt;8 tipos de programador&lt;/a&gt; que según él existen, no pude evitar pensar &lt;span style=&quot;font-style: italic;&quot;&gt;¡¿8 tipos para algo tan sencillo?! ¿¿8??&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Me vino a la cabeza uno de mis antiguos posts donde hablaba de &lt;a href=&quot;http://jcesarperez.blogspot.com/2008/07/valorando-los-miembros-de-un-equipo-de.html&quot;&gt;cómo valorar a los miembros de un equipo&lt;/a&gt;. Pero esto es diferente, son tipos de programador. Así que intenté borrar el post de Jeff de mi mente, sobretodo la parte de hacerse famoso... y llegué a la conclusión de que sólo existen &lt;span style=&quot;font-weight: bold;&quot;&gt;3 tipos de programador&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El primer tipo sería el programador que es &lt;span style=&quot;font-weight: bold;&quot;&gt;capaz de aprender por sí mismo&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;El segundo tipo sería el programador que es&lt;span style=&quot;font-weight: bold;&quot;&gt; capaz de aprender con la ayuda de otros&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;El tercer tipo es aquel que&lt;span style=&quot;font-weight: bold;&quot;&gt; no es capaz de aprender ni por sí mismo ni por los demás&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Los del primer tipo son superiores, los del segundo brillantes. Los del tercero son &lt;span style=&quot;font-weight: bold;&quot;&gt;inútiles&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Es así de sencillo. Actualmente nuestro mundo vive una evolución imparable y un programador debe vivir en un estado de contínuo aprendizaje que le permita reinventarse a sí mismo en caso necesario.&lt;br /&gt;&lt;br /&gt;Por aprendizaje no me refiero a memorizar por memorizar. Aprender implica descubrir y comprender nuevos conceptos para ser capaz de relacionarlos con conocimientos previos de forma coherente. &lt;span style=&quot;font-weight: bold;&quot;&gt;El conocimiento se aumenta con conocimiento&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;El primer tipo es un programador superior porque no depende de nadie. Es capaz de buscar, encontrar y aprovechar las fuentes de conocimiento que necesita por sí mismo. Su propio código es una de ellas porque tiene un potente espiritu crítico. Pero sobretodo tiene una vocación y un &lt;span style=&quot;font-weight: bold;&quot;&gt;talento&lt;/span&gt; natural. Disfruta realmente programando, resolviendo problemas y experimentando.&lt;br /&gt;&lt;br /&gt;El segundo tipo es un programador que tiene la &lt;span style=&quot;font-weight: bold;&quot;&gt;inteligencia &lt;/span&gt;necesaria para convertirse en un excelente profesional. Todo dependerá de su &lt;span style=&quot;font-weight: bold;&quot;&gt;actitud&lt;/span&gt;, porque aunque es capaz de diferenciar entre lo bien y lo mal hecho, debe esforzarse en aprovechar las oportunidades que se le presenten para aprender. Principalmente, gracias a sus compañeros, pero también un libro, un artículo en internet o el código fuente de un proyecto open-source que utiliza.&lt;br /&gt;&lt;br /&gt;El tercer tipo es un programador cuyas acciones no tienen un porqué. No razona porque no aprende, sólo memoriza una parte. Va a lo fácil, a sobrevivir. Necesita constante soporte y supervisión. Hoy hace bien una cosa y mañana la misma la hace mal. Su código es fuente de la mayoría de bugs totales. Daña la moral del equipo. Y a la larga, &lt;span style=&quot;font-weight: bold;&quot;&gt;resta más que suma&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En definitiva -insisto- el programador capaz de aprender por sí mismo es superior, el que es capaz de aprender con la ayuda de otros es brillante y el que no es capaz de aprender ni por sí mismo ni con ayuda de otros es inútil.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/2199425407385234152/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/tipos-de-programador.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/2199425407385234152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/2199425407385234152'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/tipos-de-programador.html' title='Tipos de programador'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-6120343313078015129</id><published>2009-04-15T23:47:00.000+02:00</published><updated>2009-04-22T00:54:20.573+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="axis2"/><category scheme="http://www.blogger.com/atom/ns#" term="gestion equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="historia de una integracion"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><category scheme="http://www.blogger.com/atom/ns#" term="webservices"/><title type='text'>Historia de una integración (ii): La arquitectura</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://es.wikipedia.org/wiki/Arquitectura&quot;&gt;&lt;img style=&quot;margin: 20px 0pt 10px 10px; float: right; cursor: pointer; width: 250px; height: 158px;&quot; src=&quot;http://3.bp.blogspot.com/_wU4MuFZcKsM/SeHtzYHO95I/AAAAAAAAACU/EUGB9JZUL_Q/s320/arquitectura.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5323797701430540178&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;El inicio de un proyecto siempre es un pequeño caos. Donde no había nada, ahora hay una multitud de cosas por hacer. Entre ellas, &lt;span style=&quot;font-weight: bold;&quot;&gt;definir la arquitectura&lt;/span&gt; de la aplicación con la que guiar el posterior desarrollo. Para obtener la información necesaria, de forma paralela se debe iniciar también el análisis de los &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/04/la-circunstancia.html&quot;&gt;requisitos y contexto&lt;/a&gt; del proyecto.&lt;br /&gt;&lt;h4&gt;La aplicación&lt;/h4&gt;La aplicación de esta historia -os recuerdo- es un front-end web Java que permite realizar acciones concretas sobre varios módulos de un sistema SAP.&lt;br /&gt;&lt;br /&gt;Para no aburrir, resumiré los requisitos y el contexto del proyecto en&lt;br /&gt;&lt;ul&gt;&lt;li&gt;(i) aplicación dividida en &lt;span style=&quot;font-weight: bold;&quot;&gt;módulos&lt;/span&gt; (uno por cada módulo SAP más un módulo Administración),&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(ii) integración mediante &lt;span style=&quot;font-weight: bold;&quot;&gt;webservices SOAP&lt;/span&gt;,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(iii) multiples servicios y todos, inicialmente, &lt;span style=&quot;font-weight: bold;&quot;&gt;sin desarrollar ni definir su interfaz&lt;/span&gt;,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(iv) pantallas basadas en formularios web y tablas &lt;span style=&quot;font-weight: bold;&quot;&gt;RIA&lt;/span&gt;,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(v) dos pantallas más complejas basadas en un potente &lt;span style=&quot;font-weight: bold;&quot;&gt;grid&lt;/span&gt; de datos que permita manejar una gran cantidad de registros (alrededor de 200) sin paginación, ordenación por todas las columnas, modificación de algunos campos de forma inline y multiselección para ejecutar acciones sobre los registros seleccionados,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(vi) mantenimiento de una &lt;span style=&quot;font-weight: bold;&quot;&gt;réplica sincronizada&lt;/span&gt; en base de datos de la estructura de centros y catálogo de materiales de SAP,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(vii) &lt;span style=&quot;font-weight: bold;&quot;&gt;elevado número de usuarios&lt;/span&gt;, varios miles registrados, con picos de más de cien usuarios conectados simultaneamente,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(viii) ejecutable en &lt;span style=&quot;font-weight: bold;&quot;&gt;IE6&lt;/span&gt; y&lt;br /&gt;&lt;/li&gt;&lt;li&gt;(ix) equipo de desarrollo con dedicación parcial y formado principalmente en Hibernate y Struts.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Principios&lt;/h4&gt;La experiencia me ha enseñado la importancia de unas pocas reglas básicas que he convertido en los principios sobre los que procuro diseñar y desarrollar mis proyectos. Son estos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Simplicidad &lt;/span&gt;(KISS, &lt;span style=&quot;font-style: italic;&quot;&gt;Keep it simple, stupid&lt;/span&gt;). En realidad una aplicación web no es nada compleja. Normalmente basta con aplicar el patrón de diseño &lt;a href=&quot;http://es.wikipedia.org/wiki/Modelo_Vista_Controlador&quot;&gt;MVC&lt;/a&gt; más una lógica y ordenada estructura de paquetes y clases. Y si la cosa se complica, no tener miedo de realizar los refactoring necesarios para volver a tener la complejidad controlada.&lt;br /&gt;Cuidado con la sobreingeniería. No te vuelvas loco con los patrones &lt;a href=&quot;http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o&quot;&gt;GoF&lt;/a&gt; si no estás creando un framework. Para una aplicación son más importantes los patrones &lt;a href=&quot;http://es.wikipedia.org/wiki/Grasp&quot;&gt;GRASP&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Reutiliza, no repitas&lt;/span&gt; (&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;DRY, &lt;span style=&quot;font-style: italic;&quot;&gt;Dont repeat yourself&lt;/span&gt;). Mucho cuidado con el &lt;span style=&quot;font-style: italic;&quot;&gt;copypaste&lt;/span&gt; y con el código &lt;a href=&quot;http://en.wikipedia.org/wiki/Glue_code&quot;&gt;pegamento&lt;/a&gt; y &lt;a href=&quot;http://en.wikipedia.org/wiki/Boilerplate_%28text%29&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;boilerplate&lt;/span&gt;&lt;/a&gt;. Utiliza detectores de código duplicado (pej. Checkstyle y PMD), crea componentes reutilizables y usa clases &lt;span style=&quot;font-style: italic;&quot;&gt;template&lt;/span&gt; para evitar el código &lt;span style=&quot;font-style: italic;&quot;&gt;boilerplate&lt;/span&gt;. El ejemplo más típico y dañino sería la gestión de conexiones y transacciones en base de datos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Reutiliza, no reinventes&lt;/span&gt; (evita el sindrome &lt;a href=&quot;http://en.wikipedia.org/wiki/Not_Invented_Here&quot;&gt;NIH&lt;/a&gt;, &lt;span style=&quot;font-style: italic;&quot;&gt;Not invented here&lt;/span&gt;). Apache, Springsource, Eclipse, JBoss, Codehaus, Sun,... ¿de verdad no existe una solución éficaz a tu problema ya creada, documentada, probada y mantenida?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Diseña software facilmente testeable&lt;/span&gt; (TDD, &lt;span style=&quot;font-style: italic;&quot;&gt;Test Driven Design&lt;/span&gt;). Al menos las capas de negocio y datos deben poder ser probadas de forma sencilla, automatizada y sin necesidad de desplegar la aplicación en un servidor. No confundir con la metodología &lt;a href=&quot;http://es.wikipedia.org/wiki/Tdd&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Desarrollo guiado por pruebas&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;La arquitectura&lt;/h4&gt;La aplicación utiliza una arquitectura en &lt;span style=&quot;font-weight: bold;&quot;&gt;N capas&lt;/span&gt;, estructurada en las capas de (i) integración con SAP, (ii) acceso a base de datos, (iii) lógica de negocio o middleware y (iv) presentación. A continuación pasaré a describir cada una de las capas y las tecnologías utilizadas en ellas.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Integración con SAP&lt;/h4&gt;El sistema SAP contaría con un &lt;a href=&quot;http://help.sap.com/saphelp_nw04/helpdata/en/14/80243b4a66ae0ce10000000a11402f/frameset.htm&quot;&gt;XI&lt;/a&gt;, o infraestructura de intercambio, donde estarían definidos los distintos servicios web que usaría nuestra aplicación para realizar acciones concretas en los módulos SAP implantados.&lt;br /&gt;&lt;br /&gt;Es la capa más importante. Al fin y al cabo es un proyecto de integración. No podía haber fallos ni improvisaciones. Así que para implementar los clientes webservices decidí usar &lt;a href=&quot;http://ws.apache.org/axis2/&quot;&gt;Axis2&lt;/a&gt;. Es un framework que conozco muy bien, destaca por su madurez, rendimiento y sus altas capacidades de configuración y compatibilidad con casi todos los OXMs (Mapeador Objeto-XML) existentes.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Acceso a base de datos&lt;/h4&gt;La aplicación debía contar con su propia base de datos para la gestión de usuarios, datos propios y mantener una réplica sincronizada periódicamente de la estructura de centros y el catálogo de materiales gestionado en SAP.&lt;br /&gt;&lt;br /&gt;A pesar de que el catálogo era enorme (cerca de 100 mil registros), el schema en sí no iba a contar con muchas tablas y era bastante sencillito. Por lo que el Oracle9 del cliente no iba a ser ningún cuello de botella.&lt;br /&gt;Así que no ví mayor problema en usar &lt;a href=&quot;http://www.hibernate.org/&quot;&gt;Hibernate&lt;/a&gt;, con la esperanza de que nuestro supuesto dominio en él nos permitiera despreocuparnos relativamente de esta capa y ganar tiempo de desarrollo.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Middleware&lt;/h4&gt;Para implementar la capa de lógica de negocio no tuve muchas dudas, &lt;a href=&quot;http://www.springsource.org/&quot;&gt;Spring&lt;/a&gt; como framework principal y dominante. Spring permite (i) integrar el resto de tecnologías que ibamos a usar y (ii) cumplir con los principios antes comentados, ambos de forma natural y sencilla. Además de aportar su motor de inyección de dependencias y sistema de AOP. En mi opinión, características básicas de cualquier desarrollo enterprise.&lt;br /&gt;&lt;br /&gt;También hemos utilizado &lt;a href=&quot;http://www.springsource.org/spring-security&quot;&gt;Spring Security&lt;/a&gt; como solución de seguridad, &lt;a href=&quot;http://www.opensymphony.com/quartz/&quot;&gt;Quartz&lt;/a&gt; para las tareas programadas, la útil &lt;a href=&quot;http://commons.apache.org/lang/&quot;&gt;Commons Lang&lt;/a&gt; y el binomio &lt;a href=&quot;http://commons.apache.org/logging/&quot;&gt;Commons Logging&lt;/a&gt;/&lt;a href=&quot;http://logging.apache.org/log4j/&quot;&gt;Log4j&lt;/a&gt; para el logging.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Presentación&lt;/h4&gt;Intentaré ser breve, como framework web decidí usar &lt;a href=&quot;http://struts.apache.org/1.3.10/index.html&quot;&gt;Struts1&lt;/a&gt; (los motivos más abajo) para controlar la navegación hasta las pantallas principales.&lt;br /&gt;&lt;br /&gt;Como sistema de plantillas para las pantallas, otro veterano, &lt;a href=&quot;http://struts.apache.org/1.3.10/struts-tiles/index.html&quot;&gt;Tiles&lt;/a&gt;. Usar un sistema de plantillas es básico para mantener lo más simple posible las distintas jsps que formaban cada pantalla.&lt;br /&gt;&lt;br /&gt;Dentro de cada pantalla está prohibido usar código Java, usamos &lt;a href=&quot;http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html&quot;&gt;Jakarta Taglibs&lt;/a&gt; como librería de etiquetas implementación de la estupenda especificación &lt;a href=&quot;http://java.sun.com/products/jsp/jstl/&quot;&gt;JSTL&lt;/a&gt;, la última gran especificación.&lt;br /&gt;&lt;br /&gt;La parte RIA viene en 2 sabores, DWR y jQuery. &lt;a href=&quot;http://directwebremoting.org/&quot;&gt;DWR&lt;/a&gt; es un framework Ajax no muy conocido que permite invocar métodos de clases Java de la aplicación desde código Javascript en el navegador cliente. Es potentisimo, sencillo y muy configurable. Además cuenta con soporte para Reverse Ajax.&lt;br /&gt;&lt;br /&gt;Mientras que &lt;a href=&quot;http://jquery.com/&quot;&gt;JQuery&lt;/a&gt; aporta toda la magia visual con su legión de plugins y el tan necesario toque cross-browser. Destacar los widgets de &lt;a href=&quot;http://jqueryui.com/&quot;&gt; jQuery UI&lt;/a&gt; y los plugins &lt;a href=&quot;http://bassistance.de/jquery-plugins/jquery-plugin-validation/&quot;&gt;jQuery Validation&lt;/a&gt; y &lt;a href=&quot;http://www.trirand.com/blog/&quot;&gt;jQuery Grid&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Alternativas desestimadas&lt;/h4&gt;Ahora lo leo y parece sencillo. No lo fue. Dejaré las valoraciones para otro día...&lt;br /&gt;Lo que sí voy a hacer es nombrar algunas alternativas que descarté durante el proceso de diseño y porqué.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cualquier otro framework web. Sí, ya sé que Struts1 está pasadísimo, más muerto que SOA y el propio Java juntos, y hay otros frameworks web mejores. Pero eso no lo convierte en un mal framework y es él que domina mi equipo y yo mismo. Tampoco había tiempo para aprender otro y aunque lo hubiera, personalmente, no tengo claro cúal debería ser su sucesor, ¿Struts2, Spring MVC, GWT, Seam, JSFs, Wicket,...?&lt;br /&gt;Como ya he dicho sólo lo ibamos a usar para la navegación, así que nos sobraba.&lt;/li&gt;&lt;li&gt;OSGI. Sí es una aplicación modular, pero en realidad la necesidad de activar y desactivar módulos es practicamente nula.&lt;/li&gt;&lt;li&gt;JPA. ¿Para qué? Si vamos a usar Hibernate y punto. Y encima con características específicas como el &lt;span style=&quot;font-style: italic;&quot;&gt;Criteria&lt;/span&gt; o el &lt;span style=&quot;font-style: italic;&quot;&gt;delete_orphan&lt;/span&gt;. IMHO esta especificación llega tarde y además mal.&lt;/li&gt;&lt;li&gt;Ext-Js. No sólo es una delicia visual, es realmente eficiente en comparación con el resto de clones que han ido saliendo. De hecho, lo estabamos evaluando en otro proyecto más pequeño cuando nos pilló el &lt;a href=&quot;http://www.javahispano.org/contenidos/es/extjs_cambia_su_licencia_lgpl_por_gplv3/?menuId=NEWS&amp;amp;onlypath=true&quot;&gt;cambio de licencia&lt;/a&gt;. Ahora usamos jQuery y estamos más que contentos.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Así que ya teniamos el entorno de desarrollo y el diseño general de la aplicación definidos. Era el momento de empezar el desarrollo. Pero eso ya será otro post...</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/6120343313078015129/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/historia-de-una-integracion-ii-la.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/6120343313078015129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/6120343313078015129'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/historia-de-una-integracion-ii-la.html' title='Historia de una integración (ii): La arquitectura'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_wU4MuFZcKsM/SeHtzYHO95I/AAAAAAAAACU/EUGB9JZUL_Q/s72-c/arquitectura.jpg" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-7026025750761238474</id><published>2009-04-13T14:00:00.000+02:00</published><updated>2009-04-13T14:01:53.095+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="buenas practicas"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="testing"/><title type='text'>Buenas prácticas para programar tests</title><content type='html'>[MOD 090413: Modificación de propiedad Repetible]&lt;br /&gt;&lt;br /&gt;En todo proceso de construcción moderno y profesional existe una fase de test o pruebas. Esta fase de test cuenta con total protagonismo, como demuestran el tiempo, recursos y herramientas dedicados. No hace falta pensar en la construcción de un puente, un avión o un formula1, piensa simplemente en el proceso de construcción de una batidora.&lt;br /&gt;&lt;br /&gt;Este post es una recopilación de &lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;buenas práticas para programar tests&lt;/span&gt;. Es un pequeño granito de arena para ayudar a fomentar la fase de test en nuestro mundo del desarrollo de software.&lt;br /&gt;&lt;br /&gt;Las buenas prácticas están clasificadas según su naturaleza. Y como siempre, son &lt;span style=&quot;font-style: italic;&quot;&gt;buenas prácticas&lt;/span&gt; sólo respecto a mi propia experiencia y criterio. Así que estáis más que invitados a participar.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Propiedades de un test&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Automático&lt;/span&gt;.  Todos los tests deben poder ejecutarse de forma automática.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Independiente&lt;/span&gt;. El resultado de la ejecución de un test no debe depender de la ejecución de otro test.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Repetible&lt;/span&gt;. El resultado de la ejecución de un test debe ser repetible en el tiempo. Para ello el test no debe depender de las circunstancias del contexto ni otros recursos. Si es necesario el test inicializará el contexto y recursos a un estado conocido o lo simulará mediante &lt;a href=&quot;http://es.wikipedia.org/wiki/Mock_object&quot;&gt;Mocks&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Estructura dentro del proyecto&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;El código de test debe ir contenido en una &lt;span style=&quot;font-weight: bold;&quot;&gt;carpeta fuente distinta&lt;/span&gt; de la del código de la aplicación.&lt;/li&gt;&lt;li&gt;Una clase test debe pertenecer al &lt;span style=&quot;font-weight: bold;&quot;&gt;mismo paquete&lt;/span&gt; que la clase de la aplicación que prueba. De este modo podrá ejecutar no sólo sus métodos públicos, sino también aquellos con modificador &lt;span style=&quot;font-style: italic;&quot;&gt;protected&lt;/span&gt; y &lt;span style=&quot;font-style: italic;&quot;&gt;package&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Código de test&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;El código de test debe tener la &lt;span style=&quot;font-weight: bold;&quot;&gt;misma importancia que el código de aplicación&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Reutiliza código&lt;/span&gt; de test. Usa herencia, clientela y métodos estructurados para reutilizar ese código común que prepara el contexto, la entrada de los métodos o comprueba los resultados.&lt;/li&gt;&lt;li&gt;Una clase test debe tener un &lt;span style=&quot;font-weight: bold;&quot;&gt;nombre significativo&lt;/span&gt;. Por lo general será el mismo nombre que la clase de la aplicación que prueba más el sufijo &lt;span style=&quot;font-style: italic;&quot;&gt;Test&lt;/span&gt; o &lt;span style=&quot;font-style: italic;&quot;&gt;Tests&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Un método test debe tener un nombre significativo que resuma claramente el &lt;span style=&quot;font-weight: bold;&quot;&gt;caso de prueba&lt;/span&gt; u objetivo del test. Pej. es mucho mejor usar &lt;span style=&quot;font-style: italic;&quot;&gt;testBuscarProductosPorNombreNoExistente&lt;/span&gt; que &lt;span style=&quot;font-style: italic;&quot;&gt;testBuscarPr4&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Un método test debe probar un &lt;span style=&quot;font-weight: bold;&quot;&gt;único caso de prueba&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;El código de un método test debe ser &lt;span style=&quot;font-weight: bold;&quot;&gt;comprensible&lt;/span&gt; y estar estructurado en (i) &lt;span style=&quot;font-weight: bold;&quot;&gt;preparación&lt;/span&gt; del caso de prueba particular y su entrada, (ii) &lt;span style=&quot;font-weight: bold;&quot;&gt;ejecución&lt;/span&gt; del caso de prueba (método a probar) y (iii) &lt;span style=&quot;font-weight: bold;&quot;&gt;comprobación&lt;/span&gt; del resultado.&lt;/li&gt;&lt;li&gt;La &lt;span style=&quot;font-weight: bold;&quot;&gt;longitud&lt;/span&gt; de un método test debe cumplir los estándares de codificación del equipo. En caso necesario, refactoriza extrayendo métodos reutilizables que ejecuten los pasos de preparación y comprobación.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Casos de prueba&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;No te limites al caso de prueba fácil.&lt;/li&gt;&lt;li&gt;Incluye &lt;span style=&quot;font-weight: bold;&quot;&gt;casos de error&lt;/span&gt; como casos de prueba. Pej. crea casos de prueba donde la entrada es incorrecta, saltan excepciones o el resultado debería ser &lt;span style=&quot;font-style: italic;&quot;&gt;null&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Crea un caso de prueba para cada &lt;span style=&quot;font-weight: bold;&quot;&gt;bug&lt;/span&gt; detectado.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/7026025750761238474/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/buenas-practicas-para-programar-tests.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7026025750761238474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/7026025750761238474'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/buenas-practicas-para-programar-tests.html' title='Buenas prácticas para programar tests'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-9063809057304846500</id><published>2009-04-05T19:31:00.000+02:00</published><updated>2009-04-12T23:03:05.542+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gestion equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><title type='text'>La circunstancia</title><content type='html'>&lt;blockquote&gt;Yo soy yo y mi circunstancia, y si no la salvo a ella no me salvo yo.&lt;/blockquote&gt;&lt;div style=&quot;text-align: right;&quot;&gt;&lt;a href=&quot;http://es.wikipedia.org/wiki/Jos%C3%A9_Ortega_y_Gasset&quot;&gt;José Ortega y Gasset&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La &lt;a href=&quot;http://es.wikipedia.org/wiki/Filosof%C3%ADa_de_Jos%C3%A9_Ortega_y_Gasset&quot;&gt;filosofía de Ortega y Gasset&lt;/a&gt; nos transmite la importancia de las circunstancias y los puntos de vista para entender la vida y por tanto resolver cualquier asunto.&lt;br /&gt;&lt;br /&gt;Si aplicamos esta filosofía a nuestro mundo del desarrollo software, podemos plantear que &lt;span style=&quot;font-weight: bold;&quot;&gt;un proyecto es sus requisitos y su circunstancia&lt;/span&gt;. De modo que para convertir un proyecto en éxito, debe estudiarse y superarse primero su circunstancia. Sólo así podremos dar solución a los cambiantes requisitos.&lt;br /&gt;&lt;br /&gt;La circunstancia de un proyecto estaría formada principalmente por las particularidades de todas las &lt;span style=&quot;font-weight: bold;&quot;&gt;personas&lt;/span&gt; que intervienen en él, no sólo el equipo de trabajo, sino también el cliente, el usuario, el comercial, el administrador de sistemas,... todos.&lt;br /&gt;&lt;br /&gt;Además del componente humano, también deben tenerse en cuenta los&lt;span style=&quot;font-weight: bold;&quot;&gt; riesgos específicos potenciales&lt;/span&gt; y los&lt;span style=&quot;font-weight: bold;&quot;&gt; requisitos no funcionales críticos&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La circunstancia debe ser un factor clave a la hora de elegir una tecnología y una arquitectura para desarrollar un proyecto. Ignorarla sólo puede llevarte al fracaso.&lt;br /&gt;&lt;br /&gt;Estudia el proyecto desde todos los puntos de vista posibles y actua en consecuencia. Cómo si no podrá tu proyecto satisfacer las necesidades del usuario en cuanto a funcionalidad y usabilidad. Cómo si no podrá tu proyecto satisfacer las expectativas del cliente en cuanto a tiempo, coste y mantenibilidad.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/9063809057304846500/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/la-circunstancia.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/9063809057304846500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/9063809057304846500'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/04/la-circunstancia.html' title='La circunstancia'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1481755160576909631.post-2149142158093023457</id><published>2009-03-31T08:00:00.004+02:00</published><updated>2009-04-22T00:54:20.574+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gestion equipo"/><category scheme="http://www.blogger.com/atom/ns#" term="historia de una integracion"/><category scheme="http://www.blogger.com/atom/ns#" term="ingenieria software"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="webservices"/><title type='text'>Historia de una integración (i): El principio</title><content type='html'>Esta es la historia de un proyecto de desarrollo software. Como toda buena historia tiene momentos difíciles, personajes complejos, un final féliz y más de una lección que aprender.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Antecedentes&lt;/h4&gt;&lt;img style=&quot;margin: 4px 10px 10px 0pt; float: left;&quot; src=&quot;http://1.bp.blogspot.com/_wU4MuFZcKsM/Sc_fj_E8HEI/AAAAAAAAACE/1LwDcmZomT8/s200/principio176x176.JPG&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5318715494268410946&quot; border=&quot;0&quot; /&gt;En enero del 2008 comenzó una nueva etapa profesional para mi, cambié de compañía en búsqueda de nuevos retos y proyectos donde trabajar, y continuar aprendiendo, en lo que verdaderamente me apasiona, las nuevas tecnologías de desarrollo software. Atrás dejé una cómoda posición como Analista en una factoria de software al cargo de varios aburridos y antediluvianos proyectos de mantenimiento de una importante TELCO.&lt;br /&gt;&lt;br /&gt;Así me encontré al frente de un equipo de desarrollo de 3-6 personas, residente en un importante cliente del sector sanitario público, y dirigiendo un buen número de proyectos Java, consistentes en nuevos desarrollos y mantenimientos.&lt;br /&gt;&lt;br /&gt;Pero no sólo yo tenía ganas de cambios para el 2008. En una decisión tan valiente como inesperada, el cliente decide implantar un completo sistema &lt;a href=&quot;http://es.wikipedia.org/wiki/SAP&quot;&gt;SAP&lt;/a&gt; &lt;a href=&quot;http://es.wikipedia.org/wiki/R/3&quot;&gt;R/3&lt;/a&gt; para sustituir la gran mayoría de sus sistemas de gestión.&lt;br /&gt;&lt;br /&gt;Para esta obra faraónica se ha confiado en la típica pirámide de empresas, compuesta por (i) la super multinacional que aporta el &lt;a href=&quot;http://1.bp.blogspot.com/_wU4MuFZcKsM/Sc_EekMZ6LI/AAAAAAAAAB0/x97jcBkz36M/s200/hal.jpg&quot;&gt;nombre&lt;/a&gt;, más la élite, (ii) &lt;s&gt;la cárnica&lt;/s&gt; el grupo hispano líder que aporta  referencias de éxito en proyectos similares más la clase media y (iii) la empresa regional con aspiraciones que aporta el toque local, instalaciones y una masa de programadores a buen precio. Una organización digna de un&lt;a href=&quot;http://4.bp.blogspot.com/_wU4MuFZcKsM/SdEt95oBO9I/AAAAAAAAACM/KfVCTfkcVQY/s400/imperio_persa.jpg&quot;&gt; imperio persa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;El proyecto&lt;/h4&gt;Mi parte en la historia sería la de dirigir un proyecto consistente en desarrollar una aplicación web Java que hiciera de &lt;a href=&quot;http://es.wikipedia.org/wiki/Back_end&quot;&gt;front-end&lt;/a&gt; para varios módulos del futuro SAP R/3 del cliente. El proyecto empezó oficialmente en junio con la idea de llevarlo de forma paralela a la implantación de SAP. El objetivo era poner en funcionamiento una primera versión para el 1 de enero del 2009 para un número de usuarios controlado y poco a poco ir difundiendo su uso. A día de hoy la aplicación está implantada de forma completa y funcionando estable y eficázmente.&lt;br /&gt;&lt;br /&gt;Como os imaginaréis ha sido una experiencia apasionante pero también muy exigente. Aunque me ha hecho pasar más de un trago amargo, en general estoy satisfecho con su resultado final y sobretodo con lo aprendido por el camino. Un camino que intentaré plasmar en esta serie de posts que espero se conviertan en un útil ejercicio de retrospectiva al que estais todos invitados.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Ecosistema software&lt;/h4&gt;No quería cerrar el post sin contar algo de verdad. Así que describiré las distintas partes que forman el &lt;a href=&quot;http://www.manuelrecena.com/blog/archives/219&quot;&gt;ecosistema software&lt;/a&gt; que he ido construyendo desde mi llegada.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Eclipse&lt;/span&gt;. Una de las primeras decisiones que tomé fue usar Eclipse JEE como ide principal, por su potencia como editor e integración con el resto de herramientas y librerias que usamos. Anteriormente se usaba una antiquísima versión del IntelliJ IDEA pero no entraba en los planes corporativos adquirir licencias más modernas.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;CVS&lt;/span&gt;. Es el sistema de control de versiones que tiene implantado nuestro cliente para todos sus proyectos. No hay más. Mi parte aquí se redució a fomentar algunas &lt;a href=&quot;http://jcesarperez.blogspot.com/2008/11/buenas-prcticas-de-uso-de-un-sistema-de.html&quot;&gt;buenas prácticas&lt;/a&gt; de uso, principalmente a incorporar las dependencias de cada proyecto en su estructura.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Tomcat&lt;/span&gt;. Las aplicaciones se implantan en un servidor JBoss 3.2.6 y en un 4.2.2 las más recientes, pero en desarrollo usamos un Tomcat 6 como servidor individual por su mayor velocidad de arranque y fácil integración con Eclipse. Nuestras máquinas de desarrollo no son ninguna maravilla y Eclipse no se integra con JBoss 3.2.6 por si solo (sí con el 3.2.3), para ello necesitabamos las &lt;a href=&quot;http://www.jboss.org/tools&quot;&gt;JBoss Tools&lt;/a&gt;. Pero entonces todo el entorno iba a pedales, cuando con Tomcat 6 vuela.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ANT&lt;/span&gt;. El cambio a Eclipse-Tomcat y el hecho de incoporar las dependencias a la estructura de proyecto obligó a crear nuevos scripts Ant para automatizar las tareas de construcción de los proyectos. Aunque sólo los nuevos proyectos y los antiguos más significativos han sido migrados al nuevo entorno.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Hudson&lt;/span&gt;. No fue hasta el último trimestre cuando &lt;a href=&quot;http://jcesarperez.blogspot.com/2008/12/2-meses-despus-de-hudson.html&quot;&gt;conseguimos implantar Hudson&lt;/a&gt; como servidor de integración continua. Actualmente realiza las tareas de construcción, testing unitario y análisis de código Java con los plugins de Emma, Checkstyle y Findbugs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;JIRA&lt;/span&gt;. Como herramienta de gestión de proyectos/tareas continuamos usando una antigua versión de &lt;a href=&quot;http://www.atlassian.com/software/jira/&quot;&gt;JIRA&lt;/a&gt;. Es una maravilla y eso que no creo que estemos aprovechando todas sus posibilidades. Sólo echo de menos un wiki principal para todos los proyectos o individual por proyecto.&lt;/li&gt;&lt;/ul&gt;Mis planes para este año implican las siguientes mejoras:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Selenium&lt;/span&gt;. Hemos estado experimentando con &lt;a href=&quot;http://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; para hacer testing funcional de aplicaciones web. Sin embargo estamos teniendo problemas a la hora de ponerlo en funcionamiento en el Hudson. Lo que está dificultando mucho su aceptación y uso generalizado. Aún así lo encuentro básico para dar el siguiente paso de calidad en nuestro modelo de desarrollo. Todos sabemos el infierno que es actualmente el desarrollo web...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Maven&lt;/span&gt;. Aunque Ant es una herramienta genial, el elevado número y hetereogeneidad de proyectos que llevamos hace difícil el mantenimiento de los scripts. Por eso y otras &lt;a href=&quot;http://jcesarperez.blogspot.com/2009/03/por-que-maven.html&quot;&gt;razones&lt;/a&gt; quiero probar &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; en uno o dos proyectos serios.&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Mylyn&lt;/span&gt;. &lt;a href=&quot;http://www.eclipse.org/mylyn/&quot;&gt;Mylyn&lt;/a&gt; es un plugin para integrar Eclipse con la mayoría de sistemas de control de tareas/tickets de forma avanzada. No sólo permite tener visibilidad de los tickets en Eclipse, también dota de &lt;span style=&quot;font-style: italic;&quot;&gt;memoría&lt;/span&gt; a Eclipse para recordar qué ficheros del proyecto están asociados con cada tarea. Con lo primero espero, sobretodo, mejorar la trazabilidad entre lo que hace el código realmente y lo que dice la descripción de la tarea.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Wiki&lt;/span&gt;. Tengo ganas de probar una wiki para gestionar la documentación interna que vamos generando, en lugar de, como hacemos ahora, crear y copiar documentos word a una carpeta compartida. También me gustaría probarla como herramienta de especificación de requisitos de los proyectos con capacidades reales de colaboración y control de versiones automatizado. La idea sería enlazar desde la descripción de las tareas en el Jira a las páginas del wiki.&lt;/li&gt;&lt;/ul&gt;Con ésto doy por terminada esta primera parte de introducción y ecosistema. En la segunda me centraré en la arquitectura de la aplicación.</content><link rel='replies' type='application/atom+xml' href='http://jcesarperez.blogspot.com/feeds/2149142158093023457/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://jcesarperez.blogspot.com/2009/03/historia-de-una-integracion-el.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/2149142158093023457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1481755160576909631/posts/default/2149142158093023457'/><link rel='alternate' type='text/html' href='http://jcesarperez.blogspot.com/2009/03/historia-de-una-integracion-el.html' title='Historia de una integración (i): El principio'/><author><name>jcesarperez</name><uri>http://www.blogger.com/profile/09407010927256988320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_wU4MuFZcKsM/Sc_fj_E8HEI/AAAAAAAAACE/1LwDcmZomT8/s72-c/principio176x176.JPG" height="72" width="72"/><thr:total>9</thr:total></entry></feed>