Humberto Cervantes https://sg.com.mx/ en Oportunidades de vinculación academia industria en temas de arquitectura de software https://sg.com.mx/buzz/ponencias/real/oportunidades-de-vinculacion-academia-industria-en-temas-de-arquitectura-de <span class="field field--name-title field--type-string field--label-hidden">Oportunidades de vinculación academia industria en temas de arquitectura de software</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/real" hreflang="zxx">REAL</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/44582" lang="" about="/user/44582" typeof="schema:Person" property="schema:name" datatype="" class="username">Ivett Sanchez</a></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 12/03/2019 - 13:26</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p><iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/y9brZGnmbh1Z2L" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="595"></iframe></p> <div style="margin-bottom:5px"><strong><a href="//www.slideshare.net/RevistaSG/oportunidades-de-vinculacin-academia-industria-en-temas-de-arquitectura-de-software" target="_blank" title="Oportunidades de vinculación academia industria en temas de arquitectura de software">Oportunidades de vinculación academia industria en temas de arquitectura de software</a> </strong> de <strong><a href="https://www.slideshare.net/RevistaSG" target="_blank">Software Guru</a></strong></div> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta charla se habla acerca de la deuda técnica y arquitectura</p> </div> Tue, 03 Dec 2019 19:26:15 +0000 Ivett Sanchez 8981 at https://sg.com.mx ¿Usar o no Blockchain para mi Sistema? https://sg.com.mx/revista/57/usar-o-no-blockchain <span class="field field--name-title field--type-string field--label-hidden">¿Usar o no Blockchain para mi Sistema?</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/2018-09/decisions.jpg" width="620" height="413" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Sun, 09/02/2018 - 20:25</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/57" hreflang="zxx">SG #57</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/carlos-solis" hreflang="zxx">Carlos Solís</a></li> <li><a href="/buzz/autores/elizabeth-perez-cortes" hreflang="zxx">Elizabeth Pérez Cortés</a></li> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr">Las cadenas de bloques (<em>blockchain</em>) son un mecanismo de almacenamiento de datos que fue creado para dar soporte a las necesidades que se planteó Bitcoin en el 2009 [1]. Sin embargo, posteriormente se descubrió que éste mecanismo puede tener múltiples aplicaciones que van mucho más allá de las criptomonedas. A partir de este momento las cadenas de bloques cobraron importancia y muchas empresas comenzaron a explorar su uso. El problema es que el uso de una cadena de bloques no siempre es una buena decisión. Gartner sugiere que el 90% de los proyectos empresariales basados en blockchain, lanzados entre 2016 y la primera mitad de 2017, fracasarán en un lapso de 24 meses [2]. Por esta razón, antes de comenzar un proyecto basado en esta tecnología, es necesario tomarse el tiempo de analizar las necesidades del proyecto para determinar si estas pueden ser cubiertas por un sistema de bases de datos tradicional o bien es necesario recurrir a las cadenas de bloques.</p> <p dir="ltr">En este artículo presentamos una serie de criterios que ayudan a determinar cuándo tiene sentido almacenar datos en un blockchain. Para entender la manera en que se utiliza esta lista de criterios, los aplicamos en un ejemplo sencillo.</p> <h2 dir="ltr">Parte 1. Criterios de decisión</h2> <p dir="ltr">A continuación enumeramos un conjunto de criterios, obtenidos a partir de [3] y [4], que son útiles para identificar si un proyecto es candidato a ser desarrollado usando la tecnología de cadena de bloques. Al final de cada criterio se incluye una pregunta que deben ser respondida para guiar en el proceso de toma de decisión. Cabe señalar que si se responde de manera afirmativa a todas las preguntas, entonces es muy probable que el sistema que se desea desarrollar se vea beneficiado por el uso de una cadena de bloques.</p> <h3 dir="ltr">Necesidad de una base de datos</h3> <p dir="ltr">El primer paso es tener claras las necesidades de persistencia de datos. Si bien en la actualidad la gran mayoría de proyectos de software requieren una base de datos, esto no significa que tenga que implementarse con una cadena de bloques. Las bases de datos tradicionales han hecho un buen trabajo almacenando datos desde hace décadas, y en los últimos años han evolucionado significativamente para incorporar nuevas capacidades (ej. NoSQL). Así que la pregunta que debemos hacernos en este punto es: ¿En verdad es insuficiente una base de datos tradicional (relacional o no relacional) para cubrir las necesidades del proyecto?</p> <h3 dir="ltr">Existencia de múltiples escritores</h3> <p dir="ltr">En muchos sistemas los cambios son realizados de forma centralizada o mediante una entidad que recibe peticiones y verifica si es posible hacer cambios en los datos y, de ser así, los lleva a cabo. En ciertos escenarios, sin embargo, es deseable que existan diversas entidades, o escritores, que sean capaces de modificar los datos de forma independiente. Si el sistema que se busca desarrollar tiene esta necesidad, entonces tal vez tenga sentido usar una cadena de bloques. Por lo anterior, debemos responder a la siguiente pregunta ¿Se pueden identificar múltiples escritores en el sistema a desarrollar?</p> <h3 dir="ltr">Confidencialidad</h3> <p dir="ltr">En una base de datos tradicional tenemos la libertad de elegir mediante diferentes métodos a los usuarios que tienen derecho a ingresar a la información contenida en ella, incluso es posible asignar niveles de usuario con la finalidad de regular el acceso a los datos manteniéndolos seguros y confidenciales. Por otro lado, la transparencia de datos es una característica de las cadenas de bloques. Recordemos que una cadena de bloques almacena la información de las diferentes transacciones que se han realizado desde que esta se creó y que, además, existen múltiples réplicas de la misma que son usadas para verificar la validez de una transacción. En otras palabras, los nodos que poseen una réplica tienen acceso a la información ahí almacenada. Por lo anterior, si existen restricciones de confidencialidad que impliquen que la información no pueda estar replicada en varios nodos, es probable que la cadena de bloques no sea la mejor opción. Es necesario entonces responder a la pregunta ¿Los datos pueden ser replicados en varios nodos sin violar las restricciones de confidencialidad?</p> <h3 dir="ltr">Rendimiento</h3> <p dir="ltr">Una de las principales limitaciones del almacenamiento en cadenas de bloques es que no pueden almacenar mucha información dentro de un bloque y tampoco son capaces de tolerar una alta demanda de transacciones. En consecuencia, si el proyecto de software requiere de almacenar grandes cantidades de datos además de un alto rendimiento, será necesario buscar alternativas para satisfacer esos requerimientos. Por ejemplo, en el blockchain se podrían guardar únicamente apuntadores a archivos almacenados independientemente. De esta forma se evita guardar mucha información en la cadena y potenciar el rendimiento. Por lo anterior, debemos preguntarnos ¿El sistema a desarrollar maneja una cantidad limitada de información y no requiere alto rendimiento?</p> <h3 dir="ltr">Desconfianza</h3> <p dir="ltr">Anteriormente se había mencionado que una cadena de bloques soporta la existencia de múltiples escritores que pueden modificar directamente los datos. Es posible que ante esta situación exista desconfianza entre los escritores; es decir, si un escritor puede modificar entradas que le pertenecen a otro escritor o bien las propias a su conveniencia, existe desconfianza entre ellos. Si en el sistema que queremos desarrollar existe desconfianza entre los múltiples escritores, entonces el uso de una cadena de bloques es recomendable. Por lo anterior, debemos responder a la siguiente pregunta ¿Existe desconfianza entre los múltiples escritores que participan dentro del sistema?</p> <h3 dir="ltr">Desintermediación</h3> <p dir="ltr">El problema de una base de datos distribuida con múltiples escritores que desconfían entre sí no es un problema nuevo. De hecho, existe una solución a este problema y son los intermediarios de confianza, es decir colocar un ente que funcione como regulador y validador de las transacciones que se realizan entre usuarios. En este caso es necesario que todos los usuarios del sistema confíen en que el intermediario realiza sus tareas sin preferencia por ningún usuario.</p> <p dir="ltr">En las cadenas de bloques los nodos que poseen una réplica validan la integridad de la información y rechazan transacciones malintencionadas. Esta característica permite eliminar a los intermediarios de confianza. Por ejemplo, en la red de Bitcoin las transferencias no requieren de una institución bancaria que valide cada una de ellas. Por esta razón, las cadenas de bloques son útiles en proyectos donde se desea eliminar a los intermediarios de confianza o cuando no existe un intermediario que cumpla con los requerimientos del proyecto. &nbsp;En consecuencia, es importante responder a la pregunta ¿Se desea eliminar intermediarios de confianza?</p> <h3 dir="ltr">Validadores</h3> <p dir="ltr">Una cadena de bloques como su nombre lo indica, es literalmente una serie de bloques encadenados entre sí; cada bloque contiene un conjunto de transacciones que le indican a todos los nodos de la red cuales son las transacciones válidas que se han realizado hasta el momento así como el orden cronológico en el que se realizaron. No todos los nodos tienen la capacidad de agregar un bloque a la cadena y, en consecuencia, es necesario especificar qué nodos se encargarán de esta tarea. Estos nodos llevan por nombre validadores o mineros y pueden ser elegidos de diferentes formas dependiendo el tipo de cadena de bloques. Por ejemplo en una cadena de bloques privada, los validadores pueden ser un grupo básico de nodos que mantengan la cadena, en contraste con la red de Bitcoin, donde un validador puede ser cualquier nodo con la capacidad computacional para realizar los cálculos requeridos por la red. Debemos entonces responder ¿Es posible identificar quiénes tomarían el papel de validadores en su sistema?</p> <h3 dir="ltr">Reglas de validación</h3> <p dir="ltr">Independientemente de quiénes sean los validadores o qué algoritmo utilicen para llegar al consenso, el propietario de una copia de la base de datos debe seguir las reglas establecidas para determinar si una transacción es válida o no. En consecuencia se debe responder a la pregunta ¿Se tienen claras las reglas a seguir para determinar la validez de una transacción?</p> <h3 dir="ltr">Dependencia entre transacciones</h3> <p dir="ltr">Hasta el momento sabemos que las cadenas que bloques se asemejan a una base de datos distribuida. En esta base de datos se almacenan bloques que contienen un cierto número de transacciones, cada bloque nuevo que se crea se enlaza al anterior creando una cadena de bloques y permitiendo que las diferentes transacciones que se realizan tengan un orden cronológico entre ellas. Esta característica permite tomar una decisión cuando dos transacciones dependen una de otra, por ejemplo: Suponga que el individuo A desea transferir $50 al individuo B y luego el individuo B los transfiere al individuo C, la transferencia del individuo B al C depende de la transferencia que realizó el individuo A al B, ya que si no se realiza en el orden correcto la transferencia del individuo B al C sería rechazada por falta de fondos, podríamos decir entonces que esta serie de transacciones son dependientes. Las cadenas de bloques soportan dependencia entre transacciones. Debemos entonces preguntarnos ¿El sistema involucra transacciones que sean dependientes?</p> <h3 dir="ltr">Inmutabilidad e historia</h3> <p dir="ltr">Una de las principales ventajas que nos proporciona una cadena de bloques es la inmutabilidad de los datos. Gracias a esta característica los nodos pueden confiar en que la información almacenada en ella es confiable y no ha sido modificada a conveniencia de algún nodo en particular. Anteriormente se comentó que existe desconfianza entre los diferentes nodos que conforman la red, pero esto no quiere decir que no exista un ente de confianza. La confianza se traslada a la cadena de bloques y es ella quien indica cuales son las transacciones válidas.</p> <p dir="ltr">La inmutabilidad de la cadena permite generar la historia de los datos; es decir, debido a que los datos que pertenecen a la cadena de bloques no pueden cambiar, es fácil rastrear la evolución de un dato. De hecho, muchas de las aplicaciones que existen actualmente en el mercado explotan esta característica de las cadenas de bloques (por ejemplo rastrean origen de oro, diamantes, alimentos, etc.). Por lo anterior, podemos hacernos la pregunta siguiente ¿El sistema requiere que los datos sean inmutables?</p> <h2 dir="ltr">Parte 2. Ejemplo</h2> <p dir="ltr">Con la intención de mostrar de manera práctica cómo utilizar el cuestionario descrito anteriormente, analizaremos si es pertinente utilizar las cadenas de bloques para implementar un sistema de manejo de inventario de bienes de inversión.</p> <p dir="ltr">Consideremos una institución académica donde la adquisición de algún bien material (computadoras, escritorios, sillas, etc) involucra la realización de una petición por escrito al Departamento de Administración indicando información personal, el bien solicitado y el costo del mismo; posteriormente la solicitud es enviada al Departamento de Patrimonio en donde se revisa y se autoriza la solicitud para después ser enviada a la Coordinación de Servicios Administrativos en donde es revisada nuevamente y enviada al Departamento de Proveeduría, es aquí donde se realiza la compra del bien y una vez que el bien es recibido se notifica al solicitante para que pueda acudir a retirarlo. En cuanto el bien es retirado por la persona que lo solicitó queda bajo su resguardo y a partir de este momento esta persona es responsable del bien material así como de su buen uso. Un proceso similar se lleva a cabo para dar de baja un bien por pérdida o descompostura. Existe un caso especial en donde un trabajador tiene el resguardo de cierto material y decide transferirlo a otro empleado. Este proceso se considera un traspaso de bienes y es realizado de forma similar al proceso de alta. La institución desea implementar un sistema de manejo de inventario que se ejecute en distintos dispositivos y que gestione de manera eficiente y segura los procesos descritos anteriormente.</p> <p dir="ltr">A continuación analizaremos cada uno de los puntos mencionados anteriormente en el contexto del problema planteado.</p> <style type="text/css">table, th, td{ border: 1px solid #666; } table th, table td{ padding: 6px; /* Apply cell padding */ } </style> <table border="1"> <tbody> <tr> <td>&nbsp;</td> <td> <p dir="ltr">Pregunta</p> </td> <td> <p dir="ltr">Respuesta</p> </td> <td> <p dir="ltr">Justificación</p> </td> </tr> <tr> <td> <p dir="ltr">a)</p> </td> <td> <p dir="ltr">¿Una base de datos tradicional (relacional o no relacional) es insuficiente para cubrir las necesidades del proyecto?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- Existe la necesidad de eliminar intermediarios</p> <p dir="ltr">- Se desea que el sistema sea descentralizado para aumentar la disponibilidad</p> </td> </tr> <tr> <td> <p dir="ltr">b)</p> </td> <td> <p dir="ltr">¿Se pueden identificar múltiples escritores en el sistema a desarrollar?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- Los escritores en el proyecto son el trabajador y proveeduría, ya que los demás serían innecesarios una vez implantada la solución</p> </td> </tr> <tr> <td> <p dir="ltr">c)</p> </td> <td> <p dir="ltr">¿Es posible que los datos se encuentren replicados en diversos nodos?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- No se tienen limitaciones en cuanto al hecho de que la información sea confidencial y no pueda estar replicada en distintos nodos</p> </td> </tr> <tr> <td> <p dir="ltr">d)</p> </td> <td> <p dir="ltr">¿El sistema a desarrollar soporta un manejo de una cantidad limitada de información y no requiere alto rendimiento?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- La cantidad de transacciones no es elevada y el manejo de inventario no requiere en este caso de grandes volúmenes de información</p> </td> </tr> <tr> <td> <p dir="ltr">e)</p> </td> <td> <p dir="ltr">¿Existe desconfianza entre los múltiples escritores que participan dentro del sistema?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- Un trabajador podría, por ejemplo, modificar la base de datos para simular un traspaso sin que este se realice realmente</p> </td> </tr> <tr> <td> <p dir="ltr">f)</p> </td> <td> <p dir="ltr">¿Se desea eliminar intermediarios de confianza?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- Los únicos participantes deberían ser los trabajadores y proveeduría, los demás intermediarios que participan actualmente en el proceso pueden ser eliminados.</p> </td> </tr> <tr> <td> <p dir="ltr">g)</p> </td> <td> <p dir="ltr">¿Es posible identificar quienes tomarían el papel de validadores en su sistema?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- No sería una buena idea forzar a que cada usuario (nodo) que utilice el sistema tenga que ser un validador. La alternativa más viable sería designar a un grupo de nodos encargados de la escritura de la cadena de bloques.</p> </td> </tr> <tr> <td> <p dir="ltr">h)</p> </td> <td> <p dir="ltr">¿Se tienen claras las reglas a seguir para determinar la validez de una transacción?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- Las reglas para que un usuario adquiera y se libere del resguardo de un bien están claras.</p> </td> </tr> <tr> <td> <p dir="ltr">i)</p> </td> <td> <p dir="ltr">¿El sistema involucra transacciones que sean dependientes?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- Por ejemplo, no es posible realizar una transacción de traspaso entre trabajadores si previamente no existe una transacción que involucre la recepción del bien por parte del trabajador que traspasa el bien</p> </td> </tr> <tr> <td> <p dir="ltr">j)</p> </td> <td> <p dir="ltr">¿El sistema requiere que los datos sean inmutables?</p> </td> <td> <p dir="ltr">SI</p> </td> <td> <p dir="ltr">- Es necesario conocer las distintas transacciones que han ocurrido a lo largo de la vida útil de un bien</p> </td> </tr> </tbody> </table> <p>&nbsp;</p> <p dir="ltr">A partir de este análisis, es posible concluir que este sistema sí se vería beneficiado por el uso de una cadena de bloques.</p> <h2 dir="ltr">Conclusiones</h2> <p dir="ltr">Las cadenas de bloques son una de las tecnologías que ha cobrado mayor popularidad en los últimos años, sin embargo muchos de los proyectos que utilizan cadenas de bloques son iniciados de manera apresurada y sin detenerse a pensar si es realmente necesario el hacer uso o no de dicha tecnología. Responder a la serie de preguntas que presentamos aquí es un ejercicio que conviene hacer antes de lanzarse en un proyecto que haga uso de una cadena de bloques con el fin de reducir las posibilidades de tomar una mala decisión.</p> <p dir="ltr"><strong>Referencias</strong></p> <ol dir="ltr"> <li>S. Nakamoto, “Bitcoin: A Peer-to-Peer Electronic Cash System”. <a href="https://bitcoin.org/">https://bitcoin.org</a></li> <li>P. Christy, “7 Strategies to Gain Value From a Doomed Blockchain Project”. Smarter with Gartner. <a href="http://swgu.ru/wp">http://swgu.ru/wp</a> &nbsp;</li> <li>S. K. Lo, X. Xu, Y. K. Chiam &amp; Q. Lu, “Evaluating suitability of applying blockchain” International Conference on Engineering of Complex Computer Systems (ICECCS), pag. 158-161, IEEE, 2017.</li> <li>G. Greenspan, “Avoiding the pointless blockchain project”. <a href="http://swgu.ru/wq">http://swgu.ru/wq</a>&nbsp;</li> </ol> <p dir="ltr">&nbsp;</p> </div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p dir="ltr">El Lic. Carlos Solís realiza la maestría en Ciencias y Tecnologías de la Información en la UAM-Iztapalapa, centrando su investigación en las cadenas de bloques y los retos que estas implican en la ingeniería de software.</p> <p>La Dra. Elizabeth Pérez Cortés es profesora-investigadora en la UAM-Iztapalapa. Realiza docencia e investigación en Sistemas Distribuidos, en particular en bases de datos distribuidas, sistemas par a par, datos abiertos enlazados y esquemas de incentivos. Ha dirigido diversas tesis de posgrado en los tópicos mencionados y realizado estancias de investigación en Francia, Colombia y Japón.</p> <p>El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el SEI, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. (<a href="http://www.humbertocervantes.net">www.humbertocervantes.net</a>)</p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 03 Sep 2018 01:25:08 +0000 sg 8337 at https://sg.com.mx https://sg.com.mx/revista/57/usar-o-no-blockchain#comments Designing Software Architectures: A Practical Approach https://sg.com.mx/revista/52/designing-software-architectures-practical-approach <span class="field field--name-title field--type-string field--label-hidden">Designing Software Architectures: A Practical Approach</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/humberto.jpg" width="989" height="548" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 03:14</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta ocasión tengo el gusto de compartir con ustedes la noticia de la reciente publicación del libro que escribí junto con mi colega Rick Kazman quien es investigador en el Software Engineering Institute (SEI). Nuestro libro lleva por título “Designing Software Architectures - A Practical Approach” (Diseñando Arquitecturas de Software - Un Enfoque Práctico) y fue publicado por la editorial Addison Wesley en la colección “SEI Series in Software Engineering”.</p><p dir="ltr"><img src="https://lh3.googleusercontent.com/xHuoR_tQmRPKr5UcrMRwL8BatKjFbrjA7GN2ppO78FSnDqT7CZtvLQFveNkBur6C5EZJsjp0lXSsQ2m0eoeDv1-TvkXNv50FbTYEtEgsACX8Mw1cc_W3WKSOk7BB0ivb2qCAe5uV" alt="PortadaLibro.jpg" width="372" height="552" /></p><p dir="ltr">Nuestro libro se enfoca en el método de Diseño Guiado por Atributos (Attribute-Driven Design), o ADD; un método de diseño de arquitecturas originalmente creado por el Software Engineering Institute y del cual hablé en la columna <a href="https://sg.com.mx/revista/29/diseno-la-arquitectura#.V6jY05PhCRs">“Diseño de la Arquitectura”, en SG 29</a>. A pesar de que ADD ha existido por más de una década, se ha escrito relativamente poco al respecto y es difícil encontrar ejemplos de cómo llevarlo a cabo. Esta falta de información ha complicado su adopción y enseñanza. Además, la información que se ha publicado acerca de ADD tiende a ser un tanto abstracta y puede ser difícil conectarla con los conceptos, prácticas y tecnologías que los arquitectos usan en sus actividades cotidianas.</p><p dir="ltr">Rick y yo hemos guiado a arquitectos de software durante años en la realización del proceso de diseño y, al mismo tiempo, hemos estado aprendiendo de ellos; por ejemplo, que en la práctica los arquitectos consideran la tecnología de forma temprana en el proceso de diseño y esto es algo que no era parte de la versión original de ADD. Por tal razón, el método original parecía “desconectado” de la realidad para la gente de la industria. En este libro presentamos una versión revisada de ADD en la cual hemos tratado de reducir la brecha entre la teoría y la práctica.</p><p dir="ltr">Durante varios años, hemos estado también enseñando arquitectura de software y la manera en que se realiza el diseño de la misma. Nos hemos dado cuenta que a la gente que no tiene experiencia le es muy difícil diseñar arquitecturas. Este entendimiento nos empujó a crear una “hoja de ruta” que creemos será útil para guiar en la realización del proceso de diseño. También creamos un juego que es útil para enseñar acerca del diseño de arquitecturas, y que se puede considerar como un complemento al libro (ver “<a href="http://sg.com.mx/revista/49/smart-decisions-un-juego-para-aprender-arquitectura-y-big-data#.V6kFB5PhCRs">Smart Decisions: Un juego para aprender Arquitectura y Big Data” en SG 49</a>).</p><p dir="ltr">Nuestro libro está dirigido a cualquier persona que esté interesada en el diseño de arquitecturas de software. Creemos que será particularmente útil para los practicantes que deben realizar esta tarea, pero que actualmente la realizan de forma ad hoc. Los practicantes con experiencia que ya realizan el diseño siguiendo un método establecido también encontrarán nuevas ideas, por ejemplo, cómo dar seguimiento al proceso de diseño usando un tablero Kanban o cómo analizar el diseño usando cuestionarios basados en tácticas. Por último, la gente que está familiarizada con otros métodos del Software Engineering Institute encontrarán información acerca de la manera de combinar ADD con métodos tales como el taller de atributos de calidad QAW, el método de análisis de compromisos arquitectónicos ATAM (ver <a href="https://sg.com.mx/revista/31/arquitectura-evaluacion-la-arquitectura-software#.V6kHIJPhBPU">SG 31</a>) y el método de análisis de costos beneficios CBAM.</p><p dir="ltr">Este libro también será útil para estudiantes y profesores de programas de ciencias de la computación o de ingeniería de software. Creemos que los casos de estudio que describimos ayudarán a entender a través de ejemplos la manera de realizar el proceso de diseño más fácilmente. Como dijo Einstein: “El ejemplo no es otra manera de enseñar, es la única manera de enseñar”.</p><p dir="ltr">Esperamos que nuestro libro permita entender que el diseño puede realizarse siguiendo un método y que el hacerlo de esta manera es de gran ayuda para producir mejores sistemas de software.</p><p dir="ltr">Su estructura es de la siguiente manera siguiente:</p><ul><li dir="ltr"><p dir="ltr">En el capítulo 1 presentamos una introducción breve del concepto de arquitectura de software y del método ADD.</p></li><li dir="ltr"><p dir="ltr">En el capítulo 2 discutimos acerca del diseño de arquitecturas de manera más detallada, junto con las entradas principales al proceso de diseño a las cuales llamamos los drivers de la arquitectura. Además, hablamos de los conceptos de diseño que son ‘bloques de construcción’ a partir de los cuales se construye la arquitectura y que permiten satisfacer estos drivers usando soluciones probadas.</p></li><li dir="ltr"><p dir="ltr">El capítulo 3 presenta el método ADD de forma detallada. Presentamos cada uno de los pasos del método junto con varias técnicas que pueden ser usadas para llevar a cabo estos pasos de manera adecuada.</p></li><li dir="ltr"><p dir="ltr">El capítulo 4 presenta un primer caso de estudio que ilustra el desarrollo de un sistema “desde cero”. Para este caso de estudio, hemos hecho un esfuerzo por mostrar la manera en que la mayoría de los conceptos descritos en el capítulo 3 son usados en el proceso de diseño, así que este caso de estudio tiene una naturaleza más “académica” (aunque se deriva de un sistema del mundo real).</p></li><li dir="ltr"><p dir="ltr">El capítulo 5 presenta un segundo caso de estudio que escribimos junto con arquitectos de software expertos en big data y, por ello, tiene muchos más detalles técnicos que el anterior. Este caso de estudio describe los detalles finos de cómo usar ADD en el diseño de un sistema de big data que involucra diversas tecnologías. Este ejemplo ilustra también lo que consideramos un diseño en un dominio “novedoso”, a diferencia del dominio más tradicional usado en el capítulo 4.</p></li><li dir="ltr"><p dir="ltr">El capítulo 6 es un caso de estudio más corto que describe el uso a ADD para realizar la extensión de un sistema legado, lo cual es una situación común en la práctica. Este ejemplo demuestra que el diseño arquitectural no es algo que se realice una sola vez, al inicio del desarrollo del sistema, sino que más bien es una actividad que puede ser realizada en distintos momentos del proceso de desarrollo.</p></li><li dir="ltr"><p dir="ltr">El capítulo 7 presenta otros métodos de diseño. En nuestra revisión de ADD, adoptamos ideas de otros autores que también han investigado el proceso de diseño y aquí resumimos brevemente sus enfoques como un homenaje a sus propuestas y como una comparativa de ADD a estos métodos.</p></li><li dir="ltr"><p dir="ltr">El capítulo 8 discute acerca del tema del análisis de forma detallada. Aún si el tema principal de este libro es el diseño, el análisis se realiza naturalmente como parte del mismo, así que aquí describimos técnicas de análisis que pueden ser usadas durante el proceso de diseño o después de que una parte del diseño ha sido completada. En particular, describimos el uso de cuestionarios basados en tácticas, los cuales son útiles para entender de forma simple y rápida las decisiones que se realizan durante el proceso de diseño.</p></li><li dir="ltr"><p dir="ltr">El capítulo 9 describe la manera en que el proceso de diseño embona a nivel organizacional. Por ejemplo, es posible realizar cierta cantidad de diseño en los momentos más tempranos del ciclo de vida con el fin de realizar la estimación del proyecto (ver <a href="http://sg.com.mx/revista/46/arquitectura-y-preventa#.V6kPhpPhCRs">“Arquitectura y Preventa” en SG 46</a>). Mostramos también cómo ADD puede ser usado con distintos enfoques de desarrollo, como por ejemplo, con las metodologías ágiles o con métodos más establecidos como el Team Software Process (TSP).</p></li><li dir="ltr"><p dir="ltr">El capítulo 10 concluye el libro.</p></li></ul><p dir="ltr">Incluímos también dos apéndices. El A presenta un “catálogo de conceptos de diseño” que, como su nombre indica, es un catálogo de distintos tipos de conceptos de diseño que pueden ser usados para un dominio aplicativo particular (ver “<a href="http://sg.com.mx/revista/38/conceptos-dise%C3%B1o-patrones-t%C3%A1cticas-y-frameworks#.V6kQB5PhCRs">Conceptos de Diseño: Patrones, Tácticas y Frameworks” en SG 38</a>). Este catálogo presenta conceptos de diseño que recopilamos de distintas fuentes y refleja la manera en que los arquitectos con experiencia trabajan en el mundo real. En este caso, el catálogo contiene una muestra de conceptos de diseño usados en el caso de estudio presentado en el capítulo 4. El apéndice B provee un conjunto de cuestionarios basados en tácticas para los siete atributos de calidad más comunes, así como un cuestionario adicional para DevOps.</p><h2 dir="ltr">Conclusión</h2><p dir="ltr">Debo decir que me llena de orgullo el haber escrito un libro para la prestigiosa colección editorial del Software Engineering Institute que, además, es el nuevo material de referencia para el curso “Software Architecture Design and Analysis” que se imparte en el SEI. Espero que sea de mucha utilidad para la comunidad de desarrollo en México y en el resto del mundo.</p><p dir="ltr">Quiero aprovechar para agradecer a Pedro Galván y su equipo por la oportunidad que me han dado a lo largo de estos años de escribir esta columna de arquitectura de software. Como se puede apreciar en las distintas referencias que hice a números pasados de la revista, muchos de los temas desarrollados de forma detallada en el libro han sido presentados de forma resumida a lo largo de los años en esta columna.</p><p dir="ltr">Para terminar, incluyo una liga en donde se puede adquirir el libro: <a href="https://goo.gl/Wd01TL">https://goo.gl/Wd01TL</a></p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el SEI, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. (<a href="http://www.humbertocervantes.net">www.humbertocervantes.net</a>)</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 08:14:37 +0000 sg 6832 at https://sg.com.mx https://sg.com.mx/revista/52/designing-software-architectures-practical-approach#comments Smart Decisions: Un juego para aprender arquitectura y big data https://sg.com.mx/revista/49/smart-decisions-un-juego-para-aprender-arquitectura-y-big-data <span class="field field--name-title field--type-string field--label-hidden">Smart Decisions: Un juego para aprender arquitectura y big data</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/arq.jpg" width="800" height="500" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 12/22/2015 - 21:14</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/49" hreflang="und">SG #49</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta ocasión les hablaré de Smart Decisions, un juego que he desarrollado junto con mis colegas Rick Kazman del Software Engineering Institute (SEI) así como Serge Haziyev y Olha Hrytsay de la empresa Softserve. El objetivo del juego es ilustrar la manera en que se realiza el diseño de la arquitectura mediante el método de diseño Attribute Driven Design (ADD). Como parte del juego, se simula el diseño de un sistema de Big Data.</p><p>Comenzaremos recordando el método de diseño ADD y después hablaremos acerca de los detalles del juego incluyendo un enlace para descargar los materiales y jugarlo.</p><h3>Repaso: diseño de arquitectura</h3><p>La actividad de diseño de la arquitectura (ver SG29) se enfoca en la traducción de drivers, hacia un conjunto de estructuras que conforman la arquitectura. Recordemos que los drivers incluyen requerimientos funcionales primarios, atributos de calidad y restricciones (ver SG28).</p><h3>Attribute Driven Design</h3><p>La transformación antes mencionada se puede realizar de manera sistemática usando el método de diseño Attribute Driven Design (ADD). ADD es un método iterativo de diseño de arquitecturas de software. El método consta de siete pasos que se muestran en la figura 1.</p><p><img src="/sites/default/files/images/stories/sg49/arq-fig1.jpg" alt="" width="600" /></p><p>Figura 1. Pasos del método de diseño ADD.</p><p>Las actividades son las siguientes:</p><ol><li>El arquitecto se asegura de que tiene una buena comprensión acerca de los drivers que se usan como entradas al proceso de diseño.</li><li>Se elige el subconjunto de drivers que serán tratados en la iteración.</li><li>El diseño procede mediante el refinamiento de uno o más elementos que son elegidos en este paso. El refinamiento puede involucrar la descomposición de un elemento en subelementos y sus relaciones, o bien puede involucrar diseño adicional de elementos previamente identificados. Al inicio del proceso de diseño de sistemas ‘greenfield’ (desde cero), el único elemento que puede ser elegido es el sistema mismo, que es concebido como un único elemento. En iteraciones subsecuentes, o en el diseño de cambios a un sistema existente, se eligen uno o más elementos previamente definidos.</li><li>Este paso involucra la identificación y selección de conceptos de diseño, que describiremos a continuación, que permitirán satisfacer los drivers elegidos para la iteración</li><li>Una vez que los conceptos de diseño han sido elegidos, los elementos que se derivan son identificados y conectados. En este paso es donde nuevas estructuras se crean o estructuras existentes se refinan. Adicionalmente, las responsabilidades de los elementos se establecen y las interfaces expuestas por los elementos se definen.</li><li>A pesar de que la documentación formal ocurre después del proceso de diseño, cierta información debe registrarse durante el diseño, cuando aún se encuentra fresca en la mente del arquitecto y hay menos probabilidad de que la olvide. En este paso se registra dicha información que incluye bosquejos de las estructuras creadas en el paso previo junto con decisiones de diseño y su justificación (rationale).</li><li>En este paso, el arquitecto realiza un análisis de las decisiones de diseño que fueron realizadas durante la iteración y también del proceso de diseño en su conjunto. Como resultado, se toma la decisión de seguir realizando más iteraciones o de parar el diseño y de proceder a la implementación.</li></ol><h3>Conceptos de diseño</h3><p>En el paso 4 del método ADD se eligen conceptos de diseño, que son los “bloques de construcción” del diseño de la arquitectura (ver SG46). Estos bloques son soluciones probadas a problemas recurrentes de diseño y pueden ser de naturaleza conceptual o concreta. Los tipos de conceptos de diseño que se consideran incluyen: arquitecturas de referencia, patrones, tácticas, familias tecnológicas y productos o frameworks.</p><p>Una de las dificultades que existen al momento de diseñar una arquitectura de software es la selección de conceptos de diseño. Existen cientos de patrones y tecnologías de dónde escoger y, además, la selección es complicada pues frecuentemente no es sencillo entender la influencia que puede tener un concepto de diseño particular sobre los atributos de calidad del sistema. Por ejemplo, cierta tecnología, ¿impacta o favorece el desempeño?</p><p>Como se puede apreciar, el diseño de arquitecturas de software no es una tarea sencilla, sin embargo, el uso de un método como ADD permite realizar esta actividad de manera sistemática lo cual aumenta las posibilidades de obtener un mejor resultado.</p><h3>Smart Decisions</h3><p>Dada la importancia de diseñar arquitectura siguiendo un método como ADD, decidimos desarrollar un juego cuyo objetivo es ilustrar conceptos importantes asociados con el diseño de arquitectura. Está diseñado para jugarse tanto por estudiantes como por practicantes que no tengan mucha experiencia en el diseño de arquitecturas. Cabe señalar que el juego no busca sustituir a los cursos de diseño de arquitectura, sino más bien, busca ser un complemento a los mismos.</p><p>Algunos de los conceptos principales que son ilustrados en el juego son los siguientes:</p><ul><li>El diseño arquitectural se desarrolla de manera iterativa y puede realizarse de manera sistemática usando un método como ADD.</li><li>El diseño arquitectural comienza con drivers e involucra realizar decisiones de diseño. Algunas de estas decisiones incluyen elegir conceptos de diseño, lo cual generalmente es complicado, sobre todo para los diseñadores que se enfrentan con una “página en blanco” al iniciar el diseño.</li><li>Todo concepto de diseño tiene una influencia sobre los drivers y, más específicamente, sobre los atributos de calidad.</li><li>Las decisiones de diseño tienen consecuencias: algunas decisiones son mejores (de ahí que el juego se llame “Smart Decisions”) y algunas no lo son tanto. Por otro lado, las decisiones que se hacen en una iteración pueden tener consecuencias en iteraciones posteriores.</li><li>Las decisiones de diseño deben ser registradas y analizadas como parte del proceso de diseño.</li></ul><p>Smart Decisions requiere un mínimo de dos jugadores y un máximo de seis. Los jugadores pueden ser individuos o grupos de individuos. Adicionalmente, requiere de un facilitador que explique el contexto y la mecánica del juego. El juego se juega en una serie de rondas que representan distintas iteraciones del proceso de diseño de un sistema nuevo (greenfield).</p><p>En la primer iteración, el facilitador describe la manera en que los pasos de ADD se llevan a cabo en el juego. Como parte de la explicación inicial, el facilitador presenta también el contexto del juego, es decir, la descripción de los drivers del sistema que se va a diseñar. Actualmente, Smart Decisions cuenta con un contexto de juego de un sistema de Big Data, sin embargo, está diseñado para ser extensible y que en el futuro se puedan agregar contextos de juego relacionados con otros dominios aplicativos.</p><p>Para cada iteración, el juego proporciona la siguiente información, que equivale a lo que se obtendría de los pasos 2 y 3 de ADD:</p><ul><li>Objetivo de la iteración.</li><li>Drivers a considerar.</li><li>Elemento a refinar.</li><li>Alternativas de conceptos de diseño a considerar.</li></ul><p>A continuación, los jugadores deben elegir conceptos de diseño a partir de las alternativas que se les proponen. Esto representa la actividad que se realiza en el paso 4 de ADD y es la parte medular del juego. Los conceptos de diseño se presentan como un conjunto de cartas y cada una de estas cartas contiene información acerca de un concepto de diseño particular (ver figura 2). La información que se presenta en la carta incluye un nombre, un diagrama (si aplica), una descripción y una lista de drivers así como la influencia del concepto de diseño sobre los mismos. La influencia se mide mediante puntos, que están representados como estrellas. Un punto significa que el concepto de diseño no contribuye mucho a satisfacer el driver mientras que tres puntos significa que el concepto de diseño contribuye en gran medida para satisfacer el driver.</p><p><img style="border: 1px solid black;" src="/sites/default/files/images/stories/sg49/arq-fig2.jpg" alt="" width="600" /></p><p>Figura 2. Tarjeta de un concepto de diseño relacionado con Big Data.<br /><br /></p><p>Una vez que los jugadores han elegido una carta, calculan un total en base a la influencia del concepto de diseño seleccionado sobre los drivers asociados a la iteración.&nbsp; Después de eso, simulan el paso 5 de ADD tirando dos dados. Respecto al paso 6 de ADD, como parte del juego no se realizan bosquejos del diseño, pero sí se documentan las decisiones de diseño, es decir los conceptos de diseño elegidos.</p><p>El paso 7 de ADD es guiado por el facilitador quien describe cuáles eran las opciones más apropiadas a elegir como parte de las iteraciones. Dependiendo de lo elegido, los jugadores reciben puntos adicionales o bien son penalizados. Para cada iteración se calcula un puntaje total que combina los puntos de las cartas elegidas, el resultado de tirar los dados y los bonos o penalizaciones resultantes del análisis. Al final del juego, se suman los puntos recibidos en las distintas iteraciones y se calcula un total. El jugador con el total más alto gana.</p><p>Una vez que termina el juego, el facilitador promueve una discusión con los participantes con el fin de intercambiar experiencias y opiniones relativas al juego y al proceso de diseño de arquitecturas en general. Esta discusión es un aspecto fundamental dentro de las sesiones de juego.</p><h3>Conclusión</h3><p>Smart Decisions es un juego que busca ilustrar el proceso que se sigue para diseñar arquitecturas de software usando ADD. Actualmente, el juego dispone de contenido enfocado al diseño de un sistema de Big Data, pero en el futuro esperamos disponer de otros contextos de juego. Hemos tenido la oportunidad de realizar sesiones de juego con diversas poblaciones que incluyen arquitectos de software, profesores y también con estudiantes(1). A raíz de estas sesiones, hemos recibido retroalimentación muy positiva acerca del juego.</p><p>Por último, cabe señalar que el juego está disponible de forma gratuita en <a href="http://www.smartdecisionsgame.com" target="_blank">http://www.smartdecisionsgame.com</a></p><p>Los invitamos a que lo descarguen, lo jueguen y nos den su opinión al respecto. Adicionalmente, estamos buscando contribuciones de la comunidad para generar otros contenidos en áreas distintas a Big Data. <br /><br />Referencias</p><ol><li>Cervantes, H., Haziyev, S., Hrytsay, O., Kazman, R. “Smart Decisions: An Architecture Design Game”, <a href="http://resources.sei.cmu.edu/library/asset-view.cfm?assetid=436542" target="_blank">http://resources.sei.cmu.edu/library/asset-view.cfm?assetid=436542</a>, SATURN Conference 2015.</li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el SEI, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. http://humbertocervantes.net</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 23 Dec 2015 03:14:56 +0000 sg 6215 at https://sg.com.mx https://sg.com.mx/revista/49/smart-decisions-un-juego-para-aprender-arquitectura-y-big-data#comments Seguridad y uso de Frameworks https://sg.com.mx/revista/47/seguridad-y-uso-frameworks <span class="field field--name-title field--type-string field--label-hidden">Seguridad y uso de Frameworks</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/seguridad.jpg" width="640" height="427" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 05/25/2015 - 00:17</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/47" hreflang="und">SG #47</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> <li><a href="/buzz/autores-sg/rick-kazman" hreflang="und">Rick Kazman</a></li> <li><a href="/buzz/autores-sg/jungwoo-ryoo" hreflang="und">Jungwoo Ryoo</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr">En esta ocasión resumiré un trabajo que presenté en la conferencia SATURN 2014 de arquitectura de software junto con mis colegas Rick Kazman y Jungwoo Ryoo. Rick Kazman es investigador del Software Engineering Institute y académico en la Universidad de Hawaii. Jungwoo Ryoo es investigador de la Universidad del estado de Pennsylvania y &nbsp;experto en temas de seguridad. Cabe señalar que la conferencia SATURN, organizada por el SEI, está enfocada a los practicantes y que este trabajo fue muy bien recibido por dicha comunidad, por lo que considero que puede ser de interés para los lectores de esta columna.</p><h3 dir="ltr">Enfoque arquitectónico hacia la seguridad</h3><p dir="ltr">La seguridad del software es una preocupación cada vez más importante para las organizaciones. Sin embargo, pocos arquitectos abordan este atributo de calidad de manera estratégica. Los arquitectos y desarrolladores frecuentemente ponen un énfasis mayor en satisfacer los requerimientos funcionales, y la seguridad usualmente es aplicada como un “parche” durante o después de que la aplicación ha sido desarrollada.</p><p dir="ltr">Desarrollar código enfocado a la seguridad es una tarea compleja y, por ello, frecuentemente se recurre a la adopción y uso de frameworks que se enfocan en atender distintas áreas de la seguridad como pueden ser el control de acceso, el cifrado y la validación de entradas entre otras.</p><p dir="ltr">Podemos identificar tres enfoques relativos a la adopción de frameworks como parte del diseño de la arquitectura para resolver la seguridad:</p><ul><li dir="ltr"><p dir="ltr">No adopción: La seguridad no es considerada dentro del diseño de la arquitectura y solamente se codifican soluciones ad-hoc para tratar aspectos de seguridad.</p></li><li dir="ltr"><p dir="ltr">Adopción parcial: Se introducen frameworks de seguridad después del diseño inicial de la arquitectura.</p></li><li dir="ltr"><p dir="ltr">Adopción completa: La seguridad es considerada dentro del diseño inicial de la arquitectura y parte de las decisiones del diseño incluyen el uso de frameworks enfocados a la seguridad.</p></li></ul><h3 dir="ltr">Caso de estudio</h3><p dir="ltr">Con el fin de comprender las consecuencias de los tres enfoques descritos anteriormente, realizamos un estudio sobre tres distintos sistemas empresariales accesibles vía web:</p><ul><li dir="ltr"><p dir="ltr">Sistema 1. Un sistema de administración de registros médicos de fuente abierta llamado OpenEMR [1]. Desarrollado en PHP y representa el enfoque de no adopción.</p></li><li dir="ltr"><p dir="ltr">Sistema 2. Un portal web desarrollado usando HTML y JSP. En un principio utilizaba un enfoque de no adopción y posteriormente se decidió agregar una solución comercial para mitigar riesgos de seguridad en el código, aplicando así un enfoque de adopción parcial. Nos referiremos a éste como “Sistema 2 Antes” y “Sistema 2 después”.</p></li><li dir="ltr"><p dir="ltr">Sistema 3. Una aplicación interna programada en Java por una empresa mexicana. Este sistema representa el enfoque de adopción completa. Utiliza Spring security [2] como framework primario de seguridad pero también utiliza el framework ZK [3] en la capa de presentación, que también brinda protección de ataques comunes en esta capa.</p></li></ul><p dir="ltr">Estos sistemas fueron analizados utilizando la herramienta IBM AppScan que analiza alrededor de 33 tipos distintos de vulnerabilidades tales como inyección de SQL, negación de servicio o indexado de directorios. La herramienta genera un reporte de resultados indicando la cantidad de vulnerabilidades identificadas, agrupadas por severidad. El análisis se enfocó únicamente en los aspectos de software, por lo que se deshabilitó hardware de seguridad tal como firewalls.</p><p dir="ltr">Adicionalmente se realizó una entrevista a los arquitectos de los distintos sistemas para entender los enfoques de seguridad que siguieron. Estas entrevistas se basaron en la lista de 17 tácticas de seguridad que se muestra en la Figura 1. Para cada una de las tácticas se le preguntó al arquitecto si la había considerado y, en caso afirmativo, qué medidas había tomado al respecto.</p><p dir="ltr"><img src="https://lh4.googleusercontent.com/w-z5LN4nsk11UQt1bxTh60hLirT3gGXV1DxkeeNwwiqG7Yxsf6ESvWSoNxSUIfPGeflx2DUqNXFPpSzAtRdFnLLRDUNVOHTz7yca5XePyQjB-_Gt4wQVxYrUERaX19MCxIEcIHI" alt="" width="568px;" height="340px;" /></p><p dir="ltr">Figura 1: Categorización de tácticas de seguridad.</p><h3 dir="ltr">Resultados</h3><p dir="ltr">La tabla 1 presenta un resumen del resultado del análisis sobre los distintos sistemas.</p><p dir="ltr"><img src="https://lh4.googleusercontent.com/5ZSkCJMj5VXcp0prIuLTwij-0XNXwDUounXsA2wQpCKh09V8lvl0LzUYKlJL6T3utZ8JfRsTxHHm1IheVk-lg8MLQJIJw4nDzLg37qLk406PMz9lX-DW-VHhV8oP5saspUfNwiA" alt="" width="568px;" height="472px;" /></p><p dir="ltr">Como se puede observar de la tabla, los enfoques de adopción parcial y completa tienen los mejores resultados ya que ninguno de estos sistemas exhibió vulnerabilidades de severidad alta. En el caso del sistema 2, llama la atención que al introducir un framework de seguridad se eliminaron por completo las vulnerabilidades de severidad alta, y las medianas se recortaron a la mitad.</p><p dir="ltr">Por otro lado podemos apreciar que, a excepción del sistema 3, en los demás casos &nbsp;una parte de las tácticas fueron implementadas mediante programación ad-hoc, y no usando frameworks u otros mecanismos externos. Podemos observar una relación entre el esfuerzo que estimaron los arquitectos para satisfacer aspectos de seguridad y el número de tácticas implementadas de manera ad-hoc.</p><p dir="ltr">Como era de esperarse, el enfoque de adopción completa resultó ser el mejor ya que el sistema en que se usó, es decir el sistema 3, no tuvo vulnerabilidades de severidad alta, y el esfuerzo que el arquitecto estimó haber dedicado a atender aspectos de seguridad fue bajo en comparación con los demás sistemas, además de que este fue el sistema en el cual se implementó la mayor cantidad de tácticas.</p><h3 dir="ltr">Consideraciones</h3><p dir="ltr">La muestra de sistemas que se usó para este estudio es muy pequeña y esto impide llegar a conclusiones definitivas. Sin embargo, y a pesar del tamaño de la muestra, los resultados obtenidos permiten emitir la recomendación siguiente: la seguridad es un atributo de calidad que no se debe dejar “para después” y es conveniente elegir frameworks como parte de las decisiones de diseño de la arquitectura.</p><p dir="ltr">El &nbsp;uso de frameworks tiene sentido pues quien desarrolla una aplicación para un dominio particular generalmente no es un especialista en temas de seguridad. Por otro lado, intentar desarrollar código ad-hoc para satisfacer aspectos de seguridad consume recursos valiosos del proyecto que podrían más bien estar enfocados en resolver la problemática de negocio.</p><p dir="ltr">Las únicas dificultades asociadas con el uso de frameworks para manejar la seguridad son las posibles curvas de aprendizaje asociada con los frameworks, y la necesidad de mantener actualizados los frameworks para estar al día respecto a las nuevas amenazas que aparecen con el tiempo.</p><p dir="ltr">Es conveniente, además, atender la seguridad usando una combinación de software y hardware como, por ejemplo, cortafuegos.</p><p dir="ltr">Una recomendación adicional es que al diseñar la arquitectura de un sistema, conviene tomar el catálogo de tácticas mostrado en la figura 1 a manera de checklist para asegurarnos que estamos cubriendo las distintas tácticas de seguridad.</p><h3 dir="ltr">Conclusión</h3><p dir="ltr">La seguridad es un aspecto de gran importancia en la mayoría de las aplicaciones y es por ello que se le debe dar una consideración primordial como parte del diseño de la arquitectura. El considerar la seguridad desde el principio y usar frameworks para soportarla puede dar excelentes resultados.</p><p dir="ltr">Aprovecho este espacio para comentarles que estamos buscando más casos de estudio por lo cual si están interesados en que alguna de sus aplicaciones empresariales forme parte de este estudio no duden en contactarme en <a href="mailto:hcm@xanum.uam.mx">hcm@xanum.uam.mx</a>. Los resultados del análisis y los datos de su organización serán confidenciales.</p><p dir="ltr">En la <a href="http://goo.gl/cZUIi5">http://goo.gl/cZUIi5</a> pueden encontrar un video de la presentación de este trabajo realizada en SATURN 2014.</p><p dir="ltr">En <a href="http://goo.gl/plbwrJ">http://goo.gl/plbwrJ</a> pueden encontrar una lista de frameworks de seguridad (en constante evolución).</p><p dir="ltr">&nbsp;</p><p dir="ltr">Referencias</p><ol><li dir="ltr"><p dir="ltr">Bass, Clements y Kazman, “Software Architecture in Practice”, 3a Edición, Addison-Wesley Professional, 2012.</p></li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p dir="ltr">El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa y consultor independiente especializado en arquitectura de software. Está certificado como ATAM Evaluator y Software Architecture Professional por parte del Software Engineering Institute.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 25 May 2015 05:17:36 +0000 sg 5878 at https://sg.com.mx https://sg.com.mx/revista/47/seguridad-y-uso-frameworks#comments Arquitectura y Preventa https://sg.com.mx/revista/46/arquitectura-y-preventa <span class="field field--name-title field--type-string field--label-hidden">Arquitectura y Preventa</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/arquitectura1.png" width="838" height="470" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 12/16/2014 - 15:45</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/46" hreflang="und">SG #46</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta ocasión hablaré acerca del uso de técnicas de desarrollo de arquitectura de software como parte de la etapa de preventa de los proyectos de software.</p><p>Por preventa me refiero a la etapa que ocurre cuando se hace una propuesta de solución para desarrollar un sistema de software. El cliente típicamente solicita propuestas a varios proveedores, da cierto periodo de tiempo para recibir propuestas (que puede ir de unos cuantos días a algunas semanas), y selecciona una propuesta/proveedor para realizar el proyecto.</p><p>Tradicionalmente se piensa que el desarrollo de la arquitectura inicia hasta la operación de un proyecto, sin embargo y como describiré en esta columna, es conveniente iniciar las actividades de desarrollo de arquitectura desde la etapa de preventa con el fin de lograr una propuesta más pertinente tanto para el cliente como para la organización que planea llevar a cabo el proyecto.</p><h3>Preventa</h3><p>La preventa se enfoca en establecer por un lado el alcance del proyecto y, por el otro, una estimación del tiempo y costo que llevará la realización del proyecto de desarrollo. La estimación que se genera durante la preventa permite al cliente tomar la decisión de si acepta o no que se realice el proyecto. Aunque en este artículo me estaré refiriendo a la preventa en un contexto de desarrollo de software a la medida, lo que aquí describo puede aplicarse también en otros contextos.</p><p>La preventa cubre actividades de la fase de inicio y planeación del ciclo de vida tradicional de la administración de proyecto. Sin embargo, dado que el propósito de la preventa es conseguir la aprobación de la realización del proyecto, muchas veces las actividades que se realizan durante la preventa son menos detalladas que lo que se hace una vez que el proyecto ha iniciado de manera formal. Por ejemplo, durante la preventa es muy probable que no se tenga claridad sobre quiénes serán las personas específicas que ejecutarán el proyecto; simplemente se determina cuántas personas y con qué perfiles se necesitarían para llevar a cabo el proyecto de acuerdo a la solución y tiempos propuestos.</p><p>Hay que señalar que durante la preventa se tiene un contexto particular y complicado, en el cual muchas veces se deben considerar:</p><ul><li>Información limitada: Generalmente no será sino hasta que se ejecute el proyecto que se levantarán los requerimientos de forma detallada, por lo que al momento de la preventa sólo se cuenta con requerimientos de alto nivel (que aquí llamaremos “características”). La figura 1 muestra un diagrama basado en la pirámide de requerimientos de Leffingwell donde está marcado en rojo el contexto de requerimientos con el que operamos durante la preventa.</li><li>Poco tiempo: Muchas veces las propuestas de preventa deben ser desarrolladas en tiempos cortos. Esto es porque generalmente el cliente solicita que se le entregue una cotización rápidamente pero, también, porque la empresa de desarrollo no desea dedicar demasiado esfuerzo en una actividad que muchas veces no se cobra y para la cual no hay garantía que haya un beneficio a largo plazo.</li></ul><h3>Desarrollo de arquitectura durante la preventa</h3><p>Uno de los aspectos fundamentales del trabajo que se realiza en la preventa es la estimación. Lograr una estimación adecuada muchas veces requiere de establecer un esbozo de solución, por ejemplo, para dimensionar el hardware que se debe adquirir como parte del proyecto o para conocer el tipo de recursos que deben ser asignados o contratados para la ejecución del mismo.</p><p>Es en el desarrollo de esta solución preliminar que las técnicas de desarrollo de arquitectura de software pueden aportar beneficios importantes si dichas técnicas son adaptadas para el contexto particular de la preventa. Recordemos que el ciclo de vida de la arquitectura de software consta de 4 etapas que incluyen requerimientos, diseño, documentación y evaluación (ver SG #27). A continuación veremos de qué manera puede ser adaptada cada una de estas etapas para el contexto de la preventa.</p><h3>Drivers de arquitectura durante la preventa</h3><p>Recordemos que dentro de los requerimientos de un sistema de software, una parte de ellos es la que influye de manera decisiva sobre la arquitectura. Estos requerimientos son conocidos como drivers de la arquitectura e incluyen requerimientos funcionales primarios, atributos de calidad y restricciones (ver <a href="http://sg.com.mx/revista/28/requerimientos-y-arquitectura">SG #28</a>).</p><p>Como mencioné previamente, al momento de realizar la preventa de un proyecto no se cuenta con requerimientos detallados del proyecto, ya que en general estos no serán levantados y especificados sino hasta que el proyecto esté siendo ejecutado. Muchas veces sólo se dispone de características o requerimientos de alto nivel. Con el fin de poder diseñar una solución preliminar con el fin de estimar, es importante que durante la preventa se considere obtener drivers de preventa que incluyen:</p><ul><li>Características funcionales. A diferencia de los drivers tradicionales en donde sólo se considera la funcionalidad primaria, en general en la preventa es necesario considerar toda la funcionalidad pues la estimación del proyecto debe considerar todas las características funcionales del mismo.</li><li>Características de atributos de calidad. Durante la preventa es complicado hacer un levantamiento detallado de los atributos de calidad, y más particularmente, especificarlos como escenarios. Dos aspectos que se deben cuidar particularmente son, sin embargo, el identificar las categorías de atributos de calidad más relevantes para el proyecto y, por otro lado, un rango preliminar en relación con las métricas asociadas a estos atributos de calidad.</li><li>Restricciones. Es necesario identificar desde el inicio las restricciones al diseño de la solución. En particular es importante identificar restricciones que pueden influir en la estimación y que pueden tener que ver con el tipo de tecnología a utilizar, los sistemas con los que interactúa el sistema que se va a desarrollar y el entorno de operación del sistema.</li></ul><h3>Diseño de arquitectura durante la preventa</h3><p>Una vez que se tienen identificados los drivers de preventa, es posible proceder al diseño de la solución. Algo que es importante considerar es que durante la fase de preventa, el objetivo principal del diseño de la arquitectura es de establecer una estructura que permita estimar el proyecto. Lo anterior diferencía el diseño de arquitectura que se hace en preventa del diseño de arquitectura que se hace durante la operación de un proyecto (ver <a href="http://sg.com.mx/revista/29/diseno-la-arquitectura">SG #29</a>). Generalmente el tiempo con el que se cuenta para diseñar la arquitectura durante la preventa es corto por lo que el nivel de detalle de la solución muchas veces es limitado. Con el fin de lograr la identificación de elementos que permitan realizar la estimación, es recomendable establecer estructuras generales de un punto de vista lógico y de un punto de vista físico. Cabe señalar que esto puede verse como la realización de rondas iniciales de diseño utilizando el método de diseño guiado por atributos o ADD.</p><h3>Estructuración general del sistema de un punto de vista lógico</h3><p>La estructuración general del sistema de un punto de vista lógico consiste en identificar, por un lado, el estilo arquitectónico que se usará y, por otro lado, los componentes que deberían soportar el conjunto de características funcionales del sistema. Para lograr esta descomposición, que tiene un enfoque funcional, es recomendable hacer uso de arquitecturas de referencia que definen la estructuración general de sistemas para dominios aplicativos bien establecidos. Un ejemplo de ello es una arquitectura de referencia para aplicaciones web empresariales, ya que establece las capas así como los tipos de componentes de este tipo de arquitectura.</p><div class="figura"><img src="/images/revista/sg46/arquitectura1.png" alt="" width="500" /><p>Figura 1. Contexto de preventa.</p></div><p>Otro aspecto que puede ser importante en este punto es la identificación de las tecnologías asociadas con las partes que define la arquitectura de referencia. La identificación de tecnologías puede obedecer a las restricciones y también a los atributos de calidad del sistema.</p><h3>Estructuración general del sistema de un punto de vista físico</h3><p>La estructuración general del sistema de un punto de vista físico consiste en mapear los elementos de la estructura lógica hacia elementos físicos, más particularmente, nodos en los cuales se ejecutarán las partes de la aplicación. De esta forma se establece la manera en que será implantada la solución. La identificación del esquema de implantación es fundamental para establecer una estimación de los recursos físicos necesarios para el desarrollo de la solución.</p><p>El esquema de implantación de la solución que se elige obedece, en general, a los atributos de calidad del sistema pero también a las restricciones. En general son atributos de calidad relacionados con la disponibilidad y el desempeño los que influirán directamente sobre el esquema de implantación de la solución. Por ejemplo, cuando se tienen requerimientos relacionados con una alta disponibilidad, muchas veces se opta por un esquema de implantación que implica la redundancia.</p><h3>Documentación de arquitectura durante la preventa</h3><p>La documentación del diseño de una arquitectura consiste en la representación de las distintas estructuras a través de vistas (ver <a href="http://sg.com.mx/revista/30/documentacion-arquitectura">SG #30</a>). En el contexto de la preventa, en general la documentación que se produce del diseño es información que será usada como parte de la propuesta técnica que se le entrega al cliente, por lo que no es tan conveniente realizar una documentación demasiado técnica (a diferencia de lo que se hace durante la ejecución del proyecto). Muchas veces la documentación se limita a un diagrama usando un lenguaje menos formal, o lo que se conoce como diagrama de “Marketecture”.</p><h3>Evaluación de arquitectura durante la preventa</h3><p>Una de las actividades fundamentales del ciclo de desarrollo de la arquitectura es la evaluación del diseño (ver <a href="http://sg.com.mx/revista/31/arquitectura-evaluacion-la-arquitectura-software">SG #31</a>). Recordemos que el propósito de la evaluación es la identificación de riesgos relacionados con la toma de decisiones relativas al diseño.</p><p>Al igual que lo que se realiza como parte del ciclo de desarrollo de la arquitectura, es posible realizar una evaluación del diseño durante la preventa. En una evaluación basada en escenarios tradicional, se toman escenarios y se revisa detalladamente la manera en que el diseño de la arquitectura los soporta. Durante la preventa, el nivel de detalle del diseño del que se dispone no es el mismo. De hecho, muchas veces no se han tomado decisiones finas enfocadas a soportar escenarios concretos dado que no se dispone de ellos. Por lo anterior, la evaluación de la arquitectura durante la preventa no puede ser realizada de la misma manera que lo que se realiza durante la operación del proyecto.</p><p>En general, durante la evaluación de arquitectura en preventa, lo que se evalúa son las decisiones primarias tomadas en relación al diseño: la elección del tipo de arquitectura de referencia, las tecnologías o el esquema de implantación. Generalmente la evaluación de arquitectura identifica riesgos asociados no únicamente con el diseño sino también con otros aspectos tales como los requerimientos. Por ejemplo, si al momento de realizar la evaluación se observa que no hay métricas asociadas a los atributos de calidad (como sucede frecuentemente), esto representa un riesgo.</p><p>Finalmente, puede ser conveniente que como parte de la evaluación, se revise el plan que se tiene del proyecto para evaluar si la estrategia que se está considerando es adecuada en relación a los riesgos que se han identificado.</p><h3>Conclusión</h3><p>La preventa de un proyecto juega un papel crítico en relación a la aceptación de un proyecto de desarrollo. El utilizar métodos adaptados de desarrollo de arquitecturas de software durante esta etapa no sólo es posible sino que es recomendable pues puede permitir que se establezca una solución más adecuada y se realice una mejor estimación.</p><p>En la URL siguiente el lector podrá encontrar un video de la presentación que realicé este año en la conferencia SATURN 2014 y de la cual se deriva este artículo: <a href="http://goo.gl/5ZC8W4">http://goo.gl/5ZC8W4</a></p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el SEI, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. (<a href="http://www.humbertocervantes.net">www.humbertocervantes.net</a>)</p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Tue, 16 Dec 2014 21:45:51 +0000 sg 5544 at https://sg.com.mx https://sg.com.mx/revista/46/arquitectura-y-preventa#comments Las Interfaces y la Arquitectura https://sg.com.mx/revista/45/las-interfaces-y-la-arquitectura <span class="field field--name-title field--type-string field--label-hidden">Las Interfaces y la Arquitectura</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Fri, 09/19/2014 - 16:01</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/45" hreflang="und">SG #45</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta ocasión hablaré de un tema relacionado con las Interfaces de Programación de Aplicaciones (API) y con las pruebas que juega un papel fundamental dentro de la arquitectura: las interfaces. Las interfaces son los puntos de contacto que establecen un contrato que permite el intercambio de información entre elementos que forman parte de la arquitectura de un sistema de software. Estos elementos pueden ser lógicos (ej. módulos), dinámicos (ej. objetos) o físicos (ej. nodos de hardware). Recordemos que la arquitectura está formada por estructuras compuestas por elementos conectados entre sí (ver SG27), y es en los puntos de conexión donde se encuentran las interfaces.</p><p>Durante el diseño de la arquitectura (ver SG29), el arquitecto considera un subconjunto de requerimientos que se denominan drivers para crear las estructuras que conforman a la arquitectura del sistema. Estos requerimientos incluyen requerimientos funcionales primarios, atributos de calidad y restricciones (ver SG28). Al diseñar la arquitectura, el arquitecto identifica elementos que permiten satisfacer los drivers, junto con las interfaces de estos elementos. La identificación y definición de las interfaces se hace, generalmente, mediante un análisis dinámico de la interacción entre los elementos con el fin de soportar un requerimiento particular. La figura 1 muestra un ejemplo de esto.</p><p style="text-align: center;"><img src="data:image/png;base64,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" alt="" /></p><p style="text-align: center;">Figura 1. Estructuración lógica para soportar el caso de uso CU-1 (llave: UML)</p><p>El caso de uso CU-1, que es primario, forma parte de los drivers mientras que los demás casos de uso no. Al momento de diseñar la arquitectura, el arquitecto identifica elementos (en este caso capas y componentes) que permiten soportar el driver. Una vez identificados los elementos, se establecen los mensajes que deben intercambiar instancias de los elementos para soportar el driver. En el ejemplo, el componente ServicioCU1 tiene un método procesa() que recibe dos parámetros p1 y p2 y regresa un valor de retorno retA mientras que el componente Persistencia tiene un método almacena() que recibe un parámetro p3 y regresa un valor de retorno retB. En este caso, el método procesa() forma parte de la interfaz del componente ServicioCU1 mientras que almacena() forma parte de la interfaz del componente Persistencia. Cabe señalar que en general una interfaz tiene varios métodos, a diferencia de este ejemplo simple.</p><p>El arquitecto no identifica todos los elementos y sus interfaces, solo lo hace para aquellos que soportan los drivers. Sin embargo, estas decisiones establecen un marco de referencia que permite a los desarrolladores identificar los elementos e interfaces para requerimientos que no son drivers. Considerando el ejemplo previo, se deberían identificar componentes para soportar los demás casos de uso así como sus interfaces.</p><h3>Permiten realizar la integración del sistema</h3><p>En general un sistema es desarrollado de forma paralela por un equipo de desarrolladores que se encargan de construir partes individuales que posteriormente serán conectadas. Si el contrato entre las partes está bien definido desde el principio, se reducen los problemas relacionados con la integración. Retomando el ejemplo de la figura 1, supongamos que los componentes ServicioCU1 y Persistencia son desarrollados por distintas personas. Si previo al desarrollo de estos componentes se estableció que el componente Persistencia tiene una interfaz con un método retB almacena(p3), el desarrollador de ServicioCU1 tiene claro cómo interactuar con el componente Persistencia y la integración normalmente se hace sin dificultades. De lo contrario, es posible que la integración se retrase por correcciones necesarias para permitir que los componentes puedan interactuar.</p><h3>Especificaciones para el diseño detallados de los módulos</h3><p>La interfaz de un componente sirve también como especificación para realizar su diseño detallado y construcción. Consideremos el ejemplo anterior en el cual la interfaz del componente ServicioCU1 tiene un método retA procesa(p1,p2). El desarrollador puede diseñar y codificar el componente de diversas formas, siempre y cuando su diseño e implementación satisfagan el contrato establecido por la interfaz que, en este caso, es que el componente provea el método procesa().</p><h3>Pruebas unitarias y de integración</h3><p>Al desarrollar un sistema es necesario probar sus partes de forma individual, esto es lo que se conoce como prueba unitaria. La manera típica de hacerlo es probando el elemento a través de su interfaz, pues se asume que si un componente satisface el contrato que establece la interfaz entonces funciona correctamente. Retomando el ejemplo de la figura 1, si se quiere probar el componente Persistencia , habría que invocar el método almacena() y corroborar si el valor de retorno ret2 es lo que se espera en base al valor del parámetro p3.</p><p>Por otro lado, las interfaces permiten realizar prueba unitaria de elementos que dependen de otros al soportar la sustitución de elementos de los que se depende. Por ejemplo, si se quiere probar el componente ServicioCU1 del ejemplo anterior, no es necesario que se disponga del componente Persistencia. Basta con crear una implementación de la interfaz que debe implementar el componente Persistencia y que regrese los valores esperados. Esto es lo que se conoce como un “mock” (sustituto). Cabe señalar que para lograr esto es necesario hacer uso de alguna primitiva del lenguaje que permita especificar interfaces de forma independiente de su implementación.</p><p>Finalmente, las pruebas de integración, como su nombre lo indica, se enfocan en probar que los elementos se conectan de forma adecuada y para ello juegan un papel fundamental las interfaces y su correcta definición.</p><h3>Conexión con sistemas externos</h3><p>Es cada vez más común que los sistemas de software no sean entidades que trabajan de forma individual. En la actualidad, un sistema de software frecuentemente hace uso de funcionalidades provistas por otros sistemas, o bien proporciona funcionalidades para que sean usadas por otro sistema.</p><p>Para permitir la interacción entre sistemas, es necesario establecer interfaces que establezcan un contrato sobre la manera en que se intercambia la información. Es común hoy en día que esas interfaces se describan usando un lenguaje tal como WSDL (Web Services Description Language), si la comunicación entre sistemas se realiza mediante servicios web.</p><h3>Interfaz de Programación de Aplicaciones (API)</h3><p>Las interfaces de programación de aplicaciones (API) generalmente están relacionadas con librerías o frameworks (ver SG38). En lenguajes de desarrollo orientado a objetos tales como Java, existe una API asociada con el lenguaje que proporciona una gran cantidad de clases para propósitos diversos, como pueden ser el manejo de estructuras de datos. En este caso, el API se usa creando instancias de las clases que son parte del API, o bien, heredando y extendiendo a las mismas.</p><p>A continuación se describen algunos aspectos de importancia que se deben considerar en relación con las interfaces.</p><p><strong>Alta cohesión y bajo acoplamiento</strong>. Este es el principio fundamental del diseño de interfaces. La alta cohesión se refiere a que cada componente haga una sola cosa, mientras que el bajo acoplamiento busca que al modificar un elemento el cambio no se propague hacia otros elementos. El bajo acoplamiento se logra encapsulando detalles de implementación. Esto significa que la interfaz de un elemento no debe exponer detalles internos del mismo, tales como las estructuras de datos en las cuales se almacena el estado, ya que estos detalles deben poder cambiarse sin necesidad de que esto afecte a los clientes de la interfaz. Por lo anterior, la interfaz de un elemento se debe diseñar de forma cuidadosa para no exponer detalles de implementación, ya que el tener interfaces no garantiza el bajo acoplamiento.</p><p><strong>Programación defensiva</strong>. Cuando una interfaz es expuesta para que sea usada por un sistema externo o para que se construya un programa haciendo uso de ella, es necesario tomar precauciones adicionales en relación con los valores de entrada de los métodos de la interfaz. Lo anterior es parte de lo que se conoce como “programación defensiva” e implica, entre otras cosas, validar todas las entradas y considerar posibles situaciones inesperadas. En las interfaces internas, es posible relajar un poco este aspecto si se tiene seguridad de que no se recibirán valores que podrían causar problemas.</p><p><strong>Aspectos de calidad de servicio</strong>. En algunos casos, además de la “firma” de la interfaz que está compuesta por elementos sintácticos (nombre de métodos, tipo de parámetros y valores de retorno), es necesario especificar como parte de la interfaz aspectos relacionados con la calidad de servicio. Un ejemplo de ello sería que la ejecución de un método tiene que completarse en un tiempo establecido.</p><h3>Conclusión</h3><p>Las interfaces tanto internas como externas juegan un papel fundamental en el desarrollo de un sistema de software. La definición de las interfaces está intrínsecamente relacionada con el diseño de la arquitectura, y una definición deficiente de las interfaces tiene muchas repercusiones negativas en el desarrollo del sistema. El no definir las interfaces de forma oportuna impacta negativamente en la integración del proyecto y en la realización de pruebas del mismo, lo cual tiene repercusiones en el tiempo de desarrollo y la calidad del sistema. <br /><br />Por todo lo anterior, es necesario poner especial cuidado de identificar y definir correctamente las interfaces entre los elementos del sistema.</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el SEI, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. <a href="http://www.humbertocervantes.net">www.humbertocervantes.net</a></p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Fri, 19 Sep 2014 21:01:41 +0000 sg 5388 at https://sg.com.mx https://sg.com.mx/revista/45/las-interfaces-y-la-arquitectura#comments 10 años de arquitectura de software https://sg.com.mx/revista/44/10-anos-arquitectura-software <span class="field field--name-title field--type-string field--label-hidden">10 años de arquitectura de software</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 07/07/2014 - 18:51</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/44" hreflang="und">SG #44</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En el año 2006, Mary Shaw y Paul Clements escribieron un artículo que recapitulaba lo sucedido en los últimos 20 años en relación con la arquitectura de software [1]. En dicho artículo los autores concluyen que, a partir del año 2000, la arquitectura de software entró en una fase de popularización: desde entonces existen gran cantidad de herramientas, servicios, aplicaciones, plataformas, estándares y cursos construidos alrededor de la arquitectura.</p><p>Han transcurrido 8 años desde la publicación del artículo y la arquitectura de software continúa cobrando importancia en la industria del desarrollo de software. Para este número especial intentaré resumir un poco de lo que ha sucedido desde la publicación de dicho artículo con el fin de tener un panorama de lo que ha ocurrido en la última década.</p><h3>A nivel internacional</h3><p>Para tener una idea de lo que ha sucedido a nivel internacional, conviene echar un vistazo a los temas que se han cubierto en la conferencia SATURN [2] (SEI Architecture Technology User Network) que arrancó en 2005. Esta conferencia especializada en arquitectura está enfocada a los practicantes y cada año reúne a un número creciente de participantes provenientes de empresas y universidades de todo el mundo.</p><p>SATURN arrancó como un taller (workshop). En estos primeros años, algunos de los temas que se presentaron de forma recurrente incluyeron experiencias en el uso de métodos del SEI tales como QAW, ADD y ATAM en diversas organizaciones (Ver SG. 28, 29 y 30).</p><p>En 2009, SATURN se convierte en una conferencia. Algunos temas que surgen incluyen la alineación de los distintos niveles de arquitecturas (Software, Sistema, Empresarial) y los aspectos relacionados con las competencias, tanto de individuos como de organizaciones.</p><p>En el año 2010 aparecen los temas de la relación entre la arquitectura y las metodologías ágiles de desarrollo así como el cómputo en la nube. A partir de ese año, la agilidad ha sido un tema recurrente en la conferencia SATURN.</p><p>En 2011 aparecen temas relacionados con la introducción de la ingeniería centrada en arquitectura en la versión 1.3 de CMMI (ver SG 36) y también se habla del arquitecto como agente de cambio (ver SG 33). Otros temas que comienzan a cobrar más auge son las arquitecturas para sistemas de gran escala y casos de éxito como el sistema que se desarrolló para la bolsa de valores de México (ver SG 41).</p><p>En 2012 se mantienen temas de agilidad y colaboración. Cobran más auge temas relacionados con el desarrollo de “sistemas de sistemas” y sistemas de escala ultra grande.</p><p>En 2013, continúan presentes temas de desarrollo en la nube, móvil y también aparece el tema de sistema de larga vida.</p><p>Por último, en 2014 se tocaron temas como DevOps, la evolución de los sistemas, colaboración de equipos y con clientes y crecimiento de los arquitectos.</p><h3>En México</h3><p>Advierto que mi perspectiva de lo que considero que ha sucedido a nivel nacional probablemente es un tanto limitada. Como frecuentemente sucede, existe algo de atraso de lo que sucede en México con respecto a lo que sucede en los Estados Unidos y el tema de la arquitectura de software no es la excepción. Creo que el concepto de arquitectura de software ya se ha popularizado hasta cierto punto en nuestro país, sin embargo, me parece que todavía es limitado el número de organizaciones de desarrollo en donde se realizan prácticas bien establecidas de desarrollo de arquitecturas de software. Sigue siendo común encontrar, por ejemplo, requerimientos enfocados en funcionalidad y atributos de calidad no cuantificados.</p><p>En México no existe algún tipo de conferencia parecida a SATURN, sin embargo, en foros enfocados a practicantes a los cuales he tenido la oportunidad de asistir no he percibido que se trate el tema de arquitectura de software de manera frecuente, y mi percepción es que hay más énfasis en aspectos de proceso o de tecnologías. Por otro lado, a nivel académico, existen ya algunos cursos que tocan el tema de la arquitectura de software.</p><h3>Conclusión</h3><p>La arquitectura de software es una disciplina con cerca de 30 años de antigüedad y que en la última década ha continuado popularizándose. A pesar del tiempo que lleva y de los avances que hay al respecto, considero que todavía es necesario seguir haciendo un esfuerzo con el fin de que las prácticas de desarrollo de arquitecturas se vuelvan algo estándar en las organizaciones de desarrollo de software. En los próximos años la arquitectura de software seguirá siendo relevante, en particular para mejorar la calidad de los sistemas así como atacar de forma exitosa nuevos retos en el desarrollo.</p><p>Referencias</p><p>[1] Shaw, M., Clements, P. “The Golden Age of Software Architecture”, IEEE Software, Marzo / Abril 2006</p><p>[2] http://www.sei.cmu.edu/saturn/</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El Dr. Humberto Cervantes es profesor-investigador en la UAMIztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria de desarrollo nacional. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el Software Engineering Institute, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. www.humbertocervantes.net</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 07 Jul 2014 23:51:09 +0000 sg 5222 at https://sg.com.mx https://sg.com.mx/revista/44/10-anos-arquitectura-software#comments Tecnología móvil y arquitectura https://sg.com.mx/revista/42/tecnologia-movil-y-arquitectura <span class="field field--name-title field--type-string field--label-hidden">Tecnología móvil y arquitectura</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/72" lang="" about="/user/72" typeof="schema:Person" property="schema:name" datatype="" class="username">lasr21</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 12/11/2013 - 19:46</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/42" hreflang="und">SG #42</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> <li><a href="/autores-sg/grace-lewis" hreflang="und">Grace Lewis</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p class="p1"><span class="s1">A</span>&nbsp;diferencia de las computadoras “tradicionales”, los dispositivos móviles tienen características particulares que incluyen:</p><ul><li class="p1">Duración limitada de la batería.</li><li class="p1">Posible tamaño pequeño de la pantalla.</li><li class="p1">Conectividad intermitente.</li><li class="p1">Posibilidad de que el dispositivo se pierda fácilmente.</li><li class="p1">Posibilidad de realizar cálculos demandantes.</li><li class="p1">Variedad de sensores que permiten recolectar información.</li><li class="p1">Acceso a infraestructura que facilita la instalación y actualización de aplicaciones (mercados de apps).</li></ul><p class="p5">Los puntos descritos previamente aunados al hecho de que los dispositivos móviles están siempre a la mano, ha dado lugar a distintos tipos de aplicaciones con drivers particulares. Recordemos que en el contexto de arquitectura de software, los drivers, se refieren a los requerimientos que influyen en el diseño de la arquitectura. Estos drivers generalmente incluyen requerimientos funcionales primarios, atributos de calidad y restricciones.</p><h3 class="p7">Tipos de aplicaciones</h3><p class="p2"><span class="s2">Hoy en día podemos considerar tres categorías de aplicaciones móviles:</span></p><ul><li class="p8">La primer categoría son las típicas aplicaciones (apps) que instalamos en dispositivos móviles tales como los teléfonos inteligentes y tabletas a través de un mercado de apps. Esta categoría de aplicación tiene la particularidad de que generalmente se ejecuta de forma aislada en el dispositivo y, si se comunica con recursos externos, simplemente lo hace para acceder a información que no se tiene en el dispositivo.&nbsp;<br /><br /></li><li class="p8">La segunda categoría se refiere a las aplicaciones donde el dispositivo móvil se vuelve una extensión a los sistemas empresariales. En esta categoría, el dispositivo es parte del sistema y, en cierta forma, podríamos pensarlo como la interfaz de usuario con el mismo. Por las características descritas previamente de los dispositivos móviles, esta interfaz de usuario es distinta al enfoque tradicional con el que se interactúa con los sistemas empresariales que es generalmente a través de un navegador.<br /><br /></li><li class="p8">La tercera categoría es cuando se utilizan los dispositivos móviles como colectores de información aprovechando todos los sensores que tienen, tales como GPS, acelerómetro, etc. Esta categoría se podría considerar como una extensión de los sistemas empresariales pero con una función muy específica enfocada a la colecta de información.</li></ul><p class="p4">&nbsp;</p><h3 class="p7">Drivers arquitectónicos</h3><p class="p2">Existen drivers específicos dependiendo del tipo de aplicación móvil. En el primer tipo de aplicaciones (las apps), el driver principal es una restricción de tiempo de entrega. Estas son aplicaciones de muy corta vida que duran unos pocos días en el “top 10” de los mercados de apps y después desaparecen.&nbsp;</p><p class="p5"><span class="s4">En el segundo tipo de aplicaciones, es decir la extensión de los sistemas empresariales, a nivel funcional generalmente es necesario considerar que los casos de uso del sistema deben poder ser realizados tanto a través de un cliente tradicional (navegador) como de la aplicación móvil. </span><span class="s2">En este tipo de aplicaciones, la conectividad variable es algo que debe tomarse en cuenta y esto puede requerir que se almacenen datos de forma local y que se tenga que lidiar con cuestiones de sincronización de datos. El almacenar datos de forma local requiere, sin embargo, considerar además aspectos relacionados con la seguridad por la información, posiblemente confidencial, que se maneja.&nbsp;</span></p><p class="p5"><span class="s2">En el tercer tipo de aplicaciones, es decir cuando se usan los dispositivos móviles como sensores que colectan datos, puede haber atributos de calidad relacionados con aspectos tales como la privacidad.&nbsp;</span></p><p class="p5"><span class="s2">De forma general, todos los tipos de aplicaciones se benefician de la infraestructura de mercados de apps que facilita la instalación y actualización de las mismas.</span></p><h3 class="p7">Arquitectura y aplicaciones móviles</h3><p class="p2">Actualmente el mercado móvil todavía depende mucho de la restricción de tiempos de entrega rápidos y generalmente el desarrollo del primer tipo de aplicaciones descrito previamente no se preocupa tanto por la arquitectura. El considerar realizar diseño de arquitectura podría aportar muchos beneficios al desarrollo de aplicaciones móviles. Se puede pensar por ejemplo en generar líneas de productos y establecer frameworks robustos para el desarrollo, lo cual permitiría generar aplicaciones más rápido y además de mejor calidad. Por otro lado, en las aplicaciones que son extensiones de los sistemas empresariales, la arquitectura juega un papel fundamental para poder cubrir con los drivers que se mencionaron previamente.</p><p class="p5">Los métodos de desarrollo de arquitectura, tales como QAW, ADD o ATAM, se pueden aplicar sin necesidad de ajustes en el desarrollo de aplicaciones móviles. Lo que posiblemente diferirá al utilizarlos son aspectos tales como los drivers, pues los escenarios que se identifican difieren de los que ocurren en aplicaciones más tradicionales. Un ejemplo de ello podría ser un escenario de seguridad: “Se extravía un dispositivo móvil en el cual se descargó información confidencial y un usuario malintencionado intenta extraerla”. En el contexto de las aplicaciones móviles, se debe pensar en los mismos atributos de calidad que los de las aplicaciones tradicionales pero considerando los aspectos propios de los dispositivos móviles. Un ejemplo de ello es la usabilidad, que en el contexto de las aplicaciones para dispositivos móviles debe considerar, por ejemplo, el tamaño reducido de las pantallas.</p><h3 class="p7">Relación con el cómputo en la nube y SOA</h3><p class="p2">Cuando hablamos de tecnologías móviles, difícilmente las podemos disociar del cómputo en la nube y la Arquitectura Orientada a Servicios (SOA). La combinación de tecnología móvil y cómputo en la nube resulta en algo que hoy en día se conoce en inglés como “Mobile Cloud Computing”. Al igual que con los tipos de aplicaciones, dentro de esta intersección de las tecnologías, podemos considerar tres variantes:&nbsp;</p><ul><li class="p8"><span class="s2">Cuando se utiliza el dispositivo móvil como un mecanismo para acceder a los recursos de la nube. Por ejemplo cuando se utiliza el teléfono para acceder a una aplicación tal como Google maps. Esto usualmente corresponde al primer tipo de aplicación del que se habló previamente.<br /><br /></span></li><li class="p8">Lograr que un dispositivo móvil pueda asignar tareas a otros dispositivos móviles cercanos como si fueran recursos de la nube. Por ejemplo, si se tiene una tarea muy complicada entonces se puede repartir cálculos a varios dispositivos cercanos.<br /><br /></li><li class="p8">El “cyber-foraging” y se refiere a descargar parte del trabajo de cálculo del dispositivo móvil a máquinas más poderosas para evitar, por ejemplo, un consumo excesivo de batería. En este enfoque, la nube se ve como una extensión del dispositivo móvil, independientemente de si los cálculos se realizan en la nube en sí o bien en servidores más cercanos.&nbsp;</li></ul><p class="p5"><span class="s3">Respecto a SOA, esta tecnología y el cómputo en la nube tienen mucho en común: el cómputo en la nube puede ser visto como una plataforma de implantación para aplicaciones que se desarrollan bajo el paradigma SOA. Por otro lado, el utilizar servicios es un mecanismo para facilitar la conexión entre los dispositivos móviles y las aplicaciones empresariales.&nbsp;</span></p><h3 class="p7">Investigación</h3><p class="p2"><span class="s3">Uno de los problemas en los que se trabaja actualmente en investigación (particularmente en el SEI) es el desarrollo de sistemas que apoyan a personas que están en “el borde” (the edge). El borde es un término que se utiliza para referirse a esa parte de la infraestructura hasta donde llegan las conexiones de red. El proyecto que dirige Grace se llama “Edge-enabled tactical systems” y se enfoca en establecer mecanismos para ayudar a la gente que trabaja con dispositivos móviles más allá del borde. Los usuarios principales en este proyecto de investigación son soldados y personas que son llamadas a ayudar en casos de emergencia (Cruz Roja, organizaciones de ayuda, etc.) o médicos rurales.&nbsp;</span></p><p class="p5"><span class="s2">De forma general, en la investigación se ha hecho mucho énfasis en aspectos algorítmicos. Un caso es el poder determinar en tiempo de ejecución si cierto cálculo se puede ejecutar en otros recursos distintos al dispositivo mismo. Se observa, sin embargo, que actualmente no se hace mucho énfasis en arquitectura.&nbsp;</span></p><h3 class="p7">Conclusión</h3><p class="p2"><span class="s3">Hoy en día el acceso móvil a los sistemas ya no es algo opcional, sino que es algo ubicuo y es necesario pensar en clientes móviles desde que se comienza a diseñar la aplicación. El acceso móvil es la forma como la gente interactúa hoy en día con computación y, por ello, los usuarios tienen expectativas al respecto, como por ejemplo poder realizar las mismas actividades que se hacen en la máquina de la oficina a través de un teléfono inteligente.&nbsp;</span></p><p class="p5"><span class="s3">Por otro lado, y para recalcar la importancia que está cobrando el desarrollo de aplicaciones para dispositivos móviles, es interesante observar que a nivel de la oferta laboral (en Estados Unidos) cerca de un 70% de las ofertas de trabajo para los egresados de la universidad está exigiendo algún conocimiento de desarrollo en iOS o Android.&nbsp;</span></p><p class="p5"><span class="s2">La arquitectura de software juega un papel fundamental en el desarrollo de aplicaciones móviles y creemos que el darle un énfasis mayor al que se está dando actualmente podría aportar grandes beneficios.</span></p></div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Thu, 12 Dec 2013 01:46:08 +0000 lasr21 4599 at https://sg.com.mx https://sg.com.mx/revista/42/tecnologia-movil-y-arquitectura#comments Hablando con el arquitecto: Luis Carballo https://sg.com.mx/revista/41/hablando-el-arquitecto-luis-carballo <span class="field field--name-title field--type-string field--label-hidden">Hablando con el arquitecto: Luis Carballo</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Sun, 09/22/2013 - 21:55</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/41" hreflang="und">SG #41</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta ocasión presento en esta columna una entrevista con Luis Carballo, Arquitecto de software de uno de los sistemas más críticos para México. Luis trabaja desde hace 7 años en la Bolsa Mexicana de Valores (BMV) en el área de sistemas en una empresa llamada Bursatec. Él es egresado de la UAM en donde estudió Ingeniería Electrónica y posteriormente realizó una maestría en el ITAM de TI y Administración (luis.carballo@mac.com).</p><p><strong>¿Puedes platicarnos un poco acerca del proyecto en el cual estás trabajando?</strong><br />Es un proyecto de renovación tecnológica del motor central de negociación de la bolsa que inició en el 2009. El sistema sustituye a tres sistemas legados, dos que corrían en Tandem que eran propietarios y un tercero que se le compró a la bolsa española. Se instaló en producción la primera parte, que corresponde al mercado accionario, en Septiembre de 2012 y la segunda parte, que corresponde al mercado de derivados, en Abril de 2013.</p><p><strong>¿Puedes hablar un poco acerca de lo que llamamos los “drivers” y en particular los atributos de calidad del sistema?<br /></strong>Uno de los objetivos de reemplazar los antiguos sistemas era de reducir el costo total de propiedad pues el costo de mantenimiento de los sistemas Tandem, escritos en Cobol, era muy alto. Otro objetivo era aumentar el desempeño pues el sistema anterior iba a tener un límite con el cual se iba a topar pronto. La idea era reemplazarlo por uno nuevo que pudiera tener muchas más capacidades sobre todo en rendimiento, en baja latencia, en alta disponibilidad y que fuera mucho más fácil de probar y de integrar continuamente.</p><p><strong>De estos drivers que mencionaste, ¿cuál ha resultado el más complejo?</strong><br />Creo que el más difícil de todos es el de latencia porque toca todo el flujo de código por el cual se va a ejecutar una transacción. La latencia se refiere al tiempo de procesamiento dentro del motor desde que llega un mensaje (por ejemplo una compra de una acción) hasta que el motor responde (ej. aceptada o rechazada o hizo “match” contra otra orden). El promedio de latencia del sistema anterior era 24 milisegundos. El requerimiento original era que fuera menos de un milisegundo pero durante el análisis que se hizo contra otros mercados, se decidió bajar el tiempo para hacerlo más competitivo y que fueran menos de 100 microsegundos, o sea, 240 veces más rápido que el sistema anterior. El rendimiento se refiere a la cantidad de transacciones que se pueden ejecutar en un segundo dado. El sistema anterior tenía una capacidad de procesamiento de transacciones baja y el sistema actual está diseñado para soportar más de 100,000 transacciones por segundo. Al ser un sistema de misión crítica, la alta disponibilidad también es un factor importante y se consideran dos escenarios: en caso de falla de uno de los nodos primarios tiene que hacer “failover” (tolerancia a fallas) a otro en el mismo centro de datos y, el otro es que, en caso de falla del centro de datos primario, se pueda seguir la operación en un centro de datos secundario. Para el primer caso hoy en día tarda entre 5 y 10 segundos hacer la transición de una máquina a otra.</p><p><strong>¿Qué tan importante es considerar la arquitectura para un sistema como éste?</strong><br />Creo que es de los factores de éxito más importantes porque, de haber construido sin tener en mente la latencia, el rendimiento o la alta disponibilidad, hubiera hecho que al final del proyecto fuera prácticamente imposible el tratar de satisfacer esos atributos de calidad. El haber hecho el diseño desde el inicio de tal forma que hubiera foco en la latencia desde el diseño original permitió que el sistema fuera exitoso. Hubo un momento durante las pruebas en el cual la latencia se disparaba poco a poco hasta llegar a segundos y todo por una sola línea de código. Generamos ciertas métricas y guías para evitar usar cosas que sabemos que son dañinas para efectos de latencia. Yo creo que ese tipo de problemas no los hubiéramos encontrado si no nos hubiéramos enfocado constantemente en que los atributos de calidad se cubrieran.</p><p><strong>¿Cómo le hicieron para desarrollar esta arquitectura?</strong><br />Contratamos al SEI para que nos asesorara en el diseño de la arquitectura y utilizamos los métodos que ellos proponen para efectos del diseño del sistema [1][2]. Se hizo un Taller de Atributos de Calidad (QAW), ADD con una modificación, documentación basada en atributos de calidad y ATAM (Architecture Tradeoff Analysis Method) para la evaluación. La modificación de ADD consistió en hacer mini-sesiones de cuestionamiento al diseño generado usando ADD para asegurar que el resultado fuera el esperado.</p><p>La gente del SEI nos cuestionaba diciendo “oye, el diseño que llevas hasta ahora a ver qué tan efectivo es para resolver problemas de latencia, desempeño...”. Estas sesiones se hacían constantemente como parte de las iteraciones de diseño. Eran prácticamente dos semanas de diseño y después del diseño una sesión de cuestionamiento. Fueron como diez iteraciones de diseño en las cuales se tomaron las decisiones más importantes. Después de eso se hizo la evaluación de la arquitectura usando ATAM con resultados satisfactorios.</p><p><strong>A nivel del diseño, ¿qué retos hubo para satisfacer los atributos de calidad más importantes?</strong><br />Respecto a la latencia, hay cosas como la elección misma de las estructuras de datos pues unas son más rápidas que otras. Aún si en el diseño de la arquitectura pusimos cuotas sobre la latencia de ciertos componentes, durante la ejecución hubo que probar diferentes soluciones y ver cuál era la mejor opción según el caso. Es un tema de ir buscando, aún durante la construcción, las mejores soluciones posibles para poder satisfacer los atributos de calidad. Se hacían prototipos específicos para lo que se quería en ese momento y se determinaba cual era la mejor solución, que “tradeoffs” había, que restricciones pudiera tener y cuáles no y en base a eso, se tomaban las decisiones finales. Afortunadamente el grupo de arquitectura pasó a ser parte del grupo de desarrollo entonces<br />ellos asesoraban a todos los demás para que supieran cuáles eran las intenciones sobre ciertos componentes y que se apegaran a los lineamientos establecidos.</p><p><strong>Con respecto a la documentación, ¿cómo fue ese aspecto?</strong><br />La hicimos durante el diseño. Durante la ejecución fuimos documentando toda la arquitectura que era requerida para la evaluación. Usamos algo como vistas pero más enfocadas a los atributos de calidad. Teníamos vistas específicas de cómo se resuelven los atributos de calidad. Hay por ejemplo, una vista específica de componentes para el escenario de alta disponibilidad. Se pueden tener varias vistas pero todas orbitan alrededor de un mismo atributo. Esto facilitó la evaluación, pues en esta se toma un escenario y se describe como está el flujo. De hecho durante el ATAM nos saltamos una de las dos fases, porque ya estaba prácticamente hecho.</p><p><strong>¿Qué recomendaciones generales harías a los arquitectos en relación con el desarrollo de sus arquitecturas?</strong><br />Una es que los requerimientos funcionales tienen algún impacto, además de los atributos de calidad, en las decisiones que se toman de arquitectura. Entonces conviene tener una lista lo más amplia posible de funcionalidades que puedan afectar la arquitectura para que se tomen las mejores decisiones al momento de hacer el diseño. La otra es que aunque haya atributos de calidad que aparentemente no sean relevantes para el negocio, siempre hay que considerarlos al momento del diseño, como por ejemplo la facilidad de prueba (testability).<br />Durante el diseño, que es un proceso iterativo, cuando se agotan los escenarios prioritarios, los que siguen deben analizarse y ahí es donde aparecen los de modificabilidad, testability y otras, además de escenarios adicionales de alta disponibilidad, de recuperación de fallas. Siempre hay escenarios que no son los más críticos pero que<br />un día van a suceder y por lo tanto son importantes para analizar y considerar en el diseño.</p><p><strong>En el desarrollo en general de sistemas, ¿qué tanta importancia crees que haya que darle a la arquitectura? ¿En todo sistema debe cuidarse?</strong><br />No, no en todo sistema. En sistemas muy pequeños es muy fácil cambiar el sistema para adecuar ciertos atributos de calidad y la arquitectura emerge naturalmente. Mientras más grande el sistema, más importante es. No sé si hay una regla pero al final es el costo de no hacerlo en un sistema chico es menor que en un sistema grande. Por otro lado, aún en sistemas pequeños, si los drivers son muy exigentes, se deben considerar desde el inicio porque después va a ser más difícil satisfacerlos.</p><p><strong>Si tuvieras que volver a hacer ese sistema con el conocimiento que tienes hoy en día, ¿qué harías distinto?</strong><br />Creo que la documentación es algo que siempre es mejorable. Hay muchas decisiones que tomamos en el camino y que no documentamos de la mejor forma o son decisiones implícitas y es mejor hacerlas explícitas desde el momento en que se toman aunque parezcan básicas porque después se olvida. Otra es hacer casos de prueba específicos para la arquitectura desde el principio.</p><p>Referencias</p><ol><li>J. McHale, R. Nord, L. Carballo, “Driving Out Technical Risk by Blending Architecture, Process, and Project Discipline”, http://www.sei.cmu.edu/library/abstracts/presentations/mchale-saturn2012.cfm</li><li>R. Nord, J. McHale, F. Bachmann, “Combining Architecture-Centric Engineering with the Team Software Process”, http://www.sei.cmu.edu/library/abstracts/reports/10tr031.cfm</li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el Software Engineering Institute, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. <a href="http://www.humbertocervantes.net">www.humbertocervantes.net</a></p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Mon, 23 Sep 2013 02:55:41 +0000 sg 4274 at https://sg.com.mx https://sg.com.mx/revista/41/hablando-el-arquitecto-luis-carballo#comments