<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://lucasontivero.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2flucasontivero.spaces.live.com%2fcategory%2fSoftware%2bFactory%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lucas Ontivero: Software Factory</title><description /><link>http://lucasontivero.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catSoftware%2bFactory</link><language>en-US</language><pubDate>Fri, 15 Aug 2008 15:15:42 GMT</pubDate><lastBuildDate>Fri, 15 Aug 2008 15:15:42 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://lucasontivero.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>3988747590285877710</live:id><live:alias>lucasontivero</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Software Factories Blog</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!446.entry</link><description>&lt;p&gt;&lt;a href="http://www.google.com.ar/translate?u=http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!446.entry&amp;amp;langpair=es|en&amp;amp;hl=en&amp;amp;ie=UTF8" target="_blank"&gt;[Tanslate this post to english with google]&lt;/a&gt; &lt;p&gt;He creado un nuevo blog dedicado a todo lo referido a software-factories, patrones, metodologías y todo lo que esté orientado a incrementar la calidad, la productividad y el tiempo de entrega de los productos de software. Seguramente también incluiré algunas ideas y/o traducciones de artículos interesante. Ya he pasado algunos post de este blogs al nuevo. Véanlo en &lt;a title="http://software-factories.blogspot.com/" href="http://software-factories.blogspot.com/"&gt;http://software-factories.blogspot.com/&lt;/a&gt;  &lt;p&gt;Saludos. &lt;p&gt;&lt;strong&gt;Lucas Ontivero&lt;/strong&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+Software+Factories+Blog&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!446.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!446.entry</guid><pubDate>Sat, 08 Sep 2007 17:37:34 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!446/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!446.entry#comment</wfw:comment><dcterms:modified>2007-09-12T16:29:29Z</dcterms:modified></item><item><title>[Software Factories] Introducción (Parte 2)</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!424.entry</link><description>&lt;img style="margin:5px;height:30%" height=172 src="http://byfiles.storage.live.com/y1pykZ-TIQ2OCR0fgq5JSqonSG0J_olxohq30EgucWr-niuhateb2_BsR6nxLpyblCm0F8Dp7hvuO8ESQ4EuuxE3RQxnalwPqjx" width=240 align=left&gt;  &lt;p&gt;Ok. Esta es la parte dos de la introducción.  &lt;p&gt;Realmente no quería caer en el mismo ejemplo de libro pero lo voy a hacer. La manera en que hoy desarrollamos software es exactamente igual a como se hacian los automóviles antes de Mr. Ford. Como era esto? Bueno igual que lo que hacemos hoy, venia un cliente y decía: quiero una auto así, así y así con madera de pino de Groenlandia, cuero de jaguareté y pedales de tutú carreta, entonces se diseñaba el auto de cero, a alguno se le ocurria que lo mejor era un rodado de marfil y aluminio de 23,67 pulgadas, etc. Una vez listo el diseño se ponian con los cerruchos, martillos, un tornito y otras herramientas y en 6 o 7 meses estaba listo. Salian mas o menos bien y costaban caro. Hoy en cambio todos los autos comparten un gran número de componentes comunes entre otras cosas gracias a los estandares. Son estos lo que me permiten enchufar mi televisor en cualquier parte del pais y que siga funcionando o cambiar el cuerito de la grifería sin tener que averiguar medidas.  &lt;p&gt;Esta forma de trabajo se caracteriza por:  &lt;ul&gt; &lt;li&gt;Uso intensivo de la mano de obra,  &lt;li&gt;Uso de herramientas demasiado genéricas,  &lt;li&gt;Mínimo reuso y,   &lt;li&gt;Procesos genéricos &lt;/ul&gt; &lt;p&gt;De esta manera se producen demoras en los tiempos de entrega, defectos, agujeros de seguridad y retrabajos. Además de imposibilitar la introducción de calidad desde el primer momento en cuanto a aquellos detalles diferenciadores como seguridad, usabilidad, desempeño, mantenibilidad y escalabilidad de los productos (sin causar fatigas por falencias en la arquitectura) entre otros.  &lt;p&gt;Antes de continuar analizando los por qué del surgimiento de este paradigma vamos a definir algunos términos que son muy necesarios como por ejemplo el de Software Factory y luego voy a aclarar algunas cosas que me quedaron en el tintero del post anterior.  &lt;h2&gt;Definiciones&lt;/h2&gt; &lt;h3&gt;Software Factory&lt;/h3&gt; &lt;p&gt;Si se le hubiese llamado de otra manera nos habriamos visto forzados a realizar un esfuerzo mental para averiguar y tratar de entender de que se trata este concepto pero desgraciadamente esta palabrita &amp;quot;Factory&amp;quot; nos habilita a pensar cualquier cosa. Las analogías que encontramos por todos lados con fabricas de zapatos o electrodomésticos terminan de confirmar nuestras fantasias mal fundadas. No son pocos los que creen que se trata de hacer software como si de automoviles se tratara, simplemente ensamblando algunas partes hechas en una linea de montaje y automatizando, robots mediantes, los detalles como el color de la pintura y otros. Bueno, no es así. La figura que adorna este post también confunde pero está muy buena para reflejar el estado actual del arte :)  &lt;p&gt;Distingamos entre Software Factory como paradigma y como instancia. Como paradigma, es una alternativa a los métodos actuales de construcción que intenta resolver los 5 problemas planteados en el post anterior cuando las aplicaciones a construir comparten características comunes. Como instancia (SCSF por ejemplo), un Software Factory es un conjunto de herramientas, procesos tailorizados, frameworks, patrones y modelos (por lo general embebidos en los frameworks y/o herramientas integradas del IDE) y otros contenidos que usan para trabajar sobre una Linea de Productos. O mejor dicho, un SF es una linea de producto que utiliza un SF Template basado en un SF Schema.  &lt;h3&gt;Linea de Productos&lt;/h3&gt; &lt;p&gt;Una linea de productos se refiere a un tipo de aplicación que puede agruparse o identificarse como perteneciente a una familia de productos como por ejemplo sistemas de CRM, software de seguros, software para entidades bancarias, de control aereo y cualquier otro. Es decir, pueden agruparse de distintas maneras, por segmento de negocios, tipo de soluciones, plataforma, etc. Lo importante es poder identificar aquellas características comunes. Tres aspectos claves de una linea de productos son: los alcances, la variabilidad y la extensibilidad. Los &lt;b&gt;alcances&lt;/b&gt; determinan que tipo de soluciones pueden construirse a partir de la linea de productos y define por lo general la arcitectura base para la familia de aplicaciones, la &lt;b&gt;variabilidad&lt;/b&gt; hace referencia a las parte comunes definidas en los alcances y aquellas que son variables por medio de configuración de la linea y la &lt;b&gt;extensibilidad&lt;/b&gt; determina los puntos en los que es posible añadir funcionalidades.  &lt;h3&gt;Software Factory Schema&lt;/h3&gt; &lt;p&gt;Un Software Factory Schema es un modelo general que por lo general utiliza grillas, gráficos o cualquier otro artefacto para describir cuales son los productos de trabajo, los pasos a seguir para construirlos, las relaciones existentes entre ellos. Esta es una herramienta para entender y posiblemente automatizar el funcionamiento del SF. Por ejemplo, un SF Schema puede describir los paquetes que se utilizan, la distribución f'isica de los componentes y como los distintos miembros de los equipos se relacionan con cada uno de estos aspectos. Un SF Schema se compone de Viewpoints que no son otra cosa que la descripción de todos los &lt;a href="http://en.wikipedia.org/wiki/Asset"&gt;assets&lt;/a&gt; que intervienen en la generación de un aspecto del software que se desea desarrollar. Por ejemplo, un view point para la creación de un smart client podría ser la generación de la UI, en este caso el view point especificaría el conjunto de cosas necesarias para realizarlas, desde una clase base Form, diseñadores, DSL para especificar la navegabilidad entre formularios, herramientas de generación de algunos aspectos o plantillas, guias necesarias que intervienen es este punto, etc. Podría decirse que es la colección de todos los puntos de vista de un SF o el plano conceptual de este. Este plano tiene forma de arbol y cada rama trata un aspecto particular de la solución que a su vez se divide en otras ramas que los analizan desde otros puntos de vista. La definición de Viewpoint de la IEEE está en &lt;a href="http://ieeexplore.ieee.org/iel5/7040/18957/00875998.pdf"&gt;IEEE Recommended Practice for Architectural Description of Software-Intensive Systems&lt;/a&gt;.  &lt;h3&gt;Software Factory Template&lt;/h3&gt; &lt;p&gt;Una vez que tenemos los planos conceptuales del Software Factory que queremos construir debemos.... construirlo!! Es decir, ya sabemos que &lt;a href="http://en.wikipedia.org/wiki/Asset"&gt;assets&lt;/a&gt; necesitaremos, como serán, donde intervendrán, como se relacionarán, etc. Ok, ahora hay que hacerlos. Esto es, crear los frameworks, las guias, los asistentes, los DSLs, procesos y todos los demás asstes descritos en el esquema he integrarlos (en lo posible) al IDE. Cada vez que se construye un nuevo producto, cada desarrollador puede (y debería) contribuir con el SF añadiendo sus plantillas, snippets, instructivos, frameworksy cualquier otro &lt;a href="http://en.wikipedia.org/wiki/Asset"&gt;asset&lt;/a&gt;. Para más información acerca de estos últimos dos temas les recomiendo la edición número 9 de la revista &lt;a href="http://lucasontivero.spaces.live.com/mmm2007-07-26_17.23/www.architecturejournal.net"&gt;The Architecture Journal&lt;/a&gt; y en especial el artículo de Tom Fuller &amp;quot;Fundamentos para los pilares de las Fábricas de Software&amp;quot;.  &lt;h2&gt;Lo que me quedó en el tintero&lt;/h2&gt; &lt;p&gt;Algo que me quedó en el tintero es el tema de las metodologias cuyo problema resumia como &amp;quot;o (son) muy formales o (son) uy ágiles&amp;quot;. Greenfield  y Short  plantean (lo que a muchos nos parece obvio) que existen dos tendencias extremas con sus pros y contras. A diferencia de lo que uno podría esperar, Greenfield  y Short no creen que una metodología más formal sea más MADURA, por el contrario, entienden que son inmaduras por extremistas.  &lt;p&gt;&lt;strong&gt;En cuanto a los desarrolladores&lt;/strong&gt;  &lt;p&gt;Luego vamos a ver como distinguen entre &amp;quot;tipos&amp;quot; de desarrolladores (este &amp;quot;tipos&amp;quot; es mio, en realidad habla del valor de los desarrolladores y distingue entre ellos a aquellos que pueden construir los Software Factories y aquellos que los utilizan) y que importancia tienen estos dentro del proceso de desarrollo. Continuo planteando este tema porque cuantas veces hemos escuchado a gerentes de sistemas/Producers/Produc Manager/Team Leadres decir cosas como &amp;quot;Yo quiero/necesito poder sacar a uno (desarrollador) y poner a otro y que los proyectos continuen en marcha&amp;quot;?. La verdad creo que estas palabras (quiero/necesito) expresan un deseo. Sí, es una expresión de deseo! pero es un deseo genuino y entendible. Yo, en el lugar de esas personas querria exactamente lo mismo pero también entiendo que eso es un intento un poco necio de negar la realidad.  &lt;p&gt;Como por ahí nombro los libros o cito los autores y no quiero poner palabras mias en sus bocas les recomiendo que los lean. Aunque en este punto es coveniente citarlos de manera textual.  &lt;p&gt;&lt;em&gt;&amp;quot;Unfortunately, the industry has a tendency to become overly prescriptive, assuming that developers are naive and uninformed, and attempting to use formal processes to prevent them from making mistakes by telling them what to build, how to build, and what skills are required to perform certain tasks.&amp;quot;&lt;/em&gt;  &lt;p&gt;El problema mayor que describe esta frase no es sobre lo de &amp;quot;ingenuos&amp;quot; o &amp;quot;ignorantes&amp;quot; sino que producen una infrautilización de las capacidades de las personas. Esto a veces constrasta con lo que se busca en un aspirante para un puesto como desarrollor, que esté muy capacitado, que pueda demostrar logros, que pueda plantear soluciones innovativas, que sea proactivo, etc.  &lt;p&gt;Steve Jobs, fundador de Apple Computer, dice en una frase célebre:  &lt;p&gt;&lt;em&gt;&amp;quot;No tiene sentido contratar a personas inteligentes y después decirles lo que tienen que hacer. Nosotros contratamos a personas inteligentes para que nos digan qué tenemos que hacer.&amp;quot;&lt;/em&gt;  &lt;p&gt;Por otro lado, las metodologías ágiles no son la solución tampoco porque tienen sus problemas y no son aplicables a todas las realidades o mejor dicho, se aplican a un esquema muy particular de trabajo, gente, clientes, proyectos y demás.  &lt;p&gt;Que solución se plantea? Ahí viene:  &lt;p&gt;   &lt;h3&gt;Process Framework&lt;/h3&gt; &lt;p&gt;La solución planteada no sorprende a nadie. La clave es preservar la agilidad mientras se mantiene la posibilidad de escalar la complejidad introducida por el tamaño y la distribución geográfica de los proyectos. Lo verdaderamente importantes es como esta posibilidad va tomando forma real mediante la implementación del paradigma de Software Factories.  &lt;p&gt;Los autores siguen diciendo que el problema de las metodologias formales es que son demasiado abstractas en el sentido que para poder utilizarse deben ser tailorizadas a cada proyecto o necesidad particular. La idea detrás de esta crítica, que no lo es tal, es tailorizar los procesos a una familia de productos concreta.  &lt;p&gt;Es decir, enfocar los procesos hacia las tareas puntuales de todo el ciclo de vida de una familia de productos (o product line -este concepto es importantísimo y lo explicaré mas aelante). Así, por ejemplo, debería por cada actividad facilitarse los recursos necesarios como wikis, links a documentación importante (pero facilmente accesible y no en un archivo de Word o Excel que sabe dios donde está o que se tarda más en abrirse que en buscarlo por otros medios), información de contactos, guias específicas (instructivos) sobre como realizar tarea, checklists aplicables a la tarea, estilos de codificación, detalles de cual/es es/son el/los próximo/s paso/s en el desarrollo, herramientas, políticas, etc. Todo esto debería estar integrado al IDE y en lo posible automatizado.  &lt;p&gt;Como hecho un tanto anecdótico debo resaltar que Microsoft provée el MSF for CMMI Process Improvement Guidance el cual abarca las prácticas relacionadas a las areas claves cubiertas por CMMI nivel 3.  &lt;p&gt;Los Procces Frameworks se componen de dos conceptos: Constraint-Based Scheduling y Active Guidance.  &lt;p&gt;&lt;strong&gt;Constraint-Based Scheduling&lt;/strong&gt; se refiere a dividir (o abordar) un proceso en mini procesos para la construcción de artefactos o tangibles particulares. Cada uno de estos mini procesos define: los requerimientos para producir la salida, los recursos, los pasos a seguir y las decisiones claves que pueden requerirse en cada momento. Lo de Constraint hace referencia a que entre cada uno de los mini procesos existen precondiciones y postcondiciones que deben matchaer entre ellas y a las restricciones propias del scheduling del proyecto.  &lt;p&gt;&lt;strong&gt;Active Guidance&lt;/strong&gt; se refiere en parte a lo que ya mencioné arriba, que en cada paso de una actividad se brinde la información necesaria para realizarla. Esto debe ser estar facilmente accesible, facilmente entendible y en tiempo real, apoyado en asistentes, plantillas autodescriptivas y que asistan al desarrollador, recomendandole acciones, documentación y ejemplos a la vez que monitorizan el cumplimento de los constraints establecidos.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+%5bSoftware+Factories%5d+Introducci%c3%b3n+(Parte+2)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!424.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!424.entry</guid><pubDate>Mon, 27 Aug 2007 23:31:52 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!424/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!424.entry#comment</wfw:comment><dcterms:modified>2007-09-05T01:57:12Z</dcterms:modified></item><item><title>[Software Factories] Introducción (Parte 1)</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!414.entry</link><description>&lt;img style="margin:5px;height:40%" src="http://www.ispysoft.net/BookCover.JPG" align=left&gt; 
&lt;div&gt;Hace un tiempo que estoy estudiando sobre Software Factories, mas precisamente, leyendo los libros: &amp;quot;Software Factories: Assembling Applications with Patterns, Models, Frameworks, and Tools&amp;quot; de Jack Greenfield y Keith Short y &amp;quot;Practical Software Factories in .NET: From Theory to Practice—A Primer, Reference, and Case Study&amp;quot; de Gunther Lenz y Christoph Wienands. Ademas de leer todo lo que diga &amp;quot;Software Factories&amp;quot; en google. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Según sitan todas las fuentes, y en especial referencia al CHAOS Report, son muy pocos los proyectos de desarrollo de software que se consideran exitosos (alrededor del 30%) mientras que el 50% tuvo problemas de irse del presupuesto, tiempo de entrega y calidad. La porción restante fueron cancelados durante el ciclo de vida del desarrollo. El informe le asigna una minúscula importancia a los aspectos técnicos aislados como causal de los fracasos en la terminación e implementación exitosa de los proyectos aunque es evidente que ellos se deben a la manera en que se construye el software, y esta es una tarea eminentemente técnica. Es decir, si se simplificara dramáticamente la tarea de desarrollo seguramente la calidad, la productividad, los costos y tiempos de entrega se dispararían a niveles mas deseables que los actuales. Y esto es un problema de &amp;quot;como se hace&amp;quot; (Técnica).&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Haciendo una comparación entre nuestra industria y otras de diciplinas ingenieriles mas maduras como la mecánica, electrónica y/o civil, Jack Greenfield y Keith Short dicen que fallamos al desarrollar software porque:&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Razón 1 - One-off development&lt;br&gt;&lt;/strong&gt;
&lt;div&gt;Cada proyecto se construye desde CERO e independientemente de otros sistemas similares. Los Assets (no encuentro una palabra mejor pero llamemosles componentes o mejor &amp;quot;tangibles&amp;quot;) de estos sistemas no se crearon con el prop'osito de ser reutilizables. Esto encuentra varias razones:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;hacer algo reutilizable requiere una IDENTIFICACION y ANALISIS de aquellas características comunes que puedan servir en un futuro cercano. 
&lt;li&gt;hacer algo reutilizable requiere que se DISEÑE con ese propósito en mente, 
&lt;li&gt;que se CONSTRUYA, 
&lt;li&gt;que se VERSIONES y MANTENGA, 
&lt;li&gt;que se DOCUMENTE (si no se documenta no es reutilizable por más que se cumpla todo lo anterior)&lt;/ul&gt;
&lt;div&gt;En otras palabras, hacer un tangible reutilizable es una inversión que hay que analizar.&lt;/div&gt;
&lt;div&gt;Una de las formas de reutilización mas común en la actualidad es la dupla copy/paste, que desde mi punto de vista es la peor práctica de todas. Mejores resultados tenemos en la reutilización de componentes en binario o ILs como el Framework .NET, Componentes COM/Activex, los paquetes Java y las .lib en C sin perjuicio de crear nuestros propios binarios para reutilizarlos en esa forma.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img style="margin:5px;height:40%" src="http://images.amazon.com/images/P/0471202843.01.LZZZZZZZ.jpg" align=right&gt; 
&lt;div&gt;Otro problema con la reutilización de fuentes es que el código es mas facil escribirlo que leerlo y eso hace que al leerlo, al no tener la documentación de este (casi nunca la tenemos), al no estar pensado para reutilizarlos facilmente y al no sernos &amp;quot;agradable&amp;quot; la &amp;quot;estética&amp;quot; del código, se nos cruce el pensamiento &amp;quot;Por dios! quien hizo esta porquería!?. Hay que hacerlo de nuevo&amp;quot;. Esto es reinventar la rueda. Más allá del hecho de si servía o no, el tema es que habrá dos fuentes con multitud de características similares que bien podrian haberse hecho de una manera mas inteligente.&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;strong&gt;Razón 2 - Monolithic systems and increasing systems complexity&lt;br&gt;&lt;/strong&gt;Los sistemas monolíticos son aquellos en los que sus componentes están fuertemente acoplados y no permiten tratarlos de manera sistemática porque un cambio en una parte produce la necesidad de hacer cambios en muchos de los componentes con los que se relaciona. El problema se observa con mayor claridad al tener que mantener, extender y adaptar el sistema a los cambios en los requerimientos post &lt;/div&gt;
&lt;div&gt;implementación. Como contrapartida de los sistemas monolíticos tenemos los sistemas pluggeables.&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;strong&gt;Razón 2 - Working at low levels of abstraction&lt;/strong&gt;&lt;br&gt;Este tema ya lo toqué en otros post sobre Domain Specific Language y NBusiness. Veamos como se desarrolla un software: Nos llegan los requerimientos de nuestro Program Manager/Team Leader y, despues de las reuniones de rutina, en que nos comentan hasta como se peina el cliente, empezamos con un pequeño brainstorn personal o con algún grosso amigo (hoy en dia esto lo hacemos casi desde CERO). &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Cuando tenemoslas ideas y los documentos y llega la hora de hecharle mano al código (en este caso ejemplifico con c# pero podría ser cualquier lenguaje: VB, Java, SQL, XSLT, etc) comenzamos así:&lt;/div&gt;
&lt;div&gt;  using System.IO;&lt;br&gt;    :&lt;br&gt;    :&lt;/div&gt;
&lt;div&gt;  public class Product&lt;br&gt;  {&lt;br&gt;    private string productName;&lt;br&gt;    public string Name&lt;br&gt;    { get {...} set {...} }&lt;br&gt;    &lt;/div&gt;
&lt;div&gt;La pregunta es: puede ser esta la manera más natural de especificar el comportamiento y las cualidades de un componente de catálogo de productos? No estaremos hilando demasiado fino? Es más, me atrevo a preguntar: no debería estar hecho ya por alguien más o es que acaso nadie nunca escribió un producto que trabajase con productos?. Está bien, acepto que para algo así falta mucho, que habria que estandarizar bloques de construcción y un montón de cosas más pero la pregunta inicial sigue en pie. Son los lenguajes de propósito general los adecuados para todos los casos particulares? Claro que no. Aquí es donde entran, entre otras cosas, los DSLs o Lenguajes específicos de un dominio.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Aclaro, como desarrollador siempre pienso en función de lenguajes de programación pero bien podrían ser lenguajes de empaquetado, de testings, de validación, de especificación de requerimientos o cualquier otro.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Como alternativa a este bajo nivel de abstracción se analizan una variedad inmensa de cosas, entre las que ya las DSL, como Model Driver development (MDD) y Model Driver Architectural (MDA). Todos con mayor o menor grado de relación con UML y su posibilidad, gracias a XML o mas precisamente XMI, de automatizar una gran cantidad de tareas de desarrollo como así también elevar el nivel de abstracción.&lt;/div&gt;
&lt;div&gt;Este es sin dudas el tema mas interesante si se lo estudia en forma aisladas y es el que mas material tiene escrito (tanto que te cansa).&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;strong&gt;Razón 3 - Process immaturity&lt;/strong&gt;&lt;br&gt;Alguién podrá pensar: &amp;quot;ah no!, ese problema nosotros no lo tenemos. Tenemos CMMI! jajaja&amp;quot;. Bueno, la verdad es que esto es para vos también y se resume así: o demasiado formal o demasiado agil.&lt;br&gt;&lt;/div&gt;
&lt;div&gt;Veamos por qué:&lt;/div&gt;
&lt;div&gt;   &lt;strong&gt;Los mas agiles&lt;/strong&gt;:&lt;br&gt;     &lt;em&gt;Ventajas&lt;/em&gt;:&lt;/div&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;responden bien ante los cambios 
&lt;li&gt;comunicación en lugar de documentación 
&lt;li&gt;desarrollo y corrida en iteraciones pequeñas 
&lt;li&gt;los requerimientos se validan continuamente gracias a una comunicación constante con el cliente 
&lt;li&gt;continuamente se hace refactorin de las aplicaciones&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;p&gt;     &lt;em&gt;Fallan&lt;/em&gt;: 
&lt;ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;imposible de escalar a grandes proyectos o muy complejos. 
&lt;li&gt;escaza documentación de la arquitectura crean problemas de soporte e integración 
&lt;li&gt;equipos distribuidos&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;div&gt;   &lt;strong&gt;Los mas formales:&lt;br&gt;&lt;/strong&gt;        &lt;em&gt;ventajas&lt;/em&gt;:&lt;/div&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;tienen perfectamente establecidos los roles, artefactos y actividades activities 
&lt;li&gt;hacen énfasis en los requerimientos, análisis y diseño 
&lt;li&gt;la arquitectura se documenta con modelos&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;         &lt;em&gt;Fallan&lt;/em&gt;: 
&lt;ul&gt;
&lt;ul&gt;
&lt;ul&gt;
&lt;li&gt;Responden lento a los cambios 
&lt;li&gt;perfectamente escalables a grandes proyectos o proyectos complejos&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;div&gt;Existen muchas discuciones en torno a este tema. Cual es mejor?. La verdad es que en la práctica, esta elección muchas veces no es posible. Hay muchos aspectos a tener en cuenta además de los arriba mencionados que entran en juego y que condicionan una libre elección de la metodología. Por ejemplo: Si tengo grupos pequeños de gente muy capacitada (que no se me van a ir el mes que viene), expertos en temas puntuales, con experiencia, trabajando juntos, con clientes que confian en nosotros a los cuales podemos llamar o ver en cualquier momento, con proyectos relativamente pequeños; bueno, agil es la respuesta. Ahora, si tenemos clientes con distintos usos horarios, idiomas, o nuestro cliente es un gobierno extranjero, que no nos conoce, que quiere mas que una estimación un presupuesto ajustado, que puede hacernos una auditoría, si cotizamos en bolsa, si tenemos proyectos muy grandes, con mucha gente (que se nos va el mes que viene), o somos una pyme de una provincia del interior de un remoto pais que no conoce nadie llamado Argentina y queremos salir a vender nuestros productos por el mundo: bueno, no queda otra, entrá a &lt;a href="http://www.sei.cmu.edu/"&gt;http://www.sei.cmu.edu/&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&lt;br&gt;&lt;strong&gt;Razón 4 - Rapidly growing demand for software systems&lt;/strong&gt;&lt;br&gt;No solo que se incrementó la demanda de software sino que además va creciendo el tamaño y la complejidad del mismo. Los clientes de hoy solicitan funcionalidades o características que hace 2 o 3 años atras ni se les hubiera cruzado por la cabeza. Así que no piensen solo estriban siguiendo la metodología HP (Horse Programming)&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Bueno, esto ya está mas largo que un post de Diegum prometo seguir con este tema en próximos post.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Lucas Ontivero&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+%5bSoftware+Factories%5d+Introducci%c3%b3n+(Parte+1)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!414.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!414.entry</guid><pubDate>Fri, 24 Aug 2007 20:12:01 GMT</pubDate><slash:comments>4</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!414/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!414.entry#comment</wfw:comment><dcterms:modified>2007-08-27T23:49:28Z</dcterms:modified></item><item><title>Software Factories y Entity Oriented Languages - solo un DSL</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!269.entry</link><description>&lt;p&gt;Sin duda, no es posible seguir construyendo software como lo venimos haciendo hasta ahora, reescribiendo bloques de código enteros, con un nivel de abstracción bajísimo y todavia muy lejos del lenguaje natural, tiempos largos, costos altos; lo que resumiendo es calidad pobre . Por eso es que me sumo al pensamiento de quienes aseguran que el Software Factory es el nuevo paradigma a abrazar. 
&lt;p&gt;Ahora, sin bien en cuanto a las tareas operativas de desarrollo, un software factory se compone de patrones, frameworks, herramientas y modelos, este tiene un componente distintivo que es la generación automática de mucho, realmente  mucho código y en este punto entran los DSL (Domain Specific Language), lenguajes especialmente diseñados para un propósito muy particular como SQL, HTML, UML, COBOL y otros (por favor no piensen en DSL Tools).   
&lt;p&gt;La mayoria de los lenguajes que se crearon se diseñaron con un propósito, atacar un conjunto de problemas o facilitar la resolución de situaciones que llevan a la realización de tareas recurrente. Así por ejemplo basta con ver los nombres de algunos de los lenguajes mas renombrados para entender su intención original:  
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;strong&gt;Fortran&lt;/strong&gt;            
&lt;td&gt; &lt;a href="http://en.wikipedia.org/wiki/Fortran"&gt;&lt;strong&gt;For&lt;/strong&gt;mula &lt;strong&gt;Tran&lt;/strong&gt;slating&lt;/a&gt; 
&lt;tr&gt;
&lt;td&gt; &lt;strong&gt;Cobol&lt;/strong&gt;   
&lt;td&gt; &lt;a href="http://en.wikipedia.org/wiki/Cobol"&gt;&lt;strong&gt;CO&lt;/strong&gt;mmon &lt;strong&gt;B&lt;/strong&gt;usiness-&lt;strong&gt;O&lt;/strong&gt;riented &lt;strong&gt;L&lt;/strong&gt;anguage&lt;/a&gt; 
&lt;tr&gt;
&lt;td&gt; &lt;strong&gt;Basic&lt;/strong&gt;    
&lt;td&gt; &lt;a href="http://en.wikipedia.org/wiki/BASIC"&gt;&lt;strong&gt;B&lt;/strong&gt;eginner's &lt;strong&gt;A&lt;/strong&gt;ll-purpose &lt;strong&gt;S&lt;/strong&gt;ymbolic &lt;strong&gt;I&lt;/strong&gt;nstruction &lt;strong&gt;C&lt;/strong&gt;ode&lt;/a&gt; 
&lt;tr&gt;
&lt;td&gt; &lt;strong&gt;DBase&lt;/strong&gt; 
&lt;td&gt;
&lt;p&gt;el nombre es muy sugerente y wikipedia dice: &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/DBASE"&gt;database management system&lt;/a&gt;&amp;quot; (y pensar que me la hacia chala) 
&lt;tr&gt;
&lt;td&gt; &lt;strong&gt;Perl&lt;/strong&gt; 
&lt;td&gt; &lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;&lt;strong&gt;P&lt;/strong&gt;ractical &lt;strong&gt;E&lt;/strong&gt;xtraction and &lt;strong&gt;R&lt;/strong&gt;eport &lt;strong&gt;L&lt;/strong&gt;anguage&lt;/a&gt; 
&lt;tr&gt;
&lt;td&gt; &lt;strong&gt;SQL&lt;/strong&gt;      
&lt;td&gt; &lt;a href="http://es.wikipedia.org/wiki/SQL"&gt;&lt;strong&gt;S&lt;/strong&gt;tructured &lt;strong&gt;Q&lt;/strong&gt;uery &lt;strong&gt;L&lt;/strong&gt;anguage&lt;/a&gt; 
&lt;tr&gt;
&lt;td&gt; &lt;strong&gt;Prolog&lt;/strong&gt;   
&lt;td&gt; &lt;a href="http://es.wikipedia.org/wiki/Prolog"&gt;&lt;strong&gt;Prog&lt;/strong&gt;ramation et &lt;strong&gt;Log&lt;/strong&gt;ique&lt;/a&gt; (yo tampoco sabia que era frances)&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;De repente hoy existen un gran número de lenguajes de propósito general con frameworks, paquetes, componentes, librerias para todo lo imaginable pero con un poder expresivo que no se compara con el de un lenguaje de propósito particular. Por ejemplo, en DBase III+, Clipper y Fox Pro podemos hacer cosas como esta: 
&lt;blockquote&gt;
&lt;p&gt;USE CLIENTES&lt;br&gt;DISPLAY FOR CODIGO &amp;gt; &amp;quot;50000&amp;quot; TO PRINT 
&lt;p&gt;(imprimir el listado de todos los clientes cuyo campo codigo es mayor a 50.000)&lt;/blockquote&gt;
&lt;p&gt;El problema (y la ventaja) con los lenguajes de propósito general es que nos llevan a trabajar a un nivel de detalle que muchas veces es innecesario, al escribir una clase creamos un campo y debemos decidir si es int, float o double y luego crear la propiedad que la inmensa mayoria de las veces es un simple recibir y devolver el valor crudo del campo, innecesario!. Al pensar en una factura, todo el mundo piensa en un papel, en un impuesto, en la afip mientras que los informáticos pensamos en una cabecera y un conjunto (colección, array, etc) de items con productos, un cliente, y un mapeo a la DB. Estamos acostumbrados a pensar en términos de las herramientas que utilizamos! 
&lt;p&gt;Como deberíamos codificar una factura? se me ocurre que de una manera algo mágica considerando &amp;quot;el estado actual del arte&amp;quot; podriamos declararla así:&lt;pre&gt;&lt;p&gt;entity factura&lt;br&gt;{&lt;p&gt;     tipo   options ('A' | 'B' | 'C');&lt;br&gt;     fecha date default systemdate;&lt;br&gt;     total  numeric calculated sum(item.total);&lt;br&gt;     descuento numeric range 0, 100;&lt;br&gt;     cliente ref(cliente);
&lt;p&gt;     component item construction&lt;br&gt;     {&lt;p&gt;            cantidad numeric default 1 validate &amp;gt; 0;&lt;br&gt;            precioUnitario numeric validate &amp;gt;= 0;&lt;br&gt;            total numeric calculated precioUnitario*cantidad;&lt;br&gt;            producto ref(producto);&lt;p&gt;     }&lt;p&gt;}&lt;/pre&gt;
&lt;p&gt;No hace falta aclarar que este código es solo un pseudo-código, no obstante puede apreciarse el poder expresivo del lenguaje.  Este es un lenguaje orientado a entidades o simplemente un DSL para el desarrollo de entidades de negocio. 
&lt;p&gt;El único documento que encontré con Google sobre este tema es el &lt;a href="http://acl.ldc.upenn.edu/P/P84/P84-1047.pdf" target="_blank"&gt;&amp;quot;Entity-Oriented Parsing&amp;quot; de Philip J. Hayes del Computer Science Department, Carnegie.Mellon Llniversity&lt;/a&gt;. Aunque concretado en un producto real puede probarse el lenguaje e# del proyecto &lt;a href="http://www.codeplex.com/NBusiness" target="_blank"&gt;NBusiness&lt;/a&gt;, este permite programar la capa de negocios o de entidad con un nivel de abstracción como el del ejemplo de arriba con no pocas facilidades mas. Además de generar todo el código, se integra a VS (para que programemos con este) y genera un assembly para utilizar el binario (creo que la reutilización del código binario es la mejor opción). Permite crear plantillas, tiene un framework y produce una salida muy buena. 
&lt;p&gt;  
&lt;p&gt;Como conclusión, entiendo que es necesario elevar el nivel de abstracción en el desarrollo de software creando (y utilizando) lenguajes especializados en un dominio del problema.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+Software+Factories+y+Entity+Oriented+Languages+-+solo+un+DSL&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!269.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!269.entry</guid><pubDate>Wed, 25 Apr 2007 03:07:27 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!269/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!269.entry#comment</wfw:comment><dcterms:modified>2007-04-25T03:07:27Z</dcterms:modified></item><item><title>NBusiness - Contribución al E# language</title><link>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!267.entry</link><description>&lt;p&gt;Hoy entré a ver las novedades sobre &lt;a href="http://www.codeplex.com/NBusiness" target="_blank"&gt;NBusiness, un proyecto que me gusta bastante&lt;/a&gt; porque entiendo que puede llegar a ser muy bueno, y  encuentro que han publicado y puesto a disposición de toda la comunidad la &lt;a href="http://www.codeplex.com/NBusiness/Wiki/View.aspx?title=Gold Parser Grammar&amp;amp;referringTitle=Home"&gt;gramática del lenguaje e#&lt;/a&gt; que les envié hace ya algún tiempo. Realmente me gustó mucho el gesto y el &amp;quot;Thanks Lucas Ontivero!&amp;quot;. &lt;p&gt;Posteo la gramática abajo. Está hecha para &lt;a href="http://www.devincook.com/goldparser/" target="_blank"&gt;Gold Parser&lt;/a&gt; que es un generador de parser para muchos lenguajes entre ellos c#, java, Pascal, Delphi, C, C++ y otros. Permite exportar gramáticas a Yacc (o Bison) y es extremadamente grosso, muy recomendable para quienes tengan que hacer un parser. &lt;p&gt;  &lt;p&gt;&lt;font face=Courier&gt;&lt;pre&gt;! -----------------------------------------------------------------------&lt;br&gt;! E# Grammar&lt;br&gt;! ----------------------------------------------------------------------- &lt;/pre&gt;&lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;quot;Name&amp;quot;      = 'ESharp' &lt;br&gt;&amp;quot;Author&amp;quot;    = 'Lucas Ontivero'&lt;br&gt;&amp;quot;Version&amp;quot;   = '.NET'&lt;br&gt;&amp;quot;About&amp;quot;     = ''&lt;br&gt;&amp;quot;Case Sensitive&amp;quot; = false &lt;br&gt;&amp;quot;Start Symbol&amp;quot; = &amp;lt;Program&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;! ----------------------------------------------------------------- Sets &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;{ID Head}   = {Letter} + [_]&lt;br&gt;{ID Tail}   = {AlphaNumeric} + [_@]&lt;br&gt;{String Ch} = {Printable} - [&amp;quot;]&lt;br&gt;{Char Ch}   = {Printable} - ['']&lt;br&gt;! ----------------------------------------------------------------- Terminals &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;Identifier  = {ID Head} {ID Tail}* &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;DecLiteral  = {Digit}+&lt;br&gt;RealLiteral = {Digit}* '.' {Digit}+ ( 'E' [+-]? {Digit}+ )? &lt;br&gt;            | {Digit}+ 'E' [+-]? {Digit}+ &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;StringLiteral = '&amp;quot;'( {String Ch} | '\'{Printable} )* '&amp;quot;' &lt;/font&gt;
&lt;p&gt;  
&lt;p&gt;&lt;font face=Courier&gt;! ----------------------------------------------------------------- Terminals&lt;br&gt;&amp;lt;Qualified ID&amp;gt; ::= &amp;lt;Qualified ID&amp;gt; '.' Identifier&lt;br&gt;               | Identifier &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;! ----------------------------------------------------------------- Rules &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Program&amp;gt;      ::= &amp;lt;Families&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Families&amp;gt;     ::= &amp;lt;Family&amp;gt; &amp;lt;Families&amp;gt;&lt;br&gt;               | &amp;lt;Family&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Family&amp;gt;       ::= family &amp;lt;Qualified ID&amp;gt; '{' &amp;lt;Family Items&amp;gt; '}'&lt;/font&gt; 
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Family Items&amp;gt; ::= &amp;lt;Family Item&amp;gt; &amp;lt;Family Items&amp;gt; &lt;br&gt;               | &amp;lt;Family Item&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;Family Item&amp;gt;  ::= &amp;lt;Entity&amp;gt;&lt;br&gt;               | &amp;lt;Template&amp;gt;&lt;br&gt;               | &amp;lt;Family&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Template&amp;gt;     ::= template Identifier as &amp;lt;Qualified ID&amp;gt; in &amp;lt;Qualified ID&amp;gt; ';' &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Entity&amp;gt;       ::= entity Identifier &amp;lt;Entity Opts&amp;gt; &amp;lt;List Entities Opts&amp;gt; '{' &amp;lt;Entity Items&amp;gt; '}' &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Entity Opts&amp;gt;  ::= as Identifier&lt;br&gt;               | &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&lt;br&gt;&amp;lt;List Entities Opts&amp;gt; ::= ',' &amp;lt;List ID&amp;gt;&lt;br&gt;               | &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;List ID&amp;gt;      ::= Identifier ',' &amp;lt;List ID&amp;gt;&lt;br&gt;               | Identifier &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&lt;br&gt;&amp;lt;Entity Items&amp;gt; ::= &amp;lt;Entity Item&amp;gt; &amp;lt;Entity Items&amp;gt;&lt;br&gt;               | &amp;lt;Entity Item&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Entity Item&amp;gt; ::= &amp;lt;Statement&amp;gt; ';' &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Statement&amp;gt;   ::= &amp;lt;Field&amp;gt;&lt;br&gt;              | &amp;lt;Relationship&amp;gt;&lt;br&gt;              | &amp;lt;Validate&amp;gt;&lt;br&gt;              | &amp;lt;Access&amp;gt;&lt;br&gt;              | &amp;lt;Authorize&amp;gt;&lt;br&gt;              | &amp;lt;Action&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;Field&amp;gt;       ::= field &amp;lt;Field Modifiers&amp;gt; &amp;lt;Type&amp;gt; Identifier &amp;lt;Array Dim Opt&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;Relationship&amp;gt;::= relationship Identifier with Identifier &amp;lt;Constraints&amp;gt; as &amp;lt;RelationshipType&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;Validate&amp;gt;    ::= validate Identifier &amp;lt;ValidateRule&amp;gt;&lt;br&gt;&amp;lt;Action&amp;gt;      ::= action Identifier &amp;lt;Action Item&amp;gt;&lt;br&gt;&amp;lt;Authorize&amp;gt;   ::= authorize &amp;lt;RuleType&amp;gt; &amp;lt;RuleRol&amp;gt; &amp;lt;AuthorizeAction&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Access&amp;gt;      ::= access &amp;lt;RuleType&amp;gt; &amp;lt;RuleRol&amp;gt; &amp;lt;AccessAction&amp;gt; Identifier &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;RuleType&amp;gt;    ::= deny&lt;br&gt;              | allow &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;RuleRol&amp;gt;     ::= '*'&lt;br&gt;              | '?'&lt;br&gt;              | Identifier&lt;br&gt;              | StringLiteral &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;AccessAction&amp;gt;::= set&lt;br&gt;              | get &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;AuthorizeAction&amp;gt; ::= create&lt;br&gt;              | update&lt;br&gt;              | delete&lt;br&gt;              | retrieve &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;ValidateRule&amp;gt;::= maxlength DecLiteral&lt;br&gt;              | maxvalue &amp;lt;NumericValue&amp;gt;&lt;br&gt;              | minlength DecLiteral&lt;br&gt;              | minvalue &amp;lt;NumericValue&amp;gt;&lt;br&gt;              | regex StringLiteral&lt;br&gt;              | required &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;NumericValue&amp;gt;::= DecLiteral&lt;br&gt;              | RealLiteral &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Field Modifiers&amp;gt; ::= nullable&lt;br&gt;              | readonly&lt;br&gt;              | auto id&lt;br&gt;              | id&lt;br&gt;              | &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Type&amp;gt;        ::= int&lt;br&gt;              | string&lt;br&gt;              | unique&lt;br&gt;              | bytes&lt;br&gt;              | short&lt;br&gt;              | long&lt;br&gt;              | decimal&lt;br&gt;              | double&lt;br&gt;              | float&lt;br&gt;              | DateTime&lt;br&gt;              | bool&lt;br&gt;              | Identifier &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;RelationshipType&amp;gt; ::= parent&lt;br&gt;              | child&lt;br&gt;              | sibling &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Constraints&amp;gt; ::= on &amp;lt;List Constraint&amp;gt;&lt;br&gt;              | &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;List Constraint&amp;gt; ::= &amp;lt;List ID&amp;gt; '=' &amp;lt;List ID&amp;gt;&lt;br&gt;              | &amp;lt;List ID&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Action Item&amp;gt; ::= &amp;lt;Action On&amp;gt;&lt;br&gt;              | &amp;lt;Action When&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Action On&amp;gt;   ::= on &amp;lt;Qualified ID&amp;gt; &amp;lt;Action When&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Action When&amp;gt; ::= when &amp;lt;ActionHooks&amp;gt; &amp;lt;Async opt&amp;gt; &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Async opt&amp;gt;   ::= async&lt;br&gt;              | &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;ActionHooks&amp;gt; ::= Loading&lt;br&gt;              | Loaded&lt;br&gt;              | Fetching&lt;br&gt;              | Fetched&lt;br&gt;              | Persisting&lt;br&gt;              | Persisted&lt;br&gt;              | Inserting&lt;br&gt;              | Inserted&lt;br&gt;              | Updating&lt;br&gt;              | Updated&lt;br&gt;              | Deleting&lt;br&gt;              | Deleted&lt;br&gt;              | Validating&lt;br&gt;              | Validated&lt;br&gt;              | Accessing&lt;br&gt;              | Accessed&lt;br&gt;              | Changed&lt;br&gt;              | Error &lt;/font&gt;
&lt;p&gt;&lt;font face=Courier&gt;&amp;lt;Array Dim Opt&amp;gt; ::= '[' DecLiteral ']'&lt;br&gt;|&lt;/font&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=3988747590285877710&amp;page=RSS%3a+NBusiness+-+Contribuci%c3%b3n+al+E%23+language&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=lucasontivero.spaces.live.com&amp;amp;GT1=lucasontivero"&gt;</description><comments>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!267.entry#comment</comments><guid isPermaLink="true">http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!267.entry</guid><pubDate>Tue, 24 Apr 2007 22:45:51 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://lucasontivero.spaces.live.com/blog/cns!375AE0CCD1AF61CE!267/comments/feed.rss</wfw:commentRss><wfw:comment>http://lucasontivero.spaces.live.com/Blog/cns!375AE0CCD1AF61CE!267.entry#comment</wfw:comment><dcterms:modified>2007-04-25T03:12:09Z</dcterms:modified></item></channel></rss>