Бағдарламашылар мен инженерлердің фольклоры (1 бөлім)

Бағдарламашылар мен инженерлердің фольклоры (1 бөлім)

Бұл қателердің кейде мүлдем керемет көріністерге ие болатыны туралы Интернеттегі әңгімелердің таңдауы. Мүмкін сіздің де айтарыңыз бар шығар.

Ванильді балмұздаққа автокөлік аллергиясы

Ашық нәрсе әрқашан жауап бола бермейтінін және фактілер қаншалықты алыс болып көрінсе де, олар әлі де фактілер екенін түсінетін инженерлерге арналған оқиға. General Motors корпорациясының Понтиак бөлімшесіне шағым түсті:

Мен сізге екінші рет жазып отырмын және жауап бермегеніңіз үшін сізді кінәламаймын, өйткені бұл ақылсыз болып көрінеді. Біздің отбасында күн сайын кешкі астан кейін балмұздақ жеу дәстүрі бар. Балмұздақтың түрлері әр уақытта өзгеріп отырады, кешкі астан кейін бүкіл отбасы қай балмұздақты сатып алу керектігін таңдайды, содан кейін мен дүкенге барамын. Жақында мен жаңа Pontiac сатып алдым, содан бері балмұздақ алуға сапарларым проблемаға айналды. Көрдіңіз бе, ванильді балмұздақ сатып алып, дүкеннен қайтқан сайын көлік оталмай қалады. Басқа балмұздақ әкелсем, көлік еш қиындықсыз іске қосылады. Қаншалықты ақымақ болып көрінсе де, мен байыпты сұрақ қойғым келеді: «Понтиактың несі мен ванильді балмұздақ әкелгенде басталмай, балмұздақтың басқа дәмін әкелгенде оңай басталады?»

Өзіңіз ойлағандай, бөлім президенті хатқа күмәнмен қарады. Әйтсе де, мен инженерді тексеруге жібердім. Әдемі өлкеде тұратын бай, білімді адамның алдынан шыққанына таң қалды. Екеуі дүкенге балмұздақ жеу үшін кешкі астан кейін бірден кездесуге келісті. Сол күні кешке ваниль болды, олар көлікке қайтып келгенде, ол қосылмады.

Инженер тағы үш кеште келді. Бірінші рет балмұздақ шоколад болды. Көлік жүре бастады. Екінші рет құлпынайдан жасалған балмұздақ болды. Көлік жүре бастады. Үшінші кеште ол ванилин алуды өтінді. Көлік іске қосылмады.

Рационалды түрде пайымдай отырып, инженер көліктің ванильді балмұздақта аллергиясы бар дегенге сенуден бас тартты. Сондықтан көлік иесімен келісіп, мәселенің шешімін тапқанша сапарларын жалғастыра беретін болдым. Ал жол бойында ол қағазға түсіре бастады: ол барлық ақпаратты, тәулік уақытын, бензин түрін, дүкеннен келу және қайту уақытын және т.б. жазып алды.

Инженер көп ұзамай көлік иесінің ванильді балмұздақ сатып алуға аз уақыт жұмсағанын түсінді. Оған дүкендегі тауарлардың орналасуы себеп болған. Ванильді балмұздақ ең танымал болды және оны табуды жеңілдету үшін дүкеннің алдыңғы жағындағы бөлек мұздатқышта сақталды. Ал қалған барлық сорттар дүкеннің артқы жағында болды және дұрыс сортты тауып, төлеуге әлдеқайда көп уақыт қажет болды.

Енді инженерге сұрақ қойылды: қозғалтқыш өшірілгеннен бері аз уақыт өтсе, неге көлік оталмай қалды? Мәселе ванильді балмұздақта емес, уақытта болғандықтан, инженер тез арада жауапты тапты: бұл газ құлыпы болды. Бұл әр кеш сайын болды, бірақ көлік иесі балмұздақ іздеуге көбірек уақыт жұмсаған кезде, қозғалтқыш жеткілікті суытып, оңай қосылды. Ал ер адам ванильді балмұздақ сатып алғанда, қозғалтқыш әлі тым қызып, газ құлпы еріп үлгермеген.

Моральдық: Тіпті мүлдем ақылсыз мәселелер кейде шынайы.

апаты Bandicoot

Мұны бастан кешіру өте ауыр. Бағдарламашы ретінде сіз өз кодыңызды бірінші, екінші, үшінші... және он мыңыншы орында компиляторды кінәлауға дағдыланасыз. Ал тізімнің төменгі жағында сіз жабдықты кінәлайсыз.

Міне, аппараттық қате туралы менің әңгімем.

Crash Bandicoot ойыны үшін жад картасына жүктеу және сақтау үшін код жаздым. Мұндай масқара ойын әзірлеушісі үшін бұл саябақта серуендеу сияқты болды: мен жұмыс бірнеше күнге созылады деп ойладым. Дегенмен, мен алты апта бойы кодты жөндеуді аяқтадым. Жолда мен басқа мәселелерді шештім, бірақ бірнеше күн сайын мен бірнеше сағат бойы осы кодқа оралдым. Бұл азап болды.

Симптом келесідей болды: ойынның ағымдағы ойнатылуын сақтап, жад картасына қол жеткізгенде, бәрі дерлік жақсы жүреді... Бірақ кейде оқу немесе жазу әрекеті ешбір себепсіз үзіліп қалады. Қысқа жазба жад картасын жиі зақымдайды. Ойыншы құтқаруға тырысқанда, ол сақтап қана қоймай, картаны да бұзады. Қырсық.

Біраз уақыттан кейін Sony-дегі продюсеріміз Конни Бус үрейлене бастады. Біз бұл қатемен ойынды жібере алмадық, ал алты аптадан кейін мен бұл мәселеге не себеп болғанын түсінбедім. Конни арқылы біз басқа PS1 әзірлеушілерімен байланысқа шықтық: біреу осындай нәрсеге тап болды ма? Жоқ. Ешкімде жад картасымен проблемалар болған жоқ.

Түзетуге қатысты идеяларыңыз болмаған кезде, «бөлу және жеңу» жалғыз әдіс қалады: ақаулықты тудыратын салыстырмалы түрде шағын фрагмент қалғанша ақаулы бағдарламадан көбірек кодты алып тастаңыз. Яғни, қатесі бар бөлік қалғанша бағдарламаны бөлшектеп кесіп тастайсыз.

Бірақ мәселе мынада, бейне ойынның бөліктерін қиып алу өте қиын. Гравитацияны эмуляциялайтын кодты алып тастасаңыз, оны қалай іске қосу керек? Немесе кейіпкерлердің суретін салу керек пе?

Сондықтан, біз барлық модульдерді пайдалы бірдеңе жасайтындай етіп көрсететін, бірақ шын мәнінде қателерді қамтымайтын өте қарапайым нәрсені жасайтын түйреуіштермен ауыстыруымыз керек. Ойын кем дегенде жұмыс істеуі үшін осындай балдақтарды жазуымыз керек. Бұл баяу және ауыр процесс.

Қысқасы, мен жасадым. Ойынды іске қосу үшін жүйені конфигурациялайтын, көрсету аппаратурасын инициализациялайтын және т.б. бастапқы код қалғанша, мен көбірек код бөліктерін алып тастадым. Әрине, бұл кезеңде мен сақтау және жүктеу мәзірін жасай алмадым, өйткені барлық графикалық код үшін stub жасау керек еді. Бірақ мен (көрінбейтін) сақтау және жүктеу экранын қолданатын пайдаланушы болып көрініп, сақтауды және жад картасына жазуды сұрай аламын.

Бұл маған әлі де жоғарыда аталған мәселеге ие болатын кішкене кодты қалдырды - бірақ ол әлі де кездейсоқ болды! Көбінесе бәрі жақсы жұмыс істеді, бірақ кейде ақаулар болды. Мен барлық дерлік ойын кодын алып тастадым, бірақ қате әлі де тірі болды. Бұл таңқаларлық болды: қалған код іс жүзінде ештеңе жасамады.

Бір кезде, түнгі үштер шамасында, менің басыма бір ой келді. Оқу және жазу (енгізу/шығару) операциялары нақты орындау уақытын қамтиды. Қатты дискімен, жад картасымен немесе Bluetooth модулімен жұмыс істегенде, оқу және жазу үшін жауапты төмен деңгейлі код мұны сағат импульстарына сәйкес жасайды.

