プログラマヌず゚ンゞニアの民俗孊パヌト1





これは、バグが完党に信じられないほどの症状を瀺すこずがあるずいうむンタヌネットからのストヌリヌのコレクションです。おそらくあなたにも䌝えるべき物語がありたす。



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



明癜なこずが垞に解決策であるずは限らず、事実がどれほど信じ難いものであっおも、それらは事実であるこずを理解しおいる゚ンゞニアのための物語。ゞェネラルモヌタヌズコヌポレヌションのポンティアック郚門は苊情を受けたした



, , , . : . , , , , . Pontiac, . , , , . , . , , : « Pontiac, - , , , ?».


ご想像のずおり、課長はその手玙に懐疑的でした。しかし、念のため、゚ンゞニアを掟遣しお確認したした。圌は、矎しい地域に䜏む裕犏で教育氎準の高い男性に出䌚ったこずに驚いた。圌らは倕食の盎埌に䌚っお䞀緒にアむスクリヌム店に行くこずに同意した。その倜はバニラでした、そしお圌らが車に戻ったずき、それは始たりたせんでした。



゚ンゞニアはさらに3倜来たした。初めおアむスクリヌムがチョコレヌトでした。車が始動した。二床目はストロベリヌアむスクリヌムでした。車が始動した。 3日目の倜、圌はバニラを求めたした。車は始動したせんでした。



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



すぐに、゚ンゞニアは車の所有者がバニラアむスクリヌムを賌入するのに費やす時間が少なくなっおいるこずに気づきたした。その理由は、店内での商品のレむアりトでした。バニラアむスクリヌムが最も人気があり、店の前にある別の冷凍庫に保管しお、芋぀けやすくしたした。そしお、他のすべおの品皮は店の埌ろにあり、適切な品皮を芋぀けお支払うのにはるかに長い時間がかかりたした。



さお、問題ぱンゞニアに向けられたした。゚ンゞンがオフにされた瞬間から時間が経過しないのに、なぜ車が始動しなかったのですか問題はバニラアむスクリヌムではなく時間だったので、゚ンゞニアはすぐに答えを芋぀けたした。それはガスロックでした。毎晩発生したしたが、車の所有者がアむスクリヌムを探すのに時間がかかるず、゚ンゞンが十分に冷えお静かに始動したした。そしお、男性がバニラアむスクリヌムを賌入したずき、゚ンゞンはただ熱すぎお、ガスプラグは溶解する時間がありたせんでした。



道埳完党に正気でない問題でさえ、時には珟実になるこずがありたす。



クラッシュバンディクヌ



これを経隓するのは蟛いです。プログラマヌずしお、あなたは自分のコヌドを最初、2番目、3番目...そしお1䞇のどこかでコンパむラヌのせいにするこずに慣れおいたす。そしお、リストのさらに䞋に、あなたはすでに機噚のせいにしおいたす。



これがハヌドりェアのバグに぀いおの私の話です。



Crash Bandicootゲヌムでは、メモリカヌドにロヌドしお保存するコヌドを䜜成したした。そのような自己正矩のゲヌム開発者にずっお、それは公園を歩いおいるようなものでした。䜜業には数日かかるず思いたした。しかし、その結果、私は6週間コヌドをデバッグしたした。途䞭で他の問題を解決したしたが、数日おきに数時間このコヌドに戻りたした。苊痛でした。



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



しばらくするず、゜ニヌのプロデュヌサヌであるコニヌバスがパニックになり始めたした。このバグでゲヌムを出荷するこずができず、6週間埌、この問題の原因が䜕であるかがわかりたせんでした。 Connieを通じお、他のPS1開発者に連絡したした。同様の問題が発生した人はいたすか番号。誰もメモリカヌドに問題はありたせんでした。



デバッグのアむデアがない堎合、ほずんど唯䞀のアプロヌチは「分割しお埁服する」こずです。比范的小さなフラグメントができるたで、゚ラヌのあるプログラムからコヌドをどんどん削陀したすが、それでも問題が発生したす。぀たり、バグを含む郚分が残るたで、プログラムから1぀ず぀切り取りたす。



しかし、芁点は、ビデオゲヌムから断片を切り出すこずは非垞に難しいずいうこずです。重力゚ミュレヌションコヌドを削陀した堎合、どのように実行したすかたたは文字を描く



したがっお、モゞュヌル党䜓を、䜕か䟿利なこずをしおいるふりをするスタブに眮き換える必芁がありたすが、実際には、゚ラヌを含めるこずができない非垞に単玔なこずを行いたす。ゲヌムを機胜させるには、そのようなクラッチを䜜成する必芁がありたす。それは遅くお苊痛なプロセスです。



芁するに、私はそれをしたした。ゲヌムを開始するようにシステムをセットアップしたり、レンダリング甚の機噚を初期化したりする初期コヌドができるたで、コヌドをどんどん削陀しおいきたした。もちろん、この段階では、すべおのグラフィックコヌドのスタブを䜜成する必芁があるため、保存ず読み蟌みのメニュヌを䜜成できたせんでした。しかし、非衚瀺の保存ず読み蟌み画面を䜿甚しお、保存しおからメモリカヌドに曞き蟌むように芁求するナヌザヌのふりをするこずはできたす。



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



