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

<channel>
	<title>Miguel Matas Blog &#187; Arquitectura</title>
	<atom:link href="http://www.miguelmatas.es/blog/category/arquitectura/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miguelmatas.es/blog</link>
	<description>Ingeniería de Software, Gestión de Proyectos, Programación, BPM, Arquitectura de Software, .NET, J2EE</description>
	<lastBuildDate>Sat, 21 Jan 2012 11:00:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>¿Dónde se ejecutan las cosas?</title>
		<link>http://www.miguelmatas.es/blog/2011/12/07/%c2%bfdonde-se-ejecutan-las-cosas/</link>
		<comments>http://www.miguelmatas.es/blog/2011/12/07/%c2%bfdonde-se-ejecutan-las-cosas/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 09:39:13 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Metodologías]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=657</guid>
		<description><![CDATA[HTML, Javascript, CSS, ASP.NET, WCF, WPF, C#, PL/SQL&#8230; Una multitud de herramientas a las que se enfrentan ya con soltura desarrolladores web (especialmente sobre plataforma Microsoft) y para las que nadie cae ya en la dificultad inicial y conceptual que representa la pregunta: ¿dónde se ejecutan las cosas? Pregunta que sin lugar a dudas es fundamental resolver [...]]]></description>
			<content:encoded><![CDATA[<p>HTML, Javascript, CSS, ASP.NET, WCF, WPF, C#, PL/SQL&#8230;</p>
<p>Una multitud de herramientas a las que se enfrentan ya con soltura desarrolladores web (especialmente sobre plataforma Microsoft) y para las que nadie cae ya en la dificultad inicial y conceptual que representa la pregunta: ¿dónde se ejecutan las cosas?</p>
<p>Pregunta que sin lugar a dudas es fundamental resolver al inicio, para formaciones orientadas a nuevos profesionales del desarrollo web, especialmente para aclarar muchos conceptos derivados del funcionamiento de ASP.NET, y su transformación/creación al vuelo de HTML, CSS y Javascript&#8230; por no hablar de temas específicos de comunicación cliente-servidor y mantenimiento del estado de la página mediante uso del ViewState, Session, etc.</p>
<p>Un concepto tan básico para desarrolladores ya iniciados, como que cuando entramos en una web esta no se visualiza en el &#8220;limbo&#8221;, si no que es descargada una copia en local (seguramente después de un procesado de página en el servidor web) y que lo único que hace el navegador es abrir dicha copia en local y renderizarla, no es algo que tengan tan claro los recién iniciados en este mundillo. Hay que saber contarlo y empezar por ahí, ya que con esto comenzaremos a asentar conocimientos básicos de arquitectura, del mismo modo que empezaremos a dar margen a pensar en la usabilidad y tiempos de respuesta de la página al usuario (no es lo mismo ejecutar arriba que ejecutar abajo, ni resolver problemas mediante una llamada a servidor o mediante n, ni de forma síncrona o asíncrona).</p>
<p>Este punto debería ser pieza clave, a la hora de comenzar el: <strong>Capítulo IV. Replicando en Web.</strong> El cual describíamos en el artículo <a title="Metodología de Formación para Nuevos Profesionales del Software" href="http://www.miguelmatas.es/blog/2011/09/18/metodologia-formacion-nuevos-profesionales-software/">Metodología de Formación para Nuevos Profesionales del Software</a></p>
<p>Saludos.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2011/12/07/%c2%bfdonde-se-ejecutan-las-cosas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Metodología de Formación para Nuevos Profesionales del Software</title>
		<link>http://www.miguelmatas.es/blog/2011/09/18/metodologia-formacion-nuevos-profesionales-software/</link>
		<comments>http://www.miguelmatas.es/blog/2011/09/18/metodologia-formacion-nuevos-profesionales-software/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 15:21:49 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Metodologías]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=640</guid>
		<description><![CDATA[A continuación, basado en su uso y experiencia, traslado la metodología que mejor resultado viene dando en la transmisión de conceptos de arquitectura y desarrollo de software a perfiles de profesionales recién licenciados sin experiencia, con experiencia leve, o experiencia focalizada en desarrollos específicos web, escritorio o dispositivos móviles. Puntualizar que la experiencia ha sido [...]]]></description>
			<content:encoded><![CDATA[<p>A continuación, basado en su uso y experiencia, traslado la metodología que mejor resultado viene dando en la transmisión de conceptos de arquitectura y desarrollo de software a perfiles de profesionales recién licenciados sin experiencia, con experiencia leve, o experiencia focalizada en desarrollos específicos web, escritorio o dispositivos móviles.</p>
<p>Puntualizar que la experiencia ha sido siempre lanzada utilizando como base tecnología Microsoft.NET, la cual dispone de herramientas que dan cobertura completa a los conceptos de arquitectura a trasladar, pero esto no quiere decir que este método no pueda ser aplicado utilizando otras tecnologías de cobertura completa (Java por ejemplo) o incluso en combinación de varias (bajo mi punto de vista sería el objetivo a cumplir tras la primera fase del &#8220;curso&#8221; que hoy os vamos a trasladar).</p>
<p><strong>Objetivos</strong></p>
<p>En el momento de finalizar el curso el alumno debe haber asentado su conocimiento sobre los siguientes conceptos</p>
<p>1) Entorno de desarrollo tipo<br />
2) Desarrollo de arquitecturas orientadas a n-capas<br />
3) Desarrollo de aplicaciones SOA<br />
4) Buenas y malas prácticas de programación<br />
5) Diferencias fundamentales en el desarrollo de aplicaciones web y escritorio<br />
6) Trabajo colaborativo y en equipo<br />
7) Importancia de las pruebas en el proceso de desarrollo<br />
 <img src='http://www.miguelmatas.es/blog/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Despliegue de aplicaciones en entornos no accesibles<br />
9) Dinámica de proyecto</p>
<p>Mientras que los objetivos del instructor son</p>
<p>1) Adaptar la formación a un escenario tipo de proyecto, el alumno desde el primer día debe entrar en la dinámica del día a día de un proyecto real<br />
2) Identificar áreas de mejora de los alumnos, tanto técnicas como no técnicas<br />
3) Identificar puntos fuertes y puntos de mejora del alumno<br />
4) Identificar puntos de mejora del propio método de formación</p>
<p><strong>Requerimientos Previos</strong></p>
<p>Referidos a los alumnos (en orden de importancia):</p>
<p>1) Programación orientada a objetos<br />
2) Definición de modelos entidad-relación<br />
3) HTML básico</p>
<p>La falta de conocimiento de alguno de estos puntos, requerirá que el instructor incorpore a la formación módulos adicionales que cubran la visión necesaria al respecto.</p>
<p>Otros valores deseables ajenos a las capacidades técnicas</p>
<p>1) Pro actividad<br />
2) Eficacia<br />
3) Eficiencia<br />
4) Trabajo en equipo<br />
5) Liderazgo<br />
6) Confianza<br />
7) Capacidad de trabajo<br />
 <img src='http://www.miguelmatas.es/blog/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Nivel de interlocución</p>
