SimuLook · Notas desde la cámara

Las altas luces y las sombras se mueven en medios pasos, y las estábamos redondeando

Ajusta el tono de altas luces en una Fujifilm actual y el dial no va de −1 a 0 y a +1. Va −1, −0,5, 0, +0,5, +1. Lo mismo con las sombras. Esos dos controles, únicos entre los ajustes de tono, se mueven en medios pasos.

Nuestra aplicación los almacenaba como números enteros. Y todo lo que venía después de eso, también.

Lo que costó de verdad

Tres de las siete posiciones de la cámara con la que calibramos están en −0,5. Lee una de esas posiciones en la aplicación y el valor se redondeaba a la entrada: antes de guardarse, antes de publicarse, antes de volver a escribirse.

Las consecuencias se acumulan de una forma peor de lo que parece al principio:

  • Una receta que leías de tu cámara no era la receta que había en tu cámara. Estaba a medio paso de ella.
  • Publícala y todo el que la guardaba recibía la versión redondeada.
  • Escríbela de vuelta en una posición y la cámara acababa con un valor que nunca había tenido.
  • Compárala con la fotografía con la que se hizo y la aplicación informaba de una coincidencia exacta, porque ambos lados se habían redondeado hasta coincidir.

Esa última es la peor. Todo el sentido de comparar una foto con tu biblioteca es nombrar la diferencia. El redondeo convierte una diferencia real en una confirmación falsa.

El comentario ya estaba ahí

El redondeo no era un descuido que nadie hubiera visto. Había un comentario justo encima que decía que el modelo almacenaba el tono como entero, que los cuerpos actuales ofrecen medios pasos y que esa era una limitación de la aplicación, no de la cámara.

Alguien lo escribió, correctamente, y siguió adelante. Se mantuvo cierto durante meses.

Lo mencionamos porque la lección no es «comprueba tus tipos». Es que una limitación conocida escrita en un comentario no es una limitación arreglada, y un código llevará encima una descripción exacta de su propio fallo todo el tiempo que le dejes.

La parte que hizo delicada la corrección

La reparación obvia es cambiar el campo a decimal y enviar −0,5 al servidor. Eso habría roto la aplicación para todo el que no la hubiera actualizado.

Las versiones publicadas descodifican ese campo como entero. Ante una fracción no se degradan: fallan. Y como una página del feed de la comunidad se descodifica como una sola lista, una única receta con medio paso habría vaciado Descubrir para todos los usuarios que siguieran en la compilación anterior. Una receta, el feed de todo el mundo.

Así que el valor viaja dos veces. El campo antiguo sigue llevando el número redondeado que esos clientes ya leían, sin cambios. Un segundo campo lleva el valor exacto en la unidad de la propia cámara: el cuerpo guarda el tono en décimas, así que −0,5 es −5, que es un entero y esquiva la cuestión de cómo sobrevive un decimal a un viaje de ida y vuelta.

Dos pruebas sostienen esa promesa, en lugar de un comentario: una descodifica lo que escribe la aplicación actual dentro de una estructura con la forma del contrato antiguo y comprueba que sigue leyendo un número entero; la otra hace un viaje de ida y vuelta con cada campo, de modo que una propiedad que se quede fuera del codificador escrito a mano falla la suite en lugar de perder en silencio uno de tus ajustes.

Todo lo que venía después tuvo que seguir

Un valor solo se conserva si nada del recorrido vuelve a redondearlo.

Los dos editores avanzan ahora de medio en medio. Un editor de pasos enteros habría vuelto a redondear la receta en cuanto su dueño la abriera: la misma pérdida, una frontera más allá. La vía de escritura a la cámara envía las décimas exactas, así que escribir una posición que has leído de ese mismo cuerpo restaura ahora lo que realmente había. La comprobación de relectura mantiene su tolerancia para el ruido de coma flotante sin perdonar una diferencia real de medio paso. Y el comparador de fotos informa de −0,5 frente a 0 como una diferencia, y la nombra.

Por qué escribir esto

Porque la propuesta de la aplicación es que te dice la verdad sobre tus ajustes, y durante meses te estuvo diciendo, en voz baja, algo que estaba a medio paso.

La corrección está hecha. Las seis recetas que publicamos se corrigieron a sus valores exactos. Pero una aplicación que dice ser precisa tiene que poder decir cuándo no lo fue, o la afirmación es solo marketing.


Escrito durante el desarrollo de SimuLook, una app para leer y escribir recetas de simulación de película Fujifilm. Ver las cámaras compatibles · Leer las demás notas