Azimjon Abdurasulov

Senior (5+ yil)

Interview Savollari

Senior iOS Engineer - Interview Savollari va Javoblari (5+ yil tajriba)

Ushbu qo'llanmada Senior darajadagi mutaxassislardan so'raladigan Tizim Dizayni (System Design), Xotira boshqaruvi (RAM va OOM), Arxitektura miqyosi va Xavfsizlik bo'yicha 50 ta eng muhim texnik savol professional tilda bayon etilgan.


1. Xotira, Unumdorlik va Tizim Mexanizmlari (Under the Hood)

1. Actor Reentrancy nima va u qanday muammolarni keltirib chiqarishi mumkin?

Javob: Actor'lar data racening oldini oladi, lekin ular reentrant hisoblanadi. Actor ichidagi await nuqtasida task "suspend" (to'xtatib turish) holatiga tushadi. Bu vaqtda Actor qulfi (lock) ochiladi va boshqa tasklar Actor ichiga kirishi mumkin. Agar birinchi task qayta tiklanganida (resume) state o'zgarib ketgan bo'lsa, bu mantiqiy xatolarga (inconsistent state) olib keladi.

2. OOM (Out of Memory) va "Jetsam" hodisasi nima?

Javob: iOS qurilmalarda macOS kabi "Swap partition" (SSDni RAM sifatida ishlatish) mavjud emas. Har bir ilovaga tizim tomonidan RAM limiti ajratiladi. Agar ilova ushbu limitdan oshib ketsa, "Jetsam" deb ataluvchi tizim qorovuli (low-memory watchdog) ilovani hech qanday ogohlantirishsiz o'ldiradi (kill). Bu odatda "Crash log"larda chiqmaydi.

3. Image Downsampling qanday qilib RAMni tejaydi?

Javob: Rasmning diskdagi hajmi (masalan, 2MB JPEG) uning RAMdagi hajmini anglatmaydi. Rasm dekodlanganda (bitmap holatiga kelganda) piksel o'lchamiga qarab (width height 4 byte) juda katta joy egallaydi. Downsampling — rasmni to'liq dekodlamasdan, Core Graphics yordamida kerakli o'lchamdagi mitti nusxasini (thumbnail) yaratish orqali RAM sarfini 10-50 baravargacha kamaytiradi.

4. Frame Drop va "Offscreen Rendering" aloqasi?

Javob: GPU odatda kadrlarni to'g'ridan-to'g'ri ekran buferiga chizadi. Lekin shadow, cornerRadius, mask yoki opacity kabi xususiyatlar ishlatilganda, GPU avval ularni "Offscreen Buffer"da hisoblab, keyin ekranga nusxalaydi. Bu o'tishlar (context switching) qimmatga tushadi va kadrlar soni (FPS) tushib ketishiga (lag) sabab bo'ladi.

5. Instruments'dagi Leaks va Allocations farqi?

Javob:

  • Leaks: ARC tomonidan boshqarilmaydigan, xotirada qolib ketgan "o'lik" obyektlarni topadi.
  • Allocations: RAMning umumiy sarfini va qaysi obyektlar eng ko'p joy egallayotganini ko'rsatadi.
  • Memory Graph Debugger: Obyektlar o'rtasidagi bog'lanishlarni vizual ko'rish va Retain Cycle'larni topish uchun eng yaxshi instrument.

6. Dynamic Dispatch vs Static Dispatch?

Javob:

  • Static Dispatch: Kompilyatsiya vaqtida qaysi metod chaqirilishi aniq bo'ladi (final klasslar, structlar). Eng tezkor usul.
  • Dynamic Dispatch: Runtime'da (V-Table orqali) aniqlanadi (klasslardagi override metodlar). Protokollar bilan ishlashda "Witness Table" ishlatiladi. Bu moslashuvchanlik beradi, lekin biroz vaqt talab qiladi.

7. CALayer va UIView o'rtasidagi bog'liqlik?

Javob: UIView — bu CALayer uchun yuqori darajadagi o'rovchi (wrapper). UIView foydalanuvchi bilan aloqani (touches, gestures) boshqarsa, CALayer faqat vizual ko'rinishni (GPU yordamida chizishni) boshqaradi. Animatsiyalarning aksariyati (Core Animation) layer darajasida bajariladi.

8. App Launch vaqtidagi dyld va Mach-O binary?

