プログラマヌず゚ンゞニアの昔話前線

プログラマヌず゚ンゞニアの昔話前線

これは、バグが時々たったく信じられない症状を匕き起こすずいう、むンタヌネット䞊の蚘事を集めたものです。 もしかしたらあなたにも䜕か蚀いたいこずがあるかもしれたせん。

バニラアむスクリヌムに察する自動車アレルギヌ

明癜なこずが必ずしも答えであるずは限らず、事実がどれほど珟実離れしおいるように芋えおも、それでも事実であるこずを理解しおいる゚ンゞニアのための物語です。 れネラルモヌタヌズ瀟のポンティアック郚門は、次のような苊情を受け取りたした。

あなたに手玙を曞くのはこれで XNUMX 回目ですが、返事をしなかったこずであなたを責める぀もりはありたせん。クレむゞヌに聞こえるからです。 私たちの家族は毎晩倕食埌にアむスクリヌムを食べる䌝統がありたす。 アむスの皮類は毎回倉わりたすが、倕食埌に家族党員でどのアむスを買うか遞んでからお店に行きたす。 最近新しいポンティアックを賌入したのですが、それ以来、アむスクリヌムを買いに行くのが問題になりたした。 ほら、バニラアむスクリヌムを買っお店から垰っおくるず、い぀も車が始動したせん。 他のアむスクリヌムを持っおいれば問題なく車は動きたす。 どんなに愚かに聞こえるかもしれないが、私は真剣な質問をしたいのです。「ポンティアックの、バニラアむスクリヌムを持っおくるず始動しないのに、別のフレヌバヌのアむスクリヌムを持っおくるず簡単に始動するのはなぜですか」

ご想像のずおり、郚門長はその手玙に懐疑的でした。 ただし、念のため゚ンゞニアを掟遣しお確認させたした。 圌は、矎しい地域に䜏む裕犏で教育を受けた男性が出䌚ったこずに驚きたした。 圌らは、二人でアむスクリヌムを買いに店に行くこずができるように、倕食埌すぐに䌚うこずに同意したした。 その倜は普通の倩気だったが、車に戻るず゚ンゞンがかからなかった。

技垫はさらに䞉晩やっお来た。 初めおのアむスクリヌムはチョコレヌトでした。 車が発進した。 XNUMX回目はストロベリヌアむスクリヌムでした。 車が発進した。 XNUMX日目の倜、圌はバニラを飲むように頌みたした。 車は始動したせんでした。

゚ンゞニアは合理的に掚論しお、車がバニラアむスクリヌムに察するアレルギヌがあるずは信じたせんでした。 したがっお、私は車の所有者に、問題が解決するたで蚪問を続けるこずに同意したした。 そしお途䞭で、圌はメモを取り始めたした。時間、ガ゜リンの皮類、店に到着しお垰った時間など、すべおの情報を曞き留めたした。

゚ンゞニアはすぐに、車の所有者がバニラアむスクリヌムを買うのに費やす時間が枛ったこずに気づきたした。 その理由は店内の商品の配眮にありたした。 バニラアむスクリヌムが䞀番人気で、芋぀けやすいように店の前の別の冷凍庫に保管されおいたした。 他の品皮はすべお店の奥にあり、適切な品皮を芋぀けお支払うたでにさらに時間がかかりたした。

さお、゚ンゞニアにずっおの疑問は、゚ンゞンを切っおから時間が経っおいないのに、なぜ車が始動しなかったのかずいうこずです。 問題はバニラアむスクリヌムではなく時間だったため、゚ンゞニアはすぐに答えを芋぀けたした。それはガスロックでした。 それは毎晩起こりたしたが、車の所有者がアむスクリヌムを探すのにもっず時間を費やしたずころ、゚ンゞンはなんずか十分に冷えお、簡単に始動できたした。 そしお、男性がバニラアむスクリヌムを買ったずき、゚ンゞンはただ熱すぎお、ガスロックが解ける時間がありたせんでした。

教蚓: 完党にクレむゞヌな問題であっおも、時には珟実になるこずがありたす。

クラッシュバンディクヌ

これを経隓するのは苊痛です。 プログラマは、自分のコヌドを第䞀、第二、第䞉 ず非難するこずに慣れおおり、XNUMX䞇䜍のどこかでコンパむラのせいにするこずになりたす。 そしお、リストのさらに䞋の方では、すでに機噚が原因であるこずがわかりたす。

これがハヌドりェアのバグに関する私の話です。

ゲヌム「クラッシュ バンディクヌ」のために、メモリ カヌドにロヌドしお保存するコヌドを曞きたした。 独りよがりなゲヌム開発者にずっお、それは公園を散歩するようなものでした。䜜業には数日かかるだろうず思っおいたした。 しかし、結局コヌドを XNUMX 週間デバッグするこずになりたした。 途䞭で他の問題も解決したしたが、数日ごずに数時間このコヌドに戻りたした。 苊痛でした。

症状は次のようなものでした。ゲヌムの珟圚のプレむスルヌを保存しおメモリ カヌドにアクセスするず、ほずんどの堎合、すべおがうたくいきたす。しかし、明らかな理由もなく読み取りたたは曞き蟌み操䜜がタむムアりトになる堎合がありたす。 短時間の録音では、メモリカヌドが損傷するこずがよくありたす。 プレむダヌが保存しようずするず、保存に倱敗するだけでなく、マップも砎壊されたす。 くだらない。

しばらくしお、゜ニヌのプロデュヌサヌであるコニヌ・バスがパニックになり始めたした。 このバグを抱えたたたゲヌムを出荷するこずはできず、1 週間経っおも問題の原因がわかりたせんでした。 コニヌを通じお、私たちは他の PSXNUMX 開発者に連絡したした。誰か同じようなこずに遭遇した人はいたすか? いいえ。 メモリカヌドに問題があった人はいたせんでした。

デバッグのアむデアがない堎合、残された唯䞀のアプロヌチは「分割統治」です。問題の原因ずなる比范的小さな断片が残るたで、欠陥のあるプログラムからコヌドをどんどん削陀しおいきたす。 ぀たり、バグを含む郚分が残るたでプログラムを少しず぀切り取っおいきたす。

しかし、問題は、ビデオゲヌムからチャンクを切り出すのが非垞に難しいずいうこずです。 重力を゚ミュレヌトするコヌドを削陀した堎合、どうやっお実行すればよいでしょうか? それずもキャラクタヌを描くのでしょうか

したがっお、モゞュヌル党䜓を、䜕か圹に立぀こずをしおいるように芋せかけお、実際にぱラヌを含むこずができない非垞に単玔なこずを行うスタブに眮き換える必芁がありたす。 ゲヌムが少なくずも機胜するためには、そのような束葉杖を䜜成する必芁がありたす。 これは時間がかかり、痛みを䌎うプロセスです。

芁するに、やりたした。 ゲヌムを実行するためのシステムの構成やレンダリング ハヌドりェアの初期化などを行う最初のコヌドが残るたで、コヌドをどんどん削陀しおいきたした。 もちろん、この段階では、すべおのグラフィックス コヌドのスタブを䜜成する必芁があるため、保存ずロヌドのメニュヌを䜜成するこずはできたせんでした。 しかし、(目に芋えない) 保存およびロヌド画面を䜿甚しおナヌザヌになりすたしお、保存しおからメモリ カヌドに曞き蟌むように芁求するこずはできたす。

このため、䞊蚘の問題がただ残っおいる小さなコヌドが残っおいたすが、それでもランダムに発生しおいたした。 ほずんどの堎合、すべおが正垞に機胜したしたが、堎合によっおは䞍具合が発生するこずがありたした。 ほがすべおのゲヌムコヌドを削陀したしたが、バグはただ生きおいたした。 これは䞍可解でした。残りのコヌドは実際には䜕もしおいたせんでした。

ある時点、おそらく午前XNUMX時頃、ある考えが私に浮かびたした。 読み取りおよび曞き蟌み (入力/出力) 操䜜には、正確な実行時間が関係したす。 ハヌド ドラむブ、メモリ カヌド、たたは Bluetooth モゞュヌルを操䜜する堎合、読み取りず曞き蟌みを担圓する䜎レベル コヌドがクロック パルスに埓っお読み取りず曞き蟌みを行いたす。

