Folklore di programatori è ingegneri (parte 1)

Folklore di programatori è ingegneri (parte 1)

Questa hè una selezzione di storii da Internet nantu à cumu i bug à volte anu manifestazioni completamente incredibili. Forse avete ancu qualcosa da dì.

Allergia à l'auto à u gelato di vaniglia

Una storia per l'ingegneri chì capiscenu chì l'evidente ùn hè micca sempre a risposta, è chì ùn importa micca quantu i fatti ponu parenu, sò sempre i fatti. A Divisione Pontiac di General Motors Corporation hà ricevutu una lagnanza:

Questa hè a seconda volta chì vi scrivu, è ùn vi culpisce micca per ùn risponde micca, perchè sona pazza. A nostra famiglia hà una tradizione di manghjà ghjacciu ogni notte dopu a cena. I tipi di ghjacciu cambianu ogni volta, è dopu à cena, tutta a famiglia sceglie quale ghjacciu per cumprà, dopu chì vanu à a tenda. Recentemente aghju compru un novu Pontiac è da tandu i mo viaghji per piglià u ghjacciu sò diventati un prublema. Vede, ogni volta chì compru gelato à la vaniglia è tornu da a tenda, a vittura ùn principia micca. Sè aghju purtatu un altru gelato, a vittura parte senza prublema. Vogliu fà una quistione seria, ùn importa micca quantu stupidu sona: "Chì ci hè u Pontiac chì face chì ùn principia micca quandu aghju purtatu u gelatu di vaniglia, ma cumencia facilmente quandu aghju purtatu un altru sapore di gelato?" "

Comu pudete imagine, u presidente di a divisione era scetticu annantu à a lettera. Tuttavia, in casu, aghju mandatu un ingegnere per verificà. Hè stata surprised ch'ellu hè statu scontru da un omu riccu è educatu chì vive in una bella zona. Anu accunsentutu à scuntrà subitu dopu à cena per chì i dui puderanu andà in a tenda per u ghjacciu. Quella sera era vaniglia, è quand'elli sò tornati à a vittura, ùn principia micca.

L'ingegnere hè ghjuntu trè sere più. A prima volta u ghjacciu era cioccolatu. A vittura hà cuminciatu. A seconda volta ci era un ghjacciu di fragole. A vittura hà cuminciatu. A terza sera hà dumandatu à piglià vaniglia. A vittura ùn hà micca cuminciatu.

Ragiunendu raziunale, l'ingegnere rifiutò di crede chì a vittura era allergii à u gelato di vaniglia. Dunque, aghju accunsentutu cù u pruprietariu di a vittura chì ellu cuntinueghja a so visita finu à truvà una suluzione à u prublema. È in a strada, hà cuminciatu à piglià note: hà scrittu tutte l'infurmazioni, l'ora di u ghjornu, u tipu di benzina, l'ora di l'arrivu è u ritornu da a tenda, etc.

L'ingegnere hà capitu prestu chì u pruprietariu di a vittura passava menu tempu per cumprà u gelato di vaniglia. U mutivu era u layout di e merchenzie in a tenda. U ghjacciu di vaniglia era u più populari è era guardatu in un congelatore separatu à a fronte di a tenda per fà più faciule di truvà. E tutte l'altri variità eranu in u spinu di a tenda, è pigliò assai più tempu per truvà a varietà ghjusta è pagà.

Avà a quistione era per l'ingegnere: perchè a vittura ùn hà micca cuminciatu s'ellu hè passatu menu tempu da u mumentu chì u mutore hè stata spenta? Siccomu u prublema era u tempu, micca u ghjacciu di vaniglia, l'ingegnere hà trovu rapidamente a risposta: era una serratura di gas. Hè accadutu ogni sera, ma quandu u pruprietariu di a vittura passava più tempu à circà u ghjacciu, u mutore hà riisciutu à rinfriscà abbastanza è si mette in modu faciule. È quandu l'omu hà compru ghjacciu di vaniglia, u mutore era ancu troppu caldu è a serratura di gasu ùn hà micca avutu u tempu di dissolve.

Morale: Ancu i prublemi cumplitamenti pazzi sò qualchì volta veri.

aèriu Bandicoot

Hè doloroso per sperienze questu. Cum'è un programatore, avete abituatu à culpisce u vostru codice prima, secondu, terzu ... è in qualchì locu in u decimillesimu postu culpisce u compilatore. È più in u listinu avete digià culpisce l'equipaggiu.

Eccu a mo storia nantu à u bug hardware.

Per u ghjocu Crash Bandicoot, aghju scrittu codice per carica è salvà in una carta di memoria. Per un sviluppatore di ghjocu cusì smug, era cum'è un passaghju in u parcu: pensu chì u travagliu duverà parechji ghjorni. Tuttavia, aghju finitu per debugging u codice per sei settimane. In u caminu, aghju risoltu altri prublemi, ma ogni ghjornu aghju tornatu à stu codice per uni pochi ore. Era agonia.

U sintumu pareva cusì: quandu salvate u ghjocu attuale di u ghjocu è accede à a carta di memoria, tuttu quasi sempre va bè ... Ma qualchì volta i timeouts di l'operazione di lettura o scrittura senza mutivu evidenti. Una breve registrazione spessu dannu a carta di memoria. Quandu un ghjucatore prova di salvà, ùn solu ùn riesce à salvà, ma ancu distrugge a mappa. Merda.

Dopu qualchì tempu, u nostru pruduttore in Sony, Connie Bus, hà cuminciatu à panicu. Ùn pudemu micca spedinu u ghjocu cù questu bug, è sei settimane dopu ùn aghju micca capitu ciò chì causava u prublema. Per mezu di Connie, avemu cuntattatu altri sviluppatori PS1: qualcunu hà scontru qualcosa di simile? Innò. Nimu hà avutu prublemi cù a carta di memoria.

Quandu ùn avete micca idee per debugging, l'unicu approcciu chì resta hè di "divide è cunquistà": sguassate più è più codice da u prugramma difettu finu à chì ci hè un frammentu relativamente chjucu chì resta sempre u prublema. Questu hè, avete tagliatu u prugramma pezzu per pezzu finu à chì a parte chì cuntene u bug resta.

Ma a cosa hè, hè assai difficiule di tagliate pezzi da un video game. Cumu eseguisce si sguassate u codice chì emula a gravità? O disegnu caratteri ?

Dunque, avemu da rimpiazzà i moduli interi cù stubs chì pretendenu di fà qualcosa d'utile, ma in fattu fà qualcosa assai simplice chì ùn pò micca cuntene errori. Avemu da scrive tali crutches per u ghjocu per almenu travaglià. Questu hè un prucessu lentu è doloroso.

In corta, aghju fattu. Aghju sguassatu più è più pezzi di codice finu à ch'e aghju lasciatu cù u codice iniziale chì configura u sistema per eseguisce u ghjocu, inizializza u hardware di rendering, etc. Di sicuru, in questu stadiu ùn pudia micca creà un menu di salvezza è carica, perchè avissi da creà un stub per tuttu u codice gràficu. Ma puderia finta d'esse un utilizatore utilizendu a schermu di salvezza è carica (invisibili) è dumandà à salvà è poi scrive à a carta di memoria.

Questu m'hà lasciatu un picculu pezzu di codice chì avia sempre u prublema di sopra - ma era sempre accadutu casuale! A maiò spessu tuttu hà travagliatu bè, ma in ocasioni ci sò stati glitches. Aghju sguassatu quasi tuttu u codice di u ghjocu, ma u bug era sempre vivu. Questu era puzzling: u codice restante ùn hà micca fattu nunda.

