14-bo‘lim

Kod tekshiruvi va sifat nazorati

Samarali kod tekshiruvi, statik tahlil vositalari, sifat ko'rsatkichlari va juftlikda dasturlash.

🕑 13 daqiqa o‘qish 📄 1 260 so‘z 👁 7 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Nima uchun kod tekshiruvi?
  2. Muallif uchun
  3. Tekshiruvchi uchun
  4. Izoh yozish
  5. Nizolarni hal qilish
  6. Statik tahlil
  7. Murakkablikni o'lchash
  8. Sifat ko'rsatkichlari
  9. DORA ko'rsatkichlari
  10. Juftlikda dasturlash
  11. Avtomatlashtirish
  12. Tekshiruv madaniyati
  13. Xulosa

Kod tekshiruvi - xatolarni topishning eng arzon usullaridan biri va bilim almashishning eng samarali yo'li.

Nima uchun kod tekshiruvi? #

Kod tekshiruvi nima beradi? Aniq foyda • Xatolarni erta topish • Kod sifatini oshirish Yashirin foyda • Bilim almashish • Jamoaviy mas'uliyat Uzoq muddatli • "Avtobus omili" kamayadi • Yangi a'zolar tez o'rganadi Madaniyat • Standartlar tabiiy tarqaladi • "Mening kodim" emas, "bizniki" Tadqiqotlarga ko'ra kod tekshiruvi xatolarning 60 foizigacha topadi
Bilim almashish - ko'pincha xato topishdan ham qimmatliroq
"Avtobus omili"

"Jamoadan nechta odam avtobus urib ketsa, loyiha to'xtaydi?"

Agar javob 1 bo'lsa - jiddiy xavf bor. Kod tekshiruvi bilimni tarqatib, bu raqamni oshiradi.

Muallif uchun #

PR ni tayyorlash
  1. Kichik qiling - 400 satrdan oshmasin
  2. O'zingiz avval o'qing - git diff ni ko'zdan kechiring
  3. Tavsif yozing: nima, nima uchun, qanday tekshirish
  4. Testlar bo'lsin
  5. CI yashil bo'lsin - tekshiruvchini kutmasin
  6. Qiyin joylarni o'zingiz izohlang
  7. Nima tekshirilishini ayting: "arxitekturaga e'tibor bering"
MARKDOWN
## Nima qilindi
Buyurtma bekor qilish imkoniyati qo'shildi.

## Nima uchun
Mijozlar noto'g'ri buyurtma bergan holatda qo'llab-quvvatlashga
qo'ng'iroq qilishga majbur edi (oyiga ~40 murojaat).

## Qanday tekshirish
1. Yangi buyurtma yarating
2. "Bekor qilish" tugmasini bosing
3. Buyurtma holati "bekor" ga o'zgarganini tekshiring
4. Ombor qaytarilganini tekshiring

## E'tibor bering
- `BuyurtmaHolati` enum ga o'tish qoidalari qo'shildi
- Bekor qilish faqat "yangi" va "tolangan" holatlarida mumkin
- Ombor qaytarish tranzaksiya ichida

Fixes #142
PR hajmi va tekshiruv sifati
SatrlarNima bo'ladi
1-50Har bir satr diqqat bilan o'qiladi
50-200Yaxshi tekshiriladi
200-400Asosiy joylar ko'riladi
400-1000Yuzaki ko'rib chiqiladi
1000+"LGTM" - hech nima o'qilmaydi

2000 satrli PR - tekshiruvsiz merge bilan barobar.

Tekshiruvchi uchun #

Nimaga e'tibor berish kerak? 1. To'g'rilik Kod nima qilishi kerak bo'lsa, shuni qiladimi? 2. Xavfsizlik Inyeksiya, huquq tekshiruvi, ma'lumot oshkorligi 3. Chekka holatlar null, bo'sh massiv, nol, juda katta qiymat 4. O'qilishi Nomlar, tuzilma, murakkablik 5. Uslub Avtomatik formatlovchi hal qilsin - bu haqda bahslashmang
Yuqoridagilarga ko'proq vaqt ajrating
Tekshiruv savollari
Natija
[ ] Kod talabga mos keladimi?
[ ] Chekka holatlar ishlanganmi? (null, bo'sh, nol, manfiy)
[ ] Xatolar to'g'ri ishlanadimi?
[ ] SQL inyeksiya, XSS xavfi bormi?
[ ] Huquq tekshiruvi bormi?
[ ] Testlar yozilganmi va ular mazmunlimi?
[ ] Nomlar tushunarlimi?
[ ] Takrorlanish yo'qmi?
[ ] Ishlash muammosi bo'ladimi? (N+1, tsikldagi so'rov)
[ ] Hujjat yangilanganmi?
[ ] Sirlar kodga tushib qolmaganmi?