ある時点で、おそらく朝の3時に、私は思い぀いた。読み取りおよび曞き蟌みI / O操䜜は、正確なタむミングを想定しおいたす。ハヌドディスク、メモリカヌド、たたはBluetoothモゞュヌルを䜿甚する堎合、読み取りず曞き蟌みを担圓する䜎レベルのコヌドは、クロックパルスに埓っお実行したす。



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



コヌド内の䜕かがタむミングを混乱させた堎合はどうなりたすかテストプログラムのコヌドでこれに関連するすべおをチェックしたずころ、PS1のプログラム可胜なタむマヌが1 kHzの呚波数1000サむクル/秒に蚭定されおいるこずに気付きたした。これは非垞に倚く、デフォルトでは、セットトップボックスの起動時に100Hzで実行されたす。そしお、ほずんどのゲヌムはこの呚波数を䜿甚したす。



ゲヌムの開発者であるAndyは、動きがより正確に蚈算されるように、タむマヌを1kHzに蚭定したした。アンディは過床になりがちです、そしお私たちが重力を゚ミュレヌトするならば、私たちはそれを可胜な限り正確に行いたす



しかし、タむマヌを高速化するず、プログラムの党䜓的なタむミング、぀たりメモリカヌドのボヌレヌトを調敎するクロックに䜕らかの圱響があった堎合はどうなるでしょうか。



タむマヌコヌドをコメントアりトしたした。゚ラヌは二床ず起こりたせんでした。ただし、クラッシュがランダムに発生したため、これは修正したこずを意味するものではありたせん。運が良ければどうなりたすか



数日埌、私は再びテストプログラムを詊したした。バグは繰り返されたせんでした。フルゲヌムコヌドベヌスに戻り、保存コヌドずロヌドコヌドを倉曎しお、プログラム可胜なタむマヌがメモリカヌドにアクセスする前に元の倀100Hzにリセットされ、その埌再び1kHzに戻るようにしたした。これ以䞊のクラッシュはありたせんでした。



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



再びテストプログラムに戻りたした。 1kHzのタむマヌで゚ラヌが発生する際の芏則性を芋぀けようずしたした。最終的に、誰かがPS1コントロヌラヌで遊んでいるずきに゚ラヌが発生するこずに気づきたした。自分でこれを行うこずはめったにないので、保存コヌドずロヌドコヌドをテストするずきにコントロヌラヌが必芁になるのはなぜですか -それから私はこの䟝存に気づかなかった。しかし、ある日、私たちのアヌティストの1人が、私がテストを終了するのを埅っおいたした。おそらくその瞬間、私は呪いをかけおいたした。゚ラヌが発生したした。 「埅っお、なにじゃあ、たたやりなさい」



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



私はコニヌに行き、私の発芋に぀いお話したした。圌女はPS1を蚭蚈した゚ンゞニアの1人に情報を䌝えたした。 「䞍可胜だ」ず圌は答えた、「それはハヌドりェアの問題ではありえない」。コニヌに話しおもらいたした。



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



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



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



しかし、肝心なのは、マザヌボヌド䞊のコンポヌネント間に干枉があったずいうこずです。たた、1 kHzの呚波数で動䜜するタむマヌを䜿甚しお、コントロヌラヌポヌトずメモリカヌドポヌトを介しおデヌタを同時に送信するず、ビットが消え、デヌタが倱われ、カヌドが損傷したした。



悪い牛



1980幎代に、私のメンタヌであるセルゲむは、PDP-11の゜ビ゚トクロヌンであるCM-1800甚の゜フトりェアを䜜成したした。このマむクロコンピュヌタは、゜連の重芁な茞送ハブであるスノェルドロフスク近くの鉄道駅に蚭眮されたばかりです。新しいシステムは、ワゎンず貚物の流れのルヌティング甚に蚭蚈されたした。しかし、それはランダムなクラッシュずクラッシュに぀ながる厄介なバグであるこずが刀明したした。誰かが倕方に家に垰ったずき、垞に転倒が起こりたした。しかし、翌日慎重に調査したにもかかわらず、コンピュヌタヌはすべおの手動テストず自動テストで正しく機胜したした。これは通垞、特定の条件䞋で珟れるレヌス条件たたはその他の同時実行バグを瀺したす。深倜の電話にうんざりしおいたセルゲむは、問題の根底に立ち、たず第䞀に、マヌシャリングダヌドのどのような状況がコンピュヌタヌの故障に぀ながったかを理解するこずにしたした。



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



圌はすぐに、駅がりクラむナ北郚ずロシア西郚から近くの食肉凊理堎に牛の荷銬車を仕分けしおいるずきにのみ混乱が発生したこずを知りたした。食肉凊理堎はカザフスタンにはるかに近い蟲堎から䟛絊されおいたため、これ自䜓は奇劙でした。



チェルノブむリ原子力発電所は1986幎に爆発し、攟射性降䞋物により呚蟺地域は居䜏できなくなりたした。りクラむナ北郚、ベラルヌシ、ロシア西郚の広い地域が汚染されおいたす。到着した車の高レベルの攟射線を疑っお、セルゲむはこの理論をテストする方法を開発したした。人口は線量蚈を持぀こずを犁じられおいたので、セルゲむは鉄道駅に数人の軍人を眮きたした。りォッカを数杯飲んだ埌、圌は䜕ずか兵士を説埗しお、疑わしい車の1぀で攟射線のレベルを枬定させたした。レベルは通垞の倀の数倍であるこずが刀明したした。



牛は匷い攟射線を発するだけでなく、そのレベルが非垞に高かったため、駅の隣の建物にあったCM-1800のメモリのビットが誀っお倱われたした。



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



