sábado, 2 de febrero de 2013

Arquitectura del Software, DCI y programación funcional

Al poco tiempo de dejar la dirección de la Escuela me tocó elegir docencia para el curso 2012/13. Entre las opciones, aparecía una asignatura llamada "Arquitectura del Software" que se iba a impartir por primera vez en el nuevo plan de estudios y que tenía pinta de que me iba a gustar. La escogí, y aunque todavía no empecé a impartirla, llevo ya unos meses preparándola encantado de haberla escogido. En este tiempo he comprado y leído (u hojeado) un montón de libros sobre el tema y estoy intentando ponerme al día en una disciplina que creo que es apasionante. Una de las cosas que más me ha llamado la atención es el paradigma DCI (Datos-contexto-interacción) que está siendo propuesto por Trygve Reenskaug, el inventor del patrón MVC (Modelo-Vista-Controlador).

Uno de los que más está promoviendo el modelo DCI es Jim Coplien que ha escrito el libro Lean Architecture: for Agile Software Development. El libro lo compré hace tiempo y está bien, aunque tiene algunas partes que se hacen un poco pesadas. Da la sensación de que el concepto DCI es importante, pero no acaba de explicarlo de forma sencilla.

Esta tarde estuve mirando el vídeo de la conferencia AOSD 2012 en la que Jim Coplien presenta el tema y creo que se entiende mucho mejor el concepto. Además, lo mejor es que parece que uno de los lenguajes en los que se puede adoptar la técnica de forma más natural es Scala.

De hecho, en la lista de correo dedicada a DCI hay varias propuestas de implementaciones en Scala.

La verdad que cada vez estoy más convencido del gran potencial que va a tener la programación funcional para la ingeniería del software del futuro. Por si fuese poco, he visto que Robert Martin (uncle Bob), uno de los padres del movimiento ágil, escritor del magnífico libro Clean Code, parece que está poco a poco pasándose al campo de la programación funcional e incluso tiene una serie de entradas en su blog introduciendo el tema.

Como no podía ser menos, hice una búsqueda para ver si había gente del campo funcional interesada en DCI y encontré esta entrada que habla de las entrañas de la programación orientada a objetos y la programación con interfaces. No he tenido tiempo a seguir indagando, pero definitivamente, creo que DCI y la programación funcional pueden aportar muchas cosas buenas a la arquitectura del software.

6 comentarios:

Mafias dijo...

Pues echándole un vistazo a DCI, desde luego parece un tema interesante. Sin embargo, todo el concepto me parece que tiene dos inconvenientes serios: uno, que parece un modelo demasiado teórico, y de hecho parece que no hay buenas herramientas finales que lo implementen. Y lo segundo, que parece demasiado focalizado a un tipo de problemas, donde encaje el "role-based programming" que proponen.
A primera vista y simplemente leyendo el artículo de wikipedia, mi impresión es que debe ser complicado formar una arquitectura grande y extensible con ello, y mi segunda expresión es una especie de deja-vu relacionado con RDF (supongo que por la naturaleza ternaria generalista de "elemento-interacción-elemento2")
Me apunto el vídeo para verlo, a ver si lo entiendo mejor...
De la programación funcional tengo que decir que es indiscutible que puede aportar muchas cosas a nivel de arquitectura, pero la veo demasiado "inasequible". Es complicada, y como tal no vale para todo el mundo. Sin embargo, no tengo dudas de que conseguirás encajar algo de ella para enriquecer una asignatura que, según mi opinión, es de las más importantes del nuevo plan, y la que puede marcar la diferencia entre un buen ingeniero informático y un "supercrack".

Una vez empiezas a estar en contacto en el mundo profesional con gente de otros sitios, te das cuenta que la formación como arquitecto de software de la ex-EUITIO es increíble, así que tienes una gran responsabilidad en que así siga siendo. A por ello :)

Un saludo,

Diego.

Mafias dijo...

Pues echándole un vistazo a DCI, desde luego parece un tema interesante. Sin embargo, todo el concepto me parece que tiene dos inconvenientes serios: uno, que parece un modelo demasiado teórico, y de hecho parece que no hay buenas herramientas finales que lo implementen. Y lo segundo, que parece demasiado focalizado a un tipo de problemas, donde encaje el "role-based programming" que proponen.
A primera vista y simplemente leyendo el artículo de wikipedia, mi impresión es que debe ser complicado formar una arquitectura grande y extensible con ello, y mi segunda expresión es una especie de deja-vu relacionado con RDF (supongo que por la naturaleza ternaria generalista de "elemento-interacción-elemento2")
Me apunto el vídeo para verlo, a ver si lo entiendo mejor...
De la programación funcional tengo que decir que es indiscutible que puede aportar muchas cosas a nivel de arquitectura, pero la veo demasiado "inasequible". Es complicada, y como tal no vale para todo el mundo. Sin embargo, no tengo dudas de que conseguirás encajar algo de ella para enriquecer una asignatura que, según mi opinión, es de las más importantes del nuevo plan, y la que puede marcar la diferencia entre un buen ingeniero informático y un "supercrack".