À un certu puntu, prubabilmente versu trè ore di a matina, un pensamentu m'hè accadutu. L'operazioni di lettura è scrittura (input / output) implicanu tempi di esecuzione precisi. Quandu travagliate cù un discu duru, una carta di memoria o un modulu Bluetooth, u codice di livellu bassu rispunsevuli di leghje è di scrittura faci cusì in cunfurmità cù i pulsazioni di u clock.

Cù l'aiutu di un clock, un dispositivu chì ùn hè micca direttamente cunnessu à u processatore hè sincronizatu cù u codice chì eseguisce nantu à u processatore. U clock determina u baud rate - a vitezza à quale i dati sò trasferiti. Se ci hè cunfusione cù i timings, allora u hardware o u software, o i dui, sò ancu cunfusi. È questu hè assai male, perchè i dati ponu esse dannighjati.

E se qualcosa in u nostru codice cunfunde i timings? Aghju verificatu tuttu ciò chì tocca à questu in u codice di u prugramma di prova è aghju nutatu chì avemu stabilitu u timer programabile in PS1 à 1 kHz (1000 ticks per seconda). Questu hè assai assai; per automaticamente, quandu a cunsola principia, corre à 100 Hz. È a maiò parte di i ghjochi utilizanu sta frequenza.

Andy, u sviluppatore di u ghjocu, hà stabilitu u timer à 1 kHz per chì i movimenti seranu calculati più precisamente. Andy tende à andà in mare, è se emulemu a gravità, u facemu u più precisamente pussibule!

Ma chì succede se l'accelerazione di u timer hà affettatu in qualchì modu u timing generale di u prugramma, è dunque u clock chì regula a velocità di baud per a carta di memoria?

Aghju cummentatu u codice di u timer. L'errore ùn hè micca accadutu di novu. Ma questu ùn significa micca chì l'avemu riparatu, perchè u fallimentu hè accadutu aleatoriu. E s'ellu era solu furtunatu?

Uni pochi ghjorni dopu aghju sperimentatu novu cù u prugramma di prova. U bug ùn hè micca ripresentatu. Aghju vultatu à a basa di codice di u ghjocu cumpletu è mudificatu u codice di salvezza è di carica in modu chì u timer programable resetta à u so valore originale (100Hz) prima di accede à a carta di memoria, è poi resettate à 1kHz. Ùn ci era più crashes.

Ma perchè hè accadutu questu?

Aghju tornatu à u prugramma di prova di novu. Aghju pruvatu à truvà qualchì mudellu in l'occurrence di un errore cù un timer 1 kHz. Eventualmente aghju nutatu chì l'errore si trova quandu qualchissia ghjoca cù un controller PS1. Siccomu raramente faria questu stessu - perchè averia bisognu di un controller quandu teste u codice di salvezza è carica? - Ùn aghju mancu nutatu sta dependenza. Ma un ghjornu unu di i nostri artisti m'aspittava per finisce a prova - probabilmente stava maledendu in quellu mumentu - è hà giratu nervosamente u controller in e so mani. Un errore hè accadutu. "Aspetta, chì ?!" Ebbè, fate di novu!"

Quandu aghju realizatu chì sti dui avvenimenti eranu interconnessi, aghju pussutu ripruduce facilmente l'errore: aghju cuminciatu à registrà à a carta di memoria, trasfirìu u controller, è arruvinò a carta di memoria. À mè mi pareva un bug hardware.

Sò ghjuntu à Connie è li disse di a mo scuperta. Ella hà trasmessu l'infurmazioni à unu di l'ingegneri chì hà designatu u PS1. "Impossible", hà rispostu, "Ùn pò esse un prublema di hardware". Aghju dumandatu à Connie di organizà una conversazione per noi.

L'ingegnere m'hà chjamatu è avemu discututu in u so inglese rottu è u mo giapponese (estremamente) rottu. Infine aghju dettu: "Lasciami mandà solu u mo prugramma di teste di 30 linee induve u muvimentu di u controller provoca un bug". Hè accunsentutu. Dicia chì era una perdita di tempu è ch'ellu era terribilmente occupatu à travaglià in un novu prughjettu, ma cederia perchè eramu un sviluppatore assai impurtante per Sony. Aghju pulitu u mo prugramma di prova è l'aghju mandatu.

A sera dopu (eramu in Los Angeles è ellu era in Tokyo) m'hà chjamatu è si scusò in modu di pecura. Era un prublema di hardware.

Ùn sò micca esattamente ciò chì era u bug, ma da ciò chì aghju intesu in a sede di Sony, se mette u timer à un valore abbastanza altu, interferiscenu cù cumpunenti in a scheda madre in vicinanza di u cristallu di timer. Unu di elli era un baud rate controller per a carta di memoria, chì hà ancu stabilitu a baud rate per i controller. Ùn sò micca un ingegnere, cusì puderia avè sbagliatu qualcosa.

Ma u fondu hè chì ci era interferenza trà cumpunenti nantu à a scheda madre. È quandu trasmettenu dati simultaneamente attraversu u portu di u controller è u portu di a carta di memoria cù un timer chì funziona à 1 kHz, i bits sò stati persi, i dati sò stati persi, è a carta hè stata dannata.

Vacche cattive

In l'anni 1980, u mo mentor Sergei hà scrittu software per u SM-1800, un clone sovièticu di u PDP-11. Stu microcomputer hè statu stallatu in una stazione ferroviaria vicinu à Sverdlovsk, un centru di trasportu impurtante in l'URSS. U novu sistema hè statu cuncepitu per indirizzà i carri è u trafficu di merci. Ma cuntene un bug fastidiosu chì hà purtatu à crashes casuali è crashes. Cascate sempre accadutu quandu qualchissia andava in casa à a sera. Ma malgradu una investigazione approfondita u ghjornu dopu, l'urdinatore hà travagliatu bè in tutti i testi manuali è automatichi. Questu generalmente indica una cundizione di razza o qualchì altru bug competitivu chì si trova in certi cundizioni. Stancu di chjama à a notte tardi, Sergei hà decisu di ghjunghje sin'à u fondu, è prima di tuttu, capisce ciò chì e cundizioni in u cantiere di marshalling hà purtatu à a rottura di l'urdinatore.

Prima, hà cullatu statistiche di tutte e cascate inspiegabili è hà creatu un graficu per data è ora. U mudellu era evidenti. Dopu avè osservatu per uni pochi di ghjorni, Sergei hà capitu chì puderia facilmente predichendu u tempu di i fallimenti futuri di u sistema.

Prestu hà amparatu chì e disrupzioni sò accadute solu quandu a stazione sguassava i treni di vacche da u nordu di l'Ucraina è di a Russia occidentale in un macellu vicinu. Questu in sè stessu era stranu, perchè u macellu era furnitu da splutazioni situate assai più vicinu, in Kazakhstan.

A centrale nucleare di Chernobyl hà splutatu in u 1986, è a cascata radiuattiva hà resu inabitabili l'area circundante. Vasti zoni in u nordu di l'Ucraina, a Bielorussia è a Russia occidentale sò stati contaminati. Sospettendu alti livelli di radiazione in i carri chì arrivanu, Sergei hà sviluppatu un metudu per pruvà sta tiuria. A pupulazione era pruibita d'avè dosimetri, cusì Sergei si registrò cù parechji militari in a stazione di ferrovia. Dopu parechji beie di vodka, hà sappiutu cunvince un suldatu per misurà u livellu di radiazione in unu di i carru sospetti. Hè risultatu chì u livellu era parechje volte più altu di i valori nurmali.

Ùn solu u vacche emettenu assai radiazioni, u so livellu era cusì altu chì hà purtatu à a perdita aleatoria di bits in a memoria di u SM-1800, chì era situatu in un edifiziu vicinu à a stazione.