Сағаттың көмегімен процессорға тікелей қосылмаған құрылғы процессорда орындалатын кодпен синхрондалады. Сағат беру жылдамдығын — деректерді тасымалдау жылдамдығын анықтайды. Уақыттармен шатасу болса, аппараттық құрал немесе бағдарламалық құрал немесе екеуі де шатастырылады. Және бұл өте нашар, себебі деректер зақымдалуы мүмкін.

Егер біздің кодымыздағы бір нәрсе уақытты шатастырса ше? Мен сынақ бағдарламасының кодында осыған қатысты барлығын тексердім және біз PS1-де бағдарламаланатын таймерді 1 кГц (секундына 1000 кене) орнатқанымызды байқадым. Бұл өте көп; әдепкі бойынша консоль іске қосылғанда ол 100 Гц жиілікте жұмыс істейді. Ал ойындардың көпшілігі осы жиілікті пайдаланады.

Ойын әзірлеушісі Энди қозғалыстар дәлірек есептелуі үшін таймерді 1 кГц-ке орнатты. Энди шектен шығуға бейім, және егер біз гравитацияға еліктесек, біз оны мүмкіндігінше дәл жасаймыз!

Бірақ таймерді жылдамдату қандай да бір түрде бағдарламаның жалпы уақытына, демек, жад картасының беру жылдамдығын реттейтін сағатқа әсер етсе ше?

Мен таймер кодын түсіндірдім. Қате қайталанбады. Бірақ бұл біз оны түзеттік дегенді білдірмейді, себебі сәтсіздік кездейсоқ орын алды. Менің жолым болса ше?

Бірнеше күннен кейін мен сынақ бағдарламасымен қайтадан тәжірибе жасадым. Қате қайталанбады. Ойынның толық кодтық базасына қайта оралдым және жад картасына қол жеткізбес бұрын бағдарламаланатын таймер бастапқы мәніне (100 Гц) ысыруы үшін сақтау және жүктеу кодын өзгерттім, содан кейін 1 кГц қалпына келтірілді. Басқа апаттар болған жоқ.

Бірақ неге бұлай болды?

Мен тест бағдарламасына қайта оралдым. Мен 1 кГц таймермен қатенің пайда болуының кейбір үлгісін табуға тырыстым. Ақырында қате біреу PS1 контроллерімен ойнағанда пайда болатынын байқадым. Мен мұны өзім сирек жасайтындықтан - сақтау және жүктеу кодын сынау кезінде контроллер не үшін қажет? - Мен бұл тәуелділікті байқамадым да. Бірақ бір күні біздің әртістердің бірі тестілеуді аяқтауымды күтіп тұрды - мен сол кезде қарғыс айтқан шығармын - және қобалжыған күйде қолындағы контроллерді айналдырды. Қате орын алды. «Тоқта, не?!». Жарайды, қайталаңыз!»

Осы екі оқиғаның бір-бірімен байланысты екенін түсінгенде, мен қатені оңай қайталай алдым: жад картасына жазуды бастадым, контроллерді жылжыттым және жад картасын бүлдірдім. Мен үшін бұл аппараттық қате сияқты көрінді.

Мен Конниге келіп, жаңалығым туралы айттым. Ол ақпаратты PS1 құрастырған инженерлердің біріне жеткізді. «Мүмкін емес», - деп жауап берді ол, «Бұл аппараттық құрал проблемасы болуы мүмкін емес». Мен Конниден біз үшін әңгіме ұйымдастыруды өтіндім.

Инженер мені шақырды, біз оның бұзылған ағылшын тілінде және менің (өте) сынған жапон тілінде таластық. Ақырында мен: «Контроллерді жылжыту қате тудыратын 30 жолдық сынақ бағдарламамды жіберуге рұқсат етіңіз» дедім. Ол келісті. Бұл уақытты босқа кетіргенін және ол жаңа жобада жұмыстан бос емес екенін, бірақ біз Sony үшін өте маңызды әзірлеуші ​​болғандықтан берілетінін айтты. Мен сынақ бағдарламамды тазалап, оған жібердім.

Келесі күні кешке (біз Лос-Анджелесте, ол Токиода болды) ол маған қоңырау шалып, кешірім сұрады. Бұл аппараттық мәселе болды.

Мен қатенің нақты не екенін білмеймін, бірақ Sony штаб-пәтерінде естігенім бойынша, егер сіз таймерді жеткілікті жоғары мәнге орнатсаңыз, ол таймер кристалының маңындағы аналық платадағы компоненттерге кедергі келтірді. Олардың бірі жад картасына арналған жіберу жылдамдығы контроллері болды, ол сонымен қатар контроллерлер үшін жіберу жылдамдығын орнатты. Мен инженер емеспін, сондықтан бір нәрсені бүлдіріп алған шығармын.

Бірақ қорытынды: аналық платадағы компоненттер арасында кедергі болды. Ал 1 кГц жиілікте жұмыс істейтін таймері бар контроллер порты мен жад картасы порты арқылы деректерді бір уақытта жіберу кезінде биттер жоғалып, деректер жоғалып, карта зақымдалған.

Жаман сиырлар

1980 жылдары менің тәлімгерім Сергей PDP-1800 кеңестік клоны SM-11 үшін бағдарламалық жасақтаманы жазды. Бұл микрокомпьютер КСРО-дағы маңызды көлік торабы саналатын Свердловск маңындағы теміржол вокзалында жаңа ғана орнатылды. Жаңа жүйе вагондар мен жүк тасымалын бағыттауға арналған. Бірақ онда кездейсоқ бұзылулар мен бұзылуларға әкелетін тітіркендіргіш қате бар. Біреу кешке үйге барған кезде құлау үнемі болатын. Бірақ келесі күні мұқият тексеруге қарамастан, компьютер барлық қолмен және автоматты сынақтарда дұрыс жұмыс істеді. Бұл әдетте белгілі бір жағдайларда орын алатын жарыс жағдайын немесе басқа бәсекелес қатені көрсетеді. Түнгі қоңыраулардан шаршаған Сергей мұның түбіне жетуді ұйғарды және ең алдымен компьютердің істен шығуына маршалдағы қандай жағдай әкелгенін түсінді.

Біріншіден, ол барлық түсініксіз құлаулардың статистикасын жинап, күні мен уақыты бойынша график құрады. Үлгі айқын болды. Тағы бірнеше күн бақылаған Сергей болашақ жүйе ақауларының уақытын оңай болжай алатынын түсінді.

Көп ұзамай ол станцияның Украинаның солтүстігінен және Ресейдің батысынан келетін пойыз жүктерін ірі қара малды жақын маңдағы мал сою пунктіне жөнелткен кезде ғана үзілістердің болғанын білді. Бұл өз алдына біртүрлі болды, өйткені мал сою алаңын Қазақстаннан әлдеқайда жақын орналасқан шаруашылықтар қамтамасыз етті.

1986 жылы Чернобыль атом электр стансасы жарылып, радиоактивті ағындар оның маңындағы елді мекендерді өмір сүруге жарамсыз етті. Украинаның солтүстігіндегі, Белоруссиядағы және Ресейдің батысындағы кең аумақтар ластанған. Келген вагондардағы радиацияның жоғары деңгейіне күдіктенген Сергей бұл теорияны тексеру әдісін ойлап тапты. Халыққа дозиметрлерді ұстауға тыйым салынды, сондықтан Сергей теміржол вокзалында бірнеше әскерилерге тіркелді. Бірнеше рет арақ ішкеннен кейін ол күдікті вагондардың бірінде сарбазды радиация деңгейін өлшеуге көндірді. Деңгейі қалыпты мәндерден бірнеше есе жоғары болып шықты.

Малдың радиацияның көп бөлінуі ғана емес, оның деңгейінің жоғары болғаны соншалық, станцияның жанындағы ғимаратта орналасқан СМ-1800 жадындағы биттердің кездейсоқ жоғалуына әкелді.