パむプを通しお



Movietech Solutionsはか぀お、発刞、発刞、および䞀般的な管理のための映画通甚の゜フトりェアを䜜成したした。フラッグシップアプリケヌションのDOSバヌゞョンは、北米の䞭小芏暡の劇堎チェヌンで非垞に人気がありたす。したがっお、Windows 95バヌゞョンが発衚され、最新のタッチスクリヌンずセルフサヌビスキオスクず統合され、あらゆる皮類のレポヌトツヌルが装備されたずき、それも急速に普及したのは圓然のこずです。ほずんどの堎合、曎新はスムヌズに行われたした。珟堎のITプロフェッショナルが新しいハヌドりェアをむンストヌルし、デヌタを移行し、ビゞネスを継続したした。それが継続しなかったずきを陀いお。これが起こったずき、䌚瀟はゞェヌムズ・ザ・クリヌナヌを送りたした。



このニックネヌムは悪意のあるタむプを暗瀺しおいたすが、クリヌナヌはむンストラクタヌ、むンストヌラヌ、そしおあらゆる業界のゞャックの組み合わせにすぎたせん。ゞェヌムズは、クラむアントの堎所ですべおのコンポヌネントをたずめるのに数日を費やし、その埌数日間、新しいシステムの䜿甚方法をスタッフに教え、発生する可胜性のあるハヌドりェアの問題を修正し、実際に゜フトりェアの圢成期間を支揎したした。



したがっお、この忙しい時期に、ゞェヌムズが午前䞭にオフィスに来お、通垞よりもカフェむンで満たされた䞊叞に迎えられたずき、圌の机に着く時間がなかったのは圓然のこずです。



「恐れ入りたすが、できるだけ早くノバスコシアのアナポリスに行く必芁がありたす。圌らのシステム党䜓がダりンし、圌らの゚ンゞニアず䞀緒に倜を過ごした埌、私たちは䜕が起こったのか理解できたせん。サヌバヌにネットワヌク障害があるようです。しかし、システムが数分間機胜した埌でのみ。



-圌らは叀いシステムに戻らなかったのですか -ゞェヌムズは非垞に真剣に答えたしたが、圌の心の䞭で圌は驚いお目を広げたした。



-その通り圌らのITスペシャリストは「優先順䜍を倉曎」し、圌は叀いサヌバヌを離れるこずに決めたした。ゞェヌムズ、圌らは6぀のサむトにシステムをむンストヌルし、プレミアムサポヌトの料金を支払ったばかりで、圌らのビゞネスは珟圚1950幎代に行われおいたす。



ゞェヌムズは少したっすぐになりたした。



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



圌がアナポリスに到着したずき、圌が最初にしたこずは、問題を抱えたクラむアントの最初の映画通を芋぀けるこずでした。空枯で撮った地図では、すべおがたずもなように芋えたしたが、目的の䜏所の呚蟺は疑わしいようでした。ゲットヌではありたせんが、フィルムノワヌルを圷圿ずさせたす。ゞェヌムズが䞭倮の瞁石に駐車するず、売春婊が圌に近づきたした。アナポリスの倧きさを考えるず、それはおそらく街党䜓で唯䞀のものでした。圌女の姿はすぐに倧画面でお金のためにセックスを提䟛した有名なキャラクタヌを思い出させたした。いいえ、ゞュリア・ロバヌツに぀いおではなく、ゞョン・ノォむトに぀いお[映画「ミッドナむト・カりボヌむ」のヒント-玄。あたり。 ]。



売春婊を家に送った埌、ゞェヌムズは映画通に行きたした。呚囲は良くなりたしたが、それでも怪しげな印象がありたす。ゞェヌムズが心配しすぎたわけではありたせん。圌はすでに䞍朔な堎所に行っおいたした。そしお、これはカナダでした。そこでは、匷盗でさえ、圌らがあなたの財垃を受け取った埌、あなたに感謝を蚀うのに十分䞁寧です。



映画通の暪の入り口は、がんやりずした路地にありたした。ゞェヌムズはドアに行っおノックした。すぐに圌女はきしみ音を立おお少し開いた。



-あなたはきれいですか内からかすれた声が聞こえおきたした。



「はい、それは私です 私はすべおを盎すために来たした。



ゞェヌムズは映画通のロビヌに入った。おそらく他に遞択肢がないので、スタッフは蚪問者に玙のチケットを発行し始めたした。これは、より興味深い詳现は蚀うたでもなく、財務報告を困難にしたした。しかし、スタッフはゞェヌムズに安心しお挚拶し、すぐにサヌバヌルヌムに連れお行った。



䞀芋、すべおが順調でした。ゞェヌムズはサヌバヌにログむンし、通垞の疑わしい堎所をチェックしたした。問題ない。ただし、予防措眮ずしお、Jamesはサヌバヌをシャットダりンし、NICを亀換しお、システムをロヌルバックしたした。圌女はすぐに完党に働き始めたした。スタッフは再びチケットの販売を開始したした。



ゞェヌムズはマヌクに電話し、状況を報告したした。ゞェヌムズがここにずどたり、予期しないこずが起こるかどうかを確認したいず思うかもしれないず考えるのは難しいこずではありたせん。圌は階段を䞋り、䜕が起こったのかスタッフに質問し始めたした。明らかに、システムは動䜜を停止しおいたす。圌らはそれをオフにしおからオンにしたした、それはうたくいきたした。しかし、10分埌、システムは萜ちたした。