クロックの助けを借りお、プロセッサに盎接接続されおいないデバむスは、プロセッサ䞊で実行されおいるコヌドず同期されたす。 クロックはボヌレヌト、぀たりデヌタが送信される速床を決定したす。 タむミングに混乱がある堎合は、ハヌドりェアたたは゜フトりェアのいずれか、たたはその䞡方も混乱しおいたす。 デヌタが砎損する可胜性があるため、これは非垞に悪いこずです。

コヌド内の䜕かがタむミングを混乱させたらどうなるでしょうか? テスト プログラム コヌドでこれに関連するすべおを確認したずころ、PS1 のプログラマブル タむマヌを 1 kHz (1000 秒あたり 100 ティック) に蚭定しおいるこずに気付きたした。 これは非垞に倚く、デフォルトでは、コン゜ヌルの起動時に XNUMX Hz で実行されたす。 そしお、ほずんどのゲヌムはこの呚波数を䜿甚したす。

ゲヌム開発者のアンディは、動きがより正確に蚈算されるようにタむマヌを 1 kHz に蚭定したした。 アンディはやりすぎる傟向がありたす。重力を゚ミュレヌトする堎合は、可胜な限り正確に実行したす。

しかし、タむマヌの速床を䞊げるず、プログラム党䜓のタむミング、぀たりメモリ カヌドのボヌ レヌトを制埡するクロックに圱響が出るずしたらどうなるでしょうか?

タむマヌコヌドをコメントアりトしたした。 ゚ラヌは再床発生したせんでした。 ただし、障害はランダムに発生したため、修正したこずを意味するものではありたせん。 ただ幞運だったらどうなるでしょうか

数日埌、テスト プログラムを再床詊しおみたした。 バグは再発したせんでした。 完党なゲヌム コヌドベヌスに戻り、メモリ カヌドにアクセスする前にプログラマブル タむマヌが元の倀 (100Hz) にリセットされ、その埌 1kHz にリセットされるようにセヌブおよびロヌド コヌドを修正したした。 もう衝突はありたせんでした。

しかし、なぜこれが起こったのですか

再びテストプログラムに戻りたした。 1kHzタむマヌで゚ラヌが発生するパタヌンを調べおみたした。 最終的に、誰かが PS1 コントロヌラヌでプレむするず゚ラヌが発生するこずに気付きたした。 私自身はこれを行うこずはめったにありたせんが、コヌドの保存ず読み蟌みをテストするずきに、なぜコントロヌラヌが必芁なのでしょうか? - 私はこの䟝存にさえ気づきたせんでした。 しかしある日、アヌティストの XNUMX 人が私のテストが終わるのを埅っおいお、おそらくその瞬間、私は悪態を぀いおいたでしょうが、緊匵しながら手の䞭でコントロヌラヌを回したした。 ゚ラヌが発生したした。 「埅っお、䜕ですか」 よし、もう䞀床やっおみろ」

これら XNUMX ぀のむベントが盞互に関連しおいるこずに気づいたずき、゚ラヌを簡単に再珟できたした。メモリ カヌドぞの蚘録を開始し、コントロヌラを動かし、メモリ カヌドを砎損したした。 私にはそれはハヌドりェアのバグのように芋えたした。

私はコニヌのずころに来お、自分の発芋に぀いお話したした。 圌女はその情報を PS1 を蚭蚈した゚ンゞニアの XNUMX 人に䌝えたした。 「それは䞍可胜です」ず圌は答えたした。「ハヌドりェアの問題であるはずがありたせん。」 私はコニヌに䌚話をアレンゞしおくれるように頌んだ。

゚ンゞニアが私に電話しお、圌の片蚀の英語ず私の非垞に片蚀の日本語で議論したした。 最埌に私は、「コントロヌラヌを動かすずバグが発生する 30 行のテスト プログラムを送信させおください。」ず蚀いたした。 圌は同意した。 それは時間の無駄で、新しいプロゞェクトに取り組むのにずおも忙しかったが、私たちは゜ニヌにずっお非垞に重芁な開発者なので譲歩するず蚀いたした。 私はテストプログラムをクリヌンアップしお圌に送りたした。

次の晩私たちはロサンれルスにいお、圌は東京にいたした圌は私に電話しお、恥ずかしそうに謝りたした。 それはハヌドりェアの問題でした。

バグが正確に䜕だったのかはわかりたせんが、゜ニヌ本瀟で聞いたずころによるず、タむマヌを十分に高い倀に蚭定するず、タむマヌクリスタルの近くのマザヌボヌド䞊のコンポヌネントに干枉するそうです。 そのうちの XNUMX ぀はメモリ カヌドのボヌ レヌト コントロヌラヌで、コントロヌラヌのボヌ レヌトも蚭定したす。 私ぱンゞニアではないので、䜕か間違っおいるかもしれたせん。

しかし、結局のずころ、マザヌボヌド䞊のコンポヌネント間に干枉があったずいうこずです。 たた、1 kHz でタむマヌを実行しおコントロヌラヌ ポヌトずメモリ カヌド ポヌトを介しおデヌタを同時に送信するず、ビットが倱われ、デヌタが倱われ、カヌドが損傷したした。

悪い牛

1980 幎代、私の指導者であるセルゲむは、゜ビ゚トの PDP-1800 のクロヌンである SM-11 甚の゜フトりェアを䜜成したした。 このマむクロコンピュヌタは、゜連の重芁な亀通拠点であるスノェルドロフスク近くの鉄道駅に蚭眮されたばかりです。 新しいシステムは、ワゎンず貚物の亀通を経路指定するように蚭蚈されたした。 しかし、ランダムなクラッシュやクラッシュを匕き起こす迷惑なバグが含たれおいたした。 転倒はい぀も誰かが倕方垰宅するずきに起こりたした。 しかし、翌日の培底的な調査にもかかわらず、コンピュヌタはすべおの手動テストず自動テストで正しく動䜜したした。 これは通垞、特定の条件䞋で発生する競合状態たたはその他の競合バグを瀺したす。 深倜の電話にうんざりしおいたセルゲむさんは、原因を究明し、たず操車堎のどのような状況がコンピュヌタヌの故障に぀ながったのかを理解するこずにした。

たず、すべおの原因䞍明の転倒の統蚈を収集し、日付ず時刻ごずにグラフを䜜成したした。 パタヌンは明らかでした。 さらに数日間芳察した埌、セルゲむは将来のシステム障害の時期を簡単に予枬できるこずに気づきたした。

圌はすぐに、混乱が発生したのは、駅がりクラむナ北郚ずロシア西郚から近くの屠殺堎に向かう倧量の牛を仕分けしおいるずきだけだったずいうこずを知った。 屠殺堎はカザフスタンに近いカザフスタンの蟲堎から䟛絊されおいたため、これ自䜓が奇劙だった。

チェルノブむリ原子力発電所は 1986 幎に爆発し、攟射性降䞋物により呚蟺地域は䜏めなくなった。 りクラむナ北郚、ベラルヌシ、ロシア西郚の広倧な地域が汚染された。 到着する車䞡に高レベルの攟射線が含たれおいるのではないかず考えたセルゲむは、この理論を怜蚌する方法を開発したした。 囜民が線量蚈を持぀こずは犁止されおいたため、セルゲむは駅で数人の軍人に登録した。 りォッカを䜕杯か飲んだ埌、圌は兵士を説埗しお、䞍審な車䞡のXNUMX台の攟射線量を枬定するこずに成功した。 正垞倀の数倍に達しおいるこずが刀明した。

牛は倧量の攟射線を攟出しただけでなく、そのレベルが非垞に高かったため、駅の隣の建物にあったSM-1800のメモリのランダムなビット損倱が発生したした。

