Welcome to Comunidad .NET de Cd. Juárez Sign in | Join | Help

February 2006 - Posts

¿Confundido con la Orientación a Servicios?

Si alguna vez han intentado definir o explicarle a alguien qué es Orientación a Servicios (SO, Service Orientation), y se dan cuenta que trataron un montón de temas, sin llegar a algo concreto, no se preocupen, no son los únicos. Agarren a 5 expertos, métanlos en un cuarto y pregúntenles qué es y seguramente recibirán 5 respuestas distintas.

¿Por qué es tan difícil de definir?
  • Se ha hablado, escrito y hasta podcasteado demasiado sobre el tema—espero que este artículo no sea otro del montón.
  • Es un tema aún nuevo en la conciencia colectiva de los desarrolladores así que, en realidad, aún no hay una definición universalmente aceptada.
  • Hubo demasiado marketing de productos para un concepto que es abstracto. Esto llevó a muchas personas a la conclusión de que SO==SOA==Web Services, al grado que hasta los gurúes de pronto hablan indistintamente de esas 3 “cosas” y no sabe uno dónde quedó la bolita.
¿Qué problemas resuelve?
  • SO(A) promete aliviar muchos problemas de re-uso, integración y comunicación para los sistemas disgregados y sistemas distribuidos.
  • Permite la <buzzword>interoperabilidad</buzzword>: la capacidad de que sistemas en distintas plataformas, que funcionan con distintas tecnologías interactúen felizmente.
¿Qué NO es SO?
Quizá Rich Turner tenga razón, y la manera más sencilla de aclarar la confusión y de explicar qué es SO, es desmentir algunas ideas sobre lo que NO es SO. En otra entrada les detallaré más sobre las características que debe cumplir “algo” orientado a servicios. Por ahora veamos lo que no es.

SO != tecnología

SO en realidad no tiene nada que ver con tal o cual tecnología (.NET, J2EE, Web Services, etc.).

SO es una metáfora, una manera de representar—abstraer—las cosas, para ayudar a atacar un problema: la interacción en sistemas distribuidos. Es análogo a la Orientación a Objetos (OO), que es una manera de abstraer “cosas” de la vida real para modelarlas y poder formar un sistema.
Service orientation refers to a mindset that centers on the four SO tenets.” (Selly, Troelsen y Barnaby, p. 303)
“It is philosophy.” (Lhotka)

SO != una arquitectura per se, por lo tanto SO != SOA
“First, services are just a mechanism, a specific mechanism for allowing communication across standard Web protocols. As such, the best service-oriented architectures seem to come from good component-oriented architectures, meaning that the mere imposition of services does not an architecture make. Second, services are a useful but insufficient mechanism for interconnection among systems of systems.” (Booch) [Énfasis mía].
La SO por sí sola no lleva a producir un sistema completo. Aún no hay una metodología establecida, aunque afortunadamente ya se está trabajando en eso.

SO(A) ha sido promovida como la cura de todos los males: broncas en procesos de negocios, arquitectura a nivel enterprise y a nivel soluciones, y hasta arquitectura de aplicaciones. Y es ahí el meollo de la confusión. Vean la figura 1 y figura 2 en el artículo de Zimmermann, Krogdahl, y Gee.
“Service Oriented Architecture [vs. SO] is more specific in that it refers to the activity of developing an architecture or can be used to describe an existing architecture. When the service notion first appeared within the developer world, it was commonly referred to as SOA. The problem with the SOA term, however, is that it implies that service orientation is simply an architectural approach.” (Selly, Troelsen y Barnaby, p. 303)

SO != OO

Esto pudiera parecer obvio, pero algunas personas piensan que SO es un “paradigma-moda-arquitectura” que pretende sustituir a la OO. Esto es incorrecto. Son “cosas” que se complementan, ya que, aunque hay traslape, atacan problemas distintos.

Específicamente, el principio en SO de que “las fronteras son explícitas” es importantísimo, ya que rompe de una manera fundamental con OO, que asume que todo es local y stateful (que retiene su estado). Esto puede parecer trivial, pero fue donde la puerca torció el rabo.

