Potrei capire questa preoccupazione fortemente nelle aree in cui stai coprendo ogni singolo pollice dell'hardware, come un motore di gioco AAA di nuova generazione multithread che utilizza ogni singolo core della CPU, intrinseci SIMD, GPU, GPGPU, ecc. Mentre offri una piattaforma multi-piattaforma Prodotto.
In quei casi, il tuo peggior incubo sarà spesso quei casi in cui i tuoi test (unità e integrazione) passeranno per le prime 5.000 macchine / piattaforme disparate testate, ma falliranno per il 5.001 a causa di un bug del driver per un oscuro modello GPU Solo pensando questo mi dà i brividi - non è possibile testarli o prevederli in anticipo.
Soprattutto se scrivi shader di GPU, puoi finire per giocare a una lotteria inversa in cui metà del codice che scrivi invocherà comportamenti indefiniti, poiché ci sono poche garanzie standard portatili applicate da tutti i modelli / driver GPU coinvolti. Mentre sta diventando sempre meno come giocare a dragamine in questi giorni, questo dovrebbe dare alla gente qualche idea: http://theorangeduck.com/page/writing-portable-opengl . Provarlo alla fine degli anni '90 e all'inizio degli anni 2000 fu davvero orribile, ed era un dragamine fino in fondo.
Per questo tipo di casi, spesso hai bisogno di team di oltre 10.000 tester con una gamma davvero ampia di hardware e sistemi operativi per solidificare davvero il prodotto e sentirti sicuro prima di rilasciarlo in modo stabile. Non tutte le aziende possono permettersi di avere una base di test così ampia, e non tutte hanno la disciplina per farlo nel modo giusto (tutti i problemi ampiamente evidenti dovrebbero essere risolti prima di avere così tanti tester in qualche fase interna pre-alfa / alfa oppure un'inondazione di report ridondanti può gettare gli sviluppatori in un panico patch-and-pray).
Ciò che raccomando in questo caso è quello che altri hanno suggerito, concentrarsi su una serie distribuita di test di integrazione. È possibile raggrupparlo con il programma di installazione, richiedendo agli utenti di passare un controllo di diagnostica di base con attenzione prestando attenzione a fornire dettagli sul motivo per cui l'installazione non è riuscita e possono essere trasferiti all'utente.
Un'altra cosa (se riesci a convincere il capo) è avere una vasta gamma di hardware disponibile per un'integrazione contigua. Maggiore è la varietà di combinazioni hardware / OS, più è bello. Volete anche una varietà di hardware di merda che modella i minimi requisiti hardware minimi per i vostri server CI: non lo sapete mai.
Ma c'è un'altra cosa che suggerirei:
Registrazione
Se hai a che fare con qualcosa di simile allo scenario che ho descritto sopra, spesso non puoi probabilmente testare queste cose che tendono ad essere le più problematiche (quei peggiori possibili problemi che si presentano nel momento peggiore possibile e non possono nemmeno presentarsi nemmeno nel suite di test più esaustiva poiché è un problema limitato a una combinazione hardware / SO molto specifica).
Tuttavia, la maggior parte di questi tipi di problemi come oscure incompatibilità hardware o vere e proprie anomalie del driver o collegamenti contro il dylib sbagliato (non ho mai affrontato questa preoccupazione) non ti porterà molto lontano all'avvio del software. Di solito si schianta e brucia abbastanza presto, parlando rozzamente.
Raccomando, per amor di sanità mentale, di abbracciare l'inevitabile. Non puoi assolutamente fare nulla riguardo a queste cose che non puoi assolutamente provare in modo completo. Non cercare di prevenire l'uragano (impossibile), ma sali su quelle finestre.
In genere qui, la cosa migliore che possiamo fare è scoprire il problema il più presto possibile, dove si presenta il più dettagliato possibile (per restringere il nostro elenco di sospetti) e risolvere il problema al più presto dopo che è stato segnalato.
In questo caso, la registrazione può essere un vero toccasana. Per questo tipo di campi, puoi creare questi log tecnici di spam che nessuno avrebbe mai letto. Spesso è rilevante solo l'ultima riga registrata nel registro prima che l'utente abbia riscontrato un arresto anomalo a causa di un errore del driver, ad esempio È possibile scrivere un processo esterno o un hook che monitora gli arresti anomali e quindi mostra l'ultima riga del registro che gli utenti possono copiare e incollati, ad esempio oltre a un crash dump.
Poiché ciò spesso richiede informazioni granulari e molte delle aree più sensibili nel codice a questi problemi hardware / piattaforma / driver sono critiche per le prestazioni, c'è questo problema imbarazzante in cui la registrazione può avvenire a una frequenza così frequente da rallentare effettivamente giù il software.
Un trucco utile in questo caso è fare affidamento sul presupposto che qualcosa eseguito una volta verrà eseguito correttamente la seconda volta, la terza volta, ecc. Questo non è il presupposto più valido, ma spesso è "abbastanza buono" (e infinitamente migliore di niente) . Con ciò, puoi usare un po 'di stato esterno per tenere traccia di quando qualcosa è già stato registrato e saltare i successivi tentativi di registrazione per quei casi davvero granulari in cui il codice verrà invocato ripetutamente in un ciclo.
Spero comunque che questo aiuti. Mi sono imbattuto in questo tipo di tentazione in passato e ho un po 'di paranoia sulla codifica GPU (GPGPU e shader) come risultato di alcune esperienze passate tra me e il mio team (a volte vedendo solo altri membri del team affrontare questi davvero tardi e post-release mi hanno dato i brividi, come un glitch di ATI su uno specifico modello Radeon che si schiantava nel rendering di linee antialias, successivamente riportato e contrassegnato come un problema noto con solo una soluzione alternativa disponibile).
La registrazione è stata la cosa che ci ha salvato i mozziconi lì, permettendoci di vedere spesso il problema su quel 10,001 oscuro prototipo di macchina con una GPU a bordo di cui non abbiamo mai sentito parlare, con l'ultima riga di codice che ci consente di individuare immediatamente dove l'errore è sceso a 2 o 3 righe di codice come sospetto, ad es. Se si trova all'interno di uno shader elaborato, siamo una specie di SOL poiché non possiamo effettuare la registrazione all'interno di uno shader GPU, ma possiamo almeno usare la registrazione per vedere quale shader ha subito il problema per iniziare le indagini.