In l'URSS, ci era una carenza alimentaria, è l'autorità anu decisu di mischjà a carne di Chernobyl cù carne di altre regioni di u paese. Questu hà permessu di riduce u livellu generale di a radiuattività senza perde risorse preziose. Dopu avè amparatu questu, Sergei hà subitu cumpletu i ducumenti per l'emigrazione. È i crashes di l'urdinatore si fermavanu per sè stessu quandu u livellu di radiazione diminuì cù u tempu.

À traversu i pipi

Una volta, Movietech Solutions hà creatu un software per i cinema, pensatu per a cuntabilità, a vendita di biglietti è a gestione generale. A versione DOS di l'app emblematica era abbastanza populari trà e catene di cinema chjuchi è mediu in l'America di u Nordu. Dunque ùn hè micca surprisante chì quandu una versione di Windows 95 hè stata annunziata, integrata cù l'ultime schermi tattili è chioschi self-service, è dotata di ogni tipu di strumenti di rapportu, hè diventata prestu ancu populari. A maiò spessu l'aghjurnamentu hè andatu senza prublemi. U persunale di l'IT lucale hà stallatu novu equipaggiu, migratu dati, è l'affari cuntinuavanu. Fora quandu ùn durò micca. Quandu questu hè accadutu, a cumpagnia mandava à James, soprannominatu "U Cleaner".

Ancu se u soprannomu suggerisce un tipu nefastu, u pulitore hè solu una cumminazione di istruttore, installatore è jack-of-all-trades. Ghjacumu passava uni pochi di ghjorni in u situ di u cliente mettendu tutti i cumpunenti inseme, è poi passava un altru paru di ghjorni insegnendu à u persunale cumu utilizà u novu sistema, risolve ogni prublema di hardware chì si presentava è essenzialmente aiutendu u software in a so infanzia.

Dunque, ùn hè micca surprisante chì in questi tempi frenetici, Ghjacumu ghjunse à l'uffiziu in a matina, è prima ch'ellu puderia ghjunghje à u so desk, hè statu salutatu da u manager, pienu di cafeina fora di u solitu.

"Temu chì avete bisognu à andà in Annapolis, Nova Scotia, u più prestu pussibule". U so sistema tutale hè cascatu, è dopu una notte di travaglià cù i so ingegneri, ùn pudemu micca capisce ciò chì hè accadutu. Sembra chì a reta hà fiascatu nantu à u servitore. Ma solu dopu chì u sistema era in funzione per parechji minuti.

- Ùn sò micca tornati à u vechju sistema ? - Ghjacumu hà rispostu cumplitamenti seriu, ancu s'ellu mentalmente hà allargatu l'ochji in sorpresa.

- Esattamente: u so specialista in IT "hà cambiatu e priorità" è hà decisu di lascià cù u so vechju servitore. Ghjacumu, anu stallatu u sistema in sei siti è solu pagatu per un supportu premium, è a so attività hè avà gestita cum'è in l'anni 1950.

Ghjacumu si raddrizzò un pocu.

- Hè un altru affare. Va bè, cuminciamu.

Quandu ghjunse in Annapolis, u primu chì hà fattu era truvà u primu teatru di u cliente chì avia un prublema. Nantu à a mappa presa à l'aeroportu, tuttu pareva decentu, ma l'area intornu à l'indirizzu desideratu pareva suspettuosa. Micca ghetto, ma reminiscente di film noir. Mentre Ghjacumu parcheggiava à u curb downtown, una prostituta si avvicinava. Data a dimensione di Annapolis, era più prubabile l'unicu in a cità sana. A so apparizione hà purtatu immediatamente à mente u famosu caratteru chì offre u sessu per soldi nantu à a big screen. Innò, micca di Julia Roberts, ma di Jon Voight [allusion à u filmu "Midnight Cowboy" - ca. corsia].

Dopu avè mandatu a prustituta in a so strada, Ghjacumu si n'andò à u sinemà. U circondu s'era megghiu, ma dava sempre l'impressione d'esse arruvinatu. Micca chì Ghjacumu era troppu preoccupatu. Hè statu in lochi disgraziati prima. È questu era u Canada, induve ancu i muggers sò abbastanza educati per dì "grazie" dopu avè pigliatu a vostra billetera.

L'entrata laterale di u cinema era in una strada umida. Ghjacumu andò à a porta è pisciò. Prestu scricchiò è si aprì un pocu.

- Siete un pulitore ? - una voce rauca ghjunse da dentru.

- Iè, sò mè... Sò vinutu à riparà tuttu.

Ghjacumu intrì in u lobby di u cinema. Apparentemente ùn avè micca altra scelta, u persunale hà cuminciatu à distribuisce biglietti di carta à i visitatori. Questu hà fattu u rapportu finanziariu difficiule, per suprattuttu dettagli più interessanti. Ma u persunale hà salutatu Ghjacumu cun sollievu è u purtò subitu in a sala di u servitore.

À u primu sguardu, tuttu era bè. James hà logatu in u servitore è hà verificatu i soliti lochi sospetti. Nisunu prublema. In ogni casu, fora di una abbundanza di prudenza, Ghjacumu chjusu u servitore, rimpiazzatu a carta di rete, è rinfriscà u sistema. Immediatamente hà cuminciatu à travaglià in tuttu. U persunale hà cuminciatu à vende i biglietti di novu.

Ghjacumu hà chjamatu Mark è l'hà infurmatu di a situazione. Ùn hè micca difficiule d'imaginà chì Ghjacumu puderia vulerà stà è vede s'ellu succede qualcosa inesperu. Falò i scalini è cuminciò à dumandà à l'impiegati ciò chì hè accadutu. Ovviamente u sistema hà cessatu di travaglià. L'anu appiccicatu è accesa, tuttu hà travagliatu. Ma dopu à 10 minuti, u sistema hè cascatu.

Solu in questu mumentu hè accadutu qualcosa di simile. Di colpu, u sistema di ticketing hà cuminciatu à lancià errori. U persunale hà suspiratu è pigliò i biglietti di carta, è Ghjacumu si precipitò à a sala di i servitori. Tuttu pareva bè cù u servitore.

Allora unu di l'impiegati intrì.

- U sistema funziona di novu.

Ghjacumu era perplessu perchè ùn avia fattu nunda. Più precisamente, nunda chì faria u sistema di travaglià. Hè sconnessu, hà pigliatu u so telefunu è hà chjamatu a linea di supportu di a so cumpagnia. Prestu u stessu impiigatu intrutu in a sala di u servitore.

- U sistema hè falatu.

Ghjacumu guardò u servitore. Un mudellu interessante è familiar di forme multicolore ballava nantu à u screnu - caòticamenti chì si intreccianu è si intreccianu tubi. Tutti avemu vistu stu screensaver in un certu puntu. Hè stata bella resa è literalmente ipnotizzante.


James pressò un buttone è u mudellu sparì. Si precipitò à a biglietteria è in strada hà scontru un impiigatu chì tornava à ellu.

- U sistema funziona di novu.

Se pudete fà un facepalm mentale, hè esattamente ciò chì James hà fattu. Screensaver. Si usa OpenGL. È per quessa, durante l'operazione, cunsuma tutte e risorse di u processatore di u servitore. In u risultatu, ogni chjama à u servitore finisce cù un timeout.

Ghjacumu hà tornatu à a sala di u servitore, hà logged in, è rimpiazzatu u screensaver cù i belli pipi cù una schermu in biancu. Questu hè, invece di un screensaver chì cunsuma u 100% di e risorse di u processatore, aghju installatu un altru chì ùn cunsuma micca risorse. Allora aghju aspittatu 10 minuti per verificà a mo supposizione.

Quandu Ghjacumu hè ghjuntu à u prossimu cinema, si dumandava cumu spiegà à u so capu chì avia ghjustu 800 km per disattivà u screen saver.

Crash durante una certa fase di a luna