Javob: Ilova ishga tushganda dyld (Dynamic Linker) Mach-O formatidagi binary faylni va unga kerakli dinamik kutubxonalarni (.dylib, frameworks) xotiraga yuklaydi, bog'laydi (binding/rebinding) va pre-main amallarni bajaradi. Senior dasturchi sifatida pre-main vaqtini kamaytirish uchun dinamik kutubxonalar sonini kamaytirish va static kutubxonalardan foydalanish tavsiya etiladi.

9. Static vs Dynamic Libraries farqi?

Javob:

  • Static (.a): Kompilyatsiya vaqtida asosiy binary ichiga qo'shib yuboriladi. Ilova tezroq ishga tushadi, lekin binary hajmi kattalashadi.
  • Dynamic (.dylib / .framework): Ilova ishga tushganda (runtime) yuklanadi. Bir nechta ilova bir xil tizim kutubxonasidan foydalanishi mumkin (RAMni tejaydi), lekin launch timega ta'sir qiladi.

10. Main Thread bloklanishini optimallash (App Launch)?

Javob: Ilova ishga tushayotganida didFinishLaunchingWithOptions ichida SDK'larni (Firebase, Analytics va h.k) sinxron ishga tushirish start vaqtini cho'zib yuboradi. Bularni fonda (background thread) yoki Lazy initialization orqali ishga tushirish launch unumdorligini oshiradi.


2. Arxitektura va Tizim Dizayni (System Design)

11. TCA (The Composable Architecture) nima va Redux'dan farqi?

Javob: TCA — bu "Single Source of Truth", "State management" va "Composition" tamoyillariga asoslangan arxitektura. Redux kabi "unidirectional data flow" ishlatadi. Farqi shundaki, TCA Swift uchun maxsus ishlab chiqilgan bo'lib, "Effects" va "Testing" tizimini juda kuchli darajaga olib chiqqan.

12. Modullashtirish (Modularization): Tuist vs SPM?

Javob:

  • SPM: Apple'ning rasmiy yechimi, oson boshqariladi, lekin .xcodeproj konfliktlarini to'liq hal qilmaydi.
  • Tuist: Loyihani kod orqall generatsiya qiluvchi asbob. U "Binary Caching" va modullar o'rtasidagi chigal bog'lanishlarni vizuallashtirish orqali build vaqtini 10 baravargacha qisqartirishi mumkin.

13. Opaque Types (some) va Existential types (any) unumdorligi?

Javob: some kompilyatorga aynan bitta tur qaytishini kafolatlaydi, bu Static Dispatch imkonini beradi. any esa turning o'zi uchun "Box" (konteyner) yaratadi va Dynamic Dispatch ishlatadi. Senior darajasida har doim some dan foydalanishga harakat qilish tavsiya etiladi.

14. Dependency Injectionning ilg'or usullari (Swinject vs Service Locator)?

Javob: Katta loyihalarda qo'lda DI qilish qiyinlashadi. Swinject kabi kutubxonalar "Inversion of Control" (IoC) konteynerini taqdim etadi. Service Locator pattern esa ba'zan "Anti-pattern" deb hisoblanadi, chunki u qaramliklarni yashiradi.

15. Clean Architecture (VIPER, RIBs)?

Javob: VIPER modullarni juda qattiq ajratadi, lekin kod hajmini ko'paytiradi. RIBs (Uber tomonidan yaratilgan) — bu holatga (state) emas, balki "Routing"ga asoslangan arxitektura bo'lib, yuzlab muhandislar ishlaydigan ulkan loyihalar uchun mo'ljallangan.

16. SOLID: Dependency Inversion qanday qat'iylikni talab qiladi?

Javob: Yuqori qatlam (Business logic) quyi qatlam (Database/Network) haqida hech narsa bilmasligi kerak. Ular faqat "Interface" (Protocol) orqali gaplashadi. Bu tabaqalanish loyihani xohlagan vaqtda boshqa texnologiyaga o'tkazish imkonini beradi.

17. Design Patterns: Mediator va Facade?

Javob:

  • Facade: Murakkab tizim ustiga bitta sodda interfeys tortish (masalan, NetworkManager barcha URLSession ishlarini yashiradi).
  • Mediator: Bir nechta obyektlar o'zaro to'g'ridan-to'g'ri gaplashmasdan, bitta "Mediator" orqali aloqa qilishi (chalkashlikni kamaytiradi).

