Folklor programer sareng insinyur (bagian 1)

Folklor programer sareng insinyur (bagian 1)

Ieu mangrupikeun pilihan carita tina Internét ngeunaan kumaha bug kadang gaduh manifestasi anu luar biasa. Sugan aya nu rék dicaritakeun ogé.

Alergi mobil kana és krim vanili

Hiji carita pikeun insinyur anu ngarti yén atra teu salawasna jawaban, sarta yén euweuh urusan sabaraha jauh-fetched kanyataan bisa sigana, aranjeunna tetep fakta. Divisi Pontiac of General Motors Corporation nampi keluhan:

Ieu kadua kalina Kuring nulis ka anjeun, sarta kuring teu ngalepatkeun anjeun teu ngajawab, sabab disada gélo. Kulawarga urang boga tradisi dahar és krim unggal peuting sanggeus dinner. Jenis és krim robah unggal waktu, sarta sanggeus dinner sakabeh kulawarga milih és krim nu meuli, sanggeus kuring indit ka toko. Kuring nembé ngagaleuh Pontiac énggal sareng ti saprak éta perjalanan kuring kéngingkeun és krim janten masalah. Nu katingali, unggal meuli és krim vanili jeung balik ti toko, mobil teu bisa ngamimitian. Mun kuring mawa sagala és krim sejen, mobil dimimitian tanpa masalah nanaon. Abdi hoyong naroskeun patarosan anu serius, sanaos kumaha bodona disada: "Naon ngeunaan Pontiac anu ngajadikeun éta henteu ngamimitian nalika kuring mawa és krim vanili, tapi mimiti gampang nalika kuring mawa rasa és krim anu sanés?" "

Sakumaha anjeun tiasa bayangkeun, présidén divisi éta skeptis ngeunaan surat éta. Tapi, bisi wae, kuring ngirim insinyur pikeun mariksa. Anjeunna reuwas yén anjeunna patepung ku lalaki jegud, well-pendidikan hirup di wewengkon geulis. Aranjeunna sapuk pikeun papanggih langsung saatos tuang supados duaan tiasa angkat ka toko és krim. Sore éta vanili, sareng nalika aranjeunna uih deui kana mobil, éta henteu ngamimitian.

Insinyur datang tilu peuting deui. Pertama kali és krim éta coklat. Mobil dimimitian. Kadua kalina aya és krim strawberry. Mobil dimimitian. Dina malem katilu anjeunna nanya nyandak vanili. Mobil teu hurung.

Nalar sacara rasional, insinyur nolak percanten yén mobil alérgi kana és krim vanili. Ku alatan éta, kuring sapuk jeung nu boga mobil yén manéhna baris nuluykeun kunjungan na nepi ka manggihan solusi pikeun masalah. Sareng sapanjang jalan, anjeunna mimiti nyandak catetan: anjeunna nyerat sadaya inpormasi, waktos beurang, jinis béngsin, waktos sumping sareng uih deui ti toko, jsb.

Insinyur geura-giru nyadar yén nu boga mobil spent kirang waktos mésér és krim vanili. Alesanana éta tata perenah barang di toko. És krim vanili anu pang populerna sareng disimpen dina freezer anu misah di payuneun toko supados langkung gampang mendakanana. Sarta sakabeh variétas séjén éta di tukangeun toko, sarta eta nyandak leuwih waktos pikeun manggihan rupa katuhu jeung mayar.

Ayeuna patarosan éta pikeun insinyur: naha mobil teu ngamimitian lamun kirang waktos kaliwat saprak momen mesin dipareuman? Kusabab masalahna waktos, sanes és krim vanili, insinyur gancang manggihan jawaban: éta konci gas. Ieu lumangsung unggal sore, tapi lamun nu boga mobil méakkeun leuwih waktos pilari és krim, mesin junun niiskeun handap cukup tur mimitian up gampang. Sarta lamun lalaki éta meuli vanili és krim, mesin masih panas teuing jeung konci gas teu boga waktu pikeun ngaleyurkeun.

Moral: Malah masalah lengkep gélo kadang nyata.

kacilakaan Bandicoot

Nyeri ngalaman ieu. Salaku programmer a, anjeun meunang dipaké pikeun blaming kode anjeun kahiji, kadua, katilu ... na wae di tempat sapuluh rébu anjeun ngalepatkeun compiler nu. Sarta salajengna handap daptar anjeun geus ngalepatkeun parabot.

Ieu carita kuring ngeunaan bug hardware.

Pikeun kaulinan Crash Bandicoot, kuring nyerat kode pikeun ngamuat sareng nyimpen kana kartu mémori. Pikeun pamekar game smug sapertos kitu, éta sapertos jalan-jalan di taman: panginten padamelan bakal nyandak sababaraha dinten. Najan kitu, kuring réngsé nepi debugging kode pikeun genep minggu. Sapanjang jalan, abdi direngsekeun masalah sejenna, tapi unggal sababaraha poé kuring balik ka kode ieu sababaraha jam. Éta kanyeri.

gejala nu katingali kawas kieu: mun anjeun simpen playthrough ayeuna kaulinan sarta aksés ka kartu memori, sagalana ampir sok mana rupa ... Tapi kadang waktu operasi maca atawa nulis tanpa alesan atra. Rékam pondok sering ngarusak kartu mémori. Lamun pamaén nyoba ngahemat, anjeunna teu ngan gagal nyimpen, tapi ogé ngancurkeun peta. Crap.

Saatos sababaraha waktos, produser kami di Sony, Connie Bus, mimiti panik. Kami henteu tiasa ngintunkeun kaulinan kalayan bug ieu, sareng genep minggu ka hareup kuring henteu ngartos naon anu nyababkeun masalah. Ngaliwatan Connie, kami ngahubungi pamekar PS1 anu sanés: naha aya anu mendakan anu sami? No. Teu aya anu ngagaduhan masalah sareng kartu mémori.

Lamun anjeun teu boga pamanggih pikeun debugging, hijina pendekatan ditinggalkeun téh "ngabagi sarta nalukkeun": miceun beuki loba kode tina program faulty dugi aya sempalan relatif leutik ditinggalkeun nu masih ngabalukarkeun masalah. Nyaéta, anjeun motong program sapotong demi sapotong nepi ka bagian nu ngandung bug tetep.

Tapi masalahna, sesah pisan pikeun motong potongan tina kaulinan vidéo. Kumaha ngajalankeun eta lamun dipiceun kode nu emulates gravitasi? Atawa ngagambar karakter?

Kituna, urang kudu ngaganti sakabéh modul jeung taratas nu pura-pura ngalakukeun hal mangpaat, tapi dina kanyataanana ngalakukeun hal basajan pisan nu teu bisa ngandung kasalahan. Urang kudu nulis crutches misalna pikeun kaulinan sahenteuna karya. Ieu mangrupikeun prosés anu lambat sareng nyeri.

Pondokna, kuring ngalakukeun éta. Kuring dipiceun beuki loba potongan kode dugi I ieu ditinggalkeun ku kode awal nu configures sistem pikeun ngajalankeun kaulinan, initializes hardware Rendering, jsb. Tangtosna, dina tahap ieu kuring henteu tiasa nyiptakeun ménu simpen sareng beban, sabab kuring kedah nyiptakeun rintisan pikeun sadaya kode grafik. Tapi kuring bisa pura-pura jadi pamaké ngagunakeun (kawih) ngahemat tur muka layar tur nanya pikeun nyimpen lajeng nulis kana kartu memori.

Ieu ditinggalkeun kuring kalayan sapotong leutik kode anu masih miboga masalah di luhur - tapi masih lumangsung acak! Paling sering sagalana digawé rupa, tapi aya kalana aya glitches. Kuring dipiceun ampir kabéh kode kaulinan, tapi bug masih hirup. Ieu matak ngahudangkeun: kode sésana teu sabenerna ngalakukeun nanaon.

