lunes, 11 de octubre de 2010

Reflexiones sobre los lenguajes de programación

Desde los albores de la informática, ha sido necesario algún nexo de comunicación entre las máquinas y los humanos. En un principio se codificaban instrucciones lógicas, matemáticas, asignación, flujo... asociadas a códigos binarios. Para hacerlo un poco más legible, aparecieron los mnemotécnicos del ensamblador o código máquina. Más tarde, la productividad exigía lenguajes más sencillos para ganar rapidez, eficacia y reducir la cantidad de errores. Aparecieron el Fortran, el Cobol, el RPG, el ADA, el LISP, el Basic, el Logo, el Pascal, el C, el C++, el Java, el .NET, el Python, el Ruby, etc.

Hoy día tenemos una riqueza enorme de lenguajes de programación (ver lista de lenguajes de programación en http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm). Algunos lenguajes se han inventado para tratar algunas tareas específicas. Otros lenguajes, sin embargo, son utilizados para propósitos generales. Algunos lenguajes son de muy bajo nivel, con lo que su rendimiento es altísimo. Otros lenguajes son de muy alto nivel, ganando así en productividad y en reducción de errores. Algunos lenguajes son muy sencillos de aprender y de utilizar, mientras que otros son místicos o esotéricos, reservados sólo para los elegidos que se adentran en sus arcanos conocimientos (consultar http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_esot%C3%A9rico. Hay lenguajes compilados, semicompilados, interpretados o de script. Hay lenguajes textuales y lenguajes gráficos. Hay lenguajes que comprenden uno o varios paradigmas, como el imperativo, el declarativo, el estructurado, el orientado a objetos, el funcional, el lógico, etc.

A lo largo de la historia de la programación ha habido una evolución constante, tanto de los lenguajes como del entorno del negocio de la programación. En su día, un programador era una eminencia por la que se pagaba un sueldo envidiable. Hoy día, la programación está al alcance de cualquiera, y los sueldos han bajado hasta igualarse a los de otros oficios. Hoy se valora más la gestión de equipos de programadores y la optimización de la productividad, que los conocimientos individuales de un programador.

Antiguamente se elaboraban más algoritmos, por lo que era habitual repetir el código de ciertas funcionalidades (ordenación, índices, accesos a discos, etc.), especialmente porque el código no se compartía y había mucha patente. Hoy en día hay librerías para todo, y frameworks avanzados que facilitan mucho la labor de la programación, haciéndola más productiva y estandarizada.

Un paso importante fue incluir rutinas de bajo nivel en un chip, como la ROM, la cual era (y sigue siendo) accesible por cualquier programa (especialmente por uno que acceda a bajo nivel, como C/C++). A esto le siguió incluir también rutinas estándar en el sistema operativo (nuestro adorado DOS ya las incluía). Hoy día, casi cualquier dispositivo tiene una librería de bajo nivel con los servicios estándar para su gestión. Desde hace algún tiempo también se está experimentando incluir un sistema operativo en un chip (éste era uno de los proyectos de Linus Torvalds), o incluso complejos programas completos. Tener software implementado a nivel de chip incrementaría enormemente la velocidad, aunque los chips deberían ser de acceso aleatorio y sobreescribibles, con el fin de poder actualizar bugs, firmwares, funcionalidades, etc. Asimismo, los chips deberían ser también estándares, con el fin de poder integrarlos en otros dispositivos o máquinas con sólo conectarlos.

El contenido y el contenedor de los programas también ha cambiado, aunque la esencia es la misma. Antiguamente se codificaba el código (en lenguaje máquina) en tarjetas perforadas, las cuales eran leídas y pasadas a la memoria del ordenador, que procesaba el programa. Más adelante, los lenguajes de programación se compilaban (traducían y guardaban) a código (de la propia máquina o de la propia plataforma), y las tarjetas perforadas se sustituyeron por soportes de almacenamiento magnético (y/u óptico). Los lenguajes actuales permiten crear programas independientes de la plataforma, gracias a que están en crudo y son interpretados por un intérprete (como JavaScript), o bien están semicompilados a nivel de bytecode (como Java o .NET). En ambos casos no es la máquina o el sistema operativo el que ejecuta el programa, si no otro programa (intérprete o máquina virtual). Otro punto en que se ha evolucionado el contenido y el contenedor, es que los programas solían estar en la misma máquina, y ahora ese no es un requisito indispensable, pues se pueden ejecutar servicios de programas en remoto. Con la programación en nube, los programas se sirven como un servicio, y no es necesario hacer instalaciones ni tener sistemas de almacenamiento, si no tan sólo una conexión a internet y un navegador.

Otro punto especialmente relevante ha sido la filosofía del software libre (y por ende, todo lo relacionado, como el código abierto y todo tipo de licencias no propietarias), que ha supuesto la liberación de la programación como un fenómeno profesional, cultural y social. Esto permite ya no sólo tener las libertades, si no también la igualdad para todos de poder crear productos y tener las mismas oportunidades para compartirlo, promocionarlo y explotarlo.

¿Y cuál será el futuro de los lenguajes de programación? ¿Qué más pueden evolucionar? ¿Qué más pueden aportar a nuestra sociedad de la información?

La tecnología sigue avanzando y evolucionando. Esto genera nuevas necesidades y problemas que marcarán el qué y el cómo, así como también las tendencias en los lenguajes de programación, los cuales seguirán estando con nosotros, ya que necesitamos máquinas, y las máquinas nos necesitan a nosotros, y para que ambos nos entendamos es necesario un lenguaje.

Recuerdo cuando programaba en Clipper que mi jefe me decía que los programadores iban a desaparecer, ya que apareció la primera versión de Visual Basic, y todo se hacía automáticamente con tan sólo el ratón. Pero nada más lejos de la verdad, pues ello generó muchas más necesidades, problemas y soluciones de lo que antes habíamos imaginado. Y bajo ese prisma, creo que todo avance ampliará mucho más los horizontes que ya tenemos.

Lo mismo que ocurre con los idiomas humanos, los lenguajes de programación minoritarios se extinguirán poco a poco incrementando el uso de los más consagrados, debido a la carencia de su necesidad en la industria (otra cosa que sean objeto de estudio, como el latín o el griego). Los lenguajes de alto nivel ganarán cada vez más cotas de uso, y seguirán necesitando de lenguajes de bajo nivel para equilibrar sencillez frente rendimiento y velocidad. Se abstraerá aún más la semántica del lenguaje a fin de realizar muchas más cosas con menos, con la posibilidad de entrar en detalles. Habrá lenguajes de programación en nube, como servicio, así como también infraestructuras de desarrollo y despliegue en nube. Si bien las aplicaciones Web y en nube van a ver aumentada su cuota, las aplicaciones de escritorio seguirán presentes para ciertas necesidades, y especialmente por privacidad, por gustos, para problemas específicos (especialmente ligados al hardware donde corren), etc. Las RIA's serán un referente muy importante, pues los usuarios agradecerán aplicaciones intuitivas y productivas, capaces de hacer mucho con pocas acciones, fáciles de utilizar, potentes en el tratamiento de los datos y su presentación, y en la productividad que generan, además del tiempo que se gana. No olvidemos también la capacidad multiplataforma: se hará indispensable que el código de un lenguaje de programación se pueda ejecutar en cualquier sistema operativo. El escritorio y el navegador terminarán fusionándose e integrándose como uno sólo, y sus aplicaciones tendrán lo mejor de los dos mundos.

Otra baza decisiva para el éxito de un lenguaje de programación es su apertura y la libertad de uso, sin limitaciones. Poder desarrollar aplicaciones con total libertad, sin limitaciones por licencia o imposiciones, será (y es) un factor decisivo, por costes, por libertades, por promoción de herramientas y aplicaciones igualmente libres, por cultura, por igualdad y por derecho. Una empresa con intereses comerciales y monopolistas, detrás de un lenguaje de programación (o cualquier producto software), aún a pesar de sus largos tentáculos y negocios, verá cómo los programadores que no estén bajo su nómina le darán la espalda, y cómo los clientes adoptarán cada vez más soluciones libres.

La computación en nube tendrá éxito, aunque no creo que tan rápido ni en toda su extensión. Habrá ciertos servicios o aplicaciones en los que el cliente manda por encima de toda la potencia tecnológica, todas las funcionalidades y las capacidades que pueda ofrecer la nube. La privacidad será decisiva, así como tener el control de los datos y de los dispositivos de almacenamiento, amén del coste del servicio versus software tradicional.

Habrá frameworks más sofisticados capaces de desarrollar y desplegar aplicaciones con unos pocos parámetros. Actualmente podemos verlo en Ruby on Rails o en Django, pero esto sólo es el principio. Habrá interfaces (de código y de usuario) que ayuden a los frameworks en estas tareas, y después para ajustes toquemos el mínimo código que sea necesario. Y no sólo para la Web. También veremos frameworks en nube, capaces de integrarse con nuestras aplicaciones locales, remotas o en nube.

También aparecerán entornos de desarrollo (IDE) online o en nube. Serán capaces de generar aplicaciones multipropósito: escritorio, web, nube, para dispositivos móviles, para ordenadores, etc. También permitirán agregar componentes online o en nube. ¿Imagináis crear un programa sin instalar nada en el ordenador, y que las aplicaciones desarrolladas sean accesibles desde cualquier ordenador o dispositivo sin necesidad de compilarlas, ni instalarlas, ni parametrizarlas... todo de forma transparente y natural? ¿Imagináis realizar aplicaciones sin centrase tanto en lo interno, si no más bien en lo externo, como obtener información de un servicio web o de otro programa en nube (en lugar de currarte tú mismo tu sistema de base de datos y mantenerlo)?

Quizá aparezca un nuevo paradigma de programación, basado precisamente en los recursos y servicios en red, o quizá en requisitos y resultados. Quizá aparezcan también lenguajes capaces de autoaprender según la experiencia de los programadores, o analizando los problemas de los aplicativos. O entornos de desarrollo que automáticamente ponderen la forma más eficiente de desarrollar una aplicación, eliminando u optimizando el código, y corrigiendo automáticamente todo tipo de errores. Quizá los lenguajes de programación atiendan las funcionalidades como parámetros de entrada y desarrollen automáticamente el diseño y el código libre de errores más cercano posible (paradigma basado en requisitos y resultados). Quizá los lenguajes de programación aseguren la calidad de las aplicaciones en un porcentaje cercano al 100%, minimizando el tiempo de pruebas y ahorrando tiempos de desarrollo. Quizá la semántica de las aplicaciones y de la Web condicionen también que los lenguajes de programación sean más semánticos o contemplen la semántica.

La evolución de los lenguajes de programación conllevará también una evolución en las metodologías de trabajo, en marcos o en sistemas de trabajo. El dinamismo de la tecnología y de los productos reclaman agilidad, aunque los clientes demandan metodologías predictivas para un mayor control y como arma legal. Las metodologías predictivas y la agilidad son filosofías antónimas, aunque también poseen puntos en los que se puede extraer lo más importante y positivo de cada una, ver dónde se aplican, integran y formen sinergias fortalecidas. Los clientes, las empresas de servicios, consultoras, etc., deben tener la misma visión y entenderla para no cometer los mismos errores una y otra vez. Esta dependencia condicionará también la evolución de la tecnología, de los lenguajes de programación y de los productos y servicios. Posiblemente dejemos de ver los proyectos como lo vemos actualmente, con un tiempo, un coste, una tecnología y un sistema predeterminado desde el principio. Quizá veamos los proyectos como servicios de desarrollo incrementales y dinámicos, con contratos por objetivos, sin dependencias ni fricciones entre cliente y proveedor.

A lo largo de estas reflexiones he ido anotando puntos que ya he empezado a ver, y algunas ideas que se me han ocurrido. No pretendo afirmar nada, pues el futuro llega antes de lo que uno se piensa, y de distinta manera a como uno lo ha imaginado. Ideas se tienen, y no todos por igual. Hay ideas que prosperan y otras que fenecen, al igual que las semillas. Todo depende del escenario y de las circunstancias.