18. Redux arxitekturasining afzalligi?

Javob: "Single source of truth" bo'lgani uchun, ilovaning ixtiyoriy vaqtdagi holatini (state) saqlab olish (serialization) va xatolarni qayta tiklash (Time Travel Debugging) imkonini beradi.

19. CoreData dagi Heavy Migration og'riqlari?

Javob: Oddiy o'zgarishlarni (Lightweight) iOS avtomat hal qiladi. Lekin ma'lumotlar strukturasini tubdan o'zgartirish (masalan, Table'ni ikkiga bo'lish) uchun "Mapping Model" yaratish va background processlarda ma'lumotlarni ko'chirish shart, aks holda App ishga tushishida crash bo'ladi.

20. Thread Safety: Lock, DispatchSemaphore va Actor?

Javob: Lock (os_unfair_lock) — eng tezkor, lekin ehtiyotkorlik talab qiladi. Semaphore — resurslarni limitlaydi. Actor — Swift'ning modern, xavfsiz va tushunarli thread-safety yechimi bo'lib, await orqali "structured concurrency"ni ta'minlaydi.


3. Kompilyator, Runtime va Xavfsizlik

21. Whole Module Optimization (WMO) nima?

Javob: Kompilyator fayllarni bittadan emas, balki butun modulni bitta yaxlit deb tahlil qiladi. Bu unga ishlatilmagan funksiyalarni o'chirish (Dead code stripping) va funksiyalarni "inline" qilish (metod chaqiruvini kodning o'zi bilan almashtirish) imkonini beradi, natijada App tezroq ishlaydi.

22. Method Swizzling nima va nega u xavfli?

Javob: Objective-C runtime xususiyati bo'lib, ikki metodning implementatsiyasini runtime'da almashtirib qo'yish. Bu analitika yoki login tizimlarida ishlatiladi, lekin kutilmagan crash'lar va tizim yangilanishlari (iOS updates) bilan mos kelmaslik xavfini keltirib chiqaradi.

23. iOS Security: SSL Pinning amaliyoti?

Javob: "Man-in-the-middle" (MITM) hujumlarining oldini olish uchun ilovaga serverning ommaviy kaliti (public key) yoki sertifikati kiritiladi. Ilova faqat o'zida saqlangan kalitga mos keladigan server bilan gaplashishiga ruxsat beradi.

24. Jailbreak Detection usullari?

Javob: Ilova ishga tushganda tizim fayllari tarkibini (masalan, /Applications/Cydia.app, /bin/bash) tekshirish, fayl yozish qobiliyatini (sandbox bormi?) ko'rish yoki dinamik kutubxonalar ro'yxatini tahlil qilish orqali aniqlanadi.

25. Keychain Accessibility Levels?

Javob: Senior dasturchi sifatida ma'lumotlarni Keychain'ga shunchaki saqlash yetarli emas. Ularga ruxsat darajasini (masalan, kSecAttrAccessibleWhenUnlocked) belgilash orqali qurilma qulflangan paytda ma'lumotlarni o'qishni taqiqlash lozim.

26. Obfuscation (Kodning tushunarsizligi)?

Javob: Binary faylni "Reverse Engineering" qilishdan qiyinlashtirish. Klass va metod nomlarini ma'nosiz harflarga almashtirish (masalan, NetworkManager -> a). Bu xakerlarga biznes mantiqni o'g'irlashni qiyinlashtiradi.

27. Opaque Returns (some) va Generics farqi?

Javob: Genericsda tur chaqiruvchi tomondan belgilanadi (Caller-side). some da esa tur funksiya ichkarisida belgilanadi (Implementation-side), lekin tashqariga aynan qaysi tur ekanligi aytilmaydi.

28. Sendable protokoli va Concurrency?

Javob: Swift 5.5+ dagi yangi qoida bo'lib, ma'lumot bir thread'dan ikkinchisiga xavfsiz "ko'chib" o'tishi mumkinligini bildiradi. Value types (struct) odatda Sendable bo'ladi. Klasslar esa Thread safe (odatda final va immutable) bo'lsa Sendable bo'la oladi.

29. GitFlow vs Trunk-based development?

