Situazione: un pezzo di software legge i frame di dati da un file in un thread separato e lo mette in coda, svuotato da un altro thread. Questo secondo thread verifica periodicamente la coda e fallisce in modo piuttosto garbato, mostrando un messaggio di errore che indica che la lettura è scaduta, se non ci sono dati disponibili entro un certo periodo di tempo. Inizialmente questo timeout era impostato su 200mSec. Non c'era un vero ragionamento dietro quella costante, però, ma ha funzionato bene. Abbiamo misurato su un paio di macchine e per frame di dati di grandi dimensioni, più grandi di quelli che sarebbero stati utilizzati dai clienti, una lettura ha preso come 20mSec con nessun altro carico sulla macchina.
Tuttavia un cliente ora riceve ora errori di timeout (al secondo tentativo va tutto bene, probabilmente il file è in cache o lo scanner antivirus lascia da solo). I programmatori sono come "beh, sì, ma quella macchina del cliente è piena di cruft, scanner antivirus, tonnellate di processi in background non necessari, ecc.". Ovviamente il cliente è come "hey dovrebbe funzionare, non dovrebbe?" Mentre i programmatori hanno un punto, dal momento che il software è abbastanza pesante da convalidare la necessità di una macchina dedicata, ciò non rende il cliente felice.
Aumentare il timeout a 2 secondi, ad esempio, risolve il problema. Ma mi piacerebbe prendere una decisione corretta ora invece di scegliere casualmente una costante magica che è probabilmente ok nel 99% dei casi. Quali criteri dovrebbero essere utilizzati per questo? Potremmo scegliere un numero elevato, ma questo sembra sbagliato. (e poi finiamo con un programma che ha l'orribile modo di appendere quando proviamo a leggere da un'unità disconnessa, per esempio, mentre preferiamo farlo mostrare subito un errore). Oppure potremmo rendere il valore di timeout come un'impostazione utente, ma poi dobbiamo documentarlo chiaramente e anche allora non tutti i clienti sono sufficientemente tecnici per capire veramente cosa fa. Oppure potremmo provare ad aspettare fino a quando un altro cliente non segnalerà i timeout e aumenterà nuovamente il valore. E di nuovo. Fino a quando non troviamo qualcosa per il 99,99% dei casi. Qualche buona pratica per questo tipo di situazione?