Izoh yozish #

YomonYaxshi
"Bu noto'g'ri""$mahsulotlar bo'sh bo'lsa, 24-satrda bo'linish xatosi chiqadi"
"Nima uchun shunday qildingiz?""Bu yondashuvni tanlash sababini tushuntira olasizmi?"
"Bu kod dahshat""Bu metodni ikkiga bo'lsak, o'qish osonroq bo'ladi deb o'ylayman"
"O'zgartiring""array_map bilan yozsak qisqaroq chiqadi. Sizningcha?"
Belgilar bilan muhimlikni ko'rsating
Natija
[blocker]  Bu SQL inyeksiyaga ochiq - parametrlash kerak
[muhim]    Bo'sh massivda xato beradi
[savol]    Bu yerda tranzaksiya kerak emasmi?
[taklif]   Erta qaytish bilan soddalashtirsa bo'ladi
[nit]      Kichik: nom `$x` emas, `$soni` bo'lsa yaxshi
[maqtov]   Bu yechim juda chiroyli chiqibdi

[nit] - "bu majburiy emas" degan signal. [blocker] - "buni tuzatmasdan merge qilmaymiz".

Bu belgilar chalkashlikni yo'q qiladi.

Maqtovni ham yozing

Kod tekshiruvi faqat kamchilik topish emas.

*"Bu chekka holatni hisobga olganingiz zo'r - men buni o'ylamagan bo'lardim."*

Bunday izohlar jamoa muhitini yaxshilaydi va yaxshi amaliyotni mustahkamlaydi.

Nizolarni hal qilish #

Muhokama uzayib ketsa

Uch marta izoh almashinuvidan keyin ham kelishuv bo'lmasa:

  1. Gaplashing - 5 daqiqalik suhbat 20 ta izohdan samaraliroq
  2. Uchinchi fikr so'rang
  3. Ma'lumotga tayaning - o'lchov, hujjat, standart
  4. Qaror qabul qiluvchini aniqlang (texnik yetakchi)
  5. Kelishuvni yozib qo'ying - keyingi safar bahs bo'lmasin

Ba'zan to'g'ri javob: "kelishmadik, lekin bu blocker emas - keyingi PR da qaytamiz".

Statik tahlil #

Vosita odamdan oldin ishlasin.

Terminal
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse manba/ --level=8
Natija
 ------ -----------------------------------------------------------------
  Line   manba/Servislar/BuyurtmaServisi.php
 ------ -----------------------------------------------------------------
  42     Cannot call method jami() on Buyurtma|null.
  67     Parameter #1 $soni of method elementQoshing() expects int,
         string given.
  89     Method yarating() should return Buyurtma but returns
         Buyurtma|null.
 ------ -----------------------------------------------------------------

 [ERROR] Found 3 errors