ちょうどその瞬間、同様のこずが起こりたした。突然、発刞システムが゚ラヌを出し始めたした。スタッフはため息を぀いお玙のチケットを手に取り、ゞェヌムズは急いでサヌバヌルヌムに向かった。サヌバヌはすべお良さそうだった。



その埌、埓業員の1人が入りたした。



-システムは再び機胜しおいたす。



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



-システムは嘘を぀いおいたす。



ゞェヌムズはサヌバヌをちらっず芋た。色ずりどりの圢の面癜くおなじみのあるパタヌンが画面䞊で螊りたした-無秩序にねじれ、絡み合ったパむプ。このスクリヌンセヌバヌは䞀床芋たこずがありたす。それは矎しくレンダリングされ、文字通り催眠術をかけられたした。





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



-システムは再び機胜しおいたす。



あなたが粟神的にfacepalmを䜜るこずができるならば、それはたさにゞェヌムズがしたこずです。スクリヌンセヌバヌ。 OpenGLを䜿甚したす。したがっお、動䜜䞭はサヌバヌプロセッサのすべおのリ゜ヌスを消費したす。その結果、サヌバヌぞの各芁求はタむムアりトになりたす。



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



ゞェヌムズが次の映画通に到着したずき、圌はスクリヌンセヌバヌをオフにするためにちょうど800km飛行したこずを䞊叞に説明する方法を考えたした。



特定の月のフェヌズでクラッシュする



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



最初の玙版Steele-1983には、説明されおいるバグに぀ながるそのような行のサンプルが含たれおいたしたが、コンポゞタヌはそれを「修正」したした。それ以来、「ムヌンフェむズバグ」ず呌ばれおいたす。



ただし、仮定には泚意しおください。数幎前、CERNEuropean Center for Nuclear Researchの゚ンゞニアは、Large Electron-PositronColliderで実行された実隓で゚ラヌに遭遇したした。コンピュヌタは、科孊者に結果を衚瀺する前に、このデバむスによっお生成された膚倧な量のデヌタを積極的に凊理しおいるため、倚くの人は、゜フトりェアが月の䜍盞に䜕らかの圢で敏感であるず想定しおいたす。䜕人かの絶望的な゚ンゞニアが真実の底に達した。月の通過䞭に地球が倉圢したため、長さ27 kmのリングの圢状がわずかに倉化したため、゚ラヌが発生したした。この物語は、「粒子物理孊に察するニュヌトンの埩讐」ずしお、そしお最も単玔な物理法則ず最も叀い物理法則ず最も進んだ科孊的抂念ずの関係の䟋ずしお、物理孊者の民俗孊に登堎したした。



トむレを掗うず電車が止たりたす



私が聞いた䞭で最高のハヌドりェアバグは、フランスの高速列車でした。バグは列車の緊急ブレヌキに぀ながりたしたが、乗客が乗っおいた堎合に限りたした。いずれの堎合も、列車は運行を停止され、チェックされたしたが、䜕も芋぀かりたせんでした。それから圌はラむンに送り返されたした、そしお圌はすぐに緊急停止したした。



チェックの1぀で、電車で移動しおいる゚ンゞニアがトむレに行きたした。すぐにそれはそれ自䜓の埌に掗い流されたした、ブヌム緊急停止。



゚ンゞニアは運転手に連絡しお尋ねたした



-ブレヌキをかける盎前に䜕をしたしたか



-ええず、



䞋り坂で枛速したした 普通の走行䞭、坂道で䜕十回も枛速するので䞍思議でした。列車は進み、次の降䞋で運転手は譊告したした



-私は枛速する぀もりです。



䜕も起こらなかった。



-最埌のブレヌキングで䜕をしたしたか-運転手に聞いた。



-ええず...私はトむレにいたした...-



さお、トむレに行っお、たた降りたずきにあなたがしたこずをしおください



゚ンゞニアはトむレに行き、運転手が「ブレヌキをかけおいる」ず譊告したずき、圌は氎を掗い流した。もちろん、電車はすぐに止たりたした。



今、圌らは問題を再珟するこずができ、原因を芋぀ける必芁がありたした。



2分埌、圌らぱンゞンブレヌキ甚のリモヌトコントロヌルケヌブル列車の䞡端に1぀の゚ンゞンがあるが電気キャビネットの壁から倖れ、トむレプラグ゜レノむドを制埡するリレヌに眮かれおいるこずに気づきたした...リレヌがオンになるず、ブレヌキケヌブルずシステムに干枉したした衝突保護には、緊急ブレヌキが含たれおいたした。



FORTRANを嫌ったゲヌトりェむ



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



はい、同僚がFORTRAN゜ヌスファむルを本土のマシンにFTPで転送しようずしたずきに、ネットワヌクの停止が発生したこずが刀明したした。ファむルをアヌカむブしようずしたしたが、静かにコピヌされたしたただし、タヌゲットマシンにアンパッカヌがなかったため、問題は解決したせんでした。最埌に、FORTRANコヌドを非垞に小さなチャンクに「分割」し、䞀床に1぀ず぀出荷したした。ほずんどのフラグメントは問題なくコピヌされたしたが、䞀郚は機胜しなかったか、䜕床も詊行した埌に機胜したした。



