La relación entre LINQ y Don Knuth
Este post es en buena medida continuación de otro anterior, y trata sobre otra de las "pegas" habituales que me encuentro durante las charlas (formales o informales) relacionadas con LINQ.
A la que voy a comentar hoy yo la llamo "el síndrome de la obsesión por el rendimiento", y se manifiesta en el hecho de mi interlocutor, desde la primera vez que oyó hablar sobre LINQ, decidió que esa tecnología a él no le vale porque "afecta el rendimiento".
La mayor parte de las veces (aunque no siempre - a veces también he hablado sobre la complejidad algorítmica de los operadores en LINQ to Objects, por ejemplo), esto tiene relación con lo que mencionábamos en el post anterior: se confunde a LINQ como un todo con LINQ to SQL en particular, y de lo que se trata en el fondo es del temor de esa persona a la pérdida de control que representa dejar la generación de "sus" sentencias SQL en manos de una API del sistema. Es curioso que, en algunas ocasiones, la actitud de la persona en cuestión rezuma hostilidad, como si le fuera la vida (o el empleo) en ello.
En primer lugar, todos sabemos que "el rendimiento" es un concepto muy relativo: lo que puede no ser aceptable para un cierto tipo de aplicaciones sí lo es para otros, y lo que puede no ser aceptable hoy sí lo será mañana, con máquinas más rápidas y mejor dotadas.
Pero lo más cuestionable, a mi modo de ver, de estas actitudes, es que dan una idea de que quienes las asumen aplican en su trabajo diario un "performance-driven development" que seguramente les impide alcanzar los niveles de productividad a los que podrían llegar si dejaran de tratar de poner la carreta delante de los bueyes.
De más está decir que hay ciertas aplicaciones que tienen como requisito primario y esencial un rendimiento excepcional. No es a ese tipo de aplicaciones al que me estoy refiriendo aquí, sino a la típica aplicación corporativa en la que prevalecen mantenimientos en los que es relativamente irrelevante que la ejecución de una consulta demore tres segundos ó cinco (siempre que no sean sesenta, por supuesto).
Una frase de uno de los genios de la informática, Donald Knuth (con cuya obra hemos aprendido varias generaciones de programadores), que nunca he olvidado es "Premature optimization is the root of all evil" ("Optimizar antes de tiempo es la raíz de todos los males"). Mi interpretación de esa frase consiste en que, como regla general, un programa se debe atacar utilizando las herramientas de más alto nivel que uno tenga a su disposición y sean adecuadas para la tarea, para solo después, como consecuencia de un perfilado, optimizar las partes en las que merezca la pena mejorar el rendimiento.
Es en ese espíritu en el que creo que debe verse a LINQ en todas sus variantes: como un artefacto que permitirá multiplicar por N ( N > 1 :-) nuestra productividad, sin impedirnos bajar al nivel subyacente cuando (pero solo cuando) ello sea necesario.
Nota: Este post refleja única y exclusivamente mis opiniones personales.