# Bazel 20: Best practices, troubleshooting va karyera: Bazel vs Tuist vs SPM, qachon nimani tanlash

> **Holat:** 2026-yil oktabr. Tabriklaymiz! Siz 20 darslik professional "Bazel iOS: Zero to Hero" kursining yakuniy cho'qqisiga yetib keldingiz. Ushbu xulosa darsida biz butun kurs davomida o'rgangan barcha tajribalarni tizimlashtiramiz: ishlab chiqarishdagi eng yaxshi amaliyotlar (Best Practices), eng ko'p uchraydigan 5 ta xato va ularning yechimlari (Troubleshooting), zamonaviy asboblarning katta taqqoslashi (**SPM vs Tuist vs Bazel**) hamda **Mobile Infrastructure / Platform Engineering** yo'nalishidagi 2026-yilgi karyera istiqbollari.

> **Bu darsdan keyin siz:** har qanday loyiha uchun to'g'ri build tizimini mustaqil tanlay olasiz, Bazel'dagi nosozliklarni bir necha daqiqada tuzata olasiz va xalqaro bozorda kamyob bo'lgan Mobile Platform Engineer ko'nikmalariga ega bo'lasiz.

- 20 dars davomida erishilgan barcha natijalarni yaxlit xaritada ko'rasiz.
- Ishlab chiqarish darajasidagi 7 ta oltin qoidani (Best Practices) o'zlashtirasiz.
- Troubleshooting ensiklopediyasi: "Undefined symbols", "Cache miss", "Signing", "Circular dependency" xatolarining tezkor yechimlarini bilasiz.
- **SPM vs Tuist vs Bazel:** Jamoangiz hajmiga qarab to'g'ri qaror qabul qilish mezonlarini aniq olasiz.
- Mobile Platform / Infrastructure muhandisligi karyerasi va 2026-yilgi talablar bilan tanishasiz.

## Mundarija