Storia vera. Un ghjornu hè ghjuntu un bug di software chì dipendeva da a fase di a luna. Ci era una piccula rutina chì era comunmente utilizata in diversi prugrammi MIT per calculà l'approssimazione à a vera fase di a Luna. GLS hà custruitu sta rutina in un prugramma LISP chì, quandu scrive un schedariu, pruduce una linea cù un timestamp quasi 80 caratteri longu. Era assai raru chì a prima linea di un missaghju finisci per esse troppu longa è porta à a linea dopu. È quandu u prugramma dopu leghje stu schedariu, hà maleditu. A durata di a prima linea dipende da a data è l'ora esatta, è ancu da a durata di a specificazione di a fase à u mumentu chì u timestamp hè statu stampatu. Questu hè, u bug littiralmenti dipende da a fase di a luna!

Prima edizione carta File jargon (Steele-1983) cuntene un esempiu di una tale linea chì hà purtatu à l'errore descrittu, ma a tipografia "fissa". Questu hè statu discritta cum'è "bug di fase lunare".

Tuttavia, attentu à l'ipotesi. Qualchi anni fà, ingegneri di u CERN (Centru Europeu per a Ricerca Nucleare) anu scontru errori in esperimenti realizati in u Large Electron-Positron Collider. Siccomu l'urdinatori processanu attivamente l'enorme quantità di dati generati da stu dispositivu prima di mostrà u risultatu à i scientisti, assai speculanu chì u software era in qualchì modu sensibile à a fase di a luna. Parechji ingegneri disperati ghjunghjenu à u fondu di a verità. L'errore hè ghjuntu per un ligeru cambiamentu in a geometria di l'anellu di 27 km longu per via di a deformazione di a Terra durante u passaghju di a Luna! Sta storia hè intrutu in u folklore di a fisica cum'è "Newton's Revenge on Particle Physics" è un esempiu di a cunnessione trà e leggi più sèmplice è più antiche di a fisica è i cuncetti scientifichi più avanzati.

Sciacquare a toilette ferma u trenu

U megliu bug hardware ch'e aghju mai intesu parlà era in un trenu d'alta velocità in Francia. U bug hà purtatu à u frenu d'urgenza di u trenu, ma solu s'ellu ci era passageri à bordu. In ogni casu, u trenu hè statu fora di serviziu, verificatu, ma nunda hè statu trovu. Allora hè statu rimandatu à a linea, è subitu s'hè lampatu à un arrestu.

Duranti unu di i cuntrolli, un ingegnere chì viaghjava in u trenu si n'andò à a toilette. Prestu si lavò, BOOM ! Stop d'emergenza.

L'ingegnere hà cuntattatu u cunduttore è li dumandò:

- Chì faciavi appena prima di frenà ?

- Ebbè, aghju rallentatu in a discesa...

Questu era stranu, perchè durante u funziunamentu normale u trenu rallenta in discendenti decine di volte. U trenu avanzava, è in a prossima discesa u cunduttore hà avvistatu:

- Aghju da rallentà.

Nunda hè accadutu.

— Chì avete fattu durante l’ultima frenata ? - dumandò u cunduttore.

- Ebbè... eru in wc...

- Ebbè, allora andate à u bagnu è fate ciò chì avete fattu quand'è no falemu di novu !

L'ingegneru si n'andò à u bagnu, è quandu u cunduttore hà avvistatu: "Aghju rallentatu", hà lavatu l'acqua. Di sicuru, u trenu si firmò subitu.

Avà puderanu ripruduce u prublema è avianu bisognu di truvà a causa.

Dopu dui minuti, anu nutatu chì u cable di telecomando di frenu di u mutore (u trenu avia un mutore à ogni estremità) hè stata disconnected da u muru di l'armadiu elettricu è era stendu nantu à u relé chì cuntrullava u solenoide di u plug di toilette... Quandu u relé. hè stata attivata, hà creatu interferenza in u cable di frenu, è a prutezzione di u sistema contr'à fallimenti includeva solu frenu d'emergenza.

A porta chì odiava FORTRAN

Uni pochi mesi fà avemu nutatu chì e cunnessione di rete in u cuntinente [questu era in Hawaii] eranu assai, assai lenti. Questu puderia durà per 10-15 minuti è poi di colpu torna di novu. Dopu qualchì tempu, u mo cullegu si lamentava à mè chì e cunnessione di a rete in u cuntinente in generale ùn travaglia micca. Hà avutu qualchì codice FORTRAN chì deve esse copiatu à una macchina in u cuntinente, ma ùn pudia micca perchè "a reta ùn hà micca tenutu abbastanza longu per a carica FTP per compie".

Iè, hè risultatu chì i fallimenti di a rete sò accaduti quandu un cullegu hà pruvatu à FTP un schedariu cù u codice fonte in FORTRAN à una macchina in u cuntinente. Pruvamu d'archivià u schedariu: dopu hè statu copiatu in modu lisu (ma a macchina di destinazione ùn hà micca un unpacker, perchè u prublema ùn hè micca risoltu). Infine avemu "split" u codice FORTRAN in pezzi assai chjuchi è li mandatu unu à tempu. A maiò parte di i frammenti sò stati copiati senza prublemi, ma uni pochi di pezzi ùn passavanu, o passanu dopu numeru prova.

Quandu avemu esaminatu i passaghji problematichi, avemu scupertu chì avianu qualcosa in cumunu: tutti cuntenenu blocchi di cummentarii chì cumincianu è finiscinu cù linii custituiti da a capitale C (cum'è un cullegu preferitu cummentà in FORTRAN). Avemu mandatu un email à l'esperti di a rete in u cuntinente è avemu dumandatu aiutu. Di sicuru, vulianu vede campioni di i nostri schedari chì ùn puderanu micca esse trasferiti via FTP... ma e nostre lettere ùn anu micca ghjuntu. Finalmente avemu ghjuntu cun un simplice discriveciò chì i schedarii micca trasferibili parenu. Funziona :) [Dare aghju aghjunghje un esempiu di unu di i cumenti problematici di FORTRAN quì? Probabilmente ùn vale a pena!]

In fine, avemu riesciutu à capisce. Un novu gateway hè statu stallatu recentemente trà a nostra parte di u campus è a reta di u cuntinente. Hà avutu ENORME difficultà à trasmette pacchetti chì cuntenenu bits ripetuti di C majuscule! Uni pochi di sti pacchetti puderanu piglià tutte e risorse di gateway è impediscenu a maiò parte di l'altri pacchetti di passà. Avemu lagnatu à u fabricatore di u gateway ... è anu rispostu: "Oh, iè, site di fronte à un bug di C ripetutu! Sapemu digià di ellu ". Avemu eventualmente risoltu u prublema per cumprà una nova porta di un altru fabricatore (in a difesa di l'anzianu, l'incapacità di trasferisce i prugrammi FORTRAN pò esse un vantaghju per alcuni!).

Tempi duri

Uni pochi anni fà, mentre travagliava à creà un sistema ETL in Perl per riduce i costi di prucessi clinichi di a fase 40, aghju avutu bisognu di processà circa 000 1 date. Dui di elli ùn anu micca passatu a prova. Questu ùn m'hà micca disturbatu troppu perchè queste date sò state pigliate da dati furniti da u cliente chì era spessu, dicemu, surprisante. Ma quandu aghju verificatu i dati urigginali, risultò chì sti date eranu u 2011 di ghjennaghju di u 1 è u 2007 di ghjennaghju di u 30. Pensu chì u bug era cuntenutu in u prugramma ch'e aghju scrittu ghjustu, ma hè risultatu chì era digià XNUMX anni. vechju. Questu pò esse misteriosu per quelli chì ùn sò micca familiarizati cù l'ecosistema di u software. A causa di a longa decisione di una altra cumpagnia di guadagnà soldi, u mo cliente m'hà pagatu per riparà un bug chì una cumpagnia avia introduttu per accidenti è l'altru apposta. Per capisce ciò chì parlu, aghju bisognu di parlà di a cumpagnia chì hà aghjustatu a funzione chì hà finitu per diventà un bug, è ancu uni pochi di altri avvenimenti interessanti chì anu cuntribuitu à u misteriu bug ch'e aghju correttu.