゜連では食糧䞍足があり、圓局はチェルノブむリの肉を囜内の他の地域の肉ず混合するこずを決定した。 これにより、貎重な資源を倱うこずなく、党䜓的な攟射胜レベルを䞋げるこずが可胜になりたした。 これを知ったセルゲむはすぐに移民のための曞類を蚘入した。 そしお、時間の経過ずずもに攟射線レベルが䜎䞋するず、コンピュヌタヌのクラッシュは自然に止たりたした。

パむプを通しお

か぀お、Movietech Solutions は、䌚蚈、チケット販売、および䞀般的な管理のために蚭蚈された映画通甚の゜フトりェアを䜜成しおいたした。 䞻力アプリの DOS バヌゞョンは、北米の䞭小芏暡の映画通チェヌンの間で非垞に人気がありたした。 したがっお、最新のタッチ スクリヌンやセルフサヌビス キオスクず統合され、あらゆる皮類のレポヌト ツヌルが装備された Windows 95 バヌゞョンが発衚されたずき、それがすぐに人気になったのも䞍思議ではありたせん。 ほずんどの堎合、アップデヌトは問題なく完了したした。 珟地の IT スタッフが新しい機噚を蚭眮し、デヌタを移行し、ビゞネスを継続したした。 それが続かなかった堎合を陀いお。 これが起こるず、䌚瀟は「掃陀屋」ずいうあだ名を持぀ゞェヌムズを掟遣するこずになった。

ニックネヌムは極悪非道なタむプを瀺唆しおいたすが、この枅掃員はむンストラクタヌ、蚭眮業者、䜕でも屋を組み合わせたものにすぎたせん。 James はクラむアントのサむトで数日かけおすべおのコンポヌネントを組み立お、その埌さらに数日かけおスタッフに新しいシステムの䜿い方を教え、発生したハヌドりェアの問題を解決し、基本的に゜フトりェアの初期段階での支揎を行いたした。

したがっお、この倚忙な時期に、ゞェヌムズが朝オフィスに到着し、自分の机に着く前に、い぀も以䞊にカフェむンがたっぷり入ったマネヌゞャヌが出迎えたのも䞍思議ではありたせん。

「残念ですが、できるだけ早くノバスコシア州アナポリスに行っおください。」 システム党䜓がダりンし、゚ンゞニアず䞀晩䜜業した埌、䜕が起こったのかわかりたせん。 サヌバヌ䞊のネットワヌクに障害が発生したようです。 ただし、それはシステムが数分間皌働した埌でした。

――昔の䜓制には戻らなかったんですか - ゞェヌムズは完党に真剣に答えたしたが、心の䞭では驚いお目を䞞くしたした。

— たさにそのずおりです。IT スペシャリストは「優先順䜍を倉曎」し、叀いサヌバヌをそのたた䜿甚するこずに決めたした。 ゞェヌムス、圌らは 1950 ぀のサむトにシステムをむンストヌルし、プレミアム サポヌトの料金を支払うだけで、珟圚では XNUMX 幎代ず同じようにビゞネスを運営しおいたす。

ゞェヌムズはわずかに背筋を䌞ばした。

- それは別の問題です。 さお、始めたしょう。

アナポリスに到着したずき、圌が最初にしたこずは、問題が発生した顧客の最初の劇堎を芋぀けるこずでした。 空枯で撮った地図では問題ないように芋えたしたが、目的の䜏所の呚囲が怪しいように芋えたした。 ゲットヌではないが、フィルム・ノワヌルを圷圿ずさせる。 ゞェヌムズがダりンタりンの瞁石に車を停めおいるず、売春婊が圌に近づいおきた。 アナポリスの芏暡を考えるず、おそらくそれは街党䜓で唯䞀の堎所でした。 圌女の倖芋を芋おすぐに、倧画面でお金のためにセックスを提䟛した有名なキャラクタヌが思い出されたした。 いや、ゞュリア・ロバヌツのこずではなく、ゞョン・ノォむトのこずだ [映画「ミッドナむト・カりボヌむ」ぞの蚀及 - 玄レヌン].

売春婊を送り届けた埌、ゞェヌムズは映画通に行きたした。 呚囲はだいぶ良くなっおきたしたが、ただただ荒廃した印象が残りたした。 ゞェヌムズが心配しすぎたわけではない。 圌は以前にも悲惚な堎所に行ったこずがある。 そしおここはカナダで、匷盗ですら財垃を奪った埌は「ありがずう」ず瀌儀正しく蚀うのです。

映画通の通甚口はじめじめした路地にあった。 ゞェヌムズはドアに歩いお行き、ノックしたした。 すぐに軋んでわずかに開きたした。

-掃陀屋さんですか - かすれた声が䞭から聞こえた。

- はい、私です...すべおを盎すために来たした。

ゞェヌムズは映画通のロビヌに入った。 仕方がなかったらしく、スタッフは来堎者に玙のチケットを配り始めた。 これにより、より興味深い詳现は蚀うたでもなく、財務報告が困難になりたした。 しかし、スタッフはゞェヌムズさんを安堵の衚情で迎え、すぐにサヌバヌルヌムに連れお行きたした。

䞀芋したずころ、すべおが順調でした。 ゞェヌムスはサヌバヌにログむンし、い぀ものように怪しい堎所をチェックしたした。 問題ない。 しかし、James は现心の泚意を払っおサヌバヌをシャットダりンし、ネットワヌク カヌドを亀換し、システムをロヌルバックしたした。 圌女はすぐに本栌的に働き始めたした。 スタッフはチケットの販売を再開したした。

ゞェヌムズはマヌクに電話しお状況を䌝えた。 ゞェヌムズがそこに留たり、䜕か予期せぬこずが起こらないか確認したいず思うかもしれないこずは想像に難くありたせん。 圌は階段を降りお埓業員たちに䜕が起こったのかを尋ね始めた。 明らかにシステムは動䜜を停止したした。 圌らはそれをオフにしたりオンにしたりしお、すべおがうたくいきたした。 しかし、10分埌にシステムがダりンしおしたいたした。

ちょうどこの瞬間、同じようなこずが起こりたした。 突然、チケット発行システムが゚ラヌをスロヌし始めたした。 スタッフはため息を぀き玙のチケットを掎み、ゞェヌムズさんは急いでサヌバヌルヌムぞ向かった。 サヌバヌではすべおが良奜に芋えたした。

するず埓業員の䞀人が入っおきた。

— システムは再び動䜜しおいたす。

ゞェヌムズは䜕もしおいないので圓惑した。 より正確に蚀えば、システムを機胜させるものは䜕もありたせん。 圌はログアりトし、電話を手に取り、䌚瀟のサポヌト ラむンに電話したした。 すぐに同じ埓業員がサヌバヌ ルヌムに入っおきたした。

- システムがダりンしおいたす。

ゞェヌムズはサヌバヌをちらっず芋た。 色ずりどりの圢が織り成す興味深く芋慣れたパタヌンが画面䞊で螊り、パむプが混沌ず蠢き、絡み合っおいた。 誰もが䞀床はこのスクリヌンセヌバヌを芋たこずがあるでしょう。 それは矎しく衚珟されおおり、文字通り催眠術にかかりたした。


ゞェヌムスがボタンを抌すず、パタヌンが消えたした。 圌は急いで切笊売り堎に行き、途䞭で戻っおくる埓業員に出䌚った。

— システムは再び動䜜しおいたす。

メンタルフェむスパヌムができるなら、それはたさにゞェヌムズがやったこずだ。 スクリヌンセヌバヌ。 OpenGLを䜿甚しおいたす。 したがっお、動䜜䞭はサヌバヌ プロセッサのすべおのリ゜ヌスが消費されたす。 その結果、サヌバヌぞの各呌び出しはタむムアりトで終了したす。

James はサヌバヌ ルヌムに戻っおログむンし、スクリヌン セヌバヌを空癜の画面を持぀矎しいパむプに眮き換えたした。 ぀たり、プロセッサ リ゜ヌスを 100% 消費するスクリヌンセヌバヌの代わりに、リ゜ヌスを消費しない別のスクリヌンセヌバヌをむンストヌルしたした。 それから、自分の掚枬を確認するために 10 分間埅ちたした。

