Ir al contenido
Mastering Claude

Inicio / Verificar lo que devuelve

Verificar lo que devuelve4 minFondation

Dónde miras determina lo que encuentras

Una verificación centrada en el último cambio dice dónde se ha mirado, nunca dónde están realmente los defectos: sin haber examinado el resto con el mismo cuidado, ninguna conclusión sobre la peligrosidad comparada del código reciente y del código antiguo se sostiene.

Una revisión adversa relee casi siempre primero el último diff, el último commit, el bloque que se acaba de cambiar. Este alcance restringido es una elección razonable, pero produce un efecto engañoso si se olvida: lo que esta revisión encuentra depende ante todo del lugar donde ha buscado, no solo del lugar donde están realmente los defectos.

Un recuento sin denominador no compara nada

Afirmar que el código reciente es más peligroso que el código antiguo exigiría dos cifras: la parte del repositorio releída que era reciente, y la tasa de defectos encontrada en cada una de las dos partes, antigua y reciente, con el mismo esfuerzo de revisión. Sin estas dos cifras, un recuento de defectos encontrados en el último diff solo mide el alcance elegido, nunca la peligrosidad comparada de las dos zonas. Es un sesgo de selección ordinario, reconocible en cuanto se le pone nombre: contar solo los casos que se han notado, en lugar de la población entera, y luego generalizar a partir de ese subconjunto elegido, produce el mismo error, sea cual sea el nombre que se le dé.

El sesgo se verifica sin depender de ningún archivo vivo del curso, que se reescribe con cada corrección y daría una salida distinta en cada revisión. El siguiente comando fabrica él mismo los dos archivos que cuenta, antes de contarlos: un lector que lo repita en su propio equipo obtiene exactamente la misma salida, hoy como dentro de seis meses. Contar cuántas veces aparece una palabra en un solo archivo, y luego en dos archivos vecinos, da dos recuentos correctos y dos recuentos distintos, sin que ninguno de los dos diga cuántas veces aparecería esa palabra en un conjunto más amplio que no ha sido consultado. El comando cuenta aquí ocurrencias, no líneas: grep -c cuenta líneas que contienen el patrón, no el número de veces que aparece; grep -o imprime cada coincidencia en su propia línea, lo que wc -l puede luego contar sin confundir una línea que contiene la palabra una vez con una línea que la contiene tres veces.

$ printf 'Ce fichier decrit un défaut de comptage.\nUn deuxieme défaut apparait plus bas.\nUn troisieme défaut clot la liste.\n' > fichier-b.txt
$ grep -o "défaut" fichier-b.txt | wc -l
3
$ printf 'Ce fichier voisin decrit un premier défaut.\nPuis un second défaut.\n' > fichier-a.txt
$ grep -o "défaut" fichier-a.txt fichier-b.txt | wc -l
5

El alcance consultado determina el número encontrado. Tres, o cinco, depende únicamente del número de archivos abiertos por el comando, no de una propiedad más profunda del texto fabricado para la demostración.

Lo que sigue siendo útil a pesar del sesgo

Revisar en primer lugar el último cambio conserva sentido, no porque concentre forzosamente más defectos, sino porque es el único código que nadie más ha examinado todavía. Una línea antigua ya ha sobrevivido a varias revisiones y varias ejecuciones. Una línea escrita diez minutos antes solo ha sobrevivido a la revisión de su autor, y esa revisión inmediata repite la misma intención que produjo el error, si error hay: no puede verlo, como muestra la lección sobre un verde que aún no ha sido puesto a prueba. Es un motivo de urgencia, no un motivo estadístico.

Una guarda o un control recién añadido para corregir un defecto concreto hereda la misma urgencia: acaba de nacer, nadie lo ha puesto a prueba, y un verde que da hoy no prueba nada más que un verde dado por código nunca probado.

Figure 1

Lo que una revisión centrada revela, y lo que no puede decir

Revisión centrada en el último diff

Defectos reales, contados con exactitud en ese alcance concreto.

Lo que ese mismo recuento nunca mide

La densidad de defectos en el resto del repositorio, no releído con el mismo esfuerzo, por lo que no hay comparación posible entre código reciente y código antiguo.

El mismo alcance que revela defectos reales a la izquierda no dice nada de la densidad de defectos en la zona nunca releída con el mismo cuidado, a la derecha.
Calíbralo tú mismo

Un agente adverso recibe la instrucción de revisar el último commit de un repositorio en busca de defectos. Dedica veinte minutos a ello y reporta tres defectos, cada uno situado en las líneas modificadas por ese commit. Cada defecto va acompañado de un número de línea y una explicación de dos frases.

Escribe en una frase lo que este resultado establece, y en una frase lo que no establece.

Lo que hay que recordar
  • Un recuento de defectos limitado a un único alcance mide ese alcance, nunca la peligrosidad comparada del resto, a falta de un denominador común entre las dos zonas.
  • Buscar más en una zona hace que se encuentre más ahí: un sesgo de selección reconocible, que no necesita ninguna mala fe para producir un razonamiento fluido y falso.
  • Revisar primero el último cambio sigue siendo defendible, porque es el único código que nadie más ha examinado todavía, no porque los defectos se concentren ahí estadísticamente.
  • La revisión que un autor hace de su propio código en el momento de escribirlo repite la misma intención que produjo el error: por tanto, no puede revelarlo.
  • Una mirada externa, una persona o un agente que no ha escrito el código, prueba lo que una revisión hecha por el autor nunca puede probar.
Hazlo ahora

Pide a un agente en una sesión nueva, que no haya escrito tu último diff y no conozca tu intención, que lo revise con la única consigna de buscar una razón por la que sería falso. Haz que ese mismo agente revise después, con la misma consigna, un archivo que ha permanecido estable durante varios meses. Anota cuál de los dos pases da un defecto: eso te dice dónde mirar a continuación, no dónde están forzosamente los defectos más numerosos.