КСРО-да азық-түлік тапшылығы орын алып, билік Чернобыль етін еліміздің басқа аймақтарының етін араластыруға шешім қабылдады. Бұл құнды ресурстарды жоғалтпай радиоактивтіліктің жалпы деңгейін төмендетуге мүмкіндік берді. Бұл туралы білген Сергей бірден эмиграцияға құжаттарды толтырды. Ал радиация деңгейі уақыт өте азайған кезде компьютердің істен шығуы өздігінен тоқтады.

Құбырлар арқылы

Бір кездері Movietech Solutions кинотеатрлар үшін бухгалтерлік есеп, билеттерді сату және жалпы басқаруға арналған бағдарламалық құрал жасады. Флагмандық қолданбаның DOS нұсқасы Солтүстік Америкадағы шағын және орта деңгейдегі кинотеатрлар желілері арасында өте танымал болды. Ең соңғы сенсорлық экрандармен және өзіне-өзі қызмет көрсету дүңгіршектерімен біріктірілген және есеп беру құралдарының барлық түрлерімен жабдықталған Windows 95 нұсқасы жарияланған кезде оның да тез танымал болғаны таңқаларлық емес. Көбінесе жаңарту проблемаларсыз өтті. Жергілікті IT қызметкерлері жаңа жабдықты орнатып, деректерді көшірді және бизнес жалғасты. Бұл ұзаққа созылмаған кезден басқа. Бұл орын алғанда, компания «Тазалаушы» лақап аты бар Джеймсті жібереді.

Лақап аты жағымсыз түрді білдірсе де, тазартқыш - бұл нұсқаушы, орнатушы және барлық кәсіптердің қосындысы. Джеймс бірнеше күн клиенттің сайтында барлық құрамдастарды біріктіреді, содан кейін қызметкерлерге жаңа жүйені қалай пайдалану керектігін үйретіп, туындаған кез келген аппараттық құралдар мәселелерін шешуге және бағдарламалық жасақтамаға бастапқы кезінде көмектесуге тағы екі күн жұмсайды.

Сондықтан, осынау қарбалас уақытта Джеймс кеңсеге таңертең келіп, үстеліне жете алмай тұрғанда, оны менеджер әдеттегіден артық кофеинге толтырып қарсы алғаны таңқаларлық емес.

«Мен сізге тезірек Аннаполиске, Жаңа Шотландияға баруыңыз керек деп қорқамын». Олардың бүкіл жүйесі істен шықты және инженерлерімен бір түн жұмыс істегеннен кейін біз не болғанын анықтай алмаймыз. Серверде желі сәтсіз болған сияқты. Бірақ жүйе бірнеше минут жұмыс істегеннен кейін ғана.

— Олар ескі жүйеге оралмады ма? – деп жауап берді Джеймс, ойша ол таңдана көзін бақырайтқанымен.

— Дәл: олардың IT маманы «басымдықтарды өзгертті» және ескі серверімен кетуге шешім қабылдады. Джеймс, олар жүйені алты сайтқа орнатты және тек премиум қолдау үшін төледі және олардың бизнесі қазір 1950 жылдардағыдай жұмыс істейді.

Джеймс сәл тіктелді.

- Бұл басқа мәселе. Жарайды, бастайық.

Ол Аннаполиске келген кезде, ол бірінші орында клиенттің проблемасы бар бірінші театрын тапты. Әуежайда түсірілген картада бәрі тәп-тәуір көрінгенімен, қалаған мекен-жайдың айналасы күдікті болып көрінді. Гетто емес, киноноирді еске түсіреді. Джеймс қала орталығындағы жол жиегіне тоқтаған кезде, оған бір жезөкше жақындады. Аннаполистің көлемін ескере отырып, бұл бүкіл қаладағы жалғыз болды. Оның сыртқы келбеті бірден үлкен экранда ақшаға жыныстық қатынасты ұсынған әйгілі кейіпкерді еске алды. Жоқ, Джулия Робертс туралы емес, Джон Войт туралы [«Түн ортасында ковбой» фильміне тұспалдау – шамамен. жолақ].

Жезөкшені жолға жіберген Джеймс кинотеатрға барды. Айнала жақсарды, бірақ ол әлі де тозғандай әсер қалдырды. Джеймс қатты уайымдағаны емес. Ол бұрын бейшара жерлерге барған. Бұл Канада болды, онда тіпті тонаушылар әмияныңызды алған соң «рахмет» деп сыпайы болады.

Кинотеатрдың бүйіріндегі кіреберісі қараңғы аллеяда болды. Джеймс есікке барып, қағады. Көп ұзамай ол сықырлап, сәл ашылды.

-Сен тазалықшысың ба? – деген дауыс естілді іштен.

- Иә, менмін... Мен бәрін жөндеуге келдім.

Джеймс кинотеатрдың вестибюльіне кірді. Басқа амалы болмаған сияқты, қызметкерлер келушілерге қағаз билеттерін тарата бастады. Бұл қызықты мәліметтерді айтпағанда, қаржылық есептілікті қиындатты. Бірақ қызметкерлер Джеймсті жеңілдікпен қарсы алып, оны дереу сервер бөлмесіне апарды.

Бір қарағанда бәрі жақсы болды. Джеймс серверге кіріп, әдеттегі күдікті жерлерді тексерді. Проблема жоқ. Дегенмен, көп сақтықпен Джеймс серверді өшіріп, желі картасын ауыстырды және жүйені кері қайтарды. Ол бірден толық жұмысқа кірісті. Қызметкерлер қайтадан билеттерді сата бастады.

Джеймс Маркқа телефон соғып, жағдайды хабарлады. Джеймс бір жерде тұрып, күтпеген нәрсе болғанын көргісі келетінін елестету қиын емес. Ол баспалдақпен төмен түсіп, қызметкерлерден не болғанын сұрай бастады. Жүйенің жұмысын тоқтатқаны анық. Олар оны өшірді және қосты, бәрі жұмыс істеді. Бірақ 10 минуттан кейін жүйе істен шықты.

Дәл осы сәтте ұқсас нәрсе болды. Кенеттен билет сату жүйесі қателіктер жібере бастады. Қызметкерлер күрсініп, қағаз билеттерін алды, ал Джеймс сервер бөлмесіне асығады. Серверде бәрі жақсы көрінді.

Сол кезде қызметкерлердің бірі ішке кірді.

— Жүйе қайтадан жұмыс істеп жатыр.

Джеймс ештеңе істемегендіктен таң қалды. Дәлірек айтқанда, жүйенің жұмыс істеуіне ықпал ететін ештеңе жоқ. Ол жүйеден шығып, телефонын алып, компаниясының қолдау желісіне қоңырау шалды. Көп ұзамай сол қызметкер сервер бөлмесіне кірді.

- Жүйе істен шықты.

Джеймс серверге қарады. Экранда түрлі-түсті пішіндердің қызықты және таныс үлгісі биледі - ретсіз бұралған және бір-бірімен араласатын құбырлар. Біз бәріміз бұл экран сақтағышты бір сәтте көрдік. Бұл әдемі көрсетілді және гипнозды болды.


Джеймс түймені басып, үлгі жоғалып кетті. Ол кассаға асығып, жолда өзіне қайтып келе жатқан қызметкерді кездестірді.

— Жүйе қайтадан жұмыс істеп жатыр.

Егер сіз ақыл-ойды жасай алсаңыз, Джеймс дәл осылай жасады. Скринсейвер. Ол OpenGL пайдаланады. Сондықтан жұмыс кезінде ол сервер процессорының барлық ресурстарын тұтынады. Нәтижесінде серверге әрбір қоңырау күту уақытымен аяқталады.

Джеймс сервер бөлмесіне оралды, жүйеге кірді және экран сақтағышты бос экраны бар әдемі құбырлармен ауыстырды. Яғни, процессор ресурстарын 100% тұтынатын экран сақтағышының орнына ресурстарды тұтынбайтын басқасын орнаттым. Содан кейін мен өз болжамымды тексеру үшін 10 минут күттім.

Джеймс келесі кинотеатрға келгенде менеджеріне экран сақтағышты өшіру үшін жаңа ғана 800 шақырымға ұшып кеткенін қалай түсіндіруге болатынын ойлады.

Айдың белгілі бір фазасындағы апат