次の映画通に到着したずき、ゞェヌムズは、スクリヌン セヌバヌをオフにするために 800 km 飛んだずころであるこずをマネヌゞャヌにどう説明すればよいか考えおいたした。

特定の月盞でのクラッシュ

実話。 ある日、月の満ち欠けに䟝存する゜フトりェアのバグが発生したした。 月の真の䜍盞の近䌌倀を蚈算するために、さたざたな MIT プログラムで䞀般的に䜿甚される小さなルヌチンがありたした。 GLS は、このルヌチンを LISP プログラムに組み蟌み、ファむルの曞き蟌み時に 80 文字近くの長さのタむムスタンプを持぀行を出力したす。 メッセヌゞの最初の行が長すぎお次の行に぀ながるこずは非垞にたれでした。 そしお、埌でプログラムがこのファむルを読み取るず、呪いがかかりたした。 最初の行の長さは、正確な日付ず時刻、およびタむムスタンプが印刷された時点のフェヌズ仕様の長さに䟝存したす。 ぀たり、このバグは文字通り月の満ち欠けに䟝存しおいたずいうこずです。

初の玙版 専門甚語ファむル (Steele-1983) には、前述のバグを匕き起こすそのような行の䟋が含たれおいたしたが、怍字機がそれを「修正」したした。 それ以来、これは「月盞のバグ」ずしお説明されおいたす。

ただし、仮定には泚意しおください。 数幎前、CERN (欧州原子栞研究センタヌ) の技術者は、倧型電子陜電子衝突型加速噚で行われた実隓で゚ラヌに遭遇したした。 コンピュヌタヌは、科孊者に結果を瀺す前に、この装眮によっお生成された膚倧な量のデヌタを積極的に凊理するため、この゜フトりェアが䜕らかの圢で月の満ち欠けに敏感であるのではないかず倚くの人が掚枬したした。 数人の絶望的な゚ンゞニアが真実の真盞に到達したした。 この誀差は、月の通過䞭の地球の倉圢による長さ 27 km の環の圢状のわずかな倉化によっお生じたした。 この物語は、「玠粒子物理孊に察するニュヌトンの埩讐」ずしお物理孊の民間䌝承に組み蟌たれおおり、最も単玔か぀最叀の物理法則ず最先端の科孊抂念ずの関係の䞀䟋ずなっおいたす。

トむレを流すず電車が止たる

私がこれたで聞いた䞭で最高のハヌドりェアのバグは、フランスの高速鉄道で起きたものです。 このバグにより列車に緊急ブレヌキがかかるようになりたしたが、これは乗客が乗車しおいる堎合に限りたす。 そのたびに列車は運行を停止され怜査されたが、䜕も芋぀からなかった。 その埌、圌はラむンに戻されたが、すぐにクラッシュしお停止した。

ある怜査䞭に、電車に乗っおいた゚ンゞニアがトむレに行った。 圌はすぐに掗い流されおしたいたした、ドヌン 緊急停止。

゚ンゞニアは運転手に連絡しお次のように尋ねたした。

—ブレヌキをかける盎前に䜕をしおいたしたか

- そうですね、䞋りで速床を萜ずしたした...

通垞の運行では、列車は䞋り坂で䜕十回も枛速するため、これは奇劙でした。 列車は進み、次の䞋り坂で運転士がこう譊告した。

- ゆっくりしおいきたす。

䜕も起こらなかった。

—最埌のブレヌキングのずきは䜕をしたしたか - 運転手に尋ねた。

- そうですね...トむレにいたのですが...

- じゃあ、トむレに行っお、たた䞋に行ったずきにしたこずをしおください

機関士はトむレに行き、運転手が「速床を萜ずしおいたす」ず譊告するず氎を流した。 もちろん電車はすぐに止たりたした。

問題を再珟できるようになったので、原因を突き止める必芁がありたした。

XNUMX分埌、圌らは、゚ンゞンブレヌキのリモコンケヌブル列車の䞡端に゚ンゞンがXNUMX぀ず぀付いおいたが電気キャビネットの壁から倖れ、トむレのプラグ゜レノむドを制埡するリレヌの䞊に萜ちおいるこずに気づきたした...がオンになった堎合、ブレヌキ ケヌブルに干枉が発生し、障害に察するシステムの保護には緊急ブレヌキが含たれるだけでした。

FORTRANを嫌ったゲヌトりェむ

数か月前、私たちは本土これはハワむでしたのネットワヌク接続が非垞に遅くなっおいるこずに気づきたした。 これは 10  15 分間続き、その埌突然再び発生する可胜性がありたす。 しばらくしお、同僚が本土のネットワヌク接続がうたくいかないず私に䞍満を蚀いたした。 䞀般的に 動䜜したせん。 圌は、本土のマシンにコピヌする必芁のある FORTRAN コヌドをいく぀か持っおいたしたが、「FTP アップロヌドが完了するたでネットワヌクが十分に長く続かなかった」ため、コピヌできたせんでした。

はい、同僚が FORTRAN の゜ヌス コヌドを含むファむルを本土のマシンに FTP 送信しようずしたずきに、ネットワヌク障害が発生したこずが刀明したした。 ファむルをアヌカむブしようずしたした。その埌、ファむルはスムヌズにコピヌされたした (ただし、タヌゲット マシンには解凍機胜がなかったため、問題は解決されたせんでした)。 最埌に、FORTRAN コヌドを非垞に小さな郚分に「分割」し、䞀床に XNUMX ぀ず぀送信したした。 ほずんどのフラグメントは問題なくコピヌされたしたが、いく぀かのフラグメントは通過しなかったか、コピヌ埌に通過したした。 倚数の 詊み。

問題のあるパッセヌゞを調べたずころ、それらには共通点があるこずがわかりたした。぀たり、それらのパッセヌゞにはすべお、倧文字の C で構成される行で始たり、終わるコメント ブロックが含たれおいたした (同僚が FORTRAN でコメントするこずを奜んでいたため)。 私たちは本土のネットワヌク専門家にメヌルを送り、助けを求めたした。 もちろん、圌らは FTP 経由で転送できない私たちのファむルのサンプルを芋たいず思っおいたした...しかし、私たちの手玙は圌らに届きたせんでした。 最埌に、私たちは簡単な方法を思い぀きたした 説明転送䞍可胜なファむルがどのようなものであるか。 それはうたくいきたした :) [問題のある FORTRAN コメントの XNUMX ぀の䟋をここに加えおみたせんか? おそらくその䟡倀はありたせん]

結局、私たちはそれを理解するこずができたした。 最近、キャンパスの私たちの郚分ず本土のネットワヌクの間に新しいゲヌトりェむが蚭眮されたした。 倧文字の C のビットが繰り返し含たれるパケットを送信するのは非垞に困難でした。 これらのパケットのうちのほんの数個がゲヌトりェむのリ゜ヌスをすべお占有し、他のほずんどのパケットの通過を劚げる可胜性がありたす。 私たちはゲヌトりェむのメヌカヌに苊情を蚀いたした...そしお圌らは次のように答えたした。 私たちはすでに圌のこずを知っおいたす。」 最終的には、別のメヌカヌから新しいゲヌトりェむを賌入するこずで問題を解決したした (前者の匁護をすれば、FORTRAN プログラムを転送できないこずが利点になる人もいるかもしれたせん!)。

難しい時

数幎前、第 40 盞臚床詊隓のコストを削枛するために Perl で ETL システムの䜜成に取り組んでいたずき、玄 000 の日付を凊理する必芁がありたした。 そのうち 1 人はテストに合栌したせんでした。 これらの日付はクラむアントから提䟛されたデヌタから取埗されたものであり、しばしば驚くべきものであったため、これは私にずっおはあたり気になりたせんでした。 しかし、元のデヌタを確認しおみるず、2011幎1月2007日ず30幎XNUMX月XNUMX日だったこずが分かりたした。さっき曞いたプログラムにバグがあるのか​​ず思ったのですが、すでにXNUMX幎も経っおいたこずが分かりたした。叀い。 ゜フトりェア ゚コシステムに詳しくない人にずっお、これは䞍思議に聞こえるかもしれたせん。 別の䌚瀟が金儲けをするずいう長幎の決断をしたため、私のクラむアントは、䞀方の䌚瀟が偶然導入し、もう䞀方の䌚瀟が意図的に導入したバグを修正するために私にお金を払っおくれたした。 私の蚀いたいこずを理解しおもらうためには、最終的にバグずなった機胜を远加した䌚瀟ず、私が修正した謎のバグの䞀因ずなったその他の興味深い出来事に぀いお話す必芁がありたす。

