Presentan en HN: Haystack, un IDE para explorar y editar código en un lienzo infinito
(haystackeditor.com)- Haystack se presenta como una herramienta de revisión de código que lee el historial de conversaciones y los cambios de un PR en conjunto, y solo envía al revisor los cambios que realmente requieren juicio humano
- Hace merge automático de los PR limpios y clasifica los PR riesgosos como candidatos a revisión, con el objetivo de acercarse a un flujo de “human code review time to zero”
- El PR de ejemplo paraleliza
tenancyInit()ycacheWarmup()conPromise.all()para reducir el cold start de aproximadamente 4 segundos a 2.4 segundos, pero revierte una decisión previa sobre el orden de ejecución - Haystack encuentra en el historial de conversación la razón por la que
cacheWarmupdebe ejecutarse después detenancyInit, y confirma en un sandbox 31 fallos en 50 arranques - El PR problemático se envía a
@maya, quien definió el orden original, y al PR se adjuntan la decisión de diseño rota y los resultados fallidos para reducir el tiempo de evaluación del review
Flujo para clasificar automáticamente los PR en revisión
- Haystack lee el historial de conversaciones y los cambios de todos los PR para evaluar su nivel de riesgo
- Los PR riesgosos se ejecutan y validan de extremo a extremo, y solo involucra a un revisor cuando realmente hace falta juicio humano
- En la pantalla se muestra a Haystack clasificando 16 PR
- Aparecen PR en varios lenguajes como TypeScript, JavaScript, C, Python, Ruby, Go y C++
- Cada PR se muestra con estado
analyzing
Ejemplo de cambio riesgoso: paralelización del bootstrap del servicio
- El PR de ejemplo
platform#3120 feat: parallelize service bootstrapintroduce un cambio para paralelizar las etapas de bootstrap del servicio - El código original ejecutaba
tenancyInit()y luegocacheWarmup()de forma secuencial - El código modificado ejecuta ambas tareas al mismo tiempo con
Promise.all([tenancyInit(), cacheWarmup()]) - Según la descripción del PR, el cold start había subido hasta unos 4 segundos, y tras paralelizarlo bajó a aproximadamente 2.4 segundos
- Todas las pruebas existentes pasan, así que a simple vista parece una mejora de rendimiento fácil de aprobar
La decisión de diseño que aparece en el historial de conversación
- Haystack lee el historial detrás del PR y detecta que el cambio revierte una decisión de diseño previa
@mayahabía pedido quetenancyInitterminara primero para evitar quecacheWarmupleyera una configuración vacía- La suite de pruebas no incluye ninguna verificación de ese orden de ejecución, por lo que la regresión pasa las pruebas
- La revisión de Haystack adjunta al PR la siguiente información
- La decisión registrada en el historial de conversación
- El comportamiento que el PR actual realmente modifica
- La razón por la que las pruebas siguen pasando
Validación en ejecución y resultados del fallo
- Haystack no se detiene en leer el código, sino que ejecuta directamente el cambio
- Como el historial de conversación apunta a una condición de carrera de timing que no está en las pruebas, arranca el servicio 50 veces en un sandbox
- En 31 de 50 arranques,
cacheWarmuplee una configuración vacía antes de quetenancyInittermine - Como resultado, el servicio lanza una excepción en la primera solicitud y se cae
- Haystack QA también muestra en el PR por qué ejecutó esa validación, qué prueba realizó y en qué punto se rompió
El punto donde hace falta revisión humana
- Haystack no hace merge automático de ese PR, y recomienda involucrar a
@maya, quien definió el orden de ejecución original - En el PR se muestran tanto la decisión de diseño rota como los resultados fallidos del arranque
- La pantalla de revisión ofrece opciones como “Request review”, “Chat with @maya” y “Doesn’t need review”
- El flujo de Haystack se enfoca en hacer merge automático de la mayoría de los PR y enviar solo los cambios riesgosos, como este ejemplo, a la persona adecuada
1 comentarios
Opiniones de Hacker News
No sé bien lo de las funciones de IA, pero la idea de trabajar con código sobre un lienzo y usar también una interfaz de diagramas de flujo es algo que quería desde hace mucho tiempo.
Trabajo principalmente con procesamiento de datos y dibujo muchos diagramas de flujo para explicar pipelines o entenderlos yo mismo.
Creo que una UI de desarrollo en esta dirección sería útil para lidiar con codebases difíciles de manejar creadas por personas que no estudiaron CS.
https://www.ni.com/en/shop/labview.html
Creo que la documentación visual se volvería mucho más fácil.
De verdad está genial. Me gusta que, al ir a un método o una declaración, no abra todo el archivo en una pestaña auxiliar desplazada hasta la definición, sino que muestre solo el fragmento de código relevante.
Suelo perder de vista el método que estaba leyendo porque necesito comparar dónde se llama un método con su definición, y eso es bastante frustrante.
Me gusta poder dejar un método “fijado” al lado y revisarlo sin desplazar por accidente todo el archivo en esa vista fijada.
Lo probé un momento y, lamentablemente, estaba muy centrado en el mouse; además, al seguir métodos dentro de otros métodos terminé con demasiadas ventanas flotantes que administrar.
Si hubiera flechas o líneas para poder rastrear qué ventana es la “padre”, sería más fácil crear una especie de diagrama de flujo.
Aunque personalmente le veo puntos flojos, me alegra ver otra forma de pensar en esta área y espero que les vaya bien.
Creo que es beneficioso saber más o menos qué está en dónde dentro del código.
Me pregunto si alguien podría pasar años en un proyecto y, por trabajar solo viendo pequeños fragmentos, terminar sin saber qué hacen realmente los archivos.
Está el código fuente con comentarios y texto mezclados, y también el código bien maquetado, con texto enriquecido e hipervínculos para navegar.
http://literateprogramming.com/
Me da curiosidad qué imaginas como punto de referencia para la “ventana padre”.
Quisiera saber si quieres designar una ventana específica como ancla, o si prefieres que alguna heurística encuentre esas anclas.
Felicitaciones por el lanzamiento. Últimamente voy justo en la dirección contraria, y por mi concentración y tendencia al ADHD me ayuda a reducir el estar saltando de un lado a otro hasta sentirme abrumado.
Una sola ventana, todo minimizado y, lo más importante, sin navegación por árbol.
Si necesito ir a un archivo, uso el menú de elementos recientes de Intellij o salto con marcadores de archivo.
Eso significa que tengo que recordar los marcadores de archivo y tener la intención de ir ahí. Uso el plugin IdeaVim para los atajos de vim.
Para mí, esta forma de trabajar hace que programar sea mucho más enfocado y disfrutable.
Es parte de un cambio de multimonitor a widescreen, y luego de vuelta a una sola pantalla.
En codebases grandes y maduras como las que mencionas, uso un LLM como guía.
En mi experiencia, los LLM cometen bastantes errores y hacen muchas suposiciones incluso con un solo archivo.
En mi experiencia, cuando le pregunto a un LLM dónde está el flujo de una funcionalidad, suele crear buenos puntos de entrada, pero a menudo tengo que averiguar los detalles por mi cuenta, y a veces apunta a lugares relacionados pero que no eran lo que estaba buscando.
Interesante. Tengo algunas notas.
Obsidian tiene una función parecida llamada “Canvas”, así que vale la pena tomar como referencia ese flujo de trabajo.
Para mí no sirve como herramienta independiente; la necesito como plugin de Idea.
La parte de crear layouts es lo que más detesto. Sería bueno tener una IA que tome un parche de Git o una corrección de bug y genere un layout acorde.
Compartir layouts debería ser muy fácil.
Sería bueno integrar el historial de Git como otra dimensión. También estaría bueno tener diff y anotaciones de blame dentro del editor.
Hay datos que se pueden usar para entrenar IA: los commits de Git.
También sería bueno integrar el debugging como otra dimensión, e integrar datos del profiler.
Es decir, obtienes tal cual lo que eso ofrece.
Si usas herramientas de la familia Idea, por ahora no parece haber forma.
Hace mucho que quería probar algo así. ¿Hay alguna forma de recibir actualizaciones?
En especial, estoy esperando aunque sea al principio una opción para desactivar las funciones de IA.
Me gusta especialmente la función de hacer zoom dentro de una función y ocultar el resto del archivo. Sorprendentemente, hubo muchos momentos en los que quise algo así.
También parece que podría usarse para arrastrar fácilmente al costado las funciones en las que estoy trabajando dentro de un archivo, como una forma de reorganizar virtualmente un solo archivo.
Además de la interfaz de edición, creo que dentro del editor hay muchas oportunidades de visualización.
Podrían hacerse visualizaciones de la interacción entre mi código y las dependencias de terceros, el grafo de dependencias/llamadas de mi código o una parte de él, grafos de dependencias a nivel de clase o módulo, o grafos de llamadas anidados que permitan profundizar hasta el grafo de llamadas internas de un objeto.
En todos estos casos, poder pasar sin fricción entre la visualización y la edición parece ser la función estrella a la que apunta esta herramienta.
Con solo incorporar gráficos al editor se abren muchas más visualizaciones interesantes, como mapas de calor de frecuencia de cambios en el código, mapas de calor de rendimiento del código, seguimiento del uso de variables, etc.
https://adamtornhill.com/articles/crimescene/codeascrimescen...
Por último, si no leíste The Programmer's Brain, al menos estaría bueno escuchar este podcast.
https://se-radio.net/2021/06/episode-462-felienne-on-the-pro...
Hay muchas ideas para editores relacionadas con cómo funciona nuestro cerebro, pero todavía no vi que estén bien soportadas en los editores.
Como ya dieron un paso en esa dirección, quizá haya muchas más oportunidades.
Vamos a pensar cuál es la mejor manera y, eventualmente, enviaremos actualizaciones directamente desde el producto.
Justo ahora estoy agregando el opt-out de copilot.
Las ideas de acá son buenas, y me gustaría conversar algunas. Si te parece bien, te voy a mandar un email/DM.
En general queremos hablar con varias personas, y pueden enviarnos feedback a feedback@haystackeditor.com.
Me encanta la forma de navegar de función a función, de archivo a archivo, y volver otra vez.
Para que sea más útil, estaría bueno tener un panel de historial de navegación, como el historial de visitas del navegador.
Al moverse entre archivos y funciones, que muestre una lista y permita ir hacia atrás o adelante, o saltar directo a cualquier punto del historial de navegación, sin tener que rebuscar entre las ventanas abiertas.
El historial de navegación del que hablo es completamente independiente del historial de edición.
Deshacer/rehacer ediciones no debería mover el historial de navegación hacia atrás o adelante, ni viceversa.
Por supuesto, podría haber atajos de teclado para moverse por el historial de navegación.
Genial. Está relacionado con Code Bubbles: https://dl.acm.org/doi/abs/10.1145/1753326.1753706
“No guardamos tu código ni lo registramos en logs. Enviamos fragmentos de código a Open AI como entrada para el copilot de navegación. Pronto agregaremos una opción para desactivar esto.”
Cuando esté esa opción, me gustaría echarle un vistazo.
Hay que abrir la paleta de comandos (CMD+SHIFT+P) y usar el comando “Opt out of navigational copilot”.
El soporte para Windows/Linux llegará pronto.
También vale aclarar que solo enviamos datos a Open AI cuando hay un diagnóstico que indica que se está llamando a una función inexistente.
Publiqué un paper que compara el tiempo de navegación entre un editor basado en canvas (Code Bubbles), un editor tradicional basado en pestañas (Eclipse) y un editor basado en carrusel que diseñé (Patchworks).
El resultado fue que el canvas ofrece demasiada libertad.
https://austinhenley.com/pubs/Henley2014CHI_Patchworks.pdf
Mirando hacia atrás, en VS Code ya casi no uso pestañas, porque tengo demasiados archivos abiertos.
Simplemente veo un archivo a la vez y, cuando necesito cambiar, busco con Cmd-P o me muevo entre archivos recientes.
Funciona bien, pero me obliga a tener siempre en la cabeza los nombres de archivos/directorios.
Encontrar métodos habría sido mucho menos problemático con una vista de outline ordenada alfabéticamente.
Si te parece bien, me gustaría conversar, y te voy a mandar un email.
Tengo de 4 a 6 paneles de código repartidos en varios espacios de trabajo, y cambio entre ellos con SPC TAB número.
Para usar bien la herramienta, en la práctica también hace falta suficiente pantalla ancha.
La clave es acostumbrarse a tratar los archivos en dirección horizontal, no vertical.
Ese pensamiento vertical está bastante arraigado en la forma en que escribimos nuestro primer Hello World.
Felicidades por el lanzamiento. Parece una herramienta excelente y bien implementada, y me entusiasma probarla.
Me recuerda a una función que he querido desde hace tiempo y que intenté crear manualmente algunas veces, pero nunca pude llevar a una forma compartible: la capacidad de desenrollar una ruta de código en un solo script o archivo fuente.
Me gustaría poder poner algo como un punto de interrupción y presionar un botón “unravel”, para que quede un único archivo que muestre todo lo que ocurre hasta ese punto.
Idealmente, sería aún mejor si ese archivo pudiera ejecutarse como un script único.
En esencia es la misma vista que ofrece un depurador paso a paso, pero en lugar de referenciar varios archivos y varias capas, quiero verlo todo de principio a fin dentro de un solo archivo.
Creo que cuando la gente se enfoca en detalles concretos de implementación en lugar de requisitos, parámetros y resultados, mucho se pierde en la comunicación.
Me da curiosidad por qué quieres esta implementación y qué función u objetivo debería cumplir.