Шын болған оқиға. Бір күні айдың фазасына байланысты бағдарламалық құрал қатесі пайда болды. Әртүрлі MIT бағдарламаларында Айдың шынайы фазасына жуықтауды есептеу үшін әдетте қолданылатын кішкене тәртіп болды. GLS бұл процедураны LISP бағдарламасына құрастырды, ол файлды жазғанда ұзындығы шамамен 80 таңбадан тұратын уақыт белгісі бар жолды шығарады. Хабарламаның бірінші жолы тым ұзын болып аяқталып, келесі жолға апаратыны өте сирек болатын. Бағдарлама кейінірек бұл файлды оқығанда, ол қарғыс айтты. Бірінші жолдың ұзындығы нақты күн мен уақытқа, сондай-ақ уақыт белгісі басып шығарылған кездегі фаза сипаттамасының ұзақтығына байланысты болды. Яғни, қате айдың фазасына тікелей байланысты болды!

Алғашқы қағаз басылымы Жаргон файлы (Steele-1983) сипатталған қатеге әкелетін осындай жолдың мысалын қамтиды, бірақ теруші оны «түзетеді». Содан бері бұл «ай фазасының қатесі» ретінде сипатталды.

Дегенмен, болжамдармен абай болыңыз. Бірнеше жыл бұрын CERN (Еуропалық ядролық зерттеулер орталығы) инженерлері Үлкен электрон-позитрон коллайдерінде жүргізілген эксперименттерде қателіктерге тап болды. Нәтижені ғалымдарға көрсетпес бұрын компьютерлер осы құрылғы жасаған деректердің орасан зор көлемін белсенді түрде өңдейтіндіктен, көптеген адамдар бағдарламалық жасақтама ай фазасына қандай да бір түрде сезімтал болды деп болжады. Амалсыз бірнеше инженерлер шындықтың түбіне жетті. Қате Айдың өтуі кезінде Жердің деформациясына байланысты ұзындығы 27 км сақинаның геометриясының шамалы өзгеруіне байланысты пайда болды! Бұл әңгіме физика фольклорына «Ньютонның бөлшектер физикасынан кек алуы» және физиканың қарапайым және ең көне заңдары мен ең озық ғылыми тұжырымдамалар арасындағы байланыстың мысалы ретінде енді.

Дәретхананы жуу пойызды тоқтатады

Мен естіген ең жақсы аппараттық қате Франциядағы жүрдек пойызда болды. Қате пойыздың шұғыл тежеуіне әкелді, бірақ бортында жолаушылар болған жағдайда ғана. Әрбір осындай жағдайда пойыз жұмыстан шығарылды, тексерілді, бірақ ештеңе табылмады. Содан кейін оны қайтадан желіге жіберді, ол бірден тоқтады.

Тексерулердің бірінде пойызда келе жатқан инженер дәретханаға кіріп кеткен. Ол көп ұзамай жуып кетті, BOOM! Төтенше аялдама.

Инженер жүргізушіге хабарласып:

— Тежеу алдында не істеп жүр едіңіз?

- Е, мен түсуде баяуладым...

Бұл біртүрлі болды, өйткені қалыпты жұмыс кезінде пойыз түсу кезінде ондаған рет баяулайды. Пойыз жүрді де, келесі түскенде машинист ескертті:

- Мен жылдамдықты азайтамын.

Ештеңе болған жоқ.

— Соңғы тежеу ​​кезінде не істедің? – деп сұрады жүргізуші.

-Жарайды... мен әжетханада болдым...

-Жарайды, онда дәретханаға бар, біз тағы түскенде не істегеніңді істе!

Инженер дәретханаға барды, ал жүргізуші: «Мен жылдамдықты азайтамын» деп ескерткен кезде, ол суды ағызды. Әрине, пойыз бірден тоқтады.

Енді олар мәселені қайта шығара алады және себебін табу керек болды.

Екі минуттан кейін олар қозғалтқыш тежегішінің қашықтан басқару кабелінің (пойыздың екі ұшында бір қозғалтқышы бар) электр шкафының қабырғасынан ажыратылғанын және дәретхана штепсельінің электромагнитін басқаратын реледе жатқанын байқады ... Реле кезде қосылды, ол тежеу ​​кабеліне кедергі жасады және жүйені ақаулардан қорғауға жай ғана апаттық тежеу ​​кіреді.

FORTRAN-ды жек көретін шлюз

Бірнеше ай бұрын біз материктегі желілік байланыстардың (бұл Гавайиде болған) өте, өте баяу болғанын байқадық. Бұл 10-15 минутқа созылуы мүмкін, содан кейін кенеттен қайталануы мүмкін. Біраз уақыттан кейін әріптесім маған материктегі желі қосылымдары туралы шағымданды жалпы алғанда жұмыс істемейді. Оның материктегі құрылғыға көшірілуі қажет кейбір FORTRAN коды болды, бірақ ол мүмкін болмады, себебі «желі FTP жүктеп салуды аяқтау үшін жеткілікті ұзақ уақыт ұстамады».

Иә, әріптес FORTRAN тіліндегі бастапқы коды бар файлды материктегі құрылғыға FTP арқылы жіберуге әрекеттенген кезде желі ақаулары орын алды. Біз файлды мұрағаттауға тырыстық: содан кейін ол бірқалыпты көшірілді (бірақ мақсатты машинада ораушы болмағандықтан, мәселе шешілмеді). Соңында біз FORTRAN кодын өте кішкентай бөліктерге «бөліп», оларды бір-бірден жібердік. Фрагменттердің көпшілігі қиындықсыз көшірілді, бірақ бірнеше бөлік өтпеді немесе кейін өтті көптеген әрекеттері.

Проблемалық үзінділерді қарастырған кезде біз олардың ортақ бір жері бар екенін анықтадық: олардың барлығында C бас әріпінен тұратын жолдармен аяқталатын түсініктеме блоктары бар (әріптес FORTRAN тілінде түсініктеме беруді жөн көрген). Біз материктегі желі мамандарына электрондық хат жіберіп, көмек сұрадық. Әрине, олар FTP арқылы тасымалданбайтын файлдарымыздың үлгілерін көргісі келді... бірақ хаттарымыз оларға жетпеді. Ақырында біз қарапайым шешімге келдік сипаттаутасымалданбайтын файлдар қандай болады. Бұл жұмыс істеді :) [Осында проблемалық FORTRAN түсініктемелерінің бірінің мысалын қосуға батылым бар ма? Оған тұрарлық емес шығар!]

Ақырында біз оны анықтай алдық. Жақында кампусымыздың бөлігі мен материктік желі арасында жаңа шлюз орнатылды. Ол бас C әрпінің қайталанатын биттерін қамтитын пакеттерді жіберуде ҚОЛДАНБА қиындықтарға тап болды! Осы пакеттердің бірнешеуі ғана барлық шлюз ресурстарын алып, көптеген басқа пакеттердің өтуіне жол бермейді. Біз шлюз өндірушісіне шағымдандық... және олар жауап берді: «О, иә, сіз қайталанатын C қатесіне тап болдыңыз! Біз ол туралы бұрыннан білеміз». Ақырында біз басқа өндірушіден жаңа шлюз сатып алу арқылы мәселені шештік (бұрынғысының қорғауында FORTRAN бағдарламаларын тасымалдау мүмкін еместігі кейбіреулер үшін артықшылық болуы мүмкін!).

Қиын уақыт

Бірнеше жыл бұрын, 40-кезеңдегі клиникалық сынақтардың шығындарын азайту үшін Perl жүйесінде ETL жүйесін құрумен жұмыс істеген кезде, маған шамамен 000 1 күнді өңдеу керек болды. Олардың екеуі сынақтан өте алмады. Бұл мені қатты алаңдатпады, өйткені бұл күндер клиент ұсынған деректерден алынды, бұл жиі таңқаларлық болды. Бірақ бастапқы деректерді тексергенде бұл күндер 2011 жылдың 1 қаңтары мен 2007 жылдың 30 қаңтары болып шықты. Қате жаңа ғана жазған бағдарламамда бар деп ойладым, бірақ XNUMX жыл болып шықты. ескі. Бұл бағдарламалық жасақтаманың экожүйесімен таныс емес адамдар үшін жұмбақ болып көрінуі мүмкін. Басқа компания ұзақ уақыт бойы ақша табу туралы шешім қабылдағандықтан, менің клиентім маған бір компания кездейсоқ, екіншісі әдейі енгізген қатені түзету үшін төледі. Не туралы айтып тұрғанымды түсінуіңіз үшін мен қатеге айналған мүмкіндікті қосқан компания туралы, сондай-ақ мен түзетілген жұмбақ қатеге ықпал еткен бірнеше басқа қызықты оқиғалар туралы айтуым керек.

