# 10. Senior/Staff Imtihon, Amaliy Topshiriqlar va Interaktiv Sinov

> "Junior dasturchi kod yozadi. Middle dasturchi arxitekturaga ergashadi. Senior va Staff Engineer esa tizimning zaif nuqtalarini oldindan ko'ra oladi va xavfsiz, 10x miqyoslanadigan tizimlarni quradi."

---

## 1. 15 Ta Chuqur Texnik Imtihon Savollari (Interaktiv Self-Assessment)

O'z bilimingizni sinab ko'ring. Har bir savol ustida avval 1 daqiqa mustaqil o'ylab ko'ring, so'ngra yechimni ochib o'z javobingiz bilan solishtiring.

<details>
<summary><b>1-Savol: SwiftUI'da 'AnyView' nima uchun SDUI dvigatellarida qat'iyan tavsiya etilmaydi?</b></summary>

**Tahlil va Yechim:**
`AnyView` SwiftUI'ning **Structural Identity** mexanizmini yo'q qiladi (Type Erasure). Bu AttributeGraph diffing algoritmini ishdan chiqaradi va har safar ekran yangilanganda yoki scroll qilinganda butun View iyerarxiyasini xotiradan (Heap) qayta yaratadi. Natijada xotira shishishi (Memory Leak) va ekranning 120 FPS dan 30 FPS ga tushib qotishi (Drop Frame) yuzaga keladi. To'g'ri yondashuv — `@ViewBuilder`, `Group` yoki oldindan ro'yxatdan o'tgan `ComponentRegistry` dan foydalanish.
</details>

<details>
<summary><b>2-Savol: Apple App Store Review Guidelines §2.5.2 qoidasi qaysi holatda SDUI ilovani rad etadi (reject qiladi)?</b></summary>

