C# y C++ con Rafael Ontivero
15 Oct 2024 · 73 min
Rafael Ontivero, veterano de C# y C++, cuenta cómo descubrió C# en la versión 1.0 del .NET Framework, abandonó temporalmente por problemas en 1.1, y regresó con 1.2. Trabajó en Yulop Uptalk creando puentes entre APIs REST/SOAP y código nativo con C++/CLI, y profundiza en gestión de recursos, el patrón Dispose y la evolución de .NET.
Chapters
Pues estamos aquí otra vez con las charlas que hacemos sobre lenguajes de programación. Esta vez tengo un invitado al que conozco personalmente. Hemos tenido algunas batallas juntos desde hace bastante tiempo y queremos hablar sobre un lenguaje que es bastante conocido, no como en el caso anterior, que bueno, Julia era poco conocido. En este caso hablamos de C#. Supongo que se llama así, ¿no? Incluso en español.
Sí, bueno, yo digo C#, pero porque yo soy bastante cutrecillo, pero vamos, C#, C#, sí, se dice C#.
Hablamos sobre este lenguaje, tengo aquí las preguntillas así un poco preparadas. Tu experiencia personal con este lenguaje, o sea, ¿cuándo lo descubriste y te llamó la atención como para aprenderlo?
Yo en aquella época ya no recuerdo si ya era MVP de C++ de Microsoft, creo que no. Yo empecé con la versión 1 del .NET Framework, de esas, yo recuerdo de esos eventos, y esos eventos no, esas páginas web y esas presentaciones que hacía Microsoft, que te presentaba las cosas con unos gráficos, te lo sigue presentando, vale, con unos gráficos así muy bonitos, con una arquitectura nueva, un desarrollo nuevo bajo Windows, un subsistema nuevo bajo Windows, que luego todo eso era mentira, estaba sobre 32 y demás, pero presentaba el lenguaje como un C++ más sencillo. Y lo que a mí me llamó la atención es que traía una librería gráfica bastante fácil de utilizar, traía un entorno de ejecución y una librería base bastante más completa que el C++, porque el C++ en aquella época pues era casi el runtime de C, y la STL, que bueno, pues aquello era complicado de manejar. Era más fácil de programar. Y bueno, pues no sé, creo que era gratis la versión de la primera versión. Y empecé con la 1.0 o la 1.1, no me acuerdo, e hice un programa. Además, me acuerdo del programa que se llamaba ZDelTempMac, que era un programa para borrar. No sé si lo sabéis, que los Mac guardan un montón de todos los metadatos que tiene el Mac, se guardan en ficheros ocultos que luego un disquete o un disco o lo que sea, un USB, luego te vas a Windows, lo metes en Windows y ahí hay un montón de ficheros que empiezan con .DSFILE. Luego tienes un fichero que se llama pepito.com, pepito.txt, y abajo .pepito.txt. Y todo eso, bueno, pues yo me hice un programa en C# y que borraba, no, ese fue el segundo, que borraba los temporales. El primero fue el ZX Fortunes. Los que sois linuxeros, tú serás linuxero o has usado Linux, hemos coincidido usando Linux en algún momento. Está el programa de Fortunes que cada vez que hacías login en la consola te sacaba una cita, vale. Pues yo hice una versión gráfica del ZX Fortunes con el C#. Yo lo iba a hacer con C++, pero salió el C# y dije, bueno, esto es mucho más fácil, tengo una librería gráfica, tengo para poner, bueno, pues lo hice. Yo recuerdo que la, creo que era la versión 1.0 o la 1.1, no recuerdo cuál, con el cual empecé, pero aquello no funcionaba bien, aquello tenía unos bugardos, aquello la parte gráfica no funcionaba, había cosas, mirabas en la referencia y no se guardaban los ficheros, no se leían los ficheros, se abrían los ficheros, aquello no. Y cuando ya estaba dispuesto a tirar la toalla y decir bueno, esto es una porquería, esto yo no lo voy a usar más, esto es lo peor que ha hecho Microsoft, porque te lo presentaba muy bonito y muy tal con el CLR y todo eso, y entonces sacaron la 1.2 creo que fue Y la 1.2 funcionaba todo lo que no me funcionaba en la 1.1. Simplemente recompilando la 1.2 funcionaba perfecto. Y bueno, a partir de ahí pues ya la Windows Forms, los famosos Windows Forms, el WPF, que también funcionaba horrorosamente mal. Yo recuerdo la primera, la primera versión es de WPF, lo instalé, la versión, la 3 creo que era, C# versión 3, lo instalé Y en 10 minutos saqué 20 o 30 bugardos. Aquello que yo sé, yo veía los vídeos de Microsoft que hacían una grilla, un grid, y abrías y se abría un vídeo reproduciéndose y cosas de esas. Y yo quería probar eso y a mí eso no me funcionaba. Cogía incluso el código que ponían ellos de ejemplo, yo me lo ejecutaba aquí y no me funcionaba. Al final terminó funcionando el C#. Y bueno, la etapa de Windows Phone en la que coincidimos, tuvo en otras cosas ello con Windows Phone, que recuerdo también aquello de de llamar aquello como era un programa oficial, o sea, era un programa, una empresa, pues yo tenía contacto directo con Microsoft y a veces me decían, pues Rafa, tío, busca la manera de que te funcione porque no funciona. Y bueno, pues, y actualmente, actualmente sí que uso C#, no lo uso mucho, no estoy completamente al día en las últimas novedades de C#. Pero sí que uso C#, normalmente cuando las aplicaciones donde yo, lo que yo estoy haciendo ahora, que conectan con servidores, pues suelen ser REST, son aplicaciones, conexiones REST, conexiones por WSDL, SOAP, vale, conexiones SOAP, ese tipo de conexiones que todavía vosotros pensáis que son antiguas y tal, pero siguen funcionando exactamente igual. Esto nuevo, este lenguaje nuevo que es de script que se llama ahora, que quería sustituir se refiere a todos los lenguajes de script, no me acuerdo cómo se llama ahora, que si te pones un espacio de más deja de funcionar. Ahí no me acuerdo ahora. Pues yo lo que hago es que ejecuto el asistente que me genera la estructura de clases en C# y hago un poquitín de código de C# y luego me lo paso por C++ CLI a las APIs, a las APIs no, sí, a la API nativa de las aplicaciones nativas que yo hago, y a partir de ahí lo uso. Y ese es mi uso actual más o menos del C#.
Con tanto follón se me ha olvidado, estábamos aquí con Rafa y te iba a decir que te presentaras. Me he metido en el primer tema y ya se nos ha ido. Si quieres presentarte ahora.
Vale, me presento ahora con delay. Ese thread se quedó, se quedó un bloqueo y se quedó bloqueado, y ahora se dispara. Y bueno, pues me llamo Rafael Ontivero, alias RFOG en Twitter y en Telegram, RFOG42 en Twitter y en Telegram y demás. Soy desarrollador de sistemas más, lo que yo llamo desarrollador de sistemas, algo a caballo entre sistemas embebidos y sistemas Vamos, que yo no desarrollo web, que yo no desarrollo frontend ni backend, desarrollo cosas de hombres. Y bueno, el PHP, algo de PHP me queda, me queda un poco grande el PHP, pero vamos, ahí estamos. Y tengo 3 podcast: Leñe al Mono, que es de goma, ahí para que no lo oigan los niños pequeños, ahí me desahogo. Pego gritos, hablo de desarrollo. Luego tengo otro que se llama Lo he leído, que es de mí, de lo que yo voy leyendo, algo que me, alguna cosa que me llama así mucho la atención, pues algún audio. Tengo otro podcast que se llama Ingeniería inversa de una patata, que ese tiene muy pocas, muy pocas, muy pocos audios porque es técnico. Ahí eso es técnico, todo lo más técnico que pueda hablar, que puedo hablar, lo Lo grabo ahí. Por ejemplo, he estado explicando cómo funcionan las VPNs a nivel de protocolos TCP/IP. Tengo grabado uno para protocolos de comunicación serie que lo iré sacando en unos días, son 5 o 6 audios. Y bueno, soy también participante de WinTablet, el podcast de WinTablet y el sitio web de WinTablet. Bueno, soy uno de los fundadores de WinTablet y bueno, Pues más o menos ese soy yo. Trabajo en Holanda, cerca, bueno, relativamente cerca de donde trabaja Manuel.
Y lo has dicho, que trabaja ahora mismo con C++, entonces C#. Yo sé que has trabajado en algunas empresas donde estabas trabajando directamente con C#. Ese también lo utilizas con, no creo que lo utilices con sistemas, no, para sistemas embebidos. ¿En qué empresa has trabajado que utilizase sobre todo C#?
C# la principal empresa fue en Yulop Uptalk, que fue en la que coincidimos vosotros. Ahí sí que era C# puro y duro. Y luego yo en la empresa anterior, que no voy a decir el nombre, también estuve haciendo un poquito de C#. Más que de C# era un poquito de C# y C++ CLI. Después estuve 2 meses en embarcadero, ahí era C++ puro y duro, MFC. Todo desarrollo de Windows, unas aplicaciones de millones de líneas de código, súper complicadas de entender. Estuve solamente 2 meses, entonces tampoco, tampoco tuve tiempo de coger, coger las aplicaciones, o sea, de aprender la aplicación y desarrollar nada allí serio. Y después me vine aquí a Holanda a una empresa de cajeros, pero no el cajero del banco, vale. Mundo es como muchas veces te encuentras, ay, tú haces esto y esto es fácil, no, pues no. Hay lo que son los cajeros automáticos, lo que son los ATMs, hay variaciones, hay cosas. Lo que no hacemos son cajeros de banco, hacemos cajeros automáticos pero no eso de cajeros de banco, vale, sistemas de pago automatizado y ese tipo de cosas. Y aquí, aquí como tengo que interactuar con muchos servidores que normalmente tienen, pues tienen no protocolos estándar sino acceso estandarizado, REST, SOAP, servicios de ese tipo, aquí sí que uso C# casi exclusivamente para hacer el puente. Hago la estructura, bueno, lo he contado antes, hago la estructura en el envoltorio de lo del servidor en C#, luego hago un puente en C++ CLI y luego ya trabajo directamente con mi aplicación. Y sí que es cierto que está donde estoy yo aquí ahora, tenemos una aplicación de servidor que lo que hace es que os tendré que matar después de contar esto. Monitorizamos la red, capturamos cosas de la red, reconstruyo lo que se ha capturado de la red, se procesa y se genera un tipo de resultado que luego, bueno, pues se le da al cliente y el cliente se va a la ATM y recibe su dinero pagado por la ATM. Eso está César puro, eso es, ahora no me acuerdo cómo se llama, de también de los protocolos de Microsoft. Servidor de Microsoft y demás. Y pero sí, la parte de intercepción de red, la parte de reconstrucción, la parte de análisis, todo eso es C++. Y la parte que analiza los gráficos, lo que se obtiene de la red, está en C#, pero está en los bloques unsafe que viene a ser C++, vale, punteros y trabajo, proceso de imágenes.
Te iba a preguntar, porque tanto tú como yo venimos de C, C++, y después hemos ido saltando a otros lenguajes de programación. Y yo recuerdo mi experiencia de saltar de C++ a Java ya hace muchos años, y la sensación de esto, esto es muy sencillo, esto es muy bueno, muy fácil, ¿no? Incluso me dio por ahí los primeros trabajos, pues intentaba implementar sobre todo lo máximo de Java que pudiese. Y bueno, tú has contado algo similar, pero con C#. En cierta forma han sido casi como antagónicos, ¿no? Peleándose ahí por quién se quedaba con esa cuota de mercado. Pero aún así, aunque lo hubiesen más fácil, ¿cuál es la parte que te has tenido que pelear más para aprender de C#?
Más que, más que para aprender, porque bueno, si yo siempre lo he dicho esto, que si sabes temas más sabes, cualquier otro lenguaje de programación, y es qué es lo que no lleva, qué es lo que tiene C++ y no lleva ese nuevo lenguaje de programación: herencia simple, virtualización, polimorfismo. Todo eso en C#, como viene de C++, y es mucho más complejo, mucho más difícil de entender y mucho más difícil de implementar y de construir, que puedes meter la pata hasta el fondo y no darte cuenta, hasta, hasta, bueno, ser complicado, bastante complicado de concluir dónde te has equivocado en la arquitectura o en la implementación. Todo eso en C# pues es trivial. Yo en C# lo que sí que he tenido y sigo teniendo peleas, y lo que, lo que esto me lo habrás oído a mí de cuando nos conocíamos, y es que en C++ no puede haber un mal programador porque en 10.000 líneas de código le revienta, ya no sabe por dónde salir. En C# puedes tener un programa muy gordo estropear el programa, tener un problema muy gordo y tener el programa en la calle con fugas de memoria y cosas. Mira, que digan que el César no tiene fugas de memoria, que Rust no tiene fugas de memoria y que Java no tiene fugas de memoria. Yo Java, tenemos una pequeña aplicación de Java que me entran los sudores negros cada vez que me dicen los que usan la aplicación y dice, Rafa, ¿puedes añadir esto? Me entran los sudores negros, pues yo Ni quiero, ni sé, ni quiero saber de Java. Bueno, la cosa es la gestión de memoria y la gestión de recursos nativos. César, si no lo haces bien eso, el disposing, el dispose, el dispose, dispose, dispose, disposing. ¿Se pueden decir palabrotas?
Mejor no, mejor no.
El dispose, el disposing, y la madre que parió al Helvers que diseñó eso. Porque yo creo que ni él mismo tiene claro cómo funciona todo eso. Si no construyes bien el destructor, digamos el liberador de memoria, por ejemplo, cuando tú accedes a un recurso nativo, recursos nativos son ficheros, sockets, recursos gráficos, elementos gráficos, si tú no sabes, no usas bien el dispose, estás liberando memoria, estás bloqueando memoria, no estás bloqueando memoria porque te la mueve, y te la saca, pero sí que estás bloqueando recursos nativos, manejadores de ficheros, punteros al GDI, al, bueno, ahora ya no es GDI, pero al sistema gráfico, todo ese tipo de cosas los estás quitando del sistema que ya no, que ya no se pueden usar. Es muy, muy, muy, muy complicado y muy fácil meter la pata y no liberar memoria, y eso yo siempre he tenido problemas de tener una aplicación y ver cómo va creciendo la memoria byte a byte, byte a byte, byte a byte, y ves cómo la dejas ejecutando por la noche, está ocupando 40K de RAM, y llega por la mañana y tienes 120K de RAM, y estás pensando, pero si está en un bucle, está abriendo un fichero y cerrándolo, abriéndolo y cerrándolo, abriéndolo y cerrando, o escuchando un socket, es un socket abierto, recibe algo, lo escucha, construye un fichero, lo guarda y no hace nada más, y ves cómo va creciendo la memoria.
¿Por qué?
Porque has implementado mal el dispose. Pero es que te vas a mirarlo, te vas a mirar la documentación y no está bien explicado. Yo using, abrir llave, using con lo que el recurso, using, using, using, using, using, using, aunque el ReSharper me diga aquí no hace falta using. Bueno, me da igual, yo using y voy encadenando los using y las excepciones. Las excepciones me tienen loco. A ver, ¿por qué si un fichero no existe o no se puede abrir Eso no es una excepción, eso es una cosa que yo espero y puedo controlar, pero lo tengo que controlar yo, lo puedo controlar yo. Lo abro, intento abrirlo, no se abre, vale, pues no se abre, hago un incremento en un contador, pongo un 1 y vuelvo a abrir un fichero con un 1, porque ese fichero pues está siendo usado por lo que sea, no una excepción ahí. Y tengo que estar con bloques try-catch, try-catch, try-catch. A mí eso me vuelve tonto, porque podemos discutir entre si es una excepción, si no es tal. Déjame que lo decida yo, vale. Déjame que lo decida yo. Entonces, cuando yo empezaron el C# empezó con los bloques, con los bloques try, try, creo que es try convert, por ejemplo. No me acuerdo ahora cómo se llaman. Try convert. A mí eso me abrió el cielo. Try convert if try convert. OK, sigo. O if not, mejor, if not try convert, vale, ya sé lo que tengo que hacer ahí, algo, mirar algo o controlar algo, y no una excepción que sí, a veces me acuerdo de controlar la excepción, pero otras veces me salta 4 niveles más arriba, y a ver tú. Luego encima paras el depurador ahí y tiene la excepción y dices, vale, pero ¿qué me hace? ¿Qué? ¿Cuál es el dato que me ha hecho esto? Te toca, bueno, pues hacerte que quería. No es tan fácil, vale. Me imagino que el Java pasará lo mismo y el Rust O sea, el Java y el Rust y todo el Go, el Go y todos estos lenguajes usados de verdad, usados para hacer aplicaciones de verdad y no para hacer chorraditas, yo creo, yo estoy completamente seguro que es igual de complicado de otra manera, vale, otro tipo de complicación.
Yo recuerdo la experiencia que hemos tenido incluso con Erlang, que tiene recolectores de basura, y como empiezas a hacer muchas operaciones que requieran de memoria, incluso crearon en Erlang una función para forzar a que se libere la memoria por el recolector. Entonces hay situaciones en las que no le da tiempo al recolector de basura de tomar la memoria y empieza a generar ahí un leak de memoria. Y entonces en esas situaciones tienes que poner la función específica. Así que sí, yo creo que los leaks de memoria, quieras que no, en ciertas situaciones pasan en todos los lenguajes.
En C# pasa igual. Si tienes muchos, muchos threads que están trabajando, liberando y asignando memoria, aquí ya te voy a decir otra cosa. También tienes la opción de GC.collect y 1, 2, 3, el, ¿cómo se llama?, la generación de la memoria. 1 es la memoria que lleva menos tiempo, 2 la que lleva más tiempo y 3 la que lleva más tiempo, o al revés, no me acuerdo. Y todo esto ahora con la inteligencia artificial, clic, clic, clic, ¿cómo es esto? Hazme una función que con overlays en C usando Win32 que me abra un fichero, me grabe estos datos con overlays, que es la manera más rápida que hay. Con overlays el puntero, el puntero no, bloque de memoria se llama así, y el fichero está en esta otra variable. Se lo dices, te da la función, le echas un vistazo, claro, y la copias. No necesitas documentación ni calentarte la cabeza. Lo que te iba a decir de la generación de memoria Tú ya sabes que yo soy bastante polémico y bastante, bastante peliagudo con este tipo de cosas. A ver, la gestión de memoria hay que pensarla, vale. Lo que no puedes hacer es que la función, tú tienes 3, vamos a suponer una aplicación que tenga 3 o 5 niveles de llamada, de un bloque de código te llama a otro bloque de código que te llama a 5 niveles, vale. Complicado, vale. 5 niveles desde mi punto de vista son muchos niveles. Bueno, pues organiza la memoria que el quinto nivel la memoria que asigna la libere, el cuarto nivel la memoria que asigna la libere, y vayas bajando así. Y si el quinto nivel necesita memoria, pues intenta, vale, intenta que la asigne el bloque más interno para que la generación de la memoria, cuando tú salgas del bloque cuarto, toda la memoria que has asignado se libere. Evitas que el recolector de basura te pare el programa, el programa, porque en C# el recolector de basura te detiene por completo el programa, te recolecte la basura, un tiempo ahí que pierdes que dependiendo de la cantidad de memoria y dependiendo de la frecuencia con la que haces eso pues puede ser una parte importante del programa y piénsalo así, no asignes a lo loco pensando que la memoria se libera sola, no asignes y y liberes a lo loco. Esto viene de la época de C, que tú puedes tener, dices, no, pero es que mi programa usa muy poca memoria. Sí, pero si usas memoria, la estás asignando en el nivel quinto de anidación, quinto de las llamadas, y no las liberas hasta en el nivel 1, pues normal, vas fragmentando la memoria y puedes tener, no sé, 16 gigas de memoria, tener, no sé, 10, no, 2 gigas de memoria y puedo hacer un malloc o un new y decir no hay memoria libre, pues organízate, vale. Pues en C# y en Java y en los demás lenguajes yo me imagino, o sea, en C# es así, vale, para evitar el recolector de basura, sobre todo, sobre todo si estás haciendo las cosas que soy yo, que estoy haciendo yo, que puede ser, no tiene que ser lo que estoy haciendo yo, pero sí puedes hacer, por ejemplo, un servidor que esté escuchando en un socket las peticiones de un cliente Y entonces bueno pues lo que te pida ese cliente en ese socket cuando termine el del thread pool cuando termine el thread que le has asignado a ese cliente pues que se procura que se libere toda la memoria y si no si necesitas que otro thread conozca eso pues organízate escribir un archivo mapeado en memoria hay que eso no lo tienes que echar escribe un archivo mapeado en memoria abre otro socket dentro de la aplicación y le envía lo que quieres enviar no sé ingeniatelo para no fragmentar la memoria y que el recolector de basura, en este caso, y encima es más el sistema de memoria, pues no te colapse con pocas asignaciones. No sé, es cuestión de entender lo que tienes entre las manos.
Te iba a decir qué te gusta del lenguaje para intentar cambiar un poco de la parte negativa a la positiva.
Pues lo fácil, lo rápido que compila, lo fácil que lo ponen con el C#. El esto de que modificas y continúas ejecutando, el hecho de que cambias. Y ahora las partes gráficas, las pocas partes gráficas que hago en C#, que ahora con el XML sigo utilizando XML, cambias algo del XML, le das al botoncito y te lo cambia en el programa. Se desarrolla muchísimo, muchísimo, pero que muchísimo más rápido. Que me gustaría que tuviera, por ejemplo, cuando tienes una excepción, vale, que te recopilara y pudieras decir de dónde viene la excepción, volver hacia atrás a donde tienes la excepción y que te diera los datos a ver dónde te ha reventado el programa. Sería una facilidad de depuración. Lo que más me gusta de C# pues básicamente es la facilidad de depuración y reconstrucción de código. C++ lo tiene también, pero ya depende de muchísimos factores. Yo, por ejemplo, que lo que estoy haciendo ahora es aplicar programación remota. Es decir, tú tienes tu quiosco, tu equipo donde está ejecutándose el código, y desde tu Visual Studio lo que haces es que lanzas el programa, conectas el Visual Studio al programa remoto, y de ahí depuras. Porque bueno, son máquinas específicas, no dejan de ser PCs, pero con versiones de Windows y con mucho hardware añadido al sistema, y tiene que ser así. Aún así, Visual Studio, cada versión y cada actualización de Visual Studio para C++ te permite más continuar la recompilación, pero en C# es caramelito, eso es un caramelito.
Visual Studio ha hecho casi como una conversión. Tenía el Visual Studio que era el antiguo, que estaba hecho en C++ y tenía las facilidades para C++, Visual Basic y todo eso. Y después ahora han hecho un cambio en el que creo que está hecho con JavaScript, ¿no? O algo por el estilo.
Mira, lo de JavaScript no lo sé. Hasta donde, hasta donde yo sé, está hecho toda la parte visual de Visual Studio está hecha en C# y XML. Y si no lo han cambiado, vale, si no lo han cambiado, está así. Por lo menos el Visual Studio 2018 creo que era, estaba así. Bueno, tienen que haberme oído las risas en Microsoft porque era la época en el que el XML fallaba como una escopeta de feria y yo todavía tenía, todavía era MVP y tenía contacto directo interno con desarrolladores y demás, pero fue empezar a desarrollar Visual Studio en XAML, empezaron a tener los de Visual Studio una cantidad de problemas con los bugs que había horribles, se quejaron, armaron un buen pitote y entonces fue cuando XAML y la parte de C# que trabajaba con XAML empezó a funcionar realmente bien. Ahora XAML está olvidado Vale, con el .NET Core y demás. .NET Core, el .NET que nació para no cambiarlo nunca más, y lleva ya 4 o 5 versiones que son incompatibles con la versión anterior. Y a mí esas cosas me causan pereza. Yo sigo con el .NET Framework 4.8, creo que es 4.8 o algo así, XML. Y si no lo cierran, y a lo mejor si lo cierran también, o sea, si lo obsoletan, yo creo que moriré ahí, moriré ahí, porque ya no metido en ese tipo de jaleos. Pero sí que me suena que las últimas versiones del Visual Studio llevan algo de JavaScript, JavaScript, TypeScript, la versión está mejorada o algo de eso me suena. No lo sé, no estoy, no estoy al día con eso. Yo ya perdí de estar al día. Yo ahora tengo mi aplicación, mi aplicativo, a ver, mi aplicativo 6,5 millones de líneas de código en C++. Que se dice pronto, que yo me las gestiono. A veces me las veo canutas para encontrar dónde está el problema. Código heredado, código que a veces que lo miro y me echo las manos a la cabeza. Entiendo, entiendo, porque yo también tengo mi, tengo 30 años de experiencia en C++, entiendo que en aquella época se hacían las cosas así, pero las ves y dedico mi pequeña parte de tiempo a refactorizar código antiguo. Y bueno, sí, lo que era la pregunta, la respuesta a la pregunta, sí, Visual Studio ha evolucionado desde estar escrito en C++ hasta el escrito en C#, y el funcionamiento es bastante, bastante bueno. Ocupa una cantidad de memoria increíble. Yo tengo la aplicación principal, como te he dicho, son, llega a los 6 gigas de memoria el Visual Studio con la aplicación cargada en depuración y tal, y la aplicación utiliza, gasta 400 megas de memoria en el en el equipo cliente, vale. Pero bueno, tienes el histórico de CPU, tienes, puedes poner puntos de control en la memoria, todo en C++, puedes poner, y en C# más todavía, puedes poner puntos de control en memoria y poner en ese momento la memoria que estás haciendo, recorrer el árbol de memoria, a ver, bueno, bastantes, bastantes cosas chulas que estaban en C#, los han movido a C++, y a mí todo eso me encanta porque me facilita el trabajo.
O sea, ya yendo a la parte de si alguien se quiere adentrar en C#, tú lo hiciste desde que entró la primera versión y teniendo una base de C++ y otros lenguajes que en cierta forma eran similares. Pero si alguien tiene que enfrentarse a voy a aprender C# y vienen de otros lenguajes tipo scripting y demás, ¿qué les recomendarías para hacerse con el lenguaje?
Que aprendan a hacer más, más. No, a ver, que se olviden de los lenguajes, o sea, que se olviden, no, no que se olviden de los lenguajes de scripting, que se olviden de los conceptos de lenguajes de scripting. Los conceptos de César son más, iba a decir, más programacionales, son conceptos más clásicos, más tradicionales, son conceptos, yo creo que son los conceptos de lo que es la programación real, de lo que es el desarrollo real. Tú, un en Python, en PHP, te pones a tirar ahí código y tal, y aquello es un intérprete. Y una variable ahora es, en Python no lo sé, pero en PHP sí, una variable es una cosa, luego es otra. Luego true igual a false te da igual, o sea, te da true. Luego false igual a true te da false. Y te quedas así mirando y dices, ¿qué me estás contando? O un array, vas a recorrer un array y te recorre los nombres de las variables y no las variables, y dices, ¿esto qué es? Olvidar de todo eso. C# es bastante más, es bastante más lenguaje de programación. Y lo que tienen que hacer es estructurarse la mente, no programación estructurada, pero estructurarse la mente y pensar que son, no quiero decirlo así, pero son más matemáticas, son más lógica formal que los lenguajes de scripting. Yo hace muchos años ya que no recomiendo, nadie me pregunta, también estoy un poco apartado del tema público público. Yo antes siendo MVP pues respondía foros y para allí para acá, iba a sitios a dar alguna charla de vez en cuando. Y yo ahora estoy apartado de todo eso. No sé qué libros hay para aprender C#, ni C++. Simplemente, casi antes que aprendes, que cogerte un libro de C#, un libro que te enseñe la programación tradicional. Me imagino que habrá libros de C# que empiecen con la programación tradicional, qué es una variable, qué es un bucle, qué función, todo ese tipo de cosas.
Sería casi como aprender primero los conceptos, los principios de programación, y ya después lanzarse al lenguaje.
Sí, exacto, porque los lenguajes de scripting pues no necesitas eso para aprender. A ver, si has ido, me imagino que si has ido a la universidad, has hecho una carrera de informática en la cual había desarrollo, pues todos esos conceptos te los han enseñado ya, y simplemente métete, recuérdalos y métete en el lenguaje. Pero si has aprendido scripting porque eres un autodidacta o te han enseñado en una academia o lo que sea, sin esos conceptos, a ver, los conceptos son bastante importantes. No te aprendas, el podcast no es con vídeo, pero yo aquí detrás tengo los, no sé si se ven, no se ve el detalle, yo por aquí detrás tengo los libros de este, ahora no me acuerdo del nombre, pero los tengo ahí detrás, pero no veo el, en fin, tampoco seas, estructures matemáticamente los libros, que no los he leído, vale. Pero sí un poquitín de conceptos y de la idea que hay detrás. Así, cuando te encuentres con una fuga de memoria, me digas, sepas por lo menos qué es la memoria, por qué, cómo se asigna, cómo se libera. Y además te diría que aprendieras C++, vale, pero primero, antes que C#, pero vamos, ese tipo, ese tipo, tener ese tipo de, aprender ese tipo de conceptos antes de empezar a programar con Y ha mencionado un par de veces lo del MVP.
¿Qué es eso exactamente?
El MVP es un programa, creo que sigue todavía, vale. Es un programa que, Most Valuable Professional, profesional más valioso o valuado, que es un premio que te daba, que te da Microsoft, vale, por ayudar a la gente en su momento. Ahora no sé en qué se ha transformado y ahora los Las titulaciones de MVP que veo ahora son unas titulaciones muy raras, de cosas muy raras que yo ni siquiera sé ya lo que es, porque me queda un poco obsoleto en temas de punteros de ellos. Siempre estaba antes al loro de Microsoft sacaba esta nueva tecnología, pues yo la probaba, la otra la probaba. Ahora yo tengo mis cosas y dejadme tranquilos en mi cueva. Era un programa, Microsoft te daba herramientas dependiendo del tipo de MVP, había MVP en su momento de César, de C++ creo que los de C++ siguen estando, te daban acceso a unos foros internos. A mí, por ejemplo, me daban, me dieron los 6 años o cosas así que estuve, me dieron acceso a, te daban acceso a todos los sistemas operativos, a mí por lo menos todos los sistemas operativos, la MSDN Enterprise esta que ahora no sé lo que vale, en su momento valía 13.000 euros. Yo tenía todos los años, me la renovaban el acceso a esta MSDN, que tenías bueno pues 40 licencias de cada sistema operativo, acceso a las debug, a las Checkered Debug Build de Windows, que ahora no sé si estarán, que son unas versiones de Windows que llevaban los símbolos de depuración. Y entonces tú a través del puerto serie ejecutabas tu programa o ejecutabas tu driver, podías hacer drivers, y con esas versiones tú ejecutabas tu driver. Ese Windows se iba, se reventaba por algún error, un problema, un bug en tu código y a través del puerto serie parabas ese Windows, podías detener el Windows e inspeccionar las tripas de Windows, las tripas de tu programa desde otro punto de vista. Bueno, pues todo ese tipo de acceso nos lo daban a nosotros. Y bueno, yo simplemente pues me cansé. Yo respondía a los foros, nos invitaban a la sede de Microsoft en España, en los que estábamos en España, los de Holanda a la sede de Holanda, los de Estados Unidos a la sede de Estados Unidos. Podías ir a la sede de Redmond si querías. Bueno, pues desde España me refiero. Y bueno, pues eso, teníamos un team líder en Microsoft, Cristina González, que creo que todavía sigue, y teníamos contactos. Yo tuve contactos con desarrolladores, con los desarrolladores de Visual Studio, con los desarrolladores de César, intercambiábamos pues opiniones y cosas dentro de los foros. Y bueno, yo al final me cansé. Al final es como como una dependencia que dices, yo era muy crítico, horrorosamente crítico con Microsoft, con Visual Studio, con los bugs de Windows. Y un día pues eso, me contactó, creo que fue Cristina, me dijo, ¿quieres ser MVP? MVP es tal y cual. Y esa criticidad que yo siempre la he tenido fue, conforme estaba mordida dentro, fue bajando, bajando, de mí, por mi parte, vale, fue bajando, fue me sentía mal yo coger y decirle, pero tíos, ¿de qué vais haciendo esto? Yo recuerdo, por ejemplo, cuando compraron Nokia, que compraron Nokia en dos etapas. Y yo, cuando me enteré de que compré Nokia, en los foros, guay, habéis comprado Nokia, la mejor compra que podíais haber hecho en la historia. Y luego dije, es que no habéis comprado Qt, volvieron a comprar Nokia y no compraron Qt. Si Microsoft hubiera comprado Qt, que era la librería base con la que Nokia hacía sus aplicaciones, ahora Microsoft sería lo, yo os digo que sería la reina, lo que era IBM en su momento, porque era una librería súper bien construida, una librería en C++ súper bien construida. Pero lo que estuviera en C++ es lo de menos, súper bien construida, súper bien hecha, y hubieran tenido una pata en los sistemas de tiempo real, de tiempo real real, vale, no Windows, los RTOS, una pata en Linux, una pata en macOS, una pata en los sistemas móviles, una pata en cualquier, porque Qt estaba y está disponible para todo ese tipo de plataformas. Y haber podido controlar un poco más, y no estaban metidos en César, le quitaron, le robaron a Borland, a Borland, a un barcadero, al Hellsberg, que era el corazón del C-Marmar Builder y del Delphi, de todo eso. Se obcecaron en cesar para quitarle la preponderancia a Java, para meter ahí la baza en Java, y yo creo que la cagaron. Y fue tremendamente, fui tremendamente crítico con ese tipo de cosas. Entró Satya Nadella Nadella, Sátiro en Natillas para los amigos. Y no sé si es porque yo había aflojado un poco los foros o por lo que sea, pero que ya no me, ya no me renovaron. Y para ser sincero, para mí fue una liberación. Se me acabó el NDA, el no disclosure, esto que no podéis decir según qué cosas que ellos te dicen que no puedes decir. Se acabó a los 2 años y fue una liberación. Yo allí pues volví a ser todo lo crítico que era en su momento, antes, antes de ser MVP. Evidentemente no puedes llegar allí al foro y decir, oye, sois unos imbéciles que no tenéis ni idea de lo que estáis haciendo, tal. No, no, había que ser políticamente correctos para presentarles las cosas. Y también aquello para mí suponía un esfuerzo, porque yo, bueno, si ya habéis escuchado, los que me oigáis y escuchéis mi podcast, pues bueno, es por ejemplo el que he subido hoy, el que he subido hoy, que no haya ningún niño cerca, vale. Pues ese tipo de cosas pues evidentemente no las podías hacer. Lo entiendo, a ver, son diferentes, son diferentes roles. Y bueno, pues eso, el MVP, no sé lo que será ahora, vale.
En cierta forma lo cuentas casi como si hubieses estado trabajando para Microsoft en lugar de colaborando con ellos.
En cierta medida, en cierta medida éramos con la excusa de la independencia, porque éramos totalmente independientes, vale, totalmente independientes. Yo a mí en una charla, en una reunión que nos invitaban por ahí a cenar y lo que fuera, en una reunión a mí se me ocurrió, en una comida, no era una cena, era una comida, a mí se me soltó cuando había entrado justo el UAC, esto de Windows que te saltas, se te oscurece la pantalla y tal, y a mí se me ocurrió decir que yo ni se me había ocurrido, no había mirado en el cómo funcionaba aquello, y a mí se me ocurrió decir Y digo, pues esto, esto esta noche me lo salto yo. Esto seguro que funciona de esta manera con el escalado del bucle de mensajes del Sasser. Y él hacía relativamente poco que había salido el Sasser y el Blaster, y yo dije, esto me lo salto yo esta noche. Y Cristina, toda enfadada, me dijo, Rafa, es que claro, tú no sé qué, no sé cuántos. Que eso me da una idea del miedo que me tenían a mí cuando yo, cuando yo decía cosas. Y al día siguiente me llamó y se disculpó, y le dije, Cristina, que no pasa nada, que yo dije aquello, tú dijiste aquello, simplemente por, por la injerencia de Microsoft, en, en mi opinión. Pero aún así éramos voceros, yo entusiasmado con, con cosas que luego, bueno, pues no eran como no te las presentan. Nunca es como te la presenta. Por ejemplo, ahora todo el tema de la inteligencia artificial, de Copilot y todo eso, tú ves esos vídeos que te presenta Microsoft y se te cae la babilla. Y yo he pagado el Copilot y no vale para nada, vale. O sea, no vale para nada, para Para nada. Tú tienes un PowerPoint con esto, PowerPoint con esto, y te repite frases que tú tienes en el documento, pero no son las frases que son importantes ni nada. Y el resultado no vale para nada, vale. Y la nueva ola que están sacando, que han sacado hace poco, me imagino que no, que tampoco valdrá para nada. Sí, éramos bastante, éramos bastante, como se dice, bastante vendedores. Gratuitos de Microsoft por tener la MSDN, porque nos llamaban y nos invitaban y tal. Aunque yo seguía siendo crítico, mis entradas en Geek.ms pues seguían siendo crítica, críticos con los bugs, con todo eso, pero comedido, vale, un poco comedido. Ahora ya no estoy comedido, estoy suelto, soy salvaje otra vez, desbocado totalmente. Exacto.
Entonces, sí, o sea, porque tu experiencia laboral se basa principalmente en C++ y después Te adentraste en C# desde el principio, casi que lo viste nacer y dar sus primeros pasitos, tropezar, y después ya salir andando. Creo que tendrá unos 20 años C#.
Pues por ahí, por ahí. La idea, yo cuando empecé a leer la documentación de C#, yo la idea, a mí la idea me me abrió los ojos. Dije, madre mía, qué ideas más chulas que hay aquí dentro. Yo estaba en una época que todavía no conocía Microsoft, que tiene unas ideas geniales, unas ideas de conceptos geniales, pero luego la implementación, tienen que pasar años y años y años para que funcionen como el concepto original. Y cuando funciona como el concepto original, que funciona súper bien, todo estable, todo tal, te sacan nuevas ideas, te lo sacan nuevo, te empiezan desde cero. Y repetimos, que viene a ser el paso del C# de la versión 3, 3 y medio, 3 por ahí, al .NET Core, vale. El .NET Core fue volver a empezar, no, claro, es que ahora lo vamos a hacer bien con la experiencia que tenemos ahora, vamos a hacer el .NET Core para multiplataforma, completamente multiplataforma, tal y cual. Ni el .NET Core es multiplataforma, ni han tenido, han tenido, creo que han sido 3 reinicios con incompatibilidad hacia atrás con el ABI, con el formato binario. Pero por ejemplo, las ideas del CLR, las ideas del CLR y del Jitter son geniales. Es lo que, es lo que Java debió, debió haber sido y no fue hasta Kotlin, creo que, creo que es ese Jitter que carga la aplicación y que te hace una pasada y que analiza estadísticamente el pseudocódigo y las partes más ejecutadas, vuelve a dar otra pasada y vuelve a dar otra pasada y es conoce, conoce el microprocesador exacto en el que estás ejecutándote y te vuelve a hacer otra pasada y te cambian las instrucciones por las del microprocesador. Si tienes una tarjeta de vídeo, te cambia instrucciones para la tarjeta de vídeo masivas, si así has activado el flag en la compilación. El concepto, y os digo una cosa, el .NET Framework 3.5 fue, fue, y el Framework 3.4 el 4, el 4 volvió a bajar un poco, pero el 4.52 y el 4.8 son unas implementaciones increíbles, vale. A ver, código escrito en C++ y código igual escrito en C#, tú tienes que hacerlo saber muy bien cómo el C++ y cómo, por ejemplo, los overlays de CreateFile de Win32. Olvídate del runtime de C, de de C++, accede directamente al Win32. Si no lo haces así, el código de acceso a ficheros en C# es más rápido que el de C++, vale. Y otras cosas, a ver, un socket con las clases de socket que tienen es súper fácil. Es, yo a veces aquí en esta empresa no, porque todo ese código de base, todas las librerías base ya están hechas. Yo de vez en cuando las actualizo un poco, el código Pero yo en otras, en otros trabajos yo me he hecho en C# y me he hecho un API, vale, y luego la he usado en C++. Yo como nací, yo es que lo que pasa es que nací luego con C++ CLI. Yo traduje un documento de Gershuter, que fue el padre de C++ CLI, que es C++ CLI era C++ y C# un puente. Entonces tú escribes una parte en C++ nativo otra parte en la sintaxis de C++, CLI, y entonces una clase puede tener, puede llamar a código de C# desde la sintaxis de C++, con lo cual tú a esa clase la llamas desde C++ nativo y está ejecutando, está ejecutando C#, vale, está ejecutando el runtime de C#. Del .NET Framework, y aquello, aquello era una gozada. Además, volvemos otra vez a lo del dispose y al disposing. Tiene lo que se llama el destructor normal, que es el dispose de C#, y el destructor de finalización, que en lugar de poner el arroba, está el tejadillo este, lo que está encima de la letra ñ, pones la exclamación hacia abajo, y ese es el destructor nativo. Y entonces sabes que se va a llamar primero al destructor del .NET Framework, que es el del jailbreak, y luego al destructor nativo. Y en el destructor de .NET liberas todo lo que has asignado de .NET, toda la memoria de .NET y todas las cosas de .NET. Y en el nativo, los handles de ficheros, los handles de socket, bueno, si no has usado el socket de C#, y todo ese tipo de cosas. Entonces Es lo que C# quiso haber sido pero no fue. Pero claro, es horrorosamente complicado. Eso sí que es complicado, las interactuaciones y el instanciar desde C++ un objeto C#. Y aquí sí que tienes que tener mucho cuidado con la memoria, con los bloqueos, porque si tú accedes desde C++, haces un gcroot de un objeto en .NET Framework desde C++, y se te olvida, te olvida, eso se queda bloqueado ahí, es un pestiño ahí en medio del bloque de memoria, y eso César no lo puede liberar hasta que tú no lo liberes. Entonces crear un auto GC, auto GC root, que cuando sale de ámbito se libera automáticamente, y hay que tener, hay que programar con mucho cuidado. Pero a mí me encanta, a mí me vuelve loco porque está en mis manos el control de la liberación. Yo he hecho aberraciones de código para en el destructor de finalización el handle que estaba nativo, que estaba abierto, lo he pasado a una variable global y otra clase de C++ me lo ha cogido. Así no lo libero y así no desbloqueo el fichero. Aberraciones, vale, que son aberraciones de desarrollo, pero a veces, bueno, pues como los goto te permiten hacer cosas chulas si sabes lo que estás haciendo.
Entonces, al final sería como una forma de, bueno, yo quiero hacer mi proyecto o tengo que hacer mi proyecto en C++ porque sea del sistema, pero le quiero incrustar una parte en alto nivel, y entonces esa parte la desarrolla en C#.
Exacto, es una manera de, nació el C++/CLI, nació para que el código legado, el código legacy Microsoft, creo que sigue llamando C++ legacy, una una franja de años que Microsoft se olvidó del C# pensando que el C#, que todo el mundo iba a implementar las cosas en C#, que esa es otra de las cosas malas que tiene Microsoft, que saca una tecnología y se piensa que todos van a correr como locos, van a tirar 6 millones de líneas de código o los no sé cuántos miles de cientos de miles de decenas o miles de millones de líneas de código que tiene el C# Builder o que tiene el Delphi o las aplicaciones de bases de datos, van a tirar a la basura y van a hacerlo todo en C#. Pues no, vale, pues no. Entonces es una manera sencilla de interactuar. Tú, por ejemplo, en C#, si tú quieres llamar desde C++ código de C#, tienes que, tienes que hacerte funciones, tienes que encontrar la firma de la función en C# y declararla con una sintaxis súper complicada. Ahí había sitios web que tecleabas la función en C# y te la daba en C++, el equivalente en C++ para obtener el puntero a la función. Y al revés, como una llamada de Win32 que para PTR y ese tipo de cosas, para llamar a, desde C#, llamar a una función nativa de C, porque las primeras versiones de C# no tenían acceso a partes de Windows y no podías hacer cosas de Windows, no hacías la la llamada nativa. Y una cosa que tiene muy importante C++ CLI, que te lo puedes pasar bomba, es que puedes controlar la máquina virtual de C#. Puedes llamar desde C++ nativo, puedes ejecutar una máquina virtual entre comillas de C#, inyectarle memoria, inyectarle datos, extraer datos y demás. Yo me divertí mucho pues reventando, como decía, no, es que C# no tiene fuga de memoria. Si le inyectas desde C++ CLI, le inyectas una DLL desde C++ CLI y te pones a recorrer el heap, obtienes, buscas dónde está el heap, te pones a recorrer el heap en un freeat de C++ y empiezas a escribir ahí datos aleatorios, yo te digo a ti que revienta, te aseguro que revienta. Además, pum, y desaparece de la memoria. Pero bueno, son por tontear y por, normalmente eso no lo haces ni te hace falta en un programa normal.
Si ahora tuvieses que hacer algún proyecto y te dicen, te diesen carta blanca en base a, puedes elegir o C++ o C#, ¿cuál sería tu elección?
Depende del tipo de proyecto. De hecho, el servidor que te he dicho fue una idea que tuvo mi jefe. Me costó casi un año no hacer el programa porque el programa en C# es muy fácil, es una grid, un grid que ve el cliente, vale. Pero me costó un año, un año entero hacer lo que exactamente la cosa de bajo nivel, y fue carta blanca, fue carta blanca y fue César. Pero depende de, evidentemente depende del tipo de proyecto. En este caso, pues todo el tema de la grid, de acceso a base de datos, había un acceso, había un acceso a base de datos, todas esas cosas se guardan en una base de datos de SQLite. Bueno, pues César, porque la interfaz la diseñé media hora tenía hecha la interfaz. Ahora es bastante más compleja. Básicamente, César, si puedo, César.
Y ha estado siguiendo la cosa porque se siguen haciendo mejoras y cambios en C++. Creo que Strostrup publicó hace poco en la última C++Conf, o C++Conf, no sé cómo lo llaman. Que iban a implementar los generics ya dentro de C++.
Sigo un poco al loro, solamente un poco al loro, porque ese tipo de cosas nuevas que trae las veo ya un poco, un poco, no ya excesivas, sino un poco otra vuelta de tuerca. Por ejemplo, cuando sacaron las enumeraciones con tipo Yo dije, esto es el no va más. Porque C#, por ejemplo, las enumeraciones tienen tipo. De hecho, en C#, quitando la aberración de object, de ref type a ref type a value type, por ejemplo, C++ eso lo controla, puedes controlarlo como te dé la gana. Un objeto que está en pila o que está en montículo, eso en C++ ref type, ref class, value class, y ya está. Y el C# cumple. En C# hay unas cosas de que los números pueden ser box, unboxing, pueden ser tipo referencia, tipo valor, y si lo hace de una manera tipo referencia, tipo valor, hace un boxing, un ghosting. Al principio era súper ineficiente, ahora el compilador sabe lo que estás haciendo y te lo arregla bastante, te minimiza ese tipo de cosas. Se me ha ido el santo al cielo. Ah, pues igual que C# para últimamente está añadiendo cosas, a ver, cosas que tienen, que quieren evolucionarlo porque sí, vale, que no hacen, no se usan mucho. Otras cosas inteligentes, por ejemplo, lo de las las enumeraciones con tipo de C++ es una cosa que a mí me molaba. Los módulos, por ejemplo, que es otra cosa que todavía no estaba muy en marcha, que es parecido a los módulos de Java y a los módulos de Python, vale. En lugar de tener una serie de includes que incluye un fichero cabecera, que luego el fichero CPP va aparte, y entonces a veces que se producen includes recursivos porque no has tenido en cuenta o necesitas una Por ejemplo, en C#, no puedes hacer. Mira, una manera súper fácil de bloquear memoria, no me acordaba hasta ahora, una súper fácil de bloquear memoria en C# es llamar a un objeto que llame al objeto que llama recursivamente, vale. No recursivamente, sino por ejemplo tienes clase A, desde clase A, desde dentro de clase A llamas a clase B, y luego desde dentro de clase B te hace falta un objeto de clase A y llamar dentro de clase B a clase A. C# te deja porque lo que básicamente lo que hace C# es de todo tu código fuente genera, a ver, no es así, pero para que me entendáis, para explicarlo sencillo, genera todo el código fuente, genera un fichero gigantesco y lo compila. Y cuando le falta algo deja el hueco, sigue compilando, cuando encuentra algo de lo que tú has puesto pone ahí el hueco y tal. Bueno, pues eso, cuando ejecuta ahí tienes un bloqueo, un interbloqueo de memoria que no se libera, no se libera la memoria en esa situación. Tienes que tener mucho cuidado con eso. Bueno, por los módulos es algo parecido a los, no sé cómo se llama en Python, pero que tú defines arriba, pones el nombre del módulo y lo usas, y ya está. Ni fichero cabecera ni nada. Yo no he llegado a probarlo, he intentado meter un bloque de, bueno, sí que he llegado a probarlo, he intentado meter un bloque de código en un módulo No he conseguido hacerlo funcionar, o es que ya soy, tengo la cabeza muy dura. Lo que me has hablado de los genéricos, pues hombre, estaría bien, estaría bien, porque cada template que genere su clase, que genere su tal, ahí engordando el código, pues sí, está también bien. Otra cosa que van a añadir bien también dentro de poco es reflexión. En C#, tú puedes obtener por reflexión, si tiene los permisos adecuados, Hay que mirar eso. Puedes obtener el nombre de la clase, cómo se llama la clase, el nombre de los métodos, un montón de cosas. Y eso parece ser que también lo van a implementar en C++23 o 26, no, en C++26 creo que es, lo van a añadir. Sí, es una buena idea porque el RTTI, C++ tiene eso desde el principio. Se llama RTTI, Runtime Type Information. Tienes que compilar con esa opción, pero es un poco truculento y un poco, un poco no, bastante, bastante cutrecillo, vale. Tú puedes obtener el nombre de una clase e instanciarla a partir del nombre de una clase, que eso en C# también lo puedes hacer, por ejemplo, pero es bastante tendente a error y bastante extraño. Parece ser que, pero yo te voy a decir una cosa, a mí todo eso me parecen cancamosas. ¿Sabes lo que tenían que implementar? Tenían que simplificar la STL y la parte de la STL, la librería de, la librería de base de C++, que antes se llamaba STL, ahora se llamaba, se llama la librería de C++, simplificarla un poquitín. Porque si miras los ficheros cabecera, y si miras los ficheros cabecera de Boost, que es la librería de la cual bebe la librería base, eso es un caos horrible. Te puede dar un error en tu código, que te equivocas en algo, y empiezan a salirte errores, errores. Si Sobre todo si usas GCC, bueno, te dices, vale, pues mira, voy a usar otra cosa porque esto ya no sé por qué, porque no me compila, vale. La tira de cadena de error, no sé ni dónde me está fallando mi código. Bueno, pues simplificar eso y hacer una librería gráfica, por favor, hacerme una librería gráfica. Coger Cairo, por ejemplo, coger Cairo. Yo qué sé, hasta la aplicación grande que nosotros tenemos utiliza Subrunner de Firefox, que lleva muerto ya un montón de años, que es un motor HTML. Y mi aplicación de decimales más controla su runner, y lo que ven los clientes es una página web. Que me tengo que pelear, me tengo que pelear con el HTML, lo odio con toda mi alma. Todo esto que lea la documentación. Sí, a ver, si ahora pongo aquí este, este, porque bueno, es con CSS, yo pongo aquí esta propiedad, entonces esta propiedad se hereda en la tabla y todos los textos heredados en esta tabla o esta alineación del texto en esta tabla ya se me van a centrar. Pues no, no se centran. Ya no sé si es un error de HTML, o sea, es un error de concepto que tengo yo, si es un error, un bug del SureRunner porque es antiguo, vale. No lo sé. Bueno, pues hazme, por favor, Strustrup, por favor, tío, déjate de cancamusas. Está muy bien, los genéricos están muy bien, vale. Son genéricos que me van a dar error en tiempo de ejecución, pues es así, prefiero los templates. Hazme una librería gráfica, vale, una librería que yo pueda hacer llamadas y yo tenga controles. Arréglatelas como puedas, me da igual un lenguaje de scripting como HTML con CSS CSS, me da igual, hazme una librería gráfica, vale. ¿Cuántos años tiene encima de más? ¿40? ¿80? ¿84? ¿86? O por ahí. Hazme una librería gráfica, coño, que la tecnología haya evolucionado lo suficiente. Bueno, librería gráfica tampoco es que me hagas ahí un grid que se despliegue y salgan vídeos reproduciéndose, vale, pero puñetas, un campo de edición de texto, un drop-down, los tabs de, y eso es estándar en todos los sistemas operativos, que funciona de diferente manera, pero todo eso es estándar. Hazme una librería gráfica decente, un control de reproducción de vídeo, un control de, un control de HTML que ejecute HTML. No sé, está, está como están complicando, es como si tuvieran que vivir, seguir viviendo los que están diseñando C++, y desarrollaran cosas también. Otra cosa, free, otra cosa que hay en proposal, free with reason, o sea, liberar memoria con razonamiento o con razón. ¿Qué coño es eso? ¿Qué es eso, tío? ¿Qué pones? Free mi puntero porque lo tengo que liberar ahora, punto y coma. No lo sé. Ahora encima, a ver, punteros desnudos, puntero lo que es un asterisco, un tipo de dato asterisco, el nombre de variable, solamente los uso cuando tengo que pasar datos a DLLs de la época de marigastaña que funcionan, que aceptan punteros a void, vale. Y yo sé, yo hago mi estructura de datos con pragma pack y todo eso para que tenga la estructura exacta que quiere la la DLL, le paso el puntero con el tamaño, con lo que me pide la DLL. Es para lo único que uso punteros en C++. Es que vamos, es más complicado. Bueno, vale, pues no uses punteros. Yo uso referencias, referencias a const cuando no se modifica, referencias a no const cuando tengo que se modifica lo que paso. Tengo hasta metadatos de, puedo poner corchetes in corchete, out corchete para que el compilador, pero hay que compilar con opciones, con solo probé una vez y no me gustó y no lo volví a usar. Microsoft lo usa en su librería con macros y con otra cosa más. Uso autopunteros, a ver, unique pointer, yo necesito un puntero que es único, unique pointer, lo meto en una cosa que se llama otro objeto de la librería de clases que ahora no me acuerdo cómo se llama, que te asegura que es a todos los threads, procesos, multi-terminal server equivalente en Linux a terminal server, lo que sea, sabes, que solo hay una instancia de esa variable. Construyes alrededor de eso un singleton, no sé, usa eso que está, que es una clase que está en la librería de C++. No me uses un puntero, autopuntero, punteros que se liberan cuando el autopuntero sale de ámbito. Se libera. Piensa un poco, hace el autopuntero, pasa, que lo pasas como si fuera un puntero, pero sabes que es un autopuntero. Pásalo a un unique pointer, no, pero por ejemplo un auto, no me acuerdo, hay 20 tipos de autopunteros, conócelos, vale. Y pasas el puntero, el weak pointer, por ejemplo, es un puntero que no lleva contador de referencia, que tienes tú que tener en cuenta cuándo lo vas a liberar, y por eso se llama weak pointer, vale, puntero flojo. Pero es una pequeña clase que te envuelve el puntero, que no añade nada de liberación, de casi nada de sobrecarga, y lo puedes pasar, lo puedes mover el puntero para allá, para acá, para allá, para acá, para allá, para acá, para allá, para acá, y cuando lo termines lo liberas, vale. El auto pointer, que ahora no se llama así, no me acuerdo cómo se llama ahora, que es un puntero que tú lo vas pasando el puntero a diferentes clases y vas trabajando objetos o a diferentes métodos o funciones o lo que sea, lleva un contador de referencia Y cuando el contador de referencia llega a 0, automáticamente llama a delete. Piensa un poco por la fragmentación de memoria, y que si el método de nivel 1 es el que crea el autopuntero, la última llamada a ese autopuntero sea un método de nivel 1, vale, para no fragmentar la memoria. Usa esas cosas y no es complicado. Y cuando necesites un puntero, lo necesitas, vale. Yo lo que he comentado antes de César, yo trabajo, necesito trabajar con gráficos raster, para mirar cosas dentro de los gráficos raster, un save, un puntero al gráfico raster, a lo que es el bloque de memoria del bitmap. Oye, ahí recorro, ahí compruebo, ahí chequeo, ahí tal, pero solo, solo cuando lo necesites. Y para finalizar con esto, te voy a decir más. Esos arrays, que es un array que tú defines el puntero, un pointer, y va recorriendo el array como un puntero, incrementando el puntero y y más cosas. Todo eso antes, cuando los compiladores de C++, los C front te traducían a C y luego era el compilador de C el que generaba el código, todo eso vale. Pero es que ahora tú generas un array incluso con new, haces un, creas un array con new, vale, con el tamaño del array dinámico. Y eso el compilador sabe que es un array, sabe que vas a recorrerlo en bucles Tienes parallel for, puedes decirle al compilador con las opciones de compilación adecuadas, oye, los for si puedes me los ejecutas en la tarjeta de vídeo, y te olvidas, te olvidas de los punteros y te olvidas, y tienes el array y tienes asignación de memoria dinámica y tienes liberación de memoria dinámica, genera ese array con un autopuntero, cuando sale de ámbito liberas el puntero. Es sintaxis un poquito más complicada porque eso sí que es cierto, el C++, la sintaxis del C++ es barroca. Yo ahora muchas veces le pregunto a Claude, que tampoco es que Claude vaya también con temas más, le pregunto a Claude, oye, ¿cómo pongo un autopuntero con esto? Y me quito de la cabeza la sintaxis, me quito de la cabeza la sintaxis de las plantillas, me quito de la cabeza todo eso, y simplemente yo me centro en la estructura del programa. Por cierto, Claude, mis bugs no me los encuentra, me los encuentro rollo, vale. Lo digo porque toda esta gente que dice que va a sustituir a los programadores, la inteligencia artificial y tal, va a sustituir a los programadores web que te hacen una web donde salen 2, como digo yo, 2 piticos de vaina bailando. Para las cosas serias web y no web, frontend, backend, sistemas embebidos y tal, no, no, ni ahora Ni mira lo que te digo, que quede escrito ni en 10 años. Y también te digo otra cosa, si ahora me viene mi jefe y te dice te voy a reemplazar con una inteligencia artificial, te voy a jubilar, le digo trae para acá que donde firmo. Así de claro te lo pongo.
Más bien le desea suerte, ¿no?
Exacto, exacto. Mira, subí una cuenta de Twitter que dice, no me acuerdo quién estabas tú en el hilo de Twitter, que alguien dice, imagínate que te llama tu empleador y te dice, vamos a simplificar, vamos a contratar a cambiar el lenguaje de programación de nuestra aplicación, vamos a simplificar no sé qué, no sé cuántos, tal y cual, ¿tú qué piensas? Y la gente empieza a responder que quieren deshacerse de ti, pero siempre el desarrollador senior, el que lleva, el que lleva el programa, siempre hay alguien que sabe más del programa de la empresa y controla todo. Y te viene el junior u otro programador, te dice, oye, mira esto, dice, mira esto, comprueba esto a ver si es, y resulta que es, vale. Experiencia, mili, como quieras llamarlo. Y yo puse 6 millones, le digo, jefe, 6,5 millones de líneas de código en C++, PHP, C++, CLI, C#, algo de ensamblador y tal. Buena suerte. Y salgo por la puerta y la cierro. Buena suerte, básicamente.
Sí, ahora también que ha surgido el tema de cuando estaba hablando de la sintaxis de C++, he recordado en la otra conferencia más de Google, creo que era de Google, o también de C++, con las conferencias de C++, en el que se presentó por parte de Google el lenguaje, bueno, el concepto del lenguaje Carbón. No sé si has oído un poco hablar de él y qué opinión te merece de momento el lenguaje.
Ya estás viendo que, bueno, tú me conoces de antes, pero los que no me conozcan de antes, que yo tengo opiniones bastante fuertes. No puedo decir aquí lo que pienso de Carbon, no porque tenga miedo del lenguaje de programación y me vaya a sustituir y todo ese tipo de cosas. COBOL está ahí, hay gente programando en COBOL. Se ha sustituido muchas cosas por Java, buena suerte. A mí eso no me da miedo porque pues si no, si tengo que aprender Carbon, pues oye, aprendo Carbon, pero es lo mismo que el Rust. Esos son cancamosas, esos son que llega alguien que dice bueno, pues voy a, como cuando me he dicho antes, Microsoft que quiere, que saca lo que sea y piensa que todo el mundo se va a tirar de cabeza a solucionar eso. No, vale, no. Si será un lenguaje, será un lenguaje, encontrará su nicho. Yo lo siempre relaciono con Rust, que yo llamo Rustidera, pongo Rust en mayúscula y luego -dera. Rust no va a sustituir a C++, no, porque, porque no, porque Windows, Microsoft, fíjate, salió la noticia de que Microsoft había hecho había empezado a hacer una DLL de Windows con Rustidera. Sí, vale, una función escrita en Rustidera, y la implementación es la siguiente: se llama a la función nativa, se llama a la función de Rustidera, y se comprueba si las dos funciones devuelven el mismo parámetro. Y por supuesto se hace caso de la función nativa. Porque es muy bonito, y esto es igual que con el Carbon, es muy bonito decir el nuevo compilador que hace el código más claro, el código más bonito, el código más tal, pero tú no sabes en ningún momento si ese compilador, aunque es determinista, aunque al mismo código fuente te genere el mismo resultado, que cada vez es menos, el mismo código binario, tú no sabes si la encadenación de esa secuencia de instrucciones en ensamblador o del Jitter, o de lo que ejecute, te va a disparar un bug en una instrucción del procesador, un bug en el núcleo de Windows, o de Linux, o de macOS, o de lo que sea, que te va a reventar la aplicación. Una aplicación de bancos que ha estado funcionando toda la vida escrita en lo que sea, tú la cambias por Java, tú la cambias por Python, tú la escribes por lo que sea, un servidor web crítico tú lo cambias, ese código lo cambias por TypeScript, lo cambias por, tienes un CGI hecho en C++ que está funcionando, lleva 20 años funcionando, y lo cambias por algo en JavaScript, y sí funciona, has hecho mil pruebas y funciona, y una concatenación de eventos con un evento de tal, no sabes si eso te va a reventar el sistema, te va a poner patas arriba el ordenador en un sistema crítico, no. Si lleva 30 años una función, 30 años con el compilador, sabes que es un compilador de confianza, sabes que esa parte no la cambian, sabes que el scheduler está funcionando 20 años sin ningún tipo de problema. Yo generé, a mí me ocurrió un problema de esos, vale. Yo contacto con aplicaciones de tarjeta de crédito, vale, que no es lo que os pensáis. A ti te da el banco, el banco no, El operador del terminal te da un terminal, te da una manera de preguntarle al terminal, y tú solamente puedes decir iniciar operación de pago de tanto dinero, y esperas allí. El terminal te puede enviar, decir oye, saca esto por pantalla, saca lo otro por pantalla, y te dice operación ocurrida, operación fallida, operación indeterminada. Todos los terminales funcionan igual, sea del Worldline, del terminal que sea, vale, y el protocolo que sea. Tú no accedes a nada del terminal ni puedes acceder ni nada, y ellos funcionan por su parte, a veces incluso con su propia red, vale. No puedes utilizar la misma red que está utilizando la aplicación y ya está. Y no sabes ni siquiera el número de tarjeta de crédito ni cómo se llama el operador ni nada. Te dice imprime este ticket, te da el texto ASCII o Unicode del ticket y ya está, vale. Pues yo he tenido problemas con intentar hacer cosas nuevas con el código, un código certificado que me ha dado, que me ha dado a mí el operador. Yo digo, qué código más ineficiente, qué chorrada esto, porque hace estos bucles aquí raros y estas cosas. Y este ejemplo me dice el operador que yo use ese código para acceder a su terminal. No, no, voy a optimizar aquí, voy a hacer aquí tal no sé cuánto, patatín patatán. Amigo, amigo, amigo, amigo, amigo, no funciona. Así que vuelta y al compilador arriba. Pragma, creo que es pragma no optimices este bloque de código que me ha dado el operador del banco. No optimices, déjalo como está sin optimizar. Por muy ineficiente, por muchos bucles que tenga, es una operación de banco, va a tardar 10 milisegundos, o sea, la rutina ejecutarse 10 milisegundos, me va a dar el resultado. No ejecutéis. ¿Me quieres reemplazar eso por Rust, por Carbon o por Go? No, no, no, no, no. Y hay motivos fundados.
Pues creo que lo vamos a dejar ya hoy, que nos hemos extendido bastante.
Llevamos un montón de tiempo.
Bueno, sí, pero ha estado interesante. Hemos hablado bastante de, bueno, sobre todo de C++ y bastante también del C#. Y la verdad es que ha sido bastante interesante todas las experiencias que has contado. Te agradezco mucho haberte pasado por aquí, habernos compartido tu experiencia. Y si quieres decir algo más para cerrar.
Bueno, pues gracias a ti por darme la oportunidad de desahogarme de manera políticamente correcta. Y bueno, ya sabes, yo encantado de, ya sabes, a mí me gusta charlar de estas cosas así como por los codos, te has dado cuenta. Y bueno, pues gracias por llamarme y ya está. Ya me he presentado antes, ya he dicho mis podcast y demás.
Pues eso es todo. Gracias por haber estado ahí escuchando nuestra charla de codeadores y nos vemos en el siguiente capítulo.










