Hace poco vi un documental sobre la historia de C++ y me gustó bastante. Aunque nunca ha sido mi lenguaje de programación principal, siempre me ha parecido interesante cómo una tecnología creada hace más de 40 años sigue siendo tan importante en la industria del software. Lo que más me gustó es que entrevista al creador del lenguaje y a varias personas que participaron en su evolución. Es genial escuchar, directamente de sus protagonistas, las historias y decisiones que terminaron definiendo uno de los lenguajes más importantes de la programación.
De su creación a convertirse en un estándar
Una de las cosas que me llamó la atención fue conocer cómo Bjarne Stroustrup comenzó a desarrollar C++ en Bell Labs, inicialmente como una extensión de C que permitía utilizar la programación orientada a objetos sin sacrificar el rendimiento.
También me pareció interesante conocer la historia de la Standard Template Library (STL) y cómo, con el crecimiento del lenguaje, comenzaron los esfuerzos para crear una biblioteca estándar y, posteriormente, estandarizar C++.
A veces utilizamos características de los lenguajes sin pensar en todo el trabajo y las discusiones que hubo detrás. Escuchar a quienes participaron en esas decisiones te da otra perspectiva.
Cuando Java parecía que iba a reemplazar a C++
Otra parte que me gustó fue cuando hablaron de la llegada de Java y de cómo muchos pensaban que terminaría reemplazando a C++. Cuando entré a la universidad en el 2004, se comentaba que Java iba a reemplazar ese lenguaje; de hecho, recuerdo cómo Java se volvió extremadamente popular, especialmente por simplificar aspectos como la gestión de la memoria. Parecía que los nuevos lenguajes iban a dejar atrás las tecnologías más antiguas.
Sin embargo, C++ nunca desapareció. Siguió siendo importante en áreas donde el rendimiento y el control del hardware son fundamentales. Me parece curioso cómo, en programación, muchas veces pensamos que una nueva tecnología va a reemplazar por completo a otra, cuando en realidad terminan coexistiendo durante décadas.
C++ sigue siendo un lenguaje moderno
Uno de los aspectos que más me sorprendió fue ver cuánto ha evolucionado C++. Todavía lo asocio con punteros, la administración manual de memoria y una sintaxis bastante compleja, pero el lenguaje moderno es muy diferente al que se utilizaba hace 20 años.
Con C++11 comenzó una modernización importante, incorporando lambdas, smart pointers y muchas otras características que facilitan el desarrollo. Desde entonces, el lenguaje ha continuado evolucionando con nuevas versiones del estándar.
Me parece impresionante que haya logrado modernizarse sin abandonar la compatibilidad con décadas de software existente, aunque esto también lo convierte en un lenguaje bastante complejo.
Otra parte que disfruté fue la participación de John Romero, uno de los creadores de Doom y Quake, quien habló sobre la importancia de C++ en la industria de los videojuegos.
Como alguien a quien le gustan los videojuegos y la programación, me encanta conocer las tecnologías que subyacen a muchos de los juegos que conocemos. Es interesante cómo C++ sigue siendo fundamental en el desarrollo de motores gráficos y videojuegos modernos.
Un documental que recomiendo ver
Una de las razones por las que disfruto de estos documentales es que permiten conocer la historia del software directamente de sus protagonistas. No es lo mismo leer sobre una característica de un lenguaje que escuchar a sus creadores explicar por qué decidieron implementarla.
Después de verlo, me quedó una mayor apreciación por C++ y su capacidad de evolucionar a pesar de todas las tecnologías que han surgido para reemplazarlo.
También me recordó que, en el desarrollo de software, no todo consiste en utilizar el lenguaje o el framework más reciente. Hay tecnologías que llevan décadas resolviendo problemas y todavía tienen muchísimo que ofrecer.
Si te gusta la programación, aunque nunca hayas escrito una línea de C++, te recomiendo ver este documental.
Con el uso de IA, Neovim se ha vuelto para mí más bien un editor para leer código y hacer cambios menores, gracias al agente de IA integrado. Mi forma de usarlo ha cambiado: ahora una parte importante del trabajo consiste en revisar lo que genera el agente, entender los cambios y ajustar los detalles que hagan falta.
Pero igual quería compartir los plugins que tengo en mi configuración, por si a alguien le sirven. Aunque escriba menos código directamente, sigo necesitando buscar archivos, moverme entre funciones, revisar diferencias y editar sin complicarme demasiado.
Los agrupé por función y dejé una breve descripción junto al enlace de cada uno. No hace falta instalar toda la lista: la idea es que encuentres algo útil para tu forma de trabajar.
Autocompletado y snippets en neovim
Para los cambios que sigo haciendo a mano, contar con un buen autocompletado y snippets sigue siendo útil. Esta es la combinación que tengo:
cmp-async-path: Completa rutas de archivos de forma asíncrona.
cmp-buffer: Sugiere palabras a partir del contenido de los buffers.
cmp-nvim-lsp: Conecta las sugerencias del LSP con nvim-cmp.
cmp-nvim-lua: Añade autocompletado para la API de Lua de Neovim.
cmp_luasnip: Integra los snippets de LuaSnip con nvim-cmp.
LuaSnip: El motor para expandir y trabajar con snippets.
friendly-snippets: Una colección de snippets para distintos lenguajes.
LSP, formato, linting y depuración
Que parte del código lo escriba un agente no elimina la necesidad de revisar errores, mantener el formato y depurar. Aquí entran estas herramientas:
nvim-lspconfig: Configuraciones para conectar los servidores de lenguaje con el cliente LSP de Neovim.
mason.nvim: Facilita la instalación y la administración de servidores de lenguaje, formateadores, linters y adaptadores de depuración.
conform.nvim: Permite ejecutar formateadores de código directamente desde el editor.
formatter.nvim: Otra herramienta para integrar formateadores externos.
nvim-lint: Integra linters para mostrar errores y advertencias en el código.
nvim-dap: Añade un cliente de depuración para trabajar con puntos de interrupción, la ejecución paso a paso y la inspección de variables.
Edición y navegación en neovim
Esta parte sigue teniendo bastante sentido para mí: si ahora paso más tiempo leyendo código, moverme rápido por él y hacer cambios puntuales importa mucho.
vim-commentary: Comenta y descomenta código con pocos comandos.
vim-surround: Añade, cambia o elimina comillas, paréntesis, etiquetas y otros delimitadores.
vim-exchange: Intercambia dos fragmentos de texto.
vim-visual-multi: Permite trabajar con múltiples selecciones y cursores.
vim-php-cs-fixer: Integra PHP CS Fixer para corregir el estilo del código PHP.
Archivos, búsquedas y proyectos
Encontrar el archivo correcto suele ser el primer paso para entender un cambio. Estos plugins cubren la exploración, las búsquedas y el manejo de proyectos y sesiones:
nvim-tree.lua: Un explorador de archivos en forma de árbol.
telescope.nvim: Permite buscar y filtrar archivos, contenido, buffers y otros elementos del editor.
neovim-project: Facilita cambiar entre proyectos y recuperar su contexto de trabajo.
vim-rooter: Ajusta el directorio de trabajo a la raíz del proyecto.
Git, tareas y sesiones en neovim
Con un agente haciendo cambios, revisar el diff es una parte importante del trabajo. Aquí también incluyo las herramientas para ejecutar tareas y mantener sesiones:
lazygit.nvim: Permite abrir lazygit dentro de Neovim.
git-blame.nvim: Muestra información del commit asociado a una línea.
gitsigns.nvim: Marca cambios de Git en el editor y permite trabajar con fragmentos del diff.
diffview.nvim: Ofrece una interfaz para revisar diferencias entre archivos y consultar su historial.
vim-signify: Muestra líneas añadidas, modificadas o eliminadas en el margen.
overseer.nvim: Permite ejecutar y administrar tareas, como builds y tests.
vim-obsession: Mantiene actualizados los archivos de sesión de Vim.
Interfaz y notificaciones
También hay plugins para hacer más cómoda la lectura, ver mejor lo que está pasando y recordar atajos. En esta categoría aparecen algunas dependencias que usan otros plugins:
indent-blankline.nvim: Muestra guías de indentación para seguir la estructura del código.
modes.nvim: Añade indicadores visuales de color según el modo del editor.
modicator.nvim: Cambia el color del número de la línea actual según el modo.
noice.nvim: Modifica la presentación de mensajes, la línea de comandos y otros elementos de la interfaz.
nui.nvim: Una biblioteca de componentes de interfaz utilizada por otros plugins.
nvim-notify: Presenta las notificaciones en ventanas configurables.
nvim-web-devicons: Proporciona iconos para tipos de archivo y otros elementos.
which-key.nvim: Muestra las combinaciones de teclas disponibles mientras empiezas a escribir un atajo.
menu: Permite crear menús, incluidos submenús, dentro del editor.
minty: Añade herramientas para seleccionar y explorar colores.
volt: Proporciona la base para crear interfaces interactivas utilizadas por otros plugins de esta lista.
IA, utilidades y Tailwind
Esta es la parte que más conecta con el cambio en mi forma de usar Neovim. La integración del agente convive con utilidades del editor y herramientas para leer estilos:
claudecode.nvim: Integra Claude Code con Neovim para compartir contexto del código y revisar los cambios propuestos desde el editor.
snacks.nvim: Una colección de utilidades, como terminales y selectores. También sirve de apoyo a la integración de Claude Code.
tw-values.nvim: Muestra los valores CSS asociados a las clases de Tailwind de un elemento.
Gestor de plugins, dependencias y tema
Por último, estas son otras piezas de la configuración:
plenary.nvim: Una biblioteca de funciones Lua que utilizan varios plugins.
lazy.nvim: El gestor para instalar, actualizar y cargar los plugins.
onedark.nvim: El tema de colores de la configuración.
La configuración sigue, el uso cambia
Viendo la lista, hay herramientas con funciones que se cruzan: más de una para formato, indicadores de cambios o sesiones. Comparto lo que tengo en mi configuración; no significa que necesites combinar todo esto para usar Neovim.
Lo que más ha cambiado es el peso de cada cosa. Con la IA, buscar, navegar y revisar código ocupa más espacio en mi trabajo. Y para eso sigue siendo útil tener un editor con el que me sienta cómodo.
Si usas alguno de estos plugins o tienes otro que te facilite trabajar con agentes de IA en Neovim, déjalo en los comentarios.
Mi experiencia en el podcast O corres o te encaramas
Hace poco tuve la oportunidad de participar como invitado en O corres o te encaramas, un podcast de Aníbal Rojas y Freddy Montes, en el que conversan sobre cómo distintas personas utilizan la inteligencia artificial en su trabajo y en su vida profesional. Así que cuando me invitaron a participar, obviamente me hizo bastante ilusión porque soy seguidor del programa desde sus inicios.
En este episodio hablamos sobre uno de los usos de la IA que más me ha servido durante los últimos años: apoyarme tanto en mi trabajo como desarrollador como en mi parte académica. De hecho, sobre cómo la usé para realizar la investigación de mi tesis de maestría en informática.
La IA y mi tesis
Uno de los temas principales fue cómo utilicé la inteligencia artificial en la redacción de mi tesis de Maestría en Informática. Creo que hay mucha controversia en torno al uso de la IA en la universidad, especialmente porque es muy fácil caer en pedirle a una herramienta que genere contenido y utilizarlo sin entenderlo realmente.
En mi caso, la experiencia fue diferente, pues utilicé la IA principalmente como una herramienta para acelerar procesos que normalmente consumen bastante tiempo: investigar temas, encontrar puntos en los que debía profundizar, organizar ideas y apoyarme durante la redacción.
Por supuesto, al final eres tú quien tiene que entender el trabajo que estás haciendo. La IA puede ayudarte con la tesis, pero frente al jurado respondes tú.
También conversamos sobre cómo utilizo estas herramientas para investigar y generar código. Algo que me ha permitido reducir bastante el tiempo entre tener una idea, investigarla y, finalmente, construir algo que pueda probar.
Hablar de mi lado académico
Una de las cosas que más me gustó del episodio fue poder hablar de mi trayectoria académica. Normalmente, cuando participo en eventos, escribo en el blog o hablo en redes sociales, termino conversando sobre programación, desarrollo de software, Linux, inteligencia artificial o alguna herramienta nueva que estoy probando.
Sin embargo, rara vez tengo la oportunidad de hablar sobre mi experiencia en la universidad, la investigación o el proceso de hacer una tesis. Por eso disfruté bastante esta conversación. Además, siendo seguidor de O corres o te encaramas desde hace tiempo, fue genial pasar de escuchar las conversaciones a formar parte de una de ellas.
Si te interesa cómo estoy utilizando la inteligencia artificial para investigar, programar y trabajar en proyectos académicos, te recomiendo ver el episodio.
La IA te ayuda con la tesis, frente al jurado respondes tú
Y si después de verlo tienes alguna pregunta, inquietud o simplemente quieres compartir cómo estás utilizando IA en tus estudios o trabajo, déjala en los comentarios.
Hace varios años desarrollé dos plugins para WordPress: JS Archive List y JS Categories List. Ambos nacieron cuando los widgets de WordPress se desarrollaban prácticamente por completo en PHP: creabas una clase, extendías WP_Widget, generabas el formulario de configuración y, finalmente, renderizabas el HTML. Funcionaba bastante bien, pero WordPress ha cambiado mucho desde la llegada de Gutenberg. Así que decidí migrar ambos plugins para que pudieran utilizarse como un bloque de Gutenberg. En el caso de JS Categories List, ocurrió desde la versión 4.0 y en JS Archive List desde la versión 5.0, manteniendo además el widget anterior en PHP por compatibilidad con instalaciones existentes.
Lo interesante de esta migración no fue solo aprender a crear un bloque. También me hizo ver, de una forma diferente, cómo ha evolucionado WordPress.
Se acabaron los tiempos de plugins 100% hechos en PHP, ahora es bloque de Gutenberg en JS (React) + PHP
De widgets en PHP a una interfaz en React
Un widget clásico de WordPress normalmente hacía casi todo en PHP. Por ejemplo, teníamos algo parecido a esto:
class My_Widget extends WP_Widget {
public function widget( $args, $instance ) {
// Obtener datos.
// Generar HTML.
// Mostrar el widget.
}
public function form( $instance ) {
// Formulario de configuración.
}
}
El formulario que veía el administrador, la configuración y el HTML final estaban muy ligados entre sí. Con Gutenberg la separación es diferente. Ahora puedes tener PHP encargándose de los datos y del renderizado mientras que el editor utiliza JavaScript y React para construir la interfaz de configuración.
Por esta razón, siento que WordPress cada vez se siente más como un CMS que ofrece servicios y APIs en PHP, mientras que diferentes interfaces consumen esos servicios.
Gutenberg es probablemente el mejor ejemplo, porque el editor trabaja con entidades como posts, páginas, usuarios o términos mediante @wordpress/core-dataQue internamente puede procesar los datos mediante las APIs de WordPress.
PHP no desapareció. Simplemente ya no tiene que encargarse de toda la interfaz.
¿Cómo comenzar un bloque de Gutenberg?
WordPress posee una herramienta oficial llamada @wordpress/create-block que genera la estructura inicial de un plugin con un bloque, incluyendo JavaScript, PHP, CSS y la configuración necesaria para compilar todo. Puedes crear uno ejecutando:
Aunque estés migrando un plugin existente, te recomiendo ejecutar este comando al menos una vez. Es una forma sencilla de entender cuál es la estructura recomendada actualmente por WordPress.
Entre los archivos encontrarás uno particularmente importante:
block.json
Este archivo contiene la definición del bloque: nombre, atributos, scripts, estilos y demás metadatos. Por ejemplo:
Con eso PHP conoce nuestro bloque y WordPress puede cargar los scripts y estilos necesarios.
La configuración del bloque de Gutenberg ahora vive en React
En un widget clásico, las opciones se construían con inputs HTML generados en PHP. En un bloque de Gutenberg puedes crear esa interfaz con los componentes que ya ofrece WordPress. Por ejemplo:
import { InspectorControls } from '@wordpress/block-editor';
import {
PanelBody,
ToggleControl
} from '@wordpress/components';
export default function Edit({ attributes, setAttributes }) {
return (
<InspectorControls>
<PanelBody title="Options">
<ToggleControl
label="Show post count"
checked={ attributes.showCount }
onChange={ ( value ) =>
setAttributes({ showCount: value })
}
/>
</PanelBody>
</InspectorControls>
);
}
De esta forma, Gutenberg se encarga de gran parte de la experiencia del editor y nosotros solo debemos definir qué opciones necesita nuestro bloque.
En mis plugins esto reemplazó buena parte de los formularios que antes tenía que generar manualmente desde PHP.
Consumir los datos de WordPress desde el bloque de Gutenberg
Otra parte interesante es que no necesariamente tienes que crear tus propios endpoints para obtener información que WordPress ya conoce. Desde el editor puedes consultar entidades utilizando core-data. Por ejemplo, para obtener páginas puedes utilizar:
WordPress se encarga de resolver la petición, de mantener los datos en su store y de entregarlos al componente. En un plugin como JS Categories List, el mismo concepto permite trabajar con taxonomías y categorías desde la interfaz del bloque, sin tener que imprimir previamente toda esa información en el HTML generado por PHP.
Eso también tiene otra ventaja, la nueva versión de mis plugins puede leer la información dinámicamente y cargar JavaScript y CSS solamente cuando realmente existe un bloque o widget en la página, en lugar de cargar recursos innecesariamente en todo el sitio.
No tienes que reescribir todo tu PHP
Esta fue una de las cosas que pensé inicialmente que serían más complicadas.
Migrar a un bloque de Gutenberg no significa necesariamente convertir todo el plugin a JavaScript. Puedes crear un bloque dinámico y continuar renderizando su contenido desde PHP, por ejemplo, block.json puede indicar:
{
"render": "file:./render.php"
}
Y dentro de render.php Puedes reutilizar buena parte de la lógica que ya tenía tu antiguo widget, permitiendo tener una migración más progresiva:
La interfaz del editor puede estar hecha con React, mientras que el frontend todavía utiliza funciones PHP que llevan años funcionando. Los bloques dinámicos están diseñados precisamente para casos donde el contenido debe calcularse al momento de renderizar la página, y WordPress permite hacerlo mediante un archivo render.php o un render_callback.
En mi caso, esto fue bastante útil porque no tenía sentido reescribir código estable solamente por utilizar Gutenberg.
Mantener el antiguo widget por retrocompatibilidad
También decidí no eliminar de inmediato los widgets anteriores. Tanto JS Archive List como JS Categories List mantienen una versión legacy en PHP para instalaciones que todavía la utilizan, mientras que el desarrollo nuevo está enfocado en el bloque Gutenberg.
Creo que esta es una buena estrategia para plugins que llevan muchos años publicados. Puedes modernizar el código sin afectar las instalaciones de los usuarios que configuraron el widget hace más de cinco años. Ya con el tiempo puedes dejar la implementación antigua únicamente en modo de mantenimiento.
WordPress es bastante diferente ahora
Después de hacer esta migración, creo que desarrollar para WordPress actualmente se parece bastante menos al WordPress con el que comencé hace años.
PHP continúa siendo una parte fundamental, pero ahora tenemos una capa de APIs, bases de datos, componentes y una interfaz escrita en React.
En lugar de pensar:
“Tengo que crear una página PHP para configurar esto.”
Cada vez pienso más:
“¿Qué datos o servicios debe proporcionar WordPress y cómo los va a consumir la interfaz?”
Ese cambio de mentalidad hace que Gutenberg tenga mucho más sentido. Así que si tienes un plugin antiguo basado en WP_Widget, no necesitas reescribirlo por completo de una vez. Puedes comenzar creando un bloque, mover las opciones del formulario a React y reutilizar tu código PHP para el renderizado. Luego moderniza el resto poco a poco.
Para empezar y entender cómo funciona todo, crea primero un bloque vacío con @wordpress/create-block, ejecuta npm start Y comienza a modificarlo. Es probablemente la forma más rápida de dejar de ver Gutenberg como algo extraño y comenzar a verlo simplemente como la nueva interfaz de desarrollo de WordPress.