tag:blogger.com,1999:blog-74702339622307183242024-03-13T09:09:28.303-07:00@GabrielMorrisSEste es un blog dedicado a prácticas ágiles, diseño de software, facilitación gráfica y arquitecturas ágiles.@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-7470233962230718324.post-56264963137759312662022-02-06T13:36:00.001-08:002022-02-07T01:56:48.829-08:00Framework para ser un buen papá<p>Hoy mi hijo Samuel me preguntó ¿qué se necesita para ser un buen papá?. A partir de esto escribí este framework:</p><p>Paso a paso por GMorris para ser un buen papá Espero les sirva algún tip.</p><p>1) Autoridad: porque se enseña y se da ejemplo con el ejemplo</p><p>2) Límites y contención: no todo se puede hacer; se enseñan reglas para que siempre exista cosquillitas por lo que no se tiene aunque los papás puedan brindar todo. Ejemplo: A un bebé e incluso un niño hasta los 8 años no se le pregunta que quiere, se le da lo que los papás en su experiencia consideran que se les deba dar siempre inspirándose en lo que el espíritu señala.</p><p>No se les pregunta que quieren de comer; se les orienta lo que van a comer y se les explica el porqué de los beneficios.</p><p>3) Sensibilidad con misericordia: no se trata de ser solidario sino de enseñar el dolor ajeno como propio para conmoverse en las entrañas y ayudar con propósito.</p><p>4) Trabajo como medida para alcanzar muchas cosas: enseñar que todo se logra con un esfuerzo profundo en donde cada gota de sudor tiene valía. Ejemplo: la educación que recibe nuestros hijos no debe verse como una obligación o un deber, sino como un esfuerzo de amor de los padres para que nuestros hijos conozcan su microcosmos y el universo entero.</p><p>5) Enseñar a soñar: enseñar que se permite soñar, ilusionarse y verse en un estado aspiracional. No cortar las alas sino enseñar a volar; ojalá sin impedir que otros puedan volar.</p><p>6) Retroalimentación continua: aprender que la vida gira y todos pueden aportar algo dentro de mi, debieramos pedir feedback todo el tiempo; abrazar el error como medida de superación y aprendizaje.</p><p>7) Lo más importante: el amor. Enseñar que el amor es dar sin pedir nada a cambio, hasta la propia vida donde nosotros como seres humanos nos re inventamos para satisfacer y agradar a esas personas que nos piden un cambio.</p>@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com0tag:blogger.com,1999:blog-7470233962230718324.post-59369238342172042172020-03-21T11:44:00.009-07:002023-07-12T13:23:45.885-07:00Cultura Devops - No hablemos de mejores prácticas o herramientas, preguntémonos cuál es nuestro tiempo de entrega de valor<div style="color: #172b4d; letter-spacing: -0.01em; line-height: 1.166; margin: 0px; overflow-wrap: break-word; padding: 0px; text-align: justify;">
<div style="text-align: justify;">
<div style="color: black; letter-spacing: normal; text-align: start;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: start;">
Hoy en día se habla en muchos lugares de devops. Realmente parece un término de moda y se discute sobre qué herramientas utilizar, mejores prácticas, entre otros, pero en muchas ocasiones no se habla del por qué es clave implementarla. Esto, ocasiona que se escojan plataformas y se implementen automatizaciones sin tener en cuenta cuál es la razón de fondo para involucrarse; ¿qué ganaremos? ¿cuál es la meta? ¿qué desperdicios atacaremos?, entre otros.</div>
<div class="p2" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; min-height: 14px; text-align: start;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: start;">
Esta entrada busca enfocar a los interesados respecto a la adopción de una cultura devops en una organización, proyecto o una iniciativa que genere un producto de software.<br />
<br /></div>
<a name='more'></a></div>
</div>
</div>
<div>
<div style="color: #172b4d; letter-spacing: -0.16px; text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; letter-spacing: normal; line-height: normal; text-align: start;">
Ya entrando en detalles, DevOps es un acrónimo inglés de development (desarrollo) y operations (operaciones), que se refiere a la implementación de una cultura de generación de valor mediante la construcción de software que se centra en la comunicación, colaboración e integración entre desarrolladores, áreas de negocio, testers, seguridad, y los profesionales de sistemas en las tecnologías de la información (IT).</div>
<div class="p2" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; letter-spacing: normal; line-height: normal; min-height: 14px;">
<br /></div>
<div class="p3" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; letter-spacing: normal; line-height: normal; text-align: start;">
DevOps es una respuesta a la interdependencia del desarrollo de software y las operaciones IT. Su objetivo es ayudar a una organización a producir productos y servicios de software más rápidamente, de mejor calidad y a un coste menor.</div>
<div class="p2" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; letter-spacing: normal; line-height: normal; min-height: 14px;">
<br /></div>
<div class="p3" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; letter-spacing: normal; line-height: normal; text-align: start;">
La implementación de una cultura Devops busca eliminar peajes, o más bien acelerar su pago evitando desperdicios, que para este caso se traducen en pérdida de tiempo. Esto, teniendo en cuenta que cualquier entrega de valor implica un viaje desde que nace un producto o una funcionalidad hasta que finalmente se entrega y se opera brindándosela finalmente a nuestros Clientes.</div></div><br /><div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><div class="separator" style="clear: both; text-align: center;"><a href="https://lh3.googleusercontent.com/-s1swAA2HFjU/YS0NZwbWNUI/AAAAAAAAJX0/5ViOEX1e0igAenpUYyaMtOCf2K8GnGS8wCLcBGAsYHQ/BdB-Devops-peajes.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="244" data-original-width="1291" height="122" src="https://lh3.googleusercontent.com/-s1swAA2HFjU/YS0NZwbWNUI/AAAAAAAAJX0/5ViOEX1e0igAenpUYyaMtOCf2K8GnGS8wCLcBGAsYHQ/w640-h122/BdB-Devops-peajes.jpg" width="640" /></a></div><br /><br /></div><div style="text-align: justify;">Como se aprecia en la anterior figura, en una entrega de valor de un producto de software intervienen diferentes equipos. Cada equipo implementa actividades de definición, diseño, implementación, verificación, despliegue, pruebas, aseguramiento y operación. El ejemplo en un modelo de peajes busca reproducir lo que cada uno de nosotros sentimos cuando estamos haciendo fila para pagarlo. Esto, sin duda alguna es un desperdicio del tiempo; ¿cuanto tiempo perdemos en estas actividades al año?</div>
</div>
<br />
<strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; text-align: center; white-space: pre-wrap;"><span style="color: #ff5630;">¿SABEMOS CUÁLES SON NUESTROS DESPERDICIOS EN NUESTRA ENTREGA DE VALOR CONTINUA A NUESTROS CLIENTES?</span></strong><br />
<span style="background-color: white; color: #172b4d; letter-spacing: -0.005em; text-align: justify; white-space: pre-wrap;"><br /></span>
<br />
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
<div style="text-align: justify;">
Imaginen el siguiente escenario en el cual los peajes manuales se cambian por Telepeajes. En este caso, se reduce el tiempo de viaje en la creación de un producto o una funcionalidad automatizando los cobros por cada equipo que interviene en la entrega de valor, evitando los tiempos de espera que finalmente se traduce en reducción de desperdicios.</div>
</div>
<br />
<div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjJRpXVGvPiIqsa5BL9QRTosGwbhxqSxLjPPKVT63mz8qq-emCmDxAbPiTbY0B2l4Ix72HYhDivW5KYaibPeMxD6k3GU2UK2AHJmNdhAkcaBcao-amVZepL70-L-Sezg1W4LvztU5NY1QgHx6M9za535B8Nipdb1Ey3_wT-l0DbQLfr0SFw4-eYitBzHCM" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="687" data-original-width="1317" height="337" src="https://blogger.googleusercontent.com/img/a/AVvXsEjJRpXVGvPiIqsa5BL9QRTosGwbhxqSxLjPPKVT63mz8qq-emCmDxAbPiTbY0B2l4Ix72HYhDivW5KYaibPeMxD6k3GU2UK2AHJmNdhAkcaBcao-amVZepL70-L-Sezg1W4LvztU5NY1QgHx6M9za535B8Nipdb1Ey3_wT-l0DbQLfr0SFw4-eYitBzHCM=w645-h337" width="645" /></a></div><div style="text-align: justify;"><br /></div><span style="color: #454545; font-family: "helvetica neue"; font-size: 12px; text-align: justify;"><div style="text-align: justify;">Lo anterior se logra implementando flujos automatizados de verificación en cada peaje. Esto se hace en la práctica con la construcción de pipelines en herramientas para lanzar dichas verificaciones una vez se aprueba un cambio en un componente de software.</div></span></div></div></div>
<div class="p2" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; min-height: 14px; text-align: justify;">
<br /></div>
<div class="p3" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: justify;">
En los ciclos de entregas de valor se desarrollan prácticas de integración continua y entregas continuas en<span class="Apple-converted-space"> </span>diversas plataformas (GitHub Actions, Bamboo, Travis, CircleCi, Jenkins, etc). En estas herramientas cada paso se define y enlaza los diferentes artefactos de cada peaje de acuerdo al área de interés (desarrollo, qa, despliegue, seguridad, etc.).</div>
<div class="p3" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: justify;">
<br /></div>
<div class="p3" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: justify;">
Para llegar a identificar cómo disminuir los desperdicios para automatizar lo que más genere valor se implementan diferentes técnicas. Una de ellas es la de <a href="https://en.wikipedia.org/wiki/Value-stream_mapping"><span class="s1" style="color: #e4af0a;">Value Stream Mapping</span></a> que hace parte del marco Lean del modelo Toyota de mejora continua, en donde se identifican tiempos muertos que no aportan ningún valor al flujo y a partir de esto se prioriza dónde realizar automatizaciones que reduzcan estos desperdicios.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://1.bp.blogspot.com/-xkgXSWBzGlg/XnZZ6jnflXI/AAAAAAAAJEM/ZVjpTq9uy7E_0JXQ1T-TZy1xQaKW4C-YgCLcBGAsYHQ/s1600/devops3.jpeg" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="687" data-original-width="1000" height="438" src="https://1.bp.blogspot.com/-xkgXSWBzGlg/XnZZ6jnflXI/AAAAAAAAJEM/ZVjpTq9uy7E_0JXQ1T-TZy1xQaKW4C-YgCLcBGAsYHQ/s640/devops3.jpeg" width="640" /></a></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
Algo práctico al identificar desperdicios es iniciar por el tiempo total desde que una funcionalidad (feature) es definida, diseñada, implementada, probada, asegurada y desplegada en un entorno productivo. La idea es encontrar los puntos donde más se tardan las actividades y se genera desperdicio; seguramente allí es donde hay que intervenir para mejora el ciclo de entrega de valor.</div>
<div class="p2" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; min-height: 14px;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
En las implementaciones clásicas de entrega de valor de desarrollo de software, se elaboran requisitos de parte de áreas de negocio. Esto, se hace con definiciones formales, que luego de ser diseñados (por lo general por áreas de arquitecturas de solución) y revisados por analistas de negocio se entregan a equipos de desarrollo.</div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
Una de las maneras de reducir desperdicios en la interacción con equipos de negocio es quizás la que hoy en día se hace con la implementación de marcos de metodología como Scrum, Crystal, Kanban, entre otros, en donde el negocio mismo está integrado con el equipo de desarrollo en un mismo lugar (célula, squad, equipo, etc), reduciendo desperdicios al tener una interacción directa (face 2 face), mejorando la comunicación y comprensión de la visión de producto o funcionalidad. Esto, también genera espacios de co creación con los miembros del equipo.</div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
Quizás las técnicas más conocidas para equipos de negocio que se integran con equipos de desarrollos incluyen la implementación de incepciones, historias de usuario, criterios de aceptación, planificaciones ágiles, planning poker, entre otros para crear una línea clara de interacción entre dueños de producto y el equipo que construye la solución de software.</div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
Los precursores de la agilidad en la implementación de software se remontan al año 2001, cuando se reunieron para compartir experiencias respecto a las buenas prácticas para construir software, creando el <a href="https://agilemanifesto.org/"><span class="s1" style="color: #e4af0a;">manifiesto ágil</span></a> que hoy en día es ampliamente conocido. Sin embargo, para aquella época ya se conocía <a href="http://www.extremeprogramming.org/"><span class="s1" style="color: #e4af0a;">extreme programming</span></a> una metodología que tuvo gran aceptación entre muchos desarrolladores de software, con un conjunto de prácticas como se aprecia en la siguiente figura.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://1.bp.blogspot.com/-8MMm5DXoK9E/XnZaUGzgyFI/AAAAAAAAJEQ/HcwJwyxl0OI-kjvUr0w1CLjaffArV7QnwCLcBGAsYHQ/s1600/devops4.png" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="500" data-original-width="1600" height="198" src="https://1.bp.blogspot.com/-8MMm5DXoK9E/XnZaUGzgyFI/AAAAAAAAJEQ/HcwJwyxl0OI-kjvUr0w1CLjaffArV7QnwCLcBGAsYHQ/s640/devops4.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
<span class="s1" style="color: #e4af0a; text-decoration-line: underline;"><a href="https://es.wikipedia.org/wiki/Programaci%C3%B3n_extrema">Extreme programming</a></span> creo un marco de prácticas que se conocen hoy en día en la mayoría de los proyectos de desarrollo de software. Muchas de estas se utilizan en los equipos que implementan una solución de software.</div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
Quizás una de las prácticas más relevantes que introdujo extreme programming fue la de <a href="https://martinfowler.com/articles/continuousIntegration.html"><span class="s1" style="color: #e4af0a;">integración continua CI</span></a>, porque permitió construir flujos automatizados que integran el código de uno o varios desarrolladores en un repositorio de código (controlador de versiones), pudiendo así detectar fallos cuanto antes. Se entiende por CI la compilación y ejecución de pruebas de todo un proyecto una vez un desarrollador introduce un cambio; este se envía al repositorio de código que lanza las validaciones automáticas una vez se integra el código.</div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
El proceso de CI se realiza cada cierto tiempo (horas), descargarse las fuentes desde el control de versiones. Si las pruebas fueron exitosas se permitirá la mezcla del código o en caso contrario se rechazará informando al desarrollador.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://1.bp.blogspot.com/-A8MhDiFt3fw/XnZajRtv-9I/AAAAAAAAJEU/odq12FyGOwAQ3fVeqdSV7fQjh45-rSRAACLcBGAsYHQ/s1600/devops5.jpg" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="161" data-original-width="858" height="120" src="https://1.bp.blogspot.com/-A8MhDiFt3fw/XnZajRtv-9I/AAAAAAAAJEU/odq12FyGOwAQ3fVeqdSV7fQjh45-rSRAACLcBGAsYHQ/s640/devops5.jpg" width="640" /></a></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: start;">
Es clave para automatizar el peaje de generación de componentes de software que el equipo de desarrollo automatice las pruebas de unidad en alguna tecnología (Node Js, Java, Scala, Phyton, Angular, React, etc.), implementaciones de verificación de calidad de código (cobertura de pruebas, código redundante, complejidad y smells, entre otros) con Sonar por ejemplo, incluyendo todos éstos pasos en el pipeline de ejecución.</div>
</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<a href="https://1.bp.blogspot.com/-XXgd-EvVtM4/XnZaz-wjfmI/AAAAAAAAJEY/-1a9KsEL0zMbxefF6Ee-PvhWkhFBwH9twCLcBGAsYHQ/s1600/devops6.jpg" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="275" data-original-width="601" height="182" src="https://1.bp.blogspot.com/-XXgd-EvVtM4/XnZaz-wjfmI/AAAAAAAAJEY/-1a9KsEL0zMbxefF6Ee-PvhWkhFBwH9twCLcBGAsYHQ/s400/devops6.jpg" width="400" /></a></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: start;">
Éstas prácticas permiten automatizar el desarrollo de software reduciendo desperdicios en el ciclo de implementación. Adicional a esto, se implementan prácticas relacionadas con calidad de código que hoy son ampliamente difundidas: TDD, refactorización, integración continua, cobertura de pruebas unitarias, estandarización de código entre otras.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://1.bp.blogspot.com/-2PsL9B4QNtU/XnZbD1ePOGI/AAAAAAAAJEc/1Y2Od6POcRsRrAAouY5TtrPw_AXVr1m6ACLcBGAsYHQ/s1600/devops7.jpg" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="275" data-original-width="593" height="185" src="https://1.bp.blogspot.com/-2PsL9B4QNtU/XnZbD1ePOGI/AAAAAAAAJEc/1Y2Od6POcRsRrAAouY5TtrPw_AXVr1m6ACLcBGAsYHQ/s400/devops7.jpg" width="400" /></a></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: start;">
El caso del peaje de pruebas quizás es uno de los puntos más relevantes en la reducción de desperdicio de las entregas de valor. Es clave implementar pruebas funcionales e2e, pruebas de regresión, APIs, y de integración. En muchos equipos de desarrollo se ha avanzado muchísimo en la implementación de éstas pruebas, pero aún existe un peaje allí, al no tener las pruebas funcionales y de regresión como mínimo integradas al pipeline verificando de manera automatizada cada promoción de código.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://1.bp.blogspot.com/-rw3ftmijvY4/XnZbVHccQWI/AAAAAAAAJEg/f05cRYUkFhIRwz6xCLCM4REeEaL-BM97gCLcBGAsYHQ/s1600/devops8.jpg" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="511" data-original-width="1158" height="282" src="https://1.bp.blogspot.com/-rw3ftmijvY4/XnZbVHccQWI/AAAAAAAAJEg/f05cRYUkFhIRwz6xCLCM4REeEaL-BM97gCLcBGAsYHQ/s640/devops8.jpg" width="640" /></a></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: start;">
Si se logra automatizar las pruebas incluyéndolas en nuestro pipeline podremos eliminar el peaje manual que nos impide poder implementar integración continua. Una vez tengamos las pruebas incluidas en el pipeline podremos llegar a la implementación de entregas continuas.</div>
</div>
<div style="text-align: justify;">
<strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; text-align: center; white-space: pre-wrap;"><span style="color: #ff5630;"><br /></span></strong></div>
<div style="text-align: justify;">
<strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; text-align: center; white-space: pre-wrap;"><span style="color: #ff5630;">¿TU PRODUCTO DE SOFTWARE TIENE INTEGRACIÓN CONTINUA, ENTREGAS CONTINUAS O DESPLIEGUE CONTINUO?</span></strong></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
Para llegar al nivel de despliegue continuo es necesario incluir las pruebas de seguridad como parte de la automatización de nuestros peajes. Allí, es clave verificar el código garantizando que se cumpla con prácticas de desarrollo seguro (Ej. <a href="https://owasp.org/"><span class="s1" style="color: #e4af0a;">OWASP</span></a>), pruebas de controles y lineamientos de seguridad establecidos.<br />
<div data-pm-slice="1 1 []">
La automatización de las verificaciones de seguridad hoy en día se hace a través de prácticas DevSecOps implicando pensar desde el principio en la seguridad de las aplicaciones y de la infraestructura. </div>
</div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
Finalmente, una vez se aceleré la entrega de valor mediante la automatización entra en acción el equipo de operaciones. No todo termina allí, porque también es necesario que se implementen peajes automatizados que permitan monitorear la infraestructura, la operación y los resultados de negocio a través de herramientas que habiliten dashboards y alertas que faciliten la intervención de un equipo de soporte.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://1.bp.blogspot.com/-62ykZ8GyogA/XnZboBKaZjI/AAAAAAAAJEw/PkVGN0zrJEYmjoE9M8-3vDaBY9NTZDX1gCLcBGAsYHQ/s1600/devops9.jpg" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="275" data-original-width="1003" height="172" src="https://1.bp.blogspot.com/-62ykZ8GyogA/XnZboBKaZjI/AAAAAAAAJEw/PkVGN0zrJEYmjoE9M8-3vDaBY9NTZDX1gCLcBGAsYHQ/s640/devops9.jpg" width="640" /></a></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
No todo termina allí, porque la automatización del ciclo de entrega de valor también requiere que el aprovisionamiento de infraestructura no tenga peajes manuales. Para ello es clave la implementación de prácticas de <a href="https://en.wikipedia.org/wiki/Infrastructure_as_code"><span class="s1" style="color: #e4af0a;">infraestructura como código IaC</span></a> brindando velocidad a los equipos de trabajo al controlar todos los artefactos que requiera una solución de software.</div>
<div class="p2" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; min-height: 14px;">
<br /></div>
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;">
La IaC permite promover el código entre diferentes entornos a través de ciclos de aprobación en la plataforma de control de código (ej. Git) entre los roles involucrados, brindando autonomía a los equipos de desarrollo que participen en la entrega de valor. La promoción del código de IaC se verifica en la plataforma de control de código lanzando el pipeline generando los artefactos en el entorno como se muestra en la siguiente figura.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="https://1.bp.blogspot.com/-57PRmXdVgYk/XnZb4DPFskI/AAAAAAAAJE0/6Gmujzj2w6g1QrTKV_8VCoU4fIxvs_I0ACLcBGAsYHQ/s1600/devops10.jpg" style="background-color: white; font-size: 14px; letter-spacing: -0.005em; margin-left: 1em; margin-right: 1em; text-align: center; white-space: pre-wrap;"><img border="0" data-original-height="231" data-original-width="526" height="175" src="https://1.bp.blogspot.com/-57PRmXdVgYk/XnZb4DPFskI/AAAAAAAAJE0/6Gmujzj2w6g1QrTKV_8VCoU4fIxvs_I0ACLcBGAsYHQ/s400/devops10.jpg" width="400" /></a></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<div class="p1" style="color: #454545; font-family: "Helvetica Neue"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; text-align: start;">
Este enfoque hace que el equipo de desarrollo de un producto de software sea dueño de su infraestructura apoyándose por equipos de automatización que apoyan la cultura devops permitiendo que las entregas de valor se agilicen mucho más.</div>
</div>
<div style="text-align: justify;">
<strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; text-align: center; white-space: pre-wrap;"><span style="color: #ff5630;"><br /></span></strong></div>
<div style="text-align: justify;">
<strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; text-align: center; white-space: pre-wrap;"><span style="color: #ff5630;">¿TU EQUIPO DE DESARROLLO ES AUTÓNOMO EN EL APROVISIONAMIENTO DE INFRAESTRUCTURA?</span></strong><br />
<strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; text-align: center; white-space: pre-wrap;"><span style="color: #ff5630;"><br /></span></strong>
<strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; text-align: center; white-space: pre-wrap;"><span style="color: #ff5630;"><a href="http://3.bp.blogspot.com/-hVfaSyh6tTQ/XqrhpkTcV3I/AAAAAAAAJIE/x_GYSPBm9IIEI1aNqiTw52tM9i7x7G_tACK4BGAYYCw/s1600/autopista.png"><img border="0" height="128" src="https://3.bp.blogspot.com/-hVfaSyh6tTQ/XqrhpkTcV3I/AAAAAAAAJIE/x_GYSPBm9IIEI1aNqiTw52tM9i7x7G_tACK4BGAYYCw/s640/autopista.png" width="640" /></a></span></strong><br />
<span style="color: #454545; font-family: "helvetica neue"; font-size: 12px;"><br /></span>
<span style="color: #454545; font-family: "helvetica neue"; font-size: 12px;">La infraestructura como código permite que un equipo de implementación ágil sea dueño de su plataforma de ejecución. Si tenemos el control de nuestra infraestructura podremos automatizar su aprovisionamiento y </span><strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><span style="color: #ff5630;">CREAR LA AUTOPISTA QUE ACELERE NUESTRA ENTREGA DE VALOR</span></strong></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><br /></span></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><span style="background-color: transparent; color: #454545; font-family: "helvetica neue"; font-size: 12px;">En conclusión, la cultura devops pretende automatizar los mencionados peajes para que la interacción de las actividades se ejecuten pero no detengan las entregas ocasionando desperdicios. Con estas implementaciones los equipos realmente pueden tener autonomía en los despliegues continuos mejorando su velocidad:</span> </span><strong style="background-color: white; color: #172b4d; font-size: 14px; letter-spacing: -0.005em; white-space: pre-wrap;"><span style="color: #ff5630;">EQUIPOS MÁS PRODUCTIVOS</span></strong></div>
</div><div class="separator" style="clear: both; text-align: center;"><br /></div><br />
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com2tag:blogger.com,1999:blog-7470233962230718324.post-6138186774505605772018-03-20T11:51:00.000-07:002018-05-02T11:06:27.835-07:00Iterativo e incremental vs evolutivo<div class="separator" style="clear: both; text-align: left;">
<i>El sueño de adquirir una vivienda.</i></div>
<br />
<div style="text-align: justify;">
Esta entrada la tengo pendiente desde hace mucho tiempo, años. Trata de un tema clave en la adopción de la mentalidad ágil (<a href="http://www.agile-scrum.be/agile-software-development/agile-mindset/" target="_blank">agile mindset</a>) relacionada a la visión de la construcción de un producto y de las entregas de valor constante al Cliente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pareciera el tema simple y trivial, pero no lo es tanto, y es un verdadero desafío en la construcción de productos con un enfoque ágil, porque muchos equipos de trabajo que he conocido no lo tienen claro. ¿Cómo inicio la construcción? ¿qué entrego primero? ¿cómo se proporciona valor al Cliente? ¿iterativo e incremental o evolutivo, es lo mismo? ¿un arquitectura evolutiva?<br />
<br />
En la actualidad, se habla de escalamiento de Organizaciones ágiles, de estandarización de prácticas, entre otros temas. Sin embargo, las inquietudes propuestas en este post, no son comprendidas realmente por muchos equipos que tienen a su cargo la construcción de productos bajo un enfoque ágil desde mi punto de vista</div>
<br />
<a href="https://www.blogger.com/null" name="more"></a><br />
<div style="text-align: justify;">
Cuando un equipo de un producto inicia una aventura ágil por lo general se centra en entregas rápidas que muestren el avance en su construcción. Sin embargo, esto no quiere decir que esto sea propiamente ágil, y desde hace muchos años a este modelo se le ha llamado iterativo e incremental.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Desde el nacimiento de <a href="https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=17&cad=rja&uact=8&ved=0ahUKEwj0qK-o5vvZAhUwq1kKHTsCDRwQFgjBATAQ&url=https%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Frational%2Flibrary%2Fcontent%2F03July%2F1000%2F1251%2F1251_bestpractices_TP026B.pdf&usg=AOvVaw31XnJgEn4m36LUvIAD1Qtk" target="_blank">RUP</a> en el año 1996, se propuso un proceso que se fundamenta en ciclos iterativos con incrementos de producto, gestión de requisitos basados en casos de uso y una arquitectura basada en componentes. RUP es <span style="font-family: sans-serif;">quizás el proceso en cascada más conocido en procesos de desarrollo.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los ciclos iterativos con incrementos de producto consisten en entregas de funcionalidad que permitan al equipo de trabajo acercarse a la meta del proyecto. No en todos los casos implica un producto terminado, y en la mayoría de ocasiones se implementan piezas separadas en componentes que luego se ensamblan para terminar un componente completo que hace parte de la realización de una funcionalidad (<a href="https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjx_8P_6_vZAhWNm1kKHcEuC_8QFggtMAE&url=http%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Frational%2Flibrary%2Fcontent%2FRationalEdge%2Fmay02%2Fm_chapter4_jr.pdf&usg=AOvVaw1h1cFQg0stKD_7JM48YmSu" target="_blank">caso de uso</a>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un enfoque iterativo e incremental planteado en un ejemplo sencillo, es la construcción de un vehículo de combustión para un Cliente. En donde, una iteración puede ser definida en la construcción del chasis y el motor en paralelo, y al finalizar el ciclo se terminarán los componentes, sin embargo, el Cliente no podrá disfrutar del vehículo, pero si estará informado del avance del proyecto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Entonces, ¿cuál es en verdad un enfoque ágil?, para explicarlo desde un punto de vista simple, vamos a desarrollar un ejercicio que lo llamo "<i>la casa de mis sueños</i>".</div>
<br />
<span style="font-size: large;"><b>La casa de mis sueños</b></span><br />
<span style="font-size: large;"><b><br /></b></span>
<span style="text-align: justify;">Juan, tiene la intensión de comprar la casa de sus sueños (</span><span style="text-align: justify;"><i>Supongamos que la casa de los sueños de Juan es la de Homer Simpson :)</i></span><span style="text-align: justify;">). Quiere que se cristalice su sueño y habitar su casa cuanto antes.</span><br />
<div style="text-align: center;">
<a href="http://1.bp.blogspot.com/-A2BDzC6XAts/WrFZBOzZ6xI/AAAAAAAAIis/jFhy6gfY4i0k6ct1Kbik-6P4tNRooo6GACK4BGAYYCw/s1600/simpson.jpg" imageanchor="1"><img border="0" height="183" src="https://1.bp.blogspot.com/-A2BDzC6XAts/WrFZBOzZ6xI/AAAAAAAAIis/jFhy6gfY4i0k6ct1Kbik-6P4tNRooo6GACK4BGAYYCw/s320/simpson.jpg" width="320" /></a></div>
<div style="text-align: left;">
<span style="text-align: justify;">Juan, tiene un sueño, y para cumplirlo quiere que una </span>constructora le construya su casa. Para ello se pone en contacto con una empresa que implementa proyectos de construcción tradicional, que capturará su necesidad, y luego le presentará un cronograma, un presupuesto y unos planos, entre otros elementos.</div>
<br />
<div style="text-align: center;">
<a href="http://3.bp.blogspot.com/-RWw6Zhuk90o/WrFYOWFu2KI/AAAAAAAAIhc/yqEZTFzCA10Yl5_q_N6gCIjTZQfdRQC9ACK4BGAYYCw/s1600/1-compra.jpg" imageanchor="1"><img border="0" height="320" src="https://3.bp.blogspot.com/-RWw6Zhuk90o/WrFYOWFu2KI/AAAAAAAAIhc/yqEZTFzCA10Yl5_q_N6gCIjTZQfdRQC9ACK4BGAYYCw/s320/1-compra.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<div style="text-align: justify;">
En el proceso de ingeniería tradicional el Cliente tiene claro que debe aportar el dinero para financiar el proyecto, pero no verá su proyecto útil hasta su finalización. Es decir, obtendrá valor real, solo hasta que finalice la construcción de su casa, entendiendo este como la medida de avance principal que le producirá la verdadera necesidad que desea suplir: <i>habitar la casa de sus sueños</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En proyectos con economía de escala, para el Cliente será aún más complejo el proceso porque obtendrá un resultado final en el cual es posible que no comparta sus resultados y quiera algo de personalización que implicará un re trabajo y la generación de desperdicios indeseados.</div>
<br />
En el modelo clásico siguiendo la mentalidad tradicional se llevarán a cabo una serie de etapas, o iteraciones en las cuales se construirán los componentes, o partes claves de la casa. En la siguiente figura se aprecian las fases a seguir en la construcción de la casa de los sueños de Juan siguiendo el modelo tradicional de construcción de vivienda.<br />
<br />
<b><span style="font-size: x-small;">Nota. </span></b><i><span style="font-size: x-small;">No soy un experto en construcción de vivienda, pero este ejemplo me sirve para mostrar el enfoque evolutivo de la mentalidad ágil. Mil disculpas a los constructores de edificaciones, tomo como referencia las actividades de mi suegro</span>.</i></div>
<div style="text-align: center;">
<a href="http://4.bp.blogspot.com/-dHucQq8OyjA/WrFYUw7te2I/AAAAAAAAIhk/TRbuJvB4p2YaCTn5tuziJ4nW0wxiSwAfwCK4BGAYYCw/s1600/2-waterfall.jpg" imageanchor="1"><img border="0" height="263" src="https://4.bp.blogspot.com/-dHucQq8OyjA/WrFYUw7te2I/AAAAAAAAIhk/TRbuJvB4p2YaCTn5tuziJ4nW0wxiSwAfwCK4BGAYYCw/s320/2-waterfall.jpg" width="320" /></a></div>
<div style="text-align: justify;">
Note, que el valor que recibirá Juan solo se obtendrá una vez se finalice el proyecto y se concluyan los acabados finales. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: center;">
<a href="http://4.bp.blogspot.com/-JDsI-Wph5x0/WrFYaA8cfQI/AAAAAAAAIhs/LYuqxhH2dacIVzygBkw6nbL-guzzDumeQCK4BGAYYCw/s1600/3-estructura.jpg" imageanchor="1"><img border="0" height="258" src="https://4.bp.blogspot.com/-JDsI-Wph5x0/WrFYaA8cfQI/AAAAAAAAIhs/LYuqxhH2dacIVzygBkw6nbL-guzzDumeQCK4BGAYYCw/s320/3-estructura.jpg" width="320" /></a></div>
<div style="text-align: center;">
<div style="text-align: justify;">
Si Juan visita la obra de su casa encontrará algo como lo que se muestra en la anterior imagen, en donde, podrá observar las vigas de su casa, pero no logrará vivir allí todavía.</div>
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="http://4.bp.blogspot.com/-zR8-AKMxjIM/WrFYgEvU42I/AAAAAAAAIh0/GTSqDpO0GyUNqmPQ5e4-q78fP0mldOnXQCK4BGAYYCw/s1600/4-planchas.jpg" imageanchor="1"><img border="0" height="273" src="https://4.bp.blogspot.com/-zR8-AKMxjIM/WrFYgEvU42I/AAAAAAAAIh0/GTSqDpO0GyUNqmPQ5e4-q78fP0mldOnXQCK4BGAYYCw/s320/4-planchas.jpg" width="320" /></a></div>
<div style="text-align: center;">
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si Juan visita la obra otro día, podrá ver algo como lo que aparece en la siguiente imágen. Sin embargo, es posible que entre en una etapa de incertidumbre o de impaciencia, pues no podrá todavía disfrutar de la casa de sus sueños.</div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-tJ3htFZp2cU/WrK-3PnDoiI/AAAAAAAAIjQ/4N5afkzEiJ0xsO3F2H50L5TPd0UpCH-gwCEwYBhgL/s1600/5-planchas2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="797" data-original-width="1020" height="250" src="https://3.bp.blogspot.com/-tJ3htFZp2cU/WrK-3PnDoiI/AAAAAAAAIjQ/4N5afkzEiJ0xsO3F2H50L5TPd0UpCH-gwCEwYBhgL/s320/5-planchas2.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: center;">
<div style="text-align: justify;">
Al finalizar varios meses o quizás algunos años, Juan tendrá su casas y la habitará. Con ello obtendrá el valor prometido y cumplirá su sueño de vivienda.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La pregunta es, será que hay otras maneras de hacer las cosas. Probablemente existan muchas, pero me enfocaré en el enfoque ágil, que es el objetivo de esta entrada. </div>
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
En un modelo con Mentalidad ágil se colocará al Cliente en El Centro de todo, buscando satisfacer sus necesidades, y por ello se marcará como meta brindar el mayor valor en etapas tempranas, facilitándole que pueda habitar su casa cuanto antes.</div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-nPpn8dEN1ZQ/WrLDHcz4S9I/AAAAAAAAIjc/za_Bt1gu1bc5NwOkx6skJ_NONajtUpeuwCLcBGAs/s1600/3-agile.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="907" data-original-width="1015" height="285" src="https://4.bp.blogspot.com/-nPpn8dEN1ZQ/WrLDHcz4S9I/AAAAAAAAIjc/za_Bt1gu1bc5NwOkx6skJ_NONajtUpeuwCLcBGAs/s320/3-agile.jpg" width="320" /></a></div>
<br /></div>
<div style="text-align: justify;">
En la figura anterior se muestra un plan de entregas (raleases) que pretende que Juan empiece a disfrutar de la casa de sus sueños en etapas tempranas. Para esto, el equipo constructor se ha enfocado en el <a href="https://es.wikipedia.org/wiki/Producto_viable_m%C3%ADnimo" target="_blank">producto mínimo viable</a> que le genera valor a Juan, buscando que él pueda habitar cuanto antes su terruño.<br />
<div style="text-align: center;">
<a href="http://4.bp.blogspot.com/-OhCEmEoy_Xc/WrFYlsye83I/AAAAAAAAIiE/n41zPvfXwKI2tQLh8aSuAWzIiCR1ky1XgCK4BGAYYCw/s1600/6-agile-garage.jpg" imageanchor="1"><img border="0" height="212" src="https://4.bp.blogspot.com/-OhCEmEoy_Xc/WrFYlsye83I/AAAAAAAAIiE/n41zPvfXwKI2tQLh8aSuAWzIiCR1ky1XgCK4BGAYYCw/s320/6-agile-garage.jpg" width="320" /></a></div>
</div>
<div style="text-align: justify;">
Para ello, el equipo construye el garaje (<i>garage, como le dice mi hijo al garaje</i>) de la casa, permitiéndole a Juan habitarlo si así lo quiere. Aunque, tendrá que ir donde algún familiar cuando requiera utilizar el baño o requiera cocinar algún plato especial.<br />
<br />
Aquí, yace la diferencia, pues Juan y el equipo constructor empiezan a tener una retroalimentación más corta, brindando valor en etapas tempranas. La opinión de Juan puede ser importante porque al utilizar su garaje podrá darse cuenta de detalles que le servirán al equipo constructor en el proceso de mejora continua, así como lo oyen.<br />
Es posible que a Juan le cause alergia el piso de su garaje, y al tener rápidamente datos concretos de esta reacción en su piel en etapas tempranas, se evitará que se expanda el daño; suena útil ¿no?</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<div style="text-align: justify;">
En la siguiente entrega los constructores podrían entregarle a Juan el baño de sus sueños. Esto, haría que él pueda permanecer más tiempo en su casa y se acercaría un poco más a la <a href="https://www.scrumalliance.org/community/articles/2009/january/the-product-vision" target="_blank">visión</a>. </div>
<div style="text-align: justify;">
Por otra parte, tanto el constructor como Juan aprenderán mutuamente mucho más respecto al proceso de construcción.</div>
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="http://4.bp.blogspot.com/-KoXjCMOkZ34/WrFYxxedkvI/AAAAAAAAIiU/Tfn2r6ELbtMAthNO3gr5Etjx-lycn_JrQCK4BGAYYCw/s1600/7-agile-ban%25CC%2583o.jpg" imageanchor="1"><img border="0" height="231" src="https://4.bp.blogspot.com/-KoXjCMOkZ34/WrFYxxedkvI/AAAAAAAAIiU/Tfn2r6ELbtMAthNO3gr5Etjx-lycn_JrQCK4BGAYYCw/s320/7-agile-ban%25CC%2583o.jpg" width="320" /></a></div>
<div style="text-align: center;">
<div style="text-align: justify;">
Luego, el equipo constructor podrá entregar la sala y el comedor de la casa a Juan. Esto, le permitirá habitar con más comodidad su casa, aunque todavía no tendrá las habitaciones ni la cocina, si podrá amoblar parte de esta.</div>
</div>
<div style="text-align: center;">
<a href="http://2.bp.blogspot.com/-m8b7TdkzKPc/WrFY09Db3bI/AAAAAAAAIig/sd5HCEzsXCU3OQhJIYMh1ga88SFA0vAjgCK4BGAYYCw/s1600/8-agile-salaycomedor.jpg" imageanchor="1"><img border="0" height="256" src="https://2.bp.blogspot.com/-m8b7TdkzKPc/WrFY09Db3bI/AAAAAAAAIig/sd5HCEzsXCU3OQhJIYMh1ga88SFA0vAjgCK4BGAYYCw/s320/8-agile-salaycomedor.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<div style="text-align: justify;">
Si lo más importante fuera el valor entregado al Cliente, seguro nuestro enfoque estaría en brindar la mayor satisfacción posible constante en un un ritmo sostenible, aprendiendo de cada entrega. Esto, se acerca mucho a un enfoque ágil.<br />
<br />
Seguro Juan, ayudará en la construcción de su casa, brindando datos relevantes al equipo constructor beneficiándose de las mejoras. Juan es parte de su sueño, suena increíble, ¿no?<br />
<br /></div>
<div style="text-align: justify;">
Si esperamos tener todo terminado para entregar un producto, no tendremos retroalimentación de lo construido. No se podrá mejorar algo sin tener en cuenta todos los aportes de un equipo interdisciplinario, en donde cada rol aporta en su especialidad y cada cambio será muy costoso.<br />
<br />
Ahora, bien, podríamos llamar el enfoque ágil como un ciclo evolutivo, porque parte de un producto terminado que entrega valor al Cliente, evolucionando en cada una de sus entregas hasta llegar a la visión del producto planteado: <i>La casa de los sueños de Juan.</i></div>
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<div style="text-align: justify;">
Todo esto implica, que se construya bajo un marco evolutivo en el cual hay una visión y una arquitectura probable, sin embargo es posible que luego de un ciclo se determine que se requieren cambios y por tal motivo la arquitectura se altere, evolucionando en beneficio finalmente del Cliente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El cambio de mentalidad es fundamental para lograr los resultados esperados en enfoques ágiles.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Hasta la próxima.</div>
</div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com4tag:blogger.com,1999:blog-7470233962230718324.post-88882346217428805302017-02-06T13:17:00.005-08:002020-09-23T07:40:44.792-07:00Buenas prácticas para elaborar consultas SQL<div style="text-align: justify;">
<span style="color: black; font-family: "arial"; font-size: 32px; font-style: normal; font-weight: 700; text-decoration: none;">Buenas prácticas en construcción de Consultas SQL</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Esta entrada es una recopilación de muchos años, en los cuales muchas personas me brindaron tips respecto a cómo implementar consultas en RDBMS con alto rendimiento.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Hace poco algunos compañeros de trabajo me solicitaron que compartiera este conjunto de prácticas con el fin de que fueran evolucionando; Muchos pueden aportar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si bien no están todos los posibles tips en afinamiento, si hay un conjunto básico de prácticas a seguir, que espero les sea útil.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Posdata: si tienen otra práctica a incluir, por favor dejen el comentario para incluirla.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i><b>El conocimiento no sirve de nada si no se comparte</b></i><br />
<style type="text/css"><!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}--></style><br />
<style type="text/css"><!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}--></style>A continuación la lista de prácticas:<br />
<br />
<a name='more'></a></div><br /><div><table data-number-column="false" style="background-color: white; border-collapse: collapse; border: 1px solid rgb(193, 199, 208); color: #172b4d; font-family: -apple-system, system-ui, "Segoe UI", Roboto, "Noto Sans", Ubuntu, "Droid Sans", "Helvetica Neue", sans-serif; font-size: 16px; margin: 24px 0px 0px; table-layout: fixed; white-space: pre-wrap; width: 760px;"><tbody style="border-bottom: none; box-sizing: border-box;"><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: black; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; position: relative; vertical-align: top;"><p data-renderer-start-pos="590" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;"><span data-renderer-mark="true" style="box-sizing: border-box; color: white;">Problema / Contexto</span></strong></p></td><td colspan="1" rowspan="1" style="background-color: #666666; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; position: relative; vertical-align: top;"><p data-renderer-start-pos="613" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;"><span data-renderer-mark="true" style="box-sizing: border-box; color: white;">Solución</span></strong></p></td><td colspan="1" rowspan="1" style="background-color: #666666; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; position: relative; vertical-align: top;"><p data-renderer-start-pos="625" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;"><span data-renderer-mark="true" style="box-sizing: border-box; color: white;">Justificación</span></strong></p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="644" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Optimizar el producto cartesiano de las tablas a utilizar en una consulta.</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="722" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Prefiere los JOINS en todas sus variedades (Left, right, inner,etc.) en el FROM antes que en el WHERE.</p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="828" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">1). Siempre lo primero que hace un motor de BD es ejecutar la sentencia FROM realizando un producto cartesiano.<br style="box-sizing: border-box;" />2). Luego, ejecuta la clausula where.<br style="box-sizing: border-box;" />3). Calcula las filas del SELECT.<br style="box-sizing: border-box;" />4). Si existe un select distinc, ordena y luego elimina las filas duplicadas.<br style="box-sizing: border-box;" />5). Si existe el order by, ordena las filas.</p><p data-renderer-start-pos="1136" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">Si se evitan los joins en el where mejorarás el desempeño pues se aprovechará el producto cartesiano.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="1243" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Siempre las tablas que tienen menos registros van al lado izquierdo en el FROM y en el WHERE. Es fundamental el orden.</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="1365" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Ejemplo: FROM TABLA1, TABLA2, TABLA3.</p><p data-renderer-start-pos="1404" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">La TABLA1 debe tener menos registros que la TABLA2 y esta menos que la TABLA3. Lo anterior porque recuerda que en el FROM siempre se realiza un producto cartesiano (revisar algebra y cálculo relacional)</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="1610" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Se aplica la teoría de conjuntos, en dónde la tabla con menos registros intercepta a la que tiene más registros, y por tal motivo si se enlaza una tercera se tendrá un conjunto a interceptar más pequeño, agilizando la consulta pues se manejan menos datos.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="1871" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Nunca uses sentencias LIKE al iniciar un where.</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="1922" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Es importante asegurarse que ya se han filtrado los datos para que el conjunto de datos objetivo sea más pequeño y por lo tanto manejable en el caso en que se requiera el uso de LIKE. Es importante recordar que la sentencia LIKE implica que no se usen índices.</p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2186" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Las sentencias LIKE no utlizan índices. Evita el LIKE "%AS%", revisa si lo que requieres es un LIKE "%AS" o un LIKE "AS%"</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2313" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Nunca use DISTINCT</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2335" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Use EXISTS. Por ejemplo: Escriba la consulta como</p><p data-renderer-start-pos="2386" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">SELECT d.dept_id, d.dept<br style="box-sizing: border-box;" />FROM dept d<br style="box-sizing: border-box;" />WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e.dept = d.dept);</p><p data-renderer-start-pos="2490" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">En lugar de:</p><p data-renderer-start-pos="2504" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">SELECT DISTINCT d.dept_id, d.dept<br style="box-sizing: border-box;" />FROM dept d,employee e<br style="box-sizing: border-box;" />WHERE e.dept = e.dept;</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2587" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Si usas un DISTINCT implicará que primero el motor ejecute la consulta y luego la ordene para luego eliminar los registros duplicados. prefiera un: SELECT X1, X2 FROM (SELECT X1, X2, FROM Y WHERE.....) GROUP BY X1, X2</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2810" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Evite el ORDER BY</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2831" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2836" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Es un paso adicional a veces innecesario que retarda una consulta.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="2908" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Use un subconjunto ordenado de la definición de un índice en el WHERE para garantizar que lo utilice.</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3013" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Use un subconjunto ordenado de la definición de un índice para asegurarse que sigue un plan de ejecución deseado.</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3130" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Si le ayudas al motor mucho mejor. Si tienes un índice de una tabla X con los siguientes campos: x1,x2 y x3; en el WHERE debes siempre colocar de arriba a abajo: WHERE x1=? (AND/OR..) x2=? (AND/OR..) x3=? o por ejemplo WHERE x1=? (AND/OR..) x2=?, pues siempre será más rápido que un WHERE x3=? (AND/OR..) x1=?, etc...le facilitarás al motor el establecimiento del plan de datos y el uso de las memorias compartidas de éste (consultas frecuentes)</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3581" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">No use SELECT *</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3600" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Coloque las columnas que requiere.</p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3638" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">El motor primero lee la estructura de la tabla y luego realiza la consulta. Hace una búsqueda de la meta-data de la tabla y luego si coloca los campos.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3795" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Siempre utiliza consultas precompiladas</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3838" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Usa consultas precompiladas en el lenguaje de programación en el que las realices.</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="3924" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">No es lo mismo SELECT x.x1, x.x2 FROM x WHERE x.x1=1 que SELECT x.x1, x.x2 FROM x WHERE x.x1=2. Mientras que para el motor si es lo mismo SELECT x.x1, x.x2 FROM x WHERE x.x1=? para todos los casos y por tal motivo seguirá un plan de ejecución ya definido.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="4185" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Utiliza en la mayoría de los casos consultas en batch</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="4242" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Por ejemplo usando JDBC</p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="4269" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Envían un conjunto de consultas que se ejecutan en el motor de base de datos, en vez de hacer llamados sucesivos ocupando recurso computacional como: memoria, red, cpu.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="4443" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Si vas a llamar varias veces a una BD para efectúar consultas SQL secuencialmente es preferible que crees un procedimiento almacenado.</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="4581" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="4586" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Si vas a llamar varias veces a una BD para efectúar consultas SQL secuencialmente es preferible que crees un procedimiento almacenado que contenga todas las consultas y que retorne una estructura con todos los valores que requieras (ahorraras red, memoria...etc).<br style="box-sizing: border-box;" />Si es muy grande el conjunto de datos requerido descarta esta idea a menos que implementes un paginador. Cuando tengas pocas consultas no uses un procedimiento almacenado pues será más costoso.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5049" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Es preferible no usar índices para tablas que tienen pocos registros.</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5122" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5127" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Es más costoso trazar el plan de ejecución para la BD que si se efectuará un FULL-DATA.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5220" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Defina alias a las tablas en el SELECT con el fin de facilitarle al motor la tarea de averiguar campo por campo a que tabla pertenece.</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5358" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5363" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Se evitan las consultas intronspectivas. Se evitan accesos a la meta-data de la BD.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5452" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Evita el casting CAST y el uso de funciones dentro de las consultas.</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5524" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">No utilice funciones propietarias del RDBMS</p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5571" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Reducen el desempeño de una consulta. Además, es difícil afinar las consultas de las funciones.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5672" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Siempre implementa la lógica de paginación en BD y no en algún contenedor Web o de lógica.</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5766" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5771" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Evita la utlización de patrones como el ValueListHandler.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5834" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Evita el uso de introspección porque esto genera una carga innecesaria.</strong></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="5909" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Conclusión, no uses ORMs porque están de moda. Úsalos para tabla de parámetros o de configuración, pero para consultas que requieran eficiencia jamás. Siempre los POJOS (ValueObject, DTO, o transfer objects acompañados de un DAO serán más rápidos)</p><p data-renderer-start-pos="6158" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">Si decides utilizar ORMs en escenarios en que la arquitectura sea guiada con microservicios evita utilizar ORMs que están diseñados para servidores de aplicaciones. Recomendable el uso de micro ORMs. Ejemplo, en Java JDBI, Hibatis, etc.</p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="6398" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">No uses HQL de hibernate para consultas complejas o de grandes volúmenes; usa namedQueries.</p><p data-renderer-start-pos="6491" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">En general no uses lenguajes traductores para el caso en donde el desempeño es clave.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="6582" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><strong data-renderer-mark="true" style="box-sizing: border-box;">Bloqueos en Pools de conexión</strong></p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="6615" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Cierre siempre las conexiones y cursores (resultSets) en Java.</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="6681" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Existe un número limitado de sesiones disponibles en una base de datos.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #efefef; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="6758" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Utilice vistas materializada para consultas recurrentes</p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="6817" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td><td colspan="1" rowspan="1" style="background-color: #e6e6e6; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="6822" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">La ventaja de una vista es que tienes un select ya hecho y te permite realizar consultas de forma rápida y sencilla. De esta forma, por ejemplo, si en una consulta que haces muy habitualmente hay una función que tarda mucho en ejecutarse, puedes tener la vista materializada con los resultados ya pre-calculados y acceder a los datos rápidamente.</p><p data-renderer-start-pos="7170" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">Las vistas materializadas se actualizan o se recrean solas cada cierto tiempo, o sea, que también se pueden ver como una tabla que va actualizando automáticamente sus datos cada cierto tiempo con los resultados de una select.</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="7401" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Evite el uso de UNION</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="7426" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Utilice UNION ALL</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="7447" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">La sentencia UNION elimina los duplicados de la unión de dos consultas mientras que el UNION ALL concatena todos los resultados y no elimina duplicados. El desempeño mejorará usando UNION ALL</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #f4f5f7; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="7644" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Obtención de descripciones desde tipologías con el fin de mostrarlas en el SELECT. Ejemplo<br style="box-sizing: border-box;" />SELECT A.A1, A.A2, A.A4<br style="box-sizing: border-box;" />FROM TABLEA A, TIPOLOG T<br style="box-sizing: border-box;" />WHERE A.A1 = ? AND A.A2 = ? AND (T.T1 = A.A3 AND T.T2 = 'A' AND T.T3 = 'B')<br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td><td colspan="1" rowspan="1" style="background-color: #f4f5f7; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="7864" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">En estos casos es mejor hacer una subconsulta en el select si la tabla base de la consulta contiene un gran número de registros y las de tipologías unos pocos.<br style="box-sizing: border-box;" />Recuerde que si la tabla de tipologías es una tabla pequeña no es muy util utilizar índices y que una consulta resuelve el grán número de registros en el from y en el<br style="box-sizing: border-box;" />where efectuando los productos cartesianos allí.</p><p data-renderer-start-pos="8241" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">Siguiendo el ejemplo anterior use:<br style="box-sizing: border-box;" />SELECT A.A1, A.A2, (SELECT T.T4 FROM TIPOLOG T WHERE T.T1 = A.A3 AND T.T2 = 'A' AND T.T3 = 'B') as A4<br style="box-sizing: border-box;" />FROM TABLEA A<br style="box-sizing: border-box;" />WHERE A.A1 = ? AND A.A2 = ?</p></td><td colspan="1" rowspan="1" style="background-color: #f4f5f7; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="8423" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /><br style="box-sizing: border-box;" /></p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="8430" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">Cierre de conexiones desde clientes SQL</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="8473" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;">El número de conexiones hacia un motor de bases de datos es limitado. Si estas no se cierran desde un cliente SQL que puede ser una aplicación, una plataforma de reportes, etc. se ocuparán las conexiones causando indisponibilidad.</p><p data-renderer-start-pos="8705" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 1.143rem 0px 0px; padding: 0px;">Se debe garantizar que las conexiones se cierren una vez se utilicen para liberarlas y que el pool de conexiones no se agote.</p></td><td colspan="1" rowspan="1" style="border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="8834" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"><br style="box-sizing: border-box;" /></p><p data-pm-slice="1 1 ["table",null,"tableRow",null,"tableCell",null]">conecction.close()</p></td></tr><tr style="box-sizing: border-box;"><td colspan="1" rowspan="1" style="background-color: #f4f5f7; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="8841" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"> </p></td><td colspan="1" rowspan="1" style="background-color: #f4f5f7; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="8845" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"> </p></td><td colspan="1" rowspan="1" style="background-color: #f4f5f7; border-color: rgb(193, 199, 208); border-image: initial; border-style: solid; border-width: 1px 0px 0px 1px; box-sizing: border-box; min-width: 48px; padding: 8px; vertical-align: top;"><p data-renderer-start-pos="8849" style="box-sizing: border-box; font-size: 1em; letter-spacing: -0.005em; line-height: 1.714; margin: 0px; padding: 0px;"> </p></td></tr></tbody></table></div><div><br /></div><div>
Recomiendo este libro de <a href="http://bit.ly/2kklKIq" target="_blank">Anti patrones SQL</a><br />
<br />
Espero les sirva!!!<br />
<br />
<br /></div>@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com8tag:blogger.com,1999:blog-7470233962230718324.post-12040970587833412112015-08-14T11:17:00.001-07:002015-12-18T11:17:31.168-08:00En defensa del ESB - SOA con microservicios (Parte II)<br />
<div style="text-align: justify;">
Siguiendo con esta entrada, les voy a compartir una experiencia de hace algún tiempo como consultor, donde se me presentó un caso que requería un gran desafío para la época en atributos de calidad. El requisito estaba relacionado con desempeño y exigía un manejo de 140 mil transacciones en un día (con un pico de unas pocas horas).<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-tQNMLBLzTFs/VcyrqlNjUOI/AAAAAAAAHbQ/c-px9bmSQvQ/s1600/Appliance.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" src="http://3.bp.blogspot.com/-tQNMLBLzTFs/VcyrqlNjUOI/AAAAAAAAHbQ/c-px9bmSQvQ/s320/Appliance.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: justify;">
Dicha organización había experimentado con un famoso <a href="https://en.wikipedia.org/wiki/Computer_appliance" target="_blank">Appliance </a>que prometía el procesamiento de un alto volumen transaccional. Sin embargo, con el transcurrir de un tiempo luego de la implementación de los respectivos flujos de mediación se llegó a la siguiente conclusión: es más útil como tranca para que la puerta del centro de cómputo no se abra; suena mal, pero fue así y regresaron a la estrategia de servidores de SOCKETS escalables en su infraestructura.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a></div>
<div style="text-align: justify;">
<a href="http://gabrielmorrissa.blogspot.com/2015/07/en-defensa-del-esb-soa-con.html" style="text-align: start;" target="_blank">Ver parte I</a><br />
<br />
Quizás alguien les pudo comentar que un Appliance es por naturaleza <a href="https://en.wikipedia.org/wiki/Stateless_protocol" target="_blank">Stateless </a>y que no se debía mantener un estado conversacional o que de pronto fue por una mala práctica de implementación. Pero, aquí la cuestión está relacionada con desempeño y con escalabilidad, porque como se podría soportar una variación del negocio que exigiera un incremento de dichas transacciones a un nivel de 500 mil o que la misma Organización ingresara a nuevos mercados ofreciendo nuevos servicios incrementando las transacciones a millones en unos cuantos meses; ¿como se podría atender ahora 10 millones de transacciones? ¿bastaría con adquirir o actualizar al último Appliance que ya soporta más carga? ¿este se podría escalar?, lo dudo.<br />
<br />
De igual manera existen organizaciones que enfrentan desafíos de comercio electrónico o de aplicaciones móviles utilizando productos con una limitada capacidad de escalabilidad. ¿Será que los productos que conocemos como ESBSystem podrán soportar cargas de millones de transacciones no en un día sino en minutos? ¿Será que Amazon o Netflix funcionan así? ¿será que tienen que pactar acuerdos marco con los fabricantes de ESBSystem para no tener problemas de licenciamiento? no lo creo, y no soy el primero ni el último que lo comenta.<br />
<br />
Ante lo planteado nacen ciertas preocupaciones a nivel de arquitectura para proporcionar escalabilidades elásticas y el manejo de números de transacciones por segundo TPS elevadas; para todo esto los esfuerzos podrían centrarse en autonomía y separación de responsabilidades únicas y no solo el <a href="http://wiki.amwa.tv/index.php/VETO_Pattern" target="_blank">VETRO Pattern</a> que es el centro de los ESBSystem. Aquí es donde aparece bastante útil varias de las ventajas propuestas por los microservicios que hacen posible llevar a cabo los <a href="https://drive.google.com/file/d/0B9tuhSHftxTaeVA4M2ttU0hWajg/view?usp=sharing" target="_blank">principios planteados en SOA</a>; lo que quiere decir es que esto no es nuevo y que en realidad aporta un buen diseño que permite crear buenos componentes de software que implementen las interfaces definidas sin tener modelos monolíticos como se muestra a continuación:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-HuWW8bKwDHA/VcyyNzaERCI/AAAAAAAAHbs/UbMjcPvR9ms/s1600/Microservicios-fowler.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="http://2.bp.blogspot.com/-HuWW8bKwDHA/VcyyNzaERCI/AAAAAAAAHbs/UbMjcPvR9ms/s400/Microservicios-fowler.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: xx-small;">Microservicios - <a href="http://martinfowler.com/articles/microservices.html" target="_blank">Fowler</a></span></div>
<div style="text-align: center;">
<br /></div>
<ul>
<li><b>Autonomía de servicios: </b>cada servicio con un un proceso autónomo y con funcionalidades que den respuesta a una <a href="https://es.wikipedia.org/wiki/Single_responsibility_principle" target="_blank">responsabilidad única</a> que promueva una alta <a href="https://en.wikipedia.org/wiki/Package_principles" target="_blank">cohesión permitiendo que los componentes desplegados se puedan mantener y evolucionar aislados de otros</a>. ¿Si se tiene un servicio clave para la operación del negocio tendría sentido que éste comparta el recurso de cómputo con otros componentes diferentes a los que lo implementan?</li>
<li><b>Escalar a nivel de microservicios:</b> cada servicio o grupo de ellos exponen funcionalidades específicas que pueden ser escalados en modelos elásticos en donde los componentes se desplieguen en contenedores o imágenes que contengan todas las aplicaciones involucradas colocando un balanceador que distribuya la carga. Esto modelo elimina la idea poco eficiente de replicar aplicaciones enteras cargadas de funcionalidad por unas pocas que representen la mayor carga y permitirá en la medida que se aumente la carga transaccional escalar en un número de imágenes de forma automática o si esta baja se podrán reducir (ej. <a href="http://aws.amazon.com/es/about-aws/" target="_blank">AWS de Amazon</a> - <a href="http://www.allthingsdistributed.com/2015/07/under-the-hood-of-the-amazon-ec2-container-service.html" target="_blank">Contenedores</a>). Ver el cubo de escalabilidad propuesto en "<a href="http://theartofscalability.com/" target="_blank">El arte de la escalabilidad</a>". De esta manera se podrá escalar a millones de transacciones en un segundo.</li>
<li><b>Simplificar el mantenimiento:</b> al separarse los componentes de cada microservicio siguiendo el principio de responsabilidad única y de <a href="https://en.wikipedia.org/wiki/Package_principles" target="_blank">empaquetamiento </a>se podrá evolucionar y mantener de forma separada las funcionalidades. De igual forma se podrá eliminar componentes que no se estén utilizando sin afectar a otros servicios; los equipos de desarrollo se podrán separar para que cada quien mantenga y evolucione cada servicio, sin preocuparse de los fallos que llevan a tener miedo a los cambios facilitando la coordinación y comunicación entre éstos proporcionando más valor al negocio. </li>
<li><b>Implementación en tecnología y entorno apropiado:</b> cada servicio se puede implementar en tecnologías apropiadas que permitan desarrollar los componentes cumpliendo con las expectativas a nivel de atributos de calidad. Algunos componentes podría implementarse en Java, quizás otros en modelos reactivos en la tecnología que más se domine o incluso sobre Java, otros en C++, .NET, etc, etc.</li>
<li><b>Los fallos no perjudican a todo un sistema:</b> si un componente falla no afecta a los demás componentes. Esto porque los servicios se pueden aislar y cada cual tendrá un tratamiento del error específico.</li>
<li><b>Entregas continuas:</b> entregas en múltiples contenedores de cada uno de los servicios. Esto ocasiona un gran desafió que brinda junto a enfoques ágiles una reducción de costes en vez de seguir enfoques tradicionales en cascada o iterativos. Para ésto es clave la automatización, verificación de código, automatización de pruebas y el proceso de despliegue en diferentes entornos, control de versiones y la arquitectura orientada a modelos no monolíticos que permitan hacer pequeños cambios incrementales. </li>
<li><b>Gestión separada de atributos de calidad:</b> control de atributos de desempeño, escalabilidad, disponibilidad, entre otros, sin afectar a otros servicios. Esto permitirá que cada servicio responda al negocio en la calidad que éste requiere.</li>
</ul>
<b><br /></b>
<b>Pero ..... ¿Cómo implementar una arquitectura de servicios así?</b><br />
<b><br /><u>Identificación y separación de servicios</u></b><br />
<br />
Se requiere una orientación a servicios que ofrezca al negocio objetivo un alto nivel de calidad separándoles de acuerdo a la funcionalidad que proporcionan acotando bien el contexto. Esto implica que se debe establecer los límites de responsabilidad que proporciona cada servicio.<br />
<br />
Para esto, se puede aplicar el <a href="https://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank">principio de diseño de responsabilidades únicas</a> propuesto por <a href="https://sites.google.com/site/unclebobconsultingllc/" target="_blank">Uncle-Bob</a> que define que "Se deben reunir aquellas cosas que cambian por la misma razón y separar aquellas cosas que cambian por diferentes razones".<br />
<br />
De igual manera, hay que descomponer funcionalidades en servicios. Quizás la técnica más tradicional consiste en la descomposición basada en verbos separando los servicios que implementan una funcionalidad; ejemplo: consultar, registrar, activar, etc.. Otra manera de hacerlo es a través de sustantivos, separando responsables por las operaciones relacionadas con cada entidad en particular; ejemplo: Cliente, Cuenta, OrdenDeCompra, etc.<br />
<br />
<b><u>Autonomía por servicio</u></b><br />
<br />
Otro aspecto a tener en cuenta es garantizar la autonomía de cada servicio separándoles por las responsabilidades antes planteadas. Sin embargo, separar cada servicio por un proceso en un recurso de cómputo independiente es complicado por la administración de cada contenedor o plataforma, y por tal motivo en algunos casos se introduce el concepto de dominio o de inventario de servicios.<br />
<br />
<b><u>Separación en dominios o inventarios</u></b><br />
<br />
Lo anterior, implica que una Organización podría separar los servicios en dominios de negocio relacionados por los productos que proporcionan o en las unidades organizacionales que la componen. Esto podría parecer una herejía con el modelo de microservicios, pero en términos generales es práctico, aunque no quiere decir que ante un servicio crítico de negocio, éste no pueda estar separado en un contenedor independiente que garantice los aspectos de calidad que el negocio requiere.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-_3Nmo4NygME/VczPgW5AIXI/AAAAAAAAHb8/z9tTTcRab2Y/s1600/Dom1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="101" src="http://1.bp.blogspot.com/-_3Nmo4NygME/VczPgW5AIXI/AAAAAAAAHb8/z9tTTcRab2Y/s320/Dom1.png" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
En el ejemplo anterior se agruparon servicios por productos y algunas unidades de una organización típica de un Banco. Sin embargo, esto no implica que incluso se puedan dividir en más sub-dominios más concretos de acuerdo al comportamiento del negocio o a los atributos de calidad relacionados de éstos; ejemplo: tarjetas de crédito, tarjetas débito o incluso tarjetas franquicia uno o dos en una granularidad más fina.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Esto quiere decir que si se requieren servicios totalmente orientados a microservicios, éstos se podrán implementar de manera autónoma. Sin embargo, algunos se podrían agrupar en un mismo contenedor siguiendo el principio de responsabilidad única o incluso algunos podrían compartir recursos en sistemas monolíticos, dependiendo de los atributos de calidad que se manejen; no hay verdades absolutas.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ftkdbgtJ63s/VczTOKayd3I/AAAAAAAAHcI/jGrwyQvU3QU/s1600/Dom2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="http://4.bp.blogspot.com/-ftkdbgtJ63s/VczTOKayd3I/AAAAAAAAHcI/jGrwyQvU3QU/s320/Dom2.png" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
En la imagen anterior se aprecia la replica de componentes de servicio en otros dominios. Esto se puede manejar si se requieren garantizar autonomía o un mejor desempeño, aunque sería recomendable una orientación a <a href="https://es.wikipedia.org/wiki/DevOps" target="_blank">DevOps</a> para controlar la complejidad.</div>
<br />
El estado ideal es que cada microservicio se ejecute totalmente en un proceso autónomo, pero esto no es posible muchas veces, y depende de la Organización en la que se desarrolle. Sin embargo, la división en sub-dominios es una buena alternativa.<br />
<br />
La división lógica de dominios para la organización de inventarios de servicios también se debe llevar a la práctica en modelos físicos. Aquí es clave la separación de cargas transaccionales evitando que los servicios compartan recursos de cómputo o que se coloquen todos en una sola caja monolítica así esta sea escalada en un modelo vertical o horizontal.<br />
Cada dominio, o cada negocio tendrá sus propios requisitos no funcionales.<br />
<br />
<b><u>Implementación de componentes</u></b><br />
<br />
Cada componente se podrá implementar en la plataforma o tecnología más conveniente de acuerdo a los requisitos de cada servicio. Esto promueve la diversificación de plataformas y el uso de tecnologías neutrales.<br />
<br />
Esto quiere decir que el conjunto de herramientas y tecnologías son diversos y no se basan exclusivamente en una única plataforma. Sin embargo, si es recomendable implementar los componentes internos de cada microservicio con un modelo basado en eventos, que libere recursos de cómputo por cada petición "Stateless" evitando bloqueos con estilos de comunicación petición/respuesta; es recomendable plataformas que se basen en eventos <a href="https://es.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol" target="_blank">AMQP</a>.<br />
<br />
Algo que se debe tener en cuenta es la diferencia que hay entre orquestación de procesos y servicios. Ambas se fundamentan en el manejo de un componente centralizado que coordina los llamados entre servicios individuales manejando una memoria persistent (long-running) o de corta duración; esto no se debe implementar en una capa de integración (ESB) por su naturaleza stateless y mucho menos en una estrategia de microservicios teniendo en cuenta que lo que se buscan como alternativas de composición son las coreografías.<br />
<br />
Con las coreografías se le informa a cada participante que debe ejecutar su trabajo pero no existe un coordinador centralizado que organice los llamados (punto único de control) evitando el uso de recurso de cómputo bloqueante. Cada participante de una coreografía hará su trabajo de forma independiente promoviendo un modelo desacoplado que permita más flexibilidad.<br />
<br />
<b><u>Gestión de datos descentralizada</u></b><br />
<br />
Uno de los inconvenientes relevantes al implementar servicios autónomos esta relacionado con los medios de almacenamiento. Esto, porque los modelos monolíticos tradicionales de bases de datos RDBMS bloquean las peticiones al implementarse bajo un estilo de comunicación petición/respuesta, ocasionando que las hebras que se ejecuten queden bajo contención a pesar de que se maneje un modelo de eventos, ésto puede ocasionar fallos teniendo en cuenta que ante un bloqueo o una pérdida de conexión se afecten los servicios.<br />
<br />
La solución más simple estaría orientada a tener soluciones de bases de datos monolíticas (<a href="https://es.wikipedia.org/wiki/Cl%C3%BAster_(inform%C3%A1tica)" target="_blank">cluster</a>) con invocaciones petición/respuesta manejando timeouts de conexión, por tiempo de ejecución de consulta o de respuesta de socket. Esto, permitirá desbloquear las peticiones, aunque no se tendrá un modelo autónomo con la implicación de transformaciones entre dominios de sistemas origen y destino.<br />
<br />
Por este motivo y teniendo en cuenta que se presume la utilización de coreografías como táctica de composición, se requiere una gestión de datos descentralizada utilizando persistencia <a href="http://martinfowler.com/bliki/PolyglotPersistence.html" target="_blank">políglota</a>. Cada servicio tendrá su propio mecanismo de persistencia a conveniencia combinando incluso estrategias: Llave/Valor, RDBMS, Blobs, documentales, memoria, almacenamiento de grafos, etc.<br />
<br />
El uso de modelos de persistencia políglota difieren bastante de los modelos monolíticos donde se maneja un un estilo de persistencia específico orientado casi siempre a <a href="https://en.wikipedia.org/wiki/Relational_database_management_system" target="_blank">RDBMS</a>.<br />
<br />
Lo anterior, añade complejidad, pero permite que cada servicio evolucione independiente y con la persistencia que más se adecue a su funcionalidad. <a href="http://dddcommunity.org/learning-ddd/what_is_ddd/" target="_blank">DDD</a> proporciona una gran ayuda para solucionar este tipo problemática a través de la separación de dominios, permitiendo que expertos de dominio y desarrolladores puedan tener un lenguaje de entendimiento sobre un dominio en particular haciendo énfasis en el contexto.<br />
<br />
Esto ayuda bastante al hacer parte del contexto de un microservicio el medio de almacenamiento. Para dicha implementación puede ser conveniente la utilización de un <a href="http://martinfowler.com/bliki/CQRS.html" target="_blank">CQRS</a> para separar los comandos de escritura y las consultas, y un <a href="http://martinfowler.com/eaaDev/EventSourcing.html" target="_blank">EventSourcing</a> para la gestión general de estados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-sBe-hs7SuYs/Vc4tGqDQYEI/AAAAAAAAHd4/sc9_fbjAuIA/s1600/Cqrs_124751_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="121" src="http://1.bp.blogspot.com/-sBe-hs7SuYs/Vc4tGqDQYEI/AAAAAAAAHd4/sc9_fbjAuIA/s400/Cqrs_124751_01.jpg" width="400" /></a></div>
<br /></div>
Una manera útil para la sincronización entre bases de datos es el uso de un bus de eventos con una implementación de un modelo publicador/suscriptor o el clásico patrón <a href="https://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o)" target="_blank">observer</a> con un modelo AMQP, con el fin de que cada suscriptor interesado en algún evento en particular pueda procesar a conveniencia y en el dominio particular los datos de su interés.<br />
Esto facilita la extensión y el mantenimiento desacoplando a los interesados en los datos de un microservicio en particular.<br />
<div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19.6000003814697px; margin: 0px; outline: none; padding: 0px;">
<span style="font-family: "verdana" , sans-serif;"><span style="line-height: 22px;"><br /></span></span></div>
<div style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19.6000003814697px; margin: 0px; outline: none; padding: 0px;">
<b style="background-color: transparent;"><u>Protocolos de exposición</u></b></div>
</div>
<br />
<div style="text-align: justify;">
Los microservicios corren en diferentes procesos, y en muchos casos en distintas máquinas, por lo tanto los servicios deben usar un mecanismo de comunicación entre procesos. Los mecanismos más comunes son las llamados sincrónicos HTTP y los de mensajería asincrónica AMQP.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los llamados HTTP siguen un modelo simple petición/respuesta siguiendo en muchos casos un estilo de arquitectura <a href="https://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank">RESTful</a>. Este le suma la ventaja se soportar modelos <a href="https://es.wikipedia.org/wiki/Idempotencia_(inform%C3%A1tica)" target="_blank">idempotentes</a> a las comunicaciones entre componentes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para el caso de peticiones asíncronas se puede utilizar AMQP. Este enfoque permite desacoplar a productos de consumidores de mensajes, pero añade la complejidad de utilizar una plataforma de mensajería, como RabbitMQ, OpenAMQP, entre otros.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Recuperación de fallos</u></b></div>
<br />
<div style="text-align: justify;">
Es clave que cada microservicio tenga un diseño robusto que esté preparado para el tratamiento de fallos. A diferencia del modelo monolítico se requiere un esfuerzo adicional para esto debido a la intervención de más componentes entre sí que necesitan que se comuniquen rápidamente ante cualquier fallo. A continuación algunos de los patrones básicos definidos el el libro <a href="http://www.amazon.com/gp/product/0978739213?ie=UTF8&tag=martinfowlerc-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0978739213" target="_blank">Release it</a> que nos pueden ayudar a manejar distintos escenarios típicos de fallos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Es clave la determinación de timeouts entre peticiones de microservicios para ejecutar acciones de gestión de errores. Si algún microservicio no responde en el tiempo máximo pactado SLA se ejecutará una acción para el tratamiento de fallo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otro patrón a utilizarse para la protección de invocaciones de microservicios es el <a href="http://martinfowler.com/bliki/CircuitBreaker.html" target="_blank">Circuit breaker</a> para la protección de éstos ante escenarios de estrés. Éste permite esquivar llamadas cuando el sistema no esté operativo. Este difiere de los re-intentos, en donde los circuit breakers existen para prevenir operaciones en lugar de re-ejecutarlas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otra patrón que contiene a utilizase es el de Bulkheads con el fin de aislar fallos entre componentes. La idea es que si se producen un fallo, este no tiene porque afectar los demás servicios, para mantener una falla en una parte del sistema evitando destruir todo el conjunto.</div>
<br />
<b><u>Mensajería</u></b><br />
<br />
<div style="text-align: justify;">
Para nadie es un secreto que un mensaje XML es más grande que una trama separada por algún carácter. Recuerdo un proyecto donde se transmitían mensajes en una arquitectura EAI XML transformándose a partir de un mensaje en una trama; la relación de tamaño era de 300 KB (trama) a 3MB en un documento XML.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Creo que los mensajes con formatos tipo <a href="https://es.wikipedia.org/wiki/JSON" target="_blank">JSON</a> son una buena alternativa porque son ligeros y son descriptivos. La relación entre XML y JSON es también considerable en cuanto a tamaño, y esto puede mejorar el desempeño de los servicios.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Las interfaces estandarizadas para la creación de APIs JSON pueden construirse a través de meta-data generada. Para esto se pueden considerar estándares como apiary.io, ioDocs, Swagger, WADL, o WSDL 2.0.<br />
<br />
A través de JSON y algún modelo de construcción de APIs se puede generar un modelo estandarizado interoperable dentro de una organización o en la conectividad con socios de negocio.</div>
<br />
<b><u>Componentes comunes</u></b><br />
<br />
<div style="text-align: justify;">
En un modelo orientado a servicios guiado por microservicios pareciera que no se debiera usar algún tipo de componente común que apoye transversalmente a otros microservicios por ser cada uno independiente dentro de un proceso. Sin embargo, hay atributos no funcionales que se requieren en muchos casos implementar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Estos, están relacionados con manejo de aspectos de seguridad, gestión de SLAs, descubrimiento de end-points, entre otros, que de no manejarse por un único componente con dicha responsabilidad implicaría replicarlo en cada microservicio. Por tal motivo aparece un patrón orientado a APIs denominado API Gateway que además de resolver aspectos no funcionales proporciona interfaces unificadas para resolver la complejidad de invocar servicios de granularidad fina.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El API Gateway no solo resuelve la complejidad del acceso a servicios de múltiples invocaciones individuales, sino que también permite ante una misma petición determinar de acuerdo al consumidor que respuesta o qué detalle de información se le envía. Esto, teniendo en cuenta que un cliente móvil probablemente no requiere el nivel de detalle que un cliente Web o un tercero o probablemente diferentes canales no necesitan exactamente los mismos datos.</div>
<div style="text-align: justify;">
Esto se ve de forma más clara en una estructura de Cliente, donde el cliente móvil requiere un subconjunto de datos de la estructura completa que probablemente requiere un canal Web por aspectos relacionados con experiencia de cliente.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-r5VjTpXYKCg/Vc4Oic82phI/AAAAAAAAHc4/3cezrwUkd6E/s1600/Gateway_104906_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="163" src="http://4.bp.blogspot.com/-r5VjTpXYKCg/Vc4Oic82phI/AAAAAAAAHc4/3cezrwUkd6E/s400/Gateway_104906_01.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Otro aspecto relacionado es el de optimización para la reducción de latencias y de la reducción del tamaño de los mensajes de acuerdo al canal. Un muy buen ejemplo de un API Gateway lo suministra <a href="http://techblog.netflix.com/2013/01/optimizing-netflix-api.html" target="_blank">NetFlix </a>a través de un diseño de aplicación basado en un modelo de programación funcional reactivo donde son capaces de soportar 2 billones de transacciones en un día.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La localización e instancias de servicios (host+puerto) pueden cambiar en incluso de manera dinámica. Por tal motivo el Gateway también tendría dicha responsabilidad; sin embargo, es clave mencionar que en ningún momento estoy planteando el uso de algo similar a un <a href="https://es.wikipedia.org/wiki/UDDI" target="_blank">UDDI</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El API Gateway además de optimizar la comunicación entre clientes y la aplicación, encapsula los detalles de los microservicios ocultando cambios en los microservicios. Esto permite evolucionar los microservicios sin impactar a los clientes. Si se cambian algunos microservicios separándose en dos o más microservicios, sólo habría que actualizar el API Gateway para reflejar los cambios, y los consumidorese no se verían afectados.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En cuanto al descubrimiento se recomienda la aplicación de dos patrones que están relacionado a la ubicación desde la cual se descubren los microservicios (<a href="http://www.amazon.com/Microservices-Architecture-architecture-software-possible-ebook/dp/B00Y6MO1NK/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1438697857&sr=1-1&keywords=microservices+architecture" target="_blank">Arquitectura de microservicios</a>): descubrimiento desde el servidor o desde el cliente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El registro más popular para estas iniciativas es <a href="https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance" target="_blank">Eureka </a>en combinación con <a href="https://github.com/Netflix/ribbon" target="_blank">Ribbon </a>como cliente para implementar las consultas. Otros registros son <a href="https://github.com/coreos/etcd" target="_blank">Etcd</a>, <a href="https://www.consul.io/" target="_blank">Consul </a>y <a href="https://zookeeper.apache.org/" target="_blank">Apache zookeeper</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para implementar un API Gatewy podría considerarse tecnologías basadas en event-driven/reactive debido al desempeño y descoplamiento que se requiere para escalar a gran nivel. Sobre una JVM podría utilizarse librarías basadas en NIO como Netty, Spring Reactor, o SCALA.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El <b>Descubrimiento server-side: </b>al hacer una solicitud a un servicio, el cliente realiza la petición vía un enrutador (también conocido como, balanceador de carga) el cual corre en una ubicación bien definida. Este enrutador consulta a un Registro de Servicios, el cual puede estar construido dentro del mismo enrutador, y envía la solicitud a una instancia disponible del servicio.</div>
<div style="text-align: justify;">
Es viable a utilizarse en un modelo en la nube para implementar escalabilidad elástica.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-li3CC2k1FMM/Vc4l3H48rBI/AAAAAAAAHdo/ckmtU6NkE3A/s1600/ServerSide.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="162" src="http://1.bp.blogspot.com/-li3CC2k1FMM/Vc4l3H48rBI/AAAAAAAAHdo/ckmtU6NkE3A/s400/ServerSide.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Los escalamientos utilizando EC2 Autoscaling proporcionan direcciones IPs que cambian de forma dinámica. La reducción de esta complejidad se proporciona con el balanceador. Al unir el registro con el API Gateway, se soluciona el único acceso a través del balanceador ocultando detalles del escalamiento elástico proporcionado por la plataforma al ubicar el contenedor o la máquina virtual específica que atenderá la petición.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<b>El descubrimiento del lado del cliente Client-side: </b> implica la consulta a un registro de servicios que conoce todas las instancias. Este enfoque tiene ventajas relacionadas con la disminución de saltos de red, pero trae como inconveniente el acoplamiento con el registro de servicios de parte del consumidor e implica la implementación de un proxy que conecte el cliente al registro. </div>
<div style="text-align: justify;">
<a href="http://netflix.github.io/#repo" target="_blank">Netflix </a>utiliza este patrón de descubrimiento de servicios.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-zzQB4fGnWR4/Vc4gmEsDyCI/AAAAAAAAHdY/02VIduexYPw/s1600/ClientSide_115152_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="http://4.bp.blogspot.com/-zzQB4fGnWR4/Vc4gmEsDyCI/AAAAAAAAHdY/02VIduexYPw/s400/ClientSide_115152_01.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Esta alternativa de descubrimiento se puede mejorar utilizando el balanceador LB para soportar el comportamiento elástico de escalabilidad al utilizarse contenedores o máquinas virtuales, pero eliminando la responsabilidad de registro. Este modelo se mejora con el LB porque los servicios se registran con una ubicación determinada pero se elimina la complejidad de conocer la instancia específica de servicio a utilizarse porque de esto se encarga el LB.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Gobierno</u></b></div>
<br />
<div style="text-align: justify;">
El gobierno propuesto no se enfoca en una estructura burocrática sino en el control de atributos de calidad de los microservicios y en la gestión del modelo operacional que pudiera implementarse con un enfoque <a href="https://es.wikipedia.org/wiki/DevOps" style="text-align: justify;" target="_blank">DevOps</a>. El objetivo es controlar las cargas transaccionales de cada microservicio.</div>
<div style="background: rgb(255, 255, 255); border: 0px; color: #555555; font-family: 'Helvetica Neue', Helvetica, sans-serif; font-size: 13px; font-stretch: normal; line-height: 19.5px; margin-bottom: 1.2em; outline: 0px; padding: 0px; vertical-align: baseline;">
<br />
<div style="text-align: justify;">
No se pretende crear una estructura jerárquica organizacional ni una oficina SOA o un comité o un centro de excelencia. El enfoque está orientado al control de aspectos no funcionales entre los equipos de desarrollo y el equipo operacional.</div>
<br />
<b><u>Conclusiones</u></b><br />
<b><u><br /></u></b>
<br />
<div style="text-align: justify;">
Esta entrada pretende mostrar algunos aspectos relevantes a tener en cuenta en un modelo orientado a servicio centrado en un buen diseño guiado por microservicios. Espero le sea de utilidad a algún lector.</div>
<br />
Saludos,<br />
<a href="https://twitter.com/GabrielMorrisS" target="_blank">@GabrielMorrisS</a><br />
<br />
<a href="http://gabrielmorrissa.blogspot.com/2015/07/en-defensa-del-esb-soa-con.html" target="_blank">Ver parte I</a><br />
<br />
<br /></div>
<h2 style="background: rgb(255, 255, 255); border: 0px; color: #222222; font-family: Verdana, Geneva, sans-serif; font-size: 24px; font-stretch: normal; line-height: 1.5em; margin: 0px 0px 0.5em; outline: 0px; padding: 0px; vertical-align: baseline;">
</h2>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com5tag:blogger.com,1999:blog-7470233962230718324.post-3107281199938392882015-07-28T18:44:00.000-07:002019-06-06T06:07:49.056-07:00En defensa del ESB - SOA con microservicios (Parte I)<div style="text-align: justify;">
Esta entrada la inicie a mediados del 2013 pero nunca la abordé; recuerdo que nació de un comentario en donde se hablaba algo de los <a href="http://martinfowler.com/articles/microservices.html#MicroservicesAndSoa" target="_blank">microservicios</a> o de un estilo arquitectónico REST como una solución tipo bala de plata. Mis ocupaciones (me había ido al lado oscuro de la fuerza) me enredaron y se quedó ahí, pero bueno, nunca es tarde para volver.<br />
<br />
Esta entrada las separaré en dos partes:<br />
<br />
<ul>
<li>Hablando un poco del viejo patrón ESB</li>
<li><a href="http://gabrielmorrissa.blogspot.com.co/2015/08/en-defensa-del-esb-soa-con.html" target="_blank">SOA con elementos de microservicios</a></li>
</ul>
<br />
Gracias de ante mano por sus comentarios o aportes.<br />
<br />
<b><u>Hablando un poco del viejo patrón ESB</u></b><br />
<br />
En muchas iniciativas se discute acerca de la aplicabilidad de un ESB (Enterprise Service Bus) y en que casos se debe usar, en otros se habla de éste como una mala practica, en otros se presenta como la bala de plata que resuelve todos los problemas, en general se dan como aceptados los conceptos de un ESB, pero, ¿se entiende qué es un ESB? ¿los microservicios son la bala de plata esperada y todo debe ser implementado así? ¿SOA está muerto?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Durante mucho tiempo se ha explicado por múltiples fabricantes que un ESB es una herramienta, un producto o una combinación de estos. Ésto, en realidad no es cierto, porque las herramientas son habilitadores, medios, pero no son el patrón en si mismo y en muchos casos se les denomina ESBSystem.<br />
En realidad esto se ha presentado por un discurso comercial que sea fácil de vender, porque si se habla de un ESB como un patrón, quizás exista la necesidad de explicar de parte de un equipo comercial acartonado (o bastante maquillado) la estrategia de su uso; esto evidentemente no es viable aún más cuando el comercial lo único que hace es aprenderse un discurso específico del fabricante (recuerdo la guerra entre equipos comerciales y de arquitectura en un reconocido fabricante por esto).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-LwWsqBXUlME/VbgDth5i8FI/AAAAAAAAHZI/oPL3Fuh7nAY/s1600/Imagen%2B1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="139" src="https://2.bp.blogspot.com/-LwWsqBXUlME/VbgDth5i8FI/AAAAAAAAHZI/oPL3Fuh7nAY/s200/Imagen%2B1.png" width="200" /></a></div>
<div style="text-align: center;">
<br />
<a name='more'></a><br /></div>
La anterior figura muestra a un "ESB"; esto en realidad es una imagen clásica de venta en la cual se aprecia una plataforma o herramienta que se convierte en un cuello de botella entre aplicaciones y por supuesto entre consumidores (requesters) y proveedores. Ante esta imagen de "arquitectura" de un ESB, muchas organizaciones han diseñado soluciones orientadas a servicios creyendo en que han implementado su enfoque con todos sus principios (basta con comprar la herramienta), pero en realidad lo que han construido es aplicaciones monolíticas en una plataforma común con las siguientes características:<br />
<br />
<ul>
<li><b>Cuello de botella:</b> si se cae un servicio o la plataforma se cae por completo el "ESB". Todos los mensajes pasan por dicha plataforma.</li>
<li><b>Escalabilidad:</b> es claro que escalar una única plataforma con este modelo se realiza instalandola N veces junto a todos los componentes de software construidos a través de modelos horizontales o verticales; aplicaciones monolíticas.</li>
<li><b>Gestión de SLAs entre consumidores y entre proveedores:</b> esto rara vez se implementa ocasionando que los hilos de los procesos que se ejecuten creen contenciones bien sea entre los consumidores o con el proveedor del servicio, como puede ser una base de datos. Si algo falla todo se cae o se inicia un proceso de degradación de nuestro famoso "ESB".</li>
<li><b>Soporte de una única plataforma para albergar múltiples servicios:</b> recuerdo charlas interesantes sobre esto, en donde se vendía la idea de que para eso es el "bus"; es simple, es para soportar todos los servicios que se tengan. Esto en realidad no es tan cierto, porque cómo se podría administrar requisitos no funcionales de desempeño, uso de recurso de cómputo en general si todos usan la misma plataforma y en donde seguramente no faltará el desarrollador que implemente componentes con un bajo desempeño, o el reuso de servicios de parte de otros consumidores sin un control de transacciones por segundo, etc.</li>
<li><b>El ESB como un todo incluyendo stateless y stateful:</b> esto lo he visto cientos de veces en plataformas IBM, Oracle, TIBCO, Server JEE, IIS, etc., entre otras, en donde se implementan orquestaciones en el "ESB" porque para eso es. Esto agrava el problema teniendo en cuenta que a parte de ser una plataforma que alberga múltiples servicios convirtiéndose en un cuello de botella debe procesar estados conversacionales de larga duración así no tengan persistencia (Short-running) , olvidándose que los servicios por definición son stateless.</li>
<li><b>Implementación de "ESBSystem" sobre un contenedor JEE o un IIS:</b> esto por si solo se enfoca en un modelo monolítico de cuello de botella en donde los componentes se ejecutan sobre una aplicación que a su vez corren sobre un servidor de aplicaciones y una máquina virtual. En realidad se ve un todo, y poca gestión de atributos de calidad y se duda de la separación de contenedores por la complejidad de su administración o por el eterno problema de licenciamiento; aquí, un servicio no es un proceso autónomo independiente o un grupo de servicios separado por dominio o un modelo de inventario lógico definido a conveniencia por cohesión o por principios <a href="https://es.wikipedia.org/wiki/SOLID_(object-oriented_design)" target="_blank">SOLID </a>o de <a href="https://drive.google.com/file/d/0B9tuhSHftxTaR0NpTGRxTmVBUkU/view?usp=sharing" target="_blank">empaquetamiento</a>.</li>
<li><b>Servicios Web, WSDLs:</b> esto quizás es lo más común y está relacionado con la difusión de que los servicios son iguales a servicios Web; en realidad es una idea que se quedó como cierta pero no lo es. Los servicios son abstracciones que exponen funcionalidades cohesivas y desacopladas a consumidores a través de un modelo de dominio neutral; es un concepto lógico simplemente que permite alinear áreas de negocio con capacidades técnicas, y que pueden implementarse en tramas sobre HTTP, CORBA, XML con sockets o a través de simples mensajes JSON sobre el protocolo que se escoja. Esto quiere decir que los servicios no son componentes de software ejecutables sino representaciones funcionales que pueden ser implementadas en la tecnología que se prefiera o con el formato de mensajería que cumpla por ejemplo con protocolos canónicos o esquemas canónicos.</li>
<li><b>ESB y componentes para la implementación de SOA: </b>esto se basa en la estrategia que han tenido los fabricantes que venden licencias asignando responsabilidades específicas a productos de software para implementar una arquitectura orientada a servicios. Esto en realidad es una buena estrategia comercial, pero no una definición de arquitectura como tal, porque sería tan simple como comprar las cajas y listo; recuerdo a muchas organizaciones con un montón de cajas guardadas en anaqueles esperando ser usadas para algún propósito (es primero la gallina que el huevo; la herramienta sobre la solución de arquitectura) sin tener en cuenta modelos operacionales, proyectos de software o requisitos funcionales y no funcionales básicos.</li>
</ul>
<div>
En realidad la lista es bien larga, pero creo que la idea se entiende. Ahora bien, creo que lo que he tratado de mostrar desde mi punto de vista es en realidad la putrefacción del concepto de SOA, ESB, entre otros.</div>
<br />
<br />
Ahora, si dijéramos que SOA es un modelo de arquitectura que se enfoca en cuatro frentes de trabajo: negocio, arquitectura, desarrollo y operación, podríamos encontrarnos con lo siguiente:<br />
<br />
<ul>
<li><b>SOA desde el negocio:</b> alguien de negocio ve por lo general a SOA como un modelo que permite a los procesos de negocio consumir servicios que son provistos por el área de TI; esto se conoce como alineación.</li>
<li><b>SOA desde un enfoque de arquitectura: </b>un estilo de arquitectura que requiere proveedores de servicios, consumidores y mecanismos de descripción para descubrir y ejecutar las funcionalidades provistas. Se habla de componentes de servicio con bajo acoplamiento, bien definidos, interoperables y flexibles para el reuso, sin olvidar a los <a href="https://drive.google.com/file/d/0B9tuhSHftxTaeVA4M2ttU0hWajg/view?usp=sharing" target="_blank">principios de la orientación a servicios</a>. Además, se incluyen modelos de gobierno y de control de aspectos no funcionales.</li>
<li><b>SOA desde un modelo de desarrollo:</b> desde este punto de vista se habla de tecnologías a utilizarse, protocolos, mensajes, formatos entre otros a través de la estandarización en una Organización.</li>
<li><b>SOA desde un modelo de operación:</b> una arquitectura que permite a áreas de operaciones implementar mecanismos de monitoreo <a href="https://en.wikipedia.org/wiki/Application_performance_management" target="_blank">APM</a> para determinar el uso del recurso de cómputo de cada componente de servicio implementado por cada uno de los dominios o modelo de inventario para establecer políticas de fondeo ($) o de control de atributos de calidad.</li>
</ul>
<div>
Ahora bien, ¿qué es un ESB?. Les propongo algunas características claves que he recopilado:</div>
<div>
<ul>
<li>El ESB como patrón lógico, no es una herramienta (s). Es el diseño de una solución a la medida y con las capacidades a alcanzar. No olvidemos que dentro de los principios de SOA está la diversificación de vendedores y tecnologías y arquitectura agnóstica.</li>
<li>No es un cuello de botella en una infraestructura común que se instala y se configura una sola vez. Si algo se cae colapsa una Organización como único punto de fallo.</li>
<li>Es una solución orientada a aspectos de conectividad que proporciona capacidades en runtime. Quiere esto decir que permite re-configuración dinámica de aspectos no funcionales.</li>
<li>En una Organización existen múltiples ESBs separados por unidades de negocio o por responsabilidades transaccionales. Pueden ser autónomos y sostenibles en un modelo de fondeo ($) que habilite capacidades de negocio.</li>
<li>Se podría implementar SOA con micro-servicios; <b><i>Umhhhhh, si</i></b>. De hecho, muchas arquitecturas que conozco implementan aplicaciones autónomas a través de procesos separados sobre un sistema operativo que levantan múltiples hebras (threads). En otros casos la separación se implementa por dominios o modelos de inventarios para facilitar la operación y administración de grupos de servicios desplegados teniendo en cuenta cohesión y <a href="https://drive.google.com/file/d/0B9tuhSHftxTaR0NpTGRxTmVBUkU/view?usp=sharing" target="_blank">principios de empaquetamiento</a>. </li>
<li>Soporta múltiples estilos de comunicación. No siempre es posible manejar peticiones sincrónicas y en procesos de negocio complejos se requieren muchas veces modelos asíncronos.</li>
<li>Una arquitectura de referencia SOA puede soportar múltiples protocolos de exposición. Ejemplo: HTTP, SMS, sockets TCP, SOAP, etc. Claro está que la interoperabilidad debiera ser un elemento clave, pero resulta que no siempre es posible hablar en estándares y en organizaciones complejas todavía existen Mainframes, o desde consumidores limitados incluso HTTP utilizando tramas son mensajes muy grandes, así que no todo es Web, ni síncrono, y sobre esto no hay balas de plata.</li>
<li>Se fundamenta en el manejo de eventos. De cara a los consumidores el estilo de comunicación puede variar, pero entre componentes se pueden utilizar eventos.</li>
<li>Soporta invocaciones stateless. ¿Será que se soporta procesamiento batch para millones de registros al mismo tiempo?</li>
</ul>
Desde los lineamientos del <a href="http://www.opengroup.org/soa/source-book/soa_refarch/" target="_blank">OpenGroup SOA RA</a> se muestra lo que es un ESB, como una asignación de responsabilidades lógico y no como una plataforma o una herramienta del tipo ESBSystem.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-MSZK4RzZwNE/VbgnpBnEGoI/AAAAAAAAHZY/xHqsnpC9IJ4/s1600/Imagen%2B2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://1.bp.blogspot.com/-MSZK4RzZwNE/VbgnpBnEGoI/AAAAAAAAHZY/xHqsnpC9IJ4/s320/Imagen%2B2.png" width="320" /></a></div>
<div style="text-align: center;">
</div>
<br />
En la perspectiva de <a href="http://soapatterns.org/compound_patterns/enterprise_service_bus" target="_blank">SOAPatterns</a> el ESB se describe a este como una capa de intermediación.<br />
<br />
Para cerrar esta entrada, lo que pretendo mostrar es que no todas las soluciones son Web (no todo es front-end) y que una arquitectura orientada a servicios es más que los servicios Web, que un ESB es un patrón y no una herramienta, que no todo puede ser autónomo, no todo es sincrónico, no todo es HTTP, no hay balas de plata y para esto cito este artículo de <a href="http://martinfowler.com/bliki/MicroservicePrerequisites.html" target="_blank">microservicios de Martin Fowler</a>, y si fuese así que fácil sería todo.<br />
<br />
De los microservicios podríamos decir que es la definición de una SOA bien hecha, bien diseñada. Pero, no siempre es posible implementarlos porque pueden existir restricciones operacionales, políticas o de presupuesto para soportar múltiples contenedores que garanticen la autonomía de cada servicio.<br />
<br />
En la siguiente entrada pretendo describir un poco como sería la definición de una SOA con elementos de microservicios que garanticen autonomía, escalamientos, mantenimiento, fiabilidad, despliegue continuo, eliminación en lo posible de sistemas monolíticos a través de dominios o inventarios o para algunos casos claves la construcción literal de servicios autónomos estructurados para que sean totalmente independientes para garantizar un desempeño y fiabilidad consecuente con un modelo de negocio.<br />
<br />
<a href="http://gabrielmorrissa.blogspot.com/2015/08/en-defensa-del-esb-soa-con.html" target="_blank">Ver parte II</a></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com5tag:blogger.com,1999:blog-7470233962230718324.post-16905860551361743312014-10-27T09:02:00.002-07:002014-10-27T14:57:01.242-07:00Integración latinoamericana - Ágiles 2014<div style="text-align: justify;">
Al finalizar las actividades del día sábado en Ágiles 2014, encontré una mezcla de sentimientos, emociones y pasiones que creo quedaron reflejadas en este mapa. Hoy quiero contarle a los que no estuvieron allí lo que ocurrió y a los que si estuvimos dejarles esta memoria para el futuro.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-1ONaK-c2P4w/VE5ldBgbq2I/AAAAAAAAGsc/GiX8kUjHVfg/s1600/20141025_202545.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-1ONaK-c2P4w/VE5ldBgbq2I/AAAAAAAAGsc/GiX8kUjHVfg/s1600/20141025_202545.jpg" height="400" width="316" /></a></div>
<div style="text-align: justify;">
Antes de empezar el cierre del evento se efectuaron una serie de juegos ágiles que movieron mucha energía (La máquina de sonidos, el mapa latinoamericano, etc). Sin embargo, cuando se elaboró el mapa me vino a la cabeza, que bueno sería dibujarlo como imagen del evento y se lo comenté a <a href="https://twitter.com/claumsandoval" target="_blank">@ClaumSandoval</a> y a <a href="https://twitter.com/c2oh" target="_blank">@c2oh</a>; ahora bien, ¿por qué?</div>
<div style="text-align: justify;">
En la facilitación se habla mucho de técnicas, prácticas, enfoques, etc. Sin embargo, a mi me mueve el piso la captura de emociones, y creo que en el momento en que se armo el mapa, eso sentí. </div>
<div style="text-align: justify;">
</div>
<a name='more'></a><br />
<div style="text-align: justify;">
Vi, a un conjunto de hermanos latinoamericanos, a un Canadiense, a varios Españoles y a un Inglés girando alrededor de una integración hermosa, real, alrededor de un tema: Agilismo. Esto muestra que unidos somos definitivamente más.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_e3OjxYztzI/VE5oZn1wBkI/AAAAAAAAGso/Kdb7KOblrlw/s1600/20141025_202607.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-_e3OjxYztzI/VE5oZn1wBkI/AAAAAAAAGso/Kdb7KOblrlw/s1600/20141025_202607.jpg" height="275" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
El intercambio cultural fue tremendo a parte del conjunto de enseñanzas relacionadas con experiencias, modelos y teorías. Es lindo ver a mucha gente orgullosa de compartir, de dar, de aportar sin esperar nada a cambio, ¡Que viva el altruismo!.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Muchas gracias <a href="https://twitter.com/claumsandoval" target="_blank">@Claumsandoval</a> de nuevo por invitarme a facilitar contigo, como siempre un placer. Gracias <a href="https://twitter.com/martinalaimo" target="_blank">@martinalaimo</a> por tu charla; mostrar la vivencia es clave para encontrar nuevas creencias que motiven la implementación de Agile en diferentes contextos.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-GvDsWyjonRI/VE5rVOkr9CI/AAAAAAAAGs0/0gFm_5CShS8/s1600/martin.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-GvDsWyjonRI/VE5rVOkr9CI/AAAAAAAAGs0/0gFm_5CShS8/s1600/martin.jpg" height="243" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Estuvo interesante la charla de emprendimiento. Gracias chicos, fue un honor facilitarles la actividad.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-keSjJTAf4m4/VE5r4g5wMXI/AAAAAAAAGs8/P77tYnLP2VU/s1600/20141025_163519.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-keSjJTAf4m4/VE5r4g5wMXI/AAAAAAAAGs8/P77tYnLP2VU/s1600/20141025_163519.jpg" height="400" width="302" /></a></div>
<div style="text-align: justify;">
Gracias <a href="https://twitter.com/claumsandoval" target="_blank">@Claumsandoval</a> por facilitar mi charla de Agilidad en Casa. Prometo que escribiré una entrada de esto que vengo implementado en mi hogar; la agilidad no es solo para construir software y se puede utilizar en muchos contextos.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-br2TQfpeodA/VE5x16oRSMI/AAAAAAAAGtc/srtdy02nA8M/s1600/20141025_163340.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-br2TQfpeodA/VE5x16oRSMI/AAAAAAAAGtc/srtdy02nA8M/s1600/20141025_163340.jpg" height="320" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Quiero agradecer muchísimo a la Organización de Agiles2014 por dejarme colar el sábado, porque me permitieron compartir, gozar y facilitar en este hermoso evento. Pude aportar una pequeña gota de agua a la gran jarra que entre todos llenamos.</div>
<div style="text-align: justify;">
<b><br /></b></div>
<div style="text-align: justify;">
<b>¡Nos vemos en Agiles2015 en Uruguay!</b>, voy a empezar a llenar el marranito para ahorrar y no faltar en esa cita.</div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com1tag:blogger.com,1999:blog-7470233962230718324.post-35786066464883832842014-09-25T18:59:00.003-07:002014-10-27T09:43:26.470-07:00AgileOpenCali<div style="text-align: justify;">
Luego de efectuarse el AgileOpenCali el pasado 4 de Octubre en ParqueSoft quedan muchas enseñanzas y muchas expectativas de iniciativas ágiles en Cali. ¡Hay mucha gente interesada en el tema!</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-lCoJA3HKsSw/VE40hdFyxnI/AAAAAAAAGr0/_XOUyKTdsQQ/s1600/BzHxzEdIgAAv5hR%2B(.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-lCoJA3HKsSw/VE40hdFyxnI/AAAAAAAAGr0/_XOUyKTdsQQ/s1600/BzHxzEdIgAAv5hR%2B(.jpg" height="300" width="400" /></a></div>
<div style="text-align: center;">
<br />
<br />
<a name='more'></a><div style="text-align: justify;">
En cuanto a expectativas, está el inicio de la comunidad ágil y la aplicación de prácticas en los distintos proyectos en los cuales podamos colocar semillas que permitan a las Organizaciones probar este enfoque.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Que puede venir en las Organizaciones y Universidades en Cali? Creo que es claro que vendrán Katas, Dojos, Meetups con la comunidad de <a href="http://www.agilescolombia.org/">www.agilescolombia.org</a>, etc.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la figura anterior aparece la facilitación que implementé de la charla de <a href="https://twitter.com/luchosalazarc" target="_blank">@luchosalazarc</a> en la cual se colocan semillas para los asistentes, respecto a cómo redactar historias de usuario. Gracias Lucho, buena charla.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-tBEAuIJ7RfA/VE45X_cmsLI/AAAAAAAAGsE/G0hleVQxGAE/s1600/BzIexMnCEAArpB_.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-tBEAuIJ7RfA/VE45X_cmsLI/AAAAAAAAGsE/G0hleVQxGAE/s1600/BzIexMnCEAArpB_.jpg" height="278" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¡La charla de <a href="https://twitter.com/hhiroshi" target="_blank">@hhiroshi</a> fue genial!, fue pertinente porque mostró una manera de implementar ágil gradual en una Organización para la cura de dolores utilizando pocas prácticas a la vez. Gracias Hiro.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-maJv-shfyXk/VE46TyVOceI/AAAAAAAAGsM/O6L5lXJVbms/s1600/BzIN5UFIYAAd_nM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-maJv-shfyXk/VE46TyVOceI/AAAAAAAAGsM/O6L5lXJVbms/s1600/BzIN5UFIYAAd_nM.jpg" height="281" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Finalmente agradezco a <a href="https://twitter.com/GiovanniArzayus" target="_blank">@GiovanniArzayus</a> por acompañarme en mi charla de <a href="http://gabrielmorrissa.blogspot.com/2013/11/camino-la-agilidad-para-bpm.html" target="_blank">BPM Ágil</a>. Compartimos con un grupo nuestra experiencia en el tema.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Cuando programamos el AgileOpenCali 2 <a href="https://twitter.com/luismulato" target="_blank">@luismulato</a> y <a href="https://twitter.com/claumsandoval" target="_blank">@claumsandoval</a> <a href="https://twitter.com/AgilesColombia" target="_blank">@AgilesColombia</a> <a href="https://twitter.com/brainswitchco" target="_blank">@brainswitchco</a>?</div>
<div style="text-align: start;">
<br /></div>
<div style="text-align: start;">
<br /></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com2tag:blogger.com,1999:blog-7470233962230718324.post-15740087914378922112014-06-18T13:24:00.001-07:002014-06-19T13:25:30.733-07:00AgileOpenCartagena (Failfast - Arquitecturas ágiles)<div style="text-align: justify;">
El pasado sábado 7 de junio se desarrolló en Cartagena en la Universidad del Sinú, la segunda versión del AgileOpenCartagena, en la cual tuve el placer de participar. Tuvimos una serie de actividades relacionadas con ágil y un conjunto de técnicas que resultaron muy interesantes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-CE-TJ8fefy4/U6HccECqqiI/AAAAAAAAFyQ/4yKURtnSrPU/s1600/Arquitecturas-Agiles+-+edit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-CE-TJ8fefy4/U6HccECqqiI/AAAAAAAAFyQ/4yKURtnSrPU/s1600/Arquitecturas-Agiles+-+edit.jpg" height="275" width="400" /></a></div>
<div style="text-align: justify;">
<span id="goog_1513097914"></span><span id="goog_1513097915"></span>Como se aprecia en la facilitación gráfica (<span style="font-size: x-small;">@Claumsandoval - @GabrielMorrisS</span>) de arquitecturas ágiles, implementamos una charla en la cual compartimos ideas acerca de dónde implementar estas actividades en procesos ágiles. Fue bastante interesante intercambiar ideas con diferentes personas acerca de dónde se deben implementar dichas labores.</div>
<div style="text-align: justify;">
</div>
<a name='more'></a><br />
<div style="text-align: justify;">
Hubo afirmaciones interesantes como: </div>
<div style="text-align: justify;">
</div>
<ul>
<li style="text-align: justify;">"<i>Las buenas inspecciones se realizan a través de pruebas automatizadas de los atributos de calidad definidos</i>".</li>
<li style="text-align: justify;">"<i>El equipo en conjunto con roles de arquitectura definen los diseños de alto nivel que se implementarán".</i></li>
<li style="text-align: justify;"><i>"Hay que definir las abstracciones siguiendo los principios de diseño clásicos para desacoplar y cohesionar los componentes que se implementen: principios de paquetización, abierto-cerrado, liskov, interfaz, (boundary-control-entity) etc."</i></li>
<li style="text-align: justify;"><i>"Las arquitecturas deben ser evolutivas y estar listas para el cambio. Si es necesario se deben re escribir".</i></li>
</ul>
<div>
<div style="text-align: justify;">
Fue una actividad con bastante participación en la cual se intercambiaron ideas al respecto y en la que participaron entre otros: @luismulato, César, y quien escribe.</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
Hubo un tema que le facilité a @luismulato, FAILFAST; La verdad me parece muy útil dejar el temor al fallo, a la equivocación, al señalamiento.</div>
</div>
<br />
<a href="http://1.bp.blogspot.com/-9LhHDIq--gc/U6Hcne1rYII/AAAAAAAAFyY/Tbwa2pxb-6s/s1600/FailFast+-+edit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-9LhHDIq--gc/U6Hcne1rYII/AAAAAAAAFyY/Tbwa2pxb-6s/s1600/FailFast+-+edit.jpg" height="276" width="400" /></a><br />
<div class="separator" style="clear: both; text-align: justify;">
Este tema es algo que se relaciona directamente con la elaboración de componentes de software en las iteraciones SPRINTS; los ciclos cortos ayudan a encontrar fallos rápidamente a través de los puntos de revisión y las retrospectivas. Sin embargo, si tuviéramos pruebas automatizadas de aspectos no funcionales detectaríamos rápidamente malos diseños o malas implementaciones que podrán rápidamente corregirse en el siguiente ciclo.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Los escenarios de fallo deben considerarse siempre, pues detectarán rápidamente los puntos de quiebre. Estos se deberían implementar con el tratamiento de excepciones y siguiendo un manejo de aserciones para garantizar que se cumplen las premisas.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
¡Estuvo bueno el OpenSpace!</div>
<br /></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com2tag:blogger.com,1999:blog-7470233962230718324.post-32348819588069176702014-04-18T12:12:00.000-07:002018-10-07T10:51:34.636-07:00Corrupción o acomodación ágil<div style="text-align: justify;">
Después de leer un artículo muy interesante de <a href="http://blog.8thlight.com/uncle-bob/2014/03/28/The-Corruption-of-Agile.html" target="_blank">corrupción ágil </a>de Robert C. Martin y de reflexionar un poco acerca de experiencias del pasado, creo que este tipo de entradas en realidad son una radiografía de lo que sucede en nuestro medio. Intentamos acomodar todo de acuerdo a nuestra conveniencia, a nuestro discurso corrompiendo en esencia los principios ágiles.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-H_D_SiKIiZI/U1FqlGkQU8I/AAAAAAAAFEY/5zndLh17GwM/s1600/20140416_195612-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://4.bp.blogspot.com/-H_D_SiKIiZI/U1FqlGkQU8I/AAAAAAAAFEY/5zndLh17GwM/s1600/20140416_195612-2.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: justify;">
No estoy diciendo que la corriente ágil sea la verdad absoluta, de hecho no lo es, pero si creo que se debe ser consecuente con los principios que se recitan a viva voz. No creo en fanatismos desbordados pero tampoco en la acomodación relativa de las cosas por simple conveniencia.<br />
<br />
<a name='more'></a></div>
<div style="text-align: justify;">
Entrando al grano, si en nuestras empresas se han venido trabajando iniciativas como CMMI o TSP/PSP o similares es muy probable que al aparecer un enfoque ágil, este se vea como una amenaza, debido a que muchas Organizaciones e incluso la academia han vendido durante años libros, cursos y costosas certificaciones con la promesa de que todo será mejor, que solo si alcanzas cierto nivel entraras a grandes ligas. Ante la adopción de prácticas o técnicas ágiles, estas se verán con cierto recelo por los promotores o líderes de dicha burocracia e intentarán atacarlas a toda costa con argumentos como: eso acá se hace de esta manera, eso es equivalente a esto, ¿para qué entregar software en periodos cortos sin la documentación necesaria?, ¿y que pasa con el cronograma?, ¿cómo sé el porcentaje de avance?, ¿y los riesgos?, ¡ahhh esas actividades se ven bonitas y por eso me llaman la atención!, adoptemos una buena matriz de riesgos, etc.</div>
<div style="text-align: justify;">
<br />
<div>
Cuando se intenta ajustar CMMI o TSP a SCRUM, aparecen ideas como: ¿en los SPRINTs hago las inspecciones, los diseños de alto nivel y detallados, el post-mortem lo puedo reemplazar, el registro de tiempos en el dashboard, los riesgos?. En general se busca acomodar dichos modelos como sea adoptándolos para que cumplan con lo que ya está definido y desde luego sin generar problemas.<br />
<br /></div>
</div>
<div style="text-align: justify;">
En la industria, en países y en general en diferentes contextos se han venido adoptando las prácticas ágiles porque se han comprobado con resultados. Sin embargo, cuando se intentan adoptar sin convicción se busca a toda costa la trampa, los argumentos rancios y sobre todo las posiciones con poca argumentación pero si con una actitud bélica (no puedo perder esta batalla) como: ¡no es necesario entregar software funcionando o una iteración no tiene porque tener entregas de valor! ¿qué es valor, acaso no es el tiempo, el alcance y el costo? ¡no es necesario que los miembros de un equipo de trabajo estén trabajando juntos!<br />
<br />
Aún es más difícil cuando empiezan las discusiones acerca de los principios ágiles. De igual forma hay Organizaciones que promueven certificaciones de SCRUM olvidando dichas bases acomodando sus intereses en actividades relacionadas con cursos, coaching, entre otros, olvidando la coherencia.<br />
<br /></div>
<div style="text-align: justify;">
En otros escenarios existen ciertos personajes que acomodan su discurso ágil, buscando fines publicitarios, de marketing o por cumplir con las exigencias de un Cliente; en términos generales se disfrazan pero en si son farsantes y no pueden sostener una mentira por mucho tiempo pues no tienen convicción. Estos a todo lo llaman ágil o SCRUM e incluso incrustan practicas o técnicas con aleaciones raras o hacen propias teorías o modelos ajenos; quizás en la vida han desarrollado una buena línea de código.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Cuando llega la discusión de las prácticas ágiles todo empeora, pues aparece TDD, integración continua, refactorización, programación por pares, entre otros, y alguien preguntará ¿y eso para qué si lo que yo necesito es SCRUM?. Ahí nace un problema serio pues se prioriza el management sobre las técnicas orientadas a la generación de buen código, saludable y duradero que en esencia son el fundamento de la corriente ágil.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Es obvio que en una empresa es complicado iniciar modelos ágiles arrancando todo a la vez, de la noche a la mañana; hay que decidir por dónde comenzar, pero no hay que olvidar la visión, el fin, los objetivos propuestos creyendo y aplicando lo que se profesa. En si, creo que debemos ser buenos artesanos de software adoptando las prácticas y técnicas que nos den más productividad (como XP) a la vez que implantamos a SCRUM, LEAN u otro modelo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Es probable que muchos hablen del ser práctico con frases de cajón como "lo perfecto es enemigo de lo oportuno", así funciona, da igual, pero definitivamente creo que debemos trabajar en lo que creemos y ser coherentes y no colocar sellos ágiles "made in" a cualquier cosa. Ejemplo: CMMI for Development 1.3 - Agile approach.<br />
<br />
Una recomendación: <a href="http://manifesto.softwarecraftsmanship.org/" target="_blank">Craftmanship manifesto</a><br />
<br />
<br />
<br /></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com3tag:blogger.com,1999:blog-7470233962230718324.post-4556419704187262762014-03-11T21:58:00.001-07:002014-03-12T05:31:45.945-07:00Living Agile Open Bogotá II<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Wyy-9-0i2P4/Ux_BkyAt6LI/AAAAAAAAE5o/KoUFRz34JlQ/s1600/1+Agile+Open+Bogot%C3%A1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Wyy-9-0i2P4/Ux_BkyAt6LI/AAAAAAAAE5o/KoUFRz34JlQ/s1600/1+Agile+Open+Bogot%C3%A1.jpg" height="237" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: justify;">
El pasado 8 de marzo se llevó a cabo el evento de la comunidad Ágiles Colombia en la ciudad de Bogotá. Fue otra gran ocasión para compartir, encontrar gente curiosa y de aprender nuevas cosas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al evento asistieron 150 personas que hacen parte del sector de empresas de desarrollo de software, estudiantes y desde luego, nuevos agilistas. Todos ellos con ganas de participar, escuchar o facilitar actividades relacionadas con SCRUM, principios ágiles, BDD, TDD, facilitación gráfica, entre otros temas.</div>
<div style="text-align: justify;">
</div>
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-0PuBh9s0EAk/Ux_FNrbrh5I/AAAAAAAAE50/kCTJN3ZmiNE/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-0PuBh9s0EAk/Ux_FNrbrh5I/AAAAAAAAE50/kCTJN3ZmiNE/s1600/3.jpg" height="213" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ETTDroJ61MQ/Ux_oedFUOfI/AAAAAAAAE7I/bkWTWbCOmDk/s1600/10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-ETTDroJ61MQ/Ux_oedFUOfI/AAAAAAAAE7I/bkWTWbCOmDk/s1600/10.jpg" height="213" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: justify;">
En mi caso, lo disfruté muchísimo desde el rol que desempeñé, o bueno, intenté desempeñar: facilitador gráfico. Definitivamente me apasiona, me gusta, me divierte; tuve el honor de facilitar la actividad de "Ágil en un contexto no ágil sin morir en el intento", gracias a @ccastanez y @antoniohdezj.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-r-wp71WRi5s/Ux_HDDXg4HI/AAAAAAAAE6A/J7kUl4TkV4M/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-r-wp71WRi5s/Ux_HDDXg4HI/AAAAAAAAE6A/J7kUl4TkV4M/s1600/4.jpg" height="240" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-53jjE_kb9rw/Ux_IVhg7CVI/AAAAAAAAE6M/Th3MnURJ6u0/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-53jjE_kb9rw/Ux_IVhg7CVI/AAAAAAAAE6M/Th3MnURJ6u0/s1600/5.jpg" height="213" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Creo que cada día que pasa hay más personas interesadas en encontrar formas de trabajar distintas, en las cuales se promueva la entrega de valor constante a negocio, la simplicidad, las relaciones humanas, la productividad, el trabajo del artesano y la cordialidad en contra de burocracias rancias que llevan a la lucha de poderes en el desarrollo de proyectos de construcción de software. </div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-2d1FVD3vfxM/Ux_fy2C_EWI/AAAAAAAAE6c/7-_5r4e7sm4/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-2d1FVD3vfxM/Ux_fy2C_EWI/AAAAAAAAE6c/7-_5r4e7sm4/s1600/7.jpg" height="200" width="133" /></a><a href="http://4.bp.blogspot.com/-xaOD9I29qgc/Ux_f0SLjDBI/AAAAAAAAE6k/gzkyDKq_K4g/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-xaOD9I29qgc/Ux_f0SLjDBI/AAAAAAAAE6k/gzkyDKq_K4g/s1600/2.jpg" height="200" width="133" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Creo al igual que @luismulato que el gran ausente fue la academia, hace falta que se vinculen y que se incluyan ejes temáticos relacionados con prácticas ágiles; hasta el SEI incluyó <a href="http://repository.cmu.edu/cgi/viewcontent.cgi?article=1278&context=sei" target="_blank">CMMI for Development Agile</a> e incluso el <a href="http://www.pmi.org/Certification/New-PMI-Agile-Certification.aspx?WT.mc_id=agilehomepage1213" target="_blank">PMI tiene un modelo ágil</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bueno, y de lo aprendido, definitivamente el poder que brinda la <a href="http://www.gamificacion.com/" target="_blank">gamificación</a>. Es sorprendente cómo a través de juegos, dinámicas y actividades se pueden alcanzar objetivos concretos.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-YMobTV-66v4/Ux_m5WtLkkI/AAAAAAAAE60/rHGwhBCzL-A/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-YMobTV-66v4/Ux_m5WtLkkI/AAAAAAAAE60/rHGwhBCzL-A/s1600/8.jpg" height="213" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Quedé con una grata impresión de la facilitación gráfica de la actividad "Erase una vez SCRUM", que buen trabajo.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-yqYMJGb_jro/Ux_ndBrXCXI/AAAAAAAAE68/LFYgwxU6BNs/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-yqYMJGb_jro/Ux_ndBrXCXI/AAAAAAAAE68/LFYgwxU6BNs/s1600/9.jpg" height="213" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Gracias por la invitación y por el material fotográfico suministrado por la comunidad de Ágiles Colombia. Nos vemos en el #AgileOpenCartagena el próximo 7 de junio de 2014. </div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com0tag:blogger.com,1999:blog-7470233962230718324.post-1878635060844910742014-03-06T18:14:00.001-08:002014-10-29T09:13:22.381-07:00Arquitectura en proyectos ágiles<div style="text-align: justify;">
Esta entrada pretende mostrar cómo se pueden implementar arquitecturas ágiles en los proyectos con el fin de disminuir riesgos que se transformen luego en <a href="http://blog.3back.com/scrum-questions/so-what-is-technical-debt-in-scrum-anyways/" target="_blank">deudas técnicas</a> impagables. El punto de partida es la afirmación de que "las mejores arquitecturas emergen de equipos auto organizados".</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-prnLXxlQoBo/UxhjEBjbyVI/AAAAAAAAEw0/TGCrUMzdYqc/s1600/A1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-prnLXxlQoBo/UxhjEBjbyVI/AAAAAAAAEw0/TGCrUMzdYqc/s1600/A1.png" height="132" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
Es claro que en el enfoque tradicional, el diseño de arquitecturas se enmarca en la producción de mega modelos que tienen como fin entrar al detalle en todos los elementos funcionales y técnicos requeridos para el desarrollo <a href="http://www.agilemodeling.com/essays/bmuf.htm" target="_blank">BDUF</a>. Se busca encontrar la piedra filosofal que asegure el éxito de un proyecto determinando todas las vistas (<a href="https://drive.google.com/file/d/0B9tuhSHftxTaTnNneDJDb2tBYTA/edit?usp=sharing" target="_blank">pe, 4+1</a>) posibles para el diseño de un proyecto de software.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a><br /></div>
<div style="text-align: justify;">
Los arquitectos de software buscan cuadrar el rubik de tal forma que sea innegable, creando muchas veces <a href="http://www.agilemodeling.com/essays/agileArchitecture.htm" target="_blank">arquitecturas de marfil</a>. Estas son aquellas que en el papel lucen muy bien pero que en la práctica son difíciles de llevar a cabo, como lo argumenta Scott Ambler en el enfoque de <a href="http://www.agilemodeling.com/" target="_blank">Agile Modeling</a>. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En muchos casos dichas arquitecturas terminan siendo un número elevado de documentos que se almacenan en archivadores o se apilán en anaqueles. Por eso la afirmación de que las mejores arquitecturas emergen de equipos auto organizados, que se enfoca en hacer actividades de diseño que realmente generen valor ha tomado fuerza.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Sin embargo, la práctica muestra que para que eso se dé, se requieren profesionales expertos que tengan la capacidad de visionar cómo evolucionarán los componentes de software y cómo se relacionarán. Esto no es fácil, a menos que tengas en tu equipo a Kent Beck o a Martin Fowler, entre otros, con cicatrices de guerra de años que saben que decisión tomar en las iteraciones de implementación. Es claro que en frameworks como SCRUM existen tareas técnicas (SPIKE) que se determinan en el SPRINT BACKLOG; sin embargo el enfoque es específico en las funcionalidades y muchas veces se pueden realizar re trabajos o exageradas y costosas refactorizaciones.<br />
<br /></div>
<div style="text-align: center;">
<a href="http://2.bp.blogspot.com/-7NGJHkBch6s/UxhjS6KDP_I/AAAAAAAAExE/vtMHba_J9ZA/s1600/A3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-7NGJHkBch6s/UxhjS6KDP_I/AAAAAAAAExE/vtMHba_J9ZA/s1600/A3.png" /></a></div>
<div style="text-align: justify;">
<br />
<span style="background-color: #d0e0e3;">Lo anterior lo menciono porque garantizar la extensibilidad y la mantenibilidad es el gran éxito de un buen diseño: prepararse para el cambio. "Dime que tan buena es tu diseño de software/arquitectura si al hacer un cambio no hay una reacción en cadena que afecte todo el sistema", es lo que promueve Bob Martin en <a href="https://drive.google.com/file/d/0B9tuhSHftxTaR0NpTGRxTmVBUkU/view?usp=sharing" target="_blank">Design Principles and Design Patterns</a> como el concepto de que tan bien huele el software.</span><br />
<br />
Cuando se abarcan totalmente labores de diseño en los SPRINTS se corre el riesgo de adquirir <a href="http://msdn.microsoft.com/es-es/magazine/ee819135.aspx" target="_blank">deudas técnicas</a>. Esto ocurre porque el énfasis está en implementar entregas de software que generen valor constante al negocio y no la generación de componentes de software que promuevan la reutilización, el mantenimiento y la extensibilidad porque desarrollamos funcionalidades concretas; no tenemos tiempo de pensar cómo ésta encajaría si diseñásemos una aplicación más amplia y nos centrásemos en construir una solución escalable y robusta.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Al no promoverse actividades de definición de arquitectura en etapas tempranas, incluso antes de elaborar un PROCESS BACKLOG, no se tiene una visión de cómo se van a crear componentes de forma ordenada, que eviten la redundancia de funcionalidades y desde luego que soporten los aspectos más relevantes no funcionales. En general, un modelo arquitectónico capaz de escalarse, de soportar el manejo de recuperación ante fallos y de brindar un desempeño adecuado que pueda soportar las funcionalidades a entregar.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-UJ5rPOf36n8/UxhjNG4uiJI/AAAAAAAAEw8/q_1ebOBcx0g/s1600/A2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-UJ5rPOf36n8/UxhjNG4uiJI/AAAAAAAAEw8/q_1ebOBcx0g/s1600/A2.png" height="217" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Con lo anterior, no quiero argumentar que con los enfoques en cascada no se tengan deudas técnicas, porque a pesar de que se dedica un gran esfuerzo al comienzo, nadie tiene una bola de cristal tan poderosa para predecir lo que irá pasando en un proyecto de construcción de software. Al comienzo, el equipo inicia respetando lo pactado pero al final, el enfoque de dirección de proyecto clásico obliga a que se mantengan fechas aunque se reduzcan tiempos sacrificando la calidad y por lo tanto se adquieren deudas técnicas.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Creo que es necesaria la definición temprana de una arquitectura que realmente ayude a reducir la incertidumbre de un proyecto de construcción de software. Esta, debe ser práctica definiendo una visión de alto nivel sin entrar en detalles irrelevantes que no aporten valor real en las iteraciones de construcción; no es un simple SPRINT 0 (<span style="background-color: #cfe2f3;">de hecho no me gusta esta afirmación porque no entiendo un SPRINT que no entrega algo funcionando y que le brinde valor al patrocinador de un proyecto</span>), es más que eso, es el aseguramiento de los aspectos no funcionales.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
En esa fase previa de arquitectura que recibe los insumos funcionales que componen un PROCESS BACKLOG, se elaboran talleres de atributos de calidad ágiles <a href="https://www.sei.cmu.edu/architecture/tools/establish/qaw.cfm" target="_blank">QAW</a>, que están orientados a la captura de aspectos no funcionales que se asocian a las funcionalidades definidas. Estos atributos incluyen: desempeño, escalabilidad, fiabilidad, extensibilidad, seguridad, autonomía, etc. <span style="background-color: #cfe2f3;">Estos se pueden capturar en el momento en que se elaboran los criterios de aceptación, quizás luego de terminar un Visual-story-mapping y luego podrán verificarse a través de pruebas automatizadas.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Hablo de un taller ágil en el cual se haga énfasis en la captura de restricciones y atributos de calidad que permitan definir escenarios de calidad. El objetivo es la captura de datos relevantes con postits de parte de los participantes en el taller en vez del llenado de formatos engorrosos que distraen a los invitados.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Fs_vCe-iA6U/UxhjXsxg_1I/AAAAAAAAExM/TzcWfcbtMcM/s1600/A4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Fs_vCe-iA6U/UxhjXsxg_1I/AAAAAAAAExM/TzcWfcbtMcM/s1600/A4.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Es importante aclarar que no estoy proponiendo que se sigan los pasos completos propuestos por <a href="https://www.sei.cmu.edu/architecture/tools/establish/qaw.cfm" target="_blank">QAW</a>, solo los que aporten algo. Sin embargo, creo que el enfoque debe invitar a la participación de los diferentes roles que interviene en el taller: negocio, infraestructura, seguridad, arquitectura, etc.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Con la definición de los drivers de arquitectura se podrá elaborar un diseño de alto nivel HLD que incluya vistas del tipo <a href="http://www.sei.cmu.edu/architecture/tools/document/viewsandbeyond.cfm" target="_blank">Views&Beyond</a> <span style="background-color: #d0e0e3;">o algún modelo o dibujo que sea entendido por el equipo de desarollo que le sirva de horizonte.</span> El objetivo es crear un modelo lógico que cumpla con los drivers y que ayude a identificar los componentes a implementar en la solución, definiendo sus responsabilidades, estilos de comunicación, protocolos, formatos de mensajería, decisiones de realización <span style="background-color: #d0e0e3;">básicos</span>, entre otros aspectos.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
También se contempla la definición de un modelo físico que garantice que se soportará la carga transaccional de accesos concurrentes y de almacenamiento <span style="background-color: #d0e0e3;">para las primeras iteraciones.</span> <span style="background-color: #f4cccc;">Eliminé esto: Por último, es fundamental crear una vista dinámica que muestre como se enlazan los componentes de alto nivel definidos, sin entrar en muchos detalles innecesarios</span>.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
En cuanto al modelamiento, comparto plenamente el enfoque de dibujos en tableros y en papel que puedan ser capturados en fotografías <a href="http://www.agilemodeling.com/essays/whiteboardModeling.htm" target="_blank">POW</a>, en vez de la gestión de sofisticados modelos UML engorrosos; <span style="background-color: #d0e0e3;">un simple dibujo basta si el equipo así lo entiende</span>. En general, me gusta mucho el enfoque de <a href="http://www.agilemodeling.com/essays/agileArchitecture.htm" target="_blank">Agile Modeling</a> que promueve el diseño de arquitecturas prácticas que evitan entrar en detalles poco pertinentes, como un diseño detallado DLD que pueden ser superados con la aplicación de <a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas" target="_blank">TDD</a>.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Es fundamental definir las principales decisiones de arquitectura <span style="background-color: #d0e0e3;">básicas requeridas para las primeras iteraciones</span> que tendrá un producto de software, contemplando alternativas con los respectivos puntos a favor y en contra hasta llegar a pruebas de concepto que validen que dichas decisiones son válidas.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
En general, es indispensable en proyectos ágiles contemplar etapas previas de arquitectura de alto nivel <span style="background-color: #d0e0e3;">que proporcionen valor al equipo de trabajo y al cliente</span> que ayuden a dimensionar la infraestructura, la identificación de componentes a implementar en un proyecto y la disminución de la incertidumbre técnica. Con esto, creo que las deudas técnicas deben disminuir.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: #d0e0e3;">Sin embargo, no es una camisa de fuerza "no hay verdades absolutas", porque estoy seguro que todos los proyectos no tienen las mismas complejidades o quizás ya hemos ejecutado proyectos similares y en esos casos no considero relevante hacer actividades de arquitectura antes de arrancar el primer SPRINT.</span></div>
<div style="text-align: center;">
<br /></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com3tag:blogger.com,1999:blog-7470233962230718324.post-75273506241489549602013-11-15T06:11:00.003-08:002013-11-21T13:24:18.254-08:00Pop Art<div style="text-align: justify;">
Bueno, no todo puede ser tecnología; en esta entrada quiero mostrar algo que me apasiona, la pintura artística. Desde que era un niño siempre me apasionó, me encanta, me da el mismo placer que tomarme un buen vino.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-KSe8uCQaCw0/UoYnzG_hKjI/AAAAAAAAEWw/rnLAldSUFZ8/s1600/ArtPop-Tot.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://4.bp.blogspot.com/-KSe8uCQaCw0/UoYnzG_hKjI/AAAAAAAAEWw/rnLAldSUFZ8/s640/ArtPop-Tot.jpg" width="467" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<a name='more'></a><br /><br />
<div class="separator" style="clear: both; text-align: justify;">
Les comparto algo de arte pop que tengo en mi casa, que es uno de los movimientos artísticos que más me apasiona junto al surrealismo de Dalí. La pintura fue elaborada por un amigo que no veo hace mucho tiempo <a href="http://www.giovannysancheztot.com/" target="_blank">TOT</a> (<a href="http://www.eltiempo.com/entretenimiento/arte/ARTICULO-WEB-NEW_NOTA_INTERIOR-9670324.html" target="_blank">Giovanni Sánchez</a>) porque creo que todavía debe estar estudiando en Japón, aprovechando una beca que se ganó hace unos años para mejorar sus técnicas para hacer graffitis (jajaja).</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Jih-AQdiEYg/UoYrM0XA0TI/AAAAAAAAEXE/S_mCnqPokcc/s1600/dali.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://3.bp.blogspot.com/-Jih-AQdiEYg/UoYrM0XA0TI/AAAAAAAAEXE/S_mCnqPokcc/s320/dali.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-rR6e_Ad8y7w/UoZXu9FsHHI/AAAAAAAAEYQ/bscvwHLDfkU/s1600/ToT.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-rR6e_Ad8y7w/UoZXu9FsHHI/AAAAAAAAEYQ/bscvwHLDfkU/s1600/ToT.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: inherit;">El arte pop es un movimiento considerado aún modernista y tiene como máximo exponente a Andy Warhol. El arte pop como la música pop, buscaba utilizar imágenes populares en oposición a la elitista cultura de los movimientos anteriores, separándola de su contexto y aislándolas o combinándolas con otras y a menudo se resalta el uso de la ironía.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ZUgz6M1HzkI/UoYqof3cYDI/AAAAAAAAEW8/qg3rxXnCLCM/s1600/pop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-ZUgz6M1HzkI/UoYqof3cYDI/AAAAAAAAEW8/qg3rxXnCLCM/s1600/pop.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
¿Les gustan los graffitis artísticos? ¿qué opinan?</div>
<div style="text-align: center;">
<br /></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com0tag:blogger.com,1999:blog-7470233962230718324.post-81050011645562644152013-11-01T21:19:00.001-07:002014-03-17T12:48:17.942-07:00Camino a la agilidad para BPM Ágil<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-bJM8V0rfhFw/UnR8VG3JYDI/AAAAAAAAET8/fm34EyarPmE/s1600/Bpm-agil_01(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-bJM8V0rfhFw/UnR8VG3JYDI/AAAAAAAAET8/fm34EyarPmE/s400/Bpm-agil_01(1).jpg" height="72" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Hace algunos años empecé a trabajar con proyectos relacionados con BPM. Sin embargo, debo admitir que nada tenían que ver con ese propósito, con esa meta, pues en realidad su enfoque estaba relacionado con la utilización de BPMS sofisticados en vez de orientarse a los verdaderos objetivos alineados a la <a href="http://gabrielmorrissa.blogspot.com/2013/08/bpmaas-realidad-o-falacia.html" target="_blank">operación por procesos</a> para la reducción de costos, desperdicios entre silos en las Organizaciones, mejorar los tiempos para ofrecer nuevos productos "time-to-market", responder a eventos de negocio a través de reglas de negocio, en general, la producción de valor real al Cliente final.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br />
<a name='more'></a><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Todo esto sucedía porque la forma como se afrontaron los proyectos estaban orientados desde un enfoque tecnológico y no de negocio. Digo esto, porque en fases de análisis de procesos BPA se capturaban en sí requisitos orientados a la construcción de software con extensas documentaciones que buscaban capturar el comportamiento de interfaces de usuario y de ejecuciones de flujos de trabajo workflow. Era prioritario la especificación de extensos formatos de casos de uso contemplando los diferentes escenarios y de igual forma los equipos de proyecto se enfocaban en la aprobación de un alcance invariable para implementarlo en un tiempo exacto con un control riguroso de riesgos ocasionando definiciones de meses e incluso de años.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Es importante anotar que el negocio en muchos casos fue secundario y lo que se construyó fueron componentes de software que seguían una moda promovida por los fabricantes más reconocidos en el mundo. En sí, se crearon sistemas de información novedosos, con otras interfaces de usuario, con pasos extensos a través de tareas humanas y en algunos casos hasta se produjo software que funcionaba, aunque nada tenía que ver con la mejora contínua de procesos.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Si existía un cambio desde el negocio era muy complicado que los equipos de desarrollo lo aceptaran, porque el riesgo era muy alto. Muchas veces al negocio se le negó la posibilidad de optimizar o de re inventar su operación porque el impacto era difícil de calcular y ocasionaba una negociación interminable de controles de cambio.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Las personas que intervenían en los proyectos se preocupaban más por las certificaciones de herramientas relacionadas con el BPMS que de conocer en qué consistía un modelo de BPM. Bueno, hoy en día esto sigue vigente y hay muchos profesionales ocupados en obtener una certificación en semanas que lo avale como un "experto".</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Kykpg7hJrf4/UnR8dDDcTWI/AAAAAAAAEUE/zC-kEEPdCNU/s1600/b2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Kykpg7hJrf4/UnR8dDDcTWI/AAAAAAAAEUE/zC-kEEPdCNU/s320/b2.png" height="242" width="320" /></a></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Conocí proyectos que implementarón hasta más de 30 procesos que nunca evolucionaron, nunca tuvieron mejora contínua, pues simplemente fueron un desarrollo de software a la medida sobre los juguetes de moda de aquella época. En general, se cumplió el desafío técnico (en algunos casos) pero nunca se mejoró el negocio o al menos el ROI no fue el esperado.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Conocí muchas Organizaciones que fracasaron en su intento de implementar "BPM" o más bien, fracasaron en la utilización de tecnologías o en el método como enfrentaron los proyectos. Se ocuparon en la generación de eternas especificaciones cuyo objetivo era conseguir la firma del Cliente para hacer un cierre funcional o en otros casos creyeron que la arquitectura de software a aplicar era la que proporcionaba un BPMS, grave error.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Muchas Organizaciones desecharon o no han considerado enfrentar proyectos con un enfoque BPM debido a grandes fracasos y a la pérdida de credibilidad que se ha generado. Cuidado, no quiero decir que el uso de herramientas BPMS sea innecesario, para nada, pero si pretendo argumentar que para enfrentar un proyecto de BPM lo primero es el negocio, la optimización continua, la gestión del cambio "hacer que las cosas pasen", </span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">una arquitectura práctica y agnóstica que de respuesta a lo que una Organización requiere</span></span> y las herramientas que serán un medio que permitan estructurar e implementar las decisiones y diseños de arquitectura previamente definidos.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">En general, se ejecutaron muchos proyectos fallidos con un enfoque pobre de mejoramiento continuo, con software rígido, inmutable, inmóvil y viscoso, que ante el cambio o un nuevo mantenimiento producían comportamientos anormales y reacciones en cadena, da miedo extenderlos o modificarlos.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Por todo lo anterior, e</span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">n los proyectos de automatización es crítico soportar el cambio constante, porque así son los negocios, las Organizaciones,las personas, nada es inmutable. El cambio es frecuente y por tal motivo es necesario dar respuesta a esa necesidad a través de prácticas y técnicas simples que permitan agilizar la definición y captura de funcionalidades y de igual forma el diseño de arquitecturas sostenibles en el tiempo que puedan ser construidas de forma incremental.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">He experimentado en varios proyectos el trabajo con un BPA (análisis de procesos de negocio) ágil enfocado en el mejoramiento continuo y en la captura de un conjunto de funcionalidades asociadas que ayuden a acercarse a la visión del proceso establecido. Aquí se implementan los análisis AS-IS y TO-BE con el diseño de procesos de alto nivel (PHLD) para evitar entrar en detalles innecesarios que se pueden abordar en fases de implementación.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">En el BPA también he ejecutado <a href="http://gabrielmorrissa.blogspot.com/2014/03/arquitectura-en-proyectos-agiles.html" target="_blank">actividades de arquitectura</a>, con talleres ágiles de atributos de calidad, con la elaboración de decisiones de arquitectura basándose en escenarios y alternativas con el fin de concluir con diseños de alto nivel HLD con un acercamiento guiado por el <a href="http://www.agilemodeling.com/essays/agileArchitecture.htm" target="_blank">modelamiento ágil</a>. Me encantaría que el mito de que en los <a href="http://www.agilemodeling.com/essays/whiteboardModeling.htm" target="_blank">modelos ágiles</a> no se hace arquitecturas quede cerrado, pues es claro que un proceso siempre estará evolucionando y es necesario estructurarlo bien para que en los ciclos de desarrollo se elaboren buenos diseños detallados DLD.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Algo de lo que he experimentado es el enfoque a talleres con el uso del papel y el lápiz como las principales herramientas para involucrar a personas de negocio y de tecnología. Nada más aburrido que alguien con un laptop capturando ideas, definiciones, comentarios o conceptos ocasionando que el trabajo sea poco divertido, poco creativo, sin un enfoque de gente trabajando para generar procesos para que los utilice gente.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Al finalizar el BPA ágil, una Organización conocerá cómo un proceso podrá evolucionar al definirse una pila con prioridades de ítems funcionales denominada ProcessBacklog. Para llegar a la definición de esta pila se realizan actividades previas de estimación de muy alto nivel, la estructuración de criterios de aceptación y la generación de releases.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Si la Organización cambia, o el negocio crea nuevos productos o si las regulaciones externas cambian no habrá problema, pues el cambio será bienvenido. El dueño del proceso ProcessOwner decidirá las prioridades teniendo en cuenta las necesidades y las oportunidades que el mercado demande "driven-marketing".</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para las fases de implementación se aplican adaptaciones de SCRUM para la ejecución de cada uno de los release definidos en el BPA, produciendo procesos guiados por la disciplina de BPM en tiempos cortos, Sprints de máximo mes y medio que para este tipo de iniciativas es más que aceptable.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Definitivamente para las Organizaciones la agilidad respondiendo con entregas de software funcionando en tiempos cortos es vital, y por eso la utilización de diferentes técnicas ágiles y de un proceso SCRUM adaptado para las implementaciones de acuerdo a las necesidades de cada proyecto es una forma de responder a esas necesidades.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Ante la perdida de credibilidad, una alternativa viable y posible para las Organizaciones es la implementación de <a href="http://gabrielmorrissa.blogspot.com/2013/08/bpmaas-realidad-o-falacia.html" target="_blank">procesos en la nube BPMaaS</a>
con el fin de no hacer una inversión inicial con riesgos en activos de
tecnología. Es importante aclarar que un BPMaaS no son las herramientas
proporcionadas por un fabricante en la nube, porque eso sería un
PaaS/BoP para procesos sino la implementación de procesos entre empresas
con una plataforma común.</span></span> </span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">En una próxima entrada hablaré un poco de mi experiencia en cómo estructurar un proceso ágil para un proyecto BPM utilizando diferentes técnicas en las fases de BPA y de desarrollo D-BPM: ImpactMapping, Visual Story Mapping, Value Stream Mapping, User Stories Workshops, QaW ágil, criterios de aceptación (Given-When-Then), talleres para la captura de reglas de negocio, estimaciones, releases y artefactos de arquitectura, BTDD, ATDD, TDD, entre otros.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">¡Un saludo!</span></span></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com7tag:blogger.com,1999:blog-7470233962230718324.post-83007822414200811092013-10-16T10:14:00.001-07:002013-11-21T13:23:07.478-08:00Muchos caciques y pocos desarrolladores<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hace poco alguien me decía que había evolucionado bastante, que ya no desarrollaba y que dirige proyectos, que es todo un PMP. Casi me pega cuando le mencioné que yo siempre voy a ser un desarrollador, aunque lamentablemente cada vez lo hago menos. </span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">No me creía cuando le conté que cuando trabajé en unos proyectos en Brasil, el que más ganaba era el tester. Varios se han reído de esa anécdota, pues de inmediato me recuerdan que ese "recurso" debe ser un practicante o un bachiller ávido de conocimiento que ejecute checklists. Falso, el tester no solo hace pruebas, afina y recomienda refactorizaciones, evalúa el comportamiento en ejecución a través de telemetrías, en general tiene cicatrices de guerra, no come cuentos.</span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">En otros escenarios me he enfrentado a discursos acerca del recurso, de fábricas de software, de métricas sofisticadas, de planes tipo bola de cristal, de látigo, como si los desarrolladores de software fueran unos chimpancés que se pueden llevar a alta mar para reducir tributos para que entreguen piezas de software similares a chaquetas o camisas. Que hacemos, el software es arte, lo demás son enfoques comerciales que buscan demostrar teorías de modelos de madurez o medir cuantas veces un "recurso" entra al baño para ser más productivo o contabilizar las líneas de código generadas.</span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">En otros escenarios se muestra a super expertos que se muestran así por certificaciones alcanzadas, expertos de un año de experiencia y 6 meses de manejo de una herramienta. ¿Qué pasará si cambian la herramienta? ¿Si cambian las tácticas, las estrategias, los patrones a aplicar? ¿Será que es mejor tener criterio que un discurso acartonado y poco original? Bien dice el antipatrón de <a href="http://c2.com/cgi/wiki?VendorLockIn" target="_blank">dependencia del vendedor</a> que si su arquitectura son herramientas implicará que no tienes arquitectura.</span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Otras cosas del hoy, bueno y del ayer es el fastidio a ensuciarse las manos con código miserable. Se buscan más niveles de abstracción olvidándose de niveles subyacentes. Por ejemplo: uso JSF según san X vendedor como <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank">MVC</a>, uso como <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a> a <a href="http://www.hibernate.org/" target="_blank">hibernate</a>, etc. ¿Qué pasa si ocurre un error en estas APIS? ¿Cómo lo resolvemos? ¿Cómo afinamos las consultas? ¿Cómo evitamos introspecciones innecesarias? ..... otro ejemplo es el uso de flujitos, dibujitos con herramientas que generan código; ¿y si fallan, y si el desempeño no es el esperado?</span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Hace unos meses un desarrollador tuvo un problema elaborando un servicio Web (mal llamado servicio). La afirmación del personaje era, "no funciona", sin entrar en detalles. El problema consistía en que no seguía un estándar simple de <a href="http://docs.oracle.com/javase/tutorial/javabeans/" target="_blank">JavaBeans</a> acerca de gets y sets para un bean, ¿Qué pasó? Simple, nos volvimos herramienta dependientes, framework dependientes y nos olvidamos de los fundamentos.</span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Creemos por ejemplo que un ESB es una herramienta o que un servicio es un servicio Web; simple, los fabricantes necesitan vender y ese es un discurso fácil de mostrar y de aprender por figuras comerciales. Por ejemplo, el ESB es un concepto, una estrategia, una capa de integración, una guía de arquitectura compuesta de patrones de integración siguiendo un manejo stateless con gestión de recursos orientados a la conectividad, que puede ser implementado a conveniencia y a la medida, no es la super herramienta que centraliza todo el procesamiento de transformaciones o adaptaciones. </span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Bueno, y ¿los arquitectos qué? En mi opinión son necesarios. Éstos deben proporcionar decisiones de arquitectura teniendo como base pruebas de concepto PoC, decisiones de diseño de alto nivel HLD que impliquen su desarrollo así como el cumplimiento de restricciones y de los principales aspectos no funcionales. Sin embargo, no creo en <a href="http://www.agilemodeling.com/essays/agileArchitecture.htm" target="_blank">arquitecturas de marfil o BDUF</a>, pues muchas decisiones de diseño detallado se determinan en el día a día, en<a href="http://www.agilemodeling.com/essays/whiteboardModeling.htm" target="_blank"> el tablero</a> no en modelos que desencadenen generadores de código. Es necesario un dueño de la arquitectura, un <a href="http://www.agilemodeling.com/essays/agileArchitecture.htm" target="_blank">Architect Owner</a>.</span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Otro punto clave es que conozco muchos casos de empresas de ciudad gótica en donde a las personas de negocio les molesta trabajar con personas de áreas de tecnología. Lo anterior porque ven que no les ofrecen implementaciones que realmente produzcan valor para el negocio, prácticas, sencillas, en tiempos cortos y que den solución a su problemática.</span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">En conclusión, nos preocupamos por el cuidado de la caja, del tiempo, del presupuesto y del alcance, pero no en la generación de valor hacia el cliente quien es finalmente el más interesado en el software, si este le proporciona beneficios. En resumen, es necesario buenos desarrolladores con amplia experiencia, con criterio, que en muchos casos son conocidos como arquitectos de aplicaciones.</span></div>
<div dir="ltr">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Creo que en países hispano parlantes todos quieren ser abogados, gerentes de proyectos, médicos, pero pocos quieren ser maestros en una actividad específica. De igual manera pasa con los desarrolladores, pues todos quieren ser directores de proyectos o arquitectos en pocos meses.</span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Espero no herir susceptibilidades ni establecer opiniones fanáticas, es una opinión muy personal: mucho cacique y poco desarrollador.</span></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com27tag:blogger.com,1999:blog-7470233962230718324.post-43545199296561420532013-08-24T07:29:00.002-07:002014-05-06T19:10:48.313-07:00BPMaaS - Realidad o Falacia<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-0mHZ4CB7PRs/UhdQr4RsU6I/AAAAAAAADSA/lSU19fZmIow/s1600/a2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-0mHZ4CB7PRs/UhdQr4RsU6I/AAAAAAAADSA/lSU19fZmIow/s640/a2.jpg" height="285" width="400" /></a></div>
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"><b>Resumen</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-vFO_Zz1Pkqs/UhfRKenSFVI/AAAAAAAADVA/wYcGS5YLbLs/s1600/timeout.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Este artículo tiene por objetivo brindar un acercamiento al concepto de BPMaaS (Business Process Management as a Service) mostrando los beneficios de negocio y el gran desafío de arquitectura de software en la nube al que se puede enfrentar un proyecto con este enfoque. Además, mostraré cómo resolver algunos puntos técnicos a través de algunas tácticas y estrategias de implementación de software.</span><br />
<br />
<a name='more'></a><br />
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"><b>Antecedentes</b></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Comenzaremos con algunas definiciones de procesos: </span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">"Un proceso es una concatenación lógica de actividades que cumplen un determinado fin, a través del tiempo y lugar, impulsadas por eventos" </span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-small;"><span style="background-color: white; display: inline ! important; float: none; font-family: 'Trebuchet MS',sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><a href="http://www.amazon.com/BPM-Management-Fundamentos-Implementaci%C3%B3n-ebook/dp/B008GN329O" target="_blank">Bernhard Hitpass</a><span class="Apple-converted-space"><span style="font-family: Arial,Helvetica,sans-serif;">.</span></span></span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="background-color: white; display: inline ! important; float: none; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><span class="Apple-converted-space">"Un proceso de negocio es un conjunto de actividades que toman uno o más inputs y crean outputs que son de valor para un cliente"</span></span></span></span></div>
<div style="text-align: justify;">
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="background-color: white; display: inline ! important; float: none; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><span class="Apple-converted-space">Un aspecto clave en el modelo de procesos es entender que un proceso es diferente a un proceso de negocio. Un proceso se enfoca en algo específico (un modelo de producción, logístico, de marketing, de servicio al cliente, etc), mientras que un proceso de negocio tiene por objetivo la interacción con un cliente, en donde este produce un (os) estimulo y espera una respuesta en pasos intermedios y al final una entrega de valor.</span></span></span></span><br />
<br />
<div style="text-align: center;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="background-color: white; display: inline ! important; float: none; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><span class="Apple-converted-space"><a href="http://1.bp.blogspot.com/-SE2-790RMtQ/UhjAUm9wu3I/AAAAAAAADVQ/_gh2KQmgHIk/s1600/gestionde_opor.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-SE2-790RMtQ/UhjAUm9wu3I/AAAAAAAADVQ/_gh2KQmgHIk/s320/gestionde_opor.jpg" height="320" width="235" /></a> </span></span></span></span></div>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="background-color: white; display: inline ! important; float: none; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><span class="Apple-converted-space">Ejemplos de procesos de negocio: <span style="font-size: x-small;">solicitudes de créditos, préstamos, devoluciones, compra de pasajes, procesos de reclamos, elaboración de ofertas, etc.</span></span></span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="background-color: white; display: inline ! important; float: none; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><span class="Apple-converted-space"><br /></span></span></span></span>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="background-color: white; display: inline ! important; float: none; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><span class="Apple-converted-space">Los procesos de negocio se relacionan fuertemente con BPM con el fin de buscar la mejora de la entrega de valor hacia los clientes de una o varias Compañías con un modelo único que permita diferenciar a una Organización de las demás brindando ventaja competitiva.</span></span></span><span style="font-size: small;"> </span>Pero, ¿BPM son las herramientas de automatización?, ¿una moda?, ¿una desviación a la reingeniería de procesos?. </span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para dar respuesta a las preguntas anteriores, voy a comenzar hablando de los antecedentes de los modelos precursores del BPM, iniciando con la reingeniería de procesos.</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-cEBeBXa8j8k/UhjA-tSZ4PI/AAAAAAAADVY/_ZwH3vAPf2M/s1600/antecedentes.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-cEBeBXa8j8k/UhjA-tSZ4PI/AAAAAAAADVY/_ZwH3vAPf2M/s640/antecedentes.jpg" height="200" width="640" /></a></div>
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"></span>La reingeniería busca atacar las estructuras jerárquicas funcionales y la alineación a los objetivos de negocio buscando resultados muy buenos a corto plazo apoyándose en la incorporación de tecnologías de la información. La reingeniería es el primer enfoque end-to-end para la introducción de la gestión por procesos de negocios transversales a las Organizaciones funcionales centradas en las necesidades del cliente y no en las de producción, pero esto no funcionó muy bien pues se ocupó principalmente en proyectos de racionalización de recursos para la disminución de personal, perdiendo el foco de agregación de valor para el cliente.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">De igual forma en los 80's aparecieron modelos como el <a href="http://www.6ixsigma.org/" target="_blank">Six Sigma</a> con una guía de calidad total, el </span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">mejoramiento continuo a través de <a href="http://es.wikipedia.org/wiki/Kaizen" target="_blank">Kaizen </a>"hoy mejor que ayer, mañana mejor que hoy", </span>el modelo de producción de <a href="http://www.lean.org/" target="_blank">LEAN</a> orientado a la optimización del flujo de equipos y elementos que trabajan con un mismo fin buscando eliminar desperdicios o pasos que no agregan valor.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span>
<span style="font-family: Arial,Helvetica,sans-serif;">En los 90's los <a href="http://en.wikipedia.org/wiki/Enterprise_resource_planning" target="_blank">ERP</a>'s se vendieron como la salvación para resolver muchos de los problemas de las Organizaciones con el fin de mejorar la eficiencia administrativa y la eficacia en los procesos de negocio. Sin embargo, estas soluciones no generaron lo que se esperaba, ni brindaron valor en cuanto al cliente sino mejoras administrativas y orden en cuanto a datos, pero no en lo relacionado a procesos de negocio pues no brindan una mejora que pueda diferenciar a una Organización de otras.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">BPM es una evolución de la ingeniería de procesos <span style="font-size: x-small;">(Frederick Taylor 1911)</span>, la <a href="http://es.wikipedia.org/wiki/Reingenier%C3%ADa_de_procesos" target="_blank">reingeniería</a>, <a href="http://www.6ixsigma.org/" target="_blank">Six Sigma</a>, a través de la gestión por procesos como disciplina buscando alineación con la estrategia de una Organización.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-HlH-ipV8mU8/UhjB6HjlJhI/AAAAAAAADVk/8BQhYBuCz5A/s1600/proc_negocio.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-HlH-ipV8mU8/UhjB6HjlJhI/AAAAAAAADVk/8BQhYBuCz5A/s400/proc_negocio.jpg" height="152" width="400" /></a></div>
<div style="text-align: center;">
</div>
<span style="font-family: Arial,Helvetica,sans-serif;">Otro aspecto importante es entender que no es lo mismo gestión de o por procesos. Cuando nos referimos a gestión de procesos, se entiende en gestionar un proceso específico para revisar su operación (análisis, reducción de tiempos, y medición. entre otros), mientras que la gestión por procesos incluye la planificación y el alineamiento a la estrategia de una Organización porque a través de ellos esta se puede habilitar con la integración de tecnología.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">La <a href="http://es.wikipedia.org/wiki/Reingenier%C3%ADa_de_procesos" target="_blank">reingeniería </a>es un precursor del BPM pues incluye lo anterior agregándole el cumplimiento de los objetivos de negocio y la alineación con tecnología informática. Jestos y Nelis [<a href="http://www.sgb.gov.tr/Kontrol%20Standartlar/Dok%C3%BCmanlar/Yararlan%C4%B1lan%20Yabanc%C4%B1%20Yay%C4%B1nlar/Business%20Process%20Management%20Practical%20Guidelines%200750669217.pdf" target="_blank">JestonNelis08</a>] suministran la siguiente definición: </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">BPM es: <span style="font-size: x-small;">mas que solo software, mas que solo la mejora o la reingeniería de los procesos, no es solo una moda, es parte integral del management, más que solo levantamiento y modelado de procesos, también es la implementación y ejecución de procesos los cuales requieren ser analizados y mejorados.</span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-small;"><span style="font-size: small;">BPM tiene los siguientes factores críticos:</span> el logro de la estrategia Organizacional, la organización está alineada con los procesos end-to-end y los objetivos están alineados con la estrategia Organizacional. </span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Para revisar en detalle más conceptos de BPM se puede ingresar a la Asociación Internacional de Profesionales de PBM (<a href="http://www.abpmp.org/" target="_blank">ABPMP</a>). Esta organización incluye el BPM Body of Knowledge que agrupa un modelo formal de conocimiento.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Por último, es fundamental tener claro
que automatización no es igual a BPM. Cuando en una Organización se
realiza una automatización de un proceso, esta se puede elaborar con
plataformas convencionales de desarrollo de software como <a href="http://es.wikipedia.org/wiki/Java_EE" target="_blank">JEE</a>, .<a href="http://es.wikipedia.org/wiki/Microsoft_.NET" target="_blank">NET</a> o incluso con <a href="http://es.wikipedia.org/wiki/COBOL" target="_blank">COBOL</a>, buscando automatizar tareas o actividades que ejecutan humanos. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span>
<span style="font-family: Arial,Helvetica,sans-serif;">Cuando
implementamos procesos siguiendo un modelo BPM nos enfrentamos a
plataformas que integran un conjunto de herramientas que permiten
modelar el proceso en notaciones estandarizadas como el BPMN con el fin
de ejecutarlas en motores de ejecución, en sistemas de reglas de negocio
BRMS, de monitoreo de actividades de negocio BAM y en general en
sistemas creados para la gestión de procesos de negocio BPMS de vendedores de plataforma como IBM, Oracle, Bizagi, Pegasystems, Intalio, Bonitasoft, Appian, entre otros.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Y el BPMaaS ¿cómo juega?</b></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El BPMaaS como servicio permite diseñar procesos de negocio únicos con fines específicos para vincular los sistemas de entrega de valor multi-empresa que en el pasado no era factible que trabajaran juntos a través de un modelo en la nube.</span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span><a href="http://3.bp.blogspot.com/-Q24rT_9g_dE/UhjDRNIeBHI/AAAAAAAADVw/EYDWlJHhxTI/s1600/companias.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Q24rT_9g_dE/UhjDRNIeBHI/AAAAAAAADVw/EYDWlJHhxTI/s400/companias.jpg" height="155" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: red;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span> </span></span></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">En fundamental antes de introducirnos más en BPMaaS conocer los niveles de capas en el modelo de la nube para propuesto por el NIST y que se complementa en "<a href="http://www.amazon.com/Enterprise-Cloud-Computing-Technology-ebook/dp/B003IKMP20" target="_blank">Enterprise Cloud Computing</a>", entendiendo que la computación en la nube no es una nueva tecnología, no es una arquitectura y tampoco una nueva metodología. Si usaste Gmail o Google, ya haz tenido interacción con servicios prestados en la nube.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Los niveles propuestos son: IaaS (infraestructura como servicio), PaaS (Plataforma como Servicio), SaaS (Software como servicio), BPMaaS (Gestión de procesos de negocio como servicio) y MCaaS (control y gestión como servicio).</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-XXyVxat5vB4/UhjD7-CzimI/AAAAAAAADV4/NkwTib4SHMo/s1600/niveles.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-XXyVxat5vB4/UhjD7-CzimI/AAAAAAAADV4/NkwTib4SHMo/s400/niveles.jpg" height="191" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br />
<ul>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><i><u>IaaS (infraestructura como servicio):</u></i> incluye la gestión de red (pe, balanceadores de carga, firewalls, etc), recursos de cómputo y de almacenamiento. Un ejemplo de esta capa son los centros de datos en la nube para operar una plataforma que permiten correr diferentes aplicaciones sobre distintos sistemas operacionales.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><i><u>PaaS (plataforma como servicio): </u></i>en este nivel se incluye los ambientes de desarrollo y pruebas usado para el despliegue de servicios en la nube. Un ejemplo de esta capa son las herramientas de BPMS proporcionadas por fabricantes para el modelamiento, medición e implementación de procesos de negocio automatizados.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><u><i>SaaS (software como servicio):</i></u> servicios de aplicaciones de software usados por individuos y organizaciones. En este nivel entran aplicaciones o productos de paquete que se ofrecen en la nube bajo modalidades de cobro por licencias o por transacción (por uso) como un ERP, un SCM o un CRM.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><u><i>BPMaaS (BPM como servicio):</i></u> coreografía y orquestación de servicios para crear y manejar procesos de negocio únicos. Son procesos de negocio que vinculan a una o varias Organizaciones en una entrega de valor al Cliente final.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><i><u>MCaaS (control y gestión como servicio): </u></i>servicios de gestión se seguridad, gestión de SLAs, políticas distribuidas, autorizaciones basadas en roles, y otros servicios básicos necesarios para todas las capas.</span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El BPMaaS representa el nivel más alto de los servicios en la nube porque el MCaaS es un servicio transversal a las demás capas. El BPMaaS a diferencia del BPM tradicional automatizado vincula a las Organizaciones con fines específicos en modelos de negocio que buscan ofrecer una mejor entrega de valor a un Cliente final.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Es importante entender la diferencia entre SaaS y BPMaaS. El SaaS ofrece a las Organizaciones productos o software de paquete (configurable) en fronteras más amplias con un servicio en la línea; mientras que el BPMaaS crea procesos de negocio únicos multi compañía para la entrega de valor al Cliente, incluso usando SaaS en un modelo colaborativo end-to-end. </span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Los procesos de negocio sobre BPMaaS ofrecen ventaja competitiva al ofrecer un cableado entre compañías. Con éste modelo las compañías comparten un sistema BPM en la nube integrado a otras Compañías cubriendo el ciclo completo de concepción, diseño, implementación y optimización.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El BPMaaS se diferencia del SOE (service oriented enterprise) porque en el enfoque de procesos se centra en la orquestación entre empresas para la generación de entrega de valor y no entre silos de departamento o procesos macros de una sola Organización</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El </span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">BPMaaS debe ser implementado como un <a href="http://es.wikipedia.org/wiki/Business_Process_Outsourcing" target="_blank">BPO</a> (Business Process Outsourcing) con un modelo funcional centrado en una industria en particular. La operación del proceso de negocio se vuelve externa a las Organizaciones y se utilizara principalmente para procesos de negocio que end-to-end que combinen las capacidades de varias Compañías para ofrecerle valor al Cliente.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El BPMaaS puede ser implementado como un BOP (Business Operation Platform) que incluye un BPMS en su interior. Este modelo se parece al PaaS, pero incluye elementos del ciclo de vida de gestión de procesos como el modelamiento BPMN, la formulación de reglas de negocio y el monitoreo de actividades de negocio BAM.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Cuando se defina la implementación de un proceso con el enfoque BPMaaS se debe contemplar el análisis de escenarios empresariales en dónde se va a aplicar: </span></span></span></span><br />
<ul>
<li><i><u><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">End User to Cloud</span></span></span></span></u></i><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><i><u><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></span></span>:</u></i> aplicaciones corriendo en la nube y accedidas por usuarios finales.</span></span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><u><i>Enterprise to Cloud to End User:</i></u> aplicaciones corriendo en una nube pública y accedida por empleados y clientes.</span></span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><u><i>Enterprise to Cloud:</i></u> aplicaciones en la nube integradas con capacidades de TI interna.</span></span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><u><i>Enterprise to Cloud to Enterprise:</i></u> aplicaciones en la nube corriendo en una nube pública y operada con socios de aplicaciones (por ejemplo socios de cadena de abastecimiento).</span></span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><i><u>Private Cloud: </u></i>una nube colocada (hosted) por una Organización dentro del firewall de la DMZ. </span></span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><u><i>Hybrid Cloud:</i></u> múltiples nubes trabajando juntas, frecuentemente coordinadas por un broker de nubes que federa datos, aplicaciones, identidad de usuarios, seguridad, etc.</span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Entre los beneficios que ofrece BPMaaS se encuentra el de flexibilidad al poder realizar despliegues continuos y cambios en tiempo de ejecución brindando mejor oportunidad al negocio de las Compañías relacionadas y la reducción de capital en las inversiones en TI permitiéndoles operar en un enfoque bajo demanda.</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Xa3MajDMD58/UhjE1F5h0OI/AAAAAAAADWE/Um7nnrwW6fY/s1600/beneficios.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Xa3MajDMD58/UhjE1F5h0OI/AAAAAAAADWE/Um7nnrwW6fY/s320/beneficios.jpg" height="235" width="320" /></a></div>
<div style="text-align: center;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /> </span></span></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Otro aspecto importante es la reducción de desperdicios por la interacción entre Compañías ahorrando tiempo y recursos para la entrega de valor al Cliente. También se reduce el riesgo de innovación que las compañías asumen cuando invierten en nuevas iniciativas para promover nuevas líneas de negocio.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Las compañías operan con una plataforma de procesos bajo demanda que puede ser cambiada incluso en tiempo real o en vuelo. Se pueden implementar nuevas ideas más rápido al brindar una plataforma en la nube con el fin de generar nuevos negocio (productos o servicios).</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Otro aspecto a revisar el la forma como se cobra bajo este modelo, pues se habla siempre del pago por uso (pay by use), pero también se pueden tener modalidades de venta de licencias o incluso de arrendamiento en un modelo bajo demanda (si suben las transacciones o se incrementa el recurso de cómputo, el almacenamiento, etc. subirá el valor).</span></span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-k_BisxNfOvM/UhjFe2dgjSI/AAAAAAAADWM/2VLhubS47E8/s1600/pago.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-k_BisxNfOvM/UhjFe2dgjSI/AAAAAAAADWM/2VLhubS47E8/s320/pago.jpg" height="183" width="320" /></a></div>
<br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Qué retos tecnológicos implica implementar BPMaaS</b></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El BPMaaS está en un nivel de madurez básico y por tal motivo es necesario revisar un conjunto de atributos de calidad que ayuden a mitigar el riesgo de enfrentar este tipo de proyectos. El énfasis del análisis se centra en los requisitos no funcionales <a href="http://en.wikipedia.org/wiki/Non-functional_requirement" target="_blank">NFR</a>.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El primer elemento a revisar es la <i>autonomía</i>, pues la dependencia con sistemas o servicios externos es crítica; si algún sistema participante de alguna Compañía falla implicará que el proceso de negocio multi-compañía falle. Este es quizás el atributo de calidad más importante para un modelo BPMaaS porque traspasa las barreras de la Organizaciones involucrando acceso a recursos de cómputo y de infraestructura. ¿Cómo garantizar la autonomía en un proceso de negocio multi-Compañía?</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-RNovzrOvIdU/UhjGEl8PcNI/AAAAAAAADWY/t5qVdvFQm4g/s1600/retos.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-RNovzrOvIdU/UhjGEl8PcNI/AAAAAAAADWY/t5qVdvFQm4g/s640/retos.jpg" height="356" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Otro atributo importante y que se relaciona con la autonomía es el acoplamiento ¿Cómo diseñar un proceso con un nivel de acoplamiento bajo que haga más estable una solución?. Para esto es fundamental revisar los <a href="https://docs.google.com/file/d/0Byr_Bgm1eJDka3huLW5kdjBNSTQ/edit?usp=sharing" target="_blank">principios diseño</a> y un enfoque hacia la programación por contrato para depender de abstracciones y no de componentes detallados que puedan ocasionar reacciones en cadena ante un cambio generando un grado alto de inestabilidad.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br />
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Otro reto es garantizar que los servicios o aplicaciones involucradas con el proceso de negocio cumplan con acuerdos de servicio SLA; </span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-weight: normal;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">l</span></span><b id="docs-internal-guid-797b3611-ad06-a53d-d1da-53a047b0eb28" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">os SLAs no son propiamente las interrupciones a hilos de ejecución con un timer específico, sino la estrategia de acuerdos entre los componentes e interfaces involucrados en dónde se estipule los tiempos máximos de espera antes de generar excepciones del tipo TimeOutException. En un proceso de negoc</span></b><span style="font-weight: normal;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">io end-to-end es fundamental definir los acuerdos para manejar adecuadamente el uso del recurso de cómputo concurrente y los acuerdos que se fijen en seguridad.</span></span></span></span></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-weight: normal;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></span></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-vFO_Zz1Pkqs/UhfRKenSFVI/AAAAAAAADVE/t34r3JIiIMM/s1600/timeout.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-vFO_Zz1Pkqs/UhfRKenSFVI/AAAAAAAADVE/t34r3JIiIMM/s1600/timeout.gif" /></a></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-weight: normal;"><span style="background-color: transparent; color: black; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></span></span>
<br />
<div style="text-align: center;">
<span style="font-size: small;"><b id="docs-internal-guid-797b3611-ad09-0d89-f63e-738c988edde6" style="font-weight: normal;"><span style="background-color: white; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">t</span><span style="background-color: white; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">n</span><span style="background-color: white; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> = t</span><span style="background-color: white; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">n+1</span><span style="background-color: white; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> + Δ</span><span style="background-color: white; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">n</span></b></span></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">La <i>flexibilidad </i>es otro aspecto fundamental y está relacionado con la mejora continua de un proceso de negocio, ocasionando cambios frecuentes en el transcurso del tiempo. Ésto, es un aspecto importante que una solución de BPMaaS debe contemplar para evolucionar de acuerdo al ritmo del negocio y de la tecnología.</span></span><br />
<br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">La <i><a href="http://es.wikipedia.org/wiki/Idempotencia_%28inform%C3%A1tica%29" target="_blank">idempotencia </a></i>es un atributo clave de un proceso en la nube para el manejo transaccional, pues los modelos clásicos de un two-phase-commit (transacciones coordinadas) son en realidad utópicos por su complejidad ante la diversidad de posibles participantes. El modelo de compensaciones es demasiado costoso para el tratamiento de flujos alternos anómalos en un proceso de negocio en la nube y por tal motivo es necesario fijar acuerdos para que los sistemas o servicios destino soporten el concepto de idempotencia.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El soporte de <i>integración continua y de pruebas automatizadas</i> es clave para la correcta gestión y control de software</span><span style="font-family: Arial,Helvetica,sans-serif;">. El reto consiste en soportar un ambiente de desarrollo en la nube que soporte pruebas automáticas que evite al máximo la invocación o el contacto con sistemas externos para evitar el uso de mocks o dummies engañosos aunque sigan un enfoque de programación por contrato.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El <i>acceso desde dispositivos móviles</i> a procesos en la nube es un gran desafío, pues es claro que se debe evitar al máximo los accesos en línea (online) para atacar los riesgos que tiene una computación totalmente en la nube. Aunque se usen protocolos de comunicación o estilos arquitecturales como REST o alguna otra mensajería liviana es necesario tomar decisiones de arquitectura adecuadas que garanticen la prestación del servicio.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">De los puntos anteriores se sugiere el atributo de <i>disponibilidad </i>para soportar niveles altos cercanos al 100% de prestación del servicio. Es un rato máximo porque supone niveles de alta disponibilidad y de recuperación de fallos durante los 365 días del año.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El desempeño es vital, porque la carga a soportar debe ser aislada por proceso de negocio con el fin de ecualizar los los atributos de calidad porque la exigencia para throughput, latencia y datos es de un nivel alto</span></span>.<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> Por esto es claro que las estrategias y tácticas de arquitectura a aplicar deben ser muy audaces para luego adaptarse a la flexibilidad que el negocio requiere.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">La <a href="http://aprenderinternet.about.com/od/ConceptosBasico/g/Escalabilidad.htm" target="_blank">escalabilidad </a>es
otro elementos que aparece, con el fin de hacer cumplir la promesa de
uso bajo demanda a través del escalamiento horizontal, permitiendo que
un proceso de negocio pueda incrementar la capacidad de cómputo de
acuerdo a la exigencia del negocio.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial, Helvetica, sans-serif;">La elasticidad de la plataforma para soportar cambios de configuración de escalamiento en caliente de forma automática es clave. Las tecnologías y herramientas que soporten un proceso de negocio en la nube deben incluir dichas características.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">La seguridad de la información es un aspecto fundamental porque muchas Organizaciones tienes políticas o siguen regulaciones que impiden el manejo distribuido de datos o el compartimiento de datos de Clientes, así como los niveles de seguridad de confidencialidad, integridad, no repudio, autenticación, autorización e identidad. Es claro que se deben seguir estándares de industria en seguridad para poder resolver este punto y la definición de aislamiento y autonomía teniendo en cuenta que de acuerdo a la ubicación geográfica o a las regulaciones de cada país esto varía. </span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial, Helvetica, sans-serif;">¿Cómo monitorizar los sistemas involucrados en un proceso en la nube?</span><span style="font-family: Arial,Helvetica,sans-serif;"> es un gran problema a resolver, porque implementar la capa de MCaaS no es simple</span></span>. <span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esto refuerza el concepto de autonomía de toda la plataforma involucrada en la solución.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">La resolución del problema de integración con los distintos sistemas de información de cada compañía que participa en un proceso de negocio en la nube BPMaaS es un gran desafió. Cómo integrarse sin acoplarse a los sistemas destino estableciendo reglas de juego claras que permitan garantizar la construcción de componentes de integración estables que desacoplen a los participantes y oculten la dependencia con los backends, son un reto a resolver bajo este modelo.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
</div>
<div style="text-align: justify;">
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">La colocación de la plataforma en la nube debe analizarse en los distintos modelos: nube privada, nube comunitaria, nube pública y nube híbrida. Para cada proceso de negocio habilitado en el enfoque BPMaaS se debe determinar cómo será el despliegue y la colocación teniendo en cuenta los requisitos de negocio y las regulaciones vigentes.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Cómo solucionarlo con algunas decisiones de arquitectura respecto a BPMaaS</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Una buena manera de solucionar el problema planteado de autonomía es la implementación de una táctica de datos maestros (<a href="http://en.wikipedia.org/wiki/Master_data_management" target="_blank">MDM</a>) y datos operacionales (ODS) con el fin de desacoplar los datos del proceso de negocio y los sistemas backend de las Organizaciones. </span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-dxc0O5SLBto/UhjGoZ-7pqI/AAAAAAAADWg/UWHkbobSt7w/s1600/soluciones.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-dxc0O5SLBto/UhjGoZ-7pqI/AAAAAAAADWg/UWHkbobSt7w/s640/soluciones.jpg" height="200" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El uso de un modelo de <a href="http://mdmbook.com/" target="_blank">datos maestros</a> permite al proceso de negocio realizar accesos en un modelo de mensajería y de datos canónico desacoplando el acceso a clasificaciones (parámetros generales) y evitando el consumo en línea (online) de los sistemas destino backends de las Compañías que intervienen en el proceso de negocio. La sincronización de datos desde los sistemas de información se puede realizar a través de ETLs con un procesamiento en batch y a través de eventos (<a href="http://martinfowler.com/eaaDev/EventSourcing.html" target="_blank">event sourcing</a>) o con técnicas de polling periódicas utilizando <a href="http://www.eaipatterns.com/" target="_blank">patrones de integración</a>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Al implementar el modelo de datos maestros se pueden desarrollar <a href="http://es.wikipedia.org/wiki/Ontolog%C3%ADa_%28inform%C3%A1tica%29" target="_blank">ontologías</a> que ayuden a definir abstracciones y modelos canónicos de información que permitan el alojamiento de datos en entidades que soporten distintos negocios y que ayuden a disminuir el esfuerzo de mapeo de dominios de datos entre los sistema de información backends. </span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El modelo operacional permite mantener datos en un periodo de tiempo definido con el fin de integrar, limpiar, evitar redundancia de los datos expuestos hacia el el proceso de negocio. Además, permite manejar un volumen de datos controlado en un periodo de tiempo para mantener niveles de desempeño aceptables en acceso a datos separando los modelos históricos.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Al utilizar un modelo de datos maestros se disminuye considerablemente las integraciones en línea con los sistemas backend limitando solamente a lo necesario y que se requiere por definiciones de negocio.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Una buena táctica para soportar la flexibilidad es el uso de reglas de negocio para desacoplar a los procesos de esta lógica. Para esto, se puede hacer uso de un motor de reglas <a href="http://en.wikipedia.org/wiki/Business_rule_management_system" target="_blank">BRMS</a> que permita estructurar árboles y tablas de decisión y un lenguaje de definición de reglas, así como la generación de eventos de negocio y modelos de aprendizaje.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Al usar reglas de negocio se ofrecerá a los procesos de negocio contratos a través de esquemas canónicos desacoplándolos y brindando un grado de flexibilidad alto, soportando cambios en procesos de orquestaciones diferentes a los procesos en notación de negocio BPMN. </span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Defina un ESB local para los procesos de negocio que soporten el modelo BPMaaS para manejar una conectividad orientada a aspectos que soporte la mayoría de ítems no funcionales: logging, auditoría, manejo de excepciones, control de SLAs, gateways de seguridad y enrutamiento, reenvío de mensajes, soporte de múltiples protocolos de comunicación para un mismo servicio y el soporte de virtualización, transparencia de localización y versionamiento de servicios.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Recuerde que el ESB es una definición de arquitectura y no un producto que ofrece un vendedor, aunque los vendedores de herramientas lo hagan ver así, pues es una estrategia comercial. El ESB es la definición de un conjunto de componentes que habiliten una capa de integración que puede ser instanciada tantas veces se requiera de acuerdo a las cargas transaccionales o a los modelos de escalamiento planteados y probablemente controlados a través de buses federados, pues no hay que olvidar que por definición es stateless. Nunca cree orquestaciones en esta capa y guíe la construcción de componentes de servicio hacia el máximo desempeño.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Con el ESB se desacopla los servicios en línea que se requieran a través del manejo de contratos que siguen una aplicación de un <a href="http://www.soapatterns.org/" target="_blank">patrón de esquema canónico</a>. De esta manera los procesos de negocio conocerán el contrato y no la localización y mucho menos el protocolo o el sistema backend proveedor del servicio.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">El cumplimiento y la definición de SLAs se puede alcanzar con la implementación de la capa de integración ESB al configurarse meta-data de los servicios en repositorio para tal fin, permitiendo en ejecución (runtime) controlar los tiempos máximos de espera para el control de los recursos de cómputo configurados en la infraestructura en la nube.</span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para el manejo de aplicaciones móviles (canales) es recomendable no acceder en línea a los procesos de negocio y si a través de paquetes asincrónicos con una probable implementación del patrón de <a href="http://www.enterpriseintegrationpatterns.com/Sequencer.html" target="_blank">integración splitter</a> y con notificaciones de eventos desde el proceso a través de la implementación de un patrón publicador/suscriptor.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Aunque el modelo tenga un foco en la nube, no debemos olvidar los <a href="https://docs.google.com/file/d/0Byr_Bgm1eJDka3huLW5kdjBNSTQ/edit?usp=sharing" target="_blank">principios clásicos de diseño</a> básicos del modelo orientado a objetos guiados por el acoplamiento (eferente / aferente) y la cohesión. Es recomendable utilizar el principio de abstracciones estables, el de cierre común, el de reuso común, entre otros.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para mejorar la flexibilidad y la entrega de valor constante al Cliente, se sugiere la utilización de modelos ágiles que permitan acortar ciclos y que promuevan la reducción de desperdicios enfocándose en la producción de software que permita alcanzar la visión del proceso de negocio establecido en una fase de análisis de procesos de negocio BPA. Este será otro bloq que próximamente escribiré "BPM Ágil".</span></span> </span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Es claro que para iniciativas de BPMaaS la definición de arquitecturas de software empresarial es fundamental y que las decisiones de arquitectura para elaborar rationales teniendo en cuenta en conjunto de alternativas, así como la gestión de atributos de calidad deben manejarse con el máximo profesionalismo, debido a que cualquier decisión o diseño que se formalice debe probarse con pruebas de concepto PoC y con pruebas de telemetría.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">En un próximo blog tocaré el tema de Social BPM y de cómo esta alternativa entra como un habilitador de nuevas funcionalidades y modelos para la gestión de procesos de negocio. ¿Qué tal el envío de un formulario de solicitud de crédito desde Facebook? ¿Un manejo de verificación de referencias a través de redes sociales? .......</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Gabriel Morris S.</span></span><br />
<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;">@<a href="https://twitter.com/GabrielMorrisS" target="_blank">GabrielMorrisS</a></span><br />
<br /></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com0tag:blogger.com,1999:blog-7470233962230718324.post-19778894336007350702013-08-23T05:36:00.003-07:002013-08-26T13:09:28.246-07:00Contenido del BLOG<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Yj1IkBoR-WQ/Uf5qWWS3y3I/AAAAAAAACuE/xYMjzKCTqPU/s1600/2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="456" src="http://2.bp.blogspot.com/-Yj1IkBoR-WQ/Uf5qWWS3y3I/AAAAAAAACuE/xYMjzKCTqPU/s640/2.jpg" width="640" /></a></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com0tag:blogger.com,1999:blog-7470233962230718324.post-66104749039936705902013-08-04T21:44:00.000-07:002013-11-21T13:25:11.468-08:00Agile Open Medellín - Facilitación Gráfica, Arquitectura y BPM Ágil<div style="text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">El pasado mes de junio en Medellin Colombia, se efectúo un gran evento de la comunidad <a href="https://www.facebook.com/AgilesColombia" target="_blank">Ágiles Colombia</a>, el "Agile Open Medellin". Éste, se realizó con un formato de <a href="https://en.wikipedia.org/wiki/Open-space_technology" target="_blank">Open-Space-Technology</a> que permitió establecer que actividades se implementarían dentro del evento al iniciarse sin ningún tipo de agenda.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Q-k1C-yeg9o/UjXChs86e7I/AAAAAAAAD5Q/tOmoaW__rRc/s1600/i1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="http://3.bp.blogspot.com/-Q-k1C-yeg9o/UjXChs86e7I/AAAAAAAAD5Q/tOmoaW__rRc/s400/i1.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-sI8E2rmyAuA/Uf55V0C29vI/AAAAAAAACvg/5FEKglu8pu4/s1600/market0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">Los temas planteados para el evento se presentaban en un minuto y luego se postulaban. Entre los principales tópicos tratados estuvieron <a href="http://www.scrumalliance.org/" target="_blank">Scrum</a>, <a href="http://www.extremeprogramming.org/" target="_blank">XP</a>, <a href="http://www.lean.org/whatslean/" target="_blank">Lean</a>, <a href="http://manifesto.softwarecraftsmanship.org/" target="_blank">Craftsmanship</a>, técnicas de retrospectivas, <a href="http://www.monografias.com/trabajos37/kanban/kanban.shtml" target="_blank">Kanban</a>, arquitectura ágil, entre otros.</span></div>
<a name='more'></a></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif;"><a href="http://4.bp.blogspot.com/-sI8E2rmyAuA/Uf55V0C29vI/AAAAAAAACvg/5FEKglu8pu4/s1600/market0.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/-sI8E2rmyAuA/Uf55V0C29vI/AAAAAAAACvg/5FEKglu8pu4/s320/market0.jpg" width="320" /></a> </span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-l8mOlR4GyH4/Uf54xn5f1-I/AAAAAAAACuo/2FpwfMVy8aQ/s1600/market2.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://2.bp.blogspot.com/-l8mOlR4GyH4/Uf54xn5f1-I/AAAAAAAACuo/2FpwfMVy8aQ/s200/market2.JPG" width="133" /></a><a href="http://3.bp.blogspot.com/-oNyyRuMjHoU/Uf54y9z_QTI/AAAAAAAACu0/G-cnEp4vLPQ/s1600/market3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-oNyyRuMjHoU/Uf54y9z_QTI/AAAAAAAACu0/G-cnEp4vLPQ/s200/market3.JPG" width="133" /></a> <a href="http://2.bp.blogspot.com/-bKuGvyvY9K4/Uf54xUE9MVI/AAAAAAAACuk/jHTWFCT4jcY/s1600/market.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="http://2.bp.blogspot.com/-bKuGvyvY9K4/Uf54xUE9MVI/AAAAAAAACuk/jHTWFCT4jcY/s200/market.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">Sin duda alguna un gran evento, con 600 participantes que compartieron experiencias sobre los temas planteados, teniendo como base que todos los que participamos podíamos aportar en alguna medida con un enfoque altruista. Si alguien quería moverse de actividad si creía que no aportaba o no le generaba valor, simplemente utilizaba sus pies para ir a otra charla o actividad.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">En mi caso, disfruté muchísimo el evento, compartí con muchos conocidos, amigos y compañeros en las actividades de charla, facilitación gráfica y en las que modere: BPM Ágil y Arquitectura Ágil.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-B7oFbjaSktU/Uf54xR_9FpI/AAAAAAAACuc/tr34TSpguXI/s1600/market1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://3.bp.blogspot.com/-B7oFbjaSktU/Uf54xR_9FpI/AAAAAAAACuc/tr34TSpguXI/s320/market1.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">En la actividad que lideré de <a href="https://docs.google.com/presentation/d/1xrii3StkRhJFnR_N26gF21f3EoysPvbqTxK5gTJlLc8/edit?usp=sharing" target="_blank">BPM Ágil</a>, compartí experiencias y técnicas que he venido trabajando desde hace unos años, porque soy un firme creyente que todos los modelos de automatización de procesos deben seguir un enfoque ágil, que promueva la implementación en ciclos cortos que brinden un modelo que genere un valor real a las Organizaciones, en donde la prioridad sea el software funcionando con metas claras que acerquen un paso más a la visión del proceso implementado.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-VLA8zHodfi8/Uf545eY3DnI/AAAAAAAACvI/SJpH3y-PxV4/s1600/ao46.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-VLA8zHodfi8/Uf545eY3DnI/AAAAAAAACvI/SJpH3y-PxV4/s320/ao46.jpg" width="240" /> </a><a href="http://4.bp.blogspot.com/-bYplGby-NIo/Uf56FwHHZUI/AAAAAAAACz8/sTun1umVass/s1600/fac3.JPG" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="212" src="http://4.bp.blogspot.com/-bYplGby-NIo/Uf56FwHHZUI/AAAAAAAACz8/sTun1umVass/s320/fac3.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">Las técnicas ágiles de BPM tratadas incluyeron: <a href="http://www.caminoagil.com/2013/02/visual-story-mapping-aplicado.html" target="_blank">Visual Story Mapping</a>, <a href="http://www.impactmapping.org/" target="_blank">Impact Mapping</a>, Arquitectura Ágil, PHLD (diseño de procesos de alto nivel), Customer Journey Map, <a href="http://www.agilemodeling.com/" target="_blank">Agile Modeling</a>, <a href="http://es.wikipedia.org/wiki/Mapa_del_flujo_de_valor" target="_blank">Value Stream Mapping</a>, Planning Poker, entre otros.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-NQEvdxOVHEg/Uf54zOgo7WI/AAAAAAAACvA/1VHe8jypedY/s1600/market3.1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://3.bp.blogspot.com/-NQEvdxOVHEg/Uf54zOgo7WI/AAAAAAAACvA/1VHe8jypedY/s320/market3.1.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">Sin embargo, para el caso de proyectos de alta complejidad como la automatización de procesos no creo que las mejores arquitecturas emerjan de equipos auto-organizados, porque siempre se requiere ver el bosque desde un acantilado o desde la punta de un árbol antes de caminar por él sin una carta de navegación clara. Por lo anterior, las decisiones invariables demostradas a través de talleres de decisiones de arquitectura y de atributos de calidad, que desencadenen <a href="https://en.wikipedia.org/wiki/Proof_of_concept" target="_blank">PoC</a> son necesarios antes de ciclos de implementación (Pe. Sprints de Scrum). </span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">En proyectos de automatización <a href="http://es.wikipedia.org/wiki/Gesti%C3%B3n_de_procesos_de_negocio" target="_blank">BPM </a>se requiere una fase de arquitectura que haga parte del BPA, en donde se capturen atributos de calidad, restricciones y las principales funcionalidades de negocio. Todo esto, con el fin ejecutar talleres ágiles de atributos de calidad y de decisiones de arquitectura que permitan establecer estrategias y tácticas que permitan visualizar y acotar riesgos técnicos.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ADc4WnI2KH0/Uf56DlYbhcI/AAAAAAAACzA/ZwSwPLb8v2Y/s1600/ao44.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="http://4.bp.blogspot.com/-ADc4WnI2KH0/Uf56DlYbhcI/AAAAAAAACzA/ZwSwPLb8v2Y/s400/ao44.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;">Facilitación gráfica de una charla de arquitectura en proyectos ágiles</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-lLLVsrpIuYM/UjXDKTFrzjI/AAAAAAAAD5g/G_eXaoIUy9w/s1600/i3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="http://2.bp.blogspot.com/-lLLVsrpIuYM/UjXDKTFrzjI/AAAAAAAAD5g/G_eXaoIUy9w/s320/i3.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">La <a href="http://es.wikipedia.org/wiki/Refactorizaci%C3%B3n" target="_blank">refactorización </a>es para el <a href="http://books.google.com.co/books?id=SL_7f8IEcBAC&pg=PT302&lpg=PT302&dq=dld+detail+level+design&source=bl&ots=B_Dk5L_nVw&sig=BheOPEzbTzutPl9LTtMnCEaMyAU&hl=es-419&sa=X&ei=6iv_UYeREoe89QTm2IDoBw&ved=0CHYQ6AEwCA#v=onepage&q=dld%20detail%20level%20design&f=false" target="_blank">DLD </a>o el micro-diseño, no para la arquitectura de alto nivel o para acercamientos de diseño <a href="http://en.wikipedia.org/wiki/High-level_design" target="_blank">HLD</a>; el detalle se resuelve en los ciclos de implementación con tareas de diseño. Lo fundamental en una arquitectura ágil es no caer en detalles que sean desperdicios, en tareas que no aporten valor y que se vayan a cambiar en los ciclos de implementación ágil.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">En sí, es fundamental determinar el nivel de abstracción necesario para la ejecución de proyectos ágiles complejos, qué definir, que tratar, etc. Para ésto, planeo escribir otro blog en el que muestre de acuerdo a mi experiencia qué tener en cuenta para definir: atributos de calidad, restricciones, diseño de arquitecturas, diseños de alto nivel, <a href="https://en.wikipedia.org/wiki/Proof_of_concept" target="_blank">PoC</a>, evaluación de arquitecturas entre otros.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">A continuación muestro la otra parte que me apasionó en el evento: la facilitación gráfica, en la que tuve el placer de participar.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-_qjZY6KKE2k/Uf555tpz0_I/AAAAAAAACwA/vtjsjkJxPiY/s1600/ao20.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://2.bp.blogspot.com/-_qjZY6KKE2k/Uf555tpz0_I/AAAAAAAACwA/vtjsjkJxPiY/s320/ao20.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Facilitación de <a class="account-group js-user-profile-link" href="https://twitter.com/luismulato" style="background-color: white; color: #999999; font-family: Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: left; text-decoration: none;"><span class="username js-action-profile-name" style="direction: ltr; font-size: 12px; unicode-bidi: embed;">@luismulato</span></a> y <a href="https://twitter.com/GabrielMorrisS" target="_blank">@GabrielMorris</a>S</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-X_4hZvYsxQs/UjXC3Vv04gI/AAAAAAAAD5Y/_OY50k1mcxQ/s1600/13.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="http://2.bp.blogspot.com/-X_4hZvYsxQs/UjXC3Vv04gI/AAAAAAAAD5Y/_OY50k1mcxQ/s320/13.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Facilitación de la ley de los dos pies <a href="https://twitter.com/GabrielMorrisS" target="_blank">@GabrielMorrisS</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-GjDl5gY72jw/Uf56CFXCmeI/AAAAAAAACys/36V5kJnxF-I/s1600/ao41.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="http://3.bp.blogspot.com/-GjDl5gY72jw/Uf56CFXCmeI/AAAAAAAACys/36V5kJnxF-I/s320/ao41.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Facilitación de la ley de los dos pies <a href="https://twitter.com/GabrielMorrisS" target="_blank">@GabrielMorrisS</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-D_jD7DwHwt4/Uf55DCbx0LI/AAAAAAAACvQ/aAmGIA1u7aY/s1600/ao48.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="http://4.bp.blogspot.com/-D_jD7DwHwt4/Uf55DCbx0LI/AAAAAAAACvQ/aAmGIA1u7aY/s320/ao48.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-j0hBwUB1cIk/Uf56CZKccfI/AAAAAAAACy0/V3KgauFa4FM/s1600/ao42.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="http://2.bp.blogspot.com/-j0hBwUB1cIk/Uf56CZKccfI/AAAAAAAACy0/V3KgauFa4FM/s320/ao42.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Facilitación de arquitectura ágil <a href="https://twitter.com/GabrielMorrisS" target="_blank">@GabrielMorrisS</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-HS4x96Y6lJY/UjXDXxLrr6I/AAAAAAAAD5o/a8H09VCLcWA/s1600/i5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="http://2.bp.blogspot.com/-HS4x96Y6lJY/UjXDXxLrr6I/AAAAAAAAD5o/a8H09VCLcWA/s320/i5.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-CjoqDD7uEis/Uf56GMfMUGI/AAAAAAAAC0A/DN_t-VC2Cf8/s1600/fac4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://1.bp.blogspot.com/-CjoqDD7uEis/Uf56GMfMUGI/AAAAAAAAC0A/DN_t-VC2Cf8/s320/fac4.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-cCGnO0xUukU/Uf56CtdDfzI/AAAAAAAACy4/RUycGxo49ic/s1600/ao43.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="http://3.bp.blogspot.com/-cCGnO0xUukU/Uf56CtdDfzI/AAAAAAAACy4/RUycGxo49ic/s320/ao43.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Facilitación de SOA Ágil <a href="https://twitter.com/GabrielMorrisS" target="_blank">@GabrielMorrisS</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-7YzL7ccjVC4/Uf56Fsmmr5I/AAAAAAAACzw/0tEit4Y1F5I/s1600/fac2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://4.bp.blogspot.com/-7YzL7ccjVC4/Uf56Fsmmr5I/AAAAAAAACzw/0tEit4Y1F5I/s320/fac2.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Facilitación de la ley de los unos <a href="https://twitter.com/GabrielMorrisS" target="_blank">@GabrielMorrisS</a>, <a class="account-group js-user-profile-link" href="https://twitter.com/claumsandoval" style="background-color: white; color: #999999; font-family: Arial, sans-serif; font-size: 14px; line-height: 18px; text-decoration: none;"><span class="username js-action-profile-name" style="direction: ltr; font-size: 12px; unicode-bidi: embed;">@claumsandoval</span></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;">La última actividad, fue el cierre del evento que facilité con </span><span class="username js-action-profile-name" style="background-color: white; color: #999999; direction: ltr; font-family: Arial, sans-serif; font-size: 12px; line-height: 18px; text-align: center; text-decoration: none; unicode-bidi: embed;"><a class="account-group js-user-profile-link" href="https://twitter.com/claumsandoval" style="background-color: white; color: #999999; font-family: Arial, sans-serif; font-size: 14px; line-height: 18px; text-align: center; text-decoration: none;">@claumsandoval</a>, </span><span style="font-family: Arial, Helvetica, sans-serif;">una gran facilitadora a la que le aprendí muchísimo.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-S3WGClP6u9Y/Uf56E34up-I/AAAAAAAACzg/BSUhkMd-8TU/s1600/fac0.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-S3WGClP6u9Y/Uf56E34up-I/AAAAAAAACzg/BSUhkMd-8TU/s1600/fac0.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-avHUIek2flo/Uf558TE_28I/AAAAAAAACw4/31WNlMFof2I/s1600/ao24.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="212" src="http://1.bp.blogspot.com/-avHUIek2flo/Uf558TE_28I/AAAAAAAACw4/31WNlMFof2I/s320/ao24.JPG" width="320" /></a><a href="http://1.bp.blogspot.com/-Iip2mYDOWCc/Uf55672mbmI/AAAAAAAACwY/apuSeAxoV-Y/s1600/ao23.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="213" src="http://1.bp.blogspot.com/-Iip2mYDOWCc/Uf55672mbmI/AAAAAAAACwY/apuSeAxoV-Y/s320/ao23.JPG" width="320" /> </a><a href="http://3.bp.blogspot.com/-Sk2H9wqjglU/Uf5547bUHII/AAAAAAAACvs/s2BJb10qdug/s1600/ao17.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-Sk2H9wqjglU/Uf5547bUHII/AAAAAAAACvs/s2BJb10qdug/s200/ao17.JPG" width="133" /></a> </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-fPyYuNwI6Js/Uf555Ed9SnI/AAAAAAAACvw/poo7TNKtA1o/s1600/ao18.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="http://2.bp.blogspot.com/-fPyYuNwI6Js/Uf555Ed9SnI/AAAAAAAACvw/poo7TNKtA1o/s200/ao18.JPG" width="200" /></a><a href="http://3.bp.blogspot.com/-3wqiO-37nqU/Uf555C2mY_I/AAAAAAAACv8/magASXDqONY/s1600/ao19.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="http://3.bp.blogspot.com/-3wqiO-37nqU/Uf555C2mY_I/AAAAAAAACv8/magASXDqONY/s200/ao19.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-r7i5UiBh4mE/Uf556elUn0I/AAAAAAAACwM/_4xIEJCD4Gk/s1600/ao21.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="http://1.bp.blogspot.com/-r7i5UiBh4mE/Uf556elUn0I/AAAAAAAACwM/_4xIEJCD4Gk/s200/ao21.JPG" width="200" /></a><a href="http://4.bp.blogspot.com/-zqtXyWuOZD4/Uf556sSZztI/AAAAAAAACwQ/nkIx6LivvRE/s1600/ao22.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="http://4.bp.blogspot.com/-zqtXyWuOZD4/Uf556sSZztI/AAAAAAAACwQ/nkIx6LivvRE/s200/ao22.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ZQ2Sm1Io4So/Uf557fP6-0I/AAAAAAAACwg/MTchNAB8aAI/s1600/ao25.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="http://2.bp.blogspot.com/-ZQ2Sm1Io4So/Uf557fP6-0I/AAAAAAAACwg/MTchNAB8aAI/s200/ao25.JPG" width="200" /></a><a href="http://4.bp.blogspot.com/-GfkAUV_89s8/Uf558YuWemI/AAAAAAAACw0/YAL9ozHVVQA/s1600/ao26.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="http://4.bp.blogspot.com/-GfkAUV_89s8/Uf558YuWemI/AAAAAAAACw0/YAL9ozHVVQA/s200/ao26.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-e5ofYhSHf8U/Uf558R9HhOI/AAAAAAAACws/5grf5Ik0wqs/s1600/ao27.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="http://1.bp.blogspot.com/-e5ofYhSHf8U/Uf558R9HhOI/AAAAAAAACws/5grf5Ik0wqs/s200/ao27.JPG" width="133" /></a><a href="http://4.bp.blogspot.com/-VdYOR0V3fJU/Uf558wwB-LI/AAAAAAAACxE/s_-EmsqzxPM/s1600/ao28.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://4.bp.blogspot.com/-VdYOR0V3fJU/Uf558wwB-LI/AAAAAAAACxE/s_-EmsqzxPM/s200/ao28.JPG" width="133" /></a><a href="http://4.bp.blogspot.com/-5PHrwqeEjvU/Uf559MDResI/AAAAAAAACxI/mPbl_WBl8kA/s1600/ao29.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="http://4.bp.blogspot.com/-5PHrwqeEjvU/Uf559MDResI/AAAAAAAACxI/mPbl_WBl8kA/s200/ao29.JPG" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-HS1s4835VXg/Uf55-Ef3pEI/AAAAAAAACxY/0BJz7VJ1L5Y/s1600/ao30.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="http://1.bp.blogspot.com/-HS1s4835VXg/Uf55-Ef3pEI/AAAAAAAACxY/0BJz7VJ1L5Y/s200/ao30.JPG" width="200" /></a></div>
<a href="http://1.bp.blogspot.com/-0WpZsL6nFJQ/Uf55-05SWBI/AAAAAAAACxo/2HAhdMIpXuU/s1600/ao32.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="133" src="http://1.bp.blogspot.com/-0WpZsL6nFJQ/Uf55-05SWBI/AAAAAAAACxo/2HAhdMIpXuU/s200/ao32.JPG" width="200" /></a><br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-i2Ue94PrHGM/Uf55-xwaKMI/AAAAAAAACxk/q5PaQsfcOtw/s1600/ao33.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="http://1.bp.blogspot.com/-i2Ue94PrHGM/Uf55-xwaKMI/AAAAAAAACxk/q5PaQsfcOtw/s200/ao33.JPG" width="200" /></a><a href="http://3.bp.blogspot.com/-WaHceuSfc1Q/Uf55_VKNYAI/AAAAAAAACx0/bhKKiNCNCVw/s1600/ao35.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="http://3.bp.blogspot.com/-WaHceuSfc1Q/Uf55_VKNYAI/AAAAAAAACx0/bhKKiNCNCVw/s200/ao35.JPG" width="133" /></a><a href="http://1.bp.blogspot.com/-i2Ue94PrHGM/Uf55-xwaKMI/AAAAAAAACxk/q5PaQsfcOtw/s1600/ao33.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="http://1.bp.blogspot.com/-i2Ue94PrHGM/Uf55-xwaKMI/AAAAAAAACxk/q5PaQsfcOtw/s200/ao33.JPG" width="200" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-XvNJ4in40lw/Uf55_ofPQ2I/AAAAAAAACyA/mj2mBuOu_5I/s1600/ao36.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://1.bp.blogspot.com/-XvNJ4in40lw/Uf55_ofPQ2I/AAAAAAAACyA/mj2mBuOu_5I/s320/ao36.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-4tHAe9LiEmI/Uf56A9ewGlI/AAAAAAAACyc/HiBW4wu3G9E/s1600/ao37.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://4.bp.blogspot.com/-4tHAe9LiEmI/Uf56A9ewGlI/AAAAAAAACyc/HiBW4wu3G9E/s320/ao37.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;">Facilitación final del cierre del evento Agile Open Medellin</span></div>
@GabrielMorrisShttp://www.blogger.com/profile/15292953572450894016noreply@blogger.com0