Di sawatara titik, meureun kira tilu isuk-isuk, hiji pamikiran lumangsung ka kuring. Operasi maca sareng nyerat (input/output) ngalibatkeun waktos palaksanaan anu tepat. Nalika anjeun damel sareng hard drive, kartu mémori atanapi modul Bluetooth, kode tingkat rendah anu tanggung jawab maca sareng nyerat saluyu sareng pulsa jam.

Kalayan bantosan jam, alat anu henteu langsung nyambung kana prosésor disingkronkeun sareng kode anu dilaksanakeun dina prosésor. Jam nangtukeun baud rate-laju di mana data ditransfer. Upami aya kabingungan sareng waktosna, teras hardware atanapi parangkat lunak, atanapi duanana, ogé bingung. Sarta ieu pisan goréng, sabab data bisa ruksak.

Kumaha upami aya dina kode urang ngabingungkeun waktosna? Kuring dipariksa sagalana patali ieu dina kode program test na noticed nu urang nyetel timer programmable di PS1 ka 1 kHz (1000 ticks per detik). Ieu rada loba; sacara standar, nalika konsol dimimitian, éta dijalankeun dina 100 Hz. Sarta lolobana kaulinan ngagunakeun frékuénsi ieu.

Andy, pamekar kaulinan, nyetel timer ka 1 kHz ambéh gerakan bakal diitung leuwih akurat. Andy condong balik overboard, sarta lamun urang emulate gravitasi, urang ngalakukeun sakumaha akurat jéntré!

Tapi kumaha lamun ngagancangkeun timer kumaha bae mangaruhan timing sakabéh program, sarta ku kituna jam nu ngatur laju baud pikeun kartu memori?

Kuring commented kaluar kode timer. Kasalahan teu lumangsung deui. Tapi ieu lain hartosna yén urang ngalereskeun eta, sabab gagalna lumangsung acak. Kumaha lamun kuring ngan untung?

Sababaraha poé sanggeusna kuring experimented deui kalawan program test. Kutu teu kaulang deui. Kuring balik deui ka codebase game lengkep sareng ngarobih kodeu simpen sareng beban supados timer diprogram bakal ngareset kana nilai aslina (100Hz) sateuacan ngaksés kartu mémori, teras ngareset deui ka 1kHz. Teu aya deui kacilakaan.

Tapi naha ieu kajadian?

Kuring balik ka program test deui. Kuring diusahakeun neangan sababaraha pola dina lumangsungna kasalahan kalawan timer 1 kHz. Tungtungna kuring noticed nu kasalahan lumangsung nalika batur maén kalawan controller PS1. Kusabab kuring jarang ngalakukeun ieu sorangan - naha kuring peryogi controller nalika nguji simpen sareng beban kode? - Kuring malah teu aya bewara kagumantungan ieu. Tapi hiji dinten salah sahiji seniman urang ngantosan kuring ngabéréskeun tés - kuring sigana kutukan dina waktos éta - sareng gugup ngagulung controller dina pananganana. Aya kasalahan. “Tunggu, naon?!” Tah, laksanakeun deui!”

Nalika kuring sadar yen dua acara ieu interconnected, Kuring bisa kalayan gampang baranahan kasalahan: Kuring mimiti ngarekam kana kartu memori, dipindahkeun controller, sarta ruined kartu memori. Pikeun kuring éta katingalina sapertos bug hardware.

Kuring sumping ka Connie sareng nyarioskeun ka anjeunna ngeunaan penemuan kuring. Anjeunna ngirimkeun inpormasi ka salah sahiji insinyur anu ngarancang PS1. "Mustahil," jawabna, "Teu tiasa janten masalah hardware." Kuring nanya Connie pikeun ngatur paguneman pikeun urang.

Insinyur nyauran kuring sareng kami nyarios dina basa Inggris anu rusak sareng basa Jepang kuring (pisan) rusak. Tungtungna kuring nyarios, "Hayu kuring ngan ngirimkeun program uji 30 garis kuring dimana mindahkeun pangendali nyababkeun bug." Anjeunna satuju. Ceuk éta runtah waktu sarta yén anjeunna sangar sibuk gawe dina proyék anyar, tapi bakal masihan sabab kami pamekar pohara penting pikeun Sony. Kuring ngabersihan program uji kuring sareng dikirim ka anjeunna.

Sore hareup (kami di Los Angeles jeung manéhna di Tokyo) manéhna nelepon kuring jeung sheepishly hapunten. Éta masalah hardware.

Kuring henteu weruh naon kahayang bug éta, tapi tina naon anu kuring uninga di markas Sony, lamun nyetel timer ka nilai cukup luhur, interfered komponén dina motherboard di sabudeureun kristal timer. Salah sahijina nyaéta controller laju baud pikeun kartu mémori, anu ogé nyetél laju baud pikeun pangendali. Abdi sanés insinyur, janten kuring tiasa ngaco.

Tapi garis handap éta aya gangguan antara komponén dina motherboard nu. Sareng nalika ngirimkeun data sakaligus ngalangkungan port controller sareng port kartu mémori kalayan timer dijalankeun dina 1 kHz, bit leungit, data leungit, sareng kartu rusak.

Sapi goréng

Dina taun 1980-an, mentor kuring Sergei nyerat parangkat lunak pikeun SM-1800, klon Soviét tina PDP-11. Mikrokomputer ieu nembé dipasang di stasion karéta api caket Sverdlovsk, pusat angkutan penting di USSR. Sistem anyar ieu dirancang pikeun jalur gerbong sareng lalu lintas angkutan barang. Tapi éta ngandung bug ngaganggu anu nyababkeun kacilakaan sareng kacilakaan acak. Curug sok kajantenan nalika aya anu mulih sonten. Tapi sanajan panalungtikan teleb poé saterusna, komputer digawé leres dina sagala tés manual tur otomatis. Ieu biasana nunjukkeun kaayaan balapan atanapi sababaraha bug kompetitif sanés anu lumangsung dina kaayaan anu tangtu. Bosen nelepon telat peuting, Sergei mutuskeun pikeun meunangkeun ka handap, sarta mimiti sagala, ngartos naon kaayaan di buruan marshalling ngarah ka ngarecahna komputer.

Kahiji, anjeunna ngumpulkeun statistik sadaya ragrag unexplained sarta nyieun grafik dumasar titimangsa jeung waktu. Pola éta atra. Saatos observasi pikeun sababaraha poé deui, Sergei sadar yén anjeunna bisa kalayan gampang ngaduga waktu gagalna sistem hareup.

Anjeunna geura-giru diajar yén gangguan ngan lumangsung nalika stasion ieu asihan trainloads sapi ti Ukraina kalér jeung Rusia barat dipingpin ka jagal caket dieu. Ieu sorangan aneh, sabab imah jagal disayogikeun ku kebon anu lokasina langkung caket, di Kazakhstan.

Pembangkit listrik tenaga nuklir Chernobyl ngabeledug dina taun 1986, sareng panyemburan radioaktif ngajantenkeun daérah sakurilingna teu tiasa dicicingan. Wewengkon anu lega di kalér Ukraina, Bélarus sareng Rusia barat kacemar. Suspecting tingkat tinggi radiasi dina gerbong anjog, Sergei ngembangkeun hiji métode pikeun nguji téori ieu. Populasi dilarang gaduh dosimeters, jadi Sergei ngadaptar dirina kalawan sababaraha lalaki militér di stasiun karéta. Saatos sababaraha inuman vodka, anjeunna junun ngayakinkeun prajurit pikeun ngukur tingkat radiasi dina salah sahiji gerbong curiga. Tétéla yén tingkat ieu sababaraha kali leuwih luhur ti nilai normal.

Henteu ngan éta sapi emit loba radiasi, tingkat na éta jadi luhur nu ngarah ka leungitna acak tina bit dina mémori SM-1800, anu lokasina di gedong gigireun stasion.

