19-bo‘lim

Hujjatlar va qo'llab-quvvatlash

Qanday hujjat yozish kerak, README, ADR, ish daftarchalari va tizimni uzoq muddat qo'llab-quvvatlash.

🕑 11 daqiqa o‘qish 📄 852 so‘z 👁 8 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Hujjat turlari
  2. README
  3. Kod ichidagi hujjat
  4. Arxitektura hujjati
  5. ADR - arxitektura qarorlari
  6. Ish daftarchalari
  7. O'zgarishlar jurnali
  8. Hujjatni yangi saqlash
  9. Bilimni saqlash
  10. Texnik yozish qoidalari
  11. Uzoq muddatli qo'llab-quvvatlash
  12. Loyihani topshirish
  13. Xulosa

Kod nima qilishini ko'rsatadi. Hujjat esa nima uchun shunday qilinganini tushuntiradi - va bu bilim koddan yo'qoladi.

Hujjat turlari #

To'rt turdagi hujjat Qo'llanma (Tutorial) "Menga o'rgating" Yangi boshlovchi uchun Qadamma-qadam, kafolatlangan natija Yo'riqnoma (How-to) "Buni qanday qilaman?" Aniq vazifani hal qilish Tajribali foydalanuvchi uchun Ma'lumotnoma (Reference) "Bu nima qiladi?" API, parametrlar, sozlamalar To'liq va aniq Tushuntirish (Explanation) "Nima uchun shunday?" Kontekst, qarorlar, sabablar ADR, arxitektura ko'rigi Diataxis modeli - bu turlarni aralashtirmang
Har bir tur o'z auditoriyasi va maqsadiga ega
Turlarni aralashtirmang

Ko'p README lar bir vaqtda hammasi bo'lishga urinadi va natijada hech biri bo'lolmaydi.

Yangi boshlovchi qo'llanma qidiradi, tajribali - ma'lumotnoma. Ularni ajrating.

README #

MARKDOWN
# Onlayn do'kon

Kichik va o'rta biznes uchun onlayn savdo platformasi.