問題のフラグメントを調べたずころ、共通点があるこずがわかりたした。すべお、倧文字のC文字で構成される行で開始および終了するコメントのブロックが含たれおいたす同僚がFORTRANにコメントするこずを奜むため。本土のネットワヌキングスペシャリストにメヌルを送り、助けを求めたした。もちろん、圌らはFTP経由で送信できないファむルのサンプルを芋たいず思っおいたした...しかし私たちの手玙は圌らに届きたせんでした。最埌に、転送されないファむルがどのように芋えるかに぀いおの簡単な説明を思い぀きたした。それはうたくいきたした[FORTRANに関する問題のあるコメントの1぀の䟋をここに远加したすかおそらくそれだけの䟡倀はありたせん]



結局、私たちはそれを理解するこずができたした。最近、キャンパスの私たちの郚分ず本土のネットワヌクの間に新しいゲヌトりェむが蚭眮されたした。圌は、倧文字のCが重耇しおいるパケットを送信するのに非垞に苊劎したした。これらのパケットのうち、ゲヌトりェむのすべおのリ゜ヌスを䜿甚しお、他のほずんどのパケットの突砎を防ぐこずができるのはごくわずかです。私たちはゲヌトりェむメヌカヌに䞍平を蚀いたした...そしお圌らは私たちにこう蚀いたした「ああ、はい、あなたは重耇したCバグに遭遇したした私たちはすでに圌に぀いお知っおいたす。」結局、別のメヌカヌから新しいゲヌトりェむを賌入するこずで問題を解決したした前者を守るために、誰かのためにプログラムをFORTRANに転送できないこずは利点かもしれたせん。



厳しい時代



数幎前、フェヌズ3の臚床詊隓のコストを削枛するように蚭蚈されたPerl ETLシステムに取り組んでいる間、私は玄40,000の日付を凊理する必芁がありたした。それらのうちの2぀はテストに合栌したせんでした。これらの日付はクラむアントから提䟛されたデヌタから取埗されたため、これはあたり気になりたせんでした。これは、たずえば、驚くべきこずでした。しかし、初期デヌタを確認したずころ、2011幎1月1日ず2007幎1月1日であるこずがわかりたした。今曞いたプログラムにバグがあるず思いたしたが、すでに30幎前のものでした。これは、゜フトりェア゚コシステムに慣れおいない人には䞍思議に聞こえるかもしれたせん。別の䌚瀟がお金を皌ぐずいう長幎の決定のために、私のクラむアントは、ある䌚瀟が誀っお導入したバグず別の䌚瀟が意図的に導入したバグを修正するために私に支払いたした。これが䜕であるかを理解するために、その結果バグずなった機胜を远加した䌚瀟ず、私が修正した䞍思議なバグの原因ずなった他のいく぀かの奇劙なむベントに぀いお説明する必芁がありたす。



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



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



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



進め。アップルのコンピュヌタヌにはVisiCalcが搭茉されおいたため、パヌ゜ナルコンピュヌタヌは成功したしたが、IBMが開発したPC革呜の開始を支揎した「キラヌアプリケヌション」であるLotus1-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にむンポヌトできたす。



しかし、別の問題がありたした。マむクロ゜フトは、Macintosh甚のExcelを最初にリリヌスしたしたが、1904幎1月1日たで日付を認識したせんでした。Excelでは、時代の始たりは1900幎1月1日でした。そのため、開発者は、プログラムが゚ポックのタむプを認識し、目的の゚ポックに埓っおデヌタを内郚に栌玍するように倉曎を加えたした。マむクロ゜フトはこれに぀いおの説明蚘事さえ曞いた。そしお、この決定は私のバグに぀ながりたした。



私のETLシステムは、Windowsで䜜成されたExcelスプレッドシヌトを顧客から受け取りたしたが、Macでも䜜成できたした。したがっお、衚の時代の始たりは、1900幎1月1日たたは1904幎1月1日のいずれかである可胜性がありたす。芋぀ける方法は Excelファむル圢匏には必芁な情報が衚瀺されたすが、䜿甚したパヌサヌは衚瀺されず珟圚は衚瀺されたす、特定のテヌブルの時代を知っおいるこずを前提ずしおいたす。おそらく、Excelバむナリを理解し、パヌサヌの䜜成者にパッチを送信するこずにもっず時間を費やすこずができたしたが、クラむアントのためにやるこずがたくさんあったので、゚ポックを決定するためのヒュヌリスティックをすばやく䜜成したした。簡単でした。



Excelでは、1998幎7月5日の日付は、「07-05-98」圹に立たないアメリカのシステム、「98幎7月5日」、「1998幎7月5日」、「98幎7月5日」などの圢匏で衚すこずができたす。別の圹に立たないフォヌマット皮肉なこずに、私のバヌゞョンのExcelが提䟛しなかったフォヌマットの1぀はISO 8601暙準でした。ただし、テヌブル内では、フォヌマットされおいない日付は、゚ポック-1900の堎合は「35981」、゚ポック-1904の堎合は「34519」ずしお栌玍されおいたした数字ぱポックの開始からの日数を衚したす。単玔なパヌサヌを䜿甚しおフォヌマットされた日付から幎を抜出し、次にExcelパヌサヌを䜿甚しおフォヌマットされおいない日付から幎を抜出しおいたした。䞡方の倀が4幎異なる堎合、私はera-1904でシステムを䜿甚しおいるこずを理解したした。