¿Recuerdan COM+/DCOM, o RMI? Estos fueron intentos de aplicar OO a sistemas distribuidos, pero al intentar esto el primer tope fue con el costo de la comunicación de las partes, lo cual llevó a los “objetos” stateless (sin estado). El clásico querer cuadrar un círculo. ¿Ven por qué SO se ve chida?
OO analysis is a very powerful and proven approach, and as such, SOAD should make use of OO analysis techniques as much as possible. To successfully apply OO analysis to SOA projects, you must examine more than one system at a time. Use case models will continue to play an important role. However, SOAD must be predominantly process, rather than use-case driven.” (Zimmermann, Krogdahl, y Gee.)

SO != Web Services / WSE
Web Services es una implementación de orientación a servicios, un ejemplo concreto. Web Services no es SO.

Las Web Service Extensions son extensiones que Microsoft agregó al .NET Framework para cumplir con las especificaciones WS-I y permitir que su implementación de Web Services interoperara.

SO != RPC / .NET Remoting
Parte del punto anterior es que cuando se comenzaron a popularizar los Web Services, muchas personas—incluyéndome—interpretaron Web Services == XML RPC sobre HTTP, y comenzaron a implementarlos bajo ese modelo.

Eso llevó al embarradero erróneo de que SO tenía que ver con COM+/DCOM/Enterprise Services o hasta con Remoting. Aparte de que en dado caso estas serían implementaciones de SO, no cumplen pero para nada con la interoperabilidad, ya están casadotas con las tecnologías de Microsoft.

SO != Algo nuevo
Rocky Lhotka, y Gary Booch, han sido de los que se han quejado de esto. Cierto, SO definitivamente no es algo nuevo, solo pareció así por la popularidad de los Web Services. Sin embargo,
“One of the many complaints we often hear regarding SO/A is that it offers nothing that sophisticated and successful distributed implementations aren’t already doing. To which we say: ‘That’s the point’. We've all learned many hard lessons over the past few years by watching distributed applications deliver disappointing results or completely fail. The primary goal of SO/A is to take those lessons to heart and document the characteristics of the most successful distributed systems. The hope is that this information will help future developers avoid the same mistakes that crippled many early attempts at building distributed applications.” (Selly, Troelsen y Barnaby, pp. 300-301)

¿Aún confundidos?
No se agüiten, como dijo Edward R. Murrow: “Cualquiera que no esté confundido no entiende realmente la situación”.

¿Las 10 mejores razones para cambiar a Windows Vista?

Hablando de Windows Vista, hoy pusieron en Slashdot un artículo mencionando las "Top 10 razones para comprar Windows Vista".

La verdad es que, como desarrollador, lo único que me interesa en estos momentos es el nuevo API, WinFX, que será el sujeto de una serie de posts dentro de poco. El artículo en Yahoo! está más enfocado al consumidor, y para ser honestos, no me convence. He aquí por qué:

1. Seguridad
Ya tengo un firewall en mi ruteador y otro en mi instalación de Windows. Sigo a lo más que se pueda las prácticas de seguridad (cuidar attachments, tener los menos servicios corriendo, etcétera). User Account Protection suena interesante, pero siendo que soy el único que utiliza mi PC y la mayor parte del tiempo sé lo que estoy haciendo, no me es muy relevante. Next.

2. Internet Explorer 7
No creo que haya un solo feature que Firefox no maneje ya, hoy, a través de extensiones, incluyendo el mini-preview de las pestañas (tabs pues).

3. Eye Candy
Innecesario para muchas cosas. Además, tengo los mismos efectos ya puestos en mi máquina con mi suscripción anual de Stardock, y programas como WindowBlinds, WindowsFX e IconPackager. ¡Y swing! Strike 3.

4. Desktop Search
Ya lo tengo hoy en día con MSN Search Toolbar, que tiene aún mejor integración a mi manera de trabajar que el Google Desktop--luego hablamos de porqué lo prefiero. Siguiente.

5. Mejores actualizaciones
Windows Update en mi máquina jala perfectamente bien, y de hecho me gusta el poder forzar las actualizaciones por IE cuando se me dé la gana.