Ескі күндерде Apple компьютерлері кейде өз күнін 1 жылдың 1904 қаңтарына дейін өздігінен қалпына келтіретін. Мұның себебі қарапайым болды: ол күн мен уақытты бақылау үшін батареямен жұмыс істейтін «жүйелік сағатты» пайдаланды. Батарея біткен кезде не болды? Компьютерлер күнді дәуірдің басынан бастап секундтар саны бойынша қадағалай бастады. Дәуір деп біз анықтамалық бастапқы күнді түсіндік, ал Macintoshes үшін бұл 1 жылдың 1904 қаңтары болды. Ал аккумулятор біткеннен кейін ағымдағы күн көрсетілген күнге қалпына келтірілді. Бірақ неге бұлай болды?

Бұрын Apple бастапқы күннен бастап секундтар санын сақтау үшін 32 бит пайдаланған. Бір бит екі мәннің бірін сақтай алады - 1 немесе 0. Екі бит төрт мәннің бірін сақтай алады: 00, 01, 10, 11. Үш бит - сегізден бір мән: 000, 001, 010, 011, 100 , 101, 110, 111, т.б. Ал 32 232 мәннің бірін, яғни 4 секундты сақтай алады. Apple күндері үшін бұл шамамен 294 жылға тең, сондықтан ескі Mac компьютерлері 967 жылдан кейінгі күндерді өңдей алмайды. Ал жүйенің батареясы таусылып қалса, дәуірдің басынан бері күн 296 секундқа қалпына келтіріледі және компьютерді қосқан сайын (немесе жаңа батарея сатып алғанша) күнді қолмен орнатуға тура келеді.

Дегенмен, Apple компаниясының дәуірден бастап күндерді секундтар ретінде сақтау туралы шешімі, біз көретініміздей, ауқымды салдары болған дәуірден бұрынғы күндерді өңдей алмайтынымызды білдірді. Apple қате емес, мүмкіндікті енгізді. Басқа нәрселермен қатар, бұл Macintosh операциялық жүйесі «мыңжылдық қатесіне» иммунитетті білдіреді (бұл шектеулерді айналып өту үшін өздерінің күн жүйелері бар көптеген Mac қолданбалары туралы айту мүмкін емес).

Ілгері жүру. Біз Lotus 1-2-3, IBM компаниясының «өлтіруші қолданбасы» пайдаландық, ол ДК төңкерісін бастауға көмектесті, дегенмен Apple компьютерлерінде VisiCalc болды, бұл дербес компьютерді табысты етті. Әділдік үшін, егер 1-2-3 пайда болмаса, ДК әрең көтеріліп, дербес компьютерлердің тарихы мүлдем басқаша дамуы мүмкін еді. Lotus 1-2-3 1900 жылды кібісе жыл деп қате қарастырды. Майкрософт өзінің Multiplan деген алғашқы электрондық кестесін шығарған кезде нарықтың аз ғана бөлігін басып алды. Excel жобасын іске қосқан кезде олар Lotus 1-2-3 жүйесінен жолдар мен бағандарды атау схемасын көшіріп қана қоймай, сонымен қатар 1900 жылды кібісе жыл ретінде әдейі қарастыру арқылы қателер үйлесімділігін қамтамасыз етуді шешті. Бұл мәселе бүгінде де бар. Яғни, 1-2-3-те бұл қате болды, бірақ Excel бағдарламасында бұл барлық 1-2-3 пайдаланушылар қате болса да, деректерді өзгертпестен өз кестелерін Excel бағдарламасына импорттауын қамтамасыз ететін саналы шешім болды.

Бірақ басқа мәселе болды. Біріншіден, Microsoft 1 жылдың 1904 қаңтарына дейінгі күндерді танымайтын Macintosh жүйесіне арналған Excel бағдарламасын шығарды. Ал Excel бағдарламасында 1 жылдың 1900 қаңтары дәуірдің басы болып саналды. Сондықтан әзірлеушілер өздерінің бағдарламасы дәуір түрін танып, қажетті дәуірге сәйкес деректерді сақтайтындай өзгеріс жасады. Microsoft тіпті бұл туралы түсіндірме мақала жазды. Және бұл шешім менің қателігіме әкелді.

Менің ETL жүйесі Windows жүйесінде жасалған, бірақ Mac жүйесінде де жасалуы мүмкін тұтынушылардан Excel электрондық кестелерін алды. Сондықтан кестедегі дәуірдің басы 1 жылдың 1900 қаңтары немесе 1 жылдың 1904 қаңтары болуы мүмкін. Қалай білуге ​​болады? Excel файл пішімі қажетті ақпаратты көрсетеді, бірақ мен пайдаланған талдаушы оны көрсетпеді (қазір ол көрсетеді) және сіз белгілі бір кестенің дәуірін білесіз деп есептеді. Мен Excel екілік пішімін түсінуге және талдаушы авторға патч жіберуге көбірек уақыт жұмсаған болар едім, бірақ менде клиент үшін көп нәрсе істеу керек болды, сондықтан мен дәуірді анықтау үшін тез эвристика жаздым. Ол қарапайым еді.

Excel бағдарламасында 5 жылдың 1998 шілдесі күні «07-05-98» (пайдасыз американдық жүйе), «5 шілде 98», «5 жылғы 1998 шілде», «5-шілде-98» форматында ұсынылуы мүмкін немесе басқа пішім. басқа пайдасыз пішім (бір қызығы, Excel нұсқасы ұсынбаған пішімдердің бірі ISO 8601 болды). Дегенмен, кестеде пішімделмеген күн 35981-ші дәуір үшін «1900» немесе 34519-ші дәуір үшін «1904» ретінде сақталды (сандар дәуірден кейінгі күндер санын білдіреді). Мен жай пішімделген күннен жылды шығару үшін қарапайым талдау құралын қолдандым, содан кейін пішімделмеген күннен жылды шығару үшін Excel талдаушысын қолдандым. Егер екі мән де 4 жылға ерекшеленсе, мен 1904-ші дәуірдегі жүйені қолданатынымды білдім.

Неліктен мен жай ғана пішімделген күндерді пайдаланбадым? Өйткені 5 жылдың 1998 шілдесі жоғалған ай күнімен «98 шілде» деп пішімделуі мүмкін. Біз кестелерді әртүрлі тәсілдермен жасаған көптеген компаниялардан алдық, сондықтан күндерді анықтау бізге (бұл жағдайда мен) байланысты болды. Сонымен қатар, егер Excel оны дұрыс түсінсе, біз де солай етуіміз керек!

Сол уақытта мен 39082-ге тап болдым. Еске сала кетейін, Lotus 1-2-3 1900 жылды кібісе жыл деп санады және бұл Excel бағдарламасында шынайы түрде қайталанды. Бұл 1900 жылға бір күн қосқандықтан, көптеген күндерді есептеу функциялары дәл сол күн үшін қате болуы мүмкін. Яғни, 39082 1 жылдың 2011 қаңтары (Mac компьютерінде) немесе 31 жылдың 2006 желтоқсаны (Windows жүйесінде) болуы мүмкін. Егер менің «жыл талдаушысы» пішімделген мәннен 2011 жылды шығарса, онда бәрі жақсы. Бірақ Excel талдаушысы қай дәуірдің қолданылып жатқанын білмейтіндіктен, ол әдепкі бойынша 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-ші жылдардың басында әкем таспаны жоғары жылдамдықпен беру үшін таспалы дискілер мен пневматикалық жүйелерді жасап шығарған Storage Technology бөлімінде жұмыс істеді.

Олар жеті «В» дискісіне қосылған бір орталық «А» дискісі болуы үшін дискілерді қайта құрастырды, ал «А» дискісін басқаратын ЖЖҚ шағын ОЖ барлық «В» дискілеріне оқу және жазу операцияларын бере алады.