Javob:

  • GitFlow: Uzoq reliz vaqtlari bo'lgan loyihalarda ishlatiladi.
  • Trunk-based: Barcha dasturchilar bitta Main branchga tez-tez commit qilishadi. Seniorlar uchun bu "Continuous Integration"ning asosiy qismi bo'lib, Feature Flags texnologiyasini talab qiladi.

30. .xcodeproj merge konfliktlaridan qanday qochish mumkin?

Javob: Loyihani Tuist, XcodeGen yoki Bazel kabi asboblar yordamida har safar generatsiya qilish. Bu orqali .xcodeproj fayli Git'ga qo'shilmaydi va konfliktlar 0 ga tushadi.


4. Real Loyiha Miqyosi va Advanced Tools

31. TDD (Test Driven Development) falsafasi?

Javob: Avval test yoziladi (Fail), keyin testdan o'tadigan minimal kod yoziladi (Pass), oxirida kod chiroylilanadi (Refactor). Bu arxitektura yanada toza va testga mos bo'lishini ta'minlaydi.

32. UICollectionView Diffable Data Source?

Javob: reloadData() dagi muammolarni (lag va animation xatolarini) hal qiladi. Hashable id'lar orqali "Snapshot" yaratadi va faqat o'zgargan elementlarnigina chiroyli animatsiya bilan yangilaydi.

33. Universal Links va Deep Linking integratsiyasi?

Javob: Brauzer linkini ilovaga yo'naltirish. Senior dasturchi sifatida "Global Router" yoki "Coordinator" orqali link ichidagi ID bo'yicha ilovaning istalgan qismiga (ekraniga) o'tishni (routing mapping) ta'minlash lozim.

34. Background Tasks Time Limits?

Javob: Ilova fonda cheksiz ishlay olmaydi. beginBackgroundTask orqali ~30 soniya olinishi mumkin. Seniorlik darajasida BackgroundTasks frameworki orqali tizimdan maqbul vaqtda (masalan, telefon quvvatlanayotganda) og'ir ishlarni bajarishni so'rash (schedule) kerak.

35. CI/CD Pipeline (GitHub Actions, Bitrise, Jenkins)?

Javob: Har bir Pull Request'da avtomatik SwiftLint, Unit Tests va Build sinovlarini o'tkazish. Muvaffaqiyatli merge'dan so'ng TestFlightga avtomat "Archive" yuborish jamoa unumdorligini oshiradi.

36. Fastlane "Match" va Sertifikatlar boshqaruvi?

Javob: Katta jamoalarda sertifikatlar buzilib ketishi keng tarqalgan. Match yordamida barcha sertifikat va profillar bitta private repo'da shifrlangan saqlanadi va hamma bir xil kalitdan foydalanadi.

37. Code Review jarayonida Seniorlik mas'uliyati?

Javob: Faqat sintaksis tekshirish emas, balki arxitektura buzilishi, xotira oqishi (weak self), SOLID tamoyillari va kodning skalabilirligini (kelajakda kengayishini) tahlil qilish.

38. Responder Chain mexanizmi?

Javob: UI event (masalan, teginish) qanday zanjir bo'ylab yuqoriga chiqishi: UIView -> UIViewController -> UIWindow -> UIApplication -> AppDelegate. Buni tushunish "Event handling" muammolarini hal qilishda juda muhim.

39. Operation vs GCD?

Javob: GCD yengil asinxron amallar uchun. Operation esa murakkab, bir-biriga bog'liq (Dependencies) bo'lgan va to'xtatish (Cancelable) imkoni kerak bo'lgan uzoq muddatli topshiriqlar uchun ishlatiladi.

40. Custom Property Wrappers tushunchasi?

Javob: @State, @Binding kabi o'z turlaringizni yaratish. Masalan, @AppStorage kabi ishlaydigan, lekin ma'lumotni Keychain'ga yozadigan wrapper yasash orqali kodni sezilarli darajada tozalash mumkin.

41. XCTest: Spy vs Mock vs Stub?

Javob:

  • Stub: Tayyor ma'lumot qaytaradi.
  • Spy: Metod necha marta chaqirilganini sanaydi.
  • Mock: O'ziga qo'yilgan barcha talablar (expectations) bajarilganligini tekshiradi.

42. Thread Explosion (Oqimlar portlashi) nima?

Javob: Concurrent queue ichida juda ko'p bloklangan oqimlar yaratilishi. Bu CPU'ni "Context switching"ga ko'p vaqt sarflashga majbur qiladi. Swift Concurrency (async/await) bu muammoni "Cooperative thread pool" orqali hal qilgan.

