[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:mobile\u002Fmobile-state-data":4,"config":211},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":112,"samples":126},"mobile","Mobil","","mobile-state-data","Mobile State Data","tr",75,2400,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,88,91,94,97,100,103,106,109],{"key":19,"name":20,"count":11},"fl-dart-async-isolates","Fl Dart Async Isolates",{"key":22,"name":23,"count":11},"fl-dart-language-null-safety","Fl Dart Language Null Safety",{"key":25,"name":26,"count":11},"fl-flutter-persistence-storage","Fl Flutter Persistence Storage",{"key":28,"name":29,"count":11},"fl-flutter-platform-channels-lifecycle","Fl Flutter Platform Channels Lifecycle",{"key":31,"name":32,"count":11},"fl-flutter-rendering-widget-tree","Fl Flutter Rendering Widget Tree",{"key":34,"name":35,"count":11},"fl-flutter-state-management-widgets","Fl Flutter State Management Widgets",{"key":37,"name":38,"count":11},"ios-core-data-swiftdata-persistence","Ios Core Data Swiftdata Persistence",{"key":40,"name":41,"count":11},"ios-lifecycle-background-execution","Ios Lifecycle Background Execution",{"key":43,"name":44,"count":11},"ios-memory-management-arc","Ios Memory Management Arc",{"key":46,"name":47,"count":11},"ios-swift-concurrency-structured","Ios Swift Concurrency Structured",{"key":49,"name":50,"count":11},"ios-swift-type-system-optionals","Ios Swift Type System Optionals",{"key":52,"name":53,"count":11},"ios-swiftui-state-rendering","Ios Swiftui State Rendering",{"key":55,"name":56,"count":11},"kt-android-lifecycle-background-execution","Kt Android Lifecycle Background Execution",{"key":58,"name":59,"count":11},"kt-android-memory-context-leaks","Kt Android Memory Context Leaks",{"key":61,"name":62,"count":11},"kt-android-room-persistence","Kt Android Room Persistence",{"key":64,"name":65,"count":11},"kt-jetpack-compose-state-recomposition","Kt Jetpack Compose State Recomposition",{"key":67,"name":68,"count":11},"kt-kotlin-coroutines-flow","Kt Kotlin Coroutines Flow",{"key":70,"name":71,"count":11},"kt-kotlin-type-system-null-safety","Kt Kotlin Type System Null Safety",{"key":73,"name":74,"count":11},"mobile-distribution-ci","Mobile Distribution Ci",{"key":76,"name":77,"count":11},"mobile-navigation","Mobile Navigation",{"key":79,"name":80,"count":11},"mobile-networking-offline","Mobile Networking Offline",{"key":82,"name":83,"count":11},"mobile-performance-battery","Mobile Performance Battery",{"key":85,"name":86,"count":11},"mobile-security-storage","Mobile Security Storage",{"key":8,"name":9,"count":11},{"key":89,"name":90,"count":11},"mobile-testing-automation","Mobile Testing Automation",{"key":92,"name":93,"count":11},"mobile-ui-lifecycle","Mobile Ui Lifecycle",{"key":95,"name":96,"count":11},"rn-javascript-typescript-fundamentals","Rn Javascript Typescript Fundamentals",{"key":98,"name":99,"count":11},"rn-native-bridge-modules","Rn Native Bridge Modules",{"key":101,"name":102,"count":11},"rn-navigation-lifecycle","Rn Navigation Lifecycle",{"key":104,"name":105,"count":11},"rn-networking-persistence-offline","Rn Networking Persistence Offline",{"key":107,"name":108,"count":11},"rn-performance-rendering","Rn Performance Rendering",{"key":110,"name":111,"count":11},"rn-react-hooks-state-management","Rn React Hooks State Management",[113,117,120,123],{"key":114,"name":115,"count":116},"android-kotlin","Android (Kotlin)",450,{"key":118,"name":119,"count":116},"flutter","Flutter",{"key":121,"name":122,"count":116},"ios-swift","iOS (Swift)",{"key":124,"name":125,"count":116},"react-native","React Native",[127,145,159,172,185,198],{"id":128,"topic":9,"difficulty":129,"body":130,"options":131,"correct_key":133,"explanation":144},"019f677d-2bdb-7dbc-a7d5-edd585de459b",1,"Mobil uygulama mimarisinde, bellek-içi (local) state ile kalıcı (disk) state arasındaki temel fark nedir?",[132,135,138,141],{"key":133,"text":134},"a","Bellek-içi state süreç sonlandığında kaybolur; kalıcı state ise depolamaya yazılır ve yeniden başlatmalara dayanır",{"key":136,"text":137},"b","Bellek-içi state okuması her zaman kalıcı state'ten yavaştır, çünkü disk depolama rastgele erişim için optimize edilmiştir",{"key":139,"text":140},"c","Kalıcı state yalnızca sayısal değerler tutabilir, bellek-içi state ise uygulamanın tanımladığı her tür veriyi tutabilir",{"key":142,"text":143},"d","Bellek-içi state cihazdaki farklı uygulamalar arasında otomatik paylaşılır, kalıcı state ise tek bir uygulamaya özel kalır","Bellek-içi state, çalışan sürecin bir parçası olarak RAM'de yaşar; süreç sonlandığında bu bellek geri alınır ve değer kaybolur. Kalıcı state ise bir dosyaya, veritabanına ya da key-value deposuna yazılır; böylece uygulama yeniden başladığında ya da cihaz yeniden açıldığında geri okunabilir. Bellek genelde diskten yavaş değil hızlıdır (b). Kalıcılık yalnızca sayı değil, serileştirilebilir her veriyi tutabilir (c). Kalıcı depolama varsayılan olarak uygulamaya özeldir, otomatik paylaşılmaz (d).",{"id":146,"topic":9,"difficulty":147,"body":148,"options":149,"correct_key":136,"explanation":158},"019f677d-2bdd-719f-89be-08655032a3f4",2,"Bir ekranda kullanıcının arama sorgusu yazdığı bir metin alanı ve kullanıcının kaydettiği favori öğelerin listesi var. Bunlardan hangisi genellikle kalıcı olmak yerine yalnızca bellek-içi state olmalıdır?",[150,152,154,156],{"key":133,"text":151},"Favori öğeler listesi, çünkü favoriler uygulama bir sonraki açılışta kaybolmalıdır",{"key":136,"text":153},"Arama alanına o an yazılmış metin, çünkü yalnızca aktif arama sırasında önem taşır",{"key":139,"text":155},"Hem arama metni hem favoriler listesi, çünkü tüm UI state'i anında diske yazılmalıdır",{"key":142,"text":157},"Hiçbiri, çünkü kullanıcının oluşturduğu her state veri kaybını önlemek için kalıcı hale getirilmelidir","Arama metni, o anki etkileşime bağlı geçici bir girdidir; kullanıcı ekrandan ayrıldığında yarım yazılmış metni hatırlamanın genelde bir anlamı yoktur, bu yüzden yalnızca bellekte tutmak uygundur. Favori öğeler ise oturumlar arası kalıcı olması beklenen bir kullanıcı kararını temsil eder, dolayısıyla kalıcı depolamaya aittir (a tam tersini söylüyor). Bir arama kutusunun her tuş vuruşunu kalıcı hale getirmek (c, d) kalıcı değeri olmayan veri için gereksiz yazma yükü ve karmaşıklık ekler.",{"id":160,"topic":9,"difficulty":129,"body":161,"options":162,"correct_key":139,"explanation":171},"019f677d-2bdd-7e3e-836a-1ea62951cffc","Bir ekranda veri çekilirken geçici bir \"loading spinner\" bayrağı gösteriliyor. Çekme işlemi bitince bu bayrağa artık gerek kalmıyor. Bu bayrağı yönetmenin en uygun yolu nedir?",[163,165,167,169],{"key":133,"text":164},"Her değiştiğinde kalıcı depolamaya yazmak, böylece uygulama çekme sırasında çökerse tam olarak geri yüklenebilsin",{"key":136,"text":166},"Çekilen verinin bulunduğu kalıcı kayıtla aynı yere yazmak, böylece ikisi her zaman birlikte güncellensin",{"key":139,"text":168},"Ekrana bağlı bellek-içi state olarak tutmak, çünkü yalnızca mevcut oturumdaki geçici bir anı tanımlıyor",{"key":142,"text":170},"Yalnızca UI bayrakları için ayrılmış ayrı bir dosyaya yazmak, böylece sonradan debug için incelenebilsin","Loading bayrağı, belirli bir ekranda \"şu anda ne oluyor\"u tanımlar; çekme işlemi bitince ya da uygulama yeniden başlayınca hiçbir anlamı kalmaz, bu yüzden bellek-içi state için ders kitabı örneğidir. Onu kalıcı hale getirmek (a, b, d) bir sonraki ekran ziyaretinde basitçe false'a dönmesi gereken bir değer için gereksiz yazma ve temizleme mantığı ekler; çökme sonrası eski bir \"loading\" bayrağını geri yüklemek isteğin gerçek durumunu yanlış yansıtır.",{"id":173,"topic":9,"difficulty":147,"body":174,"options":175,"correct_key":142,"explanation":184},"019f677d-2bdf-74a3-9c3d-47d939ac19d6","İki kardeş ekranın ikisi de aynı \"seçili para birimi\" değerini göstermesi ve buna tepki vermesi gerekiyor; her iki ekran da bu değeri değiştirebiliyor. Bu durumda \"state'i yukarı taşımak\" (state lifting) ne anlama gelir?",[176,178,180,182],{"key":133,"text":177},"Seçili para birimi mantığının zorluk seviyesini artırıp yalnızca bir yöneticinin değiştirebilmesini sağlamak",{"key":136,"text":179},"Para birimi değerini her iki ekrana da kopyalayıp her birinin hız için kendi bağımsız kopyasını tutmasını sağlamak",{"key":139,"text":181},"Para birimi değerini kalıcı depolamaya taşıyarak uygulama zorla kapatılsa bile hayatta kalmasını sağlamak",{"key":142,"text":183},"Para birimi değerini her iki ekranın dışına, ikisinin de okuyup güncelleyebildiği ortak bir sahibe taşımak","State lifting, bir değeri tek bir bileşenden, her iki tüketicinin de okuyup güncelleyebildiği ortak bir üst sahibe taşımak demektir; böylece gerçeği tutan tam olarak tek bir yer olur, iki bileşenin diğerinde ne olduğunu tahmin etmesi gerekmez. Değeri kopyalamak (b) lifting'in çözdüğü sorunun kendisidir, çözüm değildir. Kalıcılık (c) yeniden başlatmalara dayanma ile ilgili ayrı bir konudur, şu anki iki ekran arası paylaşımla ilgili değildir.",{"id":186,"topic":9,"difficulty":129,"body":187,"options":188,"correct_key":136,"explanation":197},"019f677d-2be0-72a5-8502-300a00f5485b","Paylaşılan bir state parçası için, her ekranın kendi kopyasını tutmasına izin vermek yerine tek bir gerçek kaynağa (single source of truth) sahip olmanın ana faydası nedir?",[189,191,193,195],{"key":133,"text":190},"Uygulamayı hızlandırır, çünkü tek bir kopya her zaman birden fazla kopyanın toplamından daha az bellek kullanır",{"key":136,"text":192},"Kopyaların birbirinden sapmasını önler, çünkü değerin güncellenebileceği tek bir yer vardır",{"key":139,"text":194},"Herhangi bir loading ya da hata yönetimi ihtiyacını ortadan kaldırır, çünkü tek bir kaynak asla yanıtsız kalmaz",{"key":142,"text":196},"Değerin uygulamanın kendi kodundan geçmeden dışarıdan doğrudan düzenlenmesine izin verir","Bir değer ekranlar arasında kopyalandığında her kopya bağımsız güncellenebilir ve kopyaların eşit kalacağını garanti eden hiçbir şey yoktur — bir ekran güncellenmiş veriyi gösterirken diğeri hâlâ eski değeri gösterebilir. Tek bir gerçek kaynak, değeri tutan tam olarak tek bir yer olduğu ve herkesin oradan okuduğu için bu olasılığı ortadan kaldırır. Bellek ayak izi (a) ya da loading\u002Fhata durumlarının ortadan kalkması (c) ile ilgisi yoktur; değeri uygulama dışından düzenlenebilir hale de getirmez (d).",{"id":199,"topic":9,"difficulty":147,"body":200,"options":201,"correct_key":133,"explanation":210},"019f677d-2be0-7ec4-99e9-d33d1681d954","Tek yönlü veri akışında (unidirectional data flow), veri paylaşılan bir sahipten onu gösteren ekranlara doğru aşağı akar; ekranlar ise paylaşılan veriyi doğrudan değiştirmek yerine değişiklik talep etmek için olayları yukarı gönderir. Aşağıdakilerden hangisi bu deseni doğru şekilde takip eder?",[202,204,206,208],{"key":133,"text":203},"Bir ekran \"kullanıcı artır'a bastı\" olayını bildirir, paylaşılan sahip sayacı günceller ve yeni değeri aşağı geri iletir",{"key":136,"text":205},"Bir ekran, kullanıcı bir düğmeye her bastığında paylaşılan sahibin sakladığı sayaç değerini doğrudan yerinde değiştirir",{"key":139,"text":207},"İki ekran her biri kendi ayrı sayacını tutar ve hangisi gösterilirse gösterilsin iki değerin ortalamasını alır",{"key":142,"text":209},"Bir ekran sayacı yalnızca ilk göründüğünde bir kez okur ve yaşam döngüsü boyunca bir daha güncelleme kontrolü yapmaz","Tek yönlü akış net bir yön korur: gösterilen veri bir yöne akar (sahipten ekrana), değiştirme talepleri ise açık olaylar olarak diğer yöne akar; böylece değeri gerçekten değiştiren tek yer sahip olur. a seçeneği tam olarak bunu yapar: ekran yalnızca niyeti bildirir, sahip değişikliği uygular. Bir ekranın sahibin değerini doğrudan üzerine yazması (b) tek değiştirme noktasını bozar. Ayrı kopyalar tutup ortalama almak (c) kopyalanmayı yeniden getirir. Bir kez okuyup hiç güncellememek (d) akış yönüyle hiç ilgili değildir, sadece eski veridir.",{"fields":212,"seniorities":388,"interview_shapes":389,"locales":394,"oauth":396,"question_count":399,"coach_enabled":400,"jd_match_enabled":400},[213,238,258,275,299,312,331,340,362,369,375,382],{"key":214,"name_tr":215,"name_en":215,"sort":129,"specializations":216},"backend","Backend",[217,220,223,226,229,232,235],{"key":218,"name":219,"field":214},"general","Genel",{"key":221,"name":222,"field":214},"go","Go",{"key":224,"name":225,"field":214},"python","Python",{"key":227,"name":228,"field":214},"java","Java",{"key":230,"name":231,"field":214},"csharp","C#\u002F.NET",{"key":233,"name":234,"field":214},"nodejs","Node.js",{"key":236,"name":237,"field":214},"php","PHP",{"key":239,"name_tr":240,"name_en":240,"sort":147,"specializations":241},"frontend","Frontend",[242,243,246,249,252,255],{"key":218,"name":219,"field":239},{"key":244,"name":245,"field":239},"javascript","JavaScript",{"key":247,"name":248,"field":239},"typescript","TypeScript",{"key":250,"name":251,"field":239},"react","React",{"key":253,"name":254,"field":239},"vue","Vue",{"key":256,"name":257,"field":239},"angular","Angular",{"key":259,"name_tr":260,"name_en":260,"sort":261,"specializations":262},"fullstack","Fullstack",3,[263,264,265,266,267,268,269,270,271,272,273,274],{"key":218,"name":219,"field":259},{"key":221,"name":222,"field":214},{"key":224,"name":225,"field":214},{"key":227,"name":228,"field":214},{"key":230,"name":231,"field":214},{"key":233,"name":234,"field":214},{"key":236,"name":237,"field":214},{"key":244,"name":245,"field":239},{"key":247,"name":248,"field":239},{"key":250,"name":251,"field":239},{"key":253,"name":254,"field":239},{"key":256,"name":257,"field":239},{"key":276,"name_tr":277,"name_en":277,"sort":278,"specializations":279},"devops-cloud","DevOps \u002F Cloud",4,[280,281,284,287,290,293,296],{"key":218,"name":219,"field":276},{"key":282,"name":283,"field":276},"aws","AWS",{"key":285,"name":286,"field":276},"gcp","GCP",{"key":288,"name":289,"field":276},"azure","Azure",{"key":291,"name":292,"field":276},"kubernetes","Kubernetes",{"key":294,"name":295,"field":276},"terraform","Terraform",{"key":297,"name":298,"field":276},"linux","Linux",{"key":300,"name_tr":301,"name_en":301,"sort":302,"specializations":303},"ai-engineer","AI Engineer",5,[304,305,306,309],{"key":218,"name":219,"field":300},{"key":224,"name":225,"field":300},{"key":307,"name":308,"field":300},"llm-rag","LLM\u002FRAG",{"key":310,"name":311,"field":300},"mlops","MLOps",{"key":313,"name_tr":314,"name_en":315,"sort":316,"specializations":317},"database","Veritabanı","Database",6,[318,319,322,325,328],{"key":218,"name":219,"field":313},{"key":320,"name":321,"field":313},"postgresql","PostgreSQL",{"key":323,"name":324,"field":313},"mysql","MySQL",{"key":326,"name":327,"field":313},"mongodb","MongoDB",{"key":329,"name":330,"field":313},"redis","Redis",{"key":5,"name_tr":6,"name_en":332,"sort":333,"specializations":334},"Mobile",7,[335,336,337,338,339],{"key":218,"name":219,"field":5},{"key":121,"name":122,"field":5},{"key":114,"name":115,"field":5},{"key":118,"name":119,"field":5},{"key":124,"name":125,"field":5},{"key":341,"name_tr":342,"name_en":343,"sort":344,"specializations":345},"security","Güvenlik","Security",8,[346,347,350,353,356,359],{"key":218,"name":219,"field":341},{"key":348,"name":349,"field":341},"appsec","AppSec",{"key":351,"name":352,"field":341},"offensive-pentest","Offensive \u002F Pentest",{"key":354,"name":355,"field":341},"cloud-security","Cloud Security",{"key":357,"name":358,"field":341},"devsecops","DevSecOps",{"key":360,"name":361,"field":341},"blue-team-incident","Blue Team \u002F Incident",{"key":363,"name_tr":364,"name_en":365,"sort":366,"specializations":367},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[368],{"key":218,"name":219,"field":363},{"key":370,"name_tr":371,"name_en":371,"sort":372,"specializations":373},"data-engineer","Data Engineer",10,[374],{"key":218,"name":219,"field":370},{"key":376,"name_tr":377,"name_en":378,"sort":379,"specializations":380},"game-dev","Oyun Geliştirme","Game Development",11,[381],{"key":218,"name":219,"field":376},{"key":383,"name_tr":384,"name_en":384,"sort":385,"specializations":386},"ml-engineer","ML Engineer",12,[387],{"key":218,"name":219,"field":383},[14,15,16],{"junior":390,"mid":392,"senior":393},{"questions":391,"median_sec":3},20,{"questions":391,"median_sec":3},{"questions":391,"median_sec":3},[10,395],"en",[397,398],"google","github",21750,true]