«А» дискісі іске қосылған сайын операциялық жүйені оның жадына жүктеу үшін «А» жалғанған перифериялық диск жетегіне дискетканы салу қажет болды. Бұл өте қарапайым болды: есептеу қуаты 8-биттік микроконтроллермен қамтамасыз етілді.

Мұндай жабдықтың мақсатты аудиториясы көптеген мекенжай белгілерін немесе банк үзінділерін басып шығаруды қажет ететін өте үлкен деректер қоймалары - банктер, сауда желілері және т.б. бар компаниялар болды.

Бір клиентте мәселе туындады. Баспа тапсырмасының ортасында белгілі бір «A» дискісі жұмысын тоқтатып, бүкіл тапсырма тоқтап қалуы мүмкін. Дискінің жұмысын қалпына келтіру үшін қызметкерлер барлығын қайта жүктеуге мәжбүр болды. Ал егер бұл алты сағаттық тапсырманың ортасында орын алса, онда компьютердің қымбат уақыты жоғалып, бүкіл операцияның кестесі бұзылды.

Storage Technologies компаниясынан техниктер жіберілді. Бірақ барлық күш-жігеріне қарамастан, олар сынақ жағдайында қатені қайта шығара алмады: бұл үлкен басып шығару жұмыстарының ортасында орын алған сияқты. Мәселе аппараттық құралда емес еді, олар қолдарынан келгеннің бәрін ауыстырды: жедел жады, микроконтроллер, иілгіш диск, таспалы диск жетегінің барлық мүмкін бөліктері - мәселе сақталды.

Сосын техниктер штабқа телефон соғып, Сарапшыны шақырды.

Сарапшы орындық пен бір шыны кофе алды, компьютер бөлмесінде отырды - ол кезде компьютерлерге арналған бөлмелер болды - және қызметкерлердің үлкен басып шығару жұмысын кезекке тұрғанын көрді. Сарапшы сәтсіздіктің орын алуын күтті - және ол болды. Барлығы Сарапшыға қарады, бірақ ол неге бұлай болғанын түсінбеді. Сондықтан ол жұмысты қайтадан кезекке қоюды бұйырды және барлық қызметкерлер мен техникалық қызметкерлер жұмысқа оралды.

Сарапшы қайтадан орындыққа отырды және сәтсіздікті күте бастады. Шамамен алты сағат өтті және сәтсіздік орын алды. Сарапшының тағы да ойы болмады, тек барлығы адамдарға толы бөлмеде болды. Ол миссияны қайта бастауды бұйырды, қайта отырды және күтті.

Үшінші сәтсіздікке қарай Сарапшы бір нәрсені байқады. Сәтсіздік қызметкерлер шетелдік дискідегі таспаларды ауыстырған кезде орын алды. Оның үстіне, ақау қызметкерлердің бірі едендегі белгілі бір тақтайшаны басып өткен бойда орын алды.

Көтерілген еден 6-дан 8 дюймге дейінгі биіктікте салынған алюминий плиткалардан жасалған. Кез келген адамның маңызды кабельді кездейсоқ басып кетуіне жол бермеу үшін компьютерлердің көптеген сымдары көтерілген еденнің астында өтті. Қоқыстардың көтерілген еденнің астына түсуіне жол бермеу үшін плиткалар өте тығыз төселді.

Сарапшы плиткалардың бірінің деформацияланғанын түсінді. Қызметкер оның бұрышын басқан кезде, тақтайшаның шеттері көрші тақтайшаларға үйкеліс болды. Плиткаларды біріктіретін пластикалық бөліктер де олармен үйкеліс болды, бұл радиожиілік кедергілерін тудыратын статикалық микроразрядтарды тудырды.

Бүгінгі күні ЖЖҚ радиожиілік кедергілерден әлдеқайда жақсы қорғалған. Бірақ ол жылдары олай болған жоқ. Сарапшы бұл кедергі жадты және онымен бірге операциялық жүйенің жұмысын бұзатынын түсінді. Ол қолдау қызметіне қоңырау шалып, жаңа плиткаларға тапсырыс берді, оларды өзі орнатты және мәселе жойылды.

Бұл жоғары толқын!

Оқиға серверлік бөлмеде, Портсмуттағы кеңсенің төртінші немесе бесінші қабатында (менің ойымша), док аймағында өтті.

Бір күні негізгі деректер базасы бар Unix сервері істен шықты. Олар оны қайта іске қосты, бірақ ол қуана қайта-қайта құлай берді. Қолдау қызметінен біреуге қоңырау шалуды жөн көрдік.

Қолдау көрсететін жігіт... Менің ойымша, оның аты Марк еді, бірақ бұл маңызды емес... Мен оны танымаймын деп ойлаймын. Бұл маңызды емес, шынымен. Маркпен бірге болайық, жарай ма? Тамаша.

Сонымен, бірнеше сағаттан кейін Марк келді (бұл Лидстен Портсмутқа дейін ұзақ жол емес, сіз білесіз), серверді қосты және бәрі қиындықсыз жұмыс істеді. Әдеттегі қарғыс қолдауы, клиент бұған қатты ренжіді. Марк журнал файлдарын қарап шығып, ешнәрсе таппайды. Сонымен Марк пойызға қайта отырды (немесе ол қандай көлік түрімен келсе де, мен білемін, бұл ақсақ сиыр болуы мүмкін еді... бәрібір, бәрібір, солай ма?) және Лидске қайтады, босқа кетеді. күн.

Сол күні кешке сервер қайтадан бұзылады. Әңгіме баяғы... сервер көтерілмейді. Марк қашықтан көмектесуге тырысады, бірақ клиент серверді іске қоса алмайды.

Тағы бір пойыз, автобус, лимон безе немесе басқа да ақымақ, Марк Портсмутқа қайтып келді. Қараңызшы, сервер еш қиындықсыз жүктеледі! Ғажайып. Марк бірнеше сағат бойы операциялық жүйеде немесе бағдарламалық жасақтамада барлығы дұрыс екенін тексеріп, Лидске жолға шығады.

Күннің ортасында сервер істен шығады (жеңіл жүріңіз!). Бұл жолы серверді ауыстыру үшін аппараттық қолдау көрсететін адамдарды тарту орынды сияқты. Бірақ жоқ, шамамен 10 сағаттан кейін ол да түседі.

Жағдай бірнеше күн бойы қайталанды. Сервер жұмыс істейді, шамамен 10 сағаттан кейін бұзылады және келесі 2 сағатта іске қосылмайды. Олар салқындауды, жадтың ағып кетуін тексерді, барлығын тексерді, бірақ ештеңе таппады. Содан кейін апаттар тоқтады.

Апта алаңсыз өтті... бәрі бақытты. Бәрі қайта басталғанша бақытты. Сурет бірдей. 10 сағат жұмыс, 2-3 сағат бос тұру...

Содан кейін біреу (менің ойымша, олар маған бұл адамның IT-ға қатысы жоқ деп айтты):

«Бұл толқын!

Леп белгісі бос көзқараспен қарсы алынды және біреудің қолы қауіпсіздік қоңырауы түймесіне екіленіп қалған шығар.

«Ол толқынмен жұмыс істеуді тоқтатады».

Кофе ішіп отырып, «Тиде жылнамасын» оқи алмайтын IT-қолдау көрсету қызметкерлері үшін бұл мүлдем жат ұғым болып көрінеді. Олар мұны қандай да бір түрде толқынмен байланыстыру мүмкін емес деп түсіндірді, өйткені сервер бір апта бойы ақаусыз жұмыс істеді.

«Өткен аптада толқын төмен болды, бірақ бұл аптада ол жоғары».

Яхта лицензиясы жоқ адамдар үшін кішкене терминология. Толқындар ай цикліне байланысты. Ал Жер айналу кезінде әрбір 12,5 сағат сайын Күн мен Айдың тартылыс күші толқынды толқын жасайды. 12,5 сағаттық циклдің басында жоғары толқын, циклдің ортасында құлдырау, ал соңында қайтадан жоғары толқын болады. Бірақ Айдың орбитасы өзгерген сайын, төмен және жоғары толқындардың айырмашылығы да өзгереді. Ай Күн мен Жердің арасында немесе Жердің қарама-қарсы жағында болғанда (толық ай немесе айсыз) біз Сызығын толқындарын аламыз - ең жоғары толқындар және ең төменгі төмен толқындар. Жарты айда біз квадратуралық толқындарды аламыз - ең төменгі толқындар. Екі экстремалды айырмашылық айтарлықтай азаяды. Ай циклі 28 күнге созылады: сызигиан - квадратура - сызигиан - квадратура.