In i boni vechji tempi, l'urdinatori Apple a volte resettanu spontaneamente a so data à u 1 di ghjennaghju di u 1904. U mutivu era simplice: hà utilizatu un "orologio di sistema" alimentatu da a batteria per seguità a data è l'ora. Chì hè accadutu quandu a bateria hè morta? L'urdinatori cuminciaru à seguità a data da u numeru di seconde da u principiu di l'epica. Per l'epica avemu intesu a data originale di riferimentu, è per Macintoshes era u 1 di ghjennaghju di u 1904. È dopu chì a bateria morse, a data attuale hè stata resettata à quella specificata. Ma perchè hè accadutu questu?

Nanzu, Apple hà utilizatu 32 bits per almacenà u numeru di seconde da a data originale. Un bit pò almacenà unu di dui valori - 1 o 0. Dui bits ponu almacenà unu di quattru valori: 00, 01, 10, 11. Trè bit - un valore fora di ottu: 000, 001, 010, 011, 100 , 101, 110, 111, etc. È 32 puderia almacenà unu di i valori 232, vale à dì, 4 seconde. Per e date Apple, questu equivale à circa 294 anni, cusì i Mac più vechji ùn ponu micca trattà e date dopu à 967. È se a bateria di u sistema mori, a data hè resettata à 296 seconde da u principiu di l'epica, è avete da stabilisce manualmente a data ogni volta chì accende l'urdinatore (o finu à cumprà una nova bateria).

In ogni casu, a decisione di Apple di almacenà e date cum'è seconde da l'epica significava chì ùn pudemu micca trattà e date prima di l'epica, chì hà avutu cunsiquenzi di grandezza, cum'è avemu da vede. Apple hà introduttu una funzione, micca un bug. Frà altre cose, questu significava chì u sistema operatore Macintosh era immune à u "bug millenniu" (chì ùn si pudia dì di parechje applicazioni Mac chì avianu u so propiu sistema di data per aggira e restrizioni).

Avanti. Avemu usatu Lotus 1-2-3, l'"applicazione killer" di IBM chì hà aiutatu à lancià a rivoluzione di u PC, ancu s'è l'urdinatori Apple avianu VisiCalc, chì hà fattu l'urdinatore persunale un successu. In ghjustizia, s'ellu 1-2-3 ùn era micca apparsu, i PC ùn avianu micca sbulicatu, è a storia di l'urdinatori persunali puderia esse sviluppatu assai diversamente. Lotus 1-2-3 hà trattatu incorrectamente 1900 cum'è un annu bisestile. Quandu Microsoft hà liberatu a so prima foglia di calculu, Multiplan, hà pigliatu una piccula parte di u mercatu. È quandu anu lanciatu u prughjettu Excel, decidenu micca solu di copià u schema di nomi di fila è colonna da Lotus 1-2-3, ma ancu per assicurà a cumpatibilità di bug trattendu deliberatamente 1900 cum'è un annu bisestile. Stu prublema esiste ancu oghje. Questu hè, in 1-2-3 questu era un bug, ma in Excel era una decisione cuscente chì assicurava chì tutti l'utilizatori 1-2-3 puderanu impurtà e so tavule in Excel senza cambià a dati, ancu s'ellu era sbagliatu.

Ma ci era un altru prublema. Prima, Microsoft hà liberatu Excel per u Macintosh, chì ùn hà micca ricunnisciutu e date prima di u 1 di ghjennaghju di u 1904. È in Excel, u 1 di ghjennaghju di u 1900 hè cunsideratu u principiu di l'era. Dunque, i sviluppori hà fattu un cambiamentu in modu chì u so prugramma hà ricunnisciutu u tipu di l'epica è i dati cullucati in sè stessu in cunfurmità cù l'epica desiderata. Microsoft hà ancu scrittu un articulu esplicativu annantu à questu. E sta decisione hà purtatu à u mo bug.

U mo sistema ETL hà ricevutu fogli di calculu Excel da i clienti chì sò stati creati in Windows, ma puderia ancu esse creatu in un Mac. Dunque, u principiu di l'era in a tavula puderia esse u 1 di ghjennaghju di u 1900, o di u 1 di ghjennaghju di u 1904. Cumu sapè? U furmatu di u schedariu Excel mostra l'infurmazioni necessarii, ma l'analizzatore chì aghju utilizatu ùn l'hà micca mostratu (avà si face), è assume chì sapete l'epica per una tavola specifica. Probabilmente puderia avè passatu più tempu per capiscenu u formatu binari di Excel è mandà un patch à l'autore parser, ma aghju avutu assai più per fà per u cliente, cusì aghju scrittu rapidamente un heuristic per determinà l'epica. Era simplice.

In Excel, a data di u 5 di lugliu di u 1998 pò esse rapprisintata in u formatu "07-05-98" (sistema americanu inutile), "5 di lugliu di u 98", "5 di lugliu di u 1998", "5-98-8601" o un altru formatu, un altru formatu inutile (ironicamente, unu di i formati chì a mo versione di Excel ùn offre micca era ISO 35981). In ogni casu, in a tavula, a data senza furmatu hè stata guardata cum'è "1900" per l'epica-34519 o "1904" per l'epica-4 (i numeri rapprisentanu u numeru di ghjorni da l'epica). Aghju simplicemente utilizatu un parser simplice per caccià l'annu da a data furmatu, è dopu utilizatu l'analizzatore Excel per estrae l'annu da a data senza formate. Sì i dui valori differiscenu da 1904 anni, allora sapia chì aghju utilizatu un sistema cù l'epica-XNUMX.

Perchè ùn aghju micca solu aduprà date furmatu ? Perchè u 5 di lugliu di u 1998 pò esse furmatu cum'è "Lugliu 98" cù u ghjornu di u mese persu. Avemu ricivutu tavule da tante cumpagnie chì li creanu in tanti modi diffirenti chì era à noi (in questu casu, mè) per capisce e date. Inoltre, se Excel capisce bè, allora duvemu noi!

À u listessu tempu aghju scontru 39082. Permettemu di ricurdà chì Lotus 1-2-3 hà cunsideratu 1900 un annu bisestile, è questu hè stata fedelmente ripetuta in Excel. E postu chì questu hè aghjuntu un ghjornu à l'annu 1900, parechje funzioni di calculu di data puderanu esse sbagliate per quellu ghjornu stessu. Vale à dì, 39082 puderia esse u 1 di ghjennaghju di u 2011 (in Macs) o u 31 di dicembre di u 2006 (in Windows). Se u mo "analizzatore di l'annu" hà estrattu l'annu 2011 da u valore furmatu, allora tuttu hè bè. Ma siccomu l'excel parser ùn sapi micca ciò chì l'epica hè stata aduprata, hè predeterminatu à epoch-1900, turnendu l'annu 2006. A mo applicazione hà vistu chì a diffarenza era di 5 anni, hà cunsideratu un errore, hà registratu, è hà restituitu un valore senza formate.

Per attruvà questu, aghju scrittu questu (pseudocode):

diff = formatted_year - parsed_year
if 0 == diff
    assume 1900 date system
if 4 == diff
    assume 1904 date system
if 5 == diff and month is December and day is 31
    assume 1904 date system

E poi tutte e 40 000 date sò state analizate currettamente.

À mezu à i travaglii di grande stampa

