GoDasturchi
Binary Search for Bugs

Binary Search for Bugs

Xatoni ikkiga bo'lib qidirish

Qalin lug'atdan bitta so'zni qidirayotganingizni tasavvur qiling. Birinchi sahifadan boshlab, bir-bir varaqlab qidirasizmi? Albatta yo'q — siz lug'atni O'RTASIDAN ochasiz, kerakli so'z alifboda undan oldinmi keyinmi ekanini ko'rasiz, so'ngra yarim qismni tashlab, qolgan yarmini yana o'rtasidan ochasiz. Har bir qadamda qidiruv maydoni YARMIGA qisqaradi — shuning uchun ming sahifali lug'atda so'zni bor-yo'g'i o'n qadamda topasiz.

Xato qayerda ekanini bilmagan katta kod bazasida ham AYNAN shu strategiya ishlaydi: kod qatorlarini birma-bir tekshirish o'rniga, dasturning "o'rtasida" tekshiruv qo'yib, xato shu nuqtadan OLDINmi yoki KEYINmi ekanini aniqlaysiz, so'ngra faqat shu yarmini yana ikkiga bo'lasiz.

Masalan, ma'lumotlar 10 bosqichli tayyorlash liniyasidan (pipeline) o'tib, oxirida noto'g'ri natija chiqyapti deylik. Barcha 10 bosqichni birma-bir tekshirish o'rniga: 5-bosqichdan keyingi qiymatni chop eting. To'g'rimi? Demak xato 6-10 orasida — endi 8-bosqichni tekshiring. Noto'g'rimi? Demak xato 1-5 orasida — endi 3-bosqichni tekshiring. Bor-yo'g'i 3-4 tekshiruv bilan, 10 bosqichdan xatoni 1 bosqichgacha toraytirdingiz.

QadamTekshirilgan nuqtaNatijaXulosa
15-bosqichdan keyinTo'g'riXato 6-10 orasida
28-bosqichdan keyinNoto'g'riXato 6-8 orasida
37-bosqichdan keyinTo'g'riXato aynan 8-bosqichda

Bu strategiya faqat chiziqli pipeline'larga emas — istalgan "qatorlar ketma-ketligi", "commit tarixi" (git bisect buyrug'i aynan shu tamoyilda ishlaydi — qaysi commit xatoni kiritganini toraytirib topadi), yoki "kirish ma'lumotlarining qaysi qismi" (katta faylning qaysi yarmi xato keltirib chiqaryapti) kabi holatlarga ham qo'llanadi. Muhim shart — muammoni "oldin/keyin" yoki "bu yarim/u yarim" tarzida bo'lish mumkin bo'lishi kerak.

Bu — Reproduce Before You Fix darsida ko'rgan ishonchli qayta hosil qilishga TAYANADI: agar xatoni har safar bir xil aniqlikda qayta chaqira olmasangiz, "bu nuqtada to'g'rimi-noto'g'rimi" savolining javobi ishonchsiz bo'lib qoladi, va butun ikkiga-bo'lish strategiyasi ishlamay qoladi. Shuning uchun bisecting har doim ishonchli reproduksiyadan KEYIN qo'llaniladi.

Key Takeaway

Key Takeaway:

Katta qidiruv maydonida xatoni bir-bir emas, O'RTADAN boshlab qidiring: har bir tekshiruv qidiruv maydonini yarmiga qisqartiradi. Bu strategiya pipeline bosqichlarida, kod tarixida (git bisect) va katta ma'lumotlarda bir xil samaradorlik bilan ishlaydi.

NEXT UP

Reading a Stack Trace

Binary Search for Bugs

Xatoni ikkiga bo'lib qidirish

Qalin lug'atdan bitta so'zni qidirayotganingizni tasavvur qiling. Birinchi sahifadan boshlab, bir-bir varaqlab qidirasizmi? Albatta yo'q — siz lug'atni O'RTASIDAN ochasiz, kerakli so'z alifboda undan oldinmi keyinmi ekanini ko'rasiz, so'ngra yarim qismni tashlab, qolgan yarmini yana o'rtasidan ochasiz. Har bir qadamda qidiruv maydoni YARMIGA qisqaradi — shuning uchun ming sahifali lug'atda so'zni bor-yo'g'i o'n qadamda topasiz.

Xato qayerda ekanini bilmagan katta kod bazasida ham AYNAN shu strategiya ishlaydi: kod qatorlarini birma-bir tekshirish o'rniga, dasturning "o'rtasida" tekshiruv qo'yib, xato shu nuqtadan OLDINmi yoki KEYINmi ekanini aniqlaysiz, so'ngra faqat shu yarmini yana ikkiga bo'lasiz.

Masalan, ma'lumotlar 10 bosqichli tayyorlash liniyasidan (pipeline) o'tib, oxirida noto'g'ri natija chiqyapti deylik. Barcha 10 bosqichni birma-bir tekshirish o'rniga: 5-bosqichdan keyingi qiymatni chop eting. To'g'rimi? Demak xato 6-10 orasida — endi 8-bosqichni tekshiring. Noto'g'rimi? Demak xato 1-5 orasida — endi 3-bosqichni tekshiring. Bor-yo'g'i 3-4 tekshiruv bilan, 10 bosqichdan xatoni 1 bosqichgacha toraytirdingiz.

QadamTekshirilgan nuqtaNatijaXulosa
15-bosqichdan keyinTo'g'riXato 6-10 orasida
28-bosqichdan keyinNoto'g'riXato 6-8 orasida
37-bosqichdan keyinTo'g'riXato aynan 8-bosqichda

Bu strategiya faqat chiziqli pipeline'larga emas — istalgan "qatorlar ketma-ketligi", "commit tarixi" (git bisect buyrug'i aynan shu tamoyilda ishlaydi — qaysi commit xatoni kiritganini toraytirib topadi), yoki "kirish ma'lumotlarining qaysi qismi" (katta faylning qaysi yarmi xato keltirib chiqaryapti) kabi holatlarga ham qo'llanadi. Muhim shart — muammoni "oldin/keyin" yoki "bu yarim/u yarim" tarzida bo'lish mumkin bo'lishi kerak.

Bu — Reproduce Before You Fix darsida ko'rgan ishonchli qayta hosil qilishga TAYANADI: agar xatoni har safar bir xil aniqlikda qayta chaqira olmasangiz, "bu nuqtada to'g'rimi-noto'g'rimi" savolining javobi ishonchsiz bo'lib qoladi, va butun ikkiga-bo'lish strategiyasi ishlamay qoladi. Shuning uchun bisecting har doim ishonchli reproduksiyadan KEYIN qo'llaniladi.

Key Takeaway

Key Takeaway:

Katta qidiruv maydonida xatoni bir-bir emas, O'RTADAN boshlab qidiring: har bir tekshiruv qidiruv maydonini yarmiga qisqartiradi. Bu strategiya pipeline bosqichlarida, kod tarixida (git bisect) va katta ma'lumotlarda bir xil samaradorlik bilan ishlaydi.

NEXT UP

Reading a Stack Trace