Техниктерге толқын күштерінің мәнін түсіндіргенде, олар бірден полиция шақыру керек деп ойлады. Және өте логикалық. Бірақ жігіттің айтқаны дұрыс болды. Екі апта бұрын эсминец кеңседен алыс емес жерде тірелді. Толқын оны белгілі бір биіктікке көтерген сайын, кеменің радиолокациялық посты серверлік бөлме қабатының деңгейінде аяқталды. Ал радар (немесе электронды соғыс техникасы немесе басқа да әскери ойыншық) компьютерлерде хаос тудырды.

Зымыранға арналған ұшу миссиясы

Маған үлкен (шамамен 400 мың жол) зымыран ұшыруды басқару және бақылау жүйесін операциялық жүйенің, компилятордың және тілдің жаңа нұсқаларына көшіру тапсырылды. Дәлірек айтқанда, Solaris 2.5.1-ден Solaris 7-ге дейін және Ada 83-те жазылған Verdix Ada Development System (VADS) жүйесінен Ada 95-те жазылған Rational Apex Ada жүйесіне дейін. VADS Rational компаниясы сатып алды және оның өнімі ескірген, дегенмен Rational Apex компиляторына өтуді жеңілдету үшін VADS-арнайы пакеттердің үйлесімді нұсқаларын енгізуге тырысты.

Үш адам маған кодты таза құрастыруға көмектесті. Бұл екі аптаға созылды. Содан кейін жүйенің жұмыс істеуі үшін өз бетімше жұмыс жасадым. Қысқаша айтқанда, бұл мен кездестірген бағдарламалық қамтамасыз ету жүйесінің ең нашар архитектурасы және іске асырылуы болды, сондықтан портты аяқтау үшін тағы екі ай қажет болды. Содан кейін жүйе тестілеуге жіберілді, оған тағы бірнеше ай қажет болды. Мен тестілеу кезінде табылған қателерді дереу түзетіп алдым, бірақ олардың саны тез азайды (бастапқы код өндірістік жүйе болды, сондықтан оның функционалдығы өте сенімді жұмыс істеді, мен жаңа компиляторға бейімделу кезінде пайда болған қателерді жоюға тура келді). Ақырында бәрі ойдағыдай болған соң, мені басқа жобаға ауыстырды.

Ал, Алғыс айту күні алдындағы жұмада телефон шырылдады.

Зымыран ұшыру шамамен үш аптадан кейін сынақтан өтуі керек еді, ал кері санақтың зертханалық сынақтары кезінде командалар тізбегі бұғатталды. Нақты өмірде бұл сынақты тоқтатады және қозғалтқышты іске қосқаннан кейін бірнеше секунд ішінде бітелу орын алса, көмекші жүйелерде бірнеше қайтымсыз әрекеттер орын алады, бұл зымыранның ұзақ және қымбат дайындығын талап етеді. Бұл басталмас еді, бірақ көп адам уақыт пен көп ақшаны жоғалтқанына қатты ренжіген болар еді. Сізге Қорғаныс министрлігі ақшаны ұқыпсыз жұмсайды деп ешкімнің айтуына жол бермеңіз - мен бюджетті бірінші немесе екінші, содан кейін кестені орындамайтын мердігер менеджерді ешқашан кездестірген емеспін.

Алдыңғы айларда бұл кері санақ сынағы көптеген нұсқаларда жүздеген рет орындалды, тек бірнеше шағын ықылас болды. Сондықтан бұл орын алу ықтималдығы өте төмен болды, бірақ оның салдары өте маңызды болды. Осы екі факторды көбейтіңіз, сонда сіз бұл жаңалықтар мен үшін және ондаған инженерлер мен менеджерлер үшін бұзылған мереке аптасын болжағанын түсінесіз.

Ал жүйені тасымалдаған адам ретінде маған назар аударылды.

Қауіпсіздік тұрғысынан маңызды жүйелердің көпшілігі сияқты, көптеген параметрлер тіркелді, сондықтан жүйе бұзылғанға дейін орындалған кодтың бірнеше жолын анықтау оңай болды. Және, әрине, оларда әдеттен тыс ештеңе болған жоқ; бірдей өрнектер бір жүгіруде мыңдаған рет сәтті орындалды.

Біз Apex-тен адамдарды Rational-ге шақырдық, өйткені олар компиляторды жасаған және олар жасаған кейбір процедуралар күдікті кодта шақырылған. Оларға (және барлығына) сөзбе-сөз мемлекеттік маңызы бар мәселенің түп-төркінін табу қажет екендігі таң қалды.

Журналдарда қызықты ештеңе болмағандықтан, мәселені жергілікті зертханада қайта шығаруды жөн көрдік. Оқиға шамамен 1000 жүгіріске бір рет болатындықтан, бұл оңай тапсырма болды. Күдікті себептердің бірі жеткізуші әзірлеген мутекс функциясына (VADS тасымалдау пакетінің бөлігі) қоңырау шалу болды. Unlock құлпын ашуға әкелмеді. Функция деп аталатын өңдеу ағыны әрбір секунд сайын номиналды түрде келетін жүрек соғу хабарларын өңдеді. Біз жиілікті 10 Гц-ке, яғни секундына 10 ретке дейін көтеріп, жүгіре бастадық. Шамамен бір сағаттан кейін жүйе өзін-өзі құлыптады. Журналда біз жазылған хабарламалар тізбегі сәтсіз сынақ кезіндегідей болғанын көрдік. Біз тағы бірнеше жүгіріс жасадық, жүйе іске қосылғаннан кейін 45-90 минуттан кейін тұрақты түрде бұғатталды және журналда әр жолы бірдей маршрут болды. Техникалық тұрғыдан әртүрлі кодты іске қосқанымызға қарамастан - хабарлама жиілігі әртүрлі болды - жүйенің әрекеті бірдей болды, сондықтан біз бұл жүктеу сценарийі бірдей мәселені тудыратынына сенімді болдық.

Енді бізге өрнектер тізбегінде бұғаттау қай жерде болғанын анықтау керек болды.

Жүйені бұл енгізу Ada тапсырмалар жүйесін қолданды және оны өте нашар пайдаланды. Тапсырмалар - бұл Ada тілінде бір уақытта орындалатын жоғары деңгейлі құрылым, орындау ағындары сияқты, тек тілдің өзіне ғана енгізілген. Екі тапсырманың байланысуы қажет болғанда, олар «кездесу орнатады», қажетті деректермен алмасады, содан кейін кездесуді тоқтатады және олардың тәуелсіз орындалуына оралады. Алайда жүйе басқаша жүзеге асырылды. Мақсатты тапсырма кездесуден кейін, бұл мақсатты тапсырма басқа тапсырмамен кездесті, ол кейін үшінші тапсырмамен кездесті және кейбір өңдеу аяқталғанша осылай жалғаса береді. Осыдан кейін бұл кездесулердің барлығы аяқталды және әрбір тапсырма өз орындалуына оралу керек болды. Яғни, біз әлемдегі ең қымбат функцияларды шақыру жүйесімен айналыстық, ол кіріс деректерінің бір бөлігін өңдеу кезінде бүкіл «көп тапсырма» процесін тоқтатты. Бұған дейін өткізу қабілеті өте төмен болғандықтан ғана проблемалар туындамады.

Мен бұл тапсырма механизмін сипаттадым, себебі кездесу сұралғанда немесе аяқталуы күтілгенде, «тапсырманы ауыстыру» орын алуы мүмкін. Яғни, процессор орындауға дайын басқа тапсырманы өңдеуді бастауы мүмкін. Бір тапсырма басқа тапсырмамен кездесуге дайын болғанда, мүлде басқа тапсырма орындала бастауы мүмкін және соңында басқару бірінші кездесуге оралады. Және тапсырманың ауысуына әкелетін басқа оқиғалар орын алуы мүмкін; осындай оқиғалардың бірі - басып шығару немесе мутексті орындау сияқты жүйелік функцияға шақыру.