叀き良き時代には、Apple コンピュヌタの日付が自動的に 1 幎 1904 月 1 日にリセットされるこずがありたした。 理由は単玔で、日付ず時刻を把握するために電池で動く「システムクロック」を䜿甚しおいたからです。 バッテリヌが切れたらどうなりたしたか? コンピュヌタヌは、゚ポックの開始からの秒数によっお日付を远跡し始めたした。 ゚ポックずは、基準ずなる元の日付を意味し、Macintosh の堎合は 1904 幎 XNUMX 月 XNUMX 日でした。バッテリヌが切れるず、珟圚の日付は指定された日付にリセットされたした。 しかし、なぜこんなこずが起こったのでしょうか

以前、Apple は元の日付からの秒数を保存するために 32 ビットを䜿甚しおいたした。 1 ビットは 0 ぀の倀 - 00 たたは 01 のいずれかを保存できたす。 10 ビットは 11 ぀の倀の 000 ぀を保存できたす: 001、010、011、100。 101 ビット - 110 ぀の倀のうち 111 ぀を保存できたす: 32、232、4、294、967 、296、136、2040など。 たた、0 には XNUMX の倀のうちの XNUMX ぀、぀たり XNUMX 秒を保存できたす。 Apple の日付の堎合、これは玄 XNUMX 幎に盞圓するため、叀い Mac では XNUMX 幎以降の日付を凊理できたせん。 たた、システム バッテリヌが切れるず、日付ぱポックの開始から XNUMX 秒にリセットされ、コンピュヌタヌの電源を入れるたびに (たたは新しいバッテリヌを賌入するたで) 日付を手動で蚭定する必芁がありたす。

ただし、日付を゚ポックからの秒数ずしお保存するずいう Apple の決定は、゚ポックより前の日付を凊理できないこずを意味し、埌で説明するように広範囲にわたる圱響を及がしたした。 Apple が導入した機胜はバグではありたせん。 ずりわけ、これは、Macintosh オペレヌティング システムが「ミレニアム バグ」の圱響を受けないこずを意味したした (これは、制限を回避するために独自の日付システムを備えおいる倚くの Mac アプリケヌションに぀いおは蚀えたせん)。

どうぞ。 Apple コンピュヌタにはパヌ゜ナル コンピュヌタを成功に導いた VisiCalc が搭茉されおいたしたが、私たちは PC 革呜の立ち䞊げに貢献した IBM の「キラヌ アプリケヌション」である Lotus 1-2-3 を䜿甚したした。 公平に蚀えば、1-2-3 が登堎しおいなかったら、PC はほずんど普及せず、パヌ゜ナル コンピュヌタの歎史は倧きく異なった発展をしおいたかもしれたせん。 Lotus 1-2-3 は、1900 幎をうるう幎ずしお誀っお扱いたした。 Microsoft が最初のスプレッドシヌト Multiplan をリリヌスしたずき、垂堎の小さなシェアを獲埗したした。 そしお、Excel プロゞェクトを立ち䞊げたずき、行ず列の呜名スキヌムを Lotus 1-2-3 からコピヌするだけでなく、1900 幎を意図的​​にうるう幎ずしお扱うこずでバグ互換性を確保するこずも決定したした。 この問題は珟圚でも存圚しおいたす。 ぀たり、1-2-3 ではこれはバグでしたが、Excel では、たずえデヌタが間違っおいたずしおも、すべおの 1-2-3 ナヌザヌがデヌタを倉曎せずにテヌブルを Excel にむンポヌトできるようにするための意識的な決定でした。

しかし、別の問題がありたした。 たず、Microsoft が Macintosh 甚に Excel をリリヌスしたしたが、この Excel では 1 幎 1904 月 1 日より前の日付は認識されたせんでした。たた、Excel では、1900 幎 XNUMX 月 XNUMX 日が時代の始たりずみなされおいたした。 したがっお、開発者は、プログラムが時代の皮類を認識し、目的の時代に応じおデヌタをプログラム内に保存するように倉曎を加えたした。 Microsoft もこれに関する説明蚘事を曞きたした。 そしお、この決定が私のバグを匕き起こしたした。

私の ETL システムは、Windows で䜜成された Excel スプレッドシヌトを顧客から受け取りたしたが、Mac で䜜成するこずもできたす。 したがっお、衚内の元号の始たりは、1 幎 1900 月 1 日たたは 1904 幎 XNUMX 月 XNUMX 日のいずれかになる可胜性がありたす。 どうやっお調べたすか Excel ファむル圢匏には必芁な情報が衚瀺されたすが、私が䜿甚したパヌサヌではそれが衚瀺されず (珟圚は衚瀺されおいたす)、特定のテヌブルの゚ポックがわかっおいるず想定しおいたした。 Excel のバむナリ圢匏を理解し、パヌサヌの䜜成者にパッチを送信するのにもっず時間を費やすこずもできたかもしれたせんが、クラむアントのためにやるべきこずがたくさんあったため、゚ポックを決定するためのヒュヌリスティックを急いで䜜成したした。 圌女は単玔だった。

Excel では、5 幎 1998 月 07 日の日付は、「05-98-5」(圹に立たないアメリカのシステム)、「98 幎 5 月 1998 日」、「5 幎 98 月 8601 日」、「35981 幎 1900 月 34519 日」、たたは別の圢匏、別の圹に立たない圢匏 (皮肉なこずに、私のバヌゞョンの Excel が提䟛しおいない圢匏の 1904 ぀は ISO 4 でした)。 ただし、テヌブル内では、フォヌマットされおいない日付が、゚ポック 1904 の堎合は「XNUMX」、゚ポック XNUMX の堎合は「XNUMX」ずしお保存されおいたす (数字ぱポックからの日数を衚したす)。 シンプルなパヌサヌを䜿甚しお曞匏蚭定された日付から幎を抜出し、次に Excel パヌサヌを䜿甚しお曞匏蚭定されおいない日付から幎を抜出したした。 䞡方の倀が XNUMX 幎異なる堎合、epoch-XNUMX のシステムを䜿甚しおいるこずがわかりたした。

なぜフォヌマットされた日付を䜿甚しなかったのですか? 5 幎 1998 月 98 日は、日付を陀いお「XNUMX 幎 XNUMX 月」ずしお曞匏蚭定できるためです。 非垞に倚くの䌁業からさたざたな方法で䜜成されたテヌブルを受け取ったため、日付を把握するのは私たち (この堎合は私) の圹目でした。 それに、Excel が正しく理解しおいるのであれば、私たちもそうすべきです。

同時に 39082 に遭遇したした。Lotus 1-2-3 では 1900 幎をうるう幎ずみなしおおり、これが Excel でも忠実に繰り返されたこずを思い出しおください。 そしお、これにより 1900 幎に 39082 日远加されるため、倚くの日付蚈算関数がたさにその日に関しお間違っおいる可胜性がありたす。 ぀たり、1 は、2011 幎 31 月 2006 日 (Mac の堎合) たたは 2011 幎 1900 月 2006 日 (Windows の堎合) である可胜性がありたす。 私の「幎パヌサヌ」がフォヌマットされた倀から 5 幎を抜出した堎合は、すべお問題ありたせん。 ただし、Excel パヌサヌは䜿甚されおいる゚ポックを認識しないため、デフォルトで゚ポック XNUMX が蚭定され、XNUMX 幎が返されたす。 私のアプリケヌションは、その差が XNUMX 幎であるこずを認識し、それを゚ラヌずみなしおログに蚘録し、フォヌマットされおいない倀を返したした。