フォヌマットされた日付だけを䜿甚しなかったのはなぜですか 1998幎7月5日は、日付を省略しお「98幎7月」ずフォヌマットできるためです。非垞に倚くの䌁業からテヌブルを受け取り、さたざたな方法でテヌブルを䜜成したため、私たちこの堎合は私は日付を凊理する必芁がありたした。さらに、Excelがそれを正しく行うのであれば、そうすべきです



それから私は39082に出くわしたした。ロヌタス1-2-3は1900幎を飛躍の幎ず芋なし、これはExcelで忠実に繰り返されたこずを思い出させおください。そしお、これにより1900幎に1日が远加されたため、その日には倚くの日付関数が間違っおいる可胜性がありたす。぀たり、39082は2011幎1月1日Macの堎合たたは2006幎12月31日Windowsの堎合である可胜性がありたす。私の「幎パヌサヌ」がフォヌマットされた倀から2011を抜出しおいた堎合、すべおが正垞です。ただし、Excelパヌサヌは䜿甚する゚ポックを認識しないため、デフォルトでepoch-1900になり、2006が返されたす。私のアプリケヌションは、5幎の違いがあるこずを確認し、それを゚ラヌず芋なし、ログに蚘録しお、フォヌマットされおいない倀を返したした。



これを回避するために、私はこれを曞きたした疑䌌コヌド



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,000の日付すべおが正しく解析されたした。



倧芏暡な印刷ゞョブの真っ只䞭に



1980幎代初頭、私の父は、高速テヌプ送り甚のテヌプドラむブず空気圧システムを構築しおいた廃止されたビゞネスナニットであるStorageTechnologyで働いおいたした。



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



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



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



1人のクラむアントに問題がありたした。印刷ゞョブの途䞭で、特定のドラむブ「A」が動䜜を停止し、ゞョブ党䜓が起動する可胜性がありたす。ドラむブを動䜜に戻すには、スタッフがすべおを再起動する必芁がありたした。そしお、これが6時間のタスクの途䞭で発生した堎合、膚倧な量の高䟡なコンピュヌタヌ時間が無駄になり、操䜜党䜓のスケゞュヌルが䞭断されたした。



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



次に、技術者は本郚に電話し、専門家に電話したした。



審査官は怅子ず䞀杯のコヌヒヌを手に取り、コンピュヌタヌ宀に座りたした-圓時はコンピュヌタヌ専甚の郚屋がありたした-そしおスタッフが倧きな印刷物の仕事を列に䞊べるのを芋たした。専門家は倱敗が起こるのを埅ちたした-そしおそれは起こりたした。誰もが゚キスパヌトを芋たした-そしお圌はなぜこれが起こったのか分かりたせんでした。そのため、圌はタスクを再びキュヌに入れるように呜什し、技術者を持぀すべおの埓業員が仕事に戻りたした。



専門家は再び怅子に腰を䞋ろし、倱敗を埅ちたした。玄6時間かかり、故障が発生したした。専門家は、すべおが人でいっぱいの郚屋で起こったこずを陀いお、再び考えを持っおいたせんでした。圌は任務を再開するように呜じ、再び座っお埅った。



3番目のグリッチたでに、゚キスパヌトは䜕かに気づきたした。担圓者が倖付けドラむブのベルトを亀換したずきに障害が発生したした。さらに、埓業員の1人が床の特定のタむルを通過するずすぐにクラッシュが発生したした。



隆起した床は、高さ6〜8むンチのアルミニりムタむルでできおいたした。誰かが誀っお重芁なケヌブルを螏たないように、倚数のコンピュヌタヌケヌブルが隆起した床の䞋を走っおいたした。タむルは、砎片が隆起した床の䞋に入るのを防ぐために非垞にしっかりず眮かれたした。



専門家は、タむルの1぀が倉圢しおいるこずに気づきたした。埓業員がその角を螏んだずき、タむルは隣接するタむルに察しおその端をこすりたした。圌らはたた、タむルを接続しおいるプラ​​スチック郚品をこすり、それが静的な埮小攟電を匕き起こし、それが無線呚波数干枉を匕き起こした。



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



朮だ



物語は、ドックサむド゚リアのポヌツマス私は思うのオフィスの4階たたは5階にあるサヌバヌルヌムで行われたした。



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



サポヌト男...圌の名前はマヌクだったず思いたすが、それは問題ではありたせん...私は圌を知っおいるずは思いたせん。本圓に関係ありたせん。マヌクにずどたりたしょうね 優れた。



それで、数時間埌、マヌクが到着しリヌズからポヌツマスたで、パスは近くありたせん、サヌバヌの電源を入れ、すべおが問題なく機胜したした。兞型的なク゜サポヌト、顧客はそれに぀いお非垞に腹を立おたす。マヌクはログファむルを調べお、問題のないものを芋぀けたした。それからマヌクは電車に戻りたすたたは圌が取った茞送手段が䜕であれ、私が知る限りそれは足の䞍自由な牛だったかもしれたせん...たあ、それは問題ではありたせん、いいですかそしおリヌズに戻っお䞀日を無駄にしたす。



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



別の電車、バス、レモンメリンゲたたは他のでたらめ、そしおマヌクはポヌツマスに戻っおきたした。ほら、サヌバヌは問題なく起動したす奇跡。マヌクは、オペレヌティングシステムたたは゜フトりェアにすべおが正垞であるこずを数時間チェックし、リヌズに行きたす。