Мәселеге кодтың қай жолы себеп болғанын түсіну үшін тапсырма ауыстырғышын іске қоспай-ақ мәлімдемелер тізбегі арқылы прогресті жазудың жолын табу керек болды, бұл апаттың орын алуына жол бермейді. Сондықтан мен артықшылықты пайдалана алмадым Put_Line()енгізу/шығару операцияларын орындамау үшін. Мен санауыш айнымалыны немесе ұқсас нәрсені орната аламын, бірақ оны экранда көрсете алмасам, оның мәнін қалай көруге болады?

Сондай-ақ, журналды зерттеген кезде, процестің барлық енгізу-шығару операцияларын бұғаттаған және басқа өңдеуді орындауға кедергі келтірген жүрек соғысы туралы хабарламаларды өңдеудегі қатып қалғанына қарамастан, басқа тәуелсіз тапсырмаларды орындау жалғасуда. Яғни, жұмыс толығымен бұғатталған жоқ, тек (сыни) тапсырмалар тізбегі ғана болды.

Бұл бұғаттау өрнегін бағалау үшін қажетті анықтама болды.

Мен тапсырманы, санамаланған түрін және осы түрдегі жаһандық айнымалыны қамтитын Ada бумасын жасадым. Санақ литералдар проблемалық тізбектің нақты өрнектеріне байланысты болды (мысалы, Incrementing_Buffer_Index, Locking_Mutex, Mutex_Unlocked), содан кейін оған жаһандық айнымалыға сәйкес нөмірді тағайындайтын тағайындау өрнектерін енгізіңіз. Осының барлығының объектілік коды жай ғана жадта тұрақтыны сақтағандықтан, оны орындау нәтижесінде тапсырманы ауыстыру өте екіталай еді. Біз бірінші кезекте тапсырманы ауыстыра алатын өрнектерге күдіктендік, өйткені бұғаттау тапсырманы кері ауыстырған кезде қайтару емес, орындау кезінде орын алды (бірнеше себептер бойынша).

Бақылау тапсырмасы жай ғана циклде орындалды және жаһандық айнымалы мәннің өзгергенін көру үшін мерзімді түрде тексерілді. Әрбір өзгертумен мән файлға сақталды. Содан кейін қысқа күту және жаңа тексеру. Мен файлға айнымалыны жаздым, себебі тапсырма жүйе оны проблемалық аймақта тапсырманы ауыстыру кезінде орындау үшін таңдаған кезде ғана орындалды. Бұл тапсырмада орын алған нәрсе басқа, байланысты емес блокталған тапсырмаларға әсер етпейді.

Жүйе проблемалық кодты орындау нүктесіне жеткенде, әрбір келесі өрнекке ауысқан кезде жаһандық айнымалы мән қалпына келтіріледі деп күтілген. Содан кейін тапсырманың ауысуына себеп болатын бірдеңе орын алады және оның орындалу жиілігі (10 Гц) бақылау тапсырмасынан төмен болғандықтан, монитор жаһандық айнымалының мәнін түсіріп, оны жаза алады. Қалыпты жағдайда мен тізімдер жиынының қайталанатын тізбегін ала аламын: тапсырманы ауыстыру кезіндегі айнымалының соңғы мәндері. Ілінген кезде жаһандық айнымалы мән енді өзгермеуі керек және соңғы жазылған мән қай өрнектің аяқталмағанын көрсетеді.

Мен кодты бақылау арқылы іске қостым. Ол қатып қалды. Ал мониторинг сағат тілі сияқты жұмыс істеді.

Журналда мутекс шақырылғанын көрсететін мәнмен үзілген күтілетін реттілік бар. Unlock, және тапсырма орындалмады - бұрынғы мыңдаған қоңыраулардағыдай.

Осы уақытта Apex инженерлері өздерінің кодтарын қызу талдап жатты және мутексте теориялық тұрғыдан құлыптау орын алуы мүмкін орын тапты. Бірақ оның ықтималдығы өте төмен болды, өйткені белгілі бір уақытта болған оқиғалардың белгілі бір тізбегі ғана блоктауға әкелуі мүмкін. Мерфи заңы, балалар, бұл Мерфи заңы.

Маған қажет код бөлігін қорғау үшін, мен мутекс функциясының шақыруларын (OS mutex функциясының үстіне салынған) сол бөлікке мутекстік қатынасты басқару үшін шағын Ada mutex бумасымен ауыстырдым.

Мен оны кодқа енгізіп, сынақты өткіздім. Жеті сағаттан кейін код жұмыс істеп тұрды.

Менің кодым Rational-ға жіберілді, онда олар оны құрастырып, бөлшектеп, проблемалық мутекс функцияларында қолданылған тәсілді пайдаланбағанын тексерді.

Бұл менің мансабымдағы ең көп толып жатқан кодтық шолу болды 🙂 Менімен бірге бөлмеде он шақты инженер мен менеджер болды, тағы он адам конференц-байланыста болды - және олардың барлығы 20-ға жуық код жолын зерттеді.

Код қаралды, жаңа орындалатын файлдар жиналды және ресми регрессиялық тестілеуге жіберілді. Бір-екі аптадан кейін кері санақ сынағы сәтті өтіп, зымыран ұшып кетті.

Жарайды, бәрі жақсы, бірақ әңгіменің мәні неде?

Бұл мүлдем жиіркенішті мәселе болды. Жүздеген мың код жолдары, параллель орындалу, оннан астам өзара әрекеттесу процестері, нашар архитектура және нашар іске асыру, ендірілген жүйелерге арналған интерфейстер және миллиондаған долларлар жұмсалды. Қысым жоқ, дұрыс.

Мен бұл мәселемен жұмыс істеген жалғыз адам емес едім, бірақ мен тасымалдау кезінде назарда болдым. Бірақ мен мұны істесем де, бұл мен кодтың жүздеген мың жолын түсіндім немесе тіпті оларды қарап шықтым дегенді білдірмейді. Код пен журналдарды бүкіл ел бойынша инженерлер талдады, бірақ олар маған сәтсіздіктің себептері туралы гипотезаларын айтқан кезде, оларды жоққа шығаруға жарты минут уақыт кетті. Ал маған теорияларды талдауды сұрағанда, мен оны басқа біреуге беретін едім, өйткені бұл инженерлердің дұрыс емес жолмен жүргені маған анық болды. Менмендік сияқты естіледі ме? Иә, бұл дұрыс, бірақ мен басқа себеппен гипотезалар мен өтініштерді қабылдамады.

Мен мәселенің мәнін түсіндім. Мен оның қай жерде және неге екенін білмедім, бірақ мен не болып жатқанын білдім.

Осы жылдар ішінде мен көп білім мен тәжірибе жинақтадым. Мен Ada-ны қолданудың бастаушыларының бірі болдым және оның артықшылықтары мен кемшіліктерін түсіндім. Мен Ada жұмыс уақыты кітапханаларының тапсырмаларды қалай өңдейтінін және параллель орындаумен айналысатынын білемін. Ал мен жады, регистрлер және ассемблер деңгейінде төмен деңгейлі программалауды түсінемін. Былайша айтқанда, мен өз мамандығым бойынша терең білімім бар. Мен оларды мәселенің себебін табу үшін қолдандым. Мен қатені айналып өтіп қана қойған жоқпын, оны өте сезімтал орындалу ортасында қалай табуға болатынын түсіндім.

Кодпен күрестің мұндай оқиғалары мұндай күрестің ерекшеліктері мен шарттарымен таныс емес адамдар үшін өте қызықты емес. Бірақ бұл әңгімелер шынымен қиын мәселелерді шешу үшін не қажет екенін түсінуге көмектеседі.

Шынымен қиын есептерді шешу үшін сіз жай ғана бағдарламашы болудан артық болуыңыз керек. Сіз кодтың «тағдырын», оның қоршаған ортамен қалай әрекеттесетінін және қоршаған ортаның өзі қалай жұмыс істейтінін түсінуіңіз керек.

Сонда сізде өзіңіздің қираған мерекелік аптаңыз болады.

Жалғасы бар.

Ақпарат көзі: www.habr.com

пікір қалдыру