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

<channel>
	<title>Se hace camino al andar... &#187; ddd</title>
	<atom:link href="http://blog.jmbeas.es/tag/ddd/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jmbeas.es</link>
	<description>Experiencias de un informático vocacional buscando la calidad y sus efectos colaterales.</description>
	<lastBuildDate>Mon, 16 Jan 2012 07:25:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>

   <image>
    <title>Se hace camino al andar...</title>
    <url>http://0.gravatar.com/avatar/8c024022cec721aaa11dc3b092e2c29c.png?s=48</url>
    <link>http://blog.jmbeas.es</link>
   </image>
		<item>
		<title>Nubes de etiquetas</title>
		<link>http://blog.jmbeas.es/2009/10/21/nubes-de-etiquetas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nubes-de-etiquetas</link>
		<comments>http://blog.jmbeas.es/2009/10/21/nubes-de-etiquetas/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 09:32:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/nubes-de-etiquetas/</guid>
		<description><![CDATA[Hoy va a ser uno de esos días &#8220;apretados&#8221;. Tengo muchas cosas en la agenda esperando desde hace demasiado y además el día es un poco más corto porque tengo que ir a Madrid para la reunión de nuestro grupo local de Agile Spain. Hoy va a ser divertido porque vamos a hacer presentaciones de [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'><img width='40%' height='40%' src='http://farm3.static.flickr.com/2302/2266882333_925905e98c.jpg' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;' title='' alt=''/><br/>Hoy va a ser uno de esos días &#8220;apretados&#8221;. Tengo muchas cosas en la agenda esperando desde hace demasiado y además el día es un poco más corto porque tengo que ir a Madrid para la reunión de nuestro <a href='http://sites.google.com/site/agilemadrid/reuniones/2009-10-21'>grupo local de Agile Spain</a>. Hoy va a ser divertido porque vamos a hacer presentaciones de 5 minutos para ayudarnos a montar el backlog de temas de esta temporada. Yo he propuesto el tema &#8220;Pruebas de aceptación automatizadas con Concordion&#8221;, que ya tocaba. Aunque me acabo de dar cuenta de que aún nos queda por tratar el tema del <a href='http://sites.google.com/site/agilemadrid/temas#TOC-Manifiesto-y-Principios-giles'>Manifiesto Ágil</a>, que lo hemos ido posponiendo durante el verano y al final se ha quedado en nada. Bueno, si algún compañero se lo quiere &#8220;apropiar&#8221;&#8230; libre es de hacerlo.<br/><br/>Pero a pesar de lo apretado del día, no he podido evitar arrancar el <a href='http://www.scribefire.com/'>ScribeFire</a> para dar una referencia rápida de este artículo al que he llegado vía el <a href='http://twitter.com/KevlinHenney/status/5039940746'>twitter de Kevlin Henney</a>. Se trata de usar Worlde (herramienta que ya he citado <a href='http://jmbeas.blogspot.com/2008/09/worlde.html'>en otra ocasión</a>) con el código fuente de un proyecto Java. Hace una comparación de <a href='http://es.wikipedia.org/wiki/Nube_de_palabras'>nubes de palabras</a> muy curiosa. El estilo de programación y el diseño de los dos proyectos en comparación hace que, visualmente, sea muy evidente en uno de los casos de qué va el proyecto pero que, por el contrario, en el otro sea prácticamente imposible (visualmente) decir de qué va. En el caso de este artículo se compara un diseño guiado por el dominio (DDD) con otro más &#8220;tradicional&#8221; (¿guiado por los datos?) pero a mi me gusta más por la reflexión que ofrece de fondo. ¡Jo!, cómo me gustaría tener más tiempo para probar esto y meterlo en la documentación a generar en los builds de integración continua. Se me antoja que si en una retrospectiva nos encontramos con que resulta difícil (visualmente) decir de qué va un proyecto/módulo&#8230; mmm, algo en el diseño debe estar fallando y una refactorización se &#8220;ve venir&#8221;. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <br/><br/>[La foto es de ... bueno, si hay alguien de Alicante o alrededores leyendo, quizás sepa <a href='http://www.flickr.com/photos/vicentedemiguel/2266882333/'>de dónde es</a>... y me invita a verlo en directo. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ]<br/></div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/10/21/nubes-de-etiquetas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modelo de dominio matriarcal (II)</title>
		<link>http://blog.jmbeas.es/2009/05/24/modelo-de-dominio-matriarcal-ii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=modelo-de-dominio-matriarcal-ii</link>
		<comments>http://blog.jmbeas.es/2009/05/24/modelo-de-dominio-matriarcal-ii/#comments</comments>
		<pubDate>Sun, 24 May 2009 21:00:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/modelo-de-dominio-matriarcal-ii/</guid>
		<description><![CDATA[Antes que nada pedir disculpas, especialmente a Julio César Pérez porque hace ya varias semanas que, en la primera parte de este artículo, le prometí que iba a escribir un ejemplo para explicar cómo se implementaba la ignorancia de la persistencia (&#8220;persistence ignorance&#8221; en inglés) en un modelo de dominio al estilo DDD. Lo cierto [...]]]></description>
			<content:encoded><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">Antes que nada pedir disculpas, especialmente a <a href="http://jcesarperez.blogspot.com/" target="_blank">Julio César Pérez</a> porque hace ya varias semanas que, en la <a href="http://jmbeas.blogspot.com/2009/05/modelo-de-dominio-matriarcal.html">primera parte de este artículo</a>, le prometí que iba a escribir un ejemplo para explicar cómo se implementaba la <i>ignorancia de la persistencia</i> (&#8220;persistence ignorance&#8221; en inglés) en un modelo de dominio al estilo <a href="http://jmbeas.blogspot.com/2009/04/ddd-en-espanol.html">DDD</a>. Lo cierto es que he visto que me estoy metiendo en tantos fregados (incluídas mis labores familiares cotidianas) que cada día tengo menos tiempo de ponerme a programar con la mínima continuidad necesaria.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dddsample.sourceforge.net/images/frontpage.jpeg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 450px; height: 300px;" src="http://dddsample.sourceforge.net/images/frontpage.jpeg" alt="Cargo freighter passing under the Golden Gate bridge in San Fransisco. Image courtesy of FreeFoto.com" border="1" /></a><br />Bueno, como la respuesta a Julio la tengo más o menos elaborada, voy a utilizar código ajeno para explicarme. A ver si queda suficientemente claro. El código completo está disponible en el ejemplo &#8220;oficial&#8221; de DDD: <a href="http://dddsample.sourceforge.net/" target="_blank">DDDSample</a>. <a href="http://dddsample.sourceforge.net/download.html" target="_blank">Lo podéis bajar</a> desde el <a href="http://dddsample.sourceforge.net/source-repository.html" target="_blank">repositorio de subversion</a> (yo he utilizado la última versión etiquetada como 1.1.0) o podéis &#8220;navegar&#8221; por el <a href="http://dddsample.sourceforge.net/xref/index.html" target="_blank">código fuente</a> coloreado e hipervinculado generado con el <a href="http://maven.apache.org/plugins/maven-jxr-plugin/index.html" target="_blank">plugin maven jxr</a>. Seguramente explicar este ejemplo daría para varios blogs, pero me voy a centrar en la explicación de la persistencia. Si queréis ver los ficheros de configuración de Spring e Hibernate no os quedará más remedio que acceder al <a href="http://dddsample.sourceforge.net/source-repository.html" target="_blank">SVN</a>. Perdonad que no os hipervincule todas las clases pero ya os he explicado que ando justito de tiempo libre&#8230; <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Este DDDSample es la implementación del ejemplo empleado por Eric Evans en <a href="http://domaindrivendesign.org/books/index.html#DDD" target="_blank">el libro azul</a> y que se trata de una compañía de transporte de contenedores. Yo voy a seguir el camino de una petición de reserva del envío de un contenedor, que es algo sencillo pero que implica guardar datos en la base de datos. No voy a entrar en cómo se llama desde la UI al servicio para no extenderme demasiado, pues como dije más arriba tenéis todo el código disponible para descargarlo, pero sí que os explicaré (al final) el &#8220;truqui&#8221; que emplean aquí por si os suena un poco raro.</p>
<p>Todo empieza por una fachada llamada BookingServiceFacadeImpl (que implementa la interfaz BookingServiceFacade y que no sirve para otra cosa que para envolver al &#8220;verdadero servicio&#8221; (BookingServiceImpl, que implementa BookingService). El constructor de BookingServiceImpl tiene como parámetros un CargoRepository, un LocationRepository y un RoutingService, esto se podría cambiar por un constructor vacío y varios setters, pero siempre y cuando nos aseguremos de no usar BookingService sin antes haber &#8220;seteado&#8221; estos colaboradores. Por eso es más seguro inyectar los colaboradores <b>imprescindibles</b> en el constructor. En DDDSample se hace con Spring en context-application.xml:</p>
<pre name="code" class="xml"><bean id="bookingService" class="se.citerus.dddsample.application.impl.BookingServiceImpl"><constructor-arg ref="cargoRepository"></constructor-arg><constructor-arg ref="locationRepository"></constructor-arg><constructor-arg ref="routingService"></constructor-arg></bean></pre>
<p>El método que nos interesa es bookNewCargo:</p>
<pre name="code" class="java">@Override<a href="http://twitter.com/Transactionalpublic" class="twitter-user-link" title="Transactionalpublic profile on Twitter" target="_blank">@Transactionalpublic</a> TrackingId bookNewCargo(final UnLocode originUnLocode,                             final UnLocode destinationUnLocode,                             final Date arrivalDeadline) {// TODO modeling this as a cargo factory might be suitablefinal TrackingId trackingId = cargoRepository.nextTrackingId();final Location origin = locationRepository.find(originUnLocode);final Location destination = locationRepository.find(destinationUnLocode);final RouteSpecification routeSpecification = new RouteSpecification(origin, destination, arrivalDeadline);

final Cargo cargo = new Cargo(trackingId, routeSpecification);

cargoRepository.store(cargo);logger.info("Booked new cargo with tracking id " + cargo.trackingId().idString());

return cargo.trackingId();}</pre>
<p>Fijaos que no hablamos con la BD para guardar el objeto Cargo que recién creamos, sino que hablamos con un CargoRepository: el que hemos inyectado en el constructor y que puede perfectamente guardar el objeto en la BD o en cualquier otro sitio, p.ej. una Collection. ¿Por qué no? Si no hubiera un requisito que nos pidiera poder recuperar la información de los envíos (Cargos) si la aplicación se reiniciara, no habría nada que nos impediría mantener en memoria esta información. ¿Verdad? En esto justamente consiste la <i>ignorancia de la persistencia</i>. Si cambiamos la política para guardar los datos, el código de los objetos Cargo no necesita ser modificado ni una línea. Es más, nuestro servicio (de dominio) BookingService tampoco. Sólo necesitamos cambiar el repositorio que inyectamos. Esto es fácil con Spring. Veamos cómo está hecho en context-infrastructure-persistence.xml:</p>
<pre name="code" class="xml"> <tx:annotation-driven manager="transactionManager"></tx:annotation-driven>

 <bean class="se.citerus.dddsample.infrastructure.persistence.hibernate.CargoRepositoryHibernate" id="cargoRepository"> 
<property ref="sessionFactory" name="sessionFactory"></property> </bean></pre>
<p>No pongo los detalles de cómo se configuran transactionManager ni sessionFactory porque no son significativos: son idénticos a los de cualquier otra aplicación. Lo que sí es relevante aquí es CargoRepositoryHibernate. Fijaos en que está anotada con <a href="http://twitter.com/Repository" class="twitter-user-link" title="Repository profile on Twitter" target="_blank">@Repository</a> y extiende HibernateRepository (que simplemente sirve para tener el setSessionFactory y el getSession). Finalmente, echemos un vistazo al método store que es el que nos interesa ahora, pero echad un vistazo &#8220;de refilón&#8221; a los demás porque pueden ayudaros a situaros sobre cuál es la responsabilidad de este objeto (que es MUY parecido a un DAO).</p>
<pre name="code" class="java">public void store(Cargo cargo) {getSession().saveOrUpdate(cargo);// Delete-orphan does not seem to work correctly when the parent is a componentgetSession().createSQLQuery("delete from Leg where cargo_id = null").executeUpdate();}</pre>
<p>Observad que alguien ha dejado un comentario explicando el borrado de ciertos objetos relacionados. Esto tiene un cierto &#8220;tufillo&#8221;, yo hubiera extraído el comentario y la linea a la que se refiere a un método private llamado deleteOrphansWhenParentIsAComponent o algo así, y hubiera llevado el comentario al javadoc del método y me aseguraría de tener un buen test para esto que huele tan raro&#8230; pero es lo que hay&#8230;</p>
<p>Llegados a este punto algunos volveréis la vista atrás y diréis: &#8220;¡Demonios! ¿Dónde hace commit?&#8221;. Aquí es donde tenemos que mostrar todas las cartas y enseñar dónde se configura aquella fachada de la que hablábamos al principio BookingServiceFacadeImpl:</p>
<pre name="code" class="xml"> <bean class="org.springframework.orm.hibernate3.HibernateInterceptor" id="hibernateInterceptor"> 
<property ref="sessionFactory" name="sessionFactory"></property> </bean>  <bean class="org.springframework.aop.framework.ProxyFactoryBean" id="bookingServiceFacade"> 
<property ref="bookingServiceFacadeTarget" name="target"></property> 
<property name="interceptorNames"> 
<list>      <value>hibernateInterceptor</value>    </list>    </property> </bean> <bean class="se.citerus.dddsample.interfaces.booking.facade.internal.BookingServiceFacadeImpl" id="bookingServiceFacadeTarget"> 
<property ref="bookingService" name="bookingService"></property> 
<property ref="cargoRepository" name="cargoRepository"></property> 
<property ref="locationRepository" name="locationRepository"></property> 
<property ref="voyageRepository" name="voyageRepository"></property> </bean></pre>
<p>Claro, ahora se entiende, usamos el HibernateInterceptor con la misma sessionFactory de nuestros repositorios. Je, je&#8230; Vale, es un poco &#8220;truqui&#8221;, pero es la manera más limpia que hay de trabajar &#8220;puertas adentro&#8221; y olvidarte de historias.</p>
<p>¡Uy! Se me olvidaba explicar cómo es el objeto Cargo, que es lo que en DDD se denomina <a href="http://dddstepbystep.com/wikis/ddd/aggregate-root.aspx" target="_blank">AggregateRoot</a> y que es algo así como la raíz de un árbol de objetos dependientes, cuya existencia depende de la raiz. En este caso son Cargo, Itinerary, Leg, Delivery y RouteSpecification. No voy a profundizar aquí, pero diré que cuando guardamos un Cargo podemos estar guardando todos los que dependen de él. Cargo también es una <a href="http://dddstepbystep.com/wikis/ddd/entity.aspx" target="_blank">Entity</a> (en el sentido de DDD y también en el sentido de JPA, si lo usáramos).</p>
<p>¿Cómo se mapea este AggregateRoot con las tablas de la BD? Si usáramos JPA sería muy fácil viendo las anotaciones; en el caso de DDDSample han usado los ficheros de mapeo de Hibernate. No voy a entrar en detalles sobre esto porque sería explicar Hibernate, y no es mi intención ahora mismo.</p>
<p>Por último, el &#8220;truqui&#8221; del que os hablaba al principio que usan para exponer la fachada. Usan RmiServiceExporter, una utilidad (como otras muchas) de Spring, y que permite acceder a este objeto BookingServiceFacadeImpl como si de un EJB se tratara. Fácil, ¿verdad? Bueno, también podríais haberlo anotado con <a href="http://twitter.com/EJB" class="twitter-user-link" title="EJB profile on Twitter" target="_blank">@EJB</a> y todas esas cosas que explican en Java EE. Ya se sabe, para gustos, colores. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Espero que haya quedado claro el &#8220;meollo&#8221; de la cuestión, que tiene mucho que ver con aquello que contaba hace ya bastante sobre la <a href="http://jmbeas.blogspot.com/2009/01/arquitectura-en-capas-de-cebolla.html">Arquitectura en Capas de Cebolla</a>. La idea que me gustaría que os quedara después de este artículo (y sobre todo el anterior) es que la ventaja de hacer un modelo de dominio rico y carente de dependencias tecnológicas consiste en que tenemos un código más limpio y realmente desacoplado, lo que nos trae un montón de ventajas como que podemos comprobar unitariamente nuestro código con mucho menos coste y riesgo de errores.</p>
<p>Quedo a vuestra disposición para discutir lo que creáis conveniente.</p>
<p><b>Nota:</b> Perdonad el formato de los xml, pero Blogger me reformatea los elementos vacíos y me monta un cristo, hasta que me he dado cuenta y los he cambiado a mano.</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/05/24/modelo-de-dominio-matriarcal-ii/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Salvando las distancias</title>
		<link>http://blog.jmbeas.es/2009/05/13/salvando-las-distancias/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=salvando-las-distancias</link>
		<comments>http://blog.jmbeas.es/2009/05/13/salvando-las-distancias/#comments</comments>
		<pubDate>Wed, 13 May 2009 10:12:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[libros]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[agile-spain]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[concordion]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/salvando-las-distancias/</guid>
		<description><![CDATA[Voy en metro, ilusionado, camino del segundo día del curso de Scrum de Medinilla. Y me he pillado el libro de Gojko Adzic &#8220;Bridging the Communication Gap&#8221; porque ayer surgió el tema de las especificaciones ejecutables y los roles dentro del equipo. Pero estoy un poco desentrenado porque hace mucho que no voy en metro [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'><img src='http://www.acceptancetesting.info/images/front-300.jpg' style='max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;'/>Voy en metro, ilusionado, camino del segundo día del <a href='http://jmbeas.blogspot.com/2009/05/gestionar-proyectos.html'>curso de Scrum de Medinilla</a>. Y me he pillado el libro de Gojko Adzic <a href='http://www.acceptancetesting.info/the-book/' target='_blank'><i>&#8220;Bridging the Communication Gap&#8221;</i></a> porque ayer surgió el tema de las especificaciones ejecutables y los roles dentro del equipo. Pero estoy un poco desentrenado porque hace mucho que no voy en metro con tiempo para leer, y el iPod lo tengo vacío de podcasts por escuchar, así que me he puesto la &#8220;música aleatoria&#8221; y mientras escucho de lo más variado (desde la deliciosa <a href='http://en.wikipedia.org/wiki/Joy_Denalane' target='_blank'>Joy Denalane</a> hasta <a href='http://www.m-clan.ws/' target='_blank'>M-Clan</a>, que no veas cómo me animan) he pensado en tomar notas para cumplir con una &#8220;cierta obligación&#8221;: explicar lo que me ha parecido el libro.</p>
<p><a href='http://gojko.net/' target='_blank'>Gojko Adzic</a> es un tipo que habla en inglés con un acento balcánico realmente difícil de seguir (al menos para mi), así que pensé que era buena idea comprar el libro para entender a qué se refiere cuando habla de talleres de especificaciones y de pruebas de aceptación ejecutables en entornos ágiles. Además, Gojko Adzic también imparte cursos sobre Domain-Driven Design y esa relación entre <a href='http://groups.google.com/group/ddd-es' target='_blank'>DDD</a> y pruebas de aceptación es algo que me interesa bastante.</p>
<p>Voy a ser sincero, también compré el libro porque es el primero en el que se habla de <a href='http://jmbeas.blogspot.com/search/label/concordion'>Concordion</a>, la herramienta open source en la que modestamente colaboro. Pero son apenas unas páginas y el valor del libro es mucho más que eso.</p>
<p>Adzic explica la importancia de que &#8220;la gente del negocio&#8221; hable el <u>mismo idioma</u> que &#8220;la gente técnica&#8221;. Esto muchos lo entienden como obligar a clientes y usuarios a que hablen en términos tecnológicos como &#8220;altas, bajas, modificaciones y listados (CRUD en inglés)&#8221;, o peor aún, de <a href='http://sinergiasincontrol.blogspot.com/2009/04/62-confusiones-linguisticas.html' target='_blank'>tablas</a>, campos y relaciones.</p>
<p>En <a href='http://groups.google.com/group/ddd-es' target='_blank'>DDD</a> hablamos de un lenguaje ubícuo, o único en todo el proyecto, y que es el que usan tanto técnicos como usuarios. Esto permite reducir los defectos producidos por malentendidos y tiende puentes entre ambos mundos, abriendo la posibilidad a una verdadera colaboración.</p>
<blockquote><p>Un inciso melancólico. Voy ahora mismo montado (mientras escribo estas notas en <a href='http://jmbeas.blogspot.com/2008/01/moleskine.html'>mi moleskine</a>) en el metro ligero y me he acordado de ese par de meses intensos que viví y trabajé (sobre todo lo primero) en <a href='http://jmbeas.wikidot.com/articulos' target='_blank'>Melbourne</a> (Australia). Allí fui usuario del &#8220;tram&#8221; y he de decir que me parece un medio de transporte público de lo más interesante porque es a la vez rápido, cómodo y silencioso.</p></blockquote>
<p>Pero sigamos con el libro. El grueso del mismo se basa en hablar del &#8220;agile acceptance testing&#8221; y de cómo buscamos ponernos de acuerdo en qué es lo que hay y <b>lo que no hay</b> que desarrollar. Para esto usamos ejemplos realistas en vez de requisitos abstractos. <i>&#8220;Los ejemplos demuestran cómo debería actuar el sistema y cómo debería ayudar a los usuarios a hacer su trabajo&#8221;.</i> Adzic propone que estos ejemplos sean creados por todo el equipo de implementación, no sólo por un &#8220;experto del dominio&#8221; (también conocido como &#8220;analista de negocio&#8221;) como en modelos de desarrollo más tradicionales. <i>&#8220;Usamos los ejemplos para discutir el dominio y asegurarnos de que no hay malentendidos&#8221;.</i></p>
<p>Según Adzic, el uso de ejemplos realistas obliga a pensar más acerca de los problemas. De hecho, comenta cómo se producen muchas discusiones entre los expertos cuando se plantean ejemplos para casos extremos; discusiones que incluso les hacen a veces revisar sus propios procesos de negocio. ¡Vaya! Si resulta que podemos ayudar a nuestros clientes en vez de simplemente observar su comportamiento &#8220;desde fuera&#8221;, como si fueramos &#8220;supernanis con corbata&#8221;.</p>
<blockquote><p>Damned! ¡Me he saltado una parada! Estaba tan concentrado&#8230; Menos mal que la frecuencia del metro ligero éste es alta y he podido llegar sólo un par de minutos tarde. Buff&#8230;</p></blockquote>
<p><a href='http://jmbeas.blogspot.com/2009/05/gestionar-proyectos.html'>De vuelta del estupendo curso de Ángel Medinilla</a>, sigo con el resumen del libro y me fijo en que no he explicado esto de los ejemplos. Vamos, que no he puesto ejemplos de ejemplos. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Adzic pone un ejemplo en la página 45 de una regla de negocio relacionada con el descuento que le podemos ofrecer a un cliente, pero a mi me gusta más el que explica David Peterson en la web de <a href='http://www.concordion.org/Example.html' target='_blank'>Concordion</a>. Es bastante más completo porque nos lleva desde la historia de usuario (el requisito) hasta la prueba de aceptación automatizada (en forma de ejemplos). Es interesante cómo David hace mucho hincapié siempre en que debemos especificar con ejemplos que expliquen comportamientos muy elementales y dejar para otras especificaciones todo aquello que quedaría fuera. Son los <i>&#8220;Further details&#8221;</i> en <a href='http://www.concordion.org/Example.html' target='_blank'>el ejemplo</a>. También Adzic habla de esto en su libro, pero menos; y yo creo que es importante esta anotación al margen para aquellos que queráis &#8220;tomar este camino&#8221; para hacer pruebas de aceptación.</p>
<p>En <a href='http://www.acceptancetesting.info/the-book/' target='_blank'><i>&#8220;Bridging the communication gap&#8221;</i></a> también se explica cómo conducir estas reuniones (talleres de especificación) e incluso aconseja sobre algunas herramientas. Pero creo que es interesante explicar cómo pueden encajar estos talleres en nuestro calendario semanal (ágil).</p>
<p>Adzic sugiere lo siguiente:</p>
<p><img src='http://lh5.ggpht.com/_QhcG1I9XuzE/SgqavtRcwXI/AAAAAAAAAPU/J9b3muXeSYM/s640/sprint-calendar-adzic.jpg' style='max-width: 800px;'/></p>
<p>Release es todo aquello que hacemos después de la demo para dejar bien cerrado el sprint. Etiquetamos en subversion, hacemos copias de seguridad, ponemos las versiones del nuevo sprint en los pom.xml (si usamos Maven y si es que tenemos que cambiar de versión), limpiamos las pizarras&#8230; y mientras esto lo pueden ir haciendo algunos desarrolladores (típicamente los becarios, je, je) pues el resto puede estar preparando el sprint primero revisando el backlog y luego, ya con los becarios incorporados, estimando las historias y decidiendo lo que se podrá hacer razonablemente en el sprint (las próximas dos semanas).</p>
<p>Ojo, es una manera de organizar el trabajo durante un sprint, pero lo importante de esto es que el <u>dueño del producto</u> (también conocido como jefe de proyecto, analista de negocio, o incluso <i>tester</i>, según vuestro &#8220;mapeo&#8221; preferido) se encarga de trabajar las historias de usuario (redacción y priorización) y de los ejemplos (criterios de aceptación) antes de los talleres de especificación, pero realmente es el equipo en su totalidad quien acuerda lo esencial de los criterios de aceptación mediante la discusión que se ofrece en esta reunión. Para los que ya estéis algo picados con esto del agilismo, me permito recordar <a href='http://www.xprogramming.com/xpmag/expCardConversationConfirmation.htm' target='_blank'>&#8220;las tres Ces&#8221;</a> (<i>card, conversation, confirmation</i>). Éste es el momento ideal para la conversación, aunque ya se haya tenido una conversación previa cuando se han estimado las historias de usuario en el <a href='http://geeks.ms/blogs/rcorral/archive/2006/11/19/las-reglas-de-scrum-i-el-sprint-planning-meeting.aspx' target='_blank'>Sprint Planning Meeting</a> (usando terminología Scrum).</p>
<p>Bueno, y hasta aquí hemos llegado. Espero que os resulte útil. Y si alguien más se ha leido este libro y quiere contrastar aquí su opinión, estaré encantado de poder charlar con vosotros porque mi intención es preparar una presentación (o un taller, ya veré) sobre este tema y exponerla bajo el &#8220;paraguas&#8221; de <a href='http://www.agile-spain.com/agilev2/proximos_cursos_y_eventos_en_espana' target='_blank'>Agile Spain</a>.</p>
</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/05/13/salvando-las-distancias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modelo de dominio matriarcal</title>
		<link>http://blog.jmbeas.es/2009/05/05/modelo-de-dominio-matriarcal/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=modelo-de-dominio-matriarcal</link>
		<comments>http://blog.jmbeas.es/2009/05/05/modelo-de-dominio-matriarcal/#comments</comments>
		<pubDate>Tue, 05 May 2009 09:07:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/modelo-de-dominio-matriarcal/</guid>
		<description><![CDATA[En los últimos días he estado cruzando algunos mensajes en el blog de Julio César Pérez Arques y dado que hemos llegado a un punto donde no lo puedo &#8220;despachar&#8221; con un par de frases ocurrentes, creo que lo oportuno es explicarlo en un formato más &#8220;extenso&#8221;. En un artículo de su blog, Julio César [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>
<div align='left'><img src='http://farm1.static.flickr.com/26/55314897_ebcd480405_m_d.jpg' style='max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;'/>En los últimos días he estado cruzando <a href='http://jcesarperez.blogspot.com/2009/05/10-formas-de-mejorar-tu-codigo.html#comment-3771656714533458108' target='_blank'>algunos mensajes en el blog de Julio César Pérez Arques</a> y dado que hemos llegado a un punto donde no lo puedo &#8220;despachar&#8221; con un par de frases ocurrentes, creo que lo oportuno es explicarlo en un formato más &#8220;extenso&#8221;.<br/></div>
<p><br/>En un <a href='http://jcesarperez.blogspot.com/2009/05/10-formas-de-mejorar-tu-codigo.html' target='_blank'>artículo de su blog</a>, Julio César resumía bastante bien una <a href='http://www.infoq.com/presentations/10-Ways-to-Better-Code-Neal-Ford' target='_blank'>presentación de Neal Ford en InfoQ</a>, pero dijo algo que nos llevó a iniciar esa &#8220;eterna&#8221; discusión sobre modelo anémico y modelo rico:<br/><br />
<blockquote>No me gustan nada los constructores con más de 2 parametros. Prefiero uno vacio y luego hacer sets.<br/></p></blockquote>
<p><i><br/></i>Julio César en realidad luego explica la postura de Neal Ford sobre el uso de constructores, más alineada con los modelos ricos que con los <a rel='nofollow' href='http://martinfowler.com/bliki/AnemicDomainModel.html'>modelos anémicos</a> que defiende Julio.<br/><br/>Y ante mi crítica, Julio se excusa (en vano, je, je) diciendo lo siguiente:<br/><br />
<blockquote>No se si es que estoy demasiado Springizado pero me gusta más tener mi capa service y mi capa dao separaditas. Supongo que también tiene que ver con el tipo de aplicaciones en las que trabajo, basicamente de gestión sobre una bbdd ama y señora.<br/>¿Por qué acaso en una aplicación de gestión no son todas las clases del modelo Value Objects? Para mi la unica diferencia es en si mueven los datos del cliente a la app o si de la app a la bbdd. Siempre desde mi pto d vista&#8230;<br/></p></blockquote>
<p><br/>No voy a entrar a discutir si usar Spring y tener las capas de servicios y de acceso a datos desacopladas tienen algo que ver. Para mi no, pero no me interesa discutir ahora sobre frameworks, porque me interesa &#8220;atacar&#8221; esa idea de que una &#8220;aplicación de gestión&#8221; es poco más que una aplicación de &#8220;data entry&#8221;. <b>No estoy de acuerdo.</b> Para nada, una aplicación de gestión es justamente donde más y mejor podemos aplicar el Domain-Driven Design.<br/><br/>Pero voy a usar <a href='http://www.udidahan.com/2008/02/15/from-crud-to-domain-driven-fluency/' target='_blank'>un viejo artículo de Udi Dahan</a> (al que, sí, es cierto, últimamente cito mucho) en el que explica muy, muy bien cómo y por qué debemos orientar nuestros diseños hacia el modelo de dominio en vez de al CRUD.<br/><br/>Udi pone el ejemplo de un sistema para hacer entrevistas a candidatos en una selección de <a href='http://multinationalcorp.blogspot.com/2008/07/propongo-eliminar-los-departamentos-de.html' target='_blank'>Recursos Humanos</a>. Y así, si modelamos esta aplicación como un conjunto de inserciones, actualizaciones y eliminaciones de objetos Cita, nuestro código para el servicio de citar a un entrevistado sería algo así como:<br/>
<pre class='java' name='code'>Cita cita = new Cita();

cita.setEntrevistador(entrevistador);entrevistador.getCitas().add(cita);

cita.setCandidato(candidato);candidato.getCitas().add(cita);

cita.setFechaHora(fechaHora);

dao.guardar(cita);</pre>
<p>Pero, en cambio, si nos orientamos al dominio y modelamos el sistema como objetos con estado que se encargan ellos mismos de persistirse cuando cambian de estado (si es necesario), conseguimos que el código de nuestros servicios no sólo no esté acoplado al modelo de datos sino que es más fácil de entender al carecer de artificios tecnológicos:<br/></p>
<pre class='java' name='code'>entrevistador.planificaEntrevistaCon(candidato).enFechaHora(fechaHora);</pre>
<p>Si entramos a discutir cómo se implementan estos métodos, a partir de este punto tendremos una gran discusión porque no todos se ponen (nos ponemos) de acuerdo sobre cómo hay que hacerlo. Muchos hablamos de la <i>ignorancia de la persistencia</i>, es decir, de que los objetos de dominio no deben llamar nunca a los DAOs directamente sino que para ello hablan con los Repositorios usando una interfaz tipo Collections. Otros dicen que por qué esa indirección si el 99% de las aplicaciones tienen que persistir los datos. Yo tengo claro que se trata de aplicar los principios <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank">SOLID</a> y que, por tanto, lo correcto es desacoplar la lógica de negocio de la lógica de persistencia. Pero para gustos hay colores&#8230;<br/><br/>Esta semana lo voy a tener un poco difícil, pero puede que para la semana que viene pueda implementar <b>completo</b> este ejemplo usando Spring y JPA. Espero que la salud mía y de mis niños me lo permita. Je, je&#8230;<br/><br/>Para terminar, si a alguien le interesa todo esto del Diseño Orientado al Dominio, le invito a pasarse por la <a href="http://groups.google.com/group/ddd-es" target="_blank">lista de DDD-es</a> que hemos creado <a href="http://jmbeas.blogspot.com/2009/04/ddd-en-espanol.html">recientemente</a>.<br/><br/></div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/05/05/modelo-de-dominio-matriarcal/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>DDD en español</title>
		<link>http://blog.jmbeas.es/2009/04/22/ddd-en-espanol/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ddd-en-espanol</link>
		<comments>http://blog.jmbeas.es/2009/04/22/ddd-en-espanol/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 21:37:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/ddd-en-espanol/</guid>
		<description><![CDATA[Resulta que en foro-agiles estábamos discutiendo sobre TDD (Test-Driven Development), BDD (Behaviour-Driven Development) y DDD (Domain-Driven Design) y caímos en que no había ningún foro en español donde discutir y aprender sobre DDD. Así que lo he creado: se llama DDD-es y está en GoogleGroups. En ocasiones he participado en la lista en inglés sobre [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'><img src='http://domaindrivendesign.org/sites/default/files/images/cover_small.jpg' style='max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/>Resulta que en <a href='http://groups.yahoo.com/group/foro-agiles' target='_blank'>foro-agiles</a> estábamos discutiendo sobre TDD <i>(Test-Driven Development)</i>, BDD <i>(Behaviour-Driven Development)</i> y DDD <i>(Domain-Driven Design)</i> y caímos en que no había ningún foro en español donde discutir y aprender sobre DDD. Así que lo he creado: se llama <a href='http://groups.google.es/group/ddd-es' target='_blank'>DDD-es</a> y está en GoogleGroups.<br/>
<p>En ocasiones he participado en <a href='http://tech.groups.yahoo.com/group/domaindrivendesign' target='_blank'>la lista en inglés sobre DDD</a>, pero es un grupo muy maduro donde a veces el idioma me dificulta las discusiones. Ya saben, ellos bromean contigo haciendo un juego de palabras y tú no sabes siquiera de qué va la cosa&#8230; Creo que tener un foro donde expresarnos sin las cortapisas del lenguaje nos ayudará a aprender más rápido y mejor sobre <a href='http://en.wikipedia.org/wiki/Domain-driven_design' target='_blank'>Diseño Basado en el Dominio</a>.<br/> </p>
<p>También estoy en <a href='http://www.linkedin.com/groups?gid=132426' target='_blank'>el grupo de LinkedIn</a>, pero no siento la necesidad de crear otro en español. <br/> </p>
<p>En fin, espero que los que os vayáis uniendo a <a href='http://groups.google.es/group/ddd-es' target='_blank'>este foro</a> os presentéis (<a href='http://groups.google.es/group/ddd-es/browse_thread/thread/ab7ea19b6c3e354d' target='_blank'>si así lo deseáis</a>) y que os sintáis libres para preguntar o aportar lo que queráis.<br/><br/>
<div class='zemanta-pixie'><img src='http://img.zemanta.com/pixy.gif?x-id=4ee60d9a-514e-80f8-b0c3-b5fb72eb7cdf' class='zemanta-pixie-img'/></div>
</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/04/22/ddd-en-espanol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOA no va de reusar</title>
		<link>http://blog.jmbeas.es/2009/04/16/soa-no-va-de-reusar/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=soa-no-va-de-reusar</link>
		<comments>http://blog.jmbeas.es/2009/04/16/soa-no-va-de-reusar/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 10:55:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile-spain]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[soa]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/soa-no-va-de-reusar/</guid>
		<description><![CDATA[El pasado día 7 asistí a un curso de un día sobre SOA organizado por iMeta e impartido por el reconocido Udi Dahan. Por cierto que fue en las instalaciones de Microsoft en &#8220;La Finca&#8221;. Uuuuyyy, qué miedooorrr&#8230; Bueno, tampoco es para tanto, soy muy Linux y muy Java, pero tampoco soy tan &#8220;talibán&#8221; como [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'><a href='http://www.flickr.com/photos/8623220@N02/2179118865'><img height='50%' width='50%' src='http://farm3.static.flickr.com/2316/2179118865_0e2c3f25f2.jpg' title='' alt='' style='float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;'/></a>El pasado día 7 asistí a <a href='http://jmbeas.blogspot.com/2009/03/udi-dahan-en-madrid.html'>un curso de un día sobre SOA</a> organizado por <a href='http://www.imeta.es/' target='_blank'>iMeta</a> e impartido por el reconocido <a href='http://www.udidahan.com/about/' target='_blank'>Udi Dahan</a>. Por cierto que fue en las instalaciones de Microsoft en &#8220;La Finca&#8221;. Uuuuyyy, qué miedooorrr&#8230; Bueno, tampoco es para tanto, soy muy Linux y muy Java, pero tampoco soy tan &#8220;talibán&#8221; como para no &#8220;entrar en la boca del lobo&#8221;. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <br/><br/>Bueno, bromas aparte, la organización de iMeta fue muy buena (el <i>catering</i> estuvo a la altura, je, je) y Udi Dahan es toda una garantía. Además, como <a href='http://www.hadihariri.com/' target='_blank'>Hadi Hariri</a> (de iMeta) me había explicado, el curso no estaba centrado en ninguna tecnología en particular. Yo, por si acaso, advertí de mi &#8220;orientación ideológica&#8221; en mi presentación. Por cierto, pensé que mi inglés estaba más oxidado, aunque al final de la tarde ya no daba pié con bola&#8230; <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> <br/><br/>Pero vamos al tema. Udi Dahan es muy conocido en ambientes SOA (Service Oriented Architecture) y <a href='http://jmbeas.blogspot.com/search/label/DDD'>DDD</a> (Domain-Driven Design) porque tiene un enfoque diferente al SOA de otros autores. Durante el curso le pregunté directamente por esto y sobre cómo se encaja con la visión de, por ejemplo, <a href='http://www.thomaserl.com/' target='_blank'>Thomas Erl</a>. Udi me contestó que simplemente no encajan: el enfoque de Erl se centra en reusar, mientras que el de Dahan se centra en la autonomía de los servicios y el principio de única responsabilidad (single responsibility principle). En un correo posterior, Udi me ha aclarado que, según él, <a href='http://jmbeas.blogspot.com/2008/02/modelos-de-servicio-segn-thomas-erl.html'>Thomas Erl ve los servicios</a> más como construcciones de software, mientras que él los ve más como construcciones de negocio (implementados mediante varias construcciones de software). <br/><br/>No hace mucho leí <i><a href='http://www.amazon.com/Implementing-SOA-Total-Architecture-Practice/dp/0321504720' target='_blank'>&#8220;Implementing SOA&#8221;</a></i> de Paul C. Brown, y hay muchas más coincidencias con Dahan que con Erl. Y eso que de Erl tengo nada más y nada menos que tres tochacos que voy a tener que rifar, salvo que el último, <i><a href='http://www.amazon.com/Design-Patterns-Prentice-Service-Oriented-Computing/dp/0136135161' target='_blank'>&#8220;SOA Design Patterns&#8221;</a></i> me sirva para algo más que para hacer bulto en la estantería. :-/<br/><br/>Todo esto que resumo en apenas dos frases queda bastante claro a lo largo del curso porque Udi dedica bastante tiempo a explicar que al reusar realmente incrementamos el acoplamiento mientras que lo que realmente buscamos cuando decimos que queremos reusar es reducir el esfuerzo  empleado al desarrollar las aplicaciones para nuestros clientes. Por ello explica que, aunque sea paradójico, aquellas piezas de código en las que empleamos mayor esfuerzo, y que por tanto serían las que más nos interesaría reusar, suelen ser aquellas que son más específicas y que son las más dificiles de reusar puesto que están fuertemente acopladas al negocio que resuelven. Y por otro lado, resulta que nos empeñamos en que todas nuestras aplicaciones compartan componentes y diseños poco acoplados al negocio (es decir, que no aportan valor de negocio por sí mismos) con el objetivo de que sean lo más reutilizables posible. Pero parece que nos olvidamos de que, hagamos lo que hagamos, en algún punto de nuestro código tendremos que acoplarnos al negocio puesto que para eso desarrollamos software: <u>para resolver problemas de negocio</u>.<br/><br/>Udi nos presenta los conocidos <a href='http://www.infoq.com/news/2007/08/MsSoaTenets' target='_blank'>cuatro principios de la orientación a servicios</a> (según Microsoft):<br/>
<ul>
<li>los servicios son autónomos</li>
<li>los límites son explícitos</li>
<li>los servicios comparten esquemas y contratos, no clases</li>
<li>la compatibilidad de un servicio se determina en base a una política</li>
</ul>
<p><br/>y se centra en la <b>autonomía </b>de los servicios. Nos explica cómo alcanzar esa autonomía de una manera genuína, llegando hasta el extremo de que cualquier servicio se pueda implementar con el diseño que se quiera y sin la obligación de compartir siquiera la misma base de datos. <br/><br/><br />
<blockquote>- ¡Eh! ¿Qué ha dicho? ¿Qué no se comparte la base de datos? <br/>- ¿Y qué pasa con las restricciones de integridad? ¿Qué hago con mis <i>foreign keys</i>? <br/></p></blockquote>
<p><br/>Muchos le preguntaron a Udi por esto. Je, je, yo ya sabía por dónde iba él porque esta discusión me la conozco de cuando estaba en <a href='http://jmbeas.blogspot.com/2008/02/gedos.html'>Degesys</a>, aunque allí no llegamos a ninguna conclusión (al menos mientras yo estuve). El caso es que la respuesta es bien fácil: las restricciones de integridad en la base de datos sólo sirven para acoplar servicios entre sí. Así que tú verás si quieres estar acoplado o no&#8230; <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Claro, para conseguir esta autonomía hay hacer concesiones:<br/>
<ul>
<li>no tenemos un único modelo de datos compartido por todos los servicios</li>
<li>no tendremos un estado coherente de los datos al que estamos acostumbrados</li>
<li>tendremos que asumir un cierto nivel de redundancia en nuestros datos almacenados</li>
</ul>
<p><br/>¿Cómo se consigue esto? Pues Udi lo resuelve de una manera muy sencilla a la vez que elegante:<br/>
<ul>
<li>los datos son &#8220;propiedad&#8221; de una única fuente autorizada, es decir, cada dato en la base de datos sólo es manipulado por un único servicio</li>
<li>los servicios interesados en algún dato se suscriben a los cambios que publicará su fuente autorizada y guardan una copia local del dato (a modo de caché)</li>
</ul>
<p><br/>Esto, si no estoy equivocado, se viene conociendo como <a href='http://en.wikipedia.org/wiki/Event_Driven_Architecture' target='_blank'>Event-Driven Architecture</a> (EDA).<br/><br/>Pero Udi no nos contó sólo que <a href='http://www.udidahan.com/2008/11/01/soa-eda-and-cep-a-winning-combo/' target='_blank'>la manera de implementar SOA es haciendo EDA</a>, sino que insistió en que un servicio debe ser concebido desde el negocio y que se implementa íntegramente desde la UI hasta la BD. Para ello nos explicó diferentes maneras de componer la UI, pero todas evitando el concepto de página monolítica. Y recalcó que no tenemos que tener una única capa técnica consistente, sino que podemos decidir usar diferentes soluciones técnicas para cada problema de negocio. Claro, lo difícil es que hay que acertar en definir los <a href='http://domaindrivendesign.org/discussion/messageboardarchive/BoundedContext.html' target='_blank'><i>&#8220;bounded contexts&#8221;</i></a>, y sólo podremos acertar si tenemos claro que éste no es un trabajo tecnológico sino de análisis del negocio. <br/><br/><br />
<blockquote>- ¡Vaya, claro, por eso hablan tanto del alineamiento de IT con el negocio cuando se hace SOA! <br/>- ¡Ahora lo entiendo!<br/>- ¡Y yo que pensaba que todo esto de SOA iba de reusar componentes tecnológicos y poner webservices por doquier!<br/></p></blockquote>
<p><br/>Si estáis interesados, otro día puedo recopilar más notas y recordar algunos de los ejemplos que usó Udi en el curso.<br/><br/>¡Ah! Y que no se me olvide. Gracias a <a href='http://www.hadihariri.com/' target='_blank'>Hadi</a> por el detalle que tuvo conmigo para <a href='http://www.agile-spain.com' target='_blank'>Agile Spain</a>. Lo dejo ahí porque si queréis enteraros tendréis que asistir a la charla que darán Juan, Agustín y Leo sobre <a href='http://jmbeas.blogspot.com/2009/04/charla-de-introduccion-scrum.html'>&#8220;Introducción a Scrum&#8221;</a>.<br/><br/><br/><br/>
<div class='zemanta-pixie'><img src='http://img.zemanta.com/pixy.gif?x-id=f8cc07d1-bf1a-851e-8a98-d5edabffb464' class='zemanta-pixie-img'/></div>
</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/04/16/soa-no-va-de-reusar/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Udi Dahan en Madrid</title>
		<link>http://blog.jmbeas.es/2009/03/29/udi-dahan-en-madrid/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=udi-dahan-en-madrid</link>
		<comments>http://blog.jmbeas.es/2009/03/29/udi-dahan-en-madrid/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 14:51:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[soa]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/udi-dahan-en-madrid/</guid>
		<description><![CDATA[Los que no conozcáis a Udi Dahan quizás tampoco os suene Domain Driven Design (DDD). Udi Dahan es un reconocido experto en SOA y que además participa activamente en la lista de DDD.El próximo 7 de abril va a impartir en las oficinas de Microsoft en Pozuelo (Madrid) un tutorial sobre SOA y DDD como [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Los que no conozcáis a <a href='http://www.udidahan.com/about/' target='_blank'>Udi Dahan</a> quizás tampoco os suene <a href='http://domaindrivendesign.org/books/index.html#DDD' target='_blank'>Domain Driven Design</a> (DDD). Udi Dahan es un reconocido experto en SOA y que además participa activamente en la <a href='http://tech.groups.yahoo.com/group/domaindrivendesign' target='_blank'>lista de DDD</a>.<br/><br/>El próximo 7 de abril va a impartir en las oficinas de Microsoft en Pozuelo (Madrid) un <a href='http://www.udidahan.com/2009/02/11/architecture-days-in-spain/' target='_blank'>tutorial sobre SOA y DDD</a> como parte de los <a href='http://apps.imeta.com/events/Home/EventDetails/1' target='_blank'>Architecture Days 2009</a> que organiza <a href='http://www.imeta.es/' target='_blank'>iMeta</a> (multinacional con sede en Málaga). Y aunque Udi está relacionado fundamentalmente con el mundo .NET, <a href='http://www.hadihariri.com' target='_blank'>Hadi Hariri</a> (uno de los organizadores del evento) me ha explicado que el tutorial es a nivel de diseño, por lo que no se entra en detalles específicos de ningún lenguaje o plataforma (léase .NET o Java).<br/><br/>Así que he decidido pegarle <b>otro</b> pellizco a mis deteriorados ahorros para escuchar lo que nos tiene que decir <a href='http://www.udidahan.com/' target='_blank'>&#8220;The Software Simplist&#8221;</a> (en inglés, ups).<br/><br/><br/>
<div class='zemanta-pixie'><img src='http://img.zemanta.com/pixy.gif?x-id=4f574d8f-dbdd-8095-a443-af6dad7ce44e' class='zemanta-pixie-img'/></div>
</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/03/29/udi-dahan-en-madrid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arquitectura en Capas de Cebolla</title>
		<link>http://blog.jmbeas.es/2009/01/14/arquitectura-en-capas-de-cebolla/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arquitectura-en-capas-de-cebolla</link>
		<comments>http://blog.jmbeas.es/2009/01/14/arquitectura-en-capas-de-cebolla/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 09:51:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/arquitectura-en-capas-de-cebolla/</guid>
		<description><![CDATA[Hay veces que se me hace un mundo el darle nombre a algunos conceptos cuyo nombre original es en inglés. Este es el caso de la &#8220;Onion Architecture&#8220;, cuya traducción literal sería &#8220;Arquitectura Cebollera&#8221;, lo cuál suena francamente mal, casi igual que &#8220;Arquitectura de cebolla&#8221;, que es como lo traduce Mario A. Chavez en la [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Hay veces que se me hace un mundo el darle nombre a algunos conceptos cuyo nombre original es en inglés. Este es el caso de la &#8220;<a href='http://jeffreypalermo.com/blog/the-onion-architecture-part-1/' target='_blank'>Onion Architecture</a>&#8220;, cuya traducción literal sería &#8220;Arquitectura Cebollera&#8221;, lo cuál suena francamente mal, casi igual que &#8220;Arquitectura de cebolla&#8221;, que es como lo traduce Mario A. Chavez en la <a href='http://mario-chavez.blogspot.com/2008/07/la-arquitectura-de-cebolla-parte-1.html' target='_blank'>traducción de este artículo</a> que hace en su blog. Yo, personalmente la llamaría &#8220;<b>Arquitectura en Capas de Cebolla</b>&#8220;, simplemente porque así me suena mejor.y, de paso, hacemos hincapié en que se trata de una arquitectura en capas (pero no una más).<br/><br/>
<div align='center'><img src='http://img.skitch.com/20080807-k1r6b5ctttxch1at1pessm8hn4.jpg' style='max-width: 800px;'/><br/></div>
<p><br/>Es bastante evidente el porqué de su nombre (incluso en español). <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <br/><br/>No voy a hacer un refrito del artículo original ni de su traducción, pero sí os diré dos cosas:<br/><br/>1) que me parece especialmente relevante el comentario en <a href='http://jeffreypalermo.com/blog/the-onion-architecture-part-3/' target='_blank'>la tercera parte del artículo</a> original (lo siento, sólo en inglés) sobre qué es lo que está en el &#8220;corazón&#8221; de la cebolla: el modelo de dominio y NO el modelo de datos,<br/>2) que he estado contrastando esta arquitectura (que no se queda en la mera representación visual de la misma) con <a href='http://dddsample.sourceforge.net/' target='_blank'>la aplicación de demostración de DDD</a> y, salvo algún detalle menor, encaja perfectamente y hace más fácil de entender el por qué de ciertas dependencias.<br/><br/>Como siempre, vuestros comentarios serán bienvenidos.<br/><br/></div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/01/14/arquitectura-en-capas-de-cebolla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Métodos estáticos y pruebas unitarias</title>
		<link>http://blog.jmbeas.es/2009/01/08/metodos-estaticos-y-pruebas-unitarias/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=metodos-estaticos-y-pruebas-unitarias</link>
		<comments>http://blog.jmbeas.es/2009/01/08/metodos-estaticos-y-pruebas-unitarias/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 00:38:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/metodos-estaticos-y-pruebas-unitarias/</guid>
		<description><![CDATA[El año pasado he comenzado el desarrollo de un plug-in para Concordion sin pruebas unitarias. &#8220;¡Vaya tío chungo!&#8221;, estaréis pensando ahora mismo. Bueno, en cierto modo tenéis razón. Pero tengo una buena excusa. El caso es que he copipegado código del ejemplo de editor multipáginas que viene con Eclipse y también del WicketBench (un plugin [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>El año pasado <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  he comenzado el desarrollo de un <a href='http://jmbeas.blogspot.com/2008/12/editor-para-concordion.html'>plug-in para Concordion</a> sin pruebas unitarias. <i>&#8220;¡Vaya tío chungo!&#8221;</i>, estaréis pensando ahora mismo. Bueno, en cierto modo tenéis razón. Pero tengo una buena excusa. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>El caso es que he copipegado código del ejemplo de editor multipáginas que viene con Eclipse y también del <a href='http://www.laughingpanda.org/mediawiki/index.php/Wicket_Bench' target='_blank'>WicketBench </a>(un plugin para trabajar con <a href='http://wicket.apache.org/' target='_blank'>Wicket </a>del que pretendo plagiar más de una idea). Y resulta que este código &#8220;heredado&#8221; hace un uso bastante prolijo de métodos estáticos para obtener información de contexto y, sobre todo, de la plataforma. Y me viene al pelo el <a href='http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/' target='_blank'>reciente artículo de Misko Hevery</a> donde explica por qué los métodos estáticos son tan malos para las pruebas y delatan diseños deficientes.</p>
<p>En resumen: no tengo pruebas unitarias de mi código porque no puedo sustituir las llamadas a métodos estáticos por ningún tipo de doble. Cualquier colaborador puedo sustituirlo más o menos fácilmente con un doble (p.ej. un mock), pero un método estático está pegado &#8220;a fuego&#8221; a una clase, y no puedo sustituir una clase por otra&#8230; <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Claro está que estoy cambiando el código para encapsular las llamadas a métodos estáticos en clases de colaboración que pueda sustituir en mis pruebas. Así acoto el problema, tal y como <a href='http://domaindrivendesign.org/books/index.html#DDD' target='_blank'>Eric Evans</a> aconseja al explicar el &#8220;anticorruption layer&#8221; (capa anticorrupción), y mejoro la facilidad para escribir pruebas para mi diseño y, por tanto, mejoro también mi diseño.</p>
</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/01/08/metodos-estaticos-y-pruebas-unitarias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La Gran Brecha de la Fatalidad</title>
		<link>http://blog.jmbeas.es/2008/12/05/la-gran-brecha-de-la-fatalidad/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=la-gran-brecha-de-la-fatalidad</link>
		<comments>http://blog.jmbeas.es/2008/12/05/la-gran-brecha-de-la-fatalidad/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 02:49:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/la-gran-brecha-de-la-fatalidad/</guid>
		<description><![CDATA[Acabo de verme enterita una presentación de Dan North y Martin Fowler en la QCon 2007 de Londres titulada &#8220;The Yawning Crevasse of Doom&#8221; (La Gran Brecha de la Fatalidad) donde hablan (durante 1 hora) sobre la necesidad de construir puentes de comunicación entre el negocio y la técnica. Llegué a ella a partir del [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Acabo de verme enterita una presentación de <a href='http://dannorth.net/'>Dan North</a> y <a href='http://martinfowler.com/'>Martin Fowler</a> en la <a href='http://qconlondon.com/london-2007/conference/'>QCon 2007</a> de Londres titulada &#8220;<a href='http://www.infoq.com/presentations/Fowler-North-Crevasse-of-Doom'>The Yawning Crevasse of Doom</a>&#8221; (La Gran Brecha de la Fatalidad) donde hablan (durante 1 hora) sobre la necesidad de construir puentes de comunicación entre el negocio y la técnica. Llegué a ella a partir del blog de <a href='http://www.acceptancetesting.info/resources/'>Gojko Adzic</a> (que está preparando un <a href='http://www.acceptancetesting.info/the-book/'>libro </a>sobre pruebas de aceptación ágiles) y de ella es posible obtener muy buenos argumentos y técnicas agilistas. Insisto: <b>muy recomendable</b>.</p>
<p>Durante 1 hora da para decir muchas cosas, pero yo me quedaría con lo siguiente:</p>
<p><big>Construir puentes</big><br />En vez de tener a los analistas yendo y viniendo entre los usuarios y los técnicos (la brecha), es mejor conseguir que la organización permita establecer puentes entre ambos mundos. Aquí insisten en la importancia vital de las conversaciones entre usuarios y técnicos porque ayudan a evitar trabajar en funcionalidades que no aportan valor de negocio y además permiten encontrar mejores soluciones que trabajando a través de intermediarios.</p>
<p><big>Fatalidad</big><br />Si creemos que no es posible construir esos puentes, estaremos de alguna manera influyendo en nuestro entorno para que la brecha se siga manteniendo e incluso se amplíe. Así se defienden unas partes de otras mediante contratos, documentos de requisitos, diagramas de arquitectura&#8230; En cambio, si la actitud es positiva, es posible colaborar en un entorno de confianza en la que incluso se pueda trabajar en construir un sistema sin conocer cómo será el &#8220;desplegable&#8221; final.</p>
<p><big>Lenguaje ubicuo</big><br />Para que todos dentro del equipo (gente de negocio y gente técnica) puedan entenderse es conveniente usar un lenguaje ubicuo (tal y como recomienda Eric Evans en su estupendo libro &#8220;<a href='http://domaindrivendesign.org/books/index.html#DDD'>Domain-Driven Design</a>&#8220;).<br />Sin embargo, el uso de un lenguaje común entre usuarios y técnicos que permita y/o facilite la comunicación entre ambas orillas no debe obligarnos a que este lenguaje sea &#8220;universal&#8221; para toda la empresa. Fowler dice explícitamente que es mejor un conjunto de &#8220;modelos locales&#8221; (más manejables y comprensibles y menos abstractos) y un mecanismo de mapeo entre ellos.</p>
<p><big>Construir juntos</big><br />Técnicas como construir juntos &#8220;Prototipos de baja fidelidad&#8221; (ya sabéis, &#8220;<a href='http://www.paperprototyping.com/'>paper prototyping</a>&#8221; con Post-Its, etc), &#8220;Storyboards&#8221; (como los que se usan para las películas de cine),&#8230; ayudan a construir esos puentes.</p>
<p><big>Hecho</big><br />Para especificar qué entienden los usuarios y los técnicos por &#8220;tarea completada&#8221; es conveniente utilizar ejemplos, idealmente que se puedan comprobar automáticamente. (Es lo que se conoce como pruebas de aceptación ejecutables).</p>
<p><big>Suficiente</big><br />Otro término muy relacionado con &#8220;hecho&#8221; es &#8220;suficiente&#8221;. Se trata de conocer lo suficiente para avanzar hasta el siguiente paso. Para ello es necesario asumir que las prioridades están en constante cambio durante la construcción del proyecto.</p>
<p><big>Productividad</big><br />Un detalle, ¿sabíais que sólo el 15% aprox del coste total del software corresponde a la programación?<br />Es muy importante trabajar continuamente en encontrar todas las oportunidades posibles que nos permitan recoger reacciones (feedback) de todos los miembros del equipo y conocer aquellos factores puedan afectar al estado de ánimo del equipo puesto que éste es un aspecto psicológico que afecta significativamente a la comunicación y, por tanto, a la productividad.</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2008/12/05/la-gran-brecha-de-la-fatalidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