Aya kakurangan pangan di USSR, sareng otoritas mutuskeun pikeun nyampur daging Chernobyl sareng daging ti daérah sanés nagara. Ieu ngamungkinkeun pikeun ngurangan tingkat sakabéh radioaktivitas tanpa kaleungitan sumberdaya berharga. Sanggeus diajar ngeunaan ieu, Sergei langsung ngeusian dokumén pikeun émigrasi. Jeung ngadat komputer eureun sorangan lamun tingkat radiasi turun kana waktu.

Ngaliwatan pipa

Baheula, Movietech Solutions nyiptakeun parangkat lunak pikeun bioskop, dirancang pikeun akuntansi, penjualan tikét sareng manajemén umum. Versi DOS tina aplikasi unggulan éta cukup populer di kalangan ranté bioskop leutik sareng pertengahan ukuran di Amérika Kalér. Janten teu heran nalika versi Windows 95 diumumkeun, terpadu sareng layar toél panganyarna sareng kios swalayan, sareng dilengkepan ku sagala jinis alat ngalaporkeun, éta gancang janten populer ogé. Paling sering update indit tanpa masalah. Staf IT lokal masang alat anyar, migrasi data, sareng bisnis diteruskeun. Iwal mun teu lepas. Nalika ieu kajantenan, perusahaan bakal ngirim James, anu dingaranan "The Cleaner."

Sanajan nickname nunjukkeun hiji tipe nefarious, cleaner ngan kombinasi instruktur, installer jeung jack-of-all-trades. James bakal nyéépkeun sababaraha dinten di situs klien pikeun ngahijikeun sadaya komponén, teras nyéépkeun sababaraha dinten deui pikeun ngajarkeun staf cara ngagunakeun sistem énggal, ngarengsekeun masalah hardware anu timbul sareng dasarna ngabantosan parangkat lunak salami orok.

Ku alatan éta, teu heran dina mangsa hectic ieu, James anjog di kantor isuk-isuk, sarta saméméh anjeunna bisa ngahontal meja na, anjeunna disambut ku manajer, ngeusi kafein saluareun biasa.

"Kuring sieun anjeun kedah angkat ka Annapolis, Nova Scotia, pas mungkin." Sakabéh sistemna turun, sareng saatos wengi damel sareng insinyurna, urang henteu tiasa terang naon anu kajantenan. Sigana mah jaringan geus gagal dina server. Tapi ngan sanggeus sistem geus ngajalankeun sababaraha menit.

- Aranjeunna teu balik deui ka sistem heubeul? - James ngajawab sagemblengna serius, sanajan mental anjeunna widened panon na di reuwas.

- Persis: spesialis IT maranéhanana "robah prioritas" sarta mutuskeun ninggalkeun kalawan server heubeul maranéhanana. James, aranjeunna dipasang sistem dina genep situs na ngan mayar rojongan premium, sarta bisnis maranéhanana ayeuna ngajalankeun kawas éta dina 1950s.

James ngalempengkeun rada.

- Éta urusan séjén. Oké, hayu urang ngamimitian.

Nalika anjeunna dugi ka Annapolis, hal anu munggaran anjeunna laksanakeun nyaéta mendakan téater munggaran palanggan anu ngagaduhan masalah. Dina peta anu dicandak di bandara, sadayana katingali saé, tapi daérah di sekitar alamat anu dipikahoyong katingalina curiga. Teu ghetto, tapi reminiscent tina film noir. Nalika James parkir di pinggir jalan kota, saurang palacuran ngadeukeutan anjeunna. Dibikeun ukuran Annapolis, éta paling dipikaresep ngan hiji di sakabéh kota. Penampilanna langsung ngémutan karakter anu kasohor anu nawiskeun séks pikeun artos dina layar lebar. Henteu, sanés ngeunaan Julia Roberts, tapi ngeunaan Jon Voight [allusion kana pilem "Midnight Cowboy" - approx. jalur].

Sanggeus dikirim PSK di jalan nya, James indit ka bioskop. Wewengkon sabudeureun geus gotten hadé, tapi masih masihan kesan keur lumpat ka handap. Henteu yén James hariwang teuing. Anjeunna kantos ka tempat-tempat anu goréng. Sarta ieu Kanada, dimana malah muggers cukup sopan ngomong "hatur nuhun" sanggeus nyokot dompét anjeun.

Lawang sisi ka bioskop aya dina gang anu dank. James walked kana panto jeung knocked. Teu lila creked jeung muka rada.

-Dupi anjeun cleaner? - sora serak datang ti jero.

- Sumuhun, éta kuring ... Kuring datang ka ngalereskeun sagalana.

James leumpang ka lobi bioskop. Tétéla teu boga pilihan séjén, staf mimiti handing kaluar tikét kertas ka sémah. Ieu ngajantenkeun ngalaporkeun kauangan sesah, sumawona detil anu langkung narik. Tapi staf dipapag James kalawan relief sarta geuwat nyandak anjeunna ka kamar server.

Dina glance kahiji, sagalana éta rupa. James asup kana server jeung pariksa tempat curiga biasa. Henteu masalah. Sanajan kitu, kaluar tina hiji kaayaanana caution, James Cicing turun server, ngaganti kartu jaringan, sarta digulung deui sistem. Manehna langsung ngamimitian digawé pinuh. Staf mimiti ngajual tiket deui.

James nelepon Tandaan sarta informed anjeunna ngeunaan kaayaan. Henteu sesah ngabayangkeun yén James panginten hoyong tetep sareng ningali upami aya kajadian anu teu kaduga. Anjeunna turun tangga sareng mimiti naroskeun ka karyawan naon anu kajantenan. Jelas sistem parantos lirén damel. Aranjeunna dipareuman jeung on, sagalana jalan. Tapi sanggeus 10 menit sistem murag kaluar.

Ngan dina momen ieu hal sarupa kajadian. Ujug-ujug, sistem tikét mimiti ngalungkeun kasalahan. Staf ngahuleng jeung nyekel tiket kertas, sarta James buru ka kamar server. Sagalana kasampak alus kalawan server.

Tuluy salah saurang pagawé asup.

- Sistemna jalan deui.

James bingung sabab anjeunna henteu ngalakukeun nanaon. Leuwih tepat, euweuh nu bakal nyieun sistem jalan. Anjeunna kaluar, ngangkat teleponna, sareng nelepon ka saluran dukungan perusahaanna. Teu lila pagawe nu sarua asup ka rohangan server.

- Sistim na turun.

James glanced dina server. Hiji pola metot jeung akrab tina wangun multi-warna nari dina layar - chaotically writhing na intertwining pipa. Urang sadaya geus katempo screensaver ieu di sawatara titik. Ieu beautifully rendered sarta sacara harfiah hypnotizing.


James mencét tombol sareng polana ngaleungit. Anjeunna buru-buru ka kantor karcis sareng di jalan pendak sareng karyawan anu uih deui ka anjeunna.

- Sistemna jalan deui.

Upami anjeun tiasa ngalakukeun facepalm mental, éta persis anu dilakukeun ku James. Pangawét layar. Éta ngagunakeun OpenGL. Ku alatan éta, dina mangsa operasi, eta meakeun sagala sumberdaya processor server. Hasilna, unggal panggero ka server ditungtungan make timeout a.

James balik ka kamar server, asup, sarta ngaganti screensaver jeung pipa geulis jeung layar kosong. Hartina, tinimbang screensaver nu meakeun 100% sumberdaya processor, Kuring dipasang hiji sejen nu teu meakeun sumberdaya. Teras kuring ngadagoan 10 menit pikeun pariksa dugaan kuring.

Nalika James anjog di bioskop salajengna, anjeunna wondering kumaha ngajelaskeun ka manajer na yén anjeunna kakarék flown 800 km pikeun mareuman screen saver.

Kacilakaan salila fase tangtu bulan

