El problema de la programación

En las décadas de 1980 y 1990, Bjarne Stroustrup diseñó e implementó el lenguaje de programación C ++, que popularizó la programación orientada a objetos e influyó en muchos otros lenguajes de programación, incluido Java.





C ++ sigue siendo el lenguaje informático arquetípico de alto nivel (es decir, uno que conserva las características del lenguaje humano natural), y todavía lo utilizan millones de programadores. Muchos de los sistemas y aplicaciones de la era de la PC e Internet se escribieron en C ++. Por todo eso, el lenguaje sigue siendo controvertido, en gran parte porque es notoriamente difícil de aprender y usar, y también porque el diseño de Stroustrup permite a los desarrolladores cometer errores de programación graves con el fin de preservar su libertad.

Stroustrup, durante muchos años investigador en AT&T Bell Labs, ahora es profesor de informática en el Departamento de Ingeniería de la Universidad Texas A&M, cerca de Houston.

Revisión de tecnología : ¿Por qué la mayoría del software es tan malo?



Bjarne Stroustrup : Algunos programas son bastante buenos según los estándares. Piense en los Mars Rovers, Google y el Proyecto Genoma Humano. ¡Eso es software de calidad! Hace quince años, la mayoría de la gente, y especialmente la mayoría de los expertos, habría dicho que cada uno de esos ejemplos era imposible. Nuestra civilización tecnológica depende del software, por lo que si el software hubiera sido tan malo como su peor reputación, la mayoría de nosotros ya estaríamos muertos.

Por otro lado, mirar fragmentos de código promedio puede hacerme llorar. La estructura es espantosa y los programadores claramente no pensaron profundamente en la corrección, los algoritmos, las estructuras de datos o la mantenibilidad. La mayoría de la gente no lee código; solo ven que Internet Explorer se congela.

Creo que el problema real es que nosotros (es decir, los desarrolladores de software) estamos en un estado de emergencia permanente, agarrándonos a las pajitas para hacer nuestro trabajo. Realizamos muchos milagros menores a través de prueba y error, el uso excesivo de la fuerza bruta y muchas, muchas pruebas, pero, tan a menudo, no es suficiente.



Los desarrolladores de software se han vuelto expertos en el difícil arte de construir sistemas razonablemente confiables a partir de partes no confiables. El inconveniente es que a menudo no sabemos exactamente cómo lo hicimos: un sistema simplemente evolucionó hasta convertirse en algo mínimamente aceptable. Personalmente, prefiero saber cuándo funcionará un sistema y por qué.

NIÑOS : ¿Cómo podemos arreglar el lío en el que estamos?

BS : En teoría, la respuesta es simple: educar mejor a nuestros desarrolladores de software, utilizar métodos de diseño más apropiados y diseñar para la flexibilidad y para el largo plazo. Recompense los sistemas correctos, sólidos y seguros. Castigar el descuido.



En realidad, eso es imposible. La gente recompensa a los desarrolladores que entregan software barato, con errores y de primera. Eso se debe a que ahora la gente quiere dispositivos nuevos y elegantes. Ellos no quieren inconvenientes, no quieren aprender nuevas formas de interactuar con sus computadoras, no quieren retrasos en la entrega y no quieren pagar más por la calidad (a menos que sea obvio desde el principio, y a menudo ni siquiera entonces). Y sin cambios reales en el comportamiento de los usuarios, es poco probable que cambien los proveedores de software.

No podemos simplemente detener al mundo durante una década mientras reprogramamos todo, desde nuestras máquinas de café hasta nuestros sistemas financieros. Por otro lado, simplemente salir del paso es caro, peligroso y deprimente. Se necesitan mejoras significativas y solo pueden llegar gradualmente. Deben tener un frente amplio; ningún cambio es suficiente.

