Entrevista a J. Daniel García, Profesor del departamento de Informática de la UC3M

“La capacidad más importante para un programador es disponer de habilidades sociales”

.

J. Daniel García

J. Daniel García

UC3M / J. Daniel García es profesor titular de Arquitectura y Tecnología de Computadores en el departamento de Informática de la Universidad Carlos III de Madrid (UC3M). Es el representante español en el comité ISO para la normalización del lenguaje de programación C++.

Recientemente, ha organizado una jornada, celebrada en la Escuela Politécnica Superior de la UC3M, para explicar a alumnos y profesionales del sector el potencial de C++, que él ha usado en los últimos 25 años en sistemas de control en tiempo real, software de ingeniería civil, equipamiento de imagen médica, simulación por computador, software en el sector aeroespacial y computación científica de altas prestaciones.

Su principal interés es hacer la vida de los desarrolladores más fácil, tratando de llegar a un buen equilibrio entre la mantenibilidad del software y el rendimiento de las aplicaciones. En resumen, conseguir un lenguaje de programación más fácil de leer, más rápido en ejecutar y que consuma menos recursos.

.

¿Qué es C++?

Es un lenguaje de programación de propósito general que combina distintos paradigmas o modelos de programación. El lenguaje nació en la década de los ochenta en los laboratorios Bell de AT&T, donde fue diseñado por el Profesor Bjarne Stroustrup. Inicialmente conocido como “C con clases”, empezó a ganar popularidad muy rápido y a principios de los años 90 comenzó su proceso de normalización. En 1998 se publicó el primer estándar ISO/IEC 14882, que ha sido revisado en 2003, 2011 (esta vez aquí en Madrid) y en 2014.

.

¿Cómo se normaliza un lenguaje de programación?

El comité de estandarización de C++, donde represento la posición de España, tiene actualmente más de cien miembros que asisten entre dos y tres veces al año a reuniones que tienen una duración de seis días completos de trabajo. Actualmente, en el seno del comité estamos ya trabajando en la siguiente versión del lenguaje, prevista para el año 2017, así como en un conjunto bastante amplio de especificaciones técnicas de características algo más experimentales.

.

¿Qué importancia tiene C++ en el desarrollo de software?

C++ es uno de los lenguajes más usados. Según las estimaciones realizadas por la consultora IDC, el número de desarrolladores que usan C++ está por encima de los 3 millones. Especialmente desde 2010 hay un interés renovado por el lenguaje, puesto que tanto en las aplicaciones móviles como en los grandes centros de datos el rendimiento por vatio (cantidad de cálculos realizados por cada vatio de energía consumido) se ha convertido en una métrica fundamental.

.

¿Qué ventajas tiene respecto a otros lenguajes de programación?

El lenguaje C++ tiene una orientación clara hacia el uso eficiente de los recursos

El lenguaje C++ tiene una orientación clara hacia el uso eficiente de los recursos y al mismo tiempo permite construir abstracciones complejas que hagan uso de los computadores. Si bien es cierto que existen otros lenguajes de programación que pueden competir en el uso eficiente de los recursos, normalmente fracasan en la gestión de la complejidad. En resumen, no existen muchas más alternativas para escribir software complejo si se desea obtener un buen rendimiento. Por esta razón, C++ triunfa especialmente en el desarrollo de sistemas de software complejo que necesita una alta velocidad o bien necesita ejecutarse en entornos muy restringidos. Esto hace que el lenguaje sea usado desde en aplicaciones de simulación financieras hasta en sistemas de control de vehículos. Como curiosidad, una parte relevante del software que controla la sonda Mars Rover está escrita en C++.

.

¿Qué tipo de programas o aplicaciones se pueden realizar con él?

El uso de C++ para desarrollo de software se extiende por muchos tipos de aplicaciones en diversos sectores. Aun así se pueden dar algunos ejemplos. C++ se usa en algunos productos de ofimática como (Microsoft Office, OpenOffice), muchas bases de datos (Oracle, MySQL, Micorosft SQL Server), la mayoría de los navegadores de Internet (Internet Explorer, Mozilla Firefox, Safari, Google Chrome, Opera) o software de navegadores GPS como TomTom, Hertz NeverLost o Garmin. C++ también está detrás de servicios de Internet, como el motor de búsquedas de Google, o servicios de PayPal, Amadeus, Amazon, Facebook o DropBox. Una gran cantidad de videojuegos se escriben en C++, así como mucho software de animación. Además, también en emplea en software financiero. Por ejemplo, Bloomberg desarrolla gran parte de su software de información financiera en tiempo real en C++. Otro área donde se utiliza es en grandes proyectos científicos, como los llevados a cabo por el CERN en física de altas energías o la NASA en exploración espacial. También se usa C++ en software de telecomunicaciones desarrollados para la gestión de la infraestructura de comunicaciones por empresas como AT&T o Ericsson.