Carita leres. Hiji dinten timbul bug software anu gumantung kana fase bulan. Aya sababaraha rutin anu biasa dianggo dina sagala rupa program MIT pikeun ngitung perkiraan kana fase Bulan anu leres. GLS ngawangun rutin ieu kana program LISP anu, nalika nyerat file, bakal ngahasilkeun garis kalayan cap waktu ampir 80 karakter. Jarang pisan yén baris kahiji pesen bakal jadi panjang teuing tur ngakibatkeun baris salajengna. Sareng nalika program engké maca file ieu, éta dilaknat. Panjang garis kahiji gumantung kana tanggal pasti jeung waktu, kitu ogé panjang spésifikasi fase dina waktu timestamp dicitak. Nyaéta, bug sacara harfiah gumantung kana fase bulan!

Édisi kertas munggaran Jargon File (Steele-1983) ngandung conto garis sapertos anu nyababkeun bug anu dijelaskeun, tapi panyetel "dibereskeun" éta. Ieu parantos didadarkeun salaku "bug fase bulan".

Nanging, ati-ati ku asumsi. Sababaraha taun ka tukang, insinyur ti CERN (Puseur Éropa pikeun Panaliti Nuklir) mendakan kasalahan dina percobaan anu dilakukeun dina Collider Electron-Positron Collider. Kusabab komputer aktip ngolah sajumlah ageung data anu dihasilkeun ku alat ieu sateuacan nunjukkeun hasilna ka para ilmuwan, seueur anu ngaduga yén parangkat lunak éta sénsitip kana fase bulan. Sababaraha insinyur nekat dugi ka dasar bebeneran. Kasalahan timbul alatan parobahan saeutik dina géométri cingcin panjang 27 km alatan deformasi Bumi salila petikan Bulan! Carita ieu geus diasupkeun folklore fisika salaku "Newton urang Dendam on Partikel Fisika" jeung conto sambungan antara hukum pangbasajanna jeung pangkolotna fisika jeung konsép ilmiah paling canggih.

Siram jamban eureun karéta

Bug hardware pangsaéna anu kuring kantos nguping nyaéta dina karéta gancang di Perancis. Bug éta nyababkeun ngerem darurat tina karéta, tapi ngan upami aya panumpang dina kapal. Dina unggal hal sapertos kitu, karéta nu dibawa kaluar tina layanan, dipariksa, tapi euweuh kapanggih. Lajeng anjeunna dikirim deui ka jalur, sarta anjeunna langsung nabrak eureun.

Dina salah sahiji pamariksaan, saurang insinyur anu nuju kana karéta angkat ka WC. Anjeunna geura-giru dikumbah jauh, BOOM! eureun darurat.

Insinyur ngahubungi supir sareng naros:

- Naon anu anjeun lakukeun sateuacan ngerem?

- Nya, kuring ngalambatkeun turunna ...

Ieu aneh, sabab salila operasi normal karéta slows turun dina sababaraha puluhan kali. Karéta terus maju, sareng dina turunna salajengna supir ngingetkeun:

- Abdi badé ngalambatkeun.

Euweuh kajadian.

— Naon anu anjeun lakukeun salami ngerem anu terakhir? - nanya ka supir.

- Muhun ... Abdi di wc ...

- Nya, teras angkat ka WC sareng lakukeun naon anu anjeun lakukeun nalika urang turun deui!

Insinyur angkat ka WC, sareng nalika supir ngingetkeun: "Kuring ngalambatkeun," anjeunna nyéépkeun cai. Tangtu, karéta eureun langsung.

Ayeuna aranjeunna tiasa ngahasilkeun deui masalah sareng peryogi milarian panyababna.

Saatos dua menit, aranjeunna noticed nu engine marake kabel kadali jauh (karéta miboga hiji mesin di unggal tungtung) ieu dipegatkeun tina témbok kabinét listrik sarta bohong dina relay nu dikawasa solenoid colokan toilét ... Nalika relay nu dihurungkeun, éta nyiptakeun gangguan dina kabel rem, sarta panyalindungan sistem ngalawan gagal saukur kaasup ngerem darurat.

The gateway nu hated FORTRAN

Sababaraha bulan kapengker urang perhatikeun yén sambungan jaringan di daratan [ieu di Hawaii] janten lambat pisan. Ieu bisa lepas pikeun 10-15 menit lajeng ujug-ujug lumangsung deui. Saatos sababaraha waktos, batur sapagawean kuring humandeuar ka kuring yén sambungan jaringan di daratan RІRѕRѕR C ± ‰ Rμ teu hasil. Anjeunna kagungan sababaraha kode FORTRAN anu diperlukeun pikeun disalin ka mesin di daratan, tapi teu bisa sabab "jaringan teu tahan nepi cukup lila pikeun unggah ftp pikeun ngalengkepan."

Sumuhun, tétéla yén gagal jaringan lumangsung nalika batur sapagawean nyoba FTP file kalawan kode sumber di FORTRAN ka mesin di daratan. Urang nyoba arsip file: lajeng ieu disalin mulus (tapi mesin target teu boga unpacker, jadi masalahna teu direngsekeun). Tungtungna urang "meulah" kode FORTRAN kana lembar pisan leutik tur dikirim aranjeunna hiji-hiji. Kalolobaan fragmen anu disalin tanpa masalah, tapi sababaraha lembar teu lulus, atawa lulus sanggeus loba usaha.

Nalika urang nalungtik petikan masalah, urang mendakan yén aranjeunna gaduh hal anu umum: aranjeunna sadayana ngandung blok koméntar anu dimimitian sareng ditungtungan ku garis anu diwangun ku modal C (sakumaha batur sapagawean resep masihan koméntar dina FORTRAN). Urang emailed ahli jaringan di daratan jeung ménta pitulung. Tangtosna, aranjeunna hoyong ningali conto file kami anu henteu tiasa ditransfer via FTP ... tapi surat kami henteu dugi ka aranjeunna. Tungtungna urang datang nepi ka basajan ngajelaskeunkumaha file non-transferable kasampak kawas. Ieu digawé :) [Wani kuring nambahkeun conto salah sahiji masalah FORTRAN komentar didieu? Panginten henteu patut!]

Dina tungtungna urang junun angka eta kaluar. Gerbang anyar nembe dipasang antara bagian kampus urang sareng jaringan daratan. Sesah pisan pikeun ngirimkeun pakét anu ngandung bit-bit hurup C anu diulang! Ngan sababaraha pakét ieu tiasa nyandak sadaya sumber gateway sareng nyegah kalolobaan pakét sanés ngalangkungan. Urang humandeuar ka produsén gateway ... sarta aranjeunna ngawaler: "Oh, enya, anjeun Nyanghareupan ku bug tina ulang C! Kami parantos terang ngeunaan anjeunna. ” Urang pamustunganana direngsekeun masalah ku purchasing gateway anyar ti produsén séjén (dina pertahanan urut urang, henteu mampuh pikeun mindahkeun program FORTRAN bisa jadi hiji kaunggulan pikeun sabagian!).

jaman susah

Sababaraha taun ka pengker, nalika damel dina nyiptakeun sistem ETL di Perl pikeun ngirangan biaya uji klinis fase 40, kuring kedah ngolah sakitar 000 tanggal. Dua diantarana henteu lulus ujian. Ieu henteu ngaganggu kuring teuing kusabab tanggal-tanggal ieu dicandak tina data anu disayogikeun ku klien anu sering, urang kedah nyarios, héran. Tapi nalika kuring pariksa data aslina, tétéla yén kaping ieu 1 Januari 2011 jeung 1 Januari 2007. Kuring ngira yén bug ieu dikandung dina program Kuring geus ngan ditulis, tapi tétéla yén éta téh geus 30 taun. heubeul. Ieu sigana misterius pikeun anu teu wawuh sareng ékosistem parangkat lunak. Kusabab kaputusan lila-ngadeg parusahaan sejen urang nyieun duit, klien kuring mayar kuring pikeun ngalereskeun bug nu hiji parusahaan geus diwanohkeun ku kacilakaan sarta séjén ngahaja. Kanggo anjeun ngartos naon anu kuring nyarioskeun, kuring kedah ngobrol ngeunaan perusahaan anu nambihan fitur anu tungtungna janten bug, kitu ogé sababaraha acara anu pikaresepeun anu nyumbang kana bug misterius anu kuring dibereskeun.