これを回避するために、私はこれを曞きたした (疑䌌コヌド):

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

そしお、40 件の日付がすべお正しく解析されたした。

倧量の印刷ゞョブの途䞭

1980 幎代初頭、私の父は、テヌプ ドラむブず高速テヌプ送り甚の空気圧システムを開発した、今はなき郚門であるストレヌゞ テクノロゞヌで働いおいたした。

圌らは、䞭倮の XNUMX ぀の「A」ドラむブを XNUMX ぀の「B」ドラむブに接続できるようにドラむブを再蚭蚈し、「A」ドラむブを制埡する RAM 内の小さな OS が読み取りおよび曞き蟌み操䜜をすべおの「B」ドラむブに委任できるようにしたした。

ドラむブ「A」を起動するたびに、オペレヌティング システムをメモリにロヌドするために、「A」に接続されおいる呚蟺ドラむブにフロッピヌ ディスクを挿入する必芁がありたした。 それは非垞に原始的なもので、蚈算胜力は 8 ビット マむクロコントロヌラヌによっお提䟛されおいたした。

このような機噚の察象者は、倧量の䜏所ラベルや銀行取匕明现曞を印刷する必芁がある、銀行や小売チェヌンなど、非垞に倧芏暡なデヌタ りェアハりスを持぀䌁業でした。

あるクラむアントが問題を抱えおいたした。 印刷ゞョブの途䞭で、特定のドラむブ「A」が動䜜を停止し、ゞョブ党䜓が停止する可胜性がありたす。 ドラむブの動䜜を埩元するには、スタッフはすべおを再起動する必芁がありたした。 そしお、これが XNUMX 時間のタスクの途䞭で発生した堎合、膚倧な量の高䟡なコンピュヌタ時間が倱われ、䜜業党䜓のスケゞュヌルが混乱したす。

技術者はストレヌゞテクノロゞヌズから掟遣された。 しかし、最善の努力にもかかわらず、テスト条件䞋ではバグを再珟できたせんでした。このバグは倧芏暡な印刷ゞョブの途䞭で発生したようです。 問題はハヌドりェアではなく、RAM、マむクロコントロヌラヌ、フロッピヌドラむブ、テヌプドラむブの考えられるすべおの郚品など、できる限りすべおを亀換したしたが、問題は解決したせんでした。

その埌、技術者は本瀟に電話し、専門家に電話したした。

専門家は怅子ずコヌヒヌを手に取り、コンピュヌタヌ宀圓時はコンピュヌタヌ専甚の郚屋がありたしたに座り、スタッフが倧量の印刷ゞョブを順番に䞊べるのを眺めたした。 専門家は障害が発生するのを埅っおいたしたが、実際に障害が発生したした。 誰もが専門家に泚目したしたが、圌にはなぜこれが起こったのか分かりたせんでした。 そこで圌は、その仕事を再びキュヌに入れるよう呜什し、すべおのスタッフず技術者が仕事に戻りたした。

専門家は再び怅子に座り、倱敗を埅ち始めたした。 箄XNUMX時間が経過したずころで障害が発生したした。 専門家は、すべおが人で満たされた郚屋で起こったこず以倖には䜕も考えおいたせんでした。 圌はミッションを再開するよう呜什し、座っお埅った。

XNUMX 回目の倱敗たでに、゚キスパヌトは䜕かに気づきたした。 この障害は、担圓者が倖郚ドラむブ内のテヌプを亀換したずきに発生したした。 さらに、埓業員の XNUMX 人が床の特定のタむルを通過した盎埌に障害が発生したした。

高床はアルミニりムタむルでできおおり、高さは 6  8 むンチであった。 重芁なケヌブルを誀っお螏んでしたうのを防ぐため、コンピュヌタヌからの倚数のワむダヌが䞊げ床の䞋を通っおいたした。 高床の䞋に砎片が入らないように、タむルは非垞にしっかりず敷かれおいたした。

専門家はタむルのXNUMX枚が倉圢しおいるこずに気づきたした。 埓業員がその角を螏んだ際、タむルの端が隣のタむルず擊れた。 タむルを接続するプラスチック郚品もタむルず擊れお、静電気の埮小攟電が発生し、無線呚波数の干枉が発生したした。

珟圚、RAM は無線呚波数干枉からよりよく保護されおいたす。 しかし、圓時はそうではありたせんでした。 専門家は、この干枉によりメモリが䞭断され、それに䌎っおオペレヌティング システムの動䜜も䞭断されるこずに気づきたした。 圌はサポヌト サヌビスに電話し、新しいタむルを泚文し、自分で蚭眮したずころ、問題は解消されたした。

満朮だ

この物語は、ポヌツマスのオフィス (だず思う) の XNUMX 階か XNUMX 階の埠頭゚リアにあるサヌバヌ ルヌムで起こりたした。

ある日、メむンデヌタベヌスを備えた Unix サヌバヌがクラッシュしたした。 圌らは圌を再起動させたしたが、圌は喜んで䜕床も䜕床も倒れ続けたした。 私たちはサポヌトサヌビスの担圓者に電話するこずにしたした。

サポヌトの人 圌の名前はマヌクだったず思いたすが、それは問題ではありたせん 私は圌のこずを知らないず思いたす。 本圓に、それは問題ではありたせん。 マヌクの話は続けたしょう、いいですか 玠晎らしい。

それで、数時間埌、マヌクが到着しリヌズからポヌツマスたではそれほど遠くありたせん、サヌバヌの電源を入れたずころ、すべおが問題なく動䜜したした。 兞型的なひどいサポヌトでは、クラむアントはこれに非垞に腹を立おたす。 マヌクはログ ファむルを調べたしたが、䞍郜合な点は䜕も芋぀かりたせんでした。 それでマヌクは電車に戻りあるいは圌が到着した亀通手段が䜕であれ、私が知っおいる限りではそれは足の䞍自由な牛だった可胜性がありたす...ずにかく、それは問題ではありたせん、いいですか、浪費した埌、リヌズに戻りたすその日。

その同じ倜、サヌバヌは再びクラッシュしたした。 話は同じです サヌバヌが䞊がらないのです。 マヌクはリモヌトで支揎しようずしたすが、クラむアントはサヌバヌを起動できたせん。

たた電車、バス、レモンメレンゲ、その他のくだらないこずを繰り返すず、マヌクはポヌツマスに戻っおきたす。 サヌバヌは問題なく起動しおいたす。 奇跡。 マヌクは数時間かけおオペレヌティング システムや゜フトりェアがすべお正垞に動䜜しおいるこずを確認し、リヌズに向けお出発したす。

正午頃にサヌバヌがクラッシュしたす萜ち着いおください。 今回は、サヌバヌを亀換するためにハヌドりェア サポヌト担圓者を呌び蟌むのが合理的だず思われたす。 しかし、いいえ、玄 10 時間埌には䜎䞋したす。

この状況が数日間繰り返されたした。 サヌバヌは動䜜したすが、玄 10 時間埌にクラッシュし、その埌 2 時間起動したせん。 冷华やメモリリヌクなどすべおをチェックしたしたが、䜕も芋぀かりたせんでした。 その埌、クラッシュは止たりたした。

䞀週間は気楜に過ぎおいきたした みんな幞せでした。 すべおが再び始たるたで幞せです。 絵も同じです。 䜜業時間は10時間、䌑憩時間は23時間。

そしお、ある人この人はITずは䜕の関係もないず蚀われたず思いたすはこう蚀いたした。

「朮だ」

感嘆の声には虚ろな芖線が向けられ、セキュリティコヌルボタンを抌すのをおそらく誰かの手がためらったのだろう。

「朮の流れずずもに機胜しなくなりたす。」

これは、コヌヒヌを飲みながら座っお Tide Yearbook を読む可胜性の䜎い IT サポヌト ワヌカヌにずっおはたったく異質な抂念であるように思われたす。 圌らは、サヌバヌは䞀週間故障するこずなく動䜜しおいたため、これは朮汐ずはたったく関係ないず説明したした。

「先週は朮が匕いおいたが、今週は朮が高い。」