6. Más media
Traducción personal: Más DRM y más integración de Windows Media Player, que suckea tiempo grande y no juega con mi iPod. No gracias. Soy feliz con iTunes y QuickTime, o de jodido Winamp. Ya tengo en qué administrar mis fotos (Picassa). Así que a menos de que sus aplicaciones sean tan buenas como las de Apple en la Mac, no las necesito.

7. Controles para padres de familia
Lo único que suena interesante es eso de poder impedir que se usen cuentas en horarios determinados, para que mis sobrinas no usen la computadora sin supervisión cuando mi hermana está en el trabajo... esperen... creo que eso ya se puede hacer con poledit.

8. Mejores respaldos.
Los hombres machotes no respaldamos, nuestra máquina nunca falla. Err, bueno, una vez al año por aquello de que el Partition Magic te haga una graciosada y te madree la partición con tus documentos. Pero para eso utilizo el backup que trae XP actualmente y nunca me ha quedado mal.

9. Colaboración Peer-To-Peer
Esto me suena a un NetMeeting++ usando Windows Communication Foundation (parte de WinFX). Podría ser interesante. Habrá que verlo.

10. Instalación rápida.
Urge, pero aún no está implementado, así que habrá que ver si se materializa.

Tendré que esperar un poco más para ver Vista

Hoy me ganó el lado venturoso y decidí intentar instalar el beta más nuevo de Windows Vista en la PC de mi casa, solo para echarle un ojo en persona y ver qué cosillas adicionales se necesitarían para aplicaciones hechas con WinFX.

No tengo un maquinón, pero pensé que mi máquina está decente (Athlon 64 3200+ con 1Gb de RAM, 2 discos de 250Gb, MOBO Biostar con tarjeta integrada NVidia GE Force 6100). Así que bajé el “Windows Vista December 2005 CTP (x64)” (2 y feria gigas), formateé una partición de 150Gb que en estos momentos no estoy usando y me dispuse a hacer una instalación dual-boot con XP SP2 (lo que uso actualmente, día a día) y otra con Vista. Quemé el DVD, y arranqué con el disco de instalación.

Primero, olvidé anotar el número de serie. Chin. A bootear XP y entrar al sitio de MSDN otra vez para anotarlo. Inserto disco de instalación. Reboot.

* Incia la máquina … *
Windows codename LONGHORN…
— (yeah!)

* Inicia el proceso de instalación en modo gráfico con el look Aero *
—¿Y las pantallitas azules de texto?¿Ya no tengo que dar F8? Sniff...
—¿En qué partición quieres que lo instale?
—Ah, pos échatela en esta que le aparté.

* Comienza la segunda fase de instalador *
—Computer will restart after installation
—Chido.

15 segundos después…
* Se reinicia la máquina. *
—Ah chis, ¿ya tan pronto? Eh, a lo mejor va a continuar la instalación...

BOOTMGR Not found
Press CTRL+ALT+DEL to restart

—WTF?!! Eh, igual y algo se trabó.

* Kamikaze intenta de nuevo. Comienza instalador, comienza segunda fase, misma cosa. *
—Mmmta. Ni pex.

* Kamikaze saca disco de instalación de Windows Vista. Ctrl+Alt+Del… *

BOOTMGR Not found
Press CTRL+ALT+DEL to restart

—@#$%!!! (maldición) ¡Se madreó mi boot manager!

En efecto. A sacar disco de WinXP y pasar la siguiente hora reparando la instalación, porque como todo buen ingeniero en sistemas, no hice un emergency repair disk. En casa de herrero, cuchillo de palo.

No modo. Así sucede con los betas.

Libros para principiantes y no tan principiantes

Ayer me comentó Teo Ortega que va a tener que portear una aplicación “cliente/servidor” hecha en Delphi a .NET. Al parecer aunque esta aplicación era adecuada (de hecho consume Web Services de una aplicación hecha en ASP.NET), algunas limitantes en la conectividad y flexibilidad del sistema han forzado al cambio de plataforma.

Como el Teo apenas va a comenzar a dotnetear, pues la inevitable pregunta fue “Oye, ¿y no tienes algún libro que me ayude en este rollo?”

Creo que todos hemos estado ahí. Así que le envié una larga lista de libros que me han sido útiles desde que comencé con este rollo y pensé que les podrían ser útiles a ustedes también—de hecho sí me cayó el veinte de “ay we’, ¿de veras he leído todo esto?”

