Archive for Septiembre, 2006

.NET The Java way

Scenario: R&D area in a small voice&data carrier. Being a telco, we consider ourselves a heavy UNIX (& Java) shop. We’ve developed many in-house tools and applications in unix, java and some script environments which work reliably and reasonably well. Actually, these systems are mission-critical components in our company’s revenue chain, and we’re quite happy with them.

In such a scenario, why would we want to try .NET in our next project – a web-based telco billing app?

Our new project constraints:

  • Short time-frame for development: Our current platform is causing lots of organizative problems and has many technical shortcomings, so we do have to get rid of it as soon as possible.
  • Our app should have a heavy, rich and responsive web-based ui. We have branch business offices over all the country, but only a central location with 24×7 support, disaster recovery facilities and a really good datacentre infrastructure, so going Web seems natural for us.
  • We’re a very small team (4 people).
  • Our app has to be very scalable.
  • Our app has to be easily maintainable. In the past the company invested a lot of time and money in tools which finally we weren’t able to maintain and extend. Thus, we emphasize in having a loosely-coupled well-defined architecture which doesn’t compromise current or future needs.
  • It is a critical app, but not a 24×7 app: if our app isn’t available during five minutes we don’t lose any income. That isn’t the case of many of our other in-house unix&java applications!

Having these constraints we could have gone the Java way, but what kind of Java way?

  • Traditional J2EE+Struts stack? No Way. We’re three people here, so we have no time to spend creating lots of XML, deployment descriptors, JSPs and all these dot-com-era artifacts. Also, we wanted to use a component-based UI development. Developing in such enviromnet would have been so 2000′ish…
  • New JEE 5? No way. When we started our project (June ‘06) it was simply not mature enough. Also, the tooling it has isn’t good enough for considering it real RAD. JPA is quite limited, too. In addition, while JSF is component-based, developing custom compound components for it is a real pain.
  • Alternative frameworks (Spring+Hibernate+Wicket/Tapestry/Echo2)? This was a good option. I really like Spring (not as MVC fr., tought) and Hibernate. In fact, sometimes when I suffer from VS2005’s instability, I wish I had choosen this path. But one of our constraints was that we had a short time to market,and these UI frameworks require heavy investment in development time to create the rich components we’d need. Had we have more time, I’d probably have choosen this path, in order to develop our custom rich ui components instead of buying them from 3rd parties (telerik rocks). It’s a pity there isn’t a market of commercial components for – at least – Tapestry or Wicket.