43. Combine yoki RxSwift: FlatMap vs SwitchToLatest?

Javob:

  • FlatMap: Barcha eventlarni bitta oqimga yig'adi.
  • SwitchToLatest: Faqat eng oxirgi so'rov natijasini qaytaradi, eskilarini to'xtatadi (masalan, qidiruv tizimida).

44. Memory Warning handling best practices?

Javob: didReceiveMemoryWarning kelsa, ilovadagi keshni (images, data caches) tozalash va ekranda ko'rinmaydigan resurslarni vaqtinchalik xotiradan bo'shatish orqali Jetsam kill'dan asrash.

45. App Store Guidelines Rejections?

Javob: Senior sifatida rad etishlarni (rejections) oldini olish: App Tracking Transparency, In-App Purchase qoidalari, Data Privacy va User-Generated Content bo'yicha Apple talablarini arxitektura darajasida hisobga olish.

46. Firebase SDK hajmi va uning optimizatsiyasi?

Javob: Firebase juda ko'p dinamik frameworklarni o'z ichiga oladi va build vaqtini oshiradi. Uni Static framework sifatida yoki faqat kerakli qismlarini (Analytika, Crashlytics) SPM orqali ulash tavsiya etiladi.

47. Code coverage va Statik Analiz (SonarQube)?

Javob: Kodning necha foizi testlar bilan qoplanganligini (80% ideal) va koddagi potentsial xavflarni ("Code smells") avtomat topuvchi tizimlar Senior nazoratida bo'lishi lozim.

48. Apple AsyncStream qanday ishlaydi?

Javob: Combine oqimlarini yoki eski "callback" asosidagi tizimlarni Swift'ning yangi for-await-in tsikli orqali modernizatsiya qilish imkoniyatini beruvchi ko'prik.

49. Mentorlik va Texnik RFC (Request for Comments)?

Javob: Katta o'zgarishlar va arxitektura qarorlarini RFC hujjati ko'rinishida yozish va jamoa bilan muhokama qilish. Junior va Middle dasturchilarga yo'nalish berish Seniorlikning asosiy qismidir.

50. Core Foundation (C-level framework) frameworki?

Javob: Apple tizimlarining fundamenti bo'lgan C-API'lar. U erda Toll-free bridging (masalan, NSString ni CFStringga o'tkazish) va xotirani manual boshqarish (Core Graphics'dagi release amallari) orqali kodingizni eng quyi darajada ham optimallay olishingiz lozim.


5. Zamonaviy Swift, Accessibility va System Design

51. Swift Macros (Swift 5.9+) nima?

Javob: Macros — kompilyatsiya vaqtida koddan yangi kod generatsiya qiluvchi tizim. Masalan, @Observable macro'si oddiy classni to'liq "kuzatiladigan" (observable) qilish uchun kerakli barcha kodni avtomatik yozib beradi. Bu boilerplate kodni keskin kamaytiradi.

52. Observation framework (iOS 17+) va Combine farqi?

Javob: Observation — Swift Macros asosida qurilgan yangi tizim. @Observable macro'si bilan belgilangan classning har qanday property'si o'zgarganda SwiftUI faqat o'sha property'ga bog'langan View'ni yangilaydi. Combine'dagi @Published esa barcha property uchun refresh qilardi — bu ortiqcha ish demak.

53. Accessibility (VoiceOver) qo'llab-quvvatlash nega muhim?

Javob: Ko'zi ojiz foydalanuvchilar VoiceOver yordamida ilovadan foydalanadi. Apple App Store Review jarayonida Accessibility talablarini tekshiradi. .accessibilityLabel(), .accessibilityHint() va .accessibilityValue() modifier'larini to'g'ri qo'yish Senior darajasida kutiladi.

54. Dynamic Type va Adaptive Layout?

Javob: Foydalanuvchi telefon sozlamalarida shrift o'lchamini o'zgartirsa, ilova ham moslanishi kerak. UIFontMetrics, .dynamicTypeSize va .minimumScaleFactor kabi vositalar orqali kontent har qanday o'lchamda to'g'ri ko'rinadi.

55. App Clips vazifasi va cheklovlari?

