Å Ä« ir stÄstu izlase no interneta par to, kÄ kļūdÄm dažkÄrt ir pilnÄ«gi neticamas izpausmes. VarbÅ«t arÄ« tev ir ko pastÄstÄ«t.
AutomaŔīnu alerÄ£ija pret vaniļas saldÄjumu
StÄsts inženieriem, kuri saprot, ka acÄ«mredzamais ne vienmÄr ir atbilde un ka neatkarÄ«gi no tÄ, cik tÄli Ŕķiet fakti, tie joprojÄm ir fakti. General Motors Corporation Pontiac nodaļa saÅÄma sÅ«dzÄ«bu:
Å Ä« ir otrÄ reize, kad es jums rakstu, un es nepÄrmetu jums, ka neatbildÄjÄt, jo tas izklausÄs traki. MÅ«su Ä£imenÄ ir tradÄ«cija katru vakaru pÄc vakariÅÄm Äst saldÄjumu. SaldÄjuma veidi mainÄs katru reizi, un pÄc vakariÅÄm visa Ä£imene izvÄlas, kÄdu saldÄjumu pirkt, pÄc kÄ dodos uz veikalu. Es nesen nopirku jaunu Pontiac, un kopÅ” tÄ laika mani ceļojumi pÄc saldÄjuma ir kļuvuÅ”i par problÄmu. Redziet, katru reizi, kad nopÄrku vaniļas saldÄjumu un atgriežos no veikala, maŔīna neieslÄdzas. Ja atnesu kÄdu citu saldÄjumu, maŔīna ieslÄdzas bez problÄmÄm. Es gribu uzdot nopietnu jautÄjumu, lai cik muļķīgi tas izklausÄ«tos: "Kas ir tas Pontiac, kas liek tam nesÄkas, kad es atnesu vaniļas saldÄjumu, bet viegli sÄkas, kad atnesu citu saldÄjuma garÅ”u?"
KÄ jÅ«s varat iedomÄties, nodaļas prezidents bija skeptisks par vÄstuli. TomÄr katram gadÄ«jumam es nosÅ«tÄ«ju inženieri pÄrbaudÄ«t. ViÅÅ” bija pÄrsteigts, ka viÅu sagaidÄ«ja turÄ«gs, labi izglÄ«tots vÄ«rietis, kurÅ” dzÄ«vo skaistÄ rajonÄ. ViÅi vienojÄs satikties uzreiz pÄc vakariÅÄm, lai abi varÄtu aiziet uz veikalu pÄc saldÄjuma. TajÄ vakarÄ tÄ bija vaniļa, un, kad viÅi atgriezÄs pie maŔīnas, tÄ vairs neieslÄdzÄs.
Inženieris ieradÄs vÄl trÄ«s vakarus. Pirmo reizi saldÄjums bija Å”okolÄde. Auto iedarbinÄja. OtrajÄ reizÄ bija zemeÅu saldÄjums. Auto iedarbinÄja. TreÅ”ajÄ vakarÄ viÅÅ” palÅ«dza paÅemt vaniļu. MaŔīna neieslÄdzÄs.
RacionÄli prÄtojot, inženieris atteicÄs ticÄt, ka automaŔīnai ir alerÄ£ija pret vaniļas saldÄjumu. TÄpÄc vienojos ar maŔīnas Ä«paÅ”nieku, ka viÅÅ” turpinÄs vizÄ«tes, lÄ«dz atradÄ«s problÄmas risinÄjumu. Un pa ceļam viÅÅ” sÄka veikt piezÄ«mes: pierakstÄ«ja visu informÄciju, diennakts laiku, benzÄ«na veidu, ieraÅ”anÄs un atgrieÅ”anÄs laiku no veikala utt.
Inženieris drÄ«z saprata, ka automaŔīnas Ä«paÅ”nieks vaniļas saldÄjuma iegÄdei veltÄ«ja mazÄk laika. Iemesls bija preÄu izkÄrtojums veikalÄ. Vaniļas saldÄjums bija vispopulÄrÄkais un tika glabÄts atseviÅ”Ä·Ä saldÄtavÄ veikala priekÅ”pusÄ, lai bÅ«tu vieglÄk atrast. Un visas pÄrÄjÄs Ŕķirnes atradÄs veikala aizmugurÄ, un vajadzÄja daudz vairÄk laika, lai atrastu pareizo Ŕķirni un samaksu.
Tagad jautÄjums bija inženierim: kÄpÄc automaŔīna neieslÄdzÄs, ja kopÅ” dzinÄja izslÄgÅ”anas bija pagÄjis mazÄk laika? TÄ kÄ problÄma bija laikÄ, nevis vaniļas saldÄjumÄ, inženieris Ätri atrada atbildi: tÄ bija gÄzes slÄdzene. Tas notika katru vakaru, bet, kad automaŔīnas Ä«paÅ”nieks vairÄk laika pavadÄ«ja saldÄjuma meklÄjumos, motors paspÄja pietiekami atdzist un viegli iedarbinÄja. Un, kad vÄ«rietis nopirka vaniļas saldÄjumu, motors vÄl bija pÄrÄk karsts un gÄzes slÄdzenei nebija laika izŔķīst.
MorÄle: pat pilnÄ«gi trakas problÄmas dažreiz ir reÄlas.
crash somainÄ Å¾urka
Ir sÄpÄ«gi to piedzÄ«vot. KÄ programmÄtÄjs pierod vainot savu kodu pirmo, otro, treÅ”o... un kaut kur desmittÅ«kstoÅ”ajÄ vietÄ vainojat kompilatoru. Un tÄlÄk sarakstÄ jÅ«s jau vainojat aprÄ«kojumu.
Å eit ir mans stÄsts par aparatÅ«ras kļūdu.
SpÄlei Crash Bandicoot es uzrakstÄ«ju kodu, lai ielÄdÄtu un saglabÄtu atmiÅas kartÄ. Tik paÅ”apmierinÄtajam spÄļu izstrÄdÄtÄjam tÄ bija kÄ pastaiga parkÄ: domÄju, ka darbs prasÄ«s vairÄkas dienas. TomÄr es beidzu atkļūdot kodu seÅ”as nedÄļas. Pa ceļam es atrisinÄju citas problÄmas, bet ik pÄc dažÄm dienÄm uz dažÄm stundÄm atgriezos pie Ŕī koda. TÄ bija agonija.
Simptoms izskatÄ«jÄs Å”Ädi: saglabÄjot paÅ”reizÄjo spÄles gaitu un piekļūstot atmiÅas kartei, viss gandrÄ«z vienmÄr notiek labi... Bet dažreiz lasÄ«Å”anas vai rakstÄ«Å”anas darbÄ«bas taimauts bez acÄ«mredzama iemesla. ÄŖss ieraksts bieži sabojÄ atmiÅas karti. Kad spÄlÄtÄjs mÄÄ£ina glÄbt, viÅam ne tikai neizdodas saglabÄt, bet arÄ« iznÄ«cina karti. Smuki.
PÄc kÄda laika mÅ«su Sony producente Konija Busa sÄka krist panikÄ. MÄs nevarÄjÄm nosÅ«tÄ«t spÄli ar Å”o kļūdu, un pÄc seÅ”Äm nedÄļÄm es nesapratu, kas izraisÄ«ja problÄmu. Izmantojot Koniju, mÄs sazinÄjÄmies ar citiem PS1 izstrÄdÄtÄjiem: vai kÄds ir saskÄries ar kaut ko lÄ«dzÄ«gu? NÄ. Nevienam nebija problÄmu ar atmiÅas karti.
Ja jums nav ideju par atkļūdoÅ”anu, vienÄ«gÄ pieeja ir āsadalÄ«t un iekarotā: no bojÄtÄs programmas izÅemiet arvien vairÄk koda, lÄ«dz paliek salÄ«dzinoÅ”i mazs fragments, kas joprojÄm rada problÄmu. Tas ir, jÅ«s nogriežat programmu pa gabalu, lÄ«dz paliek daļa, kurÄ ir kļūda.
Bet lieta ir tÄda, ka no videospÄles ir ļoti grÅ«ti izgriezt gabalus. KÄ to palaist, ja esat noÅÄmis kodu, kas atdarina gravitÄciju? Vai zÄ«mÄt rakstzÄ«mes?
TÄpÄc mums ir jÄaizstÄj veseli moduļi ar stubiem, kas izliekas, ka dara kaut ko noderÄ«gu, bet patiesÄ«bÄ dara kaut ko ļoti vienkÄrÅ”u, kas nevar saturÄt kļūdas. JÄraksta tÄdi kruÄ·i, lai spÄle vismaz darbotos. Tas ir lÄns un sÄpÄ«gs process.
ÄŖsÄk sakot, es to izdarÄ«ju. Es noÅÄmu arvien vairÄk koda daļu, lÄ«dz man palika sÄkotnÄjais kods, kas konfigurÄ sistÄmu spÄles palaiÅ”anai, inicializÄ renderÄÅ”anas aparatÅ«ru utt. Protams, Å”ajÄ posmÄ es nevarÄju izveidot saglabÄÅ”anas un ielÄdes izvÄlni, jo man bÅ«tu jÄizveido stubs visam grafikas kodam. Bet es varÄtu izlikties par lietotÄju, izmantojot (neredzamo) saglabÄÅ”anas un ielÄdes ekrÄnu, un lÅ«gt saglabÄt un pÄc tam ierakstÄ«t atmiÅas kartÄ.
TÄdÄjÄdi man palika neliels koda fragments, kuram joprojÄm bija iepriekÅ” minÄtÄ problÄma, taÄu tÄ joprojÄm notika nejauÅ”i! VisbiežÄk viss darbojÄs labi, bet reizÄm bija kļūmes. Es noÅÄmu gandrÄ«z visu spÄles kodu, bet kļūda joprojÄm bija dzÄ«va. Tas bija mulsinoÅ”i: atlikuÅ”ais kods faktiski neko nedarÄ«ja.
KÄdÄ brÄ«dÄ«, laikam ap trijiem naktÄ«, man ienÄca prÄtÄ doma. LasÄ«Å”anas un rakstÄ«Å”anas (ievades/izvades) operÄcijas ietver precÄ«zus izpildes laikus. StrÄdÄjot ar cieto disku, atmiÅas karti vai Bluetooth moduli, zemÄ lÄ«meÅa kods, kas atbild par lasÄ«Å”anu un rakstÄ«Å”anu, to dara saskaÅÄ ar pulksteÅa impulsiem.
Ar pulksteÅa palÄ«dzÄ«bu ierÄ«ce, kas nav tieÅ”i savienota ar procesoru, tiek sinhronizÄta ar procesorÄ izpildÄmo kodu. Pulkstenis nosaka datu pÄrraides Ätrumu ā datu pÄrsÅ«tÄ«Å”anas Ätrumu. Ja ir neskaidrÄ«bas ar hronometrÄžu, tiek sajaukta arÄ« aparatÅ«ra vai programmatÅ«ra, vai abi. Un tas ir ļoti slikti, jo dati var tikt sabojÄti.
Ko darÄ«t, ja kaut kas mÅ«su kodÄ sajauc laiku? Es pÄrbaudÄ«ju visu, kas ar to saistÄ«ts, testa programmas kodÄ un pamanÄ«ju, ka mÄs PS1 programmÄjamo taimeri iestatÄ«jÄm uz 1 kHz (1000 atzÄ«mÄm sekundÄ). Tas ir diezgan daudz; pÄc noklusÄjuma, kad konsole startÄ, tÄ darbojas ar 100 Hz. Un lielÄkÄ daļa spÄļu izmanto Å”o frekvenci.
Endijs, spÄles izstrÄdÄtÄjs, iestatÄ«ja taimeri uz 1 kHz, lai kustÄ«bas tiktu aprÄÄ·inÄtas precÄ«zÄk. Endijam ir tendence pÄrspÄ«lÄt, un, ja mÄs lÄ«dzinÄsim gravitÄciju, mÄs to darÄm pÄc iespÄjas precÄ«zÄk!
Bet ko darÄ«t, ja taimera paÄtrinÄÅ”ana kaut kÄdÄ veidÄ ietekmÄtu programmas kopÄjo laiku un lÄ«dz ar to arÄ« pulksteni, kas regulÄ atmiÅas kartes datu pÄrraides Ätrumu?
Es komentÄju taimera kodu. Kļūda vairs neatkÄrtojÄs. Bet tas nenozÄ«mÄ, ka mÄs to labojÄm, jo āākļūme radÄs nejauÅ”i. Ja man vienkÄrÅ”i paveicÄs?
PÄc dažÄm dienÄm es vÄlreiz eksperimentÄju ar testa programmu. Kļūda neatkÄrtojÄs. Es atgriezos pie pilnas spÄles kodu bÄzes un mainÄ«ju saglabÄÅ”anas un ielÄdes kodu, lai programmÄjamais taimeris pirms piekļuves atmiÅas kartei tiktu atiestatÄ«ts uz sÄkotnÄjo vÄrtÄ«bu (100 Hz), un pÄc tam atiestatÄ«tu atpakaļ uz 1 kHz. VairÄk avÄriju nebija.
Bet kÄpÄc tas notika?
Atkal atgriezos pie testa programmas. Es mÄÄ£inÄju atrast kÄdu modeli kļūdas raÅ”anÄs gadÄ«jumÄ ar 1 kHz taimeri. Galu galÄ es pamanÄ«ju, ka kļūda rodas, kad kÄds spÄlÄ ar PS1 kontrolieri. TÄ kÄ es pats to darÄ«tu reti, kÄpÄc man, pÄrbaudot saglabÄÅ”anas un ielÄdes kodu, ir vajadzÄ«gs kontrolleris? - Es pat nepamanÄ«ju Å”o atkarÄ«bu. Bet kÄdu dienu viens no mÅ«su mÄksliniekiem gaidÄ«ja, kad pabeigÅ”u testÄÅ”anu ā es laikam tajÄ brÄ«dÄ« lamÄjos ā un nervozi virpa savÄs rokÄs kontrolieri. RadÄs kļūda. "Pagaidi, ko?!" Nu, dariet to vÄlreiz!"
Kad sapratu, ka Å”ie divi notikumi ir savstarpÄji saistÄ«ti, es varÄju viegli atveidot kļūdu: sÄku ierakstÄ«t atmiÅas kartÄ, pÄrvietoju kontrolleri un sabojÄju atmiÅas karti. Man tas izskatÄ«jÄs pÄc aparatÅ«ras kļūdas.
Es atnÄcu pie Konijas un pastÄstÄ«ju viÅai par savu atklÄjumu. ViÅa nodeva informÄciju vienam no inženieriem, kas izstrÄdÄja PS1. "NeiespÄjami," viÅÅ” atbildÄja, "TÄ nevar bÅ«t aparatÅ«ras problÄma." Es palÅ«dzu Konijai sarunÄt mums sarunu.
Man piezvanÄ«ja inženieris, un mÄs strÄ«dÄjÄmies viÅa lauztajÄ angļu valodÄ un manÄ (ÄrkÄrtÄ«gi) lauztajÄ japÄÅu valodÄ. Beidzot es teicu: "Ä»aujiet man vienkÄrÅ”i nosÅ«tÄ«t savu 30 lÄ«niju testa programmu, kur kontroliera pÄrvietoÅ”ana izraisa kļūdu." ViÅÅ” piekrita. Teica, ka tÄ bija laika izŔķieÅ”ana un ka viÅÅ” ir Å”ausmÄ«gi aizÅemts, strÄdÄjot pie jauna projekta, taÄu piekÄpsies, jo mÄs esam ļoti nozÄ«mÄ«gs Sony izstrÄdÄtÄjs. Es iztÄ«rÄ«ju savu testa programmu un nosÅ«tÄ«ju to viÅam.
NÄkamajÄ vakarÄ (mÄs bijÄm LosandželosÄ, bet viÅÅ” TokijÄ) viÅÅ” man piezvanÄ«ja un nekaunÄ«gi atvainojÄs. TÄ bija aparatÅ«ras problÄma.
Es nezinu, kas tieÅ”i bija par kļūdu, bet pÄc tÄ, ko dzirdÄju Sony galvenajÄ mÄ«tnÄ, ja iestatÄ«jÄt taimeri uz pietiekami augstu vÄrtÄ«bu, tas traucÄja komponentiem mÄtesplatÄ taimera kristÄla tuvumÄ. Viens no tiem bija atmiÅas kartes bodu Ätruma kontrolleris, kas arÄ« iestatÄ«ja kontrolieriem bodu Ätrumu. Es neesmu inženieris, tÄpÄc, iespÄjams, esmu kaut ko sajaucis.
Bet bÅ«tÄ«ba ir tÄda, ka starp mÄtesplates komponentiem bija traucÄjumi. Un, vienlaikus pÄrsÅ«tot datus caur kontrollera portu un atmiÅas kartes portu ar taimeri, kas darbojas ar 1 kHz, tika zaudÄti biti, dati un karte tika bojÄta.
Sliktas govis
AstoÅdesmitajos gados mans mentors Sergejs rakstÄ«ja programmatÅ«ru SM-1980, padomju PDP-1800 klonam. Å is mikrodators nupat tika uzstÄdÄ«ts dzelzceļa stacijÄ netÄlu no Sverdlovskas, nozÄ«mÄ«ga PSRS transporta mezgla. JaunÄ sistÄma bija paredzÄta vagonu un kravu satiksmes marÅ”rutÄÅ”anai. Bet tajÄ bija kaitinoÅ”a kļūda, kas izraisÄ«ja nejauÅ”as avÄrijas un avÄrijas. Kritieni vienmÄr notika, kad kÄds vakarÄ devÄs mÄjÄs. Bet, neskatoties uz rÅ«pÄ«gu izmeklÄÅ”anu nÄkamajÄ dienÄ, dators darbojÄs pareizi visos manuÄlajos un automÄtiskajos testos. Tas parasti norÄda uz sacensÄ«bu stÄvokli vai kÄdu citu konkurences kļūdu, kas notiek noteiktos apstÄkļos. Noguris no zvaniem vÄlÄ vakarÄ, Sergejs nolÄma Ä·erties pie lietas un vispirms saprast, kÄdi apstÄkļi ŔķiroÅ”anas parkÄ izraisÄ«ja datora bojÄjumu.
PirmkÄrt, viÅÅ” apkopoja statistiku par visiem neizskaidrojamiem kritieniem un izveidoja grafiku pÄc datuma un laika. Modelis bija acÄ«mredzams. NovÄrojot vÄl dažas dienas, Sergejs saprata, ka var viegli paredzÄt turpmÄko sistÄmas kļūmju laiku.
DrÄ«z viÅÅ” uzzinÄja, ka traucÄjumi raduÅ”ies tikai tad, kad stacija Ŕķiroja liellopu kravas no Ukrainas ziemeļiem un Krievijas rietumiem, kas devÄs uz tuvÄjo kautuvi. Tas pats par sevi bija dÄ«vaini, jo kautuvi apgÄdÄja fermas, kas atrodas daudz tuvÄk, KazahstÄnÄ.
Äernobiļas atomelektrostacija eksplodÄja 1986. gadÄ, un radioaktÄ«vie nokriÅ”Åi padarÄ«ja apkÄrtÄjÄs teritorijas neapdzÄ«vojamas. PiesÄrÅotas bija plaÅ”as teritorijas Ukrainas ziemeļos, BaltkrievijÄ un Krievijas rietumos. AizdomÄs par augstu radiÄcijas lÄ«meni atbraukuÅ”ajos vagonos Sergejs izstrÄdÄja metodi Ŕīs teorijas pÄrbaudei. IedzÄ«votÄjiem bija aizliegts turÄt dozimetri, tÄpÄc Sergejs piereÄ£istrÄjÄs pie vairÄkiem militÄrpersonÄm dzelzceļa stacijÄ. PÄc vairÄkiem Å”Åabja dzÄrieniem viÅam izdevÄs pÄrliecinÄt karavÄ«ru izmÄrÄ«t radiÄcijas lÄ«meni vienÄ no aizdomÄ«gajiem vagoniem. IzrÄdÄ«jÄs, ka lÄ«menis bija vairÄkas reizes augstÄks par normÄlÄm vÄrtÄ«bÄm.
Liellopi ne tikai izstaroja daudz starojuma, bet arÄ« tÄ lÄ«menis bija tik augsts, ka tas izraisÄ«ja nejauÅ”u bitu zudumu SM-1800 atmiÅÄ, kas atradÄs ÄkÄ blakus stacijai.
PSRS bija pÄrtikas trÅ«kums, un varas iestÄdes nolÄma sajaukt Äernobiļas gaļu ar gaļu no citiem valsts reÄ£ioniem. Tas ļÄva samazinÄt kopÄjo radioaktivitÄtes lÄ«meni, nezaudÄjot vÄrtÄ«gus resursus. UzzinÄjis par to, Sergejs nekavÄjoties aizpildÄ«ja dokumentus emigrÄcijai. Un datoru avÄrijas apstÄjÄs paÅ”as, kad radiÄcijas lÄ«menis laika gaitÄ samazinÄjÄs.
Caur caurulÄm
Savulaik Movietech Solutions radÄ«ja programmatÅ«ru kinoteÄtriem, kas paredzÄta grÄmatvedÄ«bai, biļeÅ”u tirdzniecÄ«bai un vispÄrÄjai vadÄ«bai. GalvenÄs lietotnes DOS versija bija diezgan populÄra mazo un vidÄja lieluma kinoteÄtru Ä·ÄdÄs ZiemeļamerikÄ. TÄpÄc nav pÄrsteidzoÅ”i, ka tad, kad tika paziÅota par Windows 95 versiju, kas ir integrÄta ar jaunÄkajiem skÄrienekrÄniem un paÅ”apkalpoÅ”anÄs kioskiem un bija aprÄ«kota ar visa veida ziÅoÅ”anas rÄ«kiem, arÄ« tÄ Ätri kļuva populÄra. VisbiežÄk atjauninÄjums noritÄja bez problÄmÄm. VietÄjie IT darbinieki uzstÄdÄ«ja jaunu aprÄ«kojumu, migrÄja datus, un bizness turpinÄjÄs. IzÅemot gadÄ«jumus, kad tas nebija ilgs. Kad tas notika, uzÅÄmums izsÅ«tÄ«ja Džeimsu ar iesauku "ApkopÄjs".
Lai gan segvÄrds liecina par nelietÄ«gu veidu, tÄ«rÄ«tÄjs ir tikai instruktora, uzstÄdÄ«tÄja un visnotaļ profesionÄļa kombinÄcija. Džeimss dažas dienas pavadÄ«ja klienta vietnÄ, saliekot kopÄ visus komponentus, un pÄc tam vÄl pÄris dienas mÄcÄ«ja personÄlam, kÄ lietot jauno sistÄmu, atrisinÄja visas raduÅ”Äs aparatÅ«ras problÄmas un palÄ«dzÄja programmatÅ«rai tÄs sÄkuma stadijÄ.
TÄpÄc nav pÄrsteidzoÅ”i, ka Å”ajos drudžainajos laikos Džeimss ieradÄs birojÄ no rÄ«ta, un, pirms viÅÅ” paguva sasniegt savu rakstÄmgaldu, viÅu sagaidÄ«ja menedžeris, kas bija piepildÄ«ts ar kofeÄ«nu neparasti.
"Es baidos, ka jums pÄc iespÄjas ÄtrÄk jÄdodas uz Anapolisu, JaunskotijÄ." Visa viÅu sistÄma sabojÄjÄs, un pÄc nakts darba ar viÅu inženieriem mÄs nevaram saprast, kas noticis. Å Ä·iet, ka serverÄ« ir radusies tÄ«kla kļūme. Bet tikai pÄc tam, kad sistÄma bija darbojusies vairÄkas minÅ«tes.
ā Vai viÅi neatgriezÄs pie vecÄs sistÄmas? - Džeimss atbildÄja pilnÄ«gi nopietni, lai gan garÄ«gi izbrÄ«nÄ iepleta acis.
ā TieÅ”i tÄ: viÅu IT speciÄlists āmainÄ«ja prioritÄtesā un nolÄma aiziet ar savu veco serveri. Džeims, viÅi instalÄja sistÄmu seÅ”Äs vietÄs un tikko samaksÄja par papildu atbalstu, un viÅu bizness tagad darbojas tÄpat kÄ 1950. gados.
Džeimss nedaudz iztaisnojÄs.
- Tas ir cits jautÄjums. Labi, sÄksim.
Kad viÅÅ” ieradÄs AnapolisÄ, pirmais, ko viÅÅ” izdarÄ«ja, bija atrast klienta pirmo teÄtri, kurÄ bija problÄma. LidostÄ uzÅemtajÄ kartÄ viss izskatÄ«jÄs pieklÄjÄ«gi, bet apkÄrtne ap vÄlamo adresi izskatÄ«jÄs aizdomÄ«ga. Nevis geto, bet atgÄdina film noir. Kad Džeimss novietoja automaŔīnu pie pilsÄtas centra apmales, viÅam tuvojÄs prostitÅ«ta. Å emot vÄrÄ Anapolisas lielumu, tas, visticamÄk, bija vienÄ«gais visÄ pilsÄtÄ. ViÅas izskats uzreiz atgÄdinÄja slaveno varoni, kurÅ” uz lielÄ ekrÄna piedÄvÄja seksu par naudu. NÄ, ne par Džūliju Robertsu, bet gan par Džonu Voitu [mÄjiens uz filmu "Pusnakts kovbojs" - apm. josla].
AizsÅ«tÄ«jis prostitÅ«tu ceļÄ, Džeimss devÄs uz kino. ApkÄrtne bija kļuvusi labÄka, taÄu tÄ joprojÄm radÄ«ja nobraukta iespaidu. Ne tas, ka Džeimss bÅ«tu pÄrÄk noraizÄjies. ViÅÅ” jau agrÄk ir bijis nožÄlojamÄs vietÄs. Un Ŕī bija KanÄda, kur pat laupÄ«tÄji ir pietiekami pieklÄjÄ«gi, lai pateiktu "paldies" pÄc maku paÅemÅ”anas.
KinoteÄtra sÄnu ieeja atradÄs drÅ«mÄ alejÄ. Džeimss piegÄja pie durvÄ«m un pieklauvÄja. DrÄ«z vien tas ÄÄ«kstÄja un nedaudz atvÄrÄs.
-Tu esi apkopÄja? - no iekÅ”puses atskanÄja aizsmakusi balss.
- JÄ, tas esmu es... Es atnÄcu visu salabot.
Džeimss iegÄja kinoteÄtra vestibilÄ. AcÄ«mredzot, kam nebija citas izvÄles, darbinieki sÄka apmeklÄtÄjiem dalÄ«t papÄ«ra biļetes. Tas apgrÅ«tinÄja finanÅ”u pÄrskatu sagatavoÅ”anu, nemaz nerunÄjot par interesantÄkÄm detaļÄm. TaÄu darbinieki atviegloti sagaidÄ«ja Džeimsu un nekavÄjoties aizveda uz servera telpu.
No pirmÄ acu uzmetiena viss bija kÄrtÄ«bÄ. Džeimss pieteicÄs serverÄ« un pÄrbaudÄ«ja ierastÄs aizdomÄ«gÄs vietas. NekÄdu problÄmu. TomÄr piesardzÄ«bas dÄļ Džeimss izslÄdza serveri, nomainÄ«ja tÄ«kla karti un atcÄla sistÄmu. ViÅa nekavÄjoties sÄka strÄdÄt pilnÄ apjomÄ. Darbinieki atkal sÄka tirgot biļetes.
Džeimss piezvanÄ«ja Markam un informÄja viÅu par situÄciju. Nav grÅ«ti iedomÄties, ka Džeimss varÄtu vÄlÄties palikt un redzÄt, vai nenotiek kas negaidÄ«ts. ViÅÅ” nokÄpa pa kÄpnÄm un sÄka jautÄt darbiniekiem, kas noticis. AcÄ«mredzot sistÄma ir pÄrtraukusi darboties. ViÅi to izslÄdza un ieslÄdza, viss strÄdÄja. Bet pÄc 10 minÅ«tÄm sistÄma atkrita.
TieÅ”i Å”ajÄ brÄ«dÄ« notika kaut kas lÄ«dzÄ«gs. PÄkÅ”Åi biļeÅ”u pÄrdoÅ”anas sistÄma sÄka mest kļūdas. Darbinieki nopÅ«tÄs un paÄ·Ära papÄ«ra biļetes, un Džeimss steidzÄs uz servera telpu. Ar serveri viss izskatÄ«jÄs labi.
Tad ienÄca viens no darbiniekiem.
ā SistÄma atkal strÄdÄ.
Džeimss bija neizpratnÄ, jo nebija neko izdarÄ«jis. PrecÄ«zÄk, nekas tÄds, kas liktu sistÄmai darboties. ViÅÅ” atteicÄs, paÅÄma tÄlruni un piezvanÄ«ja uz sava uzÅÄmuma atbalsta lÄ«niju. DrÄ«z vien tas pats darbinieks ienÄca serveru telpÄ.
- SistÄma nedarbojas.
Džeimss paskatÄ«jÄs uz serveri. Uz ekrÄna dejoja interesants un pazÄ«stams daudzkrÄsainu formu raksts - haotiski savijas un pÄ«pes. MÄs visi esam redzÄjuÅ”i Å”o ekrÄnsaudzÄtÄju kÄdÄ brÄ«dÄ«. Tas bija skaisti atveidots un burtiski hipnotizÄjoÅ”s.
Džeimss nospieda pogu, un raksts pazuda. ViÅÅ” steidzÄs uz biļeÅ”u kasi un pa ceļam sastapa darbinieku, kas atgriezÄs pie viÅa.
ā SistÄma atkal strÄdÄ.
Ja jÅ«s varat veikt garÄ«go facepalm, tieÅ”i to izdarÄ«ja Džeimss. EkrÄnsaudzÄtÄjs. Tas izmanto OpenGL. Un tÄpÄc darbÄ«bas laikÄ tas patÄrÄ visus servera procesora resursus. RezultÄtÄ katrs zvans uz serveri beidzas ar taimautu.
Džeimss atgriezÄs servera telpÄ, pieteicÄs un nomainÄ«ja ekrÄnsaudzÄtÄju pret skaistajÄm caurulÄm ar tukÅ”u ekrÄnu. Tas ir, ekrÄnsaudzÄtÄja vietÄ, kas patÄrÄ 100% procesora resursu, es instalÄju citu, kas nepatÄrÄ resursus. Tad es gaidÄ«ju 10 minÅ«tes, lai pÄrbaudÄ«tu savu minÄjumu.
Kad Džeimss ieradÄs nÄkamajÄ kinoteÄtrÄ«, viÅÅ” domÄja, kÄ paskaidrot savam menedžerim, ka viÅÅ” tikko nolidojis 800 km, lai izslÄgtu ekrÄnsaudzÄtÄju.
AvÄrija noteiktÄ mÄness fÄzÄ
Patiess stÄsts. KÄdu dienu radÄs programmatÅ«ras kļūda, kas bija atkarÄ«ga no mÄness fÄzes. Bija neliela rutÄ«na, ko parasti izmantoja dažÄdÄs MIT programmÄs, lai aprÄÄ·inÄtu tuvinÄjumu patiesajai MÄness fÄzei. GLS izveidoja Å”o rutÄ«nu LISP programmÄ, kas, rakstot failu, izvadÄ«tu rindiÅu ar gandrÄ«z 80 rakstzÄ«mÄm garu laikspiedolu. Ä»oti reti ziÅojuma pirmÄ rindiÅa bija pÄrÄk gara un noveda pie nÄkamÄs rindas. Un, kad programma vÄlÄk izlasÄ«ja Å”o failu, tÄ nolÄdÄjÄs. PirmÄs rindas garums bija atkarÄ«gs no precÄ«za datuma un laika, kÄ arÄ« no fÄzes specifikÄcijas garuma laika zÄ«moga drukÄÅ”anas laikÄ. Tas ir, kļūda burtiski bija atkarÄ«ga no mÄness fÄzes!
Pirmais papīra izdevums
TomÄr esiet uzmanÄ«gi ar pieÅÄmumiem. Pirms dažiem gadiem CERN (Eiropas KodolpÄtÄ«jumu centra) inženieri saskÄrÄs ar kļūdÄm eksperimentos, kas tika veikti LielajÄ elektronu-pozitronu paÄtrinÄtÄjÄ. TÄ kÄ datori aktÄ«vi apstrÄdÄ milzÄ«go Ŕīs ierÄ«ces radÄ«to datu apjomu pirms rezultÄtu parÄdÄ«Å”anas zinÄtniekiem, daudzi sprieda, ka programmatÅ«ra ir kaut kÄdÄ veidÄ jutÄ«ga pret MÄness fÄzi. VairÄki izmisuÅ”i inženieri nokļuva patiesÄ«bas bÅ«tÄ«bÄ. Kļūda radÄs sakarÄ ar nelielÄm 27 km garÄ gredzena Ä£eometrijas izmaiÅÄm, ko izraisÄ«ja Zemes deformÄcija MÄness pÄrejas laikÄ! Å is stÄsts ir ienÄcis fizikas folklorÄ kÄ "Å Å«tona atriebÄ«ba daļiÅu fizikÄ" un piemÄrs saiknei starp vienkÄrÅ”Äkajiem un senÄkajiem fizikas likumiem un progresÄ«vÄkajÄm zinÄtnes koncepcijÄm.
Noskalojot tualeti, vilciens apstÄjas
LabÄkÄ aparatÅ«ras kļūda, par kuru esmu dzirdÄjis, bija ÄtrvilcienÄ FrancijÄ. Kļūda izraisÄ«ja vilciena avÄrijas bremzÄÅ”anu, taÄu tikai tad, ja tajÄ atradÄs pasažieri. KatrÄ Å”ÄdÄ gadÄ«jumÄ vilciens tika izÅemts no ekspluatÄcijas, pÄrbaudÄ«ts, bet nekas netika atrasts. Tad viÅÅ” tika nosÅ«tÄ«ts atpakaļ uz lÄ«niju, un viÅÅ” nekavÄjoties apstÄjÄs.
VienÄ no pÄrbaudÄm vilcienÄ braucoÅ”ais inženieris devÄs uz tualeti. ViÅÅ” drÄ«z nomazgÄjÄs, BOOM! ÄrkÄrtas apstÄÅ”anÄs.
Inženieris sazinÄjÄs ar vadÄ«tÄju un jautÄja:
ā Ko jÅ«s darÄ«jÄt tieÅ”i pirms bremzÄÅ”anas?
- Nu, es samazinÄju Ätrumu nobraucienÄ...
Tas bija dÄ«vaini, jo normÄlas darbÄ«bas laikÄ vilciens nobraucienos palÄnina Ätrumu desmitiem reižu. Vilciens devÄs tÄlÄk, un nÄkamajÄ nobraucienÄ maŔīnists brÄ«dinÄja:
ā Es palÄninÄÅ”u.
Nekas nav noticis.
ā Ko jÅ«s darÄ«jÄt pÄdÄjÄ bremzÄÅ”anas laikÄ? - jautÄja Å”oferis.
- Nu... es biju tualetÄ...
- Nu tad ej uz tualeti un dari to, ko darÄ«ji, kad mÄs atkal kÄpjam lejÄ!
Inženieris devÄs uz tualeti un, kad vadÄ«tÄjs brÄ«dinÄja: āEs palÄninuā, viÅÅ” noskaloja Å«deni. Protams, vilciens nekavÄjoties apstÄjÄs.
Tagad viÅi varÄja atkÄrtot problÄmu, un viÅiem bija jÄatrod cÄlonis.
PÄc divÄm minÅ«tÄm pamanÄ«ja, ka dzinÄja bremžu pults vads (vilcienam katrÄ galÄ bija pa vienam dzinÄjam) ir atvienots no elektrÄ«bas skapja sienas un guļ uz releja, kas kontrolÄja tualetes spraudÅa solenoÄ«du... Kad relejs tika ieslÄgts, tas radÄ«ja traucÄjumus bremžu trosÄ, un sistÄmas aizsardzÄ«ba pret kļūmÄm vienkÄrÅ”i ietvÄra avÄrijas bremzÄÅ”anu.
VÄrti, kas ienÄ«da FORTRAN
Pirms dažiem mÄneÅ”iem mÄs pamanÄ«jÄm, ka tÄ«kla savienojumi kontinentÄlajÄ daÄ¼Ä [tas bija Havaju salÄs] kļūst ļoti, ļoti lÄni. Tas var ilgt 10-15 minÅ«tes un pÄc tam pÄkÅ”Åi atkÄrtoties. PÄc kÄda laika mans kolÄÄ£is man sÅ«dzÄjÄs par tÄ«kla savienojumiem kontinentÄlajÄ daÄ¼Ä vispÄr nestrÄdÄ. ViÅam bija kÄds FORTRAN kods, kas bija jÄpÄrkopÄ uz cietzemes maŔīnu, taÄu tas nevarÄja, jo "tÄ«kls neizturÄja pietiekami ilgi, lai pabeigtu FTP augÅ”upielÄdi".
JÄ, izrÄdÄ«jÄs, ka tÄ«kla kļūmes radÄs, kad kolÄÄ£is mÄÄ£inÄja FTP failu ar avota kodu FORTRAN uz maŔīnu cietzemÄ. MÄs mÄÄ£inÄjÄm arhivÄt failu: pÄc tam tas tika nokopÄts gludi (bet mÄrÄ·a maŔīnai nebija atsaiÅotÄja, tÄpÄc problÄma netika atrisinÄta). Beidzot mÄs "sadalÄm" FORTRAN kodu ļoti mazos gabaliÅos un nosÅ«tÄ«jÄm tos pa vienam. LielÄkÄ daļa fragmentu tika nokopÄti bez problÄmÄm, bet daži gabali neizturÄja vai pÄrgÄja pÄc tam ļoti daudz mÄÄ£inÄjumi.
PÄrbaudot problemÄtiskÄs vietas, mÄs atklÄjÄm, ka tiem ir kaut kas kopÄ«gs: tajos visos bija komentÄru bloki, kas sÄkÄs un beidzÄs ar rindÄm, kas sastÄv no lielajiem burtiem C (kÄ kolÄÄ£is deva priekÅ”roku komentÄÅ”anai FORTRAN). MÄs nosÅ«tÄ«jÄm e-pastu tÄ«kla ekspertiem kontinentÄlajÄ daÄ¼Ä un lÅ«dzÄm palÄ«dzÄ«bu. Protams, viÅi gribÄja redzÄt mÅ«su failu paraugus, kurus nevarÄja pÄrsÅ«tÄ«t caur FTP... bet mÅ«su vÄstules lÄ«dz viÅiem nesasniedza. Beidzot mÄs izdomÄjÄm vienkÄrÅ”u aprakstÄ«tkÄ izskatÄs nepÄrsÅ«tÄmi faili. Tas izdevÄs :) [Vai es Å”eit varu pievienot piemÄru vienam no problemÄtiskajiem FORTRAN komentÄriem? DroÅ”i vien nav tÄ vÄrts!]
BeigÄs mums izdevÄs to izdomÄt. Nesen tika uzstÄdÄ«ta jauna vÄrteja starp mÅ«su pilsÄtiÅas daļu un cietzemes tÄ«klu. Tam bija MILZÄŖGAS grÅ«tÄ«bas pÄrsÅ«tÄ«t paketes, kurÄs bija atkÄrtoti C lielo burtu biti! Tikai dažas no Ŕīm paketÄm var aizÅemt visus vÄrtejas resursus un novÄrst lielÄko daļu citu pakeÅ”u nokļūŔanu. MÄs sÅ«dzÄjÄmies vÄrtejas ražotÄjam... un viÅi atbildÄja: āAk, jÄ, jÅ«s saskaraties ar atkÄrtotu C kļūdu! MÄs jau zinÄm par viÅu. ā Galu galÄ mÄs problÄmu atrisinÄjÄm, iegÄdÄjoties jaunu vÄrteju no cita ražotÄja (iepriekÅ”Äjo aizstÄvÄ«bai, nespÄja pÄrsÅ«tÄ«t FORTRAN programmas dažiem var bÅ«t priekÅ”rocÄ«ba!).
Grūti laiki
Pirms dažiem gadiem, strÄdÄjot pie ETL sistÄmas izveides PerlÄ, lai samazinÄtu 40. fÄzes klÄ«nisko pÄtÄ«jumu izmaksas, man vajadzÄja apstrÄdÄt aptuveni 000 1 datumu. Divi no viÅiem pÄrbaudÄ«jumu neizturÄja. Tas mani pÄrÄk nesatrauca, jo Å”ie datumi tika Åemti no klienta sniegtajiem datiem, kas bieži, teiksim, bija pÄrsteidzoÅ”i. Bet, pÄrbaudot sÄkotnÄjos datus, izrÄdÄ«jÄs, ka Å”ie datumi ir 2011. gada 1. janvÄris un 2007. gada 30. janvÄris. Man likÄs, ka kļūda ir tajÄ programmÄ, kuru tikko uzrakstÄ«ju, bet izrÄdÄ«jÄs, ka ir jau XNUMX gadi. vecs. Tas var likties noslÄpumaini tiem, kas nav pazÄ«stami ar programmatÅ«ras ekosistÄmu. TÄ kÄ cita uzÅÄmuma jau sen bija pieÅemts lÄmums pelnÄ«t naudu, mans klients man samaksÄja, lai izlabotu kļūdu, ko viens uzÅÄmums bija ieviesis nejauÅ”i, bet otrs ar nolÅ«ku. Lai jÅ«s saprastu, par ko es runÄju, man ir jÄrunÄ par uzÅÄmumu, kas pievienoja funkciju, kas kļuva par kļūdu, kÄ arÄ« par dažiem citiem interesantiem notikumiem, kas veicinÄja noslÄpumaino kļūdu, kuru es izlaboju.
Vecajos labajos laikos Apple datori dažreiz spontÄni atiestatÄ«ja datumu uz 1. gada 1904. janvÄri. Iemesls bija vienkÄrÅ”s: tas izmantoja ar akumulatoru darbinÄmu āsistÄmas pulksteniā, lai sekotu datumam un laikam. Kas notika, kad akumulators nomira? Datori sÄka izsekot datumam pÄc sekunžu skaita kopÅ” laikmeta sÄkuma. Ar laikmetu mÄs domÄjÄm atsauces sÄkotnÄjo datumu, un Macintosh datoriem tas bija 1. gada 1904. janvÄris. PÄc tam, kad akumulators izlÄdÄjÄs, paÅ”reizÄjais datums tika atiestatÄ«ts uz norÄdÄ«to datumu. Bet kÄpÄc tas notika?
IepriekÅ” Apple izmantoja 32 bitus, lai saglabÄtu sekunžu skaitu kopÅ” sÄkotnÄjÄ datuma. Viens bits var saglabÄt vienu no divÄm vÄrtÄ«bÄm - 1 vai 0. Divi biti var saglabÄt vienu no ÄetrÄm vÄrtÄ«bÄm: 00, 01, 10, 11. TrÄ«s biti - viena vÄrtÄ«ba no astoÅÄm: 000, 001, 010, 011, 100 , 101, 110, 111 utt. Un 32 varÄtu saglabÄt vienu no 232 vÄrtÄ«bÄm, tas ir, 4 294 967 296 sekundes. Apple datumiem tas bija aptuveni 136 gadi, tÄpÄc vecÄki Mac nevar apstrÄdÄt datumus pÄc 2040. gada. Un, ja sistÄmas akumulators izlÄdÄjas, datums tiek atiestatÄ«ts uz 0 sekundÄm kopÅ” laikmeta sÄkuma, un jums ir manuÄli jÄiestata datums katru reizi, kad ieslÄdzat datoru (vai lÄ«dz brÄ«dim, kad iegÄdÄjaties jaunu akumulatoru).
TomÄr Apple lÄmums saglabÄt datumus kÄ sekundes kopÅ” laikmeta nozÄ«mÄja, ka mÄs nevarÄjÄm apstrÄdÄt datumus pirms laikmeta, kam bija tÄlejoÅ”as sekas, kÄ mÄs redzÄsim. Apple ieviesa funkciju, nevis kļūdu. Cita starpÄ tas nozÄ«mÄja, ka Macintosh operÄtÄjsistÄma bija imÅ«na pret ātÅ«kstoÅ”gades kļūduā (ko nevarÄtu teikt par daudzÄm Mac lietojumprogrammÄm, kurÄm bija savas datumu sistÄmas, lai apietu ierobežojumus).
Uz priekÅ”u. MÄs izmantojÄm Lotus 1-2-3, IBM "slepkavas lietojumprogrammu", kas palÄ«dzÄja uzsÄkt datoru revolÅ«ciju, lai gan Apple datoriem bija VisiCalc, kas padarÄ«ja personÄlo datoru veiksmÄ«gu. GodÄ«gi sakot, ja nebÅ«tu parÄdÄ«jies 1-2-3, datori diez vai bÅ«tu pacÄluÅ”ies, un personÄlo datoru vÄsture varÄtu attÄ«stÄ«ties ļoti atŔķirÄ«gi. Lotus 1-2-3 1900. gadu nepareizi uzskatÄ«ja par garo gadu. Kad Microsoft izlaida savu pirmo izklÄjlapu Multiplan, tÄ ieÅÄma nelielu tirgus daļu. Un, uzsÄkot Excel projektu, viÅi nolÄma ne tikai kopÄt rindu un kolonnu nosaukÅ”anas shÄmu no Lotus 1-2-3, bet arÄ« nodroÅ”inÄt kļūdu saderÄ«bu, apzinÄti uzskatot 1900. gadu par garo gadu. Å Ä« problÄma pastÄv arÄ« Å”odien. Tas ir, 1-2-3 tÄ bija kļūda, bet programmÄ Excel tas bija apzinÄts lÄmums, kas nodroÅ”inÄja, ka visi 1-2-3 lietotÄji varÄja importÄt savas tabulas programmÄ Excel, nemainot datus, pat ja tie bija nepareizi.
TaÄu bija cita problÄma. PirmkÄrt, Microsoft izlaida programmu Excel operÄtÄjsistÄmai Macintosh, kas neatpazina datumus pirms 1. gada 1904. janvÄra. Un programmÄ Excel 1. gada 1900. janvÄris tika uzskatÄ«ts par laikmeta sÄkumu. TÄpÄc izstrÄdÄtÄji veica izmaiÅas, lai viÅu programma atpazÄ«tu laikmeta veidu un saglabÄtu datus sevÄ« atbilstoÅ”i vÄlamajam laikmetam. Microsoft pat uzrakstÄ«ja paskaidrojoÅ”u rakstu par to. Un Å”is lÄmums noveda pie manas kļūdas.
Mana ETL sistÄma saÅÄma Excel izklÄjlapas no klientiem, kas tika izveidotas operÄtÄjsistÄmÄ Windows, taÄu tÄs varÄja izveidot arÄ« Mac datorÄ. TÄpÄc laikmeta sÄkums tabulÄ varÄtu bÅ«t vai nu 1. gada 1900. janvÄris, vai 1. gada 1904. janvÄris. KÄ to noskaidrot? Excel faila formÄts parÄda nepiecieÅ”amo informÄciju, bet parsÄtÄjs, kuru es izmantoju, to neparÄdÄ«ja (tagad to parÄda), un pieÅÄma, ka jÅ«s zinÄt konkrÄtas tabulas laikmetu. Es, iespÄjams, varÄju pavadÄ«t vairÄk laika, lai izprastu Excel binÄro formÄtu un nosÅ«tÄ«tu ielÄpu parsÄtÄja autoram, taÄu man bija daudz vairÄk darÄmÄ klienta labÄ, tÄpÄc es Ätri uzrakstÄ«ju heiristisku, lai noteiktu laikmetu. ViÅa bija vienkÄrÅ”a.
ProgrammÄ Excel datumu 5. gada 1998. jÅ«lijs var attÄlot formÄtÄ "07-05-98" (nederÄ«ga Amerikas sistÄma), "Jul 5, 98", "JÅ«lijs 5, 1998", "5-Jul-98" vai kÄds cits formÄts. vÄl viens bezjÄdzÄ«gs formÄts (ironiskÄ kÄrtÄ viens no formÄtiem, ko mana Excel versija nepiedÄvÄja, bija ISO 8601). TomÄr tabulÄ neformatÄtais datums tika saglabÄts kÄ "35981" epochai-1900 vai "34519" epochai-1904 (skaitļi norÄda dienu skaitu kopÅ” laikmeta). Es vienkÄrÅ”i izmantoju vienkÄrÅ”u parsÄtÄju, lai izvilktu gadu no formatÄtÄ datuma, un pÄc tam izmantoju Excel parsÄtÄju, lai izvilktu gadu no neformatÄtÄ datuma. Ja abas vÄrtÄ«bas atŔķīrÄs par 4 gadiem, tad zinÄju, ka izmantoju sistÄmu ar epoch-1904.
KÄpÄc es neizmantoju tikai formatÄtus datumus? TÄ kÄ 5. gada 1998. jÅ«liju var formatÄt kÄ "98. jÅ«lijs" ar zaudÄtu mÄneÅ”a dienu. MÄs saÅÄmÄm tabulas no tik daudziem uzÅÄmumiem, kas tÄs veidoja tik dažÄdos veidos, ka datumu noteikÅ”ana bija mÅ«su (Å”ajÄ gadÄ«jumÄ man) ziÅÄ. TurklÄt, ja Excel ir pareizi, tad arÄ« mums vajadzÄtu!
TajÄ paÅ”Ä laikÄ es saskÄros ar 39082. AtgÄdinÄÅ”u, ka Lotus 1-2-3 uzskatÄ«ja 1900. gadu par garo gadu, un tas tika uzticÄ«gi atkÄrtots programmÄ Excel. Un tÄ kÄ 1900. gadam tika pievienota viena diena, daudzas datuma aprÄÄ·inÄÅ”anas funkcijas varÄtu bÅ«t nepareizas Å”ai dienai. Tas nozÄ«mÄ, ka 39082 varÄja bÅ«t 1. gada 2011. janvÄris (operÄtÄjsistÄmÄ Mac) vai 31. gada 2006. decembris (operÄtÄjsistÄmÄ Windows). Ja mans āgadu parsÄtÄjsā no formatÄtÄs vÄrtÄ«bas izvilka 2011. gadu, tad viss ir kÄrtÄ«bÄ. Bet, tÄ kÄ Excel parsÄtÄjs nezina, kurÅ” laikmets tiek izmantots, tas pÄc noklusÄjuma tiek iestatÄ«ts uz epoch-1900, atgriežot 2006. gadu. Mana lietojumprogramma redzÄja, ka starpÄ«ba ir 5 gadi, uzskatÄ«ja to par kļūdu, reÄ£istrÄja to un atgrieza neformatÄtu vÄrtÄ«bu.
Lai to apietu, es uzrakstīju Ŕo (pseidokods):
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
Un tad visi 40 000 datumi tika pareizi parsÄti.
Lielu drukas darbu vidū
AstoÅdesmito gadu sÄkumÄ mans tÄvs strÄdÄja Storage Technology, tagad neeksistÄjoÅ”Ä nodaļÄ, kas radÄ«ja lentes piedziÅas un pneimatiskÄs sistÄmas Ätrgaitas lentes padevei.
ViÅi pÄrveidoja diskus, lai tiem varÄtu bÅ«t viens centrÄlais āAā diskdzinis, kas savienots ar septiÅiem āBā diskdziÅiem, un mazÄ OS RAM, kas kontrolÄja āAā disku, varÄja deleÄ£Ät lasÄ«Å”anas un rakstÄ«Å”anas darbÄ«bas visiem āBā diskdziÅiem.
Katru reizi, kad tika palaists disks āAā, ar āAā savienotajÄ perifÄrijas diskdzinÄ« bija jÄievieto diskete, lai operÄtÄjsistÄma ielÄdÄtu tÄ atmiÅÄ. Tas bija ÄrkÄrtÄ«gi primitÄ«vs: skaitļoÅ”anas jaudu nodroÅ”inÄja 8 bitu mikrokontrolleris.
Å Äda aprÄ«kojuma mÄrÄ·auditorija bija uzÅÄmumi ar ļoti lielÄm datu noliktavÄm ā bankas, mazumtirdzniecÄ«bas tÄ«kli u.c. ā, kam vajadzÄja drukÄt daudz adreÅ”u uzlÄ«mju vai bankas izrakstu.
Vienam klientam radÄs problÄma. Drukas darba laikÄ viens konkrÄts diskdzinis āAā var pÄrstÄt darboties, izraisot visa darba apstÄÅ”anos. Lai atjaunotu diska darbÄ«bu, darbiniekiem bija viss jÄpÄrstartÄ. Un, ja tas notika seÅ”u stundu uzdevuma vidÅ«, tika zaudÄts milzÄ«gs dÄrgais datora laiks un tika izjaukts visas operÄcijas grafiks.
TehniÄ·i tika nosÅ«tÄ«ti no Storage Technologies. TaÄu, neraugoties uz viÅu pÅ«lÄm, viÅi nespÄja atveidot kļūdu testa apstÄkļos: Ŕķita, ka tÄ radÄs lielu drukas darbu vidÅ«. ProblÄma nebija aparatÅ«rÄ, viÅi nomainÄ«ja visu, ko varÄja: RAM, mikrokontrolleri, diskeÅ”u disku, visas iespÄjamÄs lentes diska daļas - problÄma saglabÄjÄs.
Tad tehniÄ·i piezvanÄ«ja uz Å”tÄbu un izsauca Ekspertu.
Eksperts paÄ·Ära krÄslu un kafijas tasi, sÄdÄja datoru telpÄ ā tajos laikos tur bija telpas, kas bija paredzÄtas datoriem ā un skatÄ«jÄs, kÄ darbinieki sastÄda rindÄ lielu drukas darbu. Eksperts gaidÄ«ja neveiksmi ā un tÄ arÄ« notika. Visi skatÄ«jÄs uz Ekspertu, bet viÅam nebija ne jausmas, kÄpÄc tas notika. TÄpÄc viÅÅ” lika atkal ievietot darbu rindÄ, un viss personÄls un tehniÄ·i atgriezÄs darbÄ.
Eksperts atkal apsÄdÄs krÄslÄ un sÄka gaidÄ«t neveiksmi. PagÄja apmÄram seÅ”as stundas, un kļūme notika. Ekspertam atkal nebija nekÄdu ideju, izÅemot to, ka viss notika telpÄ, kas bija piepildÄ«ta ar cilvÄkiem. ViÅÅ” pavÄlÄja atsÄkt misiju, apsÄdÄs un gaidÄ«ja.
Ar treÅ”o neveiksmi Eksperts kaut ko pamanÄ«ja. Kļūme radÄs, kad darbinieki mainÄ«ja lentes sveÅ”Ä diskdzinÄ«. TurklÄt kļūme notika, tiklÄ«dz kÄds no darbiniekiem izgÄja cauri noteiktai flÄ«zei uz grÄ«das.
PaaugstinÄtÄ grÄ«da tika izgatavota no alumÄ«nija flÄ«zÄm, kas ieklÄtas 6 lÄ«dz 8 collu augstumÄ. NeskaitÄmi datoru vadi stiepÄs zem paaugstinÄtÄs grÄ«das, lai neviens nejauÅ”i neuzkÄptu uz svarÄ«ga kabeļa. FlÄ«zes tika ieklÄtas ļoti cieÅ”i, lai zem paceltÄs grÄ«das nenokļūtu gruži.
Eksperts saprata, ka viena no flÄ«zÄm ir deformÄta. Kad darbinieks uzkÄpa uz tÄ stÅ«ra, flÄ«zes malas berzÄjÄs pret blakus esoÅ”ajÄm flÄ«zÄm. Ar tÄm berzÄjÄs arÄ« plastmasas detaļas, kas savienoja flÄ«zes, kas izraisÄ«ja statiskas mikroizlÄdes, kas radÄ«ja radiofrekvenÄu traucÄjumus.
MÅ«sdienÄs operatÄ«vÄ atmiÅa ir daudz labÄk aizsargÄta pret radiofrekvenÄu traucÄjumiem. Bet tajos gados tas tÄ nebija. Eksperts saprata, ka Å”ie traucÄjumi traucÄ atmiÅu un lÄ«dz ar to arÄ« operÄtÄjsistÄmas darbÄ«bu. ViÅÅ” piezvanÄ«ja atbalsta dienestam, pasÅ«tÄ«ja jaunas flÄ«zes, uzstÄdÄ«ja pats, un problÄma pazuda.
Ir paisums!
StÄsts notika serveru telpÄ, Portsmutas biroja ceturtajÄ vai piektajÄ stÄvÄ (manuprÄt), doku zonÄ.
KÄdu dienu Unix serveris ar galveno datu bÄzi avarÄja. ViÅi viÅu pÄrstartÄja, bet viÅÅ” laimÄ«gs turpinÄja krist atkal un atkal. NolÄmÄm piezvanÄ«t kÄdam no atbalsta dienesta.
Atbalsta puisis... Man Ŕķiet, ka viÅu sauca Marks, bet tam nav nozÄ«mes... Man Ŕķiet, ka es viÅu nepazÄ«stu. Tas tieÅ”Äm nav svarÄ«gi. Paliksim pie Marka, labi? Lieliski.
TÄtad pÄc dažÄm stundÄm ieradÄs Marks (proti, tas nav tÄls ceļŔ no LÄ«dsas lÄ«dz Portsmutai), ieslÄdza serveri un viss darbojÄs bez problÄmÄm. Tipisks sasodÄ«ts atbalsts, klients par to ļoti sarÅ«gtina. Marks apskata žurnÄlfailus un neatrod neko nevÄlamu. TÄpÄc Marks atkal iekÄpj vilcienÄ (vai ar kÄdu transporta veidu viÅÅ” ieradÄs, cik es zinu, tÄ varÄja bÅ«t kliba govs... vienalga, tas nav svarÄ«gi, labi?) un izŔķÄrdÄjies dodas atpakaļ uz LÄ«dsu. diena.
TajÄ paÅ”Ä vakarÄ serveris atkal avarÄ. StÄsts tÄds pats... serveris neceļas. Mark mÄÄ£ina palÄ«dzÄt attÄlinÄti, bet klients nevar startÄt serveri.
VÄl viens vilciens, autobuss, citronu bezÄ vai kÄds cits stulbums, un Marks ir atpakaļ PortsmutÄ. Paskaties, serveris sÄk darboties bez problÄmÄm! BrÄ«nums. Marks vairÄkas stundas pÄrbauda, āāvai ar operÄtÄjsistÄmu vai programmatÅ«ru viss ir kÄrtÄ«bÄ, un dodas uz LÄ«dsu.
Ap dienas vidu serveris avarÄ (noÅemiet mieru!). Å oreiz Ŕķiet saprÄtÄ«gi piesaistÄ«t aparatÅ«ras atbalsta cilvÄkus, lai aizstÄtu serveri. Bet nÄ, pÄc kÄdÄm 10 stundÄm arÄ« nokrÄ«t.
SituÄcija atkÄrtojÄs vairÄkas dienas. Serveris strÄdÄ, avarÄ pÄc aptuveni 10 stundÄm un nesÄkas nÄkamÄs 2 stundas. ViÅi pÄrbaudÄ«ja dzesÄÅ”anu, atmiÅas noplÅ«des, viÅi visu pÄrbaudÄ«ja, bet neko neatrada. Tad avÄrijas apstÄjÄs.
NedÄļa pagÄja bezrÅ«pÄ«gi... visi bija priecÄ«gi. PriecÄ«gs, lÄ«dz viss sÄkas no jauna. Bilde tÄda pati. 10 stundas darba, 2-3 stundas dÄ«kstÄves...
Un tad kÄds (man Ŕķiet, ka viÅi man teica, ka Å”im cilvÄkam nav nekÄda sakara ar IT) teica:
"Tas ir paisums!"
Izsauciens tika sagaidÄ«ts ar tukÅ”iem skatieniem, un kÄda roka, iespÄjams, vilcinÄjÄs pie droŔības izsaukuma pogas.
"Tas pÄrstÄj darboties ar plÅ«dmaiÅu."
Å Ä·iet, ka IT atbalsta darbiniekiem tas ir pilnÄ«gi sveÅ”s jÄdziens, kuri, visticamÄk, nelasÄ«s Paisuma gadagrÄmatu, sÄžot pie kafijas. ViÅi paskaidroja, ka tas nekÄdÄ veidÄ nevar bÅ«t saistÄ«ts ar paisumu, jo serveris jau nedÄļu strÄdÄjis bez kļūdÄm.
"PagÄjuÅ”ajÄ nedÄÄ¼Ä paisums bija zems, bet Å”onedÄļ tas ir augsts."
Nedaudz terminoloÄ£ijas tiem, kam nav jahtas licences. PlÅ«dmaiÅas ir atkarÄ«gas no MÄness cikla. Un, Zemei griežoties, ik pÄc 12,5 stundÄm Saules un MÄness gravitÄcijas spÄks rada paisuma vilni. 12,5 stundu cikla sÄkumÄ ir paisums, cikla vidÅ« bÄgums un beigÄs atkal paisums. TaÄu, mainoties MÄness orbÄ«tai, mainÄs arÄ« atŔķirÄ«ba starp bÄgumu un bÄgumu. Kad MÄness atrodas starp Sauli un Zemi vai Zemes pretÄjÄ pusÄ (pilnmÄness vai bez mÄness), mÄs iegÅ«stam Syzygyn plÅ«dmaiÅas ā augstÄkos paisumus un viszemÄkos bÄgumus. PusmÄness laikÄ mÄs iegÅ«stam kvadrÄtveida plÅ«dmaiÅas - zemÄkÄs plÅ«dmaiÅas. AtŔķirÄ«ba starp abÄm galÄjÄ«bÄm ievÄrojami samazinÄs. MÄness cikls ilgst 28 dienas: syzygian - kvadratÅ«ra - syzygian - kvadratÅ«ra.
Kad tehniÄ·iem tika izskaidrota paisuma spÄku bÅ«tÄ«ba, viÅi uzreiz nodomÄja, ka jÄsauc policija. Un diezgan loÄ£iski. Bet izrÄdÄs, ka puisim bija taisnÄ«ba. Divas nedÄļas iepriekÅ” netÄlu no biroja pietauvojÄs iznÄ«cinÄtÄjs. Katru reizi, kad paisums to pacÄla lÄ«dz noteiktam augstumam, kuÄ£a radara stabs nonÄca serveru telpas grÄ«das lÄ«menÄ«. Un radars (vai elektroniskÄ kara tehnika, vai kÄda cita militÄra rotaļlieta) radÄ«ja haosu datoros.
RaÄ·etes lidojuma misija
Man tika uzdots portÄt lielu (apmÄram 400 tÅ«kstoÅ”u rindu) raÄ·eÅ”u palaiÅ”anas kontroles un uzraudzÄ«bas sistÄmu uz jaunÄm operÄtÄjsistÄmas, kompilatora un valodas versijÄm. PrecÄ«zÄk, no Solaris 2.5.1 uz Solaris 7 un no Verdix Ada attÄ«stÄ«bas sistÄmas (VADS), kas rakstÄ«ts Ada 83, uz Rational Apex Ada sistÄmu, kas rakstÄ«ta Ada 95. VADS iegÄdÄjÄs Rational, un tÄ produkts tika novecojis, lai gan Rational mÄÄ£inÄja ieviest saderÄ«gas VADS pakotÅu versijas, lai atvieglotu pÄreju uz Apex kompilatoru.
TrÄ«s cilvÄki man palÄ«dzÄja tÄ«ri apkopot kodu. PagÄja divas nedÄļas. Un tad es pats strÄdÄju, lai sistÄma darbotos. ÄŖsÄk sakot, tÄ bija vissliktÄkÄ programmatÅ«ras sistÄmas arhitektÅ«ra un ievieÅ”ana, ar kÄdu es biju sastapies, tÄpÄc portÄÅ”anas pabeigÅ”ana prasÄ«ja vÄl divus mÄneÅ”us. PÄc tam sistÄma tika nodota testÄÅ”anai, kas ilga vÄl vairÄkus mÄneÅ”us. TÅ«lÄ«t izlaboju testÄÅ”anas laikÄ konstatÄtÄs kļūdas, taÄu to skaits strauji samazinÄjÄs (avota kods bija ražoÅ”anas sistÄma, tÄpÄc tÄ funkcionalitÄte darbojÄs diezgan droÅ”i, tikai nÄcÄs noÅemt kļūdas, kas radÄs adaptÄcijas laikÄ jaunajam kompilatoram). Galu galÄ, kad viss darbojÄs kÄ nÄkas, mani pÄrcÄla uz citu projektu.
Un piektdien pirms PateicÄ«bas dienas iezvanÄ«jÄs telefons.
RaÄ·etes palaiÅ”anu bija paredzÄts pÄrbaudÄ«t aptuveni trÄ«s nedÄļu laikÄ, un laika atskaites laboratorijas testu laikÄ komandu secÄ«ba tika bloÄ·Äta. ReÄlajÄ dzÄ«vÄ tas pÄrtrauktu pÄrbaudi, un, ja bloÄ·ÄÅ”ana notiktu dažu sekunžu laikÄ pÄc dzinÄja iedarbinÄÅ”anas, palÄ«gsistÄmÄs notiktu vairÄkas neatgriezeniskas darbÄ«bas, kas prasÄ«tu ilgstoÅ”u un dÄrgu raÄ·etes gatavÄ«bu. Tas nebÅ«tu sÄcies, bet daudzi cilvÄki bÅ«tu ļoti sarÅ«gtinÄti par zaudÄto laiku un daudz, daudz naudas. Neļaujiet nevienam jums teikt, ka AizsardzÄ«bas departaments tÄrÄ naudu neapdomÄ«gi ā es nekad neesmu saticis lÄ«gumslÄdzÄju vadÄ«tÄju, kurÅ” nebÅ«tu noteicis budžetu pirmajÄ vai otrajÄ vietÄ un tam sekotu grafiks.
IepriekÅ”Äjos mÄneÅ”os Å”is atpakaļskaitÄ«Å”anas izaicinÄjums tika veikts simtiem reižu dažÄdÄs variÄcijÄs, tikai ar dažÄm nelielÄm žagas. TÄtad iespÄjamÄ«ba, ka tas notiks, bija ļoti zema, bet tÄ sekas bija ļoti nozÄ«mÄ«gas. Reiziniet abus Å”os faktorus, un jÅ«s sapratÄ«sit, ka ziÅas man un desmitiem inženieru un vadÄ«tÄju paredzÄja sabojÄtu brÄ«vdienu nedÄļu.
Un uzmanÄ«ba tika pievÄrsta man kÄ personai, kas pÄrnesa sistÄmu.
TÄpat kÄ lielÄkajÄ daÄ¼Ä droŔības sistÄmu, tika reÄ£istrÄti daudzi parametri, tÄpÄc bija diezgan viegli identificÄt dažas koda rindiÅas, kas tika izpildÄ«tas pirms sistÄmas avÄrijas. Un, protams, tajos nebija nekÄ neparasta; tie paÅ”i izteicieni tika veiksmÄ«gi izpildÄ«ti burtiski tÅ«kstoÅ”iem reižu viena un tÄ paÅ”a skrÄjiena laikÄ.
MÄs aicinÄjÄm cilvÄkus no Apex par Rational, jo viÅi bija tie, kas izstrÄdÄja kompilatoru, un dažas no viÅu izstrÄdÄtajÄm rutÄ«nÄm tika izsauktas aizdomÄ«gajÄ kodÄ. ViÅus (un visus pÄrÄjos) iespaidoja tas, ka ir jÄatrodas burtiski valstiski nozÄ«mÄ«gas problÄmas saknÄ.
TÄ kÄ Å¾urnÄlos nebija nekÄ interesanta, mÄs nolÄmÄm mÄÄ£inÄt atveidot problÄmu vietÄjÄ laboratorijÄ. Tas nebija viegls uzdevums, jo notikums notika aptuveni reizi 1000 skrÄjienos. Viens no iespÄjamiem iemesliem bija tas, ka izsaukums uz pÄrdevÄja izstrÄdÄtu mutex funkciju (daļa no VADS migrÄcijas pakotnes) Unlock
nenoveda pie atbloÄ·ÄÅ”anas. ApstrÄdes pavediens, kas izsauca funkciju, apstrÄdÄja sirdsdarbÄ«bas ziÅojumus, kas nominÄli tika saÅemti katru sekundi. PacÄlÄm frekvenci lÄ«dz 10 Hz, tas ir, 10 reizes sekundÄ, un sÄkÄm skriet. ApmÄram stundu vÄlÄk sistÄma bloÄ·ÄjÄs. ŽurnÄlÄ mÄs redzÄjÄm, ka ierakstÄ«to ziÅojumu secÄ«ba bija tÄda pati kÄ neveiksmÄ«gÄ testa laikÄ. MÄs veicÄm vÄl vairÄkus braucienus, sistÄma pastÄvÄ«gi tika bloÄ·Äta 45-90 minÅ«tes pÄc starta, un katru reizi žurnÄlÄ bija viens un tas pats marÅ”ruts. Lai gan mÄs tehniski izmantojÄm atŔķirÄ«gu kodu ā ziÅojumu biežums bija atŔķirÄ«gs ā sistÄmas darbÄ«ba bija tÄda pati, tÄpÄc bijÄm pÄrliecinÄti, ka Å”is ielÄdes scenÄrijs izraisa to paÅ”u problÄmu.
Tagad mums vajadzÄja noskaidrot, kur tieÅ”i izteiksmju secÄ«bÄ notika bloÄ·ÄÅ”ana.
Å ajÄ sistÄmas ievieÅ”anÄ tika izmantota Ada uzdevumu sistÄma, un tÄ tika izmantota neticami slikti. Uzdevumi ir augsta lÄ«meÅa vienlaikus izpildÄma konstrukcija programmÄ Ada, kaut kas lÄ«dzÄ«gs izpildes pavedieniem, kas ir iebÅ«vÄti tikai paÅ”Ä valodÄ. Kad diviem uzdevumiem ir jÄsazinÄs, tie "nosaka tikÅ”anos", apmainÄs ar nepiecieÅ”amajiem datiem un pÄc tam pÄrtrauc tikÅ”anos un atgriežas pie neatkarÄ«gas izpildes. TomÄr sistÄma tika ieviesta atŔķirÄ«gi. PÄc tam, kad mÄrÄ·a uzdevums tika satikts, Å”is mÄrÄ·a uzdevums tika satikts ar citu uzdevumu, kas pÄc tam tika satikts ar treÅ”o uzdevumu un tÄ tÄlÄk, lÄ«dz tika pabeigta apstrÄde. PÄc tam visas Ŕīs tikÅ”anÄs tika pabeigtas, un katram uzdevumam bija jÄatgriežas tÄ izpildÄ. Tas nozÄ«mÄ, ka mums bija darÄ«Å”ana ar pasaulÄ dÄrgÄko funkciju izsaukÅ”anas sistÄmu, kas apturÄja visu ādaudzuzdevumuā procesu, kamÄr tÄ apstrÄdÄja daļu no ievades datiem. Un iepriekÅ” tas neradÄ«ja problÄmas tikai tÄpÄc, ka caurlaidspÄja bija ļoti zema.
Es aprakstÄ«ju Å”o uzdevumu mehÄnismu, jo tad, kad tika pieprasÄ«ta tikÅ”anÄs vai tÄ tiks pabeigta, var notikt "uzdevuma maiÅa". Tas nozÄ«mÄ, ka procesors varÄtu sÄkt apstrÄdÄt citu uzdevumu, kas ir gatavs izpildei. IzrÄdÄs, ka tad, kad viens uzdevums ir gatavs satikties ar citu uzdevumu, var sÄkt izpildÄ«t pavisam citu uzdevumu, un galu galÄ vadÄ«ba atgriežas pirmajÄ tikÅ”anÄs reizÄ. Var rasties arÄ« citi notikumi, kuru dÄļ uzdevums tiek pÄrslÄgts; viens no Å”Ädiem notikumiem ir sistÄmas funkcijas izsaukums, piemÄram, drukÄÅ”ana vai mutex izpilde.
Lai saprastu, kura koda rindiÅa rada problÄmu, man bija jÄatrod veids, kÄ reÄ£istrÄt progresu, izmantojot paziÅojumu secÄ«bu, neaktivizÄjot uzdevuma slÄdzi, kas novÄrstu avÄrijas raÅ”anos. TÄpÄc es nevarÄju izmantot priekÅ”rocÄ«bas Put_Line()
lai izvairÄ«tos no I/O operÄciju veikÅ”anas. Es varÄtu iestatÄ«t skaitÄ«tÄja mainÄ«go vai kaut ko lÄ«dzÄ«gu, bet kÄ es varu redzÄt tÄ vÄrtÄ«bu, ja es to nevaru parÄdÄ«t ekrÄnÄ?
TÄpat, pÄrbaudot žurnÄlu, atklÄjÄs, ka, neskatoties uz sirdsdarbÄ«bas ziÅojumu apstrÄdes sastingumu, kas bloÄ·Äja visas procesa I/O darbÄ«bas un neļÄva veikt citu apstrÄdi, citi neatkarÄ«gi uzdevumi turpinÄjÄs. Tas ir, darbs netika bloÄ·Äts pilnÄ«bÄ, tikai (kritiska) uzdevumu Ä·Äde.
Tas bija pavediens, kas vajadzÄ«gs, lai novÄrtÄtu bloÄ·ÄjoÅ”o izteiksmi.
Es izveidoju Ada pakotni, kurÄ bija uzdevums, uzskaitÄ«ts veids un Å”Äda veida globÄlais mainÄ«gais. NeskaitÄmi literÄļi bija saistÄ«ti ar konkrÄtÄm problemÄtiskÄs secÄ«bas izteiksmÄm (piem. Incrementing_Buffer_Index
, Locking_Mutex
, Mutex_Unlocked
), un pÄc tam tajÄ ievietoja pieŔķirÅ”anas izteiksmes, kas globÄlajam mainÄ«gajam pieŔķīra atbilstoÅ”o uzskaitÄ«jumu. TÄ kÄ visa Ŕī objekta kods vienkÄrÅ”i saglabÄja konstanti atmiÅÄ, uzdevumu pÄrslÄgÅ”ana tÄs izpildes rezultÄtÄ bija ÄrkÄrtÄ«gi maz ticama. Mums galvenokÄrt bija aizdomas par izteiksmÄm, kas varÄtu mainÄ«t uzdevumu, jo bloÄ·ÄÅ”ana notika izpildes laikÄ, nevis atgriezÄs, pÄrslÄdzot uzdevumu atpakaļ (vairÄku iemeslu dÄļ).
IzsekoÅ”anas uzdevums vienkÄrÅ”i darbojÄs ciklÄ un periodiski pÄrbaudÄ«ja, vai globÄlÄ mainÄ«gÄ vÄrtÄ«ba ir mainÄ«jusies. Ar katru izmaiÅu vÄrtÄ«ba tika saglabÄta failÄ. PÄc tam Ä«sa gaidÄ«Å”ana un jauna pÄrbaude. MainÄ«go ierakstÄ«ju failÄ, jo uzdevums tika izpildÄ«ts tikai tad, kad sistÄma to izvÄlÄjÄs izpildei, pÄrslÄdzot uzdevumu problÄmzonÄ. NeatkarÄ«gi no tÄ, kas notika Å”ajÄ uzdevumÄ, tas neietekmÄs citus nesaistÄ«tus bloÄ·Ätos uzdevumus.
Bija paredzÄts, ka, sistÄmai sasniedzot problemÄtiskÄ koda izpildes punktu, globÄlais mainÄ«gais tiks atiestatÄ«ts, pÄrejot uz katru nÄkamo izteiksmi. Tad notiks kaut kas, kas liek uzdevumam pÄrslÄgties, un, tÄ kÄ tÄ izpildes frekvence (10 Hz) ir zemÄka nekÄ pÄrraudzÄ«bas uzdevumam, monitors varÄtu uztvert globÄlÄ mainÄ«gÄ vÄrtÄ«bu un to ierakstÄ«t. ParastÄ situÄcijÄ es varÄtu iegÅ«t atkÄrtotu uzskaitÄ«jumu apakÅ”kopas secÄ«bu: mainÄ«gÄ pÄdÄjÄs vÄrtÄ«bas uzdevuma pÄrslÄgÅ”anas brÄ«dÄ«. UzkarinÄÅ”anas laikÄ globÄlajam mainÄ«gajam vairs nevajadzÄtu mainÄ«ties, un pÄdÄjÄ ierakstÄ«tÄ vÄrtÄ«ba norÄda, kura izteiksme netika pabeigta.
Es palaidu kodu ar izsekoÅ”anu. ViÅÅ” sastinga. Un uzraudzÄ«ba darbojÄs kÄ pulkstenis.
ŽurnÄlÄ bija sagaidÄmÄ secÄ«ba, kuru pÄrtrauca vÄrtÄ«ba, kas norÄdÄ«ja, ka ir izsaukts mutex Unlock
, un uzdevums nav izpildÄ«ts ā kÄ tas ir tÅ«kstoÅ”iem iepriekÅ”Äjo zvanu gadÄ«jumÄ.
Apex inženieri Å”ajÄ laikÄ drudžaini analizÄja savu kodu un atrada vietu mutex, kur teorÄtiski varÄtu rasties bloÄ·ÄÅ”ana. Bet tÄ varbÅ«tÄ«ba bija ļoti zema, jo tikai noteikta notikumu secÄ«ba, kas notiek noteiktÄ laikÄ, varÄja izraisÄ«t bloÄ·ÄÅ”anu. MÄrfija likums, puiÅ”i, tas ir MÄrfija likums.
Lai aizsargÄtu vajadzÄ«go koda fragmentu, es aizstÄju mutex funkciju izsaukumus (izveidots uz OS mutex funkcionalitÄtes) ar nelielu vietÄjo Ada mutex pakotni, lai kontrolÄtu mutex piekļuvi Å”im fragmentam.
Es ievietoju to kodÄ un veicu testu. SeptiÅas stundas vÄlÄk kods joprojÄm darbojÄs.
Mans kods tika iesniegts Rational, kur viÅi to apkopoja, izjauca un pÄrbaudÄ«ja, vai tajÄ nav izmantota tÄ pati pieeja, kas tika izmantota problemÄtiskajÄs mutex funkcijÄs.
Å is bija manas karjeras vispilnÄ«gÄkais kodu apskats š TelpÄ kopÄ ar mani bija apmÄram desmit inženieri un vadÄ«tÄji, vÄl desmit cilvÄki piedalÄ«jÄs konferences zvanÄ ā un viÅi visi pÄrbaudÄ«ja apmÄram 20 koda rindiÅas.
Kods tika pÄrskatÄ«ts, jauni izpildÄmie faili tika samontÄti un iesniegti oficiÄlai regresijas pÄrbaudei. PÄc pÄris nedÄļÄm atpakaļskaitÄ«Å”anas tests bija veiksmÄ«gs, un raÄ·ete pacÄlÄs gaisÄ.
Labi, tas viss ir labi, bet kÄda ir stÄsta jÄga?
TÄ bija absolÅ«ti pretÄ«ga problÄma. Simtiem tÅ«kstoÅ”u koda rindu, paralÄla izpilde, vairÄk nekÄ ducis mijiedarbÄ«gu procesu, slikta arhitektÅ«ra un slikta ievieÅ”ana, iegulto sistÄmu saskarnes un miljoniem iztÄrÄti dolÄru. Bez spiediena, pareizi.
Es nebiju vienÄ«gais, kurÅ” strÄdÄja pie Ŕīs problÄmas, lai gan es biju uzmanÄ«bas centrÄ, jo es veicu pÄrneÅ”anu. Bet, lai gan es to izdarÄ«ju, tas nenozÄ«mÄ, ka es sapratu visus simtiem tÅ«kstoÅ”u koda rindiÅu vai pat tos pÄrlasÄ«ju. Kodu un žurnÄlus analizÄja inženieri visÄ valstÄ«, bet, kad viÅi man izstÄstÄ«ja savas hipotÄzes par kļūmes cÄloÅiem, man vajadzÄja tikai pusminÅ«ti, lai tÄs atspÄkotu. Un, kad man lÅ«dza analizÄt teorijas, es to nodevu kÄdam citam, jo āāman bija skaidrs, ka Å”ie inženieri iet nepareizo ceļu. IzklausÄs pÄrgalvÄ«gi? JÄ, tÄ ir taisnÄ«ba, bet es noraidÄ«ju hipotÄzes un pieprasÄ«jumus cita iemesla dÄļ.
Es sapratu problÄmas bÅ«tÄ«bu. Es precÄ«zi nezinÄju, kur tas notiek un kÄpÄc, bet es zinÄju, kas notiek.
Gadu gaitÄ esmu uzkrÄjis daudz zinÄÅ”anu un pieredzes. Es biju viens no Ada lietoÅ”anas pionieriem un sapratu tÄs priekÅ”rocÄ«bas un trÅ«kumus. Es zinu, kÄ Ada izpildlaika bibliotÄkas apstrÄdÄ uzdevumus un nodarbojas ar paralÄlu izpildi. Un es saprotu zema lÄ«meÅa programmÄÅ”anu atmiÅas, reÄ£istru un montÄtÄja lÄ«menÄ«. Citiem vÄrdiem sakot, man ir dziļas zinÄÅ”anas savÄ jomÄ. Un es tos izmantoju, lai atrastu problÄmas cÄloni. Es ne tikai apstrÄdÄju kļūdu, bet arÄ« sapratu, kÄ to atrast ļoti jutÄ«gÄ izpildlaika vidÄ.
Å Ädi stÄsti par cÄ«Åu ar kodu nav Ä«paÅ”i interesanti tiem, kuri nav pazÄ«stami ar Å”Ädas cÄ«Åas iezÄ«mÄm un nosacÄ«jumiem. TaÄu Å”ie stÄsti palÄ«dz mums saprast, kas nepiecieÅ”ams, lai atrisinÄtu patieÅ”Äm sarežģītas problÄmas.
Lai atrisinÄtu patieÅ”Äm smagas problÄmas, jums ir jÄbÅ«t vairÄk nekÄ tikai programmÄtÄjam. Jums ir jÄsaprot koda āliktenisā, kÄ tas mijiedarbojas ar vidi un kÄ darbojas pati vide.
Un tad jums bÅ«s sava sabojÄtÄ svÄtku nedÄļa.
TurpinÄsim.
Avots: www.habr.com