À l'iniziu di l'anni 1980, u mo babbu hà travagliatu in Storage Technology, una divisione ora difunta chì creava unità di cinta è sistemi pneumatici per l'alimentazione di cinta à alta velocità.

Anu riprogettatu l'unità per pudè avè una unità centrale "A" cunnessa à sette unità "B", è u picculu OS in RAM chì cuntrullava l'unità "A" puderia delegate operazioni di lettura è scrittura à tutte e unità "B".

Ogni volta chì l'unità "A" hè stata cuminciata, era necessariu inserisce un dischettu in u discu perifericu cunnessu à "A" per carricà u sistema operatore in a so memoria. Era assai primitivu: a putenza di l'informatica era furnita da un microcontroller 8-bit.

U publicu di destinazione per tali equipaghji era cumpagnie cù magazzini di dati assai grandi - banche, catene di vendita, etc. - chì avianu bisognu di stampà assai etichette d'indirizzu o dichjarazioni bancarie.

Un cliente hà avutu un prublema. À mezu à un travagliu di stampa, una unità particulare "A" puderia smette di travaglià, facendu chì tuttu u travagliu si stalla. Per restaurà u funziunamentu di l'unità, u persunale hà avutu à reboot tuttu. È s'ellu hè accadutu à mezu à un compitu di sei ore, allora una quantità enorme di tempu di computer caru hè stata persa è u calendariu di tutta l'operazione hè stata disturbata.

I tecnichi sò stati mandati da Storage Technologies. Ma malgradu i so sforzi, ùn anu pussutu ripruduce u bug in cundizioni di prova: pareva esse in mezu à i travaglii di grande stampa. U prublema ùn era micca u hardware, anu rimpiazzatu tuttu ciò chì pudianu: RAM, microcontroller, floppy drive, ogni parte cuncepibile di l'unità di cinta - u prublema persiste.

Allora i tecnichi chjamanu a sede è chjamanu l'Espertu.

L'espertu hà pigliatu una sedia è una tazza di caffè, si pusò in a sala di l'informatica - in quelli ghjorni ci eranu stanze dedicate à l'urdinatori - è fighjulà cum'è u persunale mette in fila un grande travagliu di stampa. L'espertu era aspittendu chì un fallimentu accade - è hà fattu. Tuttu u mondu hà guardatu à l'Espertu, ma ùn avia micca idea perchè questu hè accadutu. Allora urdinò u travagliu per esse in fila di novu, è tuttu u persunale è i tecnichi tornanu à u travagliu.

L'espertu torna à pusà nantu à a sedia è hà cuminciatu à aspittà un fallimentu. Circa sei ore passanu è u fallimentu hè accadutu. L'Espertu novu ùn avia micca idee, salvu chì tuttu hè accadutu in una stanza piena di persone. Hà urdinatu chì a missione sia riavviata, s'assittò è aspittò.

Da u terzu fallimentu, l'Espertu hà nutatu qualcosa. U fallimentu hè accadutu quandu u persunale hà cambiatu nastri in un discu straneru. Inoltre, u fallimentu hè accadutu quandu unu di l'impiegati hà attraversatu una certa tile nantu à u pianu.

U pianu elevatu era fattu di tile d'aluminiu pusatu à una altezza di 6 à 8 inch. Numerosi fili da l'urdinatori passavanu sottu à u pianu elevatu per impedisce à qualcunu di passà accidentalmente un cable impurtante. I tile sò stati posti assai stretti per impediscenu chì i detriti si mettenu sottu à u pianu elevatu.

L'espertu hà capitu chì unu di i tile era deformatu. Quandu un impiigatu hà pisatu nantu à u so angulu, i bordi di u tile strufinatu contr'à i tile adiacenti. E parti di plastica chì cunnettavanu i tile anu ancu strofinatu cun elli, chì anu causatu microdischarges statici chì creanu interferenza di freccia radio.

Oghje, a RAM hè assai megliu prutetta da l'interferenza di freccia radio. Ma in quelli anni ùn era micca u casu. L'espertu hà capitu chì sta interferenza disturbava a memoria, è cun ella u funziunamentu di u sistema upirativu. Chjamò u serviziu di supportu, urdinò novi tile, installate ellu stessu, è u prublema sparì.

Hè alta marea !

A storia hè accaduta in una sala di servitori, à u quartu o quintu pianu di un uffiziu in Portsmouth (pensu), in a zona di i docks.

Un ghjornu, u servitore Unix cù a basa di dati principale hè cascatu. L'anu riavviatu, ma hà felicemente cuntinuatu à cascà una volta è una volta. Avemu decisu di chjamà qualcunu da u serviziu di supportu.

U tippu di sustegnu... Pensu chì si chjamava Mark, ma ùn importa micca... Pensu chì ùn u cunnosci micca. Ùn importa micca, veramente. Restemu cun Mark, ok ? Perfettu.

Allora, uni pochi d'ore dopu, Mark hè ghjuntu (ùn hè micca assai luntanu da Leeds à Portsmouth, sapete), accende u servitore è tuttu hà travagliatu senza prublemi. Supportu tipicu dannatu, u cliente hè assai arrabbiatu per questu. Mark guarda à traversu i schedarii di log è ùn trova nunda di male. Allora Mark torna in u trenu (o qualunque modu di trasportu ch'ellu hè ghjuntu, puderia esse una vacca zoppa per tuttu ciò chì sò... in ogni modu, ùn importa micca, d'accordu ?) è torna in Leeds, avendu persu. u ghjornu.

A stessa sera, u servitore s'hè lampatu di novu. A storia hè a listessa... u servitore ùn si alza. Mark prova à aiutà remotamente, ma u cliente ùn pò micca inizià u servitore.

Un altru trenu, autobus, meringa di limone o qualchì altra merda, è Mark hè tornatu in Portsmouth. Fighjate, u servitore si avvia senza prublemi! Miraculu. Mark passa parechje ore per verificà chì tuttu hè in ordine cù u sistema operatore o u software è parte per Leeds.

Intornu à a mità di u ghjornu, u servitore crashes (pigliate faciule!). Questa volta pare raghjone per purtà in u supportu hardware persone per rimpiazzà u servitore. Ma nò, dopu à circa 10 ore casca ancu.

A situazione si ripetì per parechji ghjorni. U servitore travaglia, crashes after about 10 hours and does not start for the next 2 hours. Cuntrollanu u rinfrescante, e fughe di memoria, anu verificatu tuttu, ma ùn truvaru nunda. Allora i crashes si sò firmati.

A settimana passata senza spensierata... tutti eranu cuntenti. Felice finu à chì tuttu ricomincia. U ritrattu hè listessu. 10 ore di travagliu, 2-3 ore di fermu ...

È dopu qualchissia (pensu chì m'hà dettu chì sta persona ùn avia nunda à fà cù IT) hà dettu:

"Hè a marea!"

L'esclamazione hè stata accolta cù sguardi in biancu, è a manu di qualcunu hà probabilmente esitatu à u buttone di chjama di sicurità.

"Si ferma di travaglià cù a marea".

Questu pare esse un cuncettu cumplettamente stranieru per i travagliadori di supportu IT, chì hè improbabile di leghje l'annuariu di a marea mentre si sentenu per u caffè. Spiegavanu chì questu ùn puderia micca esse ligatu à a marea in ogni modu, perchè u servitore avia travagliatu per una settimana senza fallimenti.

"A settimana passata a marea era bassa, ma sta settimana hè alta".

Un pocu di terminologia per quelli chì ùn anu micca una licenza di yacht. I maree dipendenu da u ciclu lunare. È cum'è a Terra rota, ogni 12,5 ore l'attrazione gravitazionale di u Sole è a Luna crea una onda di marea. À u principiu di u ciculu di 12,5 ore ci hè una marea alta, in u mità di u ciculu ci hè un riflussu, è à a fine ci hè una marea alta di novu. Ma cum'è l'orbita di a luna cambia, cusì cambia a diffarenza trà a marea bassa è alta. Quandu a Luna hè trà u Sole è a Terra o da u latu oppostu di a Terra (luna piena o micca luna), avemu a marea Syzygyn - a marea alta più alta è a marea bassa più bassa. À a mità di luna avemu a marea quadratura - e maree più bassu. A diferenza trà i dui estremi diminuisce assai. U ciculu lunare dura 28 ghjorni : sizigianu - quadratura - sizigianu - quadratura.

Quandu i tecnichi anu spiegatu l'essenza di e forze di marea, immediatamente pensanu chì avianu bisognu di chjamà a polizia. È abbastanza logicu. Ma risultò chì u tippu avia ragiò. Dui settimane nanzu, un distruttore attraccava pocu luntanu da l'uffiziu. Ogni volta chì a marea l'alzava à una certa altezza, u postu di radar di a nave finiscinu à u livellu di u pianu di a stanza di u servitore. È u radar (o l'equipaggiu di guerra elettronica, o qualchì altru ghjoculu militare) hà creatu u caosu in l'urdinatori.

