14-bo‘lim
Kod tekshiruvi va sifat nazorati
Samarali kod tekshiruvi, statik tahlil vositalari, sifat ko'rsatkichlari va juftlikda dasturlash.
Ushbu bo‘lim mundarijasi
Kod tekshiruvi - xatolarni topishning eng arzon usullaridan biri va bilim almashishning eng samarali yo'li.
Nima uchun kod tekshiruvi? #
"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 #
- Kichik qiling - 400 satrdan oshmasin
- O'zingiz avval o'qing -
git diffni ko'zdan kechiring - Tavsif yozing: nima, nima uchun, qanday tekshirish
- Testlar bo'lsin
- CI yashil bo'lsin - tekshiruvchini kutmasin
- Qiyin joylarni o'zingiz izohlang
- Nima tekshirilishini ayting: "arxitekturaga e'tibor bering"
## 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
| Satrlar | Nima bo'ladi |
|---|---|
| 1-50 | Har bir satr diqqat bilan o'qiladi |
| 50-200 | Yaxshi tekshiriladi |
| 200-400 | Asosiy joylar ko'riladi |
| 400-1000 | Yuzaki ko'rib chiqiladi |
| 1000+ | "LGTM" - hech nima o'qilmaydi |
2000 satrli PR - tekshiruvsiz merge bilan barobar.
Tekshiruvchi uchun #
[ ] 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 #
| Yomon | Yaxshi |
|---|---|
| "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?" |
[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.
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 #
Uch marta izoh almashinuvidan keyin ham kelishuv bo'lmasa:
- Gaplashing - 5 daqiqalik suhbat 20 ta izohdan samaraliroq
- Uchinchi fikr so'rang
- Ma'lumotga tayaning - o'lchov, hujjat, standart
- Qaror qabul qiluvchini aniqlang (texnik yetakchi)
- 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.
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse manba/ --level=8
------ -----------------------------------------------------------------
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
# phpstan.neon
parameters:
level: 8
paths:
- manba
- testlar
excludePaths:
- manba/Migratsiyalar/*
checkMissingIterableValueType: true
| Vosita | Til | Nima topadi |
|---|---|---|
| PHPStan, Psalm | PHP | Tur xatolari, null xavfi |
| mypy | Python | Tur mos kelmasligi |
| ESLint, TypeScript | JavaScript | Xatolar va uslub |
| SonarQube | Ko'p til | Murakkablik, takrorlanish, xavfsizlik |
| PHPMD, pylint | PHP, Python | Kod hidlari |
| Semgrep, Snyk | Ko'p til | Xavfsizlik zaifliklari |
# 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:
vendor/bin/phpstan analyse --generate-baseline
Mavjud xatolar "muzlatiladi", yangilari esa bloklaydi.
Murakkablikni o'lchash #
// 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;
}
| Murakkablik | Baho |
|---|---|
| 1-5 | Oddiy, xavfsiz |
| 6-10 | Qabul qilinadigan |
| 11-20 | Murakkab, bo'lish kerak |
| 21+ | Juda xavfli, albatta refaktoring |
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 #
*"Har qanday o'lchov maqsadga aylansa, u yaxshi o'lchov bo'lmay qoladi."*
Test qoplamasini 80% ga yetkazish talab qilinsa, jamoa quyidagini yozadi:
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'rsatkich | Yuqori samarali jamoa |
|---|---|
| Yetkazish chastotasi | Kuniga bir necha marta |
| O'zgarish yetkazish vaqti | Bir kundan kam |
| Xato darajasi | 15% dan kam |
| Tiklanish vaqti | Bir soatdan kam |
Ularni "aldash" qiyin va ular haqiqiy natijani o'lchaydi: mijozga qiymat yetkazish tezligi va barqarorligi.
Ular jamoani emas, jarayonni baholaydi.
Juftlikda dasturlash #
Haydovchi (Driver): klaviatura oldida, kod yozadi
Navigator: o'ylaydi, yo'nalish beradi, xatolarni sezadi
Har 15-30 daqiqada rollar almashadi
| Afzalligi | Kamchiligi |
|---|---|
| Xato darhol topiladi | Ikki dasturchi bitta vazifada |
| Bilim tez tarqaladi | Charchatadi |
| Kod tekshiruvi real vaqtda | Hamma uchun qulay emas |
| Yangi a'zoni tez o'rgatadi | Muvofiqlashtirish kerak |
- 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 #
# .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
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 #
| Belgi | Izoh |
|---|---|
| Tekshiruv 24 soat ichida | PR uzoq kutmaydi |
| Hamma tekshiradi | Faqat yetakchi emas |
| Izohlar hurmatli | Kodga qaratilgan, odamga emas |
| Savol berish normal | "Tushunmadim" - kuchsizlik emas |
| Maqtov ham bor | Faqat tanqid emas |
| Kelishmovchilik tez hal bo'ladi | Gaplashish orqali |
| Yosh dasturchi ham tekshiradi | U yangi ko'z bilan qaraydi |
- 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
Tekshiruvchining vazifasi - kod yetarlicha yaxshi ekanini tasdiqlash, uni o'zi yozgandek qilish emas.
"Men boshqacha yozgan bo'lardim" - merge ga to'siq emas.
- So'nggi PR ingizni yuqoridagi tekshiruv ro'yxati bo'yicha baholang.
- To'liq PR tavsifi shablonini yozing.
- Do'stingizning kodini tekshiring va 5 ta izoh yozing.
- Izohlarni belgilar bilan tasniflang.
- Kamida bitta maqtov izohi yozing.
- PHPStan (yoki tilingiz uchun analog) o'rnating va 0-darajadan boshlang.
- Darajani asta-sekin 5 gacha oshiring.
- Loyihangizdagi eng murakkab metodni toping va uni bo'ling.
- CI ga statik tahlil va uslub tekshiruvini qo'shing.
- 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.