La mayoría de estos libros los pueden leer en línea en sitios como books24x7. En la empresa donde trabajo tenemos un acuerdo corporativo, así que todos los empleados tenemos acceso. Otra alternativa podría ser Safari. En lo personal, prefiero libros en formato arbol-muerto, pero (1) leo más rápido en línea—por alguna extraña razón—y (2) no tengo tanta lana como para comprar todos los libros en sitios como estos. Así que hagan lo que puedan. Si deciden comprarlos en papel, este sitio es útil para encontrar el mejor precio.

En general, los mejorcitos que he encontrado son de Apress—a donde acabaron muchos autores que dimitieron de Wrox Press—y de ahí, los publicados por Microsoft. Aunque todo depende de qué tema se quiera aprender.

Así que aquí está la lista, separada por contextos generales.

Fundamentos
Mucha raza que me he topado ha aprendido a dotnetear a punta de voluntad, pero desgraciadamente les falta comprender conceptos fundamentales del .NET como plataforma. Para ellos recomendaría Microsoft .NET Core Requirements (Microsoft Press, 2003). Este es un paquete de 4 libros que son para preparase para una certificación MCAD o MSCD (versión 1.x del Framework).

Lo bueno:
  • Trae todos los ejemplos en los dos lenguajes más populares (C# y VB.NET)
  • Cubre todo lo mínimo elemental que debe saber un desarrollador a la hora de dotnetear (y uno que otro truquito que nomás MS se sabe).
  • Cubre material para los diferentes tipos de aplicaciones que se pueden crear (WinForms, Web, Windows Services, Web Services)
Lo malo:
  • Para en verdad sacarle jugo hay que chutarse al menos 3 de ellos—el cuarto es completamente teórico y trata sobre MSF y metodologías y herramientas para desarrollar software—esto es porque fueron escritos por distintas personas en MS, así que hay bastante redundancia y no son uniformes.
  • Algunas cosas decididamente están fechadas. Por ejemplo, al hablar de armazones de pruebas, habla de construir los propios con escripts, siendo que NUnit lo suplantó por de facto; no hay ni mención de las especificaciones WS-I para Web Services, etc.
Aún así lo recomiendo porque varios capítulos, por separado son muy buenos y concisos, p.ej. el de Developing Windows-based Applications explica muy bien conceptos de los lenguajes como overloading, interfaces, delegates, etc., el de Developing XML Web Services and Server Components trae una excelente explicación de qué es el .NET Framework, cuáles son sus “partes” cual es el papel de cada una de ellas y qué features son los que aporta.

Ahora que si van a comenzar en aplicaciones Web con el Framework 2.0 Pro ASP.NET 2.0 in C# 2005 (Apress, 2005) se ve muy bueno. Cubre desde lo fundamental, hasta lo “Pro”.

Más avanzadones
Si buscan un buen Framework para objetos de negocio, están los libros del Rocky Lhotka, en su versión C# o VB.NET. Yo me esperaría un poco y compraría la edición que va a salir en los próximos meses ya que (1) está hecha para el Framework 2.0 y (2) integra muchos features que le fue agregando al CSLA basado en retroalimentación de sus lectores y basado en capacidades nuevas en las herramientas.

Como lo mencioné ayer, Expert ASP.NET 2.0 Advanced Application Design: ASP.NET as a distributed application hosting environment (Apress, 2005) es un excelente libro para hacer la arquitectura de un sistema con tecnologías dotnetescas.

No-.NET, pero relacionados
Si no saben UML, aprendan ¡ya!—tiene ya como 10 años por el amor de Dios. Uno de mis favoritos es UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition de Martin Fowler. Este vato propone utilizar UML como una herramienta útil para bosquejar un sistema.

Para una sólida base de diseño de bases de datos relacionales especialmente relacionados a programación orientada a objetos, lean Beginning Relational Data Modeling, Second Edition (Apress, 2005). De haber leído este librito antes, hubiera evitado algunos errores en el diseño a la hora de implementar relaciones superclase/subclase en una aplicación que esos errorcillos acabaron dando enormes dolores de cabeza.

Finalmente, y hablando de base de datos y orientación a objetos, está Information Modeling and Relational Databases: From Conceptual Analysis to Logical Design (Morgan Kaufmann Publishers, 2001) de Terry Halpin, que cubre ORM—no Object-Relational Mapping, sin Object-Role Modeling—una metodología muy sencilla y muy útil para modelar los requerimientos de un sistema y automáticamente generar el diseño lógico y físico de una base de datos, incluyendo muchas de las “reglas de negocio en un sistema”. Incluso enfatiza el porqué UML es una muy mala metodología para hacer un modelo de datos. Los detalles de cómo aplicar ORM con Visio lo cubre también muy bien en este otro libro. ORM es, en mi humilde opinión, una de las herramientas más utiles y menos utilizadas.

Enjoy.

ASP.NET para hombres

Disclaimer #1: Aunque vaya a parecer comercial, no tengo nada que ver con los autores del libro o con la editorial. Simplemente me cayó tan bien el libro que tuve que escribir sobre él.

Disclaimer #2: No estoy siendo sexista. Al decir “para hombres” es en el sentido “vs. niños, amateurs, principiantes”, no “vs. mujeres”. Las mujeres son la neta.

Disclaimer #3: Este post está intencionalmente “pocho”. Hay cosas en jerga computacional y citas textuales que francamente me da flojera traducir.

Yo soy extremadamente codo para comprar libros técnicos. La verdad es que si voy a pagar 60 dólares por un pedazo de árbol muerto con letritas, más vale que las letritas sean muy buenas, ya que la herramientas cambian tan rápido que la vida útil de un libro técnico es de solo un par de años, a lo mucho.

Aún recuerdo cuando me llegó mi copia de Professional VB 5 Business Objects (Wrox Press, ¿1997?), por un tal Rockford Lhotka, que abogaba el uso de la arquitectura en capas y el uso de UML. Cuando años más tarde, en el trabajo comencé a hacer cosas dotneteras™ más en serio, sugerí la versión de .NET de su libro—recién sacadita de la imprenta si mal no recuerdo—para el proyecto y la adoptamos como el armazón de nuestra aplicación con bastante éxito. Esa es la clase de libros que te “dan de comer” por varios años y vale la pena comprar.

En esa misma categoría pues, he puesto a Expert ASP.NET 2.0 Advanced Application Design: ASP.NET as a distributed application hosting environment (Apress, 2005). Que si hubiera sido yo el autor, probablemente le habría puesto como título “ASP.NET para hombres”. En mi humilde opinión, este libro debería ser lectura requerida para cualquier desarrollador .NET profesional.

¿Por qué? Porque más que un libro más sobre ASP.NET es un libro sobre arquitectura de software aplicando herramientas que se llevan bien con el .NET. Y no solo es para aplicaciones Web o Web Services, el contenido aplica para casi cualquier tipo de aplicación que se necesite desarrollar con las herramientas que se tienen en este momento, y cómo se relaciona con las que están en puerta (como Windows Communication Foundation).
“And so in designing this book we decided that we did not want to do the standard ‘new feature march.’ This book is not a general introduction to version 2.0 of the ASP.NET Framework. Instead, this book focuses on designing distributed applications using the .NET Framework as your platform. With this as our focus, we treat ASP.NET not as an environment for the generation of HTML, but rather as an application hosting environment, one capable of servicing requests not just for Web Forms, but also for Web Services, for distributed objects via Remoting, even for your own custom application hosting needs. By treating ASP.NET as an application server instead of as a web application development environment, our field of view is dramatically increased.” (p. xix)
Y no es exageración. Después de leerlo sentí que mi arsenal de herramientas se había incrementado dramáticamente.

El libro comienza con algo de “teoría” básica sobre arquitectura donde me topé con algunas citas con las cuales estoy totalmente de acuerdo:
“You'll need to consider more than the business-based, functional requirements. When you're designing the architecture, functional requirements may be relevant, but they're usually secondary to other application requirements, which aren't captured in the ‘Use Cases.’” (p. 3)
[Traducción: la arquitectura de un sistema se saca de todas las “-abilidades” (mantenibilidad, ecalabilidad, etc.), no tanto de los requerimientos]
“The answer to any question when it comes to architecture is ‘it depends’. This is why you make the big bucks.” (p. 4)
[Refiriéndose a la importancia de la mantenibilidad y flexibilidad en los sistemas:]
“Checking a code file out of source control and having a developer make changes to it is the most expensive kind of change that can be made to a system. It requires a developer (not cheap). It requires the recompilation of binaries. It requires regression testing of all areas of the application that are affected by a change to that binary (testers, automation, and time: aka more money). And then it takes a deployment and all of the requisite worry, heartache, and long hours that can accompany that.” (p. 12)

Después de algunas arquitecturas de ejemplo, el libro pasa rápidamente a explicar el ASP.NET Execution Pipeline, en otras palabras, qué pasa desde que un request le llega a IIS hasta que la página es rendereada y todos los puntos de extensibilidad en el proceso.

Al principio me era un poco amenazante, pero gracias a la muy amena redacción que tiene, de-mistificó rápidamente cosas que para mi hasta ahora habían sido “magia” de ASP.NET. Conforme avanzas en la lectura comprendes perfectamente cómo Microsoft implementó muchos de los features de ASP.NET (Forms Authentication, el handler de Web Services, etcétera). Y una vez que se entiende eso, el modelo (en capítulos posteriores) para entender Web Services Extensions (WSE) y hasta WCF es esencialmente el mismo. Whoa.

Podría hacerles un resumen casi por capítulo de cosas que me gustaron en cada uno de ellos, pero para no hacer el cuento muy largo les voy a poner las cosas principales que aprendí o me gustaron de este libro:
  • Qué tecnologías están disponibles hoy, qué features proveen y cómo decidir cuándo usar cuál (a veces los features son ofrecidas por varias de las tecnologías) y cómo emplearlas de forma que provean una migración fácil a las tecnologías que están en puerta (como WCF).

  • Trae un destilado de las muchas definiciones que se han dado de Web Services y de Service Orientation y qué elementos tienen en común. La importancia de entender la diferencia entre SO y OOAD y cual es el papel de cada una de estas filosofías en un sistema distribuido (hint: tiene mucho que ver con la diferencia entre cosas stateful y stateless).

  • La tendencia de Microsoft hacia la programación “declarativa”, como alternativa a la “imperativa”—si alguna vez han utilizado atributos en sus clases o visto código XAML, de esto se trata la programación declarativa.

  • Ejemplos claros, completos, prácticos y concisos de cómo hacer (y no hacer) muchas cosas con el .NET Framework 1.x Aquí me topé con muchas situaciones por las que yo ya había pasado y aprendido a guamazos. (p.ej. qué se tiene que hacer para implementar Forms Authentication), y qué cambios hubo en 2.0 para facilitar esas cosas (p.ej. cómo usar el nuevo MembershipProvider, controles nuevos, etc.).

  • Capítulos detallados en algunas áreas que no se cubren muy bien en la documentación o en otros libros que he visto o leído:

  • Hay un capítulo enterito dedicado la clase Page: qué es lo que sucede a la hora de ejecución, cómo arma los controles, y qué prácticas seguir. Incluye una muy buena explicación en la página 95 de porqué NO es tan buena idea DataBindear un DataSet a un DataGrid—esencialmente acabas gastando 4X el tamaño original de los datos—y qué alternativas hay.

  • Otro capítulo dedicado exclusivamente a ViewState y JavaScript, incluyendo cosas AJAX-escas (Out-Of-Band Callbacks)

  • Una muy buena cobertura sobre Enterprise Services (COM+) en .NET. Aquí aprendí varias cosas que ni sabía que existían, incluyendo Queued Components—componentes que se ponen en una cola de ejecución y automáticamente tienen un proceso “escucha” y los procesa asíncronamente; cómo poder generar Web Services a partir de componentes configurados automáticamente y sin siquiera requerir de .NET
En fin, el libro cubre los temas con un detalle suficiente como para meterse en broncas, y entender el concepto de una manera concreta, pero te deja “picado” para buscar más detalles cuando se ofrezca en la vida real.

Les recomiendo que le den una hojeada al libro o lo compren en su tienda favorita, o si tienen acceso a algo como books24x7.com, ahí también lo tienen.