Missione di volu per u missile

Aviu statu incaricatu di portà un grande (circa 400 mila linee) sistema di cuntrollu di lanciu di missile è monitoraghju à e novi versioni di u sistema operatore, compilatore è lingua. Più precisamente, da Solaris 2.5.1 à Solaris 7, è da u Verdix Ada Development System (VADS), scrittu in Ada 83, à u sistema Rational Apex Ada, scrittu in Ada 95. VADS fù acquistatu da Rational, è u so pruduttu hè statu. obsolet, anche se Rational hà pruvatu à implementà versioni cumpatibili di pacchetti specifichi VADS per facilità a transizione à u compilatore Apex.

Trè persone m'hà aiutatu solu à ottene u codice compilatu in modu pulitu. Pigliò duie settimane. E poi aghju travagliatu nantu à u mo propiu per fà u travagliu di u sistema. In cortu, era a peghju architettura è implementazione di un sistema di software chì aghju scontru, cusì hà pigliatu altri dui mesi per compie u portu. Dopu u sistema hè statu sottumessu à a prova, chì hà pigliatu parechji mesi più. Aghju correttu subitu i bug chì sò stati truvati durante a prova, ma u so numeru hà diminuitu rapidamente (u codice fonte era un sistema di pruduzzione, cusì a so funziunalità hà travagliatu abbastanza affidabile, aghju avutu solu à sguassà i bug chì si sò sviluppati durante l'adattazione à u novu compilatore). Eventualmente, quandu tuttu era travagliatu cum'è duverebbe, aghju trasferitu à un altru prughjettu.

È u venneri prima di Thanksgiving, u telefunu sonò.

U lanciamentu di u cohettu duverebbe esse pruvatu in circa trè settimane, è durante e teste di laboratoriu di u countdown, a sequenza di cumandamenti hè stata bluccata. In a vita reale, questu avaria a prova, è se u bloccu hè accadutu in pochi sicondi di l'iniziu di u mutore, parechji azzioni irreversibili avarianu in i sistemi ausiliarii, chì esigeranu una prontezza longa - è caru - di u cohete. Ùn averia micca principiatu, ma assai persone sarianu assai dispiaciuti per a perdita di tempu è assai, assai soldi. Ùn lasciate micca chì nimu vi dice chì u Dipartimentu di a Difesa spende soldi imprudente - ùn aghju mai scontru un capu di cuntrattu chì ùn hà micca postu u budgetu prima o secondu, seguitu da u calendariu.

In i mesi precedenti, sta sfida di countdown era stata eseguita centinaie di volte in parechje variazioni, cù solu uni pochi di singhiozzi minori. Allora a probabilità di sta succorsu era assai bassu, ma i so cunsiquenzi eranu assai significativi. Multiplicate sti dui fattori, è capirete chì a nutizia hà previstu una settimana di vacanze arruvinata per mè è decine di ingegneri è amministratori.

È l'attenzione hè stata pagata à mè cum'è a persona chì hà purtatu u sistema.

Cum'è cù a maiò parte di i sistemi critichi di sicurità, assai paràmetri sò stati registrati, per quessa, era abbastanza faciule d'identificà e pochi linee di codice chì sò state eseguite prima chì u sistema crash. È sicuru, ùn ci era assolutamente nunda di inusual in elli; e stesse espressioni eranu state eseguite cù successu literalmente millaie di volte durante a stessa corsa.

