dbit.one© 2026
000
booting_
Loading experience0%
dbit.one

Testlar xatoning yoʻqligini isbotlamaydi. Nima isbotlaydi

Qisqasi: testlar toʻplami — bu qidiruv. U «topdim» deya oladi va «yoʻq» deya olmaydi. Kodning koʻp qismi uchun bu yetarli, ammo toʻlov protokoli, buyurtmaning holat mashinasi va ikki vazifa umumiy holatga tegadigan har qanday joy uchun yetarli emas: u yerda xato — qadamlarning kamdan-kam uchraydigan birikmasi. Model tekshiruvi barcha erishiladigan holatlarni aylanib chiqadi va testlar umuman javob bera olmaydigan savolga javob beradi.

9 daqiqa o‘qish

Qisqacha

  • Test — ekzistensial daʼvo: «shunday yurish borki, unda ishlaydi». Hech narsa topilmagani hech narsa yoʻq degani emas.
  • Model tekshiruvi modelning barcha erishiladigan holatlarini aylanadi va eng qisqa kontrmisol yoki oʻsha model uchun isbot beradi.
  • Toʻgʻridan-toʻgʻri saralash eksponensial, shuning uchun asosiy ish qisqartirishlarda: simmetrik jarayonlar va oʻrin almashadigan amallar.
  • Buzilgan qisqartirish ishlaydiganidek javob beradi — «buzilish yoʻq». Shuning uchun yonida toʻliq saralash qoldiriladi va verdiktlar mos kelishi shart.

Yashil yurish aslida nima deydi

Test — mavjudlik haqidagi daʼvo: «shunday yurish borki, unda tizim toʻgʻri ishlaydi». Testlar toʻplami — shunday daʼvolarning koʻpi. Ularning na bittasi, na hammasi birgalikda «tizimni buzadigan xatti-harakat mavjud emas» demaydi — ular «biz unga duch kelmadik» deydi.

Chiziqli kod uchun bu farq deyarli ahamiyatsiz: yoʻllar sanoqli va qamrov ularni yopadi. Farq qadamlar tartibini dasturchi tanlamaydigan joyda hal qiluvchi boʻlib qoladi: bitta hisobga ikki soʻrov, taymautdan keyin takrorlangan toʻlov, navbat va uni oʻqiydigan jarayon, blokirovka va uni kutish. U yerda xatti-harakatlar fazosi kombinatorik, testlar esa undan bir hovuch oladi.

Kamdan-kam jadvalni takrorlanadigan qilish alohida vazifa va u determinlashgan simulyatsiya bilan hal qilinadi: tasodif oʻrniga sid, bayt-baytigacha takror. Ammo bu ham tanlanma. Nihoyatda katta fazodan ikki yuz jadval — juda yaxshi fazzing, teorema emas.

Bu farq qayerda pulga tushadi

Prodakshnda nima boʻladi
Nega testlar buni oʻtkazib yuboradi
Oʻzaro blokirovka: ikki oʻtkazma ikki qulfni teskari tartibda oladi
toʻrt qadamning aniq tartibi kerak, test bunga duch kelmaydi
Oqim tirik, ammo hech qachon kritik boʻlimga yetmaydi
hech narsa qulamaydi — u shunchaki tugatmaydi; yiqiladigan tasdiq yoʻq
Buyurtma sxemada yoʻq holatga tushadi
sxema boshda, koddagi oʻtishlar esa boshqa; test kutilganini tekshiradi
Toʻlov mijozga tasdiqlanadi va provayder tomonidan bekor qilinadi
stsenariy aynan ikki chaqiruv orasida nosozlikni talab qiladi

Toʻrttasi ham kod hajmi haqida emas, birikmalar soni haqida. Aynan shu — toʻliq saralash amalda qoʻllanadigan soha: protokollar, holat mashinalari, blokirovkalar, xizmatlar oʻrtasidagi kelishuv. Oddiy CRUD bu sohaga kirmaydi va u yerga model tekshiruvini sudrash keraksiz.

Model tekshiruvi nima

Siz tizimni holat mashinasi sifatida tasvirlaysiz: boshlangʻich holatlar, amallar (har birida ishga tushish sharti va natijasi) va doim rost boʻlishi kerak boʻlgan daʼvolar. Keyin vosita barcha erishiladigan holatlarni aylanib chiqadi va yo daʼvo yolgʻon boʻlgan holatga yoʻl topadi, yo bunday yoʻl yoʻqligini isbotlaydi.