Una vez empiezas a estar en contacto en el mundo profesional con gente de otros sitios, te das cuenta que la formación como arquitecto de software de la ex-EUITIO es increíble, así que tienes una gran responsabilidad en que así siga siendo. A por ello :)

Un saludo,

Diego.

Guti dijo...

Es la primera vez que oigo hablar de DCI, me tendré que enterar un poco. Pero aunque la asignatura como tal es la primera vez que se imparte, en el plan de estudios anterior sí que había una optativa, Arquitectura de Aplicaciones Software, que supongo que en "intención" se corresponde.

Fíjate, tampoco sabía que Reenskaug era el autor "oficial" del MVC.

Lo que escribe Mafias es como para alegrar el día a cualquiera, la verdad. (Sin que implique acomodarse, ni mucho menos.)

Cope dijo...

Well, I don't find it theoretical. We've implemented dozens of commercial systems in it.

Most people have difficulty understanding object orientation because they're still stuck in classes. It's a hard thing to admit. It's easier to wave one's hands, to scream for tools instead of thinking, and to say there is no commercial application of the idea.

By the same token, just for fun, I challenge you to name one large, reliable, successful application in Java. Just one. But I don't hear you arguing against it...

Jose Emilio Labra Gayo dijo...

First of all, Cope, it is really a pleasure to have a comment of you in my blog. As I wrote in Spanish, I didn't expect you to read my post, so it is great to know that you have read it.

Apart from that, I want to say that I really like the DCI concept and that I was considering to give a lecture about it in my "Software Architecture Course" last year.

At the end I didn't do it because I had not enough time to talk about all the things that I wanted to talk about, but I would really like to include some material about DCI in my course next year.

I am a big fan of Functional Programming languages: I did my PhD in Haskell and these days I do most of my coding in Scala.

I was even planning to use Scala as the language of choice for the Software Architecture course although at the end it was language agnostic.

The course included a practical assignment that groups of 8 students had to implement. Most of the students used Java with the Play framework and some of them used C#.

Anyway, I would be very happy to have the chance to talk more about DCI in my course. So for me, the choice is not DCI vs OOP, but DCI vs Functional Programming, or DCI vs Functional/OOP in the hybrid sense of the Scala community.

In fact, I have the feeling that they are not opposed and I think that Scala is a perfect fit for DCI. However, I think there should be more references/comparisons between both paradigms. Are they opposed or complementary?

It would also be important for DCI adoption if there were more information about those real systems that you mention were implemented using the DCI approach.

In the case of Scala, it is having some acceptance in the industry and there are a number of companies that are adopting it. Is it the same with DCI? Are there some documented use cases which I could include in my Software Architecture lectures notes?

Mafias dijo...

Well, I indeed didn't expect any answers after all this time, but since it's not usual to have the chance to speak with somebody like Cope I feel myself obliged to answer!

Obviously I don't have the deep knowledge nor the prestige to argue about DCI internals with one of it's creators, but I think my past impressions are still valid. When I said "theoretical" I didn't mean that one can't use it for real projects, I was trying to say that the foundations of DCI (or at least my superficial understanding of them) and role based programming focus too much on a specific kind of problems to be adopted as a general jack-of-all-trades paradigm, as MVC is.

Regarding your second paragraph, I think you're being a little too sensitive about criticism :) IMHO, The recent javascript and node.js boom tells us that many developers are ready to free themselves of the 'class sickness' if they need to... It only takes a 'killer app' or decent framework to get the attention of the community, you don't need a giant like Oracle/Sun to back it up. It's perfectly normal that most programmers wave hands and ask for tools, because not everybody is a researcher or have the capacity to understand a new complex model without a vast and friendly documentation.

About Java, you should hear me bitchin' about it everytime I get the opportunity... ;) Anyway, I think the comparison doesn't stand up. I may not be a Java fan, but it's a industry de-facto standard, it has thousands of applications, libraries and third party modules, and according to Tiobe is the most popular programming language in the world, even over C and C++. And we can mention Lucene or JIRA as "big succesful java apps". Even Android is a java success story...