We could also have gone the scripting way, but… which one?

  • PHP5+PRADO (http://www.pradosoft.com): We have used this in some other (smaller) projects. Devel time is quite good, and the PRADO component-based framework allows following an easy development workflow for the UI. But what about the back’end? PHP ORM tools are very simple and I don’t like any of them. The one I’d like the most (EzPDO) has a ‘feature’ which makes me forget about using it: it uses custom tables for relationship, instead of trusting DB foreign keys. Then we tried code-generating a DAO layer. We achieved a good level with custom code-gen tools, but that wasn’t a real ORM. Right now, we don’t conceive developing our app without an ORM, so we finally had to discard PHP.
  • Ruby on Rails? Let me check… not component-based UI, not real ORM (ActiveRecord pattern is great but not real ORM)… scaffolding doens’t work with foreign keys and inheritance (our custom code-gen tool does)… discarded

So, we finally came up with a solution which – more or less – is what we’ve been looking for:

  • .NET Framework 2.0
  • ASP.NET
  • NHibernate (!!)
  • SQL Server 2005 (including Reporting Services)
  • Spring Framework.NET (!!!!!)
  • Telerik Component Suite (!!!!!!!!!!!!!!)
  • MSMQ (async processing)
  • Java-based custom code-gen tools

We’re really happy with this environment.

I don’t like traditional .NET architecture, it seems ackward if you’re coming from a Java background. But I really like ASP.NET’s component model. It’s easy to understand, and it’s very easy to develop components on it.

In addition, C# 2.0 is good enough. I preffer Java 1.5 (I hate having to declare methods virtual all the time), but C# 2.0 has really good generics support, and delegates are good too (I still preffer anonymous classes, but).

By using Spring.NET we’ve achieved a very loose coupling between layers. By using NHibernate, we’re coding against an object domain model and not against a relational model. We’ve also achieved 97% database independent code (still some SQL in a few modules). And we have a rich domain model which hasn’t any pollution (persistence code, forced inheritance).

By using Telerik Component suite, the person which develops the UI here has been able to create really good screens. Our app is very responsive and easy to work with.

By using SQL Server 2005 we get a quite good database. I don’t like the fact that it hasn’t deferrable constraints, but its partitioning feature is quite good. Also, analysis services and reporting services are a bonus we’re happily taking advantage of.

Finally, MSMQ is a good-enough easy-to-use JMS-alike message oriented middleware, which we use for async, deferred and/or scheduled processing. We’ve suffered from some annoying .NET generic collection serialization problems, but these have been solved easily, and in the future we’ll try to enlist SQL 2005 and MSMQ transactions in a global transaction to achieve almost-JTA reliability.

So, we’ve sold our soul to the devil. We’re Unix&Java guys who have gone the .NET way! I guess our app won’t scale the same as a Java solution would. Also, our app has been developed from scratch… it doesn’t need any integration to legacy datasources, two-phase commits, strange messaging integrations or connecting to foreign EIS’s. If it needed such features, going .NET would have been insane.

Persistencia de Objetos en .NET

Quien vea nuestros proyectos en .NET, enseguida adivinará que venimos de un fuerte “background” Java… En parte por el estilo de programación (contrato contra la interfaz siempre) pero sobre todo por los frameworks y patrones que usamos. Uno de ellos es un framework de ORM (Object-Relational-Mapping) llamado NHibernate, que es un port de la versión Java (Hibernate).

Un Framework de ORM es algo que suena a complicado cuando te lo explican, pero es brutalmente simple cuando ves un ejemplo:

Pongamos que yo tengo la tabla PERSONA (PERSONA_ID, NOMBRE) y la tabla DIRECCION ( DIRECCION_ID, PERSONA_ID, TEXTO_DIRECCION), con sus PKs correspondientes.

Con .NET, tradicionalmente me crearía DataSets, DataReaders, Commands y Connections para acceder a la base de datos. Sin embargo, con cualquier ORM de Java o .NET, lo que haría sería definirme las clases de las dos entidades, las mapearía con unos ficheros XML cada una a su tabla, y trabajaría únicamente con Objetos.

Las ventajas de esto son varias. Por un lado, el código de los objetos no depende de la capa de acceso a datos (NHibernate), por lo que tenemos menos acoplamiento. Por otro, no ensuciamos las distintas capas con cosas que no le conciernen (no devolvemos datasets a la capa de presentación, sino que devolvemos objetos — separation of concerns lo llaman los guiris).
Pensar en objetos que ya están relacionados estáticamente es mucho más sencillo que pensar en conjuntos de datos y tablas de base de datos cuyas relaciones se crean desde la misma consulta mediante joins. Esto se nota mucho cuando vas a hacer consultas con NHibernate. En NHibernate el lenguaje de consultas principal no es SQL (aunque se puede utilizar, con algunas restricciones), sino que es uno propio llamado HQL. El HQL es un SQL orientado a objetos… esto puede sonar raro, pero ahi va un un ejemplo:

“Obtener Todas las personas cuya dirección contiene la palabra ‘calle’ ”
SQL: SELECT p.* FROM PERSONA p, DIRECCION d WHERE p.PERSONA_ID=d.PERSONA_ID and d.TEXTO LIKE ‘%calle%’

HQL: from Persona p where p.Direccion.Texto like ‘%calle%’

En un ejemplo tan pequeño parece que son pocas las diferencias, pero imagina que el modelo de datos es mucho más extenso…

HQL: from Producto p where p.Catalogo.Temporada.Responsable.Edad<30

La versión SQL crecería y se haría enorme, mientras que la versión HQL se aprovecha de que las relaciones están bien definidas y son estáticas,permitiendo que sea mucho más sencilla,
Además, al usar HQL y ser éste un lenguaje de consultas genérico independiente del motor de BD que usemos ( luego NHibernate lo transforma al SQL nativo de cada base de datos), no hay problemas de portabilidad de las sentencias SQL entre bases de datos. Una misma aplicación hecha con NHibernate puede funcionar sin modificaciones en MySQL y en MS-SQL, sin repetir una sola consulta, incluyendo paginaciones, joins, agregados…
Hay un articulo muy sencillo, un quickstart, que explica mucho mejor que yo todo lo necesario para empezar con NHibernate: http://www.hibernate.org/hib_docs/nhibernate/html/quickstart.html

Bancos y TPVs: Aún en el 2000?

Me ha tocado integrar en un sitio Web un TPV Virtual de una entidad bancaria española cualquiera.

Hace años, en mi anterior trabajo, vi cómo funcionaba el tema … el funcionamiento era sencillo pero chapucero, y nada previsible. Eran otros tiempos y sólo se valoraba que funcionasen las cosas sin importar cómo… también es cierto que los estándares Web de la época eran otros y bastante anticuados…
Por eso, cuando me he puesto con esto en Septiembre del 2006, esperaba encontrar grandes mejoras. Esperaba encontrar un uso extensivo de los servicios Web, de WDSLs, esquemas XML y de todas esas cosas tan complicadas, aburridas y previsibles cuyo uso se ha generalizado en los últimos años.

Pero NO! eso era demasiado esperar. Me he encontrado con los mismos métodos chapuceros de integración. Un POST por allí, campos hidden mágicos por allá que contienen fechas, números y texto en el formato el-que-a-mi-me-de-la-gana….

A decir verdad, sí que ha habido alguna mejora, pero se la podían haber ahorrado: Un servicio Web SOAP de un sólo método que toma como parámetro una CADENA que contiene un XML (cuyo formato se especifica en un DTD!), y que devuelve otra CADENA con otro XML del DTD: Señores de *******, ¿Para q c*j*nes quieren vds. un SOAP si solo lo usan para añadir un poquito de parafernalia por delante y por detrás al mensaje XML? ¿Por qué no dan WSDLs y XSDs com Deu mana y así facilitar el trabajo de los que implementamos aplicaciones contra sus penosamente diseñados sistemas?
Lo peor es que te instan a usar su “”"”WSDL”"”" en plan “Los comercios que deseen desarrollar un servicio SOAP deben ajustarse a esta WSDL. A partir de ella y, mediante herramientas de generación automática de código, se puede desarrollar el esqueleto del servidor SOAP de forma cómoda y rápida“. Collons! si el WSDL solo contiene un “cadena Metodo(Cadena parametro)”!

Es tan “2000′ish” todo esto…

¿ Es sólo la banca española la que acaba de entrar en el siglo 21 mientras los demás llevamos 6 años definiendo estándares, buenas prácticas y patrones de diseño de sistemas de integración? ¿ O la de fuera es igual? Que mal.

Subversion

Hace más de un año que utilizamos Subversion en la empresa, y hoy día creo que a pesar de ser un equipo de desarrollo pequeño, no seríamos ni la mitad de eficientes si no fuera por él.

Subversion es un sistema de control de versiones; es decir, un sistema de gestión de código fuente que controla las versiones de cada archivo, y agrupa cada cambio a uno o varios archivos en unidades atómicas y transaccionales. Almacena el histórico de cada archivo, de forma que puedes ver siempre el histórico de cambios de todos y cada uno de los archivos del proyecto. Funciona integrado con el Apache o como servidor independiente, aunque yo lo prefiero con Apache por varias razones. Subversion se parió para sustituir a un sistema de control de versiones llamado CVS, muy usado “antiguamente”, pero que tenía muchas deficiencias que subversion corrige:

  • Los cambios son atómicos; es decir, o guardas todos los cambios de todos tus archivos en el repositorio al hacer “commit” o no guardas ninguno
  • Cuando renombras un archivo del proyecto o lo mueves de sitio (parte del proceso de refactorización), conserva el histórico de cambios (en CVS es como si borraras y crearas otro archivo).
  • Subversion es mucho mas rápido; se pretendía que las operaciones masivas sobre el repositorio de código tuvieran un coste constante (con CVS no ocurría asi).
  • Subversion puede meter “meta-datos” libres a los archivos (propiedades clave-valor que uno quiera; por ejemplo: “archivoauditadoyseguro: true”

Aquí está la bestia: http://subversion.tigris.org/

Y aquí un tutorial para usarlo en windows con un cliente gráfico muy bonito llamado TortoiseSVN: http://svn.haxx.se/users/archive-2006-05/att-0593/SVN-Apache-SVNNotify-HowTo-En.pdf ( la sección del Perl y del notify os la podéis saltar tranquilamente).

Para integrarlo con Visual Studio: http://ankhsvn.tigris.org

Para integrarlo con Eclipse: http://subclipse.tigris.org/

Para integrarlo en Windows directamente: http://tortoisesvn.tigris.org/

Para integrarlo en Dreamweaver (de $pago$ pero baratito): http://www.grafxsoftware.com/. (Aunque con el TortoiseSVN y las carpetas ignoradas de dreamweaver, si tienes un poco de experiencia con el puedes usarlo sin este plugin sin problemas :)

Y más cosas sobre subversion en http://www.subversionary.org/, con tutoriales y artículos varios.