1. [Biz bosib o'tgan 20 darslik buyuk yo'l](#bosib-otilgan-yol)
2. [Katta Taqqoslash: SPM vs Tuist vs Bazel (2026)](#taqqoslash)
3. [Qachon nimani tanlash kerak: Qaror qabul qilish matritsasi](#qaror-matritsasi)
4. [Ishlab chiqarishdagi 7 ta Oltin Qoida (Best Practices)](#oltin-qoidalar)
5. [Troubleshooting Ensiklopediyasi: Eng ko'p uchraydigan 5 ta xato](#troubleshooting)
6. [Karyera: Mobile Infrastructure & Platform Engineering](#karyera)
7. [Yakuniy O'zingizni Tekshirish Checklisti](#checklist)
8. [Xulosa va Keyingi Qadamlar](#xulosa)
9. [Manbalar](#manbalar)

---

## 1. Biz bosib o'tgan 20 darslik buyuk yo'l {#bosib-otilgan-yol}

Keling, orqaga qarab ko'raylik: biz nimani o'rgandik?

- **1–4 darslar (Asoslar):** Build nima ekanligini, Xcode chegaralarini, Bazel'ning "build — bu sof funksiya" tamoyilini, Bazelisk, `MODULE.bazel` va Starlark tilini noldan o'rgandik.
- **5–9 darslar (iOS va Xcode):** `rules_apple`, `rules_swift`, SwiftUI, testlar, Bzlmod orqali SPM kutubxonalarini ulash, haqiqiy ilova anatomiyasi va `rules_xcodeproj` orqali Xcode ichida qulay ishlashni birlashtirdik.
- **10–11 darslar (Tezlik va CI):** Action key hisoblash, local disk cache, remote cache warming, GitHub Actions va **Selective testing (rdeps)** orqali CI vaqtini 90% ga qisqartirdik.
- **12–16 darslar (5 ta Real Loyiha):** "Valyuta" CLI, "Vazifalar" SwiftUI (4 modul), "Ob-havo" (Networking + hermetik mock testlar), 12 modulli ulkan "SuperApp" va Apple Monorepo loyihalarini o'z qo'limiz bilan yig'dik.
- **17–19 darslar (Ekspertiza):** O'z Starlark qoidalarimizni yozish (`rule()`, `depset`), Performance Profiling, Critical Path tahlili, Remote Execution (RBE) va 4 bosqichli xavfsiz Migratsiya strategiyasini zabt etdik.

---

## 2. Katta Taqqoslash: SPM vs Tuist vs Bazel (2026) {#taqqoslash}

Bugungi kunda Apple ekotizimida loyihalarni boshqarish uchun 3 ta asosiy yo'nalish mavjud:

![Qachon Nimani Tanlash: SPM vs Tuist vs Bazel (2026) taqqoslash xaritasi](/lessons/images/bazel/bazel_20_tool_comparison.svg)

| Mezon | Native Xcode + SPM | Tuist 4.x | Bazel 9.x |
|:---|:---|:---|:---|
| **Konfiguratsiya tili** | Xcode GUI / Plist | Sof Swift (`Project.swift`) | Starlark (Python dialekti) |
| **Loyihani boshqarish** | `.xcodeproj` Gitda | `.xcodeproj` har safar generatsiya qilinadi | `.xcodeproj` kerak emas (ixtiyoriy rules_xcodeproj) |
| **Build determinizmi** | ⚠️ Past (DerivedData tozalash kerak) | Yuqori | **100% Hermetik va Deterministik** |
| **Kesh darajasi** | Faqat mahalliy DerivedData | Modul darajasida Binary Cache | **Action darajasida Content-Addressed Storage** |
| **Remote Execution (RBE)** | ❌ Yo'q | ❌ Yo'q | **✅ Mavjud (Yuzlab bulut serverlarida)** |
| **Ko'p tilli qo'llab-quvvatlash** | Faqat Swift / C / Obj-C | Faqat Apple | **Har qanday til (Swift, C++, Kotlin, Go, Rust)** |
| **O'rganish murakkabligi** | Noldan boshlash oson | O'rtacha (Swift dasturchiga qulay) | Yuqori (Maxsus infratuzilma bilimi kerak) |

---

## 3. Qachon nimani tanlash kerak: Qaror qabul qilish matritsasi {#qaror-matritsasi}

Ko'r-ko'rona "Bazel hamma joyda zo'r" deyish — professional muhandisning ishi emas. Har bir asbobning o'z o'rni bor:

### 1. Qachon oddiy Xcode + SPM tanlanadi?
- Jamoada 1–5 nafar dasturchi ishlaydi.
- Ilova bitta yoki 2–3 ta moduldan iborat.
- SwiftUI Previews har soniyada kerak va murakkab keshga ehtiyoj yo'q.
- Alohida infratuzilma muhandisini yollashga byudjet yo'q.

### 2. Qachon Tuist tanlanadi?
- Jamoada 5–30 nafar iOS dasturchi ishlaydi.
- Faqat Apple platformasi uchun ilovalar yoziladi (Monorepoda backend yoki Android yo'q).
- Jamoa Swift tilini yaxshi ko'radi va Starlark o'rganishni istamaydi.
- `.xcodeproj` merge conflict'laridan qutulish va tezkor binary kesh kerak.

### 3. Qachon Bazel tanlanadi?
- Jamoada 30–100+ muhandis ishlaydi (yoki yirik korporatsiya).
- **Monorepo:** Bitta omborda iOS, Android, C++ dvijoklar, Backend xizmatlari yashaydi.
- CI/CD xarajatlari va navbatda turish vaqti jamoaning eng katta og'rig'iga aylangan.
- Har bir PR'da 100% hermetiklik va to'liq kafolatlangan takrorlanuvchanlik talab qilinadi.

---

## 4. Ishlab chiqarishdagi 7 ta Oltin Qoida (Best Practices) {#oltin-qoidalar}

1. **Hech qachon absolut yo'llar (Absolute Paths) yozmang:** Skriptlarda `/Users/ali/repo` kabi qattiq kodlangan yo'llar bo'lmasligi kerak. Faqat Bazel taqdim etgan nisbiy yo'llardan foydalaning, aks holda remote cache miss beradi.
2. **Buildifier'ni CI'da majburiy qiling:** Har bir BUILD fayli standart formatda bo'lishini `buildifier -mode=check` bilan tekshiring.
3. **Visibility qoidalariga rioya qiling:** Hech qachon hamma modulni `//visibility:public` qilib tashlamang. Oqish va tartibsizliklarni faqat kerakli paketlarga ruxsat berish orqali to'xtating.
4. **Kesh xavfsizligi intizomi:** PR faqat o'qiydi (`--remote_upload_local_results=false`), faqat `main` shoxcha keshni yangilaydi.
5. **Depset bilan xotirani tejang:** O'z Starlark qoidalaringizda hech qachon transitiv fayllar uchun Python list'laridan foydalanmang.
6. **Hermetik testlar:** Testlar ichida internetga chiqish taqiqlanadi. Har doim `URLProtocol` yoki Mock servislardan foydalaning.
7. **Binar o'lchamini doimiy monitoring qiling:** Har bir yirik o'zgarishdan keyin `.app` hajmini o'lchang, keraksiz ramkalar link bo'lib qolmaganini tekshiring.

---

## 5. Troubleshooting Ensiklopediyasi: Eng ko'p uchraydigan 5 ta xato {#troubleshooting}

### 1. Xato: "Remote cache miss for identical commit"
- **Sabab:** Dasturchi va CI runner'dagi Xcode versiyasi yoki macOS versiyasi farq qiladi (masalan, dasturchida Xcode 27.0, CI'da Xcode 27.1). Action key muhit o'zgaruvchisiga qaraydi va yangi kalit hosil qiladi.
- **Yechim:** `.bazelversion` kabi jamoa bo'yicha yagona Xcode versiyasini belgilang (`tools/bazel` orqali qulflang).

### 2. Xato: "Undefined symbol: _$s..."
- **Sabab:** `swift_library` nishoni boshqa nishonga bog'langan, lekin Swift moduli yoki C kutubxonasi `deps` ro'yxatiga qo'shilmagan.
- **Yechim:** `deps` ga yetishmayotgan targetni qo'shing yoki linker flaglarini tekshiring.

### 3. Xato: "Action failed to make progress" yoki Timeout
- **Sabab:** Swift kompilyatori bitta murakkab ifodaning tipini aniqlay olmay (Type checking timeout) cheksiz qotib qolgan.
- **Yechim:** Swift kodida ifodani soddalashtiring yoki aniq tip bering (`let x: [String: Any] = ...`).

### 4. Xato: "Code signing failed on Simulator"
- **Sabab:** Simulyator uchun sertifikat shart emas, lekin `provisioning_profile` atributi noto'g'ri bog'langan.
- **Yechim:** Simulyator uchun oddiy `ios_application` signing talab qilmaydi, faqat haqiqiy qurilma uchun profiling profil bering.

### 5. Xato: "Cycle in dependency graph"
- **Sabab:** Modul A Modul B'ga, Modul B esa Modul A'ga bog'langan (Circular dependency).
- **Yechim:** Aylanma bog'lanishni uzish uchun umumiy interfeysni `Core` moduliga chiqaring yoki Coordinator patternini qo'llang.

---

## 6. Karyera: Mobile Infrastructure & Platform Engineering {#karyera}

Bugungi mobil dasturlash bozorida keskin burilish yuz berdi:
Oddiy ekran chizadigan yoki tugma qo'yadigan dasturchilar soni oshib bormoqda, ammo yirik kompaniyalarda (Uber, Meta, Revolut, Spotify, Monzo, Uzum, Kaspi):
> **"Bizga 100 nafar iOS muhandisining kompyuterini tezlatadigan, CI/CD quvurlarini boshqaradigan va arxitektura tozaligini saqlaydigan Staff Mobile Platform Engineer kerak!"** degan talab eng yuqori o'ringa chiqdi.

Ushbu rollar xalqaro maydonda:
- **Mobile Infrastructure Engineer**
- **Developer Experience (DevEx) Lead**
- **Build & Release Architect**

nomlari bilan ataladi va ularning maoshi oddiy iOS dasturchilarnikidan sezilarli darajada yuqori bo'ladi. Ushbu kursda olgan bilimlaringiz sizni har qanday yuqori darajadagi xalqaro intervyuda o'ziga xos va noyob mutaxassisga aylantiradi.

---

## Yakuniy O'zingizni Tekshirish Checklisti {#checklist}

- [ ] Bazel'ning asosiy printsipi — "Build bu sof funksiya" ekanini bilaman.
- [ ] Bzlmod orqali tashqi Swift paketlarini ulay olaman.
- [ ] `rules_apple` yordamida haqiqiy iOS ilovasi, resurslari va testlarini qura olaman.
- [ ] `rules_xcodeproj` orqali jamoaga qulay Xcode muhitini taqdim eta olaman.
- [ ] Remote Cache va Selective Testing yordamida CI vaqtini qisqartirishni bilaman.
- [ ] 12 modulli SuperApp va Monorepo arxitekturalarini loyihalashtira olaman.
- [ ] O'z Starlark qoidalarimni (`rule()`, `depset`) yoza olaman.
- [ ] Loyihani Xcode'dan Bazel'ga 4 bosqichda xavfsiz ko'chirish strategiyasini bilaman.
- [ ] Qachon SPM, qachon Tuist va qachon Bazel tanlash kerakligini asoslab bera olaman.

---

## Xulosa va Keyingi Qadamlar {#xulosa}

Siz ajoyib ishni bajardingiz! 20 ta chuqur, amaliy va nazariy darslarni o'zlashtirib, siz zamonaviy mobil dasturiy ta'minot muhandisligining eng qudratli cho'qqisini zabt etdingiz.

Keyingi qadamlar:
1. Ushbu bilimlarni parallel modulimiz bo'lgan **[Tuist qo'llanmasi](/ios-lessons/tuist-01-kirish-va-ornatish)** bilan taqqoslab o'rganing.
2. Loyihangizdagi arxitektura patternlarini boyitish uchun **[Arxitektura darslari](/ios-lessons/arch-mvc)** bo'limini ko'zdan kechiring.
3. Kodingizni xavfsiz saqlash va sinash uchun **[Testing & QA bo'limi](/ios-lessons/testing)** ga sho'ng'ing.

Olg'a, professional muhandislik sari! 🚀

---

## Manbalar {#manbalar}

1. [Mobile Native Foundation](https://mobilenativefoundation.org/) — Dunyo bo'ylab yirik kompaniyalarning mobil infratuzilma konsorsiumi.
2. [Bazel Official Documentation](https://bazel.build/) — Google Bazel rasmiy portali.
3. [Tuist Official Documentation](https://tuist.dev/) — Apple ekotizimi uchun modulli generator.
4. [rules_xcodeproj GitHub](https://github.com/MobileNativeFoundation/rules_xcodeproj) — Bazel loyihalari uchun Xcode integratsiyasi.