Dina jaman baheula, komputer Apple sakapeung sacara spontan ngareset tanggalna ka 1 Januari 1904. Alesanna basajan: éta ngagunakeun "jam sistem" anu didamel batré pikeun ngalacak tanggal sareng waktos. Naon anu lumangsung nalika batréna maot? Komputer mimiti ngalacak tanggal ku jumlah detik ti mimiti hiji epoch. Ku epoch kami dimaksudkeun tanggal aslina rujukan, sarta pikeun Macintosh éta 1. Januari 1904. Sarta sanggeus batréna maot, tanggal ayeuna ieu reset ka nu ditangtukeun. Tapi naha ieu kajadian?

Saméméhna, Apple ngagunakeun 32 bit pikeun nyimpen jumlah detik ti tanggal aslina. Hiji bit bisa nyimpen salah sahiji dua nilai - 1 atawa 0. Dua bit bisa nyimpen salah sahiji opat nilai: 00, 01, 10, 11. Tilu bit - hiji nilai kaluar dalapan: 000, 001, 010, 011, 100 , 101, 110, 111, jsb. Sareng 32 tiasa nyimpen salah sahiji tina 232 nilai, nyaéta 4 detik. Kanggo kaping Apple, ieu sami sareng sakitar 294 taun, janten Mac anu langkung lami teu tiasa ngadamel tanggal saatos 967. Sareng upami batré sistem maot, tanggal reset ka 296 detik ti mimiti jaman, sareng anjeun kedah nyetél tanggal sacara manual unggal waktos anjeun ngaktipkeun komputer (atanapi dugi ka anjeun mésér batré énggal).

Nanging, kaputusan Apple pikeun nyimpen tanggal sakedap ti saprak jaman éta hartosna urang henteu tiasa ngolah tanggal sateuacan jaman, anu ngagaduhan akibat anu jauh, sapertos anu bakal urang tingali. Apple ngenalkeun fitur, sanés bug. Diantara hal séjén, ieu dimaksudkan yén sistem operasi Macintosh éta kebal kana "milénium bug" (anu teu bisa disebutkeun ngeunaan loba aplikasi Mac nu boga sistem tanggal sorangan pikeun circumvent larangan).

Lajengkeun. Kami nganggo Lotus 1-2-3, "aplikasi pembunuh" IBM anu ngabantosan ngaluncurkeun revolusi PC, sanaos komputer Apple ngagaduhan VisiCalc, anu ngajantenkeun komputer pribadi suksés. Dina fairness, lamun 1-2-3 geus teu mucunghul, PCs bakal boro geus dicokot off, jeung sajarah komputer pribadi bisa geus dimekarkeun pisan béda. Lotus 1-2-3 salah nganggap 1900 salaku taun kabisat. Nalika Microsoft ngarilis spreadsheet kahijina, Multiplan, éta ngarebut pangsa leutik pasar. Sareng nalika aranjeunna ngaluncurkeun proyék Excel, aranjeunna mutuskeun henteu ngan ukur nyalin skéma ngaran baris sareng kolom tina Lotus 1-2-3, tapi ogé pikeun mastikeun kasaluyuan bug ku ngahaja ngarawat 1900 salaku taun kabisat. masalah ieu masih aya kiwari. Nyaéta, dina 1-2-3 ieu mangrupikeun bug, tapi dina Excel éta mangrupikeun kaputusan sadar anu mastikeun yén sadaya pangguna 1-2-3 tiasa ngimpor tabelna kana Excel tanpa ngarobih data, sanaos éta lepat.

Tapi aya masalah sejen. Kahiji, Microsoft ngarilis Excel pikeun Macintosh, nu teu ngakuan tanggal saméméh 1 Januari 1904. Sarta dina Excel, 1 Januari 1900 dianggap awal jaman. Ku alatan éta, pamekar nyieun parobahan ambéh program maranéhanana dipikawanoh tipe era jeung data disimpen dina diri luyu jeung jaman nu dipikahoyong. Microsoft malah nyerat tulisan panjelasan ngeunaan ieu. Sareng kaputusan ieu nyababkeun bug kuring.

Sistim ETL abdi nampi spreadsheets Excel ti nasabah anu dijieun dina Windows, tapi ogé bisa dijieun dina Mac. Ku alatan éta, awal jaman dina tabel bisa jadi boh 1 Januari 1900, atawa 1 Januari 1904. Kumaha carana manggihan? format file Excel nembongkeun informasi diperlukeun, tapi parser I dipaké teu némbongkeun éta (ayeuna hancana), sarta nganggap yén anjeun terang epoch pikeun tabel husus. Kuring meureun bisa geus spent leuwih waktos ngartos format binér Excel sarta ngirim patch ka pangarang parser, tapi kuring kungsi loba deui ngalakukeun pikeun klien, jadi kuring gancang nulis heuristik pikeun nangtukeun epoch nu. Manéhna basajan.

Dina Excel, tanggal 5 Juli 1998 tiasa diwakilan dina format "07-05-98" (sistem Amérika gunana), "5 Juli 98", "5 Juli 1998", "5-Jul-98" atanapi sababaraha format sejen. format sejen gunana (ironisna, salah sahiji format versi abdi Excel teu nawiskeun éta ISO 8601). Nanging, dina tabél, tanggal anu teu diformat disimpen salaku "35981" kanggo epoch-1900 atanapi "34519" kanggo epoch-1904 (angka ngagambarkeun jumlah dinten ti saprak jaman éta). Kuring ngan ukur nganggo parser saderhana pikeun nimba taun tina tanggal anu diformat, teras nganggo parser Excel pikeun nimba taun tina tanggal anu teu diformat. Upami duanana nilai bénten ku 4 taun, maka kuring terang yén kuring nganggo sistem sareng epoch-1904.

Naha kuring henteu ngan ukur nganggo tanggal anu diformat? Kusabab 5 Juli 1998 tiasa diformat janten "Juli, 98" sareng dinten bulan leungit. Kami nampi tabel ti seueur perusahaan anu nyiptakeunana ku sababaraha cara anu béda-béda dugi ka kami (dina hal ieu, kuring) pikeun terang tanggalna. Salaku tambahan, upami Excel leres, maka urang kedah ogé!

Dina waktu nu sarua kuring encountered 39082. Hayu atuh ngingetkeun yén Lotus 1-2-3 dianggap 1900 taun kabisat, sarta ieu satia terus-terusan dina Excel. Sarta saprak ieu ditambahkeun hiji poé ka taun 1900, loba fungsi itungan tanggal bisa salah pikeun poé éta pisan. Nyaéta, 39082 tiasa janten 1 Januari 2011 (dina Mac) atanapi 31 Désémber 2006 (dina Windows). Upami "parser taun" kuring diekstrak taun 2011 tina nilai anu diformat, maka sadayana henteu kunanaon. Tapi kumargi parser Excel henteu terang naon jaman anu dianggo, éta ingkar ka epoch-1900, mulangkeun taun 2006. Aplikasi kuring ningali yén bédana nyaéta 5 taun, nganggap éta kasalahan, log in, sareng ngabalikeun nilai anu teu diformat.