Javob: App Clips — ilovaning kichik qismi (10 MB gacha) bo'lib, foydalanuvchi to'liq ilovani yuklamasdan tezda foydalanishi mumkin. NFC tag yoki QR-kod orqali ishga tushadi. Cheklov: Push Notifications, Background tasks va Keychain'ning ba'zi xususiyatlaridan foydalanib bo'lmaydi.

56. WidgetKit arxitekturasi?

Javob: Widget'lar SwiftUI asosida quriladi va TimelineProvider orqali ma'lumotlarni oldindan (timeline entries) tayyorlab qo'yadi. Widget ilova bilan App Groups orqali ma'lumot almashadi. Widget o'zi mustaqil process, shuning uchun ilovaning modellariga to'g'ridan-to'g'ri kira olmaydi.

57. Localization strategiyasi?

Javob: String(localized:) va .strings/.stringsdict fayllari orqali ko'p tilli qo'llab-quvvatlash. Senior sifatida String Catalogs (Xcode 15+) dan foydalanish, pluralization (ko'plik) qoidalari va RTL (chapdan o'ngga) tillarni hisobga olish lozim.

58. Structured Concurrency vs Unstructured?

Javob:

  • Structured: Task'lar ierarxik daraxt hosil qiladi. Ota task bekor qilinsa, bolalari ham bekor bo'ladi (masalan, TaskGroup).
  • Unstructured: Task {} va Task.detached {} — mustaqil, boshqaruv qiyinroq, lekin moslashuvchan.

59. Performance Profiling: Time Profiler va CPU?

Javob: Xcode Instruments'dagi "Time Profiler" yordamida qaysi funksiya CPU'ni eng ko'p ishlatayotganini topish. "Call Tree" orqali eng "og'ir" (hot path) kodni aniqlash va optimallashtirish Senior'ning asosiy vazifalatidan biri.

60. Swift Testing framework (@Test) nima?

Javob: Swift 5.10+ da taqdim etilgan yangi test framework. XCTest'dagi func testExample() o'rniga @Test func example() ishlatiladi. #expect() macro'si orqali assert'lar va @Suite orqali test guruhlari quriladi. Parameterized testing ham qo'llab-quvvatlanadi.

61. System Design: "Chat ilovasi arxitekturasini tushuntiring"?

Javob: WebSocket (real-time aloqa), Message Queue (offline xabarlar), Local DB (CoreData/SQLite), Pagination (sahifaviy yuklash), E2E Encryption (xavfsizlik). Media fayllar uchun CDN va lazy loading ishlatiladi. Push Notification integratsiyasi ham albatta kerak.

62. System Design: "Image-heavy ilova (Instagram) optimizatsiyasi"?

Javob: Progressive Image Loading (avval blur, keyin HD), Disk va Memory Cache (NSCache + FileManager), Image Downsampling (to'liq rasmni yuklamas), Prefetching (keyingi rasmlarni oldindan yuklash), CDN (Content Delivery Network). Pagination va infinite scroll.

63. @Retroactive conformance (Swift 5.10+)?

Javob: Boshqa modul e'lon qilgan turga uchinchi modul'dagi protokolga mos kelish (conformance) qo'shishda kompilyator ogohlantirish beradi. @retroactive atributi bu ogohlantirishni "men bilaman, ataylab qilyapman" deb belgilaydi.

64. Xcode Cloud va CI/CD integratsiyasi?

Javob: Apple'ning native CI/CD tizimi. GitHub/GitLab bilan bog'lanadi. Har bir push'da test, build va TestFlight'ga avtomatik joylash (deploy) imkonini beradi. Fastlane'ga muqobil Apple ekotizimidagi yechim.

65. Texnik Debt (Texnik Qarz) boshqaruvi?

Javob: Senior sifatida texnik qarzni aniqlash, hujjatlashtirish va sprint'larga qo'shish. Masalan: deprecated API larni yangilash, test coverage'ni oshirish, arxitektura refactoring'ni rejalashtirish. Bu ilovaning uzoq muddatli barqarorligini ta'minlaydi.


Yakuniyat!

Sizni tabriklaymiz! Senior iOS Engineer sifatida nafaqat dastur yozishni, balki butun tizimning barqarorligi, xavfsizligi va unumdorligi uchun mas'uliyatni o'z zimmangizga olishga tayyorsiz. System Design va Mentorlik — bu sizning asosiy qurollaringiz. Qolgani faqat amaliyot va tajriba! 🏆

Markdown manba

iOS Lessons