[![Testlar](https://github.com/.../actions/workflows/ci.yml/badge.svg)](...)
[![Qoplama](https://codecov.io/.../badge.svg)](...)

## Nima qiladi?

- Mahsulotlar katalogi va qidiruv
- Savat va buyurtma berish
- To'lov tizimlari bilan integratsiya
- Admin panel va hisobotlar

## Tez boshlash

    git clone [email protected]:kompaniya/dokon.git
    cd dokon
    cp .env.example .env
    docker compose up -d
    docker compose exec ilova php tools/migrate.php
    docker compose exec ilova php tools/seed.php

Sayt: http://localhost:8080
Admin: [email protected] / admin123

## Talablar

| Dastur | Versiya |
|--------|---------|
| PHP | 8.2+ |
| MySQL | 8.0+ |
| Redis | 7.0+ |
| Node.js | 20+ |

## Loyiha tuzilishi

    manba/
      Modullar/       - biznes modullar
      Umumiy/         - umumiy kod
    public/           - veb-ildiz
    database/         - migratsiyalar va seedlar
    testlar/          - testlar
    hujjatlar/        - batafsil hujjatlar

## Hujjatlar

- [Arxitektura](hujjatlar/arxitektura.md)
- [API](hujjatlar/api.md)
- [Ishlab chiqish](hujjatlar/ishlab-chiqish.md)
- [Deploy](hujjatlar/deploy.md)
- [Hissa qo'shish](CONTRIBUTING.md)

## Litsenziya

Xususiy. Barcha huquqlar himoyalangan.
README uchun 5 daqiqa qoidasi

Yangi dasturchi README ni o'qib, 5 daqiqada loyihani ishga tushira olishi kerak.

Agar u savol berish yoki hamkasbdan so'rashga majbur bo'lsa - README to'liq emas.

Buni sinash oson: yangi a'zoni kuzating va u qayerda to'xtaganini yozib boring.

Kod ichidagi hujjat #

PHP
/**
 * Buyurtmani bekor qiladi va omborni qaytaradi.
 *
 * Bekor qilish faqat "yangi" va "tolangan" holatlarida mumkin.
 * "Yolda" yoki "yetkazilgan" buyurtmani bekor qilib bo'lmaydi -
 * bunday holatda qaytarish jarayoni ishlatiladi.
 *
 * To'langan buyurtma bekor qilinganda pul avtomatik qaytarilmaydi -
 * bu buxgalteriya qo'lda tasdiqlashini talab qiladi (VZM-2024/17).
 *
 * @throws BuyurtmaTopilmadi
 * @throws BekorQilishMumkinEmas Holat ruxsat bermasa
 * @throws RuxsatYoq Foydalanuvchi huquqi bo'lmasa
 */
public function bekorQiling(BuyurtmaId $id, Foydalanuvchi $kim, string $sabab): void
Nimani hujjatlash kerak?
HujjatlangHujjatlamang
Nima uchun shunday qilinganKod nima qilayotgani
Biznes qoidalari va ularning manbasiGetter va setter lar
Nostandart yechimlarOchiq-oydin narsalar
Tashqi cheklovlarKod takrori
Xavfli joylarHar bir parametr turi
Istisnolar
PHP
// YOMON: kod takrori
/**
 * Foydalanuvchi identifikatorini qaytaradi.
 * @return int Foydalanuvchi identifikatori
 */
public function idOling(): int
{
    return $this->id;
}

// YAXSHI: sababni tushuntiradi
/**
 * Narxni 100 ga bo'lmasdan qaytaradi.
 *
 * To'lov provayderi summani tiyinda kutadi. Bu API ning
 * o'zgartirib bo'lmaydigan talabi.
 */
public function tiyindaNarx(): int

Arxitektura hujjati #

MARKDOWN
# Arxitektura ko'rigi

## Umumiy manzara

Tizim modulli monolit sifatida qurilgan. Har bir modul o'z
domeniga ega va boshqalar bilan faqat ochiq API orqali gaplashadi.

## Modullar

| Modul | Javobgarligi | Egasi |
|-------|--------------|-------|
| Katalog | Mahsulotlar, kategoriyalar, qidiruv | @jasur |
| Savat | Savat holati, hisob-kitob | @husanboy |
| Buyurtma | Buyurtma hayotiy tsikli | @husanboy |
| To'lov | To'lov provayderlari integratsiyasi | @aziz |
| Xabarnoma | Email, SMS, push | @malika |

## Modullararo aloqa

    Buyurtma  ──►  Katalog     (mahsulot ma'lumoti)
    Buyurtma  ──►  To'lov      (to'lov yaratish)
    Buyurtma  ──►  Xabarnoma   (hodisa orqali)

Sinxron chaqiruvlar - faqat o'qish uchun.
Yozish amallari - hodisalar orqali.

## Ma'lumot oqimi

1. Foydalanuvchi savatga mahsulot qo'shadi (Savat moduli)
2. Buyurtma yaratiladi (Buyurtma moduli)
3. `BuyurtmaYaratildi` hodisasi e'lon qilinadi
4. Xabarnoma moduli email yuboradi
5. Katalog moduli omborni kamaytiradi

## Texnologiyalar

| Qatlam | Texnologiya | Sabab |
|--------|-------------|-------|
| Backend | PHP 8.3 | Jamoa tajribasi |
| Baza | MySQL 8.0 | Hosting qo'llab-quvvatlaydi |
| Kesh | Redis 7 | Savat va sessiyalar |
| Navbat | Redis | Qo'shimcha infratuzilma kerak emas |
| Frontend | Vanilla JS | Sodda, freymvork ortiqcha |

## Cheklovlar

- Barcha ma'lumot O'zbekiston hududida saqlanishi kerak (qonun talabi)
- To'lov ma'lumotlari saqlanmaydi - provayderga yo'naltiriladi
- Sayt 3G tarmoqda ham ishlashi kerak

## Ma'lum muammolar

Qarang: [Texnik qarz reyestri](texnik-qarz.md)

ADR - arxitektura qarorlari #

MARKDOWN
# ADR-012: Savat uchun Redis

**Sana:** 2026-08-20
**Holat:** Qabul qilindi
**Ishtirokchilar:** @husanboy (arxitektor), @jasur, @aziz

## Kontekst

Savat ma'lumoti MySQL da saqlanadi. Cho'qqi paytida (soat 19:00-22:00)
`savat_elementlari` jadvaliga yozish sekinlashmoqda.

O'lchovlar (2026-08-15, cho'qqi):
- Savatga qo'shish, o'rtacha: 180 ms
- 95-protsentil: 900 ms
- MySQL yozish operatsiyalarining 40% - savat

Savat ma'lumotining hayoti:
- 78% savat 24 soat ichida tashlab yuboriladi
- 15% buyurtmaga aylanadi
- 7% 7 kundan ko'proq saqlanadi

## Ko'rib chiqilgan variantlar

### 1. MySQL da qoldirish, indekslarni optimallashtirish
- (+) Yangi infratuzilma kerak emas
- (-) Yozish yuki qoladi
- (-) Taxminiy foyda: 30-40%

### 2. Redis (tanlandi)
- (+) Yozish 5-10 ms
- (+) TTL bilan avtomatik tozalash
- (+) Sessiyalar uchun ham ishlatiladi
- (-) Yangi infratuzilma komponenti
- (-) Redis o'chsa savatlar yo'qoladi

### 3. Brauzer localStorage
- (+) Server yuki umuman yo'q
- (-) Qurilmalar orasida sinxronlashmaydi
- (-) Analitika uchun ma'lumot yo'qoladi

## Qaror

Savat ma'lumotini **Redis** da saqlaymiz.

- TTL: 30 kun
- Kalit formati: `savat:{mijoz_id}` yoki `savat:mehmon:{sessiya_id}`
- Buyurtma berilganda MySQL ga ko'chiriladi
- `SavatOmborInterfeysi` orqali - MySQL ga qaytish mumkin

## Oqibatlari

**Ijobiy:**
- Savat amallari 5-10 ms
- MySQL yozish yuki 40% kamayadi
- Eski savatlar avtomatik tozalanadi

**Salbiy:**
- Redis klasteri kerak (oyiga ~$40)
- Jamoa Redis ni o'rganishi kerak
- Redis o'chsa savatlar yo'qoladi - bu **qabul qilinadi**

**Kuzatiladigan xavflar:**
- Redis xotirasi to'lishi - monitoring qo'shildi
- Ma'lumot yo'qolishi - 5 daqiqada bir marta snapshot

## Qayta ko'rib chiqish

2026-11-01 da: qaror kutilgan natija berdimi?
ADR uchun shablon

Har bir ADR da:

  1. Kontekst - qanday muammo, qanday ma'lumot
  2. Variantlar - nima ko'rib chiqildi
  3. Qaror - nima tanlandi
  4. Oqibatlar - ijobiy va salbiy
  5. Holat - taklif / qabul qilindi / bekor qilindi / almashtirildi

ADR o'zgartirilmaydi. Qaror o'zgarsa - yangi ADR yoziladi va eskisining holati "almashtirildi" ga o'zgaradi.

Ish daftarchalari #

MARKDOWN
# Ish daftarchasi: Yuqori xato darajasi

## Ogohlantirish
`YuqoriXatoDarajasi` - 5xx xatolar 5% dan yuqori

## Ta'siri
Foydalanuvchilar sahifa ocha olmaydi yoki buyurtma bera olmaydi.
**Jiddiylik:** kritik

## Birinchi qadamlar (5 daqiqa)

1. Grafana panelini oching: https://grafana.dokon.uz/d/asosiy
2. Qaysi endpoint xato berayotganini aniqlang
3. Xato boshlangan vaqtni toping

    # Oxirgi deploy vaqtini tekshiring
    kubectl rollout history deployment/ilova

## Tekshirish ro'yxati

### Deploy dan keyin boshlangan bo'lsa
    kubectl rollout undo deployment/ilova
Bu 30 soniyada oldingi versiyaga qaytaradi.

### Baza bilan bog'liq bo'lsa
    # Faol ulanishlar
    SHOW STATUS LIKE 'Threads_connected';

    # Sekin so'rovlar
    SHOW FULL PROCESSLIST;

    # Qulflar
    SELECT * FROM performance_schema.data_locks;

Sekin so'rov topilsa: `KILL <id>`

### Redis bilan bog'liq bo'lsa
    redis-cli INFO memory
    redis-cli INFO stats

Xotira to'lgan bo'lsa: `maxmemory-policy` ni tekshiring.

### Tashqi xizmat bilan bog'liq bo'lsa
    curl -w "%{time_total}\n" -o /dev/null -s https://api.tolov.uz/salomatlik

Javob bermasa: zanjir uzgich yoqilganini tekshiring, zaxira
rejimga o'ting.

## Eskalatsiya

30 daqiqada hal bo'lmasa:
1. @husanboy (texnik yetakchi) - +998 90 xxx-xx-xx
2. @aziz (infratuzilma) - +998 91 xxx-xx-xx

## Hodisadan keyin

- [ ] Hodisa hisobotini yozing
- [ ] Vaqt jadvalini to'ldiring
- [ ] Harakatlar ro'yxatini tuzing
- [ ] Ish daftarchasini yangilang
Ish daftarchasi - tunda uyg'onganda o'qish uchun

Uni yozayotganda tasavvur qiling: soat 3 da uyg'ongan, uyqusiragan navbatchi buni o'qiyapti.

  • Aniq buyruqlar bo'lsin, nusxalab qo'yish mumkin
  • Havolalar to'g'ridan-to'g'ri kerakli panelga
  • Qadamlar tartibda
  • Eskalatsiya aniq

O'zgarishlar jurnali #

MARKDOWN
# O'zgarishlar jurnali

Ushbu fayl [Keep a Changelog](https://keepachangelog.com/) formatiga
amal qiladi va [SemVer](https://semver.org/) versiyalashni ishlatadi.

## [Chiqarilmagan]

### Qo'shildi
- Buyurtmani bekor qilish imkoniyati (#142)

## [2.3.0] - 2026-08-20

### Qo'shildi
- Mahsulotlarni Excel ga eksport qilish (#128)
- Kategoriya bo'yicha filtrlash (#131)

### O'zgartirildi
- Savat ma'lumoti Redis da saqlanadi - tezlik 10 barobar oshdi (#135)
- Katalog sahifasi 2.1s dan 0.4s ga tezlashdi

### Tuzatildi
- Bo'sh savatda buyurtma berishga urinilganda xato (#138)
- Narx yaxlitlashda tiyin yo'qolishi (#140)

### Xavfsizlik
- IDOR zaifligi: boshqa mijozning buyurtmasini ko'rish yopildi (#141)

### Eskirdi
- `/api/v1/products` - `/api/v1/mahsulotlar` ni ishlating.
  v1 2027-01-01 da o'chiriladi.
Jurnal foydalanuvchi uchun yoziladi
Natija
YOMON: "BuyurtmaServisi refaktoring qilindi"
YAXSHI: "Buyurtma berish 3 barobar tezlashdi"

Foydalanuvchini ichki tuzilma qiziqtirmaydi - u nima o'zgarganini bilishi kerak.

Hujjatni yangi saqlash #

Hujjat eskirishiga qarshi kurash Tez eskiradi • Kod misollari • Ekran suratlari, aniq yo'llar • Konfiguratsiya qiymatlari Uzoq yashaydi • Nima uchun (ADR) • Arxitektura prinsiplari • Biznes qoidalari sabablari Yechimlar 1. Hujjatni kod bilan bir repozitoriyda saqlang 2. Kod misollarini testlar bilan tekshiring 3. PR tekshiruvida "hujjat yangilandimi?" deb so'rang
Eskirgan hujjat hujjatsizlikdan yomonroq
PHP
// Hujjatdagi misolni test bilan tekshirish
public function test_readme_dagi_misol_ishlaydi(): void
{
    // README.md dagi "Tez boshlash" bo'limidan
    $savat = new Savat();
    $savat->qoshing(mahsulotId: 1, narx: Pul::somdan(100_000), soni: 2);

    $this->assertEquals(200_000, $savat->jami()->som());
}
Hujjatni koddan yarating
PHP
/**
 * @OA\Get(
 *     path="/api/v1/mahsulotlar",
 *     summary="Mahsulotlar ro'yxati",
 *     @OA\Response(response=200, description="Muvaffaqiyatli")
 * )
 */
Terminal
vendor/bin/openapi manba/ -o public/openapi.yaml

Koddan yaratilgan hujjat hech qachon eskirmaydi.

Bilimni saqlash #

"Avtobus omili"

Loyihada faqat bitta odam biladigan narsalar bormi?

  • Deploy jarayoni
  • Ma'lum bir modulning ishlashi
  • Tashqi tizim bilan integratsiya tafsilotlari
  • Ishlab chiqarish muhitiga kirish

Bu odam ta'tilga chiqsa yoki ishdan ketsa - loyiha to'xtaydi.

Yechim: har bir kritik bilim uchun kamida ikki kishi bo'lsin va u hujjatlashtirilsin.

MARKDOWN
# Bilim xaritasi

| Soha | Asosiy | Zaxira | Hujjat |
|------|--------|--------|--------|
| Deploy jarayoni | @aziz | @husanboy | hujjatlar/deploy.md |
| To'lov integratsiyasi | @aziz | — | ❌ **XAVF** |
| Baza migratsiyalari | @husanboy | @jasur | hujjatlar/baza.md |
| Frontend qurish | @malika | @jasur | README.md |
| Monitoring | @aziz | @husanboy | hujjatlar/monitoring.md |

Texnik yozish qoidalari #

Yaxshi hujjat
  1. Qisqa jumlalar - bir jumlada bir fikr
  2. Faol nisbat: "Tizim xat yuboradi", "Xat yuboriladi" emas
  3. Aniq so'zlar: "tez" emas, "200 ms dan kam"
  4. Sarlavhalar va ro'yxatlar - o'quvchi skanerlaydi
  5. Misollar - har bir tushunchaga bittadan
  6. Auditoriyani biling - yangi boshlovchi yoki tajribali?
  7. Qisqartmalarni birinchi marta ochib bering
MARKDOWN
YOMON:
Ushbu modul foydalanuvchi tomonidan yuborilgan so'rovlarni qabul
qilish va ularni tegishli xizmatlarga yo'naltirish orqali tizimning
umumiy ishlashini ta'minlash uchun mo'ljallangan bo'lib, u turli
xil holatlarda turlicha xatti-harakat qilishi mumkin.

YAXSHI:
Bu modul so'rovlarni qabul qiladi va tegishli xizmatga yo'naltiradi.

Xatti-harakati so'rov turiga bog'liq:
- `GET` - keshdan javob beradi
- `POST` - navbatga qo'yadi
- Boshqalar - to'g'ridan-to'g'ri uzatadi

Uzoq muddatli qo'llab-quvvatlash #

Loyihaning umri davomida xarajatlar Ishlab chiqish 20-40% Qo'llab-quvvatlash va rivojlantirish 60-80% Xato tuzatish, yangi imkoniyatlar, moslash, yangilash 6-12 oy 5-10 yil Kodni yozish oson, uni yillar davomida saqlash qiyin
Shuning uchun o'qilishi oson kod yozish muhim
Qo'llab-quvvatlanadigan tizim belgilari
BelgiNima uchun
Yangi a'zo 1 haftada hissa qo'shadiKod va hujjat tushunarli
Xato o'rtacha 1 kunda tuzatiladiKodda yo'nalish topish oson
Deploy kuniga bir necha martaJarayon avtomatlashgan
Bog'liqliklar yangiMuntazam yangilanadi
Testlar 10 daqiqada o'tadiTez fikr-mulohaza
Hujjat haqiqatga mosMuntazam yangilanadi

Loyihani topshirish #

MARKDOWN
# Loyihani topshirish ro'yxati

## Kirish huquqlari
- [ ] Git repozitoriysi
- [ ] Ishlab chiqarish serveri (SSH)
- [ ] Baza (o'qish va yozish)
- [ ] Monitoring panellari
- [ ] Domen va DNS boshqaruvi
- [ ] SSL sertifikatlari
- [ ] Tashqi xizmatlar hisoblari (to'lov, SMS, email)
- [ ] Bulut provayderi

## Hujjatlar
- [ ] README - ishga tushirish
- [ ] Arxitektura ko'rigi
- [ ] Deploy jarayoni
- [ ] Ish daftarchalari
- [ ] ADR lar
- [ ] Texnik qarz reyestri
- [ ] Ma'lum muammolar ro'yxati

## Bilim uzatish
- [ ] Kod ko'rigi sessiyasi (2-4 soat)
- [ ] Deploy ni birgalikda bajarish
- [ ] Odatiy muammolarni ko'rib chiqish
- [ ] Savol-javob sessiyasi
- [ ] Bir hafta parallel ishlash

## Texnik
- [ ] Zaxira nusxa ishlayotgani tekshirildi
- [ ] Tiklash sinovdan o'tkazildi
- [ ] Monitoring ogohlantirishlari yangi jamoaga
- [ ] Sirlar almashtirildi
- [ ] Eski a'zolar huquqlari olib tashlandi
Sirlarni almashtirishni unutmang

Loyiha topshirilganda barcha sirlar almashtirilishi kerak:

  • Baza parollari
  • API kalitlari
  • SSH kalitlari
  • Shifrlash kalitlari

Eski jamoa a'zolarida ular hali ham bo'lishi mumkin.

Amaliy topshiriq
  1. Loyihangiz uchun to'liq README yozing.
  2. Yangi a'zoni sinab ko'ring: u 5 daqiqada ishga tushira oladimi?
  3. Arxitektura ko'rigi hujjatini yozing.
  4. Uchta ADR yozing (o'tmishdagi qarorlar uchun).
  5. Bitta ogohlantirish uchun ish daftarchasi yozing.
  6. CHANGELOG.md boshlang va oxirgi 3 relizni yozing.
  7. Bilim xaritasini tuzing va xavflarni belgilang.
  8. Hujjatdagi kod misolini test bilan bog'lang.
  9. Loyihani topshirish ro'yxatini to'ldiring.
  10. Bitta uzun paragrafni qisqa jumlalar va ro'yxatga aylantiring.

Xulosa #

  • To'rt turdagi hujjat: qo'llanma, yo'riqnoma, ma'lumotnoma, tushuntirish. Ularni aralashtirmang.
  • README - yangi dasturchi 5 daqiqada ishga tushira olsin.
  • Kod izohi nima uchun ni tushuntirsin, nima qilinayotganini emas.
  • ADR arxitektura qarorlari sababini saqlaydi va bir xil bahsni qaytarmaydi.
  • Ish daftarchasi - tunda uyg'onganda o'qish uchun aniq buyruqlar.
  • CHANGELOG foydalanuvchi uchun yoziladi, dasturchi uchun emas.
  • Eskirgan hujjat hujjatsizlikdan yomonroq.
  • Hujjatni kod bilan bir repozitoriyda saqlang.
  • Bilim xaritasi "avtobus omili" ni ko'rsatadi.
  • Loyiha umrining 60-80% - qo'llab-quvvatlash.
  • Topshirishda barcha sirlarni almashtiring.

Keyingi - yakuniy bo'lim: to'liq amaliy loyiha.

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.