[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:backend\u002Fsenior":4,"config":253},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":8,"spec_key":8,"spec_name":8,"locale":9,"cell_total":10,"field_total":11,"seniorities":12,"topics":15,"specs":149,"samples":169},"backend","Backend","senior","","tr",2166,3300,[13,14,7],"junior","mid",[16,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140,143,146],{"key":17,"name":18,"count":19},"api-design","API Tasarımı",75,{"key":21,"name":22,"count":19},"caching","Caching",{"key":24,"name":25,"count":19},"concurrency","Eşzamanlılık",{"key":27,"name":28,"count":19},"csharp-concurrency-async","Csharp Concurrency Async",{"key":30,"name":31,"count":19},"csharp-exceptions","Csharp Exceptions",{"key":33,"name":34,"count":19},"csharp-generics-interfaces","Csharp Generics Interfaces",{"key":36,"name":37,"count":19},"csharp-memory-performance","Csharp Memory Performance",{"key":39,"name":40,"count":19},"csharp-stdlib-http","Csharp Stdlib Http",{"key":42,"name":43,"count":19},"csharp-testing-tooling","Csharp Testing Tooling",{"key":45,"name":46,"count":19},"databases-sql","Veritabanı \u002F SQL",{"key":48,"name":49,"count":19},"go-concurrency","Go Concurrency",{"key":51,"name":52,"count":19},"go-errors","Go Errors",{"key":54,"name":55,"count":19},"go-interfaces-generics","Go Interfaces Generics",{"key":57,"name":58,"count":19},"go-memory-performance","Go Memory Performance",{"key":60,"name":61,"count":19},"go-stdlib-http","Go Stdlib Http",{"key":63,"name":64,"count":19},"go-testing-tooling","Go Testing Tooling",{"key":66,"name":67,"count":19},"java-concurrency","Java Concurrency",{"key":69,"name":70,"count":19},"java-exceptions","Java Exceptions",{"key":72,"name":73,"count":19},"java-generics-interfaces","Java Generics Interfaces",{"key":75,"name":76,"count":19},"java-memory-jvm","Java Memory Jvm",{"key":78,"name":79,"count":19},"java-stdlib-http","Java Stdlib Http",{"key":81,"name":82,"count":19},"java-testing-tooling","Java Testing Tooling",{"key":84,"name":85,"count":19},"messaging-queues","Mesajlaşma \u002F Kuyruklar",{"key":87,"name":88,"count":19},"networking-http","Ağ \u002F HTTP",{"key":90,"name":91,"count":19},"nodejs-error-handling","Nodejs Error Handling",{"key":93,"name":94,"count":19},"nodejs-event-loop-async","Nodejs Event Loop Async",{"key":96,"name":97,"count":19},"nodejs-memory-performance","Nodejs Memory Performance",{"key":99,"name":100,"count":19},"nodejs-modules-streams","Nodejs Modules Streams",{"key":102,"name":103,"count":19},"nodejs-stdlib-http","Nodejs Stdlib Http",{"key":105,"name":106,"count":19},"nodejs-testing-tooling","Nodejs Testing Tooling",{"key":108,"name":109,"count":19},"php-concurrency-async","Php Concurrency Async",{"key":111,"name":112,"count":19},"php-exceptions","Php Exceptions",{"key":114,"name":115,"count":19},"php-generics-interfaces","Php Generics Interfaces",{"key":117,"name":118,"count":19},"php-memory-performance","Php Memory Performance",{"key":120,"name":121,"count":19},"php-stdlib-http","Php Stdlib Http",{"key":123,"name":124,"count":19},"php-testing-tooling","Php Testing Tooling",{"key":126,"name":127,"count":19},"python-concurrency-async","Python Concurrency Async",{"key":129,"name":130,"count":19},"python-errors-context","Python Errors Context",{"key":132,"name":133,"count":19},"python-memory-performance","Python Memory Performance",{"key":135,"name":136,"count":19},"python-stdlib-http","Python Stdlib Http",{"key":138,"name":139,"count":19},"python-testing-tooling","Python Testing Tooling",{"key":141,"name":142,"count":19},"python-typing-oop","Python Typing Oop",{"key":144,"name":145,"count":19},"security","Güvenlik",{"key":147,"name":148,"count":19},"testing","Test",[150,154,157,160,163,166],{"key":151,"name":152,"count":153},"csharp","C#\u002F.NET",450,{"key":155,"name":156,"count":153},"go","Go",{"key":158,"name":159,"count":153},"java","Java",{"key":161,"name":162,"count":153},"nodejs","Node.js",{"key":164,"name":165,"count":153},"php","PHP",{"key":167,"name":168,"count":153},"python","Python",[170,188,201,214,227,240],{"id":171,"topic":18,"difficulty":172,"body":173,"options":174,"correct_key":176,"explanation":187},"019f56bb-b327-74ec-85da-533f10fc0c08",3,"Aynı DELETE isteği iki kez gönderiliyor:\n```http\nDELETE \u002Forders\u002F42   ->  204 No Content\nDELETE \u002Forders\u002F42   ->  404 Not Found\n```\nİki çağrı farklı status code döndürüyor. DELETE'in idempotency'si ihlal edilmiş midir?",[175,178,181,184],{"key":176,"text":177},"a","Hayır — idempotency sunucu state'iyle ilgilidir; iki çağrıdan sonra da sipariş eşit derecede silinmiştir",{"key":179,"text":180},"b","Evet — idempotent bir metod her tekrarda aynı status code'u döndürmek zorundadır; yalnızca aynı son state'e ulaşmak yetmez",{"key":182,"text":183},"c","Evet — istemci retry'ı bırakana kadar sunucu 204 döndürmeye devam etmeliydi",{"key":185,"text":186},"d","Hayır — çünkü DELETE zaten hiçbir zaman idempotent bir metod olmadı","Idempotency, isteğin tekrarının sunucuyu aynı state'te bırakacağını vadeder; response'un birebir aynı olacağını değil. İki çağrıdan sonra da sipariş yoktur; 404 sadece artık var olmadığını raporlar. Aynı status code beklemek (b), tanımın en sık yanlış okunma biçimidir.",{"id":189,"topic":18,"difficulty":172,"body":190,"options":191,"correct_key":179,"explanation":200},"019f56bb-b32a-79e1-adfd-b3e512867a2e","İki istemci aynı dokümanı düzenliyor. Sunucuda şu an `version: 5` kayıtlı. Şu güncelleme geliyor:\n```http\nPUT \u002Fdocuments\u002F12\nContent-Type: application\u002Fjson\n\n{\"title\": \"Final\", \"version\": 4}\n```\nİstek bayat bir versiyona dayanıyor. Bu optimistic-locking tasarımında en uygun response hangisidir?",[192,194,196,198],{"key":176,"text":193},"200 OK — eşzamanlı düzenlemede işleyen tek politika last write wins'tir",{"key":179,"text":195},"409 Conflict — güncelleme eski state'e dayanıyor",{"key":182,"text":197},"404 Not Found — dokümanın 4. versiyonu artık sunucuda mevcut değil",{"key":185,"text":199},"401 Unauthorized — istemcinin düzenleme session'ının süresi dolmuş","409 Conflict, isteğin resource'un güncel state'iyle çatıştığını söyler — versiyon uyuşmazlığının standart cevabıdır; istemcinin yapması gereken, güncel hali yeniden çekip tekrar denemektir. Sessizce kabul etmek (a), diğer istemcinin değişikliklerini ezerdi; optimistic locking tam olarak bunu önlemek için vardır. (c) ise versiyonu ayrı bir alt-resource sanma hatasıdır.",{"id":202,"topic":18,"difficulty":172,"body":203,"options":204,"correct_key":176,"explanation":213},"019f56bb-b32d-7a54-b538-20dfd8fcf9ff","Bir istemci offset tabanlı pagination ile sayfalarda ilerlerken listenin başına sürekli yeni satırlar ekleniyor. Cursor tabanlı pagination bu durumu neden daha iyi yönetir?",[205,207,209,211],{"key":176,"text":206},"Cursor, sabit bir referans noktasından (örn. son görülen id) devam eder",{"key":179,"text":208},"Cursor, veritabanının tabloyu kilitlemesini sağlar; pagination sırasında insert olamaz",{"key":182,"text":210},"Cursor pagination tüm sonucu bir kez indirir ve istemci belleğinde sayfalar",{"key":185,"text":212},"Offset pagination ORDER BY ile birleşemez, bu yüzden sonuçlar sırasız döner","Offset, satırları sonucun başından sayar; her ekleme her şeyi kaydırır ve istemci sayfalar arasında tekrar eden ya da atlanan kayıtlar görür. Cursor ise dönen son kaydın sabit anahtarına tutunur ve \"bundan sonrasını\" ister; başa eklenen satırlar sonraki sayfayı kaydıramaz. Kilitleme (b) söz konusu değildir — ölçekte kullanılamaz olurdu.",{"id":215,"topic":18,"difficulty":172,"body":216,"options":217,"correct_key":179,"explanation":226},"019f56bb-b32e-7b17-9c79-4a639511f77b","Production'daki bir mobil uygulama JSON API'ni tüketiyor ve kullanıcıları uygulamayı güncellemeye zorlayamıyorsun. Hangi değişikliği yeni bir API versiyonu çıkarmadan yayınlayabilirsin?",[218,220,222,224],{"key":176,"text":219},"İsimlendirme tutarlılığı için `created` alanını `createdAt` olarak yeniden adlandırmak",{"key":179,"text":221},"Response objesine yeni bir opsiyonel `avatarUrl` alanı eklemek",{"key":182,"text":223},"UUID desteği için `id` alanını JSON number'dan string'e çevirmek",{"key":185,"text":225},"Create isteğinde daha önce opsiyonel olan `phone` alanını zorunlu yapmak","Opsiyonel bir response alanı eklemek additive'dir: düzgün yazılmış istemciler tanımadıkları alanları yok sayar, hiçbir şey kırılmaz. Yeniden adlandırma (a) eski alanı yok eder, tip değişikliği (c) parser'ları bozar, yeni zorunlu girdi (d) ise önceden başarılı olan istekleri reddettirir — üçü de breaking change'tir.",{"id":228,"topic":18,"difficulty":172,"body":229,"options":230,"correct_key":182,"explanation":239},"019f56bb-b333-7a13-9e01-11e9fda03fb6","JSON body'li cross-origin bir PUT isteğinden önce browser, aynı URL'e kendi kendine bir OPTIONS isteği gönderiyor. Bu preflight isteği ne içindir?",[231,233,235,237],{"key":176,"text":232},"TCP bağlantısını ısıtır, böylece asıl istek daha hızlı tamamlanır",{"key":179,"text":234},"İstemci payload'ı doğrulayabilsin diye endpoint'in şemasını indirir",{"key":182,"text":236},"Asıl isteği göndermeden önce sunucuya cross-origin metod ve header'lara izin verilip verilmediğini sorar",{"key":185,"text":238},"Kullanıcının kimliğini önceden doğrular ve session cookie'si kaydeder; böylece gelecek PUT isteği yetkili olarak ulaşır","Basit sayılmayan cross-origin istekler — PUT\u002FDELETE gibi metodlar, JSON content type'lar, özel header'lar — preflight tetikler. Sunucu Access-Control-Allow-* header'larıyla cevap verir; ancak izin çıkarsa browser asıl isteği gönderir. Performansla (a) ya da authentication ile (d) ilgisi yoktur.",{"id":241,"topic":18,"difficulty":172,"body":242,"options":243,"correct_key":179,"explanation":252},"019f56bb-b335-76f5-b54e-1a2e7d4c0c62","Bir ödeme API'si `POST \u002Fpayments` isteği alıyor. Network timeout'ları istemcileri retry'a zorluyor ve bazı kullanıcılardan iki kez para çekiliyor. Hangi API tasarımı double charging'i contract seviyesinde çözer?",[244,246,248,250],{"key":176,"text":245},"İstemcilerin POST isteklerini asla retry etmemesi gerektiğini dokümante etmek",{"key":179,"text":247},"İstemcinin ürettiği bir `Idempotency-Key` kabul edip retry'ları tekilleştirmek",{"key":182,"text":249},"Her istemciyi dakikada bir isteğe rate-limit'lemek, böylece retry'lar reddedilir",{"key":185,"text":251},"Endpoint'i PUT'a çevirmek, çünkü PUT tanımı gereği idempotent'tir","Idempotency key, sunucunun aynı mantıksal işlemin retry'ını tanıyıp tekrar para çekmek yerine saklanan sonucu döndürmesini sağlar. \"PUT'a çevir\" (d) kavramı yanlış anlamaktır: PUT'un idempotency'si tam-değiştirme semantiğinden gelir, \"yeni bir ödeme oluştur\"u tarif etmez — metodun adını değiştirmek hiçbir şeyi tekilleştirmez. (a) ise gerçekle kavgadır: timeout varsa retry kaçınılmazdır.",{"fields":254,"seniorities":425,"interview_shapes":426,"locales":431,"oauth":433,"question_count":436,"coach_enabled":437,"jd_match_enabled":437},[255,267,288,304,328,341,360,379,399,406,412,419],{"key":5,"name_tr":6,"name_en":6,"sort":256,"specializations":257},1,[258,261,262,263,264,265,266],{"key":259,"name":260,"field":5},"general","Genel",{"key":155,"name":156,"field":5},{"key":167,"name":168,"field":5},{"key":158,"name":159,"field":5},{"key":151,"name":152,"field":5},{"key":161,"name":162,"field":5},{"key":164,"name":165,"field":5},{"key":268,"name_tr":269,"name_en":269,"sort":270,"specializations":271},"frontend","Frontend",2,[272,273,276,279,282,285],{"key":259,"name":260,"field":268},{"key":274,"name":275,"field":268},"javascript","JavaScript",{"key":277,"name":278,"field":268},"typescript","TypeScript",{"key":280,"name":281,"field":268},"react","React",{"key":283,"name":284,"field":268},"vue","Vue",{"key":286,"name":287,"field":268},"angular","Angular",{"key":289,"name_tr":290,"name_en":290,"sort":172,"specializations":291},"fullstack","Fullstack",[292,293,294,295,296,297,298,299,300,301,302,303],{"key":259,"name":260,"field":289},{"key":155,"name":156,"field":5},{"key":167,"name":168,"field":5},{"key":158,"name":159,"field":5},{"key":151,"name":152,"field":5},{"key":161,"name":162,"field":5},{"key":164,"name":165,"field":5},{"key":274,"name":275,"field":268},{"key":277,"name":278,"field":268},{"key":280,"name":281,"field":268},{"key":283,"name":284,"field":268},{"key":286,"name":287,"field":268},{"key":305,"name_tr":306,"name_en":306,"sort":307,"specializations":308},"devops-cloud","DevOps \u002F Cloud",4,[309,310,313,316,319,322,325],{"key":259,"name":260,"field":305},{"key":311,"name":312,"field":305},"aws","AWS",{"key":314,"name":315,"field":305},"gcp","GCP",{"key":317,"name":318,"field":305},"azure","Azure",{"key":320,"name":321,"field":305},"kubernetes","Kubernetes",{"key":323,"name":324,"field":305},"terraform","Terraform",{"key":326,"name":327,"field":305},"linux","Linux",{"key":329,"name_tr":330,"name_en":330,"sort":331,"specializations":332},"ai-engineer","AI Engineer",5,[333,334,335,338],{"key":259,"name":260,"field":329},{"key":167,"name":168,"field":329},{"key":336,"name":337,"field":329},"llm-rag","LLM\u002FRAG",{"key":339,"name":340,"field":329},"mlops","MLOps",{"key":342,"name_tr":343,"name_en":344,"sort":345,"specializations":346},"database","Veritabanı","Database",6,[347,348,351,354,357],{"key":259,"name":260,"field":342},{"key":349,"name":350,"field":342},"postgresql","PostgreSQL",{"key":352,"name":353,"field":342},"mysql","MySQL",{"key":355,"name":356,"field":342},"mongodb","MongoDB",{"key":358,"name":359,"field":342},"redis","Redis",{"key":361,"name_tr":362,"name_en":363,"sort":364,"specializations":365},"mobile","Mobil","Mobile",7,[366,367,370,373,376],{"key":259,"name":260,"field":361},{"key":368,"name":369,"field":361},"ios-swift","iOS (Swift)",{"key":371,"name":372,"field":361},"android-kotlin","Android (Kotlin)",{"key":374,"name":375,"field":361},"flutter","Flutter",{"key":377,"name":378,"field":361},"react-native","React Native",{"key":144,"name_tr":145,"name_en":380,"sort":381,"specializations":382},"Security",8,[383,384,387,390,393,396],{"key":259,"name":260,"field":144},{"key":385,"name":386,"field":144},"appsec","AppSec",{"key":388,"name":389,"field":144},"offensive-pentest","Offensive \u002F Pentest",{"key":391,"name":392,"field":144},"cloud-security","Cloud Security",{"key":394,"name":395,"field":144},"devsecops","DevSecOps",{"key":397,"name":398,"field":144},"blue-team-incident","Blue Team \u002F Incident",{"key":400,"name_tr":401,"name_en":402,"sort":403,"specializations":404},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[405],{"key":259,"name":260,"field":400},{"key":407,"name_tr":408,"name_en":408,"sort":409,"specializations":410},"data-engineer","Data Engineer",10,[411],{"key":259,"name":260,"field":407},{"key":413,"name_tr":414,"name_en":415,"sort":416,"specializations":417},"game-dev","Oyun Geliştirme","Game Development",11,[418],{"key":259,"name":260,"field":413},{"key":420,"name_tr":421,"name_en":421,"sort":422,"specializations":423},"ml-engineer","ML Engineer",12,[424],{"key":259,"name":260,"field":420},[13,14,7],{"junior":427,"mid":429,"senior":430},{"questions":428,"median_sec":3},20,{"questions":428,"median_sec":3},{"questions":428,"median_sec":3},[9,432],"en",[434,435],"google","github",21750,true]