ts
const spec = {
  name: 'counter',
  processes: 2,
  init: [{ n: 0 }],
  actions: [
    {
      name: 'p0: oshirish',
      process: 0,
      reads: ['n'],
      writes: ['n'],
      step: (s) => (s.n < 3 ? [{ n: s.n + 1 }] : []),
    },
  ],
  invariants: [{ name: 'n haddan oshmaydi', reads: ['n'], holds: (s) => s.n <= 3 }],
  terminal: (s) => s.n === 3,
};
Spetsifikatsiya: amal keyingi holatlarni qaytaradi, boʻsh roʻyxat «ishlamadi» degani

Shaklning bitta tafsiloti muhim: shart va natija bitta funksiyada yashaydi. Amalning oʻzi keyingi holatlarni qaytaradi, boʻsh roʻyxat esa «hozir imkonsiz» degani. Shunda ular bir-biridan ajralib keta olmaydi — qoʻlda yozilgan modellardagi klassik xato manbai.

Ikkinchisi: reads, writes va simmetrik jarayonlar toʻplami taxmin qilinmaydi, eʼlon qilinadi. TLA+ ham xuddi shuni soʻraydi. Toʻlovi halol: notoʻgʻri eʼlon spetsifikatsiyadagi xatoga aylanadi, kerakli holatlarni jimgina uloqtirgan vositaning yashirin nosozligiga emas.

Kontrmisol verdiktdan muhimroq

«Buzilish mumkin» degan javob unga olib boradigan yoʻlsiz foydasiz. Kenglik boʻyicha qidiruv yoʻlni tuzilishiga koʻra eng qisqa qiladi, shuning uchun kontrmisol dampga emas, hodisa bayonnomasiga oʻxshab oʻqiladi.

text
✗ peterson (check then set) — invariant "at most one process in the critical section"

  trace
    (initial)                    pc=00 flag=00
    p0: check the other flag     pc=10 flag=00
    p1: check the other flag     pc=11 flag=00
    p0: raise flag and enter     pc=31 flag=10
    p1: raise flag and enter     pc=33 flag=11
Peterson algoritmi buzilgan holda: avval oʻzganing bayrogʻi tekshiriladi, keyin oʻziniki koʻtariladi

Ikkalasi ham qaradi, ikkalasi ham tushirilgan bayroqni koʻrdi, ikkalasi ham kirdi. Toʻrt qadam — va bayroq nega tekshiruvdan oldin koʻtarilishi kerakligi ravshan. Trassa boʻlsa bunday narsa bir daqiqada, «baʼzan ikkalasi ichkarida qoladi» boʻlsa haftalab tahlil qilinadi.

Nega saralashni toʻgʻridan-toʻgʻri qilib boʻlmaydi

Holatlar soni koʻpaytma kabi oʻsadi: besh fazadagi oltita jarayon — 15 625 birikma, bu esa oʻyinchoq misol. Shuning uchun vositaning asosiy qismi qidiruv emas, qidirmaslikka imkon beradigan narsalar.

Spetsifikatsiya
Holatlar: qisqartirishsiz → ikkalasi bilan
workers(4)
625 → 17, yutuq 37×
workers(6)
15 625 → 25, yutuq 625×
peterson
20 → 20, yutuq yoʻq

Oxirgi qator birinchi ikkitasidan muhimroq. Jarayonlar doimo bir-birining oʻzgaruvchilarini oʻqib-yozadigan joyda qisqartiradigan narsa yoʻq — vosita esa halol hech narsa bermasligi shart. Bu qator testda daʼvo sifatida turibdi: u yerda yutuq eʼlon qilgan vosita yolgʻon aytgan boʻlardi.

Qidirmaslikning ikki usuli

Simmetriya. Jarayonlar almashtiriladigan boʻlsa, faqat ularning oʻrin almashuvi bilan farq qiladigan holatlar — bitta holat. Besh fazadagi oltita ishchi 15 625 taqsimot beradi, ammo atigi 210 multitoʻplam: qaysi biri qayerda emas, nechtasi qayerda ekani muhim.

Oʻrin almashadigan amallar. Ikki amal umumiy hech narsaga tegmasa, ular orasidagi tartib kuzatilmaydi: bir tartibni oʻrganib, ikkinchisidan hech narsa bilmaysiz. Rasman bu ample toʻplamlar va ularning toʻrtta sharti bor, har biri oʻz oʻrnini haqqoniy egallaydi — bittasini olib tashlang, tekshiruv buzilishlarni ishonch bilan oʻtkazib yubora boshlaydi.

Qisqartiruvchining oʻzini qanday tekshirish kerak

Mana bu butun ishning eng yoqimsiz joyi. Kerakli holatlarni uloqtirgan qisqartirish ishlaydigani bilan aynan bir xil natija beradi: «buzilish topilmadi». Qisqartirilgan qidiruv ichidan qaysi birini ushlab turganingizni ajratib boʻlmaydi.