Pikeun ngurilingan ieu, kuring nyerat ieu (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

Teras sadayana 40 tanggal diuraikan leres.

Di tengah jobs print badag

Dina awal 1980-an, bapa kuring digawé di Panyimpenan Téhnologi, a division ayeuna-defunct nu dijieun tape drive na sistem pneumatic pikeun speed tinggi tape nyoco.

Aranjeunna redesigned drive ambéh maranéhanana bisa boga hiji sentral "A" drive disambungkeun ka tujuh "B" drive, sarta OS leutik dina RAM nu dikawasa "A" drive bisa utusan maca jeung nulis operasi ka sadaya "B" drive.

Unggal waktos drive "A" dimimitian, perlu nyelapkeun floppy disk kana drive periferal disambungkeun ka "A" pikeun ngamuat sistem operasi kana mémori na. Éta primitif pisan: kakuatan komputasi disayogikeun ku mikrokontroler 8-bit.

Pamirsa sasaran pikeun alat-alat sapertos kitu nyaéta perusahaan anu gaduh gudang data anu ageung pisan - bank, ranté ritel, sareng sajabana - anu peryogi nyitak seueur labél alamat atanapi pernyataan bank.

Hiji klien ngagaduhan masalah. Di tengah-tengah padamelan citak, hiji drive tinangtu "A" tiasa lirén damel, nyababkeun sadayana padamelan. Pikeun mulangkeun operasi drive, staf kedah reboot sadayana. Sareng upami ieu kajantenan di tengah-tengah tugas genep jam, maka jumlah waktos komputer anu mahal leungit sareng jadwal operasi sadayana kaganggu.

Teknisi dikirim ti Storage Technologies. Tapi sanajan usaha pangalusna maranéhanana, maranéhna teu bisa baranahan bug dina kaayaan test: sigana lumangsung di tengah jobs print badag. Masalahna sanés hardware, aranjeunna ngagentos sadayana anu tiasa: RAM, mikrokontroler, floppy drive, unggal bagian anu tiasa dibayangkeun tina pita drive - masalahna tetep.

Teras para teknisi nyauran markas sareng nyauran Ahli.

Ahli nyekel korsi jeung cangkir kopi, diuk di kamar komputer-jaman aya kamar dedicated ka komputer-jeung diawaskeun salaku staf antrian up pakasaban print badag. Ahli éta ngantosan hiji kagagalan lumangsung - sarta eta tuh. Sarerea melong ka Ahli, tapi anjeunna teu boga pamanggih naha ieu kajadian. Ku kituna anjeunna maréntahkeun pakasaban antrian deui, sarta sakabeh staf jeung teknisi balik deui ka pagawean.

Ahli deui calik dina korsi sareng mimiti ngantosan gagal. Ngeunaan genep jam kaliwat sarta gagalna lumangsung. Ahli deui teu boga pamanggih, iwal sagalana kajadian di kamar ngeusi jalma. Anjeunna maréntahkeun misi pikeun restarted, diuk deui ka handap sarta antosan.

Ku gagalna katilu, Ahli noticed hal. Gagalna lumangsung nalika tanaga ngarobih kaset dina drive asing. Leuwih ti éta, kagagalan lumangsung pas salah sahiji karyawan walked ngaliwatan ubin tangtu di lantai.

Lantai diangkat dijieunna tina Kotak aluminium diteundeun dina jangkungna 6 mun 8 inci. Seueur kabel tina komputer ngalir di handapeun lanté anu digedékeun pikeun nyegah saha waé anu ngahaja napak kana kabel anu penting. Ubin-ubinna ditataan pageuh pisan pikeun nyegah lebu asup ka handapeun lanté anu diangkat.

Ahli sadar yén salah sahiji ubin cacad. Nalika hiji pagawe nincak pojokna, ujung-ujung ubin digosok kana ubin anu padeukeut. Bagian plastik anu nyambungkeun ubin ogé digosok sareng aranjeunna, anu nyababkeun microdischarges statik anu nyiptakeun gangguan frekuensi radio.

Kiwari, RAM leuwih hadé ditangtayungan tina gangguan frékuénsi radio. Tapi dina eta taun ieu teu kasus. Ahli sadar yén gangguan ieu ngaganggu mémori, sareng sareng éta operasi sistem operasi. Anjeunna nyauran jasa dukungan, mesen ubin énggal, dipasang nyalira, sareng masalahna ngaleungit.

Ieu pasang luhur!

Carita lumangsung di kamar server, di lantai kaopat atawa kalima hiji kantor di Portsmouth (Jigana), di wewengkon docks.

Hiji poé server Unix kalawan database utama nabrak. Aranjeunna rebooted anjeunna, tapi anjeunna happily terus ragrag leuwih sarta leuwih deui. Urang mutuskeun pikeun nelepon batur ti layanan rojongan.

Lalaki anu ngadukung ... Jigana ngaranna éta Mark, tapi éta henteu masalah ... Kuring teu nyangka kuring kenal anjeunna. Henteu masalah, nyaan. Hayu urang tetep sareng Mark, oke? Hebat.

Janten, sababaraha jam saatos sumping Mark (teu jauh ti Leeds ka Portsmouth, anjeun terang), dihurungkeun server sareng sadayana damel tanpa masalah. Pangrojong damn has, klien janten kesel pisan ngeunaan éta. Mark ningali kana file log sareng teu mendakan anu teu pikaresepeun. Ku kituna Mark meunang deui kana karéta (atawa naon baé modus angkutan anjeunna anjog kana, éta bisa geus sapi lame pikeun sakabéh I nyaho ... atoh, teu masalah, oke?) Jeung huluna deui ka Leeds, sanggeus wasted poé.

Sore anu sami server nabrak deui. carita na sarua ... server teu naek. Mark nyoba mantuan jarak jauh, tapi klien teu bisa ngamimitian server.

karéta sejen, beus, lemon meringue atawa sababaraha crap séjén, sarta Tandaan geus balik di Portsmouth. Tingali, server boot tanpa masalah! Kaajaiban. Tandaan spends sababaraha jam mariksa yen sagalana aya dina urutan kalawan sistem operasi atawa software sarta susunan kaluar pikeun Leeds.

Kira-kira tengah poé server ngadat (tenang!). waktos Ieu sigana lumrah pikeun mawa dina rojongan hardware jalma pikeun ngaganti server. Tapi henteu, saatos 10 jam ogé ragrag.

Kaayaan kasebut terus-terusan sababaraha dinten. server jalan, ngadat sanggeus ngeunaan 10 jam na teu ngamimitian pikeun salajengna 2 jam. Aranjeunna pariksa cooling, bocor memori, aranjeunna dipariksa sagalana, tapi kapanggih nanaon. Lajeng nu ngadat eureun.

Saminggu kapungkur... sarerea bungah. Bagja dugi ka sadayana dimimitian deui. Gambarna sami. 10 jam gawé, 2-3 jam downtime ...

Lajeng batur (Jigana aranjeunna ngawartoskeun kuring yén jalma ieu teu boga nanaon jeung IT) ngomong:

"Ieu ombak!"

Panyeluk ieu dipapag ku neuteup kosong, sarta leungeun batur meureun hesitated dina tombol panggero kaamanan.

"Éta lirén damel sareng pasang."

Ieu sigana janten konsép anu asing pisan pikeun pagawé pangrojong IT, anu henteu sigana maca Tide Yearbook bari calik pikeun ngopi. Aranjeunna ngécéskeun yén ieu teu bisa patali jeung pasang sagala cara, sabab server geus digawé pikeun saminggu tanpa gagal.

"Minggu kamari pasang surut, tapi minggu ieu luhur."

A terminologi saeutik pikeun maranéhanana anu teu boga lisénsi yacht. Tides gumantung kana siklus lunar. Sareng nalika Bumi muter, unggal 12,5 jam tarikan gravitasi Panonpoé sareng Bulan nyiptakeun gelombang pasang. Dina awal siklus 12,5 jam aya pasang luhur, di tengah siklus aya pasang surut, sarta dina tungtungna aya pasang tinggi deui. Tapi sakumaha orbit bulan robah, kitu ogé bédana antara pasang surut jeung luhur. Nalika Bulan aya di antara Panonpoé sareng Bumi atanapi di sisi sabalikna Bumi (bulan purnama atanapi henteu aya bulan), urang nampi pasang Syzygyn - pasang luhur pangluhurna sareng pasang panghandapna. Dina satengah bulan urang meunang quadrature tides - pasang panghandapna. Beda antara dua extremes nurun greatly. Siklus lunar lumangsung 28 dinten: syzygian - quadrature - syzygian - quadrature.

Nalika para teknisi dijelaskeun hakekat kakuatan pasang surut, aranjeunna langsung mikir yén aranjeunna kedah nyauran pulisi. Jeung rada logis. Tapi tétéla bodo bener. Dua minggu saméméhna, hiji penghancur moored teu jauh ti kantor. Unggal waktos pasang naek ka jangkungna nu tangtu, pos radar kapal urang réngsé nepi di tingkat lanté kamar server. Jeung radar (atawa alat-alat perang éléktronik, atawa sababaraha kaulinan militér séjén) dijieun rusuh dina komputer.

Misi hiber pikeun rokét

Kuring ditugaskeun porting a badag (kira-kira 400 sarébu garis) kontrol peluncuran rokét sarta sistem monitoring kana versi anyar tina sistem operasi, compiler jeung basa. Langkung tepatna, ti Solaris 2.5.1 ka Solaris 7, sareng tina Verdix Ada Development System (VADS), ditulis dina Ada 83, kana sistem Rational Apex Ada, ditulis dina Ada 95. VADS dibeuli ku Rational, sareng produkna nyaéta luntur, najan Rasional nyoba nerapkeun versi cocog tina bungkusan VADS-spésifik pikeun betah transisi ka kompiler Apex.

Tilu jalma mantuan kuring ngan meunang kode disusun bersih. Butuh waktu dua minggu. Lajeng abdi digawé sorangan sangkan sistem jalan. Pondokna, éta arsitéktur awon sarta palaksanaan sistem software nu Kuring kungsi encountered, jadi butuh dua bulan deui pikeun ngalengkepan port. Sistim ieu lajeng dikintunkeun pikeun nguji, nu nyandak sababaraha bulan deui. Kuring langsung ngabenerkeun bug anu dipendakan nalika uji, tapi jumlahna gancang turun (kode sumber mangrupikeun sistem produksi, ku kituna fungsionalitasna tiasa dipercaya, kuring ngan ukur kedah ngaleungitkeun bug anu timbul nalika adaptasi ka kompiler énggal). Antukna, nalika sagalana jalan sakumaha kuduna, kuring dipindahkeun ka proyék séjén.

Sareng dina dinten Jumaah sateuacan Thanksgiving, telepon disada.

Peluncuran rokét sakuduna diuji sakitar tilu minggu, sareng salami tés laboratorium undur mundur, sekuen paréntah diblokir. Dina kahirupan nyata, ieu bakal ngabatalkeun tés, sareng upami sumbatan lumangsung dina sababaraha detik saatos ngamimitian mesin, sababaraha tindakan anu teu tiasa dibalikeun bakal kajantenan dina sistem bantu, anu peryogi kesiapan rokét anu panjang sareng mahal. Ieu moal bakal dimimitian, tapi loba jalma bakal geus pisan kesel ngeunaan leungitna waktu jeung loba, loba duit. Entong ngantepkeun saha waé anu nyarios yén Departemen Pertahanan ngaluarkeun artos sacara gagabah — kuring henteu kantos tepang sareng manajer kontrak anu henteu nempatkeun anggaran heula atanapi kadua, dituturkeun ku jadwal.

Dina sasih saacanna, tangtangan mundur ieu parantos dijalankeun ratusan kali dina seueur variasi, sareng ngan ukur sababaraha gangguan. Janten kamungkinan kajadian ieu sakedik pisan, tapi akibatna penting pisan. Kalikeun duanana faktor ieu, tur anjeun bakal ngarti yén warta diprediksi minggu libur ruined keur kuring jeung puluhan insinyur sarta manajer.

Sareng perhatian dibayar ka kuring salaku jalma anu porting sistem.

Sapertos seueur sistem anu kritis-kaamanan, seueur parameter anu diasupkeun, janten cukup gampang pikeun ngaidentipikasi sababaraha baris kode anu dieksekusi sateuacan sistem nabrak. Sareng tangtosna, teu aya anu teu biasa ngeunaan aranjeunna; ekspresi anu sami parantos suksés dieksekusi sacara harfiah rébuan kali dina waktos anu sami.

Urang nyauran jalma ti Apex kana Rasional sabab aranjeunna anu ngembangkeun kompiler sareng sababaraha rutinitas anu dikembangkeun disebut dina kode anu curiga. Aranjeunna (jeung dulur sejenna) éta impressed yén aya anu peryogi pikeun meunangkeun kana akar masalah sacara harfiah pentingna nasional.

Kusabab aya nanaon metot dina jurnal, urang mutuskeun pikeun nyobaan pikeun baranahan masalah di laboratorium lokal. Ieu sanés tugas anu gampang sabab acara éta lumangsung kirang langkung sakali per 1000 jalan. Salah sahiji alesan anu disangka nyaéta yén telepon ka fungsi mutex anu dikembangkeun ku vendor (bagian tina pakét migrasi VADS) Unlock teu ngakibatkeun muka konci. Utas ngolah anu disebut fungsi ngolah pesen denyut jantung, anu nominalna dugi unggal detik. Kami ngangkat frékuénsi ka 10 Hz, nyaéta, 10 kali per detik, sareng ngamimitian ngajalankeun. Sakitar sajam ti harita sistemna dikonci sorangan. Dina log, urang ningali yén urutan pesen anu dirékam sami sareng nalika tés gagal. Urang dijieun sababaraha deui ngalir, Sistim ieu konsistén diblokir 45-90 menit sanggeus mimiti, sarta unggal waktos log ngandung jalur anu sarua. Sanaos kami téknisna ngajalankeun kode anu béda - frékuénsi pesen béda - paripolah sistemna sami, janten kami yakin yén skenario beban ieu nyababkeun masalah anu sami.

Ayeuna urang kedah terang dimana persisna blocking lumangsung dina sekuen ekspresi.

Palaksanaan sistem ieu nganggo sistem tugas Ada, sareng dianggo pisan kirang. Tugas mangrupikeun konstruksi tingkat luhur anu tiasa dieksekusi sakaligus dina Ada, sapertos utas palaksanaan, ngan ukur diwangun kana basana sorangan. Nalika dua pancén kedah komunikasi, aranjeunna "nyetél rendezvous a", tukeur data diperlukeun, lajeng ngeureunkeun rendezvous jeung balik ka executions bebas maranéhna. Sanajan kitu, sistem ieu dilaksanakeun béda. Saatos tugas udagan éta rendezvous, éta tugas target rendezvoused kalawan tugas sejen, nu lajeng rendezvoused kalawan tugas katilu, jeung saterusna nepi ka sababaraha processing réngsé. Sanggeus ieu, sadaya rendezvous ieu réngsé sarta unggal tugas kudu balik ka palaksanaan na. Nyaéta, kami nungkulan sistem panggero fungsi paling mahal di dunya, anu ngeureunkeun sakabéh prosés "multitasking" bari eta ngolah bagian tina data input. Sarta saméméh ieu teu ngakibatkeun masalah ngan kusabab throughput pisan low.

Kuring ngajelaskeun mékanisme tugas ieu kusabab nalika rendezvous dipénta atanapi diperkirakeun réngsé, tiasa janten "switch tugas". Hartina, prosésor bisa ngamimitian ngolah tugas séjén anu siap dieksekusi. Tétéla yén nalika hiji tugas geus siap rendezvous kalawan tugas sejen, tugas lengkep beda bisa dimimitian executing, sarta ahirna kontrol balik ka rendezvous munggaran. Sarta acara lianna bisa lumangsung anu ngabalukarkeun tugas pindah; salah sahiji acara sapertos nyaéta panggero kana fungsi sistem, kayaning nyitak atawa executing mutex a.

Pikeun ngartos garis kode anu nyababkeun masalah, kuring kedah milarian cara pikeun ngarékam kamajuan ngaliwatan sekuen pernyataan tanpa micu switch tugas, anu bakal nyegah kacilakaan. Janten kuring henteu tiasa nyandak kauntungan Put_Line()pikeun nyegah ngajalankeun I / O operasi. Abdi tiasa nyetél variabel counter atanapi anu sami, tapi kumaha kuring tiasa ningali nilaina upami kuring henteu tiasa nampilkeun dina layar?

Ogé, nalika mariksa log, tétéla yén, sanaos katirisan dina ngolah pesen denyut jantung, anu ngahalangan sadaya operasi I / O tina prosés sareng nyegah pamrosésan sanésna dilaksanakeun, tugas-tugas mandiri anu sanés terus dilaksanakeun. Nyaéta, pagawéan henteu diblokir sadayana, ngan ukur ranté tugas (kritis).

Ieu mangrupikeun petunjuk anu diperyogikeun pikeun ngévaluasi ekspresi blocking.

Kuring nyieun hiji pakét Ada nu ngandung tugas, hiji tipe enumerated, sarta variabel global tipe éta. Enumerable literals kabeungkeut kana éksprési husus tina runtuyan masalah (misalna. Incrementing_Buffer_Index, Locking_Mutex, Mutex_Unlocked), lajeng diselapkeun éksprési tugas kana eta nu ditugaskeun enumeration pakait kana variabel global. Kusabab kode obyék sadaya ieu ngan ukur disimpen dina mémori, ngalihkeun tugas salaku hasil tina palaksanaan éta henteu mungkin. Kami utamina curiga kana ekspresi anu tiasa ngalihkeun tugas, sabab blocking lumangsung dina palaksanaan tinimbang uih deui nalika ngalihkeun tugas deui (kusabab sababaraha alesan).

Tugas tracking ngan saukur dijalankeun dina loop sareng pariksa périodik pikeun ningali naha nilai variabel global parantos robih. Kalayan unggal parobihan, nilaina disimpen kana file. Lajeng antosan pondok tur cék anyar. Kuring nulis variabel kana file sabab tugas ieu dieksekusi ngan lamun sistem dipilih eta pikeun palaksanaan nalika pindah tugas di wewengkon masalah. Naon waé anu kajantenan dina tugas ieu moal mangaruhan tugas-tugas sanés anu teu aya hubunganana.

Ieu diperkirakeun yén nalika sistem ngahontal titik executing kode masalah, variabel global bakal ngareset nalika pindah ka unggal ekspresi salajengna. Lajeng hal bakal kajadian anu ngabalukarkeun tugas pindah, sarta saprak frékuénsi palaksanaan na (10 Hz) leuwih handap tina tugas ngawaskeun, monitor bisa nangkep nilai variabel global jeung nulis eta. Dina kaayaan normal, kuring bisa meunangkeun runtuyan repeating sawaréh enumerations: nilai panungtungan variabel dina waktu switch tugas. Nalika ngagantung, variabel global henteu kedah robih deui, sareng nilai terakhir anu ditulis bakal nunjukkeun ekspresi anu henteu lengkep.

Kuring lumpat kode kalawan tracking. Anjeunna beku. Jeung ngawaskeun digawé kawas clockwork.

Log ngandung runtuyan ekspektasi, nu interrupted ku nilai nunjukkeun yén mutex geus disebut. Unlock, sareng tugasna henteu réngsé - sapertos kasus rébuan telepon sateuacana.

Insinyur Apex nuju nganalisa kode na dina waktos ayeuna sareng mendakan tempat di mutex dimana, sacara téoritis, konci tiasa kajantenan. Tapi probabiliti na pisan low, sabab ngan runtuyan tangtu kajadian dina waktu nu tangtu bisa ngakibatkeun blocking. Hukum Murphy, guys, éta Hukum Murphy.

Pikeun nangtayungan sapotong kode kuring diperlukeun, Kuring ngaganti fungsi mutex nelepon (diwangun dina luhureun fungsionalitas OS mutex) ku pakét Ada mutex pituin leutik pikeun kontrol aksés mutex kana sapotong éta.

Kuring diselapkeun kana kode jeung ngajalankeun test. Tujuh jam ti harita kodeu masih jalan.

Kode kuring dikintunkeun ka Rasional, dimana aranjeunna disusun, dibongkar, sareng pariksa yén éta henteu nganggo pendekatan anu sami anu dianggo dina fungsi mutex masalah.

Ieu teh review kode paling rame tina karir mah 🙂 Aya ngeunaan sapuluh insinyur sarta manajer di kamar sareng abdi, sapuluh jalma séjén éta dina telepon konferensi - sarta aranjeunna sadayana nalungtik ngeunaan 20 garis kode.

Kodeu diulas, file laksana anyar dirakit sareng dikintunkeun pikeun uji régrési formal. Sababaraha minggu ti harita, tés undur mundur suksés sareng rokét angkat.

Oke, éta sadayana saé sareng saé, tapi naon gunana carita?

Ieu masalah kacida disgusting. Ratusan rébu garis kode, palaksanaan paralel, leuwih belasan prosés interacting, arsitéktur goréng jeung palaksanaan goréng, interfaces pikeun sistem embedded jeung jutaan dollar spent. Taya tekanan, katuhu.

Abdi sanés ngan ukur damel dina masalah ieu, sanaos kuring janten sorotan nalika kuring ngalakukeun porting. Tapi sanaos kuring ngalakukeun éta, éta sanés hartosna kuring ngartos kana ratusan rébu garis kode, atanapi malah ngémutan aranjeunna. Kode sareng log dianalisis ku insinyur di sakumna nagara, tapi nalika aranjeunna nyarioskeun ka kuring hipotesis ngeunaan panyabab gagalna, kuring ngan ukur nyandak satengah menit pikeun ngabantah aranjeunna. Sareng nalika kuring dipenta pikeun nganalisis téori, kuring bakal ngaliwat ka batur, sabab écés pikeun kuring yén insinyur ieu jalan anu salah. Sora presumptuous? Leres, ieu leres, tapi kuring nampik hipotesis sareng paménta pikeun alesan anu sanés.

Kuring ngarti alam masalah. Kuring henteu terang persis dimana éta kajantenan atanapi kunaon, tapi kuring terang naon anu kajantenan.

Salila sababaraha taun, kuring parantos ngumpulkeun seueur pangaweruh sareng pangalaman. Kuring salah sahiji panaratas ngagunakeun Ada tur ngartos kaunggulan jeung kalemahan na. Kuring terang kumaha perpustakaan runtime Ada nanganan tugas sareng ngurus palaksanaan paralel. Na kuring ngartos programming-tingkat low dina tingkat memori, registers na assembler. Dina basa sejen, kuring boga pangaweruh jero dina widang kuring. Sareng kuring nganggo aranjeunna pikeun milarian anu nyababkeun masalah. Kuring henteu ngan ukur damel di sekitar bug, kuring ngartos kumaha mendakanana dina lingkungan runtime anu sensitip pisan.

Carita perjuangan sareng kode sapertos kitu henteu pikaresepeun pisan pikeun jalma anu teu wawuh sareng fitur sareng kaayaan perjuangan sapertos kitu. Tapi carita-carita ieu ngabantosan urang ngartos naon anu diperyogikeun pikeun ngarengsekeun masalah anu sesah.

Pikeun ngajawab masalah bener teuas, Anjeun kudu jadi leuwih ti saukur programmer a. Anjeun kedah ngartos "nasib" kodeu, kumaha interaksina sareng lingkunganana, sareng kumaha lingkunganana nyalira.

Lajeng anjeun bakal boga sorangan ruined libur minggu.

Terus dituluykeun.

sumber: www.habr.com

Tambahkeun komentar