El software se construye entre commits
(zed.dev)- DeltaDB es un nuevo tipo de sistema de control de versiones que versiona en conjunto las conversaciones con agentes y los árboles de trabajo que los agentes editaron
- Git está organizado en torno a commits individuales y no fue diseñado para manejar, junto con los cambios de código, las conversaciones continuas que ocurren mientras el código sigue cambiando
- DeltaDB registra no solo los commits, sino todas las operaciones que ocurren durante el trabajo como un flujo detallado de deltas, y asigna a cada delta un identificador estable
- Los mensajes y las ediciones que esos mensajes produjeron se registran lado a lado, y varias personas y agentes pueden editar simultáneamente el mismo archivo desde distintas máquinas
- La colaboración puede darse de forma más directa dentro de la conversación y del árbol de trabajo mientras el código se está creando, en lugar de depender de un proceso de revisión posterior a los commits y al push
Contexto y planteamiento del problema
- El equipo de Zed no estaba acostumbrado al modelo de pull requests, y había construido confianza y entendimiento compartido trabajando juntos en el mismo árbol de trabajo y discutiendo mientras escribían código
- GitHub solo permite hablar sobre el código después de hacer commit y push, pero en el equipo de Zed las conversaciones importantes normalmente ya habían terminado antes de ese momento
- Zed comenzó en 2021 con la intención de superar las limitaciones del commit, creando primero un editor a la altura de los mejores desarrolladores del mundo y luego ofreciendo dentro de él una mejor forma de colaborar
- Un problema que llevaban mucho tiempo pensando en el contexto de la colaboración entre personas se volvió todavía más importante al colaborar con agentes
- La conversación que genera código se está convirtiendo cada vez más en la verdadera fuente del software, y esa conversación debe poder referenciar y ser referenciada por un código que evoluciona continuamente
- Git está organizado alrededor de commits individuales, por lo que no fue diseñado para sostener esta conexión entre conversaciones persistentes y cambios continuos en el código
DeltaDB y el siguiente paso
-
No todos los commits, sino todas las operaciones
- DeltaDB divide el trabajo en un flujo detallado de deltas y, a diferencia de Git, que guarda snapshots por commit, registra todas las operaciones entre commits
- Como cada delta tiene un identificador estable, es posible señalar momentos específicos del proceso de evolución incluso mientras el código sigue cambiando
- El árbol de trabajo se versiona como el propio proceso de cambio, junto con la conversación que impulsa esas transformaciones
- Los mensajes y las ediciones que generan se registran lado a lado y no quedan separados
- DeltaDB incorpora árboles de trabajo replicados sin conflictos, de modo que varias personas y agentes pueden editar al mismo tiempo el mismo archivo desde distintas máquinas
- Los archivos son archivos reales; los agentes trabajan en ellos a través de la terminal y los usuarios pueden montar todo el árbol de trabajo en disco cuando necesiten usar sus propias herramientas
-
El código fuente ahora es conversación fuente
- Como las referencias quedan fijadas a deltas y no a números de línea, se mantienen incluso si el código se desplaza más abajo
- Desde cualquier línea de una conversación pasada se puede saltar al código en su estado actual o al código tal como lo había escrito el agente en ese momento
- Desde cualquier línea de código se puede encontrar la conversación que creó ese código y todas las conversaciones posteriores que lo tocaron
- Los agentes también pueden usar esta información para recuperar el contexto de fondo del código que están modificando
- Un agente puede incluso invocar al agente que trabajó antes sobre ese código para preguntarle por qué fue escrito de esa manera
-
No debería hacer falta hacer commit para colaborar
- El objetivo es que la conversación con agentes sea la única conversación necesaria para colaborar
- Los miembros del equipo pueden sumarse mientras el trabajo aún está en curso, hablar con el agente que realizó la tarea y dejar comentarios durante el proceso
- No hace falta esperar primero a que alguien haga commit y push para poder participar
- Los pull requests, los hilos de revisión y los comentarios en línea eran procedimientos para volver a adjuntar la discusión al código después, porque el código y la discusión estaban en lugares distintos
- Si el código y la discusión están en el mismo lugar, esos procedimientos desaparecen
- Git y CI se quedan con el papel de ejecutar verificaciones y conectarse con el mundo exterior, sin convertirse en el lugar donde la colaboración ocurre por obligación
-
Siguiente paso
- El software ahora toma forma no en los commits, sino en la conversación
- DeltaDB es un sistema de control de versiones para eso, y estará disponible para usuarios iniciales en unas semanas
- Si quieres probarlo antes, puedes anotarte en la lista de espera
1 comentarios
Comentarios de Hacker News
El trabajo entre commits es una sopa desordenada, así que aunque lo mires no le sirve a nadie. Reescribe el historial con
git rebasepara que cada commit sea pequeño y atómico, y para que la historia que cuentan los commits explique por qué quedó con su forma actualNo importa realmente en qué orden cronológico ocurrió. Estoy de acuerdo en que revisar pull requests llega demasiado tarde, pero el problema es que los pull requests están diseñados para revisar de una vez el resultado completo de la rama, así que es difícil hacer revisión de commits individuales. La solución no debería ser compartir todo el ruido, sino fomentar commits pequeños y atómicos para poder revisar el trabajo inicial antes de que se termine una función o corrección
En mi experiencia, el 1 es más común, quizá porque GitHub naturalmente apoya mejor esa forma de trabajo y porque los commits acumulativos pueden resolver parte de los problemas del 2. Si tuviera que elegir, creo que el 1 tiene mucho más sentido
No tengo una postura tan firme, pero creo que los agentes prefieren información adicional, aunque para algunas personas sea ruido
Demasiada gente descarta el historial con demasiada facilidad para que se vea “limpio”. No tiene sentido, pero curiosamente encaja con cierta lógica típica de algunos programadores
Mi forma de trabajar es hacer commits frecuentes, decenas de veces al día. Un commit es un registro de lo que pasó, y quiero que quede la mayor cantidad posible de ese registro. Varias veces
git bisectme señaló un commit pequeño, de una sola línea, que parecía no tener nada malo, y así encontró un bug sutil que solo se descubrió mucho despuésPara mí, el control de código fuente está precisamente para encontrar ese tipo de cosas. Si hubiera tenido que revisar cada línea de un commit grande, esos problemas habrían sido mucho más dolorosos
Por eso de verdad no entiendo cuando la gente junta a propósito todos los commits del tamaño de un PR y desecha la única parte de verdad útil del control de versiones. Como hay muchos en el mismo bando que el comentario padre, el plan del autor de llevar un registro más detallado parece que tendrá una lucha difícil
Es difícil imponer una buena higiene de commits a nivel de equipo, pero curiosamente a nivel de PR la gente sí suele cooperar bastante para escribir buenas explicaciones y mantener limpios los grupos de cambios
Esto suena como autocommits frecuentes con menos confianza en Git. Git puede manejar autocommits frecuentes perfectamente
Si quieres conservar la “conversación” de esos autocommits en distintos momentos mientras los enrollas en commits superiores más “limpios”, basta con usar de vez en cuando
git merge --no-ffy luego enfocarte en los commits superiores con herramientas como--first-parenten vez de en los commits de “conversación”El backend de Git ya tiene mucha optimización de base de datos delta en Git pack y otras herramientas; de hecho, lo que quizá necesite algo de trabajo es el frontend de Git—principalmente
--first-parent—y la enorme cantidad de interfaces de Git “primero/solo mapa de metro”. Mucha gente siente que ese diagrama es feo, confuso y desagradable, así que debería haber más interfaces con drill-down que correspondan a--first-parentgit blametambién se puede configurar para usar--first-parentEstoy de acuerdo con “el software se construye entre commits”, pero no con que “DeltaDB capture todo el trabajo entre cada commit”
Para empezar, se siente intrusivo. Tampoco quiero un grabador de pantalla funcionando 24 horas mientras trabajo. No es que esté mal que mis errores queden expuestos, pero si estoy haciendo bien mi trabajo, el valor que produzco queda en los commits, y eso se siente mucho menos intrusivo
Segundo, uso varias herramientas y no quiero integrar todo eso en una base de datos rara. Si en algún punto todo termina en “un proceso externo hizo algo”, ¿qué sentido tiene capturarlo todo? Está bien que Zed pueda integrar muchas cosas, pero eso no significa que yo quiera usar todo lo que Zed integra. La última vez que revisé, si usabas Claude Code en Zed con ACP, ni siquiera podías rebobinar y editar mensajes anteriores
Por último, personalmente creo que ya hemos perdido la esencia de los commits. La mayoría crea un conjunto arbitrario e ilimitado de cambios, luego ejecuta
git commit, ese paquete de cambios se revisa como un gran bloque y después los commits se aplastan. No es el fin del mundo, pero un commit bien trabajado a mano es realmente excelente. Si ejecutasgit blameen un proyecto que obliga esta forma de trabajar, vas a entender enseguida a qué me refieroCosas como DeltaDB solo refuerzan y consolidan la costumbre de agrupar commits sin mucho cuidado. Si quieres saber qué pasó, ahora se supone que debes reproducir de forma voyeurista la conversación que el usuario tuvo con un LLM
El último punto es interesante, pero también irritante. No logré convencer a compañeros de documentar cambios y motivaciones solo porque fuera una buena práctica de ingeniería útil para el equipo, pero todos sí están dispuestos a explicárselo a un LLM. En gran parte es porque el LLM lo necesita para hacer el trabajo, pero me parece interesante cuánto hacen ahora para satisfacer al LLM cosas que antes no habrían hecho. De pronto, cosas que extrañamente no estaban documentadas terminan documentadas en
CLAUDE.mdEl código que escribes entre commits es tu proceso de pensamiento. Escribes código, lo borras y lo vuelves a escribir mientras piensas
El código que termina en un commit está escrito para que otras personas lo entiendan, y es el resultado del proceso de escribir para pensar. No quiero que mis pensamientos queden serializados, versionados y accesibles públicamente
https://www.nature.com/articles/s44222-025-00323-4
Tampoco estoy seguro de que todos los estados intermedios entre commits sean relevantes o útiles. Pero siento que soy minoría
Si haces squash, lo único que queda como contexto es un bloque de 400 líneas que escribiste “de una sola vez” y la solicitud de funcionalidad a la que fue asignado ese código. No ayuda en nada
La peor persona que conocí escribía un módulo nuevo y no hacía check-in de nada hasta que medio funcionaba. Creo que también estaba relacionado con una autoestima frágil que lo llevaba a corregir a escondidas los bugs de su propio código sin decir primero que estaban ahí. Escribía código críptico que dejaba a la vista la ley de Kernighan, y para hacer eso le faltaban como 10 años más de experiencia. Presumía que su código era “poderoso”, y eso no era un halago sino una señal de alerta. Encontré bugs varias veces en el código de commits iniciales. De verdad dan ganas de decirle: por favor deja algo de rastro
No necesitas confesar que probaste cualquier cosa hasta encontrar el problema. Después de descubrir que sí se puede llegar al punto B, basta con construir la historia deseada de A a B. Puedes reordenar los commits de la forma en que los habrías escrito si hubieras sabido desde el principio exactamente qué había que hacer. Puedes descartar el 90% del código que escribiste y borraste enseguida, o cualquier cosa que no sostenga esa narrativa
En la aplicación de la ley existe algo llamado construcción paralela. Puedes saber que un sospechoso es culpable por hechos que no serían admisibles en juicio, pero tienes que redescubrir esos mismos hechos siguiendo el procedimiento. Como asegurar la basura el día de recolección, entrevistar a los vecinos, reunir suficiente evidencia circunstancial para obtener una orden de cateo y luego volver a encontrar esa evidencia
Pero soy escéptico porque siento que bastaría con crear un archivo de texto y poner referencias a commits. Tampoco entiendo por qué no usar Fossil. Como es una base de datos SQLite, ya puedes empaquetar ahí lo que quieras, y trae integradas todo tipo de funciones para referenciar commits
Había pensado probar Zed ahora que dicen que tiene keymap de emacs, pero ya no. Esto es una función demasiado invasiva, y no quiero para nada que un colega revise, pulsación por pulsación, todas las ediciones intermedias que hice antes de llegar a un commit público para revisión
Antes de abrir un PR, a veces pulo un poco el historial de commits en magit para que quede más lineal y fácil de digerir. Corrijo descripciones o junto commits adyacentes. Pero esta función básicamente tira por la borda todo ese aspecto del trabajo y dice: “colega, trágate esta manguera contra incendios de deltas y disfrútala”
¿Qué se supone que significa la frase “Lo que realmente queremos es simple. Que la conversación con el agente sea la única conversación que necesites”? No, está mal
Me da una mala espina pensar que es inevitable que Anthropic u OpenAI adquieran Zed. La idea es demasiado buena y el software también es demasiado bueno
En este momento hay muchísimas startups tempranas compitiendo en este espacio. En las últimas semanas, mientras hacía entrevistas, hablé con al menos dos
Para que estas herramientas logren consolidarse y tener éxito a gran escala, la competencia va a ser feroz. Aun así, no puedo quitarme la idea de que todo esto parece habilitar un nivel de vigilancia de desarrolladores que me resulta muy incómodo
Los commits son útiles precisamente porque ya fueron depurados. Lo que pasa entre medio es prueba y error, intentar algo y borrar callejones sin salida, y la mayor parte debería descartarse
Si guardas todos los cambios y mensajes del agente, lo único que haces es dejar esa basura ahí para siempre
Google probablemente lleva haciendo esto como desde hace 10 años con citc. No sé cuándo Gemini va a aprovecharlo de verdad, pero Google tiene de facto un registro casi completo de casi todos sus desarrolladores, prácticamente a nivel de Ctrl-S, desde hace al menos 10 años
Si Gemini se ve tonto ahora, es solo porque están ahorrando en asignación de recursos de cómputo
0 - https://en.wikipedia.org/wiki/Piper_(source_control_system)
Aquí no entiendo cuál es la propuesta de valor. He visto a varias empresas proponer más o menos este tipo de función, pero ninguna ha presentado una razón convincente de por qué esta tecnología debería existir.
Nuestra empresa es completamente remota y la mayoría de mis colegas no vive cerca de mí. Nos vemos por videollamada unas cuantas veces al día, pero nos comunicamos principalmente por Slack.
También vamos bastante adelantados en la curva de adopción de agentes LLM para escribir buen código. Gracias a modelos buenos y a barandillas de seguridad muy buenas en cierto harness de programación, hoy en día los LLM escriben la mayor parte de nuestro código.
Normalmente, en un día tomo un ticket, se lo paso al LLM y empezamos a resolver el problema juntos. Tomamos decisiones de arquitectura, hacemos un plan y lo ejecutamos. La función que desplegué más recientemente tuvo un costo de tokens de 19 dólares, y en su mejor momento el LLM siguió trabajando unos 30 minutos sin intervención mía.
Solo cuando no estoy seguro de qué dirección es mejor publico una pregunta en el chat del equipo para pedir la opinión de mis colegas. Pero muchos tickets se terminan de forma completamente autónoma.
Después abro un PR y publico el enlace del PR en Slack para pedir revisión, y es en ese momento cuando mis colegas ven la implementación por primera vez. A veces mis colegas hacen preguntas. Como los comentarios de GitHub no sirven muy bien para conversaciones rápidas en tiempo real, muchas veces ponen sus preguntas en un hilo de Slack en vez de en los comentarios del PR.
Las respuestas a esas preguntas están en el registro de chat con el LLM que tengo en mi laptop, pero no hay una forma fácil de mostrárselas a mis colegas. Así que termino jugando al teléfono descompuesto: copio la pregunta de mi colega desde Slack al chat con el LLM, y luego vuelvo a pegar la respuesta.
La idea de que mi colega, el LLM y yo podamos participar más fácilmente en la misma conversación me resulta muy atractiva.
Eso no significa que el equipo de Zed vaya en la dirección correcta, y también podría ser mejor que nuestro equipo trabajara de otra manera. Pero el enfoque actual es demasiado “exitoso” como para que haya mucha presión organizacional por cambiarlo.
El trabajo de un equipo de software es aprender en colaboración modelos que funcionen de manera efectiva en algún dominio. Expresamos esos modelos y ese aprendizaje en código, pruebas y documentación relacionada.
Por eso, por un lado estoy completamente de acuerdo en que los pull requests y la revisión de código dañan fatalmente este proceso, pero al mismo tiempo me incomoda la idea de crear de inmediato otro procedimiento y otro conjunto de entregables secundarios que nos distraigan. Todo eso debería hacerse visible en la codebase.
No en algo separado. No en mensajes de commit ni en un montón de ADR. Si la codebase no puede explicar por sí sola, de forma completa, el qué y el porqué tanto a humanos como a IA, entonces ha fracasado, y pasaremos la vida creando más procesos para gestionar ese fracaso.
El estado actual del código por sí solo no es suficiente para el desarrollo moderno de software.