Un problema es que las chimeneas académicas se interponen en el camino: demasiadas personas presionan un área como una panacea. Mejores métodos de diseño pueden ayudar, mejores técnicas de especificación pueden ayudar, mejores lenguajes de programación pueden ayudar, mejores tecnologías de prueba pueden ayudar, mejores sistemas operativos pueden ayudar, mejores infraestructuras de middleware pueden ayudar, una mejor comprensión de los dominios de aplicaciones puede ayudar, una mejor comprensión de los datos las estructuras y los algoritmos pueden ayudar, etc. Por ejemplo, la teoría de tipos, el desarrollo basado en modelos y los métodos formales sin duda pueden proporcionar una ayuda significativa en algunas áreas, pero el solución a la exclusión de otros enfoques, cada uno garantiza el fracaso en proyectos a gran escala. La gente impulsa lo que sabe y lo que ha visto funcionar; ¿cómo podrían hacer de otra manera? Pero pocos tienen la madurez técnica para equilibrar las demandas y los recursos.



NIÑOS : La idea detrás de C ++ era que los programadores trabajarían más duro a cambio de un código más eficiente. Bell Labs quería un lenguaje que algunas personas realmente inteligentes usaran para escribir código que se ejecutara en computadoras como Electronic Switching Systems (ESS) que no eran muy rápidas. Hoy en día, hay muchos desarrolladores de software y las computadoras son muy rápidas. ¿Vicia eso el punto de C ++?

BS : C ++ no se diseñó específicamente para las grandes máquinas de conmutación, sino para una amplia gama de aplicaciones. Bell Labs fue el hogar de una increíble variedad de proyectos interesantes que abarcan todas las escalas y utilizan esencialmente todo tipo de computadora y sistema operativo. Pero sí, el programador promedio de Bell Labs era significativamente más capaz que la noción de la mayoría de la gente de un programador promedio, y la confiabilidad y el rendimiento (en ese orden) se consideraron significativamente más importantes que en la mayoría de los otros lugares.

El rendimiento sigue siendo un problema en muchas de las aplicaciones que me interesan: capacidad de respuesta de las interfaces, tiempo de inicio y cierre de las aplicaciones. Los desarrolladores de software han neutralizado el asombroso rendimiento del hardware informático moderno añadiendo capa tras capa de abstracciones [de software] sobreelaboradas. Parece que hemos alcanzado los límites de la aceleración lineal para el hardware, pero en muchos casos, podríamos recuperar un par de órdenes de magnitud del software.

Dicho esto, C ++ de hecho se ha vuelto demasiado amigable para los expertos en un momento en el que el grado de educación formal efectiva del desarrollador de software promedio ha disminuido. Sin embargo, la solución no es simplificar los lenguajes de programación, sino utilizar una variedad de lenguajes de programación y formar a más expertos. Tiene que haber lenguajes para que los expertos utilicen, y C ++ es uno de esos lenguajes.

NIÑOS : En retrospectiva, al diseñar C ++, ¿no fue su decisión de sacrificar la eficiencia, la seguridad y la confiabilidad del software del programador por el rendimiento en tiempo de ejecución un error fundamental?

BS : Bueno, no creo que haya hecho tal compensación. Quiero elegante y código eficiente. A veces lo consigo. Estas dicotomías (entre eficiencia versus corrección, eficiencia versus tiempo del programador, eficiencia versus alto nivel, etcétera) son falsas.

Lo que hice fue diseñar C ++ como, en primer lugar, un lenguaje de programación de sistemas: quería poder escribir controladores de dispositivos, sistemas integrados y otro código que necesitara usar hardware directamente. A continuación, quería que C ++ fuera un buen lenguaje para diseñar herramientas. Eso requería flexibilidad y rendimiento, pero también la capacidad de expresar interfaces elegantes. Mi opinión era que para hacer cosas de nivel superior, para crear aplicaciones completas, primero era necesario comprar, construir o tomar prestadas bibliotecas que proporcionaran las abstracciones adecuadas. A menudo, cuando las personas tienen problemas con C ++, el problema real es que no tienen las bibliotecas adecuadas o que no pueden encontrar las bibliotecas que están disponibles.

Otros lenguajes han intentado admitir aplicaciones de alto nivel de forma más directa.

Eso funciona, pero a menudo ese apoyo se obtiene a costa de la especialización. Personalmente, no diseñaría una herramienta que pudiera hacer solo lo que yo quisiera; apunto a la generalidad.

NIÑOS : ¿Cómo explica el hecho de que C ++ es ampliamente criticado y resentido por muchos programadores, pero al mismo tiempo se usa ampliamente? ¿Por qué tiene tanto éxito?