Chjamemu a ghjente da Apex in Rational perchè eranu quelli chì anu sviluppatu u compilatore è alcune di e rutine chì anu sviluppatu sò stati chjamati in u codice suspettu. Iddi (è tutti l'altri) eranu impressiunati chì ci era bisognu di ghjunghje à a radica di un prublema d'impurtanza literalmente naziunale.

Siccomu ùn ci era nunda interessante in i ghjurnali, avemu decisu di pruvà à ripruduce u prublema in un laboratoriu lucale. Ùn era micca un compitu faciule postu chì l'avvenimentu hè accadutu circa una volta per 1000 corse. Un mutivu suspettatu era chì una chjama à una funzione mutex sviluppata da u venditore (parte di u pacchettu di migrazione VADS) Unlock ùn hà micca purtatu à unlocking. U filu di trasfurmazioni chì chjamava a funzione processava i missaghji di battimentu di u core, chì nominali arrivavanu ogni seconda. Avemu elevatu a freccia à 10 Hz, vale à dì 10 volte per seconda, è cuminciamu à correre. Circa un'ora dopu, u sistema si chjude. In u logu, avemu vistu chì a sequenza di missaghji arregistrati era u listessu cum'è durante a prova falluta. Avemu fattu parechje altre corse, u sistema hè statu constantemente bluccatu 45-90 minuti dopu à l'iniziu, è ogni volta chì u logu cuntene a listessa strada. Ancu s'ellu eramu tecnicamente eseguitu codice differente - a frequenza di u messagiu era diversa - u cumpurtamentu di u sistema era u listessu, cusì eramu cunfidenti chì stu scenariu di carica causava u listessu prublema.

Avà avemu bisognu di capisce induve esattamente u bloccu hè accadutu in a sequenza di espressioni.

Questa implementazione di u sistema hà utilizatu u sistema di compitu Ada, è l'utilizava incredibbilmente male. I travaglii sò una custruzzione eseguibile simultaneamente d'altu livellu in Ada, qualcosa cum'è fili di esecuzione, integrata solu in a lingua stessa. Quandu dui compiti anu bisognu di cumunicà, "fissanu un rendezvous", scambià e dati necessarii, è poi fermanu l'appuntamentu è tornanu à e so esecuzioni indipendenti. Tuttavia, u sistema hè statu implementatu in modu diversu. Dopu chì un compitu di destinazione era rendezvous, quellu compitu target rendezvoused cù un altru compitu, chì poi rendezvoused cù un terzu compitu, è cusì finu à chì qualchì trasfurmazioni hè stata cumpletata. Dopu à questu, tutti questi rendezvous sò stati cumpletati è ogni compitu hà da turnà à a so esicuzzioni. Questu hè, avemu trattatu cù u sistema di chjama di funzione più caru in u mondu, chì ferma tuttu u prucessu di "multitasking" mentre trattava una parte di e dati di input. E prima di questu ùn hà micca purtatu à prublemi solu perchè u throughput era assai bassu.

Aghju descrittu stu mecanismu di compitu perchè quandu un rendezvous hè statu dumandatu o s'aspittava à compie, un "cambio di compitu" puderia accade. Questu hè, u processatore puderia cumincià à trasfurmà un altru compitu chì hè prontu per esse eseguitu. Risulta chì quandu un compitu hè prontu à rendezvous cù un altru compitu, un compitu completamente diversu pò cumincià à eseguisce, è eventualmente u cuntrollu torna à u primu rendezvous. È altri avvenimenti ponu accade chì causanu u cambiamentu di u compitu; un tali avvenimentu hè una chjama à una funzione di u sistema, cum'è stampà o esecutà un mutex.

Per capisce quale linea di codice causava u prublema, avia bisognu di truvà un modu per registrà u prugressu attraversu una sequenza di dichjarazioni senza attivà un cambiamentu di compitu, chì impediscenu un crash. Allora ùn pudia micca prufittà Put_Line()per evità di fà operazioni I/O. Puderaghju stabilisce una variabile contatore o qualcosa simili, ma cumu possu vede u so valore se ùn possu micca vede nantu à u screnu?

Also, quandu esaminà u logu, si girò fora chì, malgradu u trasfurmazioni di missaghji heartbeat appiccicate, chì bluccatu tutte e operazioni I / O di u prucessu è impeditu àutri trasfurmazioni da esse realizatu, altri compiti indipindenti cuntinuatu à esse eseguitu. Vale à dì, u travagliu ùn era micca bluccatu sanu, solu una catena (critica) di tarei.

Questu era l'indice necessariu per evaluà l'espressione di bloccu.

Aghju fattu un pacchettu Ada chì cuntene un compitu, un tipu enumeratu, è una variabile globale di quellu tipu. Litterali enumerable sò stati ligati à espressioni specifiche di a sequenza problematica (p.e. Incrementing_Buffer_Index, Locking_Mutex, Mutex_Unlocked), è dopu inseritu l'espressioni di assignazione in questu chì assignava l'enumerazione currispundenti à una variabile globale. Siccomu u codice di l'ughjettu di tuttu questu solu hà almacenatu una constante in memoria, u cambiamentu di u travagliu per via di a so esecuzione era estremamente improbabile. Eramu principarmenti suspetti di l'espressioni chì puderanu cambià u compitu, postu chì u bluccatu hè accadutu in l'esekzione piuttostu chè di vultà quandu cambia u compitu (per parechji motivi).

U compitu di seguimentu si facia solu in un ciclu è verificatu periodicamente per vede se u valore di a variabile globale avia cambiatu. Cù ogni cambiamentu, u valore hè statu salvatu in un schedariu. Allora una breve attesa è un novu verificatu. Aghju scrittu a variàbile à u schedariu perchè u compitu hè statu eseguitu solu quandu u sistema hà sceltu per l'esekzione quandu cambia u compitu in l'area di prublema. Qualunque sia accadutu in questu compitu ùn hà micca affettatu altre attività bluccate senza relazione.

Hè statu previstu chì quandu u sistema hà righjuntu u puntu di eseguisce u codice problematicu, a variabile globale serà resettata quandu si move à ogni espressione successiva. Allora succede qualcosa chì pruvucarà à cambià u compitu, è postu chì a so frequenza d'esekzione (10 Hz) hè più bassu di quella di u compitu di monitoraghju, u monitoru puderia catturà u valore di a variabile globale è scrive. In una situazione normale, puderia uttene una sequenza ripetitiva di un sottumessu di enumerazioni: l'ultimi valori di a variàbile à u mumentu di u cambiamentu di u travagliu. Quandu s'impicca, a variàbile glubale ùn deve più cambià, è l'ultimu valore scrittu indicà quale espressione ùn hà micca cumpletu.

Eseguiu u codice cù u seguimentu. S'hè congelatu. È u monitoraghju hà travagliatu cum'è un clockwork.

U logu cuntene a sequenza prevista, chì hè stata interrotta da un valore chì indica chì un mutex hè statu chjamatu Unlock, è u compitu ùn hè micca cumpletu - cum'è u casu cù millaie di chjamati precedenti.

L'ingegneri di l'Apex analizzavanu febbrilmente u so codice in questu mumentu è truvaru un locu in u mutex induve, in teoria, puderia accade un serratura. Ma a so prubabilità era assai bassu, postu chì solu una certa sequenza di avvenimenti chì si sò accaduti in un certu tempu puderia guidà à u bloccu. A lege di Murphy, ragazzi, hè a lege di Murphy.

Per prutege u pezzu di codice chì avia bisognu, aghju rimpiazzatu i chjami di funzione mutex (custruitu nantu à a funziunalità di u mutex OS) cù un picculu pacchettu mutex nativu Ada per cuntrullà l'accessu mutex à quellu pezzu.

L'aghju inseritu in u codice è eseguiu a prova. Sette ore dopu u codice era sempre travagliatu.

U mo codice hè statu sottumessu à Rational, induve l'anu compilatu, disassemblatu, è verificatu chì ùn hà micca utilizatu u stessu approcciu chì hè stata utilizata in e funzioni mutex problematiche.

Questa era a rivista di codice più affollata di a mo carriera 🙂 Ci era una decina d'ingegneri è amministratori in a stanza cun mè, altre dece persone eranu in una teleconferenza - è tutti anu esaminatu circa 20 linee di codice.

U codice hè statu rivedutu, novi fugliali eseguibili sò stati assemblati è sottumessi per a prova di regressione formale. Un paru di settimane dopu, a prova di countdown hè stata successu è u cohettu hè partitu.

Va bè, tuttu va bè, ma chì hè u scopu di a storia ?

Era un prublema assolutamente disgustante. Centinaie di millaie di linee di codice, esecuzione parallela, più di una decina di prucessi interagissanti, architettura povera è implementazione povera, interfacce per sistemi integrati è milioni di dollari spesi. Nisuna pressione, ghjustu.

Ùn era micca l'unicu chì travagliava annantu à questu prublema, ancu s'ellu era in u focu mentre facia u portu. Ma ancu s'ellu l'aghju fattu, questu ùn significa micca chì aghju capitu tutte e cintinara di millaie di linee di codice, o ancu scrematu. U codice è i logs sò stati analizati da ingegneri in tuttu u paese, ma quandu m'anu dettu e so ipotesi nantu à e cause di u fallimentu, mi pigliò solu una meza minutu per refute. È quandu mi era dumandatu di analizà e teorie, l'aghju da passà à un altru, perchè era ovviamente per mè chì questi ingegneri andavanu in modu sbagliatu. Sona presuntuosa? Iè, questu hè veru, ma aghju rifiutatu l'ipotesi è e dumande per un altru mutivu.

Aghju capitu a natura di u prublema. Ùn sapia micca esattamente induve era accadutu o perchè, ma sapia ciò chì succede.

In l'anni, aghju accumulatu assai cunniscenze è sperienza. Eru unu di i pionieri di l'usu di Ada è hà capitu i so vantaghji è i disadvantages. Sò cumu e librerie di runtime di Ada gestiscenu i travaglii è trattanu l'esekzione parallela. È capisce a prugrammazione di livellu bassu à u livellu di memoria, registri è assembler. In altre parolle, aghju una cunniscenza prufonda in u mo campu. È l'aghju utilizatu per truvà a causa di u prublema. Ùn aghju micca solu travagliatu intornu à u bug, aghju capitu cumu truvà in un ambiente di runtime assai sensibile.

Tali storie di lotta cù u codice ùn sò micca assai interessanti per quelli chì ùn sò micca familiarizati cù e caratteristiche è e cundizioni di una tale lotta. Ma sti stori ci aiutanu à capisce ciò chì ci vole à risolve i prublemi veramente difficili.

Per risolve i prublemi veramente difficili, avete bisognu à esse più cà solu un programatore. Avete bisognu di capisce u "destinu" di u codice, cumu interagisce cù u so ambiente, è cumu l'ambiente stessu travaglia.

È tandu averete a vostra propria settimana di vacanze in ruina.

Per esse continuatu.

Source: www.habr.com

Add a comment