.

¿Cómo contempla el futuro de la programación?

El desarrollo de software es un sector en crecimiento. Cada vez más servicios que usamos todos los días dependen del software que los gestionan y existen varios retos que debemos resolver para seguir avanzando. Por una parte, desde 2005 la velocidad de cómputo de los procesadores está esencialmente estancada. Es por esto que los fabricantes han optado por construir procesadores con múltiples unidades de procesamiento (los multi-core). Sin embargo, para aprovechar al máximo estos dispositivos, necesitamos escribir los programas especificando qué tareas se pueden ejecutar simultáneamente (programación paralela) y para conseguirlo es necesario un adecuado soporte por los lenguajes de programación. Además, existe una tendencia cada vez mayor a la combinación de múltiples dispositivos (como tarjetas gráficas, hardware reconfigurable o procesadores digitales de señal) para construir computadores que los combinan. Y los lenguajes también necesitan un mejor soporte para estas aproximaciones.

Otro problema es que al construir software cada vez más complejo, se hace necesario poner más énfasis en garantizar que el software construido es correcto y está, en la medida de lo posible, libre de errores. Asimismo, se requieren mecanismos para permitir reaccionar de forma adecuada a circunstancias no esperadas, incluyendo averías de componentes. Por último, a medida que el software se hace más complejo, la modificación de aplicaciones existentes para adaptarlas a nuevas necesidades también se hace más difícil, por lo que dominar la propia complejidad inherente al software se hace esencial. Algunos de estos retos se están estudiando con detalle en el proyecto REPARA (www.repara-project.eu) financiado por el Séptimo Programa Marco de la Unión Europea y del que soy el coordinador.

.

¿Qué límites existen en la rapidez de las aplicaciones?

Existen límites derivados de las propias capacidades de los dispositivos

Por una parte, existen límites derivados de las propias capacidades de los dispositivos. Actualmente construimos cada vez dispositivos que tienen más procesadores. Aunque al añadir más dispositivos de cómputo se aumenta, al menos en teoría la capacidad de cómputo, esto no siempre se puede traducir en una mayor rapidez. Es necesario diseñar (o rediseñar) los programas para que puedan aprovechar estas capacidades de los dispositivos. Dependiendo de la aplicación, esto puede ser más fácil o difícil. En algunos casos, puede incluso resultar imposible.

.

¿Cómo se puede conseguir que una aplicación consuma menos energía?

La respuesta más corta sería: haciendo que tarde menos tiempo. Aunque existen más técnicas, el consumo de energía es muy dependiente del tiempo que tarda en realizarse una tarea: si se consigue reducir este tiempo, se consigue una reducción en el consumo de energía. Desde el punto de vista de los lenguajes de programación, lo que tiene más impacto es que el lenguaje permita escribir programas que hagan un uso lo más efectivo posible de los recursos disponibles en la máquina. En este sentido, C++ es un lenguaje muy adecuado, que evita desperdiciar recursos innecesariamente.

.

¿Qué tres virtudes cree que debe tener un buen programador?

Más que de programadores, yo prefiero hablar de desarrolladores de software. La capacidad más importante para un programador es, en mi opinión y en contra de lo que muchos puedan pensar, disponer de adecuadas habilidades sociales. El desarrollo de software es un trabajo que siempre se realiza en equipo y disponer de unas buenas habilidades interpersonales es fundamental. Además, un desarrollador necesita comprender bien las necesidades de los clientes y usuarios de los productos que está construyendo para resolver los problemas que éstos tienen realmente. También es muy importante conocer las bases teóricas de la computación y comprender de forma integrada distintas disciplinas que tienden a verse como cajas estancas y sin relación. Por ejemplo, un buen programador necesita un conocimiento actualizado de las capacidades de los procesadores y su organización interna, de las optimizaciones que realizan los compiladores (que traducen el lenguaje de programación a los códigos binarios usados por el procesador) o de las interacciones con el sistema operativo concreto.

Otra habilidad esencial es el conocimiento de múltiples tecnologías. El pensamiento único se lleva muy mal con la Ingeniería y es necesario disponer de múltiples puntos de vista para evaluar las ventajas e inconvenientes de cada uno de ellos. Cuando se aplica esto a la programación, es necesario que el desarrollador conozca múltiples lenguajes de programación y sea capaz de decidir cuál es más adecuado dependiendo del problema que esté tratando de resolver. Por esta razón, soy muy crítico con las universidades que utilizan un único lenguaje de programación como herramienta vehicular a lo largo de todo el programa formativo. Los estudiantes deberían ser expuestos a distintos modelos y paradigmas de programación para poder conocer las ventajas e inconvenientes. Sin embargo, en muchos lugares se hace justo lo contrario.