日䞭頃、サヌバヌがクラッシュしたす気楜に。今回は、ハヌドりェアサポヌト担圓者を招いおサヌバヌを亀換するのが賢明なようです。しかし、いや、玄10時間埌にも萜ちたす。



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



気にせず䞀週間が過ぎたした...みんな幞せでした。すべおが再び始たるたで幞せです。写真は同じです。 10時間の䜜業、2〜3時間のダりンタむム..。



そしお、誰かこの人はITずは䜕の関係もないず私に蚀ったず思いたす



は、「これは朮流です」ず蚀いたした。



叫び声は真っ癜な芖線で迎えられ、おそらく誰かの手がボタンを振っお譊備員を呌んだ。



「圌は朮流で働くのをやめたす。」



これは、コヌヒヌを飲みながらタむドむダヌブックをほずんど読たないITサポヌトスタッフにずっおは、たったく異質な抂念のように思えたす。サヌバヌは問題なく1週間皌働しおいたため、朮流ずは䜕の関係もないず圌らは説明したした。



「先週は䜎朮で、今週は高朮でした。」



ペットを操䜜するラむセンスを持っおいない人のためのちょっずした甚語。朮流は月の呚期に䟝存したす。そしお、地球が回転するず、12.5時間ごずに、倪陜ず月の匕力が接波を発生させたす。 12.5時間のサむクルの開始時に満朮があり、サむクルの途䞭に匕き朮があり、満朮の終わりに再び満朮がありたす。しかし、月の軌道が倉わるず、匕き朮ず流れの違いも倉わりたす。月が倪陜ず地球の間にあるずき、たたは地球の反察偎満月たたは月がないにあるずき、私たちはSyzygy朮を取埗したす-最高朮ず最䜎朮。半月になるず、盎亀朮流、぀たり最䜎朮流が発生したす。 2぀の極端な違いは倧幅に枛少したす。月の呚期は28日間続きたすsyzygy-quadrature-syzygy-quadrature。



朮汐力が技術者に説明されたずき、圌らはすぐに譊察を呌ぶこずを考えたした。そしおそれは非垞に論理的です。しかし、その男は正しかったこずが刀明したした。2週間前、駆逐艊がオフィスの近くにドッキングしおいたした。朮がそれを特定の高さに䞊げるたびに、船のレヌダヌポストはサヌバヌルヌムの床のレベルになりたす。そしお、レヌダヌたたは電子戊闘装眮、たたは軍の他のおもちゃはコンピュヌタヌに混乱を匕き起こしたした。



ロケットの飛行任務



新しいバヌゞョンのオペレヌティングシステム、コンパむラ、および蚀語甚に、倧芏暡な玄40䞇行ミサむル発射制埡および監芖システムを移怍するように指瀺されたした。より正確には、Solaris7䞊のSolaris2.5.1から、およびAda83で蚘述されたVerdixAda Development SystemVADSからAda95で蚘述されたRationalApex Adaシステムぞ。VADSはRationalによっお賌入され、その補品は廃止されたしたが、Rational Apexコンパむラぞの移行を容易にするために、VADS固有のパッケヌゞの互換性のあるバヌゞョンを実装しようずしたした。



きれいにコンパむルされたコヌドを取埗するために、3人の人が私を助けおくれたした。 2週間かかりたした。そしお、私は自分でシステムを機胜させるために働きたした。芁するに、これは私が今たで遭遇した䞭で最悪のアヌキテクチャず゜フトりェアシステムの実装だったので、移怍を完了するのにさらに2か月かかりたした。その埌、システムはテストのために匕き枡され、さらに数か月かかりたした。テスト䞭に芋぀けたバグをすぐに修正したしたが、その数はすぐに枛少したした゜ヌスコヌドは実皌働システムであったため、その機胜は非垞に確実に機胜し、新しいコンパむラに適応するずきに発生したバグを削陀する必芁がありたした。結局、すべおが正垞に機胜したずき、私は別のプロゞェクトに移されたした。



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



箄3週間埌、ロケットの発射がテストされ、カりントダりンの実隓宀テストでは、コマンドのシヌケンスがブロックされたした。実生掻では、これはテストの䞭断に぀ながり、゚ンゞンを始動しおから数秒以内に閉塞が発生した堎合、補助システムでいく぀かの䞍可逆的なアクションが発生し、ロケットの再準備に時間がかかり、費甚がかかりたす。それは始たりたせんが、倚くの人々は時間の損倱ず非垞に非垞に倧きなお金に非垞に腹を立おるでしょう。囜防省が䞍甚意にお金を䜿っおいるず誰にも蚀わせないでください。予算が最初でも2番目でもない、スケゞュヌルが続く1人の契玄マネヌゞャヌにただ䌚っおいたせん。



前の月に、このカりントダりンテストは倚くのバリ゚ヌションで䜕癟回も実行されたしたが、わずかな問題がありたした。したがっお、これが発生する可胜性は非垞に䜎いですが、その結果は非垞に重芁でした。これらの䞡方の芁玠を掛け合わせるず、ニュヌスが私ず数十人の゚ンゞニアずマネヌゞャヌにずっお台無しにされた䌑日の週を予枬したこずが理解できたす。



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



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



圌らがコンパむラを開発し、圌らが開発したルヌチンのいく぀かが疑わしいコヌドで呌び出されたので、私たちはApexからRationalに人々を呌びたした。圌らそしお他のすべおの人は、文字通りの囜家的重芁性の問題の原因を芋぀ける必芁性に感銘を受けたした。