BS : La respuesta simplista es: sólo hay dos tipos de lenguajes: de los que todo el mundo se queja y de los que nadie usa.

Hay más sistemas útiles desarrollados en lenguajes considerados horribles que en lenguajes elogiados por ser bellos, muchos más. El propósito de un lenguaje de programación es ayudar a construir buenos sistemas, donde lo bueno se puede definir de muchas maneras. Mi breve definición es, correcta, mantenible y suficientemente rápida. La estética importa, pero ante todo un lenguaje debe ser útil; debe permitir a los programadores del mundo real expresar ideas del mundo real de manera sucinta y asequible.

La razón principal del éxito de C ++ es simplemente que cumple con sus objetivos de diseño limitados: puede expresar una amplia gama de ideas de manera directa y eficiente. C ++ no fue diseñado para hacer una sola cosa realmente bien o para evitar que la gente haga cosas consideradas malas. En cambio, me concentré en la generalidad y el desempeño.

Estoy seguro de que por cada programador al que no le gusta C ++, hay uno a quien le gusta. Sin embargo, un amigo mío asistió a una conferencia en la que el orador principal pidió a la audiencia que indicara a mano alzada, uno, a cuántas personas no les gustaba C ++ y dos, cuántas personas habían escrito un programa en C ++. Había el doble de personas en el primer grupo que en el segundo. Expresar disgusto por algo que no sabes se conoce generalmente como prejuicio. Además, quienes se quejan son siempre más fuertes y más seguros que los defensores: las personas razonables reconocen los defectos. Creo que sé más sobre los problemas de C ++ que sobre cualquier otro, pero también sé cómo evitarlos y cómo utilizar los puntos fuertes de C ++.

Y luego, por supuesto, no se espera que los defensores de los lenguajes que perdieron en la competencia con C ++ sean educados al respecto. El desarrollo de software no tiene ese grado de profesionalismo, aunque espero que eventualmente lo tenga. La ciencia es diferente en este sentido: cuando una nueva herramienta, técnica o teoría gana, la gente lo ve como un progreso. En software, las contribuciones de los competidores y predecesores no son ampliamente reconocidas, apreciadas o incluso comprendidas.

NIÑOS : En El diseño y la evolución de C ++ , afirma que Kierkegaard influyó en su concepción del lenguaje. ¿Esto es una broma?

BS : Un poco pretencioso, tal vez, pero no una broma. Gran parte del pensamiento sobre el desarrollo de software se centra en el grupo, el equipo, la empresa. Esto a menudo se hace hasta el punto en que el individuo está completamente sumergido en la cultura corporativa sin salida para talentos y habilidades únicos. Las prácticas corporativas pueden ser directamente hostiles a personas con habilidades e iniciativa excepcionales en asuntos técnicos. Considero que tal gestión de personal técnico es cruel y derrochador. Kierkegaard fue un firme defensor del individuo contra la multitud y tiene una discusión seria sobre la importancia de la estética y el comportamiento ético. No pude señalar una característica específica del lenguaje y decir: Mira, existe la influencia del filósofo del siglo XIX, pero él es una de las raíces de mi renuencia a eliminar características de nivel experto, abolir usos indebidos y limitar características a El soporte solo utiliza los que sé que son útiles. Sin embargo, no me gusta mucho la filosofía religiosa de Kierkegaard.

NIÑOS : ¿Qué es lo que más te arrepientes?

BS : ¡Sin arrepentimientos! Bueno, por supuesto que sueño con lo que podría haber hecho de manera diferente y mejor, pero en serio, ¿quién soy yo para adivinar, digamos, el Bjarne vintage de 1984? Puede que tuviera menos experiencia que yo, pero no era menos inteligente, probablemente más inteligente, y tenía una mejor comprensión de la palabra de 1984 que yo. C ++ se ha utilizado para construir muchos sistemas que mejoran nuestras vidas y ha tenido una influencia positiva significativa en lenguajes y sistemas posteriores. Eso es algo de lo que estar orgulloso.

Hacer clic aquí para leer nuestra segunda entrevista con Stroustrup.

esconder