YAML
# phpstan.neon
parameters:
    level: 8
    paths:
        - manba
        - testlar
    excludePaths:
        - manba/Migratsiyalar/*
    checkMissingIterableValueType: true
VositaTilNima topadi
PHPStan, PsalmPHPTur xatolari, null xavfi
mypyPythonTur mos kelmasligi
ESLint, TypeScriptJavaScriptXatolar va uslub
SonarQubeKo'p tilMurakkablik, takrorlanish, xavfsizlik
PHPMD, pylintPHP, PythonKod hidlari
Semgrep, SnykKo'p tilXavfsizlik zaifliklari
Darajani asta-sekin oshiring
YAML
# 1-hafta
level: 0

# Har hafta bittaga oshiring
level: 5

# Maqsad
level: 8

Mavjud loyihada darhol 8-darajani yoqsangiz - minglab xato chiqadi va jamoa ularni e'tiborsiz qoldiradi.

Baseline fayl ham yordam beradi:

Terminal
vendor/bin/phpstan analyse --generate-baseline

Mavjud xatolar "muzlatiladi", yangilari esa bloklaydi.

Murakkablikni o'lchash #

PHP
// Siklomatik murakkablik = 8
public function narxHisoblang(Buyurtma $b, Mijoz $m, ?Kupon $k): float
{
    $narx = $b->jami();

    if ($m->daraja() === 'oltin') {              // +1
        $narx *= 0.9;
    } elseif ($m->daraja() === 'kumush') {       // +1
        $narx *= 0.95;
    }

    if ($k !== null) {                            // +1
        if ($k->amalQiladimi()) {                 // +1
            if ($k->turi() === 'foiz') {          // +1
                $narx *= (1 - $k->qiymat() / 100);
            } else {                              // +1
                $narx -= $k->qiymat();
            }
        }
    }

    if ($narx < 0) {                              // +1
        $narx = 0;
    }

    return $narx;
}
MurakkablikBaho
1-5Oddiy, xavfsiz
6-10Qabul qilinadigan
11-20Murakkab, bo'lish kerak
21+Juda xavfli, albatta refaktoring
Murakkablik va testlar

Siklomatik murakkablik - kodni to'liq qoplash uchun kerakli minimal test soni.

Murakkablik 20 bo'lsa, uni to'liq testlash uchun 20 ta test kerak. Shuning uchun murakkab metodlar odatda yomon testlanadi.

Sifat ko'rsatkichlari #

Kuzatish foydali bo'lgan ko'rsatkichlar Foydali • Ishlab chiqarishdagi xatolar soni • Yetkazish chastotasi • Tiklanish vaqti Ehtiyot bo'ling • Test qoplamasi • Texnik qarz indeksi • PR tekshiruv vaqti Hech qachon KPI qilmang • Kod satrlari soni → dasturchilar uzun kod yozadi • Kommitlar soni → mayda kommitlar yasaladi • Test qoplamasi foizi → bo'sh testlar yoziladi
Gudxart qonuni: o'lchov maqsadga aylansa, u yaxshi o'lchov bo'lmay qoladi
Gudxart qonuni

*"Har qanday o'lchov maqsadga aylansa, u yaxshi o'lchov bo'lmay qoladi."*

Test qoplamasini 80% ga yetkazish talab qilinsa, jamoa quyidagini yozadi:

PHP
public function test_hammasi_ishlaydi(): void
{
    $servis = new BuyurtmaServisi(/* ... */);
    $servis->yarating(1, []);
    $servis->bekorQiling(1);
    $servis->holatOzgartiring(1, 'yolda');

    $this->assertTrue(true);      // qoplama 80%, foyda 0%
}

DORA ko'rsatkichlari #

Google tadqiqotiga asoslangan to'rt ko'rsatkich:

Ko'rsatkichYuqori samarali jamoa
Yetkazish chastotasiKuniga bir necha marta
O'zgarish yetkazish vaqtiBir kundan kam
Xato darajasi15% dan kam
Tiklanish vaqtiBir soatdan kam
Bu ko'rsatkichlar nima uchun yaxshi?

Ularni "aldash" qiyin va ular haqiqiy natijani o'lchaydi: mijozga qiymat yetkazish tezligi va barqarorligi.

Ular jamoani emas, jarayonni baholaydi.

Juftlikda dasturlash #

Natija
Haydovchi (Driver):  klaviatura oldida, kod yozadi
Navigator:           o'ylaydi, yo'nalish beradi, xatolarni sezadi