<p>Es labor del instructor identificar puntos de mejora también en estos aspectos, potenciándolos durante el proceso formativo. No solo estamos formando a nivel técnico, también estamos formando profesionales que van a ser parte fundamental de proyectos de desarrollo que requerirán de aptitudes no solo técnicas para lograr el éxito del proyecto.</p>
<p>Referidos al instructor:</p>
<p>1) Profesional consolidado en conocimientos de arquitectura y en la tecnología/tecnologías de desarrollo que se desarrollan en el curso.<br />
2) Experiencia de trabajo en proyectos, habiendo participado/liderado procesos de captura de requerimientos, definición de arquitecturas y procesos de implantación/despliegue, gestión de equipos, diseños funcionales, diseños técnicos, supervisión del trabajo de otros programadores y construcción.<br />
3) Nivel de interlocución medio-alto<br />
4) Experiencia en sesiones formativas</p>
<p>En resumen y por poner un símil en consultoría, las habilidades esperadas de un Jefe de Equipo.</p>
<p><strong>Bases Fundamentales de la Metodología</strong></p>
<p>* Dinámica de proyecto desde el primer día<br />
* Curso eminentemente práctico<br />
* Grupos de formación pequeños (entre 5 y 10 alumnos máximo por instructor)<br />
* No solo centrarse en las habilidades técnicas<br />
* Que el alumno de el primer paso: resolver el problema de forma completa con el conocimiento actual del alumno, a medida que se vayan incorporando conceptos nuevos (a posteriori) el alumno deberá resolver de forma completa el problema adaptando su solución e incorporando los nuevos conceptos adquiridos.<br />
* El instructor no es el protagonista</p>
<p><strong>Capítulo I: Definiendo requerimientos</strong></p>
<p>Todo proyecto comienza a partir de un conjunto de requerimientos, por lo que si uno de nuestros principales objetivos es introducir al alumno en la dinámica del proyecto deberemos partir de un conjunto de requerimientos base. No es objetivo de esta formación introducir al alumno en el proceso de toma de requerimientos, por lo que nos mantendremos ajenos a él. Nuestro punto de partida puede ser un pequeño documento que describa un pequeño escenario o si queremos empezar desde ya a identificar capacidades no técnicas, un pequeña conversación (poniéndose el instructor la gorra del cliente) donde se describan los requerimientos a cubrir; es aquí donde el alumno debe comenzar a tomar notas y hacerse un pequeño esquema mental de la solución. No es una toma de requerimientos en sí, ya que lo que hará el instructor será recitar verbalmente los requerimientos como si los estuviera leyendo.</p>
<p>Dependiendo de a dónde queramos llegar elegiremos uno de los dos métodos, eso sí, es fundamental que sea cual sea el formato seleccionado, se abra un espacio para dudas y preguntas por parte del alumno. Es así como comenzaremos a matizar el alcance, reglas de negocio, otros requerimientos, etc; además de comenzar a identificar habilidades no técnicas del alumno.</p>
<p>¿Y qué vamos a construir? Bajo mi punto de vista deberíamos definir una herramienta que motive al alumno, pero cuyo funcionamiento a bajo nivel resulte algo ajeno. Es decir, evitaría temas muy comunes como el desarrollo de una aplicación de gestión para bibliotecas o temas muy complejos como el desarrollo de una herramienta de gestión de cálculo de declaraciones de renta. Como un ejemplo no muy complejo tendríamos una herramienta tipo Facebook o Google+.</p>
<p><strong>Capítulo II: Plazos e hitos</strong></p>
<p>La propia definición de proyecto lo lleva de serie, los plazos. No hay proyecto sin un plazo de ejecución límite, por lo que el alumno debe desde el primer día ser consciente de esta realidad, trasladándole la tensión (que no presión) necesaria para mantener su motivación y dedicación al proyecto.</p>
<p>Este es el momento de trasladar al alumno cuál es la planificación de su primer proyecto (la planificación del curso), con cada uno de sus hitos intermedios y su hito final. Tanto el instructor como el alumno son los responsables de que dicha planificación se cumpla (no solo el instructor), cumpliendo adicionalmente todos los objetivos establecidos para el curso.</p>
<p>Para cada tarea el instructor establecerá tiempos límite. El objetivo es que el alumno empiece a jugar con el tiempo, a saber cuándo puede dilatarlo y cuándo puede (normalmente más que puede debe) contraerlo. No podemos irnos por las ramas, atascarnos de forma permanente; si no podemos tomar un camino, busquemos otra alternativa. La calidad de los resultados tiene relación también con el tiempo, hay que saber jugar con estos conceptos.</p>
<p><strong>Capítulo III: Desarrollo de aplicación de escritorio</strong></p>
<p><em>Fase 1 &#8211; Familiarizarse con el entorno y la tecnología</em></p>
<p>Como comentábamos al inicio, las formaciones de este tipo siempre han venido de la mano de tecnología Microsoft .NET, por lo que el hilo argumental se basará en la experiencia con dicha tecnología. Es en este punto donde cada instructor deberá adaptar los conceptos y herramientas a la tecnología seleccionada.</p>
<p>En nuestro caso entonces, nuestro entorno de desarrollo podría ser Visual Studio 2010 y nuestro framework el .NET Framework 4.0 (adaptar también dependiendo de los objetivos a lograr).</p>
<p>En esta primera fase, el instructor trasladará al alumno el funcionamiento básico del entorno de desarrollo:</p>
<p>* Tipos de proyecto<br />
* Menús<br />
* Teclas de acceso rápido</p>
<p>y de la tecnología</p>
<p>* Framework .NET 4.0 (en nuestro caso de partida)<br />
* Orientación a eventos</p>
<p>Fase 2 &#8211; Solucionar el problema con lo puesto, premisa: todo va en memoria</p>
<p>Manos a la obra, el alumno ya dispone de una versión mínima de funcionamiento del entorno y del framework y conoce los requerimientos a cubrir. El primer objetivo a proponer al alumno es el de construir un aplicativo de escritorio que cubra los requerimientos demandados por el cliente, obviando una de las partes fundamentales de una herramienta de gestión, como es el almacenamiento de la información en un modelo de persistencia no volátil (una base de datos o un conjunto de ficheros).</p>
<p>En este punto el instructor únicamente marca las siguientes premisas:</p>
<p>1) El alumno deberá describir en un pequeño documento las principales entidades implicadas y sus relaciones (no estamos hablando de un modelo relacional formal, simplemente queremos ver que el alumno ha entendido el requerimiento y se ha construido un mapa mental con la información a gestionar y las relaciones que existen entre ella).</p>
<p>2) Antes de iniciar la codificación, el alumno deberá diseñar en primer lugar las interfaces de usuario a partir del entorno visual (WYSWYG) que provee el propio Visual Studio. Interfaces sin comportamiento únicamente descripción de las pantallas.</p>
<p>3) Límite temporal para realizar estas actividades.</p>
<p>Adicionalmente, el instructor puede esperar a ver con qué herramientas soluciona el problema del almacenamiento en memoria el alumno o trasladar una pista inicial que es el uso de listas genéricas, que es donde el instructor pretende que el alumno llegue. Una u otra opción dependerá del plazo temporal que estipulemos para esta primera fase.</p>
<p>El objetivo de esta primera fase se considera alcanzado cuando el alumno ha sido capaz de construir un aplicativo libre de errores con las nociones básicas de programación en objetos de las que cuenta, las nociones de entorno, de framework y la formación en el uso de listas genéricas. Nuestro aplicativo es un aplicativo que cubre el requerimiento sobre una aplicación de escritorio, pero con el pequeño gran defecto de que al cerrar el aplicativo toda la información almacenada en memoria se pierde.</p>
<p><em>Fase 3 &#8211; Primeras Pruebas</em></p>
<p>En este punto el alumno cuenta con una aplicación que cubre los requerimientos descritos por el cliente (o que debería cumplirlos) y que está preparado para su uso masivo por parte del mismo (esperamos).</p>
<p>Es este el momento para trasladar la importancia del proceso de pruebas. Lo más normal es que el instructor en menos de 5 minutos haya conseguido explotar tanto vulnerabilidades del sistema (objetos no referenciados, validaciones que fallan, problemas de seguridad de acceso, navegaciones ineficientes, etc) y requerimientos que no se cumplen parcial o totalmente. Se debe estudiar cada una de las aplicaciones y trasladar de forma global a los alumnos cuáles han sido los problemas que se han detectado. Es fundamental que el instructor traslade al alumno la importancia del proceso de pruebas y verificación; se la ha de poner en la piel del cliente. El alumno debe afianzar la visión del cliente y quedarse con la máxima &#8220;me da igual cómo esté hecho por dentro, lo que te haya costado hacerlo y lo que cueste mantenerlo (esto último no debería darle igual pero ya hablaremos de ese tema otro día), necesito que funcione y solucione mi problema fácil y rápidamente&#8221;. La definición técnica y de arquitectura es básica para el éxito del aplicativo y su posterior mantenimiento, pero debemos transmitir a fondo en esta fase que ésta no es la prioridad principal del cliente, por lo que el desarrollador debe darle tanta importancia a los factores técnicos como a los factores de &#8220;cliente&#8221;. Como ya muchos de vosotros sabréis, los éxitos técnicos son estupendos y maravillosos (seguramente os hayan acusado de románticos más de una vez), pero no son suficientes si el aplicativo no hace lo que tiene que hacer o falla intentándolo; si el aplicativo no es usado, no hay éxito.</p>
<p>Resumiendo, no es objetivo de esta fase validar técnicamente el aplicativo, únicamente el instructor se debe poner la gorra del cliente y revisar el aplicativo a nivel de uso, siendo muy exigente con el resultado obtenido. Es buen momento para trasladar ciertas nociones de usabilidad al alumno y de establecer los mecanismos básicos de herramientas para llevar a cabo pruebas unitarias y funcionales.</p>
<p><em>Fase 4 &#8211; Trasladando buenas prácticas</em></p>
<p>El punto de entrada de esta fase es una aplicación que representa lo que el requerimiento dictamina, de forma usable y con una tasa de errores no significativa.</p>
<p>Es ahora el momento en el que el instructor deberá analizar cada uno de los aplicativos desarrollados por los alumnos de forma interna, evaluando cuáles son los principales problemas detectados. El nivel de conocimiento previo del alumno es el que va a marcar el camino a seguir a partir de ahora. Resalto a continuación los principales temas identificados como puntos de mejora en desarrolladores con experiencia media-baja.</p>
<p>* No aplicación de patrones de diseño y otras herramientas provistas por la programación orientada a objetos<br />
* No se encapsula<br />
* No se orienta el código a su mantenibilidad<br />
* No se emplean estándares de codificación<br />
* No se comentan los métodos, ni los parámetros, ni los fragmentos de código más complejos<br />
* No se aplican las listas genéricas (si no lo hemos trasladado en una fase anterior)<br />
* No se usan constantes<br />
* Se hardcodean parámetros configurables a partir de ficheros externos<br />
* No se emplean excepciones<br />
* No hay separación entre capas</p>
<p>El alumno tendrá que refactorizar su código atendiendo a todas estas clausulas, logrando disponer nuevamente de una herramienta que cubra los mismos requerimientos y que pase el proceso de pruebas nuevamente. Lo interesante sería que estos conceptos se vayan dando de uno en uno, para que el alumno los vaya asentando individualmente.</p>
<p><em>Fase 5 &#8211; Concepto de capa de acceso a datos</em></p>
<p>Uno de los problemas que seguramente haya surgido en la primera fase es que no haya separación entre capas, es decir, que el alumno haya construido un aplicativo en el que desde el propio interfaz se esté aplicando la lógica de negocio y accediendo a nuestro repositorio de datos (que por ahora tenemos en memoria).</p>
<p>En este punto es donde vamos a tener que proponer una refactorización importante de código, ya que todo lo que tenga que ver con acceso a datos el alumno deberá moverlo a un conjunto de clases independientes agrupadas por entidades de datos. La interfaz debe dejar de saber dónde estamos almacenando el dato, pudiendo en un momento dado cambiar el modelo de almacenamiento (de memoria a una base de datos física) sin necesidad de modificar una sola línea de código en la capa de presentación. En este punto es interesante trasladar el funcionamiento de patrones como DAO y DTO.</p>
<p>Nuevamente tras el desarrollo, el alumno deberá garantizar que la aplicación cubre los requerimientos y pasa el plan de pruebas, así como que ante un cambio de modelo de persistencia, la capa de presentación no va a sufrir ningún tipo de cambio.</p>
<p><em>Fase 6 &#8211; Definiendo un modelo relacional</em></p>
<p>El alumno ya debería estar en disposición en este punto de modelar relacionalmente la solución. Para ello, se le provee en este caso de un acceso a una instancia de SQL Server 2008, donde va a poder definir el modelo relacional. Es en este punto donde el instructor deja definir al alumno el modelo sin aplicar ningún tipo de premisa, con el objetivo de identificar necesidades formativas al respecto.</p>
<p>El instructor debería reforzar los siguientes conceptos</p>
<p>* Uso de claves primarias y foráneas<br />
* Uso de relaciones 1-N y 1-1, definición de modelos entidad-relación basados en 3FN<br />
* Abuso de la 3FN y problemas de rendimiento asociados<br />
* Estándar de nomenclatura para campos y tablas<br />
* Introducir comentarios descriptivos en campos y tablas<br />
* Importancia de los índices<br />
* Concepto y programación de procedimientos almacenados (muchos recién licenciados salen de la carrera sin que nadie les haya contado que es un procedimiento almacenado y para qué sirve).</p>
<p><em>Fase 7 &#8211; Almacenando la información de forma persistente</em></p>
<p>Ya tenemos una capa de acceso a datos que realizamos en la fase 5 y un modelo de datos desarrollado en la fase 6; ahora nos queda preparar nuestra capa de acceso a datos para cambiar el modelo de persistencia y comenzar a persistir sobre nuestra base de datos SQL Server 2008.</p>
<p>En este punto el instructor deberá seleccionar la tecnología de acceso a datos que considere. En caso de orientar la formación a un proyecto específico o tecnología esto nos llevaría a trabajar en este punto con una tecnología de acceso a datos concreta. En casos en los cuales no tengamos clara la salida del alumno, y a nivel general, recomiendo partir de las clases básicas de acceso a datos que provee el framework (ADO.NET<em>; </em>JDBC para formaciones Java<em>),</em> que accedan a los procedimientos almacenados que el alumno ha creado sobre la propia base de datos.</p>
<p>Esta fase va a generar una refactorización exclusivamente sobre la capa de acceso a datos (si hemos hecho bien el resto), y nuestra aplicación, sin necesidad de tocar una sola línea en el interfaz, va a pasar de almacenar la información en memoria a almacenar la información en base de datos.</p>
<p>Como siempre, tras este cambio, la aplicación va a tener que seguir cumpliendo el requerimiento y pasando el plan de pruebas.</p>
<p>Tras este desarrollo, el alumno debería percibir la importancia del trabajo en capas, la abstracción que supone el uso de capas separadas, reforzando el uso de clases con una alta cohesión y bajo acoplamiento.</p>
<p><em>Fase 8 &#8211; Concepto de capa de lógica de negocio</em></p>
<p>Nuestro código dispone en este punto de una capa de presentación que no conoce de dónde proviene el dato que está manejando, pero que sí conoce la lógica del negocio. Es decir, si para nuestro negocio dar de alta un nuevo modelo de coche en nuestro software de gestión de flotas de vehículos supone, además de realizar una inserción en la tabla que almacena los modelos a través de nuestra nueva y reciente capa de acceso a datos, enviar 3 e-mails a 3 destinatarios diferentes, replicar un conjunto de datos asociado al modelo en otro contexto diferente al nuestro, generar un fichero de comunicación con otros sistemas, etc; en este punto todo este código seguramente estará ubicado en el propio evento &#8220;onClick&#8221; del botón dar de alta nuevo modelo de coche.</p>
<p>El objetivo de esta fase es que una vez finalizada, nuestro aplicativo cuente con una capa de negocio que encapsule todo este comportamiento. Nuestro botón &#8220;onClick&#8221; debería llamar a un único método llamado &#8220;DarDeAltaModeloCoche&#8221; que se encargara de realizar todas las acciones pertinentes (entre otras realizar la inserción del nuevo modelo de coche a través de la capa de acceso a datos). La capa de presentación no sabe dónde se almacena el coche, y qué significa para nuestro negocio el dar de alta un modelo de coche.</p>
<p>Nuevamente, el aplicativo deberá respetar los requerimientos y pasar el plan de pruebas.</p>
<p><em>Fase 9 &#8211; Otras capas: Caché, Validación</em></p>
<p>Incluimos a continuación nociones de uso de otras capas como Caché, Validación, etc. Es un bueno momento para trasladar al alumno teoría de algunos patrones como Singleton, Strategy, Factory, etc.</p>
<p>El aplicativo debería reflejar dichos ajustes.</p>
<p>Fase 10 &#8211; Librerías</p>
<p>Nuestro código, aunque separado perfectamente en diferentes capas, ha estado formando parte de la misma aplicación en todo momento. Es este el momento de incluir los conceptos de librería de clase, y dividir cada una de las capas en librerías diferenciadas por el proyecto inicial. Acceso a Datos, Negocio, Validación, Entidades de Negocio&#8230; son librerías diferenciadas que podrán ser actualizadas de forma independiente y reutilizadas.</p>
<p><strong>Capítulo IV: Replicando en Web</strong></p>
<p>Es precisamente en este punto donde vamos a comenzar a reutilizar el trabajo realizado en la última de las fases de desarrollo de aplicaciones de escritorio, ya que vamos a referenciar las librerías de negocio, acceso datos, caché, validación y otras capas que hayamos creado para la aplicación de escritorio. Todo el trabajo va a ser reutilizado a excepción de la capa de presentación que es la única que va a cambiar. El alumno deberá notar la potencia de haber desarrollado su anterior trabajo con esta orientación, limitándose a realizar una nueva interfaz.</p>
<p>En este punto el instructor debe trasladar conocimientos avanzados al respecto de</p>
<p>* HTML<br />
* Javascript<br />
* CSS<br />
* ASP.NET</p>
<p>Una vez finalizado este capítulo, el alumno cuenta con dos aplicativos diferentes que realizan exactamente la misma función y sobre los que únicamente se diferencia la interfaz (ambos referencian a los mismos proyectos de tipo librería para realizar cálculos de negocio y almacenamiento de datos).</p>
<p><strong>Capítulo V: Replicando en Dispositivos Móviles</strong></p>
<p>Mismo trabajo en el punto de desarrollo de aplicaciones web, pero en este caso realizando desarrollo sobre proyecto de aplicación móvil.</p>
<p><strong>Capítulo VI: Distribuyendo el negocio, concepto de servicio, arquitectura SOA, independencia del dispositivo</strong></p>
<p>Nuestro aplicativo ha referenciado hasta ahora librerías locales. Ha llegado el momento de distribuir el conocimiento del negocio en un aplicativo distribuido: Windows Communication Foundation. Si todo ha ido bien, las tres capas de presentación diferenciadas con las que contamos en este momento (escritorio, web, móvil), únicamente deberán cambiar su referencia de las librerías locales a los servicios web publicados por el aplicativo WCF que también crearemos en este punto.</p>
<p>Hasta aquí la primera versión de este método, donde intento a alto nivel dar a entender el formato de formación que hasta ahora mejor resultado viene dando, permitiendo en un plazo de 3/4 semanas situar al alumno en una dinámica de proyecto lo más cercana a la realidad, habiendo repasado conceptos de arquitectura medios y avanzados que forman parte del día a día de los proyectos de software; todo ello en un ambiente divertido y de aprendizaje continuo.</p>
<p>Intentaré en próximos artículos bajar de nivel de abstracción alguno de los puntos, intentando dar algo más de detalle de cómo enfocarlos a más bajo nivel.</p>
<p>Un saludo.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2011/09/18/metodologia-formacion-nuevos-profesionales-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jornadas NEOcom 2011</title>
		<link>http://www.miguelmatas.es/blog/2011/03/06/jornadas-neocom-2011/</link>
		<comments>http://www.miguelmatas.es/blog/2011/03/06/jornadas-neocom-2011/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 20:42:08 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Cursos]]></category>
		<category><![CDATA[Noticias Actualidad]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=628</guid>
		<description><![CDATA[Hola, Mañana día 7 de marzo participo en las Jornadas NEOcom en el Centro Politécnico Superior de Zaragoza. De 17 a 18h vamos a estar hablando de conceptos asociados Aplicaciones Distribuidas sobre Arquitecturas N-Capas y SOA; valorando entre otras cosas qué son, qué aportan y cómo las empresas pueden utilizar estas tecnologías en su beneficio. NEOcom 2011 [...]]]></description>
			<content:encoded><![CDATA[<p>Hola,</p>
<p>Mañana día 7 de marzo participo en las Jornadas NEOcom en el Centro Politécnico Superior de Zaragoza.</p>
<p>De 17 a 18h vamos a estar hablando de conceptos asociados Aplicaciones Distribuidas sobre Arquitecturas N-Capas y SOA; valorando entre otras cosas qué son, qué aportan y cómo las empresas pueden utilizar estas tecnologías en su beneficio.</p>
<p><a title="Jornadas NEOcom 2011 - Miguel Matas Blog" href="http://aatuz.cps.unizar.es/media/TripticoNeocom.pdf" target="_blank">NEOcom 2011</a></p>
<p>Un saludo.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2011/03/06/jornadas-neocom-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entornos de Servidores Virtualizados</title>
		<link>http://www.miguelmatas.es/blog/2010/02/23/entornos-de-servidores-virtualizados/</link>
		<comments>http://www.miguelmatas.es/blog/2010/02/23/entornos-de-servidores-virtualizados/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 14:04:10 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[Arquitectura]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=583</guid>
		<description><![CDATA[Desde hace unos años atrás los entornos virtualizados se abren camino y cada día se encuentran presentes con mayor frecuencia en el mundo del desarrollo de aplicaciones. La virtualización presenta una mejora principal que es el ahorro de costes asociado a la compra de servidores. Ya no va a ser necesario comprar n máquinas encargadas [...]]]></description>
			<content:encoded><![CDATA[<p>Desde hace unos años atrás los entornos virtualizados se abren camino y cada día se encuentran presentes con mayor frecuencia en el mundo del desarrollo de aplicaciones.</p>
<p>La virtualización presenta una mejora principal que es el ahorro de costes asociado a la compra de servidores. Ya no va a ser necesario comprar n máquinas encargadas de soportar servidores web, servidores de base de datos, servidores de ficheros, correo electrónico. Cada máquina viene a representar un coste en Hardware más que significativo. Con la virtualización es posible disponer de un único soporte hardware que albergue n servidores virtualizados a nivel de software y que puedan dar soporte a las necesidades de la organización. Es mucho más económico adquirir uno o dos servidores para la virtualización, donde albergar n máquinas virtuales, que n servidores físicos.</p>
<p>Otra de las mejoras presentes con la virtualización es la escabilidad, la portabilidad y el control. Desde nuestros servidores de entornos virtualizados se puede gestionar de forma centralizada qué máquinas virtuales están activas en un momento dado así como el consumo de memoria ram y de disco de cada una de ellas. Esto nos permite tomar decisiones, y poder en un momento dado apagar una de las máquinas virtuales que no esté en uso para liberar recursos del servidor de virtualización. El despliegue de nuevos entornos virtualizados se torna también más sencillo, una vez disponemos de una máquina virtual modelo, podemos realizar réplicas para los diferentes entornos y/o proyectos, que queden expuestas a los desarrolladores una vez se han publicado en el servidor de virtualización pertinente. Respecto a la escalabilidad, las máquinas virtuales puede ser configuradas de forma dinámica con un tamaño de disco y memoria determinados, que puede variar en el tiempo, por lo que a mayores recursos necesarios para la máquina virtual, vamos a poder escalarlos mediante configuración (siempre que la máquina física disponga de los medios necesarios, claro).</p>
<p>Es común el uso de entornos virtualizados para dar soporte al desarrollo de aplicaciones, como por ejemplo para crear un entorno de desarrollo donde participen diferentes entidades como servidores de aplicaciones y de base de datos. También es fácil encontrar que incluso se utilice esta práctica para entornos pre-productivos.</p>
<p>Respecto a las pegas de estos sistemas, la principal problemática asociada es la del rendimiento, de ahí que se descarte el uso de la virtualización en muchos casos en entornos de producción, donde la velocidad de respuesta en muchos casos puede resultar crítica.</p>
<p>En el mercado podemos encontrar dos productos principales que ofrecen soporte respecto a la virtualización: <a title="VMWare - Entornos Virtualizados" href="http://www.vmware.com" target="_blank">VMWare</a> y <a title="Virtual PC - Entornos Virtualizados" href="http://en.wikipedia.org/wiki/Windows_Virtual_PC" target="_blank">Virtual PC </a>de Microsoft.</p>
<p>Saludos.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2010/02/23/entornos-de-servidores-virtualizados/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Entorno Desarrollo AgilePoint</title>
		<link>http://www.miguelmatas.es/blog/2010/02/06/entorno-desarrollo-agilepoint/</link>
		<comments>http://www.miguelmatas.es/blog/2010/02/06/entorno-desarrollo-agilepoint/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 11:56:38 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[AgilePoint]]></category>
		<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Team Foundation Server]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=576</guid>
		<description><![CDATA[A continuación un simple ejemplo de lo que podría ser un entorno de desarrollo para N desarrolladores trabajando conjuntamente en el desarrollo de un aplicativo sobre AgilePoint BPM, y con la gestión de código fuente de la aplicación mediante Team Foundation Server. El entorno del desarrollador que podría distribuirse facilmente mediante máquinas virtuales, cuenta con [...]]]></description>
			<content:encoded><![CDATA[<p>A continuación un simple ejemplo de lo que podría ser un entorno de desarrollo para N desarrolladores trabajando conjuntamente en el desarrollo de un aplicativo sobre AgilePoint BPM, y con la gestión de código fuente de la aplicación mediante Team Foundation Server.</p>
<p><a href="http://www.miguelmatas.es/blog/wp-content/uploads/2010/01/EntornoDesarrolloAgilePoint.jpg"><img class="alignnone size-thumbnail wp-image-577" title="EntornoDesarrolloAgilePoint" src="http://www.miguelmatas.es/blog/wp-content/uploads/2010/01/EntornoDesarrolloAgilePoint-150x150.jpg" alt="EntornoDesarrolloAgilePoint" width="150" height="150" /></a></p>
<p>El entorno del desarrollador que podría distribuirse facilmente mediante máquinas virtuales, cuenta con todo lo necesario para la construcción. Visual Studio 2008 SP1 + Framework 3.5 SP1 para trabajar con las últimas versiones estables y consolidadas en el mercado de tecnología .NET. En el caso de estar trabajando en el desarrollo de aplicaciones web, un IIS local donde desplegar las aplicaciones web y hacer las pertinentes pruebas de desarrollo y debugs. A Visual Studio se le incorpora el plugin AgilePoint Developer para el desarrollo a medida de nuevos AgileWorks, AgileParts y AgileConnectors. Finalmente se cuenta con la disponibilidad de Microsoft Visio 2007 más el plugin AgilePoint Envision, para el desarrollo en local de las plantillas (flujos de trabajo) de AgilePoint.</p>
<p>En el repositorio central se almacena todo el código fuente generado por los desarrolladores mediante el uso de Team Foundation Server, que garantiza la trazabilidad del código, gestión de versiones, etc; además de poder convertirse en una herramienta de gestión y control centralizado del trabajo asociado al desarrollador. Asignación de trabajo mediante el uso de Work Items, y el control de los bugs existentes en la aplicación son algunas de sus capacidades. Al mismo tiempo, mientras el uso de Sharepoint, permite crear fácilmente portales asociados a cada uno de los proyectos en desarrollo, donde el equipo de construcción puede compartir documentación de forma centralizada y todo tipo de información de gestión o técnica asociada a cada uno de los proyectos. Debemos tener en cuenta que este entorno deberá mantener también el control de versiones asociado a las plantillas de Visio que se vayan generando mediante NVision.</p>
<p>El entorno de desarrollo de Agilepoint, que centraliza tanto el AgilePoint Server, la gestión web del mismo a través del Enterprise Manager, y el interfaz de servicios web que permite gestionar de forma remota y transparente el acceso a las facilidades que provee el motor de Agilepoint.</p>
<p>Finalmente se expone un último entorno, representativo de cada tipo de aplicación, que no hace más que definir la posible existencia de un tercer entorno de integración, necesario para el desarrollo de la aplicación, como otros servicios de comunicación u otros aplicativos existentes en el sistema sobre los que nuestra aplicación en desarrollo deba integrarse.</p>
<p>Un saludo.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2010/02/06/entorno-desarrollo-agilepoint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El dilema del tornillo, el clavo, el martillo y el destornillador</title>
		<link>http://www.miguelmatas.es/blog/2009/11/12/el-dilema-del-tornillo-el-clavo-el-martillo-y-el-destornillador/</link>
		<comments>http://www.miguelmatas.es/blog/2009/11/12/el-dilema-del-tornillo-el-clavo-el-martillo-y-el-destornillador/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 21:13:33 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[Arquitectura]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=564</guid>
		<description><![CDATA[Y es que en más ocasiones de las que nos gustaría, en el mundo del software nos encontramos con situaciones que responden comunmente al siguiente símil. Juan tiene un clavo y Pedro un destornillador. Juntos, quieren conseguir clavar el clavo en una tabla. Alberto, un amigo de ambos, tiene un martillo y también sabe usar [...]]]></description>
			<content:encoded><![CDATA[<p>Y es que en más ocasiones de las que nos gustaría, en el mundo del software nos encontramos con situaciones que responden comunmente al siguiente símil.</p>
<p>Juan tiene un clavo y Pedro un destornillador. Juntos, quieren conseguir clavar el clavo en una tabla. Alberto, un amigo de ambos, tiene un martillo y también sabe usar el destornillador.</p>
<p>Antes de comenzar el trabajo Juan y Pedro se reunen; y tras descartar el pedirle el martillo a Alberto, por motivos que desconocemos, deciden clavar el clavo en la tabla con el destornillador.</p>
<p>Alberto, que participa como observador en la reunión, analiza la situación y transmite a Juan y Pedro sus conclusiones:</p>
<ul>
<li>Si intentan clavar el clavo con el destornillador, puede que al final lo claven, ahora bien, al no ser la herramienta más adecuada, van a necesitar invertir muchos recursos para conseguirlo, ya que van a enfrentarse a innumerables problemas.</li>
<li>Si lo clavan, seguramente o quede el clavo torcido, o acaben rompiendo el destornillador.</li>
<li>Si saben que yo tengo un martillo, y que sé clavar clavos con él, ¿por qué no me lo piden?</li>
</ul>
<p>A partir de aquí aparecen las tres vertientes de la historia:</p>
<ol>
<li>Juan y Pedro le piden el martillo a Alberto. El clavo se clava y todos son felices. (Esta no suele ocurrir).</li>
<li>Juan y Pedro proceden con su idea inicial. Un año más tarde de lo previsto la mitad del clavo y torcido está casi clavado en la tabla. El destornillador ya no sirve. (Esta os sonará más).</li>
<li>Juan, Pedro y Alberto siguen la reunión hablando de más alternativas, de las expectativas y necesidades de cada uno. Finalmente, caen en la cuenta que a Juan no le importa quitar algo de la superficie de su clavo (donde debería golpear el martillo), ya que la final lo que quiere es clavar el clavo y eso no le afecta a su objetivo. Curiosamente el hueco que dejan en la superficie del clavo es el suficiente para que encaje el destornillador y conseguir así, sin apenas esfuerzos extra respecto al martillo, clavar el nuevo tornillo, salido tras manipular el clavo, con el destornillador. (Esta tampoco suele ocurrir).</li>
</ol>
<p>Para los menos imaginativos o exhaustos tras una dura jornada de trabajo, una pista: la historia la ha escrito Alberto.</p>
<p>Un saludo.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2009/11/12/el-dilema-del-tornillo-el-clavo-el-martillo-y-el-destornillador/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enterprise Library: Data Access Application Block</title>
		<link>http://www.miguelmatas.es/blog/2009/09/09/enterprise-library-data-access-application-block/</link>
		<comments>http://www.miguelmatas.es/blog/2009/09/09/enterprise-library-data-access-application-block/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 19:36:24 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Enterprise Library]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=550</guid>
		<description><![CDATA[Y es que a la hora de acceder a una base de datos tenemos tantas opciones que muchas veces lo complicado es intentar decidir cuál de todas resulta la mejor para nuestro proyecto y/o organización. Trabajando con .NET los dos motores de base de datos más empleados son SQL Server y Oracle, y para acceder [...]]]></description>
			<content:encoded><![CDATA[<p>Y es que a la hora de acceder a una base de datos tenemos tantas opciones que muchas veces lo complicado es intentar decidir cuál de todas resulta la mejor para nuestro proyecto y/o organización.</p>
<p>Trabajando con .NET los dos motores de base de datos más empleados son SQL Server y Oracle, y para acceder a ellos desde una de nuestras aplicaciones podemos pasar desde utilizar los drivers propios de Microsoft para acceder a ambos gestores, con clases propuestas por el propio framework, podemos acceder a oracle a traves de los Oracle Data Access Components (ODAC) para .NET, podemos usar Datasets Tipados con sus correspondientes TableAdapter para aliviar algo el tiempo de construcción&#8230; utilizar patrones de acceso a datos como DAO+DTO&#8230; y un largo etcétera que puede pasar por soluciones caseras más o menos elaboradas, aplicaciones de otros patrones de acceso a datos como puede ser Active Record o herramientas de acceso a datos orientadas entidades como el nuevo Microsoft Entity Framework y la versión de Hibernate para .NET, NHibernate. Para más diversión, incluso pueden emplearse combinaciones de alguna de las herramientas descritas en el párrafo, intentando ajustar el esfuerzo de construcción a nuestro proyecto y, lo más complicado de todo, a nuestra planificación <img src='http://www.miguelmatas.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pues ante toda esta lista interminable de herramientas, cada una con sus pros y sus contras, añado y expongo a continuación las ventajas aportadas por otra más, las Enterprise Library con su funcionalidad de acceso a datos: Data Access Application Block.</p>
<p>¿Qué nos aporta el Data Access Application Block?</p>
<p>Pues una de las principales ventajas que aporta el framework es que permite con la misma codificación atacar a diferentes gestores de bases de datos, es decir, tras preparar el acceso a datos de nuestra aplicación con enterprise library, podríamos ser capaces sin cambiar ni una línea de código (no os toméis esto al pie de la letra, que seguro que algo habrá que cambiar aunque sea mínimo), de pasar de atacar a un SQL Server a un Oracle. Esta puede ser una gran ventaja si estáis preparando un producto al que dependiendo del cliente al que se lo vendáis tengáis que garantizar el soporte de ambos gestores, porque por ejemplo alguno de vuestros clientes esté casado con Oracle y otro con SQL Server. Con un sólo desarrollo de vuestra capa de acceso a datos cubriréis toda la casuística (menos los procedimientos almacenados, claro, que os va a tocar picarlos dos veces <img src='http://www.miguelmatas.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p>Otras ventajas a tener en cuenta son la facilidad de configuración. Una vez instaladas las enterprise library disponemos de una pequeña aplicación que apuntándola al Web.Config o App.Config de nuestro aplicativo permite editar las propiedades de conexión de manera visual. Pudiendo configurar el proveedor de la conexión, tipos de autenticación y más parámetros propios de una conexión a datos de forma muy cómoda y sencilla.</p>
<p>Una vez configurada la conexión, con una línea como la siguiente conectamos con el gestor, independientemente de cuál sea (DataBase y DataBaseFactory son clases del Data Access Application Block).</p>
<p><strong>Database nuestraDB = DatabaseFactory.CreateDatabase(&#8220;nombreConnectionString&#8221;);</strong></p>
<p>Para hacer una consulta que retorne un conjunto de registros a través de un procedimiento almacenado:</p>
<p><strong>DataReader ejemploDR = nuestraDB.ExecuteReader(CommandType.StoredProcedure, &#8220;spu_get_allitems&#8221;);</strong></p>
<p>Y para recorrer el datareader, pues como siempre, utilizando el método Read y luego en el registro sobre el que trabajamos obteniendo el dato a través del identificador de la columna.</p>
<p>Como véis es rápido y sencillo (no tanto para los que os toque trabajar contra Oracle, ya que os vais a necesitar conocer algún truquillo extra), y os ayuda a mantener una total independencia con el gestor de base de datos.</p>
<p>Bajo mi humilde opinión, Data Access Application Block podría ser un buen candidato a herramienta de acceso a datos corporativo en cuanto al desarrollo de soluciones .NET.</p>
<p>Saludos.</p>
<p>Miguel.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 158px; width: 1px; height: 1px;"><span style="font-family: Courier New; color: #008000;">DAB.Database dbTampico =<br />
DAB.DatabaseFactory.CreateDatabase(&#8220;cnTampico&#8221;);</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2009/09/09/enterprise-library-data-access-application-block/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Variables de Sesión en Memoria, Balanceos y Alta Disponibilidad</title>
		<link>http://www.miguelmatas.es/blog/2009/06/09/variables-de-sesion-en-memoria-balanceos-y-alta-disponibilidad/</link>
		<comments>http://www.miguelmatas.es/blog/2009/06/09/variables-de-sesion-en-memoria-balanceos-y-alta-disponibilidad/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 16:56:01 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=487</guid>
		<description><![CDATA[Una de las herramientas más comunes a la hora de trabajar con aplicaciones web son las variables de sesión. Dejando de lado en este capítulo las recomendaciones de arquitectura en el uso de las sesiones, simplemente plantear una solución a uno de los típicos problemas que se encuentran los arquitectos de software a la hora [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las herramientas más comunes a la hora de trabajar con aplicaciones web son las variables de sesión.</p>
<p>Dejando de lado en este capítulo las<a title="Recomendaciones de Arquitectura al Respecto del uso de Variables de Sesión" href="http://www.miguelmatas.es/blog/2009/06/02/consideraciones-arquitectura-respecto-variables-sesion/"> recomendaciones de arquitectura en el uso de las sesiones</a>, simplemente plantear una solución a uno de los típicos problemas que se encuentran los arquitectos de software a la hora de definir el uso de sesiones, que son las limitaciones al uso relacionadas a entornos donde se cuente con una infraestructura que ofrezca alta disponibilidad cuando estamos trabajando con variables de sesión almacenadas en la memoria del servidor.</p>
<p>Para solucionar este problema, existen productos disponibles en el mercado, que lo que hacen es mantener también balanceado el contenido de la sesión de todos los servidores existentes en una granja, por lo que, aunque un usuario a medida que va lanzando peticiones, el balanceador lo vaya dirigiendo a servidores diferentes, podrá seguir trabajando con la información de sesión que haya generado, en memoria, en un servidor diferente.</p>
<p>Os dejo el link a uno de los productos que solventa este problema en entornos .NET: NCache</p>
<p><a title="Variables de Sesión en Memoria, Balanceos y Alta Disponibilidad" href="http://www.alachisoft.com/ncache/">http://www.alachisoft.com/ncache/</a></p>
<p>Saludos.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2009/06/09/variables-de-sesion-en-memoria-balanceos-y-alta-disponibilidad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web, Colas de Mensajería y Experiencia de Usuario</title>
		<link>http://www.miguelmatas.es/blog/2009/06/03/web-colas-de-mensajeria-y-experiencia-de-usuario/</link>
		<comments>http://www.miguelmatas.es/blog/2009/06/03/web-colas-de-mensajeria-y-experiencia-de-usuario/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 18:34:14 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Colas de Mensajería]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=501</guid>
		<description><![CDATA[Estrenando en el blog el mundo de las Colas de Mensajería, y la categoría recién inaugurada a tal efecto, hoy vamos a hablar cómo se está explotando en la actualidad las capacidades que ofrecen estos sistemas en entornos web. A priori, y conociéndo únicamente las características básicas de funcionamiento de las aplicaciones cliente-servidor web y [...]]]></description>
			<content:encoded><![CDATA[<p>Estrenando en el blog el mundo de las <a title="Wikipedia - Message Queue" href="http://en.wikipedia.org/wiki/Message_queue">Colas de Mensajería</a>, y la <a title="Colas de Mensajería" href="http://www.miguelmatas.es/blog/category/colas-de-mensajeria/" target="_self">categoría </a>recién inaugurada a tal efecto, hoy vamos a hablar cómo se está explotando en la actualidad las capacidades que ofrecen estos sistemas en entornos web.</p>
<p>A priori, y conociéndo únicamente las características básicas de funcionamiento de las aplicaciones cliente-servidor web y los sistemas de colas de mensajería, resulta de extrañar que pueda sacarse algún tipo de partido combinándolas, ya que:</p>
<ul>
<li>La relación entre un cliente web y el servidor es síncrona y uni-direccional. El cliente solicita la comunicación con el servidor, quedando a la espera de respuesta antes de poder seguir el hilo de ejecución, de forma, insisto, totalmente síncrona.</li>
<li>En cambio un sistema de gestión de colas es en esencia asíncrono, ya que, a grandes rasgos, consiste en un punto de entrada que va almacenando peticiones en un determinado órden, y que garantiza que las peticiones van a llegar al destino, pero por defecto no garantiza cuándo. En cuanto la petición ha sido procesada, la respuesta se asocia a un punto de salida, el cual la aplicación llamante debe consultar para conocer el resultado del procesamiento.</li>
</ul>
<p>Entonces, si el trabajo en web es síncrono, y los sistemas de colas de mensajería asíncronos, ¿como podemos obtener algún tipo de beneficio? Paso a enumerar escenarios:</p>
<ol>
<li>Se debe realizar un cálculo que requiere de tiempos no manejables en entornos web de manera síncrona (más de 1 minuto se podría considerar como inmanejable).</li>
<li>La petición que se recibe en el servidor sólo es ejecutable en algunas ventanas de tiempo.</li>
<li>No es necesaria la notificación de ejecución completa al usuario una vez lanzado un proceso, por lo que podemos gestionar internamente cuándo lanzararemos el proceso demandando para optimizar así el consumo de cpu y memoria.</li>
</ol>
<p>Se pueden encontrar muchos ejemplos de estos usos por ejemplo en redes sociales como <a title="Facebook" href="http://www.facebook.com" target="_blank">Facebook</a>, donde en muchas ocasiones se proponen envíos masivos de notificaciones, invitaciones y noticias a un grupo muy grande de usuarios. Una vez realizada la petición, esta es encolada y ejecutada a posteriori.El usuario no tiene necesidad de conocer a ciencia cierta que la petición se ha ejecutado en el momento, se conformo en saber que los avisos, llegarán. Lo mismo ocurre con otros sistemas muy habituales como son los envíos de SMS a través de teléfono móvil.</p>
<p>La ventaja y moraleja del artículo respecto a todo esto, es que el uso sistemas basados en colas de mensajería ayudan a maximizar la experiencia de usuario en entornos web, ya que tras una petición que podría resultar en una larga espera síncrona hasta que el servidor haya terminado de ejecutar la petición, esta termina al momento (desde el punto de vista del usuario), y el usuario puede seguir utilizando la aplicación sin problemas. Mientras tanto, por detrás, el gestor de mensajes ha encolado la petición, la cual, en su momento, será ejecutada.</p>
<p>Si vuestro escenario es similar al aquí planteado, emplear una solución basada en sistemas de colas de mensajería, podría ser una buena solución de arquitectura.</p>
<p>Saludos.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2009/06/03/web-colas-de-mensajeria-y-experiencia-de-usuario/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consideraciones de Arquitectura respecto al uso de Variables de Sesión</title>
		<link>http://www.miguelmatas.es/blog/2009/06/02/consideraciones-arquitectura-respecto-variables-sesion/</link>
		<comments>http://www.miguelmatas.es/blog/2009/06/02/consideraciones-arquitectura-respecto-variables-sesion/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 17:47:06 +0000</pubDate>
		<dc:creator>Miguel</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.miguelmatas.es/blog/?p=490</guid>
		<description><![CDATA[A continuación paso a enumera una serie de consideraciones a tener en cuenta y que os pueden ser útiles a la hora de tomar ciertas decisiones de arquitectura al respecto del uso de variables de sesión. Como veréis algunas de ellas tienen que ver con entornos .NET, ya que es la plataforma con la que [...]]]></description>
			<content:encoded><![CDATA[<p>A continuación paso a enumera una serie de consideraciones a tener en cuenta y que os pueden ser útiles a la hora de tomar ciertas decisiones de arquitectura al respecto del uso de variables de sesión. Como veréis algunas de ellas tienen que ver con entornos .NET, ya que es la plataforma con la que suelo trabajar, pero la mayoría son aplicables a otros entornos tecnológicos no Microsoft.</p>
<p><strong>Sesión en Memoria vs Sesión en Sistemas Persistidos (Base de Datos o Servicios del Sistema Operativo)<br />
</strong></p>
<p>La forma más eficiente de trabajar con sesiones es manteniendo su contenido en memoria. En el caso de estar trabajando con una granja de servidores, pueden utilizarse soluciones existentes en el mercado como es <a title="NCache" href="http://www.alachisoft.com/ncache/" target="_blank">NCache</a>, para balancear el contenido de las sesiones en memoria entre todos los servidores de la granja.</p>
<p>En caso de no poder barajar esta alternativa existen soluciones que permiten almacenar el contenido de la sesión sobre sistemas persistidos. Esta solución es más lenta, pero permite compartir la información de sesión sobre diferentes servidores, además de garantizar que aunque se reinicie el servidor de aplicaciones, la información de sesión va a permanecer disponible cuando la aplicación vuelva a arrancarse.</p>
<p><strong>Cantidad de Memoria en Uso</strong></p>
<p>El uso de sesión afecta directamente al consumo de memoria del servidor que está ejecutando las llamadas del cliente, por lo que deberá almacenarse en sesión únicamente la información que se considera imprescindible y que, se recomienda, esté relacionada con alguna de las siguientes características:</p>
<ul>
<li>Información básica relacionada con la autenticación o la seguridad del usuario y que es necesario comprobar en las llamadas o peticiones que realiza el usuario contra la aplicación.</li>
<li> Otro tipo de información funcional asociada al usuario, que va a permanecer estática a lo largo de toda la vida de la sesión y que es requerida de forma constante en las peticiones que realiza el usuario a la aplicación. El objetivo de este punto sería minimizar el número de llamadas a base de datos.</li>
</ul>
<p><strong>Tipos de Objetos en Memoria</strong></p>
<p>Los objetos almacenados en la sesión deben ser en todo caso de poco peso, minimizando así la cantidad de información almacenada por sesión por cada objeto. Se recomienda el uso de objetos de negocio que incluyan tipos de datos básicos. No se recomienda el almacenamiento de objetos propietarios de .NET del tipo Dataset ó DataTable debido al tamaño asociado a los mismos.</p>
<p><strong>Manejando Información Sensible</strong></p>
<p>Si el contenido almacenado en la sesión contiene información sensible, como podrían ser contraseñas o información personal del usuario activo, ésta deberá permanecer encriptada durante todo el ciclo de vida de la sesión.</p>
<p><strong>Usando Sesión a modo de Caché</strong></p>
<p>No debe emplearse la sesión para almacenar catálogos de datos comunes de la aplicación, como podrían ser listados de países, regiones, provincias, etc, ya que éste no es el objetivo de  este tipo de objeto. Para estos casos se deberá recurrir a un objeto de tipo caché.</p>
<p><strong>Usando Sesión a modo de Viewstate (específico .NET)</strong></p>
<p>No se recomienda emplear la sesión para almacenar información que será necesaria explotar entre llamadas a la misma página, ya que para ello existe un objeto preparado específicamente para resolver esta problemática como es el Viewstate de ASP.NET.</p>
<p><strong>Usando Sesión a modo de POST y GET </strong></p>
<p>No debe emplearse la sesión para transportar información entre páginas de la misma aplicación, ya que para ello se deberá recurrir a los objetos POST y GET.</p>
<p><strong>Liberando Información de Sesión</strong></p>
<p>Siempre y cuando se detecte que la información almacenada en sesión deje de ser necesaria para la sesión de usuario actual, se debe solicitar la liberación de la memoria asociada al servidor.</p>
<p>Saludos.</p>
<p>Miguel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miguelmatas.es/blog/2009/06/02/consideraciones-arquitectura-respecto-variables-sesion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