Yagona ishlaydigan javob — qisqartirishga soʻzida ishonmaslik. Toʻliq saralash yonida qoladi: sekin, toʻliq va xato qila olmaydigan. Har bir spetsifikatsiya ikkala qidiruvdan oʻtadi va qisqartirilgan verdikt toʻligʻiga mos kelishi shart. Qisqartirishga muallifi ishonchli boʻlgani uchun emas, xato qila olmaydigan narsa bilan rozi boʻlgani uchun ishoniladi.

Bu kafolatning chegarasi bor va uni ochiq aytish kerak: solishtirish toʻliq saralash hali ishga tushadigan joyda — kichik modellarda mumkin. Aynan qisqartirish kerak boʻlmagan joyda. Bu yondashuvning tugʻma xossasi va u tekshiruvni bekor qilmaydi, ammo uning shiftini belgilaydi.

Xuddi shu usul boshqa joylarda: har bir eksponati algoritmning bitta qoidasini oʻchiradigan va tutilishi shart boʻlgan xatolar muzeyi hamda har bir pogʻonasi keyingisi taqiqlagan narsani ishlab chiqarishi shart boʻlgan izolyatsiya darajalari zinasi.
Injiniring standartlarimizdagi «yashil yurish — dalil emas» qoidasi

Jonlilik: tizim qulamaydi, shunchaki yetib bormaydi

Xavfsizlik «yomon holatga erishsa boʻladimi» degan savol va kenglik boʻyicha qidiruv unga javob beradi. Jonlilik «yaxshi narsa qachondir yuz beradimi» degan savol va uni yaxshi narsa hech qachon yuz bermaydigan cheksiz yurish buzadi. Chekli fazoda bunday yurish — arqon: siklgacha yoʻl va keyin abadiy sikl.

Muammo shundaki, bunday sikllarning koʻpi bemaʼni: ular ishga tushishi mumkin boʻlgan jarayon hech qachon ishga tushirilmasligini talab qiladi. Ularni zaif adolat kesib tashlaydi: uzluksiz tayyor jarayon qachondir qadam tashlashi shart. Bu shartsiz har qanday konkurent dastur jonlilikni «yiqitadi» va tekshiruv foydasiz boʻladi.

text
✗ spinlock — can loop forever without process 0 reaching its critical section
  The cycle is fair: process 1 keeps moving; process 0 is blocked

  then forever
    p1: acquire   pc=03 lock=1
    p1: release   pc=00 lock=-1
Spinlok bilan Peterson algoritmi orasidagi farq aynan kerakli joyda koʻrinadi

Spinlok xavfsiz — ikkalasi bir vaqtda ichkarida boʻlmaydi — va ayni paytda ochlikka olib keladi. Peterson algoritmi xuddi shu tekshiruvdan oʻtadi va turn oʻzgaruvchisi aynan shuning uchun mavjud. «Xavfsiz» bilan «xavfsiz va yetib boradi» orasidagi farqni atay bilish kerak: navbatlarda, qulflarda va taqsimlangan blokirovkalarda aynan u monitoringda xato sifatida koʻrinmaydigan osilib qolishlar manbai.

Bu usul nimani uddalay olmaydi

  • Kod emas, model tekshiriladi. Bu ham asosiy chegara, ham asosiy xavf: isbotlangan model va undan uzoqlashgan implementatsiya — oddiy holat. Model gʻoya xatolarini, testlar bajarilish xatolarini tutadi; biri ikkinchisini almashtirmaydi.
  • Qisqartirishlar siz eʼlon qilgan narsaga nisbatan toʻgʻri. Eʼlon qilinmagan oʻzgaruvchini yozadigan amal uloqtirilgan holatlarga olib kelishi mumkin. Bu tahlil emas, shartnoma.
  • Faqat invariantlar va jonlilikning bitta shakli. «Doim rost» va zaif adolat ostida «qachondir yuz beradi». Ichma-ich vaqt operatorlari ham, kuchli adolat ham, toʻliq LTL ham yoʻq.
  • Hammasi xotirada. Milliardlar emas, minglab holatlar: diskdagi saqlash ham, ramziy tasvir ham yoʻq.
  • Jiddiy ish uchun TLC va SPIN bor. Ular ortida oʻn yilliklar, diskdagi holat ombori, taqsimlangan tekshiruv va shu ish uchun oʻylab topilgan tillar.

Tijorat loyihasida bu qachon oʻzini oqlaydi

