Blog ·
Tres fallos que ningún script podía ver
Ocho artículos en ocho idiomas pasaron toda comprobación automática. Un lector halló un número inventado, media frase y un título que sus enlaces contradecían.
Por Provibr
Publicamos en nueve idiomas. El inglés es la fuente y los otros ocho son traducciones, y a su alrededor hay un muro de automatización: una comparación de estructura que comprueba que los encabezados, las tablas y las listas cuadran, una comparación de hechos que extrae los fragmentos de código y los números de cada párrafo y exige que coincidan, una prueba de tipografía por idioma, una comprobación de enlaces, una comprobación de tablas, un barrido de disposición a 390 píxeles.
Ocho artículos habían pasado todo eso. Después un segundo lector recorrió esos ocho en ocho idiomas y encontró cosas mejorables en todos ellos: 44 en neerlandés, 40 en alemán, 47 en español, 35 en francés, 39 en italiano, 22 en portugués, 55 en rumano, 23 en ucraniano, y 18 que cruzaban idiomas. La diferencia fue de exactamente 307 líneas fuera y 307 líneas dentro en 62 ficheros.
La mayoría son calidad de traducción corriente: un registro que se desliza, una cláusula que se lee como salida de máquina, un término que no es lo que dice el sector en ese idioma. Tres de ellas son otra clase de cosa, y esas tres son la razón por la que esto merece dejarse por escrito.
Un número que nadie midió
Un artículo describía una sonda de calibración: un script que planta defectos deliberados en una página y después exige que el detector los encuentre, de modo que una ejecución que informa de cero hallazgos pueda distinguirse de una ejecución que no estaba mirando.
Cuatro de las ocho traducciones decían que la sonda exige tres hallazgos.
Nadie lo había comprobado, porque un número dentro de una frase sobre las herramientas de otra persona parece un hecho heredado. El script planta tres elementos y exige cuatro clases de hallazgo. El texto fuente, en inglés, decía dos. Una nota escrita durante la revisión decía tres. Contando las traducciones, son tres afirmaciones sobre el número y dos valores distintos, y ninguno de esos valores es el que el script exige; cada uno se había arrastrado fielmente a varios idiomas.
La reparación no fue corregir el número. Fue quitarlo. La frase nombra ahora los tres defectos plantados por lo que son, y ninguna traducción declara ningún recuento, porque un recuento en esa posición no aporta nada que un lector necesite y queda a merced de un script que alguien editará.
La forma general: un número que salió de un resumen y no de la cosa que describe acabará desviándose, y se desvía en silencio, porque sigue siendo un número plausible.
Una frase que perdió su segunda mitad
Una frase en inglés establecía un contraste: esto es un rechazo, no un repliegue. En dos idiomas solo sobrevivió la primera mitad. Lo que quedó era gramatical, fluido, y decía algo más débil y ligeramente distinto de lo que decía la fuente.
Lo interesante es cómo se encontró. Seis de los ocho lectores, trabajando de forma independiente cada uno en su idioma, señalaron la misma frase. En seis idiomas ya estaba bien. Dos habían perdido el contraste y eran la razón de que siguiera saliendo.
Una comparación de estructura no puede ver esto, porque un párrafo con una cláusula menos sigue siendo un párrafo. Una comparación de hechos tampoco, porque ahí no hay ningún número ni ningún fragmento de código. Lo único que atrapa un contraste perdido es alguien leyendo la frase y preguntando con qué se contrasta.
Un título que no coincidía con ninguno de los enlaces que apuntaban a él
Nuestros artículos enlazan entre sí. La fuente inglesa del artículo cuatro tenía un título que describía una cosa situada junto a otra, y todos los enlaces entrantes usaban esa misma formulación.
En cuatro idiomas el título se había traducido como debajo de y todos los enlaces entrantes como junto a. Así que un lector pulsaba un enlace que prometía una cosa y aterrizaba en una página cuyo encabezado afirmaba otra.
La comprobación de enlaces deja pasar esto sin quejarse, y merece la pena ser preciso sobre por qué: verifica que el destino de un enlace existe y responde. Un enlace con el texto equivocado apunta a una página que existe. No hay nada que una comprobación HTTP pueda notar.
El arreglo es una regla y no una reparación: el título de un artículo y todos los enlaces que apuntan a él son una sola cadena en una traducción, y se revisan como una sola cadena. Eso es fácil de enunciar y fácil de olvidar, porque los dos viven en ficheros distintos.
Dos guardas nuevas, y por qué una de ellas tiene que contar hacia atrás
Dos de estas tres cosas están ahora automatizadas, y la automatización se demostró en rojo antes de confiar en ella, sobre una copia del árbol con defectos plantados dentro.
La primera guarda cubre los nombres intraducibles fuera de los fragmentos de código. La comparación de hechos ya cubre todo lo que va entre comillas invertidas. Lo que no puede ver es un nombre de producto, un nombre de protocolo o un elemento de menú que aparece en texto corrido sin ellas: esos son exactamente los elementos que los traductores traducen, correctamente por instinto y erróneamente de hecho. En una ronda anterior tres idiomas habían traducido el nombre de un menú; en otra, los ocho habían sacado una propiedad de CSS de un fragmento de código y la habían convertido en prosa.
La segunda guarda cubre los números escritos con palabras. La comparación de hechos normaliza los dígitos entre idiomas, de modo que los separadores de millares escritos como punto, como espacio o como coma se comparan todos como iguales. Es por construcción ciega a un número escrito con letras, y en este estilo de la casa casi todos los números de la fuente inglesa están escritos con letras.
Esa guarda tiene una sutileza que le costó la credibilidad a una primera versión. Cuenta las apariciones de cada valor por artículo, en la fuente como palabra o como dígito y en cada traducción como el numeral de ese idioma o como dígito. La implementación ingenua cuenta cada valor de forma independiente, y entonces «cuarenta y uno» cuenta también como una aparición de «cuarenta». En la primera ejecución eso produjo 37 falsos positivos, que son más que suficientes para que alguien concluya que la guarda es ruido y deje de leerla.
El arreglo es contar desde el valor más grande hacia abajo y borrar del texto cada coincidencia según se encuentra, de modo que, cuando se busca «cuarenta», todos los «cuarenta y uno» ya no están. Ese es un detalle de implementación pequeño con una consecuencia grande: una guarda que da falsas alarmas es peor que ninguna guarda, porque enseña a la gente a saltarse una línea de la salida.
En qué se equivocó el lector
Un hallazgo de la revisión era él mismo incorrecto, y resulta instructivo.
El lector de neerlandés informó de que se había perdido el énfasis sobre una palabra concreta en los ocho idiomas. Seis de los ocho lo tenían. El lector de neerlandés podía ver bien un fichero y había inferido el resto.
Eso es ahora una regla: un lector que trabaja sobre un idioma informa sobre ese idioma. Una afirmación sobre ocho ficheros es una medición, y necesita un script u ocho ficheros abiertos, no una impresión.
Hubo un hallazgo relacionado que resultó ser una división real y no un error. Cuatro de los ocho artículos neerlandeses usaban el registro formal y cuatro el informal. En todo el catálogo neerlandés, 47 de 90 ficheros son formales. Eso no es un defecto que arreglar en ocho ficheros; es una decisión que hay que tomar una vez y aplicar en todas partes, y la ronda la dejó por escrito en lugar de elegir un lado en silencio.
Seis cosas mal en la fuente
La revisión produjo además seis hallazgos que no eran problemas de traducción en absoluto. El inglés estaba mal, y ocho idiomas habían traducido fielmente aquello que estaba mal.
Deliberadamente, esos no se arreglaron en ocho idiomas. Se informaron contra la fuente y se trataron en una ronda aparte que cambió primero el inglés y después arrastró cada frase corregida por las ocho traducciones, de modo que las ocho siguieran siendo traducciones de algo y no ocho reparaciones independientes de la misma frase.
Esa ronda encontró algo también: la nota que describía uno de los seis estaba ella misma equivocada sobre los números, que es de donde sale el recuento de la primera sección de este artículo. Una corrección que no se verifica contra la fuente no es más que otra afirmación.
Lo que dejaríamos por escrito
- La automatización comprueba forma y hechos; no comprueba significado. Cada uno de estos ocho artículos estaba en verde.
- Un número heredado de un resumen acabará estando mal. Compruébelo contra la cosa, o quítelo.
- La mejor reparación para un número frágil suele ser ningún número. Nombre las cosas en lugar de contarlas.
- Un contraste perdido deja una frase gramatical. Solo lo encuentra un lector.
- Seis lectores señalando la misma frase es una señal sobre la fuente, no sobre seis traducciones.
- Un enlace con el texto equivocado apunta a una página que existe. Ninguna comprobación HTTP lo notará jamás.
- Un título y todos los enlaces que apuntan a él son una sola cadena. Revíselos juntos aunque vivan separados.
- Demuestre una guarda nueva en rojo antes de creérsela en verde. Plante el defecto sobre una copia del árbol.
- Una guarda con falsos positivos acaba ignorada, lo que es peor que no tenerla. Cuente de grande a pequeño y consuma lo que va encontrando.
- Un lector informa sobre su propio idioma. Una afirmación sobre ocho ficheros es una medición.
Para que quede claro qué es esto: la comparación de hechos recorrió 2432 párrafos sin ningún hallazgo, la comparación de estructura ocho artículos en ocho idiomas sin ninguno, la guarda de nombres 248 comprobaciones y la guarda de numerales 240 comprobaciones sin ninguno, la comprobación de contenido 815 de 815 ficheros generados idénticos byte a byte, el conjunto de pruebas web 4572 en verde, la comprobación de metadatos 288 de 288, los enlaces 153 de 153, las tablas 198 de 198 y el barrido de disposición 168 de 168 a 390 píxeles contra una construcción de producción. La prueba de tipografía se demostró en rojo con 28 correctas y 3 fallidas con defectos plantados y en verde con 31 después. Sin demostrar: sigue habiendo un lector por idioma y ninguno de ellos es hablante nativo, y en esta ronda no hubo ninguna medición de accesibilidad ni de desplazamiento de disposición. Dos cuestiones de terminología se escalaron en lugar de decidirse.
Del trabajo de plataforma en Provibr. Lo que nueve catálogos le hacen a un conjunto de controles fijos está en dieciséis mil claves, nueve idiomas, y un script de transformación que dañó tres artículos a los que nunca se le apuntó está en un script de conversión que abarcó demasiado.