Har 15-30 daqiqada rollar almashadi
AfzalligiKamchiligi
Xato darhol topiladiIkki dasturchi bitta vazifada
Bilim tez tarqaladiCharchatadi
Kod tekshiruvi real vaqtdaHamma uchun qulay emas
Yangi a'zoni tez o'rgatadiMuvofiqlashtirish kerak
Qachon juftlikda ishlash foydali?
  • Murakkab vazifa
  • Yangi a'zoni o'qitish
  • Kritik kod (to'lov, xavfsizlik)
  • Notanish sohaga kirish
  • Ikki kishi bir muammoda uzoq qolib ketganda

Doimiy juftlikda ishlash odatda ortiqcha. Kunning bir qismi yetarli.

Avtomatlashtirish #

YAML
# .github/workflows/sifat.yml
name: Kod sifati

on: [pull_request]

jobs:
  tekshiruv:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          coverage: xdebug

      - run: composer install --prefer-dist --no-progress

      - name: Kod uslubi
        run: vendor/bin/php-cs-fixer fix --dry-run --diff

      - name: Statik tahlil
        run: vendor/bin/phpstan analyse --error-format=github

      - name: Testlar
        run: vendor/bin/phpunit --coverage-clover=coverage.xml

      - name: Xavfsizlik
        run: composer audit

      - name: Qoplama tekshiruvi
        run: |
          FOIZ=$(php -r '
            $x = simplexml_load_file("coverage.xml");
            $m = $x->project->metrics;
            echo round((int)$m["coveredstatements"] / (int)$m["statements"] * 100);
          ')
          echo "Qoplama: ${FOIZ}%"
          if [ "$FOIZ" -lt 70 ]; then
            echo "Qoplama 70% dan past"
            exit 1
          fi
Avtomatlashtiriladigan hamma narsani avtomatlashtiring

Odam faqat odam qila oladigan ishga vaqt sarflasin:

  • Mantiq to'g'rimi?
  • Yechim mos keladimi?
  • Chekka holatlar o'ylanganmi?

Formatlash, tur xatolari, oddiy hidlar - vosita ishi.

Tekshiruv madaniyati #

Sog'lom madaniyat belgilari
BelgiIzoh
Tekshiruv 24 soat ichidaPR uzoq kutmaydi
Hamma tekshiradiFaqat yetakchi emas
Izohlar hurmatliKodga qaratilgan, odamga emas
Savol berish normal"Tushunmadim" - kuchsizlik emas
Maqtov ham borFaqat tanqid emas
Kelishmovchilik tez hal bo'ladiGaplashish orqali
Yosh dasturchi ham tekshiradiU yangi ko'z bilan qaraydi
Nosog'lom belgilar
  • PR bir hafta kutadi
  • "Rezina muhr" tasdiqlar (o'qimasdan)
  • Shaxsiy tanqid
  • Faqat bitta odam tekshiradi
  • Tekshiruvchi kodni butunlay qayta yozishni talab qiladi
  • Formatlash haqida uzun bahslar
  • "Men ham shunday qilaman" degan majburlash
Tekshiruvchi kod egasi emas

Tekshiruvchining vazifasi - kod yetarlicha yaxshi ekanini tasdiqlash, uni o'zi yozgandek qilish emas.

"Men boshqacha yozgan bo'lardim" - merge ga to'siq emas.

Amaliy topshiriq
  1. So'nggi PR ingizni yuqoridagi tekshiruv ro'yxati bo'yicha baholang.
  2. To'liq PR tavsifi shablonini yozing.
  3. Do'stingizning kodini tekshiring va 5 ta izoh yozing.
  4. Izohlarni belgilar bilan tasniflang.
  5. Kamida bitta maqtov izohi yozing.
  6. PHPStan (yoki tilingiz uchun analog) o'rnating va 0-darajadan boshlang.
  7. Darajani asta-sekin 5 gacha oshiring.
  8. Loyihangizdagi eng murakkab metodni toping va uni bo'ling.
  9. CI ga statik tahlil va uslub tekshiruvini qo'shing.
  10. Hamkasbingiz bilan 1 soat juftlikda dasturlang.

Xulosa #

  • Kod tekshiruvi xatolarning 60 foizigacha topadi va bilim tarqatadi.
  • PR 400 satrdan oshmasin - katta PR aslida tekshirilmaydi.
  • PR tavsifida nima, nima uchun, qanday tekshirish bo'lsin.
  • Ustuvorlik: to'g'rilik → xavfsizlik → chekka holatlar → o'qilishi → uslub.
  • Izoh kodga qaratilsin, odamga emas; belgilar bilan muhimlikni ko'rsating.
  • Maqtovni ham yozing.
  • Uzoq bahsni suhbat bilan hal qiling.
  • Statik tahlil odamdan oldin ishlasin; darajani asta-sekin oshiring.
  • Siklomatik murakkablik kerakli test sonini bildiradi.
  • Gudxart qonuni: o'lchovni KPI qilmang.
  • DORA ko'rsatkichlari jarayonni to'g'ri baholaydi.
  • Avtomatlashtiriladigan hamma narsani avtomatlashtiring.

Keyingi bo'limda refaktoring va texnik qarzni ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.