**Tahlil va Yechim:**
SDUI deklarativ ma'lumot (JSON) yuborgani uchun qonuniy. Biroq, agar serverdan yuklangan JSON orqali ilovaning mohiyati tubdan o'zgartirilsa (masalan, ob-havo ilovasi sifatida tasdiqlanib, keyinchalik serverdan noqonuniy kazino yoki moliyaviy piramida UI'si yoqilsa) yoki ruxsatsiz dinamik JavaScript/WebAssembly orqali native API'lar manipulyatsiya qilinsa, Apple ilovani butunlay bloklaydi (§2.3.1 va §2.5.2).
</details>

<details>
<summary><b>3-Savol: Server hali sizning ilova versiyangizda mavjud bo'lmagan yangi komponent yubordi. Oddiy Decodable nima qiladi va biz qanday himoyalanamiz?</b></summary>

**Tahlil va Yechim:**
Oddiy `JSONDecoder` butun massivni parslashda xatolik (`DecodingError.dataCorrupted`) berib, barcha komponentlarni yo'q qiladi (oq ekran chiqadi). Bunga yo'l qo'ymaslik uchun biz `SafeDecodableArray` (Lossy Array Decoding) property wrapper'idan foydalanamiz. Noma'lum komponent jim tashlab ketiladi yoki `UnknownComponentFallbackView` ga aylantiriladi, qolgan barcha komponentlar esa normal chiziladi.
</details>

<details>
<summary><b>4-Savol: Nega JSON Schema'da hex ranglar (#FF3300) o'rniga Semantic Design Tokenlar ishlatilishi shart?</b></summary>

**Tahlil va Yechim:**
1. Dark Mode va Light Mode avtomatik ishlashi uchun.
2. High Contrast va Dynamic Type (ko'zi ojizlar uchun maxsus rejimlar) to'g'ri ishlashi uchun.
3. Dizayn-tizim o'zgarganda faqat mobil ilovadagi bitta rang palitrasini o'zgartirish kifoya, serverdagi millionlab satrlik JSON'larni tahrirlab o'tirish shart bo'lmaydi.
</details>

<details>
<summary><b>5-Savol: Foydalanuvchi dinamik formani to'ldirayotganda kiritish validatsiyasi nega serverda emas, klientda bajarilishi kerak?</b></summary>

**Tahlil va Yechim:**
Network Latency (tarmoq kechikishi) sababli. Agar har bir harf kiritilganda serverga so'rov yuborilsa, internet tezligiga qarab 100-300 ms kechikish bo'ladi va matn terishda jiddiy qotishlar yuzaga keladi. Shuning uchun validatsiya qoidalari (Regex, required, length) serverdan keladi, tekshirish esa klient xotirasida 0 millisekundda amalga oshiriladi.
</details>

<details>
<summary><b>6-Savol: SDUI da HTTP ETag va 304 Not Modified qanday qilib foydalanuvchi trafigini va batareyasini tejaydi?</b></summary>

**Tahlil va Yechim:**
Mobil ilova serverga so'rov yuborayotganda o'zidagi oxirgi kesh identifikatorini (`If-None-Match: "v1.4"`) yuboradi. Agar serverda ma'lumot o'zgarmagan bo'lsa, server butun JSON'ni emas, faqat 0 baytlik `304 Not Modified` javobini qaytaradi. Ilova esa mahalliy disk keshidagi mavjud snapshotni ko'rsatishda davom etadi.
</details>

<details>
<summary><b>7-Savol: Multi-step Dynamic Wizard to'lov oqimi yakunlanganda qanday qilib oraliq ekranlarni back-stack'dan tozalash kerak?</b></summary>

**Tahlil va Yechim:**
Server yakuniy ekranga `"type": "pop_to_root"` yoki `"clear_stack": true` harakatini biriktiradi. SDUIRouter ushbu komandani qabul qilib, SwiftUI `NavigationPath` ni to'liq tozalaydi (`navigationPath = NavigationPath()`). Natijada foydalanuvchi "Orqaga" bosganda yana to'lov sahifalariga qaytib qolmaydi.
</details>

<details>
<summary><b>8-Savol: Man-in-the-Middle (MitM) hujumi SDUI ilovalarda qanday xavf tug'diradi va undan qanday himoyalanamiz?</b></summary>

**Tahlil va Yechim:**
SDUI ilovalarda hacker server javobini o'zgartira olsa, u ilovaning butun interfeysini soxtalashtirishi, to'lov tugmasini o'zining fishing sahifasiga yo'naltirishi mumkin. Bunga qarshi **SSL Certificate Pinning** va javob xeshini tekshiruvchi **HMAC/RSA Digital Signature** talab qilinadi.
</details>

<details>
<summary><b>9-Savol: Agar server JSON orqali 'app://safari?url=javascript:...' kabi xavfli havolalarni yuborsa, RCE xavfidan qanday himoyalanamiz?</b></summary>

**Tahlil va Yechim:**
SDUIRouter ichida qat'iy **URL Scheme Whitelist** bo'lishi shart. Faqat tasdiqlangan sxemalar (`app://`, `https://`) va tasdiqlangan ichki domenlargina ochiladi. Har qanday `javascript:`, `file://` yoki ruxsatsiz sxemalar router tomonidan bloklanadi.
</details>

<details>
<summary><b>10-Savol: Cumulative Layout Shift (CLS) muammosini SDUI da qanday hal qilamiz?</b></summary>

**Tahlil va Yechim:**
Server har bir rasm va media elementi uchun oldindan uning `aspectRatio` ko'rsatkichini (masalan, 16:9 yoki 1.0) yuboradi. Klient rasm yuklanmasidan oldin uning aniq bo'sh joyini (Skeleton Shimmer) zaxiralab qo'yadi. Natijada rasm yuklanganda sahifaning pastga sakrashi 0 ga teng bo'ladi.
</details>

<details>
<summary><b>11-Savol: 1 yillik eski versiyadagi foydalanuvchi yangi server JSON'ini ochganda qanday xavfsizlik qoidasi qo'llaniladi?</b></summary>

**Tahlil va Yechim:**
Schema'da `minSupportedClientVersion` maydoni kiritiladi. Agar klient versiyasi ushbu ko'rsatkichdan kichik bo'lsa, server eski versiyaga mos fallback JSON yuboradi yoki klient ilovani yangilash kerakligi haqida yumshoq bildirishnoma (Soft Update Dialog) ko'rsatadi.
</details>

<details>
<summary><b>12-Savol: Nega JSON parslashda 'autoreleasepool' blokidan foydalanish xotira shishishining oldini oladi?</b></summary>

**Tahlil va Yechim:**
`JSONDecoder` parslash jarayonida millionlab vaqtinchalik `String`, `Substring` va `Dictionary` obyektlarini yaratadi. Odatda bu obyektlar RunLoop tugaguncha xotirada to'planadi. `autoreleasepool { ... }` ishlatilganda, barcha vaqtinchalik xotira darhol bo'shatiladi va iOS tomonidan **Jetsam Out-Of-Memory (OOM) Crash** bo'lishining oldi olinadi.
</details>

<details>
<summary><b>13-Savol: Qachon Yandex DivKit kabi tayyor kutubxona, qachon o'zingizning In-House dvigatelingiz tanlanadi?</b></summary>

**Tahlil va Yechim:**
Agar barcha platformalarda (Android, iOS, Web) bir xil layout kerak bo'lsa va mobil jamoa kichik bo'lsa — DivKit. Agar yuqori unumdorlik (120 FPS), minimal binar hajm (< 300 KB), to'liq SwiftUI mosligi va maxsus xavfsizlik kerak bo'lsa (FinTech/Banking) — In-House Custom Engine.
</details>

<details>
<summary><b>14-Savol: Taxi yoki Food Delivery ilovalarida SDUI nega WebSocket bilan birga ishlatiladi?</b></summary>

**Tahlil va Yechim:**
HTTP polling (har 3 soniyada serverga so'rov yuborish) batareyani va server resurslarini tez yeb qo'yadi. WebSocket orqali esa server haydovchining har bir yangi statusida (masalan, "Yetib keldi") tayyor kichik SDUI kartochkasini push qilib jo'natadi. Klient buni darhol va minimal xarajat bilan render qiladi.
</details>

<details>
<summary><b>15-Savol: SDUI da Analytics va User Tracking qanday avtomatlashtiriladi?</b></summary>

**Tahlil va Yechim:**
Har bir komponent shabloniga `tracking: { "impressionEvent": "promo_seen", "clickEvent": "promo_clicked", "params": { ... } }` biriktiriladi. `ComponentRegistry` komponent ekranga chiqqanda (`onAppear`) taassurotni, bosilganda esa klikni avtomatik ravishda analytics tizimiga (Firebase, Amplitude) jo'natadi. Dasturchi har bir tugmaga alohida analytics kodi yozib o'tirmaydi.
</details>

---

## 2. Amaliy Capstone Challenge: MiniSDUI Framework Yaratish

### Arxitektura Sxemasi:

```mermaid
graph TD
    JSON["Raw JSON Payload"] --> SafeDec["SafeDecodableArray"]
    SafeDec --> Registry["MiniSDUIRegistry.shared"]
    
    Registry -->|"header"| HeaderView["Text Header"]
    Registry -->|"card"| CardButton["Action Card Button"]
    Registry -->|"unknown"| EmptyFallback["EmptyView() (No Crash!)"]
    
    CardButton -->|"onTap"| Router["MiniSDUIRouter.shared"]
    Router --> NavStack["NavigationStack (Push / Sheet)"]

    style Registry fill:#131720,stroke:#bef264,stroke-width:2px
    style Router fill:#181d26,stroke:#7da2ce,stroke-width:1px
```

### Etalon Yechim Kodi (Master Reference Implementation):

```swift
import SwiftUI

// MARK: - 1. Core Model & Safe Contract
public struct ComponentNode: Identifiable, Sendable {
    public let id: String
    public let type: String
    public let props: [String: String]
    public let route: String?
}

// MARK: - 2. Component Registry
@MainActor
public final class MiniSDUIRegistry {
    public static let shared = MiniSDUIRegistry()
    private var builders: [String: (ComponentNode) -> AnyView] = [:]
    
    private init() {
        registerDefaultComponents()
    }
    
    private func registerDefaultComponents() {
        // 1. Sarlavha komponenti
        builders["header"] = { node in
            AnyView(
                Text(node.props["title"] ?? "")
                    .font(.title2.bold())
                    .padding(.horizontal, 16)
                    .padding(.top, 12)
            )
        }
        
        // 2. Interaktiv Karta
        builders["card"] = { node in
            AnyView(
                Button(action: {
                    if let route = node.route {
                        MiniSDUIRouter.shared.navigate(to: route)
                    }
                }) {
                    HStack {
                        VStack(alignment: .leading, spacing: 4) {
                            Text(node.props["title"] ?? "")
                                .font(.headline)
                                .foregroundColor(.primary)
                            Text(node.props["subtitle"] ?? "")
                                .font(.subheadline)
                                .foregroundColor(.secondary)
                        }
                        Spacer()
                        Image(systemName: "chevron.right")
                            .foregroundColor(.secondary)
                    }
                    .padding(16)
                    .background(Color(uiColor: .secondarySystemBackground))
                    .cornerRadius(12)
                    .padding(.horizontal, 16)
                    .padding(.vertical, 6)
                }
                .buttonStyle(.plain)
            )
        }
    }
    
    @ViewBuilder
    public func resolve(node: ComponentNode) -> some View {
        if let builder = builders[node.type] {
            builder(node)
                .id(node.id)
        } else {
            EmptyView()
        }
    }
}

// MARK: - 3. Router
@MainActor
@Observable
public final class MiniSDUIRouter {
    public static let shared = MiniSDUIRouter()
    public var path = NavigationPath()
    
    public func navigate(to route: String) {
        path.append(route)
    }
}

// MARK: - 4. Asosiy Ekran
public struct MiniSDUIScreen: View {
    public let nodes: [ComponentNode]
    @State private var router = MiniSDUIRouter.shared
    
    public var body: some View {
        NavigationStack(path: $router.path) {
            ScrollView {
                LazyVStack(spacing: 0) {
                    ForEach(nodes) { node in
                        MiniSDUIRegistry.shared.resolve(node: node)
                    }
                }
            }
            .navigationTitle("Dinamik Ekran")
            .navigationDestination(for: String.self) { route in
                VStack(spacing: 16) {
                    Text("Ochilgan Marshrut:")
                        .font(.headline)
                    Text(route)
                        .font(.caption.monospaced())
                        .foregroundColor(.blue)
                }
                .navigationTitle("Tafsilotlar")
            }
        }
    }
}
```

---

## 3. Tabriklaymiz! Endi Siz SDUI Bo'yicha Mutaxassissiz!

Siz ushbu kurs davomida:
* FAANG kompaniyalari qanday qilib relizlarsiz UI yangilashini o'rgandingiz.
* Apple App Store Review Guideline §2.5.2 qoidasini chuqur tahlil qildingiz.
* Swift 6 da xavfsiz JSON Schema va Safe Decodable mexanizmini qurdingiz.
* `AnyView` tuzog'idan qochib, 120 FPS ProMotion darajasida chizuvchi dvigatel yaratdingiz.
* Server-Driven Navigation va Dynamic Form State Store'ni amalda sinab ko'rdingiz.
* 10 ta real-world demo loyihalarning arxitekturasini tushunib yetdingiz.

Ushbu bilimlar sizga har qanday FinTech, E-Commerce yoki yirik mobil ekotizimda **Senior / Staff Mobile Architect** sifatida yuqori darajadagi tizimlarni mustaqil loyihalash imkonini beradi!