ログには䜕も面癜いものがなかったので、地元の研究所で問題を再珟するこずにしたした。むベントは玄1000回の実行ごずに発生するため、これは簡単な䜜業ではありたせんでした。考えられる理由の1぀は、ベンダヌが開発したミュヌテックス関数VADS移行バッチの䞀郚の呌び出しでした。Unlockロック解陀には至りたせんでした。呌び出し元のスレッドは、名目䞊1秒ごずに到着するハヌトビヌトメッセヌゞを凊理したした。呚波数を10Hz、぀たり1秒間に10回に䞊げお、実行を開始したした。玄1時間埌、システムはロックされたした。ログでは、蚘録されたメッセヌゞのシヌケンスが倱敗したテスト䞭ず同じであるこずがわかりたした。さらに数回実行するず、システムは開始埌45〜90分で安定しおブロックされ、ログに同じトラックが含たれるたびにブロックされたした。珟圚、技術的に異なるコヌドを実行しおいたしたがメッセヌゞレヌトが異なりたした、システムの動䜜が繰り返されたため、このロヌドシナリオで同じ問題が発生するこずを確認したした。



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



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



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



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



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



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



タスク、列挙型、およびその型のグロヌバル倉数を含むAdaパッケヌゞを䜜成したした。列挙リテラルは、特定の衚珟問題の配列䟋えば、に接続されたしたIncrementing_Buffer_Index、Locking_Mutex、Mutex_Unlocked、次に割り圓お匏を挿入し、察応する列挙をグロヌバル倉数に割り圓おたした。これらすべおのオブゞェクトコヌドは単にメモリ内で䞀定に保たれおいるため、実行の結果ずしおタスクが切り替わる可胜性はほずんどありたせん。たず、実行䞭にブロッキングが発生し、タスクを元に戻すずきに戻らないため、タスクを切り替えるこずができる匏を疑ったいく぀かの理由で。



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



システムが問題のあるコヌドの実行に達するず、グロヌバル倉数は次の匏ごずにリセットされるこずが期埅されおいたした。その埌、䜕かが起こり、タスクの切り替えが発生し、その実行頻床10 Hzが監芖タスクの頻床よりも䜎いため、モニタヌはグロヌバル倉数の倀を固定しお曞き蟌むこずができたす。通垞の状況では、列挙のサブセットの繰り返しシヌケンスを取埗できたすタスク切り替え時の倉数の最埌の倀。ハングしおいるずき、グロヌバル倉数はそれ以䞊倉曎されるべきではなく、最埌に曞き蟌たれた倀は、どの匏が実行を完了しなかったかを瀺したす。



トラッキングコヌドを起動したした。凍っおいたす。そしお、監芖は時蚈仕掛けのように機胜したした。



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



この時点でApexの゚ンゞニアは必死にコヌドを分析し、理論的にはロックが発生する可胜性のあるミュヌテックス内の堎所を芋぀けたした。しかし、特定の時間に発生する特定の䞀連のむベントのみが閉塞に぀ながる可胜性があるため、その確率は非垞に小さかった。マヌフィヌの法則、男の子、それはマヌフィヌの法則です。



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



それをコヌドに貌り付けお、テストを実行したした。 7時間埌、コヌドは匕き続き機胜したした。



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



それは私のキャリアの䞭で最も混雑したコヌドレビュヌでした:)私ず䞀緒の郚屋には玄10人の゚ンゞニアずマネヌゞャヌがいお、さらに12人が䌚議の電話で぀ながりたした-そしお圌らはすべお玄20行のコヌドを調べたした。



コヌドがレビュヌされ、新しい実行可胜ファむルが䜜成され、正匏な回垰テストのために送信されたした。数週間埌、カりントダりンテストが成功し、ロケットが離陞したした。



さお、これはすべお良くお矎しいですが、この話のポむントは䜕ですか



それは完党に嫌な問題でした。数十䞇行のコヌド、䞊列実行、12を超える盞互䜜甚するプロセス、䞍十分なアヌキテクチャず䞍十分な実装、組み蟌みシステムのむンタヌフェむス、および数癟䞇ドルの費甚。プレッシャヌはありたせんよね。



この問題に取り組んでいるのは私だけではありたせんでしたが、移怍を行っおいるずきに脚光を济びおいたした。しかし、私がそれを行ったずしおも、これは、私が数十䞇行のコヌドすべおを理解した、たたは少なくずもそれらをざっず読んだずいう意味ではありたせん。コヌドずログは党囜の゚ンゞニアによっお分析されたしたが、圌らが倱敗の原因に぀いお圌らの仮説を私に蚀ったずき、私はそれらを論駁するのに30分かかりたした。そしお、理論を分析するように頌たれたずき、私はそれを他の誰かに枡したした。なぜなら、これらの゚ンゞニアが間違った方向に進んでいるこずが私には明らかだったからです。傲慢に聞こえたすかはい、そうですが、私は別の理由で仮説ず芁求を拒吊したした。



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



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



コヌドずの闘いのそのような話は、そのような闘争の特殊性ず条件に粟通しおいない人にずっおはあたり興味深いものではありたせん。しかし、これらのストヌリヌは、本圓に難しい問題を解決するために䜕が必芁かを理解するのに圹立ちたす。



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



そしお、あなたはあなたの甘やかされお育った䌑日の週を持っおいたす。






぀づく。



All Articles