Vazifangizga yana oʻnta test emas, saralash kerakligini qanday bilish mumkin
  1. 01

    Umumiy holatga tegadiganlarni sanang

    Bir xil maʼlumot ustida ikki yoki undan ortiq mustaqil jarayon ishlasa — toʻlov va vebhuk, ishchi va rejalashtiruvchi, foydalanuvchi va fon solishtiruvi — birikmalar siz yozadigan testlardan koʻp.

  2. 02

    Invariantni bitta jumlada ayting

    «Toʻlangan buyurtma toʻlov kutilmoqda holatiga qaytmaydi», «ikki oʻtkazma qoldiqdan ortiq yechmaydi». Invariant shakllanmasa, hozircha tekshiradigan narsa yoʻq — avval nima rost boʻlishi kerakligiga kelishing.

  3. 03

    30–60 satrli model yozing, butun tizimni emas

    Ilova emas, protokol modellashtiriladi: buyurtma holatlari, provayder qadamlari, nosozliklar va takrorlar. Qolgani modelga kirmaydi — bu soddalashtirish emas, saralash umuman tugashining sharti.

  4. 04

    Olingan kontrmisolni testga aylantiring

    Trassa — tayyor regressiya stsenariysi. Model repozitoriyda qoladi, test implementatsiyani qoʻriqlaydi va ikkalasi ham oʻz ishini qiladi.

Pul jihatidan bu maʼlumotdagi xato ishlamay qolishdan qimmatga tushadigan joyda oʻzini oqlaydi: moliyaviy tizimlar, qoldiqlar hisobi, tashqi provayderlar bilan integratsiyalar. Yondosh tahlillar — toʻlovlar idempotentligi va master qulaganda maʼlumotlar bilan nima boʻlishi.

Ko‘p so‘raladigan savollar

Bu TLA+ ning oʻzimi?

Gʻoya ham, algoritmlar ham bir xil: tizimni holat mashinasi sifatida tasvirlab, erishiladigan holatlarni aylanib chiqish. TLC bilan TLA+ — oʻz tili, diskda holat saqlash va taqsimlangan tekshiruvga ega sanoat vositasi; protokolni haqiqiy verifikatsiya qilish uchun oʻshani oling. Farq kirish chegarasida: TypeScriptdagi model kod bilan bitta repozitoriyda yashaydi va uni bitta ishqiboz emas, butun jamoa oʻqiydi.

Endi tizimni ikki marta — model va kod bilan tasvirlashimiz kerakmi?

Model tizimni emas, protokolni tasvirlaydi: holatlar, oʻtishlar, nosozliklar. Bu minglab emas, oʻnlab satr. Takrorlanish yoʻq, chunki model ataylab implementatsiyadan kambagʻalroq — unda baza ham, tarmoq ham, interfeys ham yoʻq, ammo qadamlarning barcha birikmasi bor.

Holatlar juda koʻp boʻlsa nima qilish kerak?

Mashina quvvatini emas, modelni kichraytirish: oʻn oʻrniga uch jarayon, oʻttiz oʻrniga ikki valyuta. Protokol xatolari deyarli har doim kichik nusxalarda chiqadi — bu maʼlum amaliy kuzatuv va model bilan ishlashning butun amaliyoti shunga tayanadi. Bu ham yordam bermasa, vazifa TLC va SPIN ga oʻtadi.

Tayyorlari bor ekan, nega oʻz model checker ingizni yozdingiz?

Nimaga ishonayotganimni bilish uchun. Saralash qisqartirishlari — kerakli holatlarni jimgina uloqtirib, oʻsha yashil javobni beradigan kod; ularni yozib chiqqach, birovning vositasidan foydalanganda aynan nima bilan tavakkal qilayotganingizni tushunasiz. Kod ochiq: pnueli, MIT, havola manbalarda.

Manbalar

Maqoladagi da’volarni tekshirish mumkin: quyida qayta hikoya emas, birlamchi manbalar.

  1. 01Clarke, Grumberg, Peled. Model CheckingQisman tartiblangan qisqartirish va ample toʻplam shartlari
  2. 02TLA+ va TLCXuddi shu vazifa uchun sanoat vositasi
  3. 03SPINProtokollar modelini tekshirish, oʻn yilliklar amaliyoti
  4. 04Amir Pnueli — Turing mukofotiDasturlarni verifikatsiya qilishda vaqt mantigʻi: «doim» va «qachondir»
  5. 05pnueliMaqoladagi vosita: MIT, qisqartirishlar yonida toʻliq saralash
Muallif
Doniyor Botirov
dbit.one asoschisi · maqola muallifi

Bu maqola, boshqalaridan farqli oʻlaroq, ism bilan imzolangan: uning ortida mijoz yoʻq. Gap ketayotgan kod toʻliq ochiq va oʻsha ismda chop etilgan — uni oʻqish, ishga tushirish va maqoladagi daʼvolarni soʻzga ishonmasdan tekshirish mumkin.

Tegishli xizmatlar

Keyingi o‘qish

Loyihangiz bo‘yicha savollar bormi?

Vazifangizni tasvirlang — 24 soat ichida baho, muddat va reja bilan qaytamiz.

[email protected]