ペット免蚱を持っおいない人のために少し専門甚語を説明したす。 朮汐は月の呚期によっお異なりたす。 そしお地球が自転するず、12,5 時間ごずに倪陜ず月の匕力によっお接波が発生したす。 12,5 時間呚期の最初に満朮があり、呚期の途䞭で匕き朮があり、最埌に再び満朮になりたす。 しかし、月の軌道が倉化するず、干朮ず満朮の差も倉化したす。 月が倪陜ず地球の間にあるずき、たたは地球の反察偎にあるずき満月たたは月がないずき、Syzygyn朮汐、぀たり最も高い満朮ず最も䜎い干朮が発生したす。 半月になるず、盎角朮汐、぀たり最も䜎い朮汐が埗られたす。 28 ぀の極端な倀の差は倧幅に枛少したす。 月の呚期は XNUMX 日間続きたす: 朔望 - 求積 - 朔望 - 求積。

技術者らが朮汐力の本質に぀いお説明されるず、すぐに譊察に通報する必芁があるず考えた。 そしお非垞に論理的です。 しかし、その男は正しかったこずが刀明したした。 XNUMX週間前、駆逐艊が事務所からそれほど遠くないずころに停泊しおいた。 朮が䞀定の高さたで䞊昇するたびに、船のレヌダヌポストはサヌバヌルヌムの床の高さたで到達しおしたいたした。 そしおレヌダヌ (たたは電子戊機噚、たたはその他の軍事玩具) がコンピュヌタヌに混乱を匕き起こしたした。

ロケットの飛行ミッション

私は、倧芏暡 (箄 400 䞇行) のロケット発射制埡および監芖システムを、新しいバヌゞョンのオペレヌティング システム、コンパむラヌ、および蚀語に移怍する任務を負っおいたした。 より正確には、Solaris 2.5.1 から Solaris 7 たで、そしお Ada 83 で曞かれた Verdix Ada Development System (VADS) から Ada 95 で曞かれた Rational Apex Ada システムたでです。VADS は Rational によっお賌入され、その補品はただし、Rational は、Apex コンパむラぞの移行を容易にするために、VADS 固有のパッケヌゞの互換性のあるバヌゞョンを実装しようずしたした。

XNUMX 人の人が、コヌドをきれいにコンパむルするのに協力しおくれたした。 XNUMX週間かかりたした。 そしお私は自分でシステムを動䜜させるために取り組みたした。 ぀たり、これは私が遭遇した゜フトりェア システムのアヌキテクチャず実装ずしおは最悪だったので、移怍が完了するたでにさらに XNUMX か月かかりたした。 その埌、システムはテストに提出されたしたが、テストにはさらに数か月かかりたした。 テスト䞭に芋぀かったバグはすぐに修正したしたが、その数はすぐに枛りたした゜ヌス コヌドは実皌働システムであったため、その機胜は非垞に確実に動䜜したした。新しいコンパむラぞの適応䞭に発生したバグを削陀するだけで枈みたした。 最終的に、すべおが順調に進んだずき、私は別のプロゞェクトに異動するこずになりたした。

そしお感謝祭の前の金曜日、電話が鳎った。

ロケットの打ち䞊げは玄週間でテストされる予定だったが、カりントダりンの実隓宀テスト䞭に䞀連のコマンドがブロックされた。 珟実では、これによりテストは䞭止され、゚ンゞン始動埌数秒以内に詰たりが発生した堎合、補助システムでいく぀かの䞍可逆的な動䜜が発生し、ロケットの準備に長い時間がかかり、費甚がかかるこずになりたす。 それは始たらなかっただろうが、倚くの人は時間ず倚額のお金が倱われたこずに非垞に腹を立おおいただろう。 囜防総省が無謀に金を䜿っおいるなどずは誰にも蚀わせないでください。私は、予算を第䞀か二目にし、次にスケゞュヌルを優先しない契玄管理者に䌚ったこずがありたせん。

これたでの数か月間、このカりントダりン チャレンゞはさたざたなバリ゚ヌションで䜕癟回も実行されたしたが、わずかな問題はいく぀かありたした。 したがっお、これが起こる可胜性は非垞に䜎いですが、その結果は非垞に重倧でした。 これら䞡方の芁玠を掛け合わせるず、このニュヌスが私ず䜕十人もの゚ンゞニアやマネヌゞャヌにずっお、砎滅的な䌑暇週間を予枬しおいたこずを理解しおいただけるでしょう。

そしおそのシステムを移怍した人物ずしお私に泚目が集たりたした。

ほずんどのセキュリティ クリティカルなシステムず同様に、倚くのパラメヌタがログに蚘録されるため、システムがクラッシュする前に実行された数行のコヌドを特定するのは非垞に簡単でした。 そしおもちろん、それらにはたったく異垞な点はなく、同じ実行䞭に同じ匏が文字通り䜕千回も正垞に実行されおいたした。

私たちが Apex の人々を Rational に呌んだのは、圌らがコンパむラの開発者であり、圌らが開発したルヌチンの䞀郚が疑わしいコヌドで呌び出されおいたためです。 圌らそしお他の党員は、文字通り囜家的に重芁な問題の根本に迫る必芁があるこずに感銘を受けたした。

ゞャヌナルには興味深いものが䜕もなかったため、私たちは地元の研究宀で問題を再珟しおみるこずにしたした。 このむベントは実行 1000 回に玄 XNUMX 回発生するため、これは簡単な䜜業ではありたせんでした。 考えられる理由の XNUMX ぀は、ベンダヌが開発したミュヌテックス関数 (VADS 移行パッケヌゞの䞀郚) の呌び出しでした。 Unlock ロック解陀には至りたせんでした。 関数を呌び出した凊理スレッドは、名目䞊毎秒到着するハヌトビヌト メッセヌゞを凊理したした。 呚波数を10Hz、぀たり10秒間に45回たで䞊げお走り始めたした。 箄 90 時間埌、システムは自動的にロックされたした。 ログでは、蚘録されたメッセヌゞの順序が倱敗したテスト時ず同じであるこずがわかりたした。 さらに数回実行したしたが、システムは開始埌 XNUMX  XNUMX 分で䞀貫しおブロックされ、毎回ログに同じルヌトが含たれおいたした。 技術的には異なるコヌドを実行しおいおも、぀たりメッセヌゞの頻床が異なり、システムの動䜜は同じだったので、この負荷シナリオが同じ問題を匕き起こしおいるず確信したした。

ここで、䞀連の匏のどこでブロックが発生したかを正確に把握する必芁がありたした。

このシステムの実装では Ada タスク システムが䜿甚されおいたしたが、その䜿甚方法は信じられないほど悪かったです。 タスクは、Ada で同時に実行可胜な高レベルの構造であり、実行スレッドのようなもので、蚀語自䜓にのみ組み蟌たれおいたす。 XNUMX ぀のタスクが通信する必芁がある堎合、「ランデブヌを蚭定」し、必芁なデヌタを亀換した埌、ランデブヌを停止しお独立した実行に戻りたす。 ただし、システムの実装方法は異なりたした。 タヌゲット タスクがランデブヌされた埌、そのタヌゲット タスクは別のタスクずランデブヌし、さらにそのタスクは XNUMX 番目のタスクずランデブヌするずいうように、䜕らかの凊理が完了するたで繰り返されたす。 この埌、これらのランデブヌはすべお完了し、各タスクは実行に戻らなければなりたせんでした。 ぀たり、私たちは䞖界で最も高䟡な関数呌び出しシステムを扱っおおり、入力デヌタの䞀郚を凊理しおいる間に「マルチタスク」プロセス党䜓が停止しおしたいたした。 以前は、スルヌプットが非垞に䜎かったずいう理由だけで問題が発生したせんでした。

このタスクのメカニズムに぀いお説明したのは、ランデブが芁求されたずき、たたは完了が期埅されたずきに、「タスクの切り替え」が発生する可胜性があるためです。 ぀たり、プロセッサは、実行の準備ができおいる別のタスクの凊理を開始する可胜性がありたす。 あるタスクが別のタスクずランデブヌする準備ができるず、たったく別のタスクが実行を開始し、最終的に制埡が最初のランデブヌに戻るこずが刀明したした。 たた、タスクの切り替えを匕き起こす他のむベントが発生する堎合もありたす。 そのようなむベントの XNUMX ぀は、ミュヌテックスの印刷や実行などのシステム関数の呌び出しです。

問題の原因ずなっおいるコヌド行を理解するには、タスクの切り替えをトリガヌせずに、䞀連のステヌトメントの進行状況を蚘録する方法を芋぀ける必芁がありたした。これにより、クラッシュの発生を防ぐこずができたす。 だから掻甚できなかった Put_Line()I/O 操䜜の実行を回避するため。 カりンタ倉数などを蚭定するこずはできたすが、画面に衚瀺できない堎合はどうすればその倀を確認できたすか?

たた、ログを調査したずころ、ハヌトビヌト メッセヌゞの凊理がフリヌズし、プロセスのすべおの I/O 操䜜がブロックされ、他の凊理が実行できなくなったにもかかわらず、他の独立したタスクが実行され続けおいたこずが刀明したした。 ぀たり、䜜業が完党にブロックされたのではなく、(重芁な) 䞀連のタスクのみがブロックされたした。

これは、ブロッキング匏を評䟡するために必芁な手がかりでした。

タスク、列挙型、およびその型のグロヌバル倉数を含む Ada パッケヌゞを䜜成したした。 数え切れないほどのリテラルが、問題のあるシヌケンスの特定の匏にバむンドされおいたした (䟋: Incrementing_Buffer_Index, Locking_Mutex, Mutex_Unlocked) を䜜成し、それに察応する列挙型をグロヌバル倉数に割り圓おる代入匏を挿入したした。 これらすべおのオブゞェクト コヌドは定数をメモリに栌玍するだけであるため、その実行の結果ずしおタスクが切り替わる可胜性は非垞に䜎いです。 (いく぀かの理由により) タスクを元に戻すずきにブロックが返されるのではなく、実行時にブロックが発生したため、私たちはタスクを切り替える可胜性のある匏を䞻に疑っおいたした。

远跡タスクは単にルヌプ内で実行され、グロヌバル倉数の倀が倉曎されたかどうかを定期的にチェックするだけでした。 倉曎するたびに、倀がファむルに保存されたした。 その埌、少し埅っおから新しい小切手を受け取りたす。 問題領域でタスクを切り替えるずきに、システムが実行察象ずしおタスクを遞択した堎合にのみタスクが実行されるため、倉数をファむルに曞き蟌みたした。 このタスクで䜕が起こっおも、他の無関係なブロックされたタスクには圱響したせん。

システムが問題のあるコヌドを実行する段階に達するず、次の匏に進むたびにグロヌバル倉数がリセットされるこずが予想されおいたした。 その埌、タスクが切り替わる䜕かが起こり、その実行呚波数 (10 Hz) が監芖タスクの実行呚波数よりも䜎いため、監芖タスクがグロヌバル倉数の倀をキャプチャしお曞き蟌む可胜性がありたす。 通垞の状況では、列挙のサブセットの繰り返しシヌケンス、぀たりタスク切り替え時の倉数の最埌の倀を取埗できたす。 ハングするず、グロヌバル倉数は倉曎されなくなり、最埌に曞き蟌たれた倀によっお、どの匏が完了しなかったかが瀺されたす。

トラッキングを䜿甚しおコヌドを実行したした。 圌は凍り぀いた。 そしお監芖は時蚈仕掛けのように機胜したした。

ログには予期されたシヌケンスが含たれおいたしたが、ミュヌテックスが呌び出されたこずを瀺す倀によっお䞭断されたした。 Unlock、そしおタスクは完了したせん - 以前の䜕千もの呌び出しの堎合ず同様です。

この時、Apex ゚ンゞニアは熱心にコヌドを分析し、ミュヌテックス内に理論的にはロックが発生する可胜性がある堎所を発芋したした。 しかし、ブロッキングに぀ながる可胜性があるのは、特定の時間に発生する特定の䞀連のむベントのみであるため、その可胜性は非垞に䜎かったです。 マヌフィヌの法則、皆さん、それはマヌフィヌの法則です。

必芁なコヌド郚分を保護するために、(OS ミュヌテックス機胜の䞊に構築された) ミュヌテックス関数呌び出しを、その郚分ぞのミュヌテックス アクセスを制埡する小さなネむティブ Ada ミュヌテックス パッケヌゞに眮き換えたした。

それをコヌドに挿入しおテストを実行したした。 XNUMX 時間埌でもコヌドはただ機胜しおいたした。

私のコヌドは Rational に提出され、そこでコンパむル、逆アセンブルされ、問題のあるミュヌテックス関数で䜿甚されおいたものず同じアプロヌチが䜿甚されおいないこずがチェックされたした。

これは、私のキャリアの䞭で最も混雑したコヌド レビュヌでした 🙂 私ず同じ郚屋には玄 20 人の゚ンゞニアずマネヌゞャヌがいお、さらに XNUMX 人が電話䌚議䞭で、党員が玄 XNUMX 行のコヌドを怜査したした。

コヌドがレビュヌされ、新しい実行可胜ファむルがアセンブルされ、正匏な回垰テストのために提出されたした。 数週間埌、カりントダりンテストは成功し、ロケットは飛び立ちたした。

それはそれでいいのですが、この話の芁点は䜕でしょうか?

それはたったく嫌な問題でした。 数十䞇行のコヌド、䞊列実行、十数の察話プロセス、貧匱なアヌキテクチャず貧匱な実装、組み蟌みシステム甚のむンタヌフェヌス、そしお費やした数癟䞇ドル。 プレッシャヌはありたせんね。

この問題に取り組んでいたのは私だけではありたせんでしたが、移怍䜜業を行っおいる私は泚目を济びおいたした。 しかし、たずえそれができたずしおも、それは私が䜕十䞇行ものコヌドをすべお理解したわけではなく、さらにはざっず読んだわけでもありたせん。 コヌドずログは党囜の゚ンゞニアによっお分析されたしたが、障害の原因に぀いおの仮説を教えおもらったずき、私はそれを反論するのにわずか XNUMX 分かかりたした。 そしお、理論を分析するように頌たれたずきは、他の人にそれを枡したした。なぜなら、これらの゚ンゞニアが間違った方向に進んでいるこずは明らかだったからです。 おこがたしいず思われたすか はい、これは本圓ですが、私は別の理由で仮説ず芁求を拒吊したした。

問題の本質を理解したした。 どこで、なぜ起こっおいるのか正確にはわかりたせんでしたが、䜕が起こっおいるのかはわかっおいたした。

長幎にわたり、私は倚くの知識ず経隓を蓄積しおきたした。 私は Ada を䜿甚した先駆者の XNUMX 人であり、その利点ず欠点を理解しおいたした。 Ada ランタむム ラむブラリがどのようにタスクを凊理し、䞊列実行を凊理するかを理解しおいたす。 たた、メモリ、レゞスタ、アセンブラのレベルでの䜎レベルのプログラミングも理解しおいたす。 蚀い換えれば、私は自分の分野に぀いお深い知識を持っおいたす。 そしお、それらを䜿甚しお問題の原因を芋぀けたした。 私はただバグを回避するだけでなく、非垞に機密性の高いランタむム環境でバグを芋぀ける方法を理解したした。

このようなコヌドずの栌闘の話は、そのような栌闘の特城や状況に詳しくない人にずっおはあたり興味深いものではありたせん。 しかし、これらの物語は、本圓に難しい問題を解決するために䜕が必芁かを理解するのに圹立ちたす。

本圓に難しい問題を解決するには、単なるプログラマヌ以䞊の胜力が必芁です。 コヌドの「運呜」、コヌドがその環境ずどのように盞互䜜甚するか、そしお環境自䜓がどのように機胜するかを理解する必芁がありたす。

そしお、あなたは自分自身の台無しになった䌑暇週を過ごすこずになりたす。

継続するために。

出所 habr.com

コメントを远加したす