Mülakat Soruları

iOS Geliştirici Mülakat Soruları ve Cevapları: Teknik ve Teorik Hazırlık Rehberi

CVANALIZ Editör Ekibi 6 dk okuma

Uzman incelemesi: Can Demir

iOS mülakat soruları konulu blog yazısının kapak görseli
Fotoğraf: RDNE Stock project / Pexels

IOS mülakat süreçleri ve teknik beklentiler

Apple ekosisteminde uygulama geliştirmek, hem kod yazmayı hem Apple'ın katı tasarım kılavuzlarına (Human Interface Guidelines) ve performans standartlarına hakim olmayı gerektirir. Gerçekte, bir iOS geliştirici mülakatı ekseriyetle üç ana aşamadan oluşur: Teorik bilgi sorgulama. Canlı kodlama (live coding) ve sistem tasarımı.

İşe alım profesyonelleri ve teknik liderler. Adayın hem dili (Swift) bilip bilmediğine hem bellek yönetimini nasıl optimize ettiğine. Şöyle ki, hangi mimari desenleri neden tercih ettiğine ve hata ayıklama (debugging) yeteneklerine odaklanır. Mülakat öncesinde hazırladığınız Cv belgesinin, teknik yetkinliklerinizi ve tamamladığınız projeleri net bir şekilde yansıtması, teknik mülakata geçiş aşamasında kritik etkilidir.

Swift temelleri: mülakatlarda en çok sorulan sorular

Swift, modern ve güvenli bir dil olduğu için mülakatların ilk bölümü çoğunlukla dilin temel yapı taşları üzerine kuruludur. İşte en sık karşılaşılan sorular ve detaylı yanıtları:

Swift'te 'Optional' kavramı nedir ve nasıl yönetilir?

Optional'lar, bir değişkenin bir değere sahip olabileceğini veya 'nil' (boş) olabileceğini belirten bir yapıdır. Swift'in tip güvenliğini artırmak için getirdiği bu özellik, çalışma zamanı çökmelerini (runtime crashes) önlemeyi amaçlar.

Kısaca, optional değerleri güvenli bir şekilde açmak (unwrap) için şu yöntemler kullanılır:

  • Optional Binding: If let veya Guard let yapıları ile değerin varlığı kontrol edilir.
  • Nil Coalescing: ?? Operatörü ile değer nil ise varsayılan bir değer atanır.
  • Force Unwrapping: ! Operatörü ile değerin kesinlikle var olduğu varsayılır (riskli bir yöntemdir).

Struct ve class arasındaki farklar nelerdir?

Bu soru, iOS mülakatlarının klasiklerinden biridir. Temel ayrım, bellek yönetimi ve veri aktarım yöntemidir:

  • Struct (Value Type): Değer tipidir. Gerçekte, bir struct'ı başka bir değişkene atadığınızda verinin bir kopyası oluşturulur. Stack bellekte tutulurlar ve daha performanslıdırlar.
  • Class (Reference Type): Referans tipidir. Açıkçası, bir class örneğini başka bir değişkene atadığınızda, her iki değişken de bellekteki aynı nesneye işaret eder. Heap bellekte tutulurlar ve kalıtımı (inheritance) desteklerler.

Closure Nedir ve 'escaping' Ne Anlama Gelir?

Closure'lar, fonksiyon benzeri bloklardır ve değişken olarak atanabilir veya başka fonksiyonlara parametre olarak gönderilebilirler. @escaping belirteci, bir closure'ın fonksiyonun gövdesi tamamlandıktan sonra da çalışmaya devam edeceği durumlarda kullanılır. Mesela, bir API isteği yapıldığında, cevap geldiğinde çalışacak olan completion handler'lar çoğunlukla escaping'dir.

Bellek yönetimi ve ARC (Automatic reference counting)

IOS geliştirmede performansın anahtarı bellek yönetimidir. Mülakatçıların en çok üzerinde durduğu husus, bellek sızıntılarını (memory leaks) nasıl önlediğinizdir.

ARC nasıl çalışır?

ARC, Swift'in referans tipli nesnelerin ömrünü yönetmek için kullandığı mekanizmadır. Aslına bakılırsa, bir nesneye yapılan referans sayısı arttıkça referans sayacı yükselir; referanslar kaldırıldığında ise sayaç düşer. Sayaç sıfıra ulaştığında, nesne bellekten otomatik olarak silinir.

Strong, weak ve unowned referanslar

Bellek döngülerini (retain cycles) önlemek için farklı referans türleri kullanılır:

  • Strong: Varsayılan referans tipidir. Nesnenin bellekten silinmesini engeller.
  • Weak: Nesneye referans verir ne var ki referans sayacını artırmaz. Nesne silindiğinde otomatik olarak nil olur. Çoğu zaman delegasyon (delegation) deseninde kullanılır.
  • Gerçekte, unowned: Weak'e benzer ancak değerin asla nil olmayacağı garanti edildiğinde kullanılır. Eğer unowned bir referans nil olursa uygulama çöker.

Modern UI frameworkleri: swiftUI ve uIKit

Günümüzde birçok kurum hibrit bir yapı kullanmakta veya tamamen SwiftUI'a geçmektedir. Her iki framework'ün de çalışma prensiplerini bilmek sizi öne çıkarır.

SwiftUI ve uIKit arasındaki temel farklar

UIKit, "Imperative" (Emredici) bir yaklaşıma sahiptir. Yani, UI elemanlarını nasıl değiştireceğinizi hamle hamle söylersiniz (Örn: Butona tıklandığında label'ın rengini kırmızı yap).

SwiftUI ise "Declarative" (Bildirimsel) bir yaklaşımdır. UI'ın nasıl görünmesi gerektiğini tanımlarsınız ve durum (state) değiştiğinde SwiftUI arayüzü otomatik olarak günceller.

State management (Durum yönetimi) teknikleri

Açıkçası, swiftUI'da veri akışını yönetmek için kullanılan temel property wrapper'lar şunlardır:

  • @State: Basit, yerel durum yönetimi için kullanılır.
  • @Binding: Bir üst görünümden gelen veriyi değiştirmek için kullanılır.
  • @ObservedObject: Class tabanlı modelleri izlemek için kullanılır.
  • @StateObject: Nesnenin yaşam döngüsünü görünümle eşitlemek için kullanılır.
  • @EnvironmentObject: Uygulama genelinde paylaşılan verilere erişmek için kullanılır.

IOS mimari desenleri (Architecture patterns)

Sadece kod yazmak yetmez; kodun sürdürülebilir, test edilebilir ve modüler olması gerekir. Mülakatlarda hangi mimariyi kullandığınız ve nedenini açıklamanız beklenir.

MVC (Model-View-Controller)

Apple'ın geleneksel mimarisidir. Ne var ki projeler büyüdükçe Controller sınıfı çok şiştiği için "Massive View Controller" problemi ortaya çıkar. Kısaca, bu durum, iş mantığının (business logic) View katmanına kaymasına neden olur.

MVVM (Model-View-ViewModel)

Modern iOS geliştirmenin standartlarından biridir. ViewModel, View ile Model arasındaki köprüdür. İş mantığını Controller'dan ayırarak View'ın sadece görselleştirme ile ilgilenmesini kazandırır. SwiftUI ile mükemmel bir uyum içerisindedir.

Clean architecture ve VIPER

Kısaca, çok hatırı sayılır ölçekli projelerde kullanılan, sorumlulukların tamamen ayrıldığı mimarilerdir. VIPER (View, Interactor, Presenter. Entity, Router), her parçanın tek bir görevi olduğu, test edilebilirliğin en üst düzeye çıktığı bir yapıdır.

İleri seviye teknik konular ve optimizasyon

Kıdemli pozisyonlar için mülakatlar daha derin teknik detaylara iner. Concurrency (eşzamanlılık) ve network yönetimi burada kritik rol oynar.

Aslına bakılırsa, GCD (Grand central dispatch) vs swift concurrency (Async/Await)

IOS'ta aynı anda birden fazla işi yapmak (söz gelimi arka planda veri indirip ana ekranda göstermek) için iki ana yol vardır:

  • GCD: Kuyruklar (DispatchQueue) üzerinden çalışır. DispatchQueue.main.async gibi yapılarla ana thread yönetilir.
  • Async/Await: Swift 5.5 ile gelen modern yapıdır. Callback hell (iç içe closure'lar) sorununu çözer ve kodu senkronmuş gibi okunabilir kılar.

URLSession ve API yönetimi

Veri çekme işlemleri için URLSession standarttır. Mülakatlarda Generic yapılar kullanarak nasıl esnek bir Network Layer oluşturduğunuz sorulabilir. JSON verilerini modele dönüştürmek için Codable protokolünün kullanımı temel bir gerekliliktir.

Algoritma ve problem çözme yaklaşımı

Birçok firma, teknik mülakatın bir kısmında LeetCode tarzı algoritma soruları sorar. Çoğu durumda, burada önemli olan doğru cevaba ulaşmaktan ziyade, düşünme sürecinizi yüksek sesle paylaşmanızdır.

Bir problemle karşılaştığınızda şu aşamaları izleyin:

  1. Soruyu Netleştirin: Eksik parametreler var mı? Giriş ve çıkış değerleri neler olmalı?
  2. Kaba Taslak Çözüm: Hemen kod yazmaya başlamayın. Önce mantığı (pseudocode) kurun.
  3. Karmaşıklık Analizi: Çözümünüzün Time Complexity (Zaman Karmaşıklığı) ve Space Complexity (Alan Karmaşıklığı) değerlerini (Big O notation) vurgulayın.
  4. Optimizasyon: İlk çözümünüz çalıştıktan sonra, "Bunu daha performanslı nasıl yapabilirim?" sorusuna odaklanın.

Mülakat hazırlık süreci ve portfolyo

Teknik bilgi kadar, bu bilgiyi nasıl sunduğunuz da işe yarar. Pratikte, İK uzmanlarının dikkatini çekmek için stratejik bir hazırlık yapmalısınız.

Etkili bir yazılım cV'si nasıl olmalı?

Bir iOS geliştiricinin Cv belgesi, sadece deneyimlerini değil, teknik yetkinliklerini de kanıtlamalıdır. Projeleriniz için GitHub linkleri eklemek, kullandığınız kütüphaneleri (Alamofire. Combine, RxSwift vb.) belirtmek ve başarılarınızı (mesela: "Uygulama açılış hızını %20 artırdım") rakamlarla ifade etmek sizi öne çıkarır.

Eğer profesyonel bir görünüm arıyorsanız, modern ve sade bir Cv şablon seçimi yaparak okunabilirliği artırabilirsiniz. Karmaşık tasarımlar yerine, teknik yeteneklerin ve projelerin ön planda olduğu şablonlar tercih edilmelidir.

GitHub ve portfolyo yönetimi

Kod kaliteniz, mülakatçının sizin hakkınızdaki en net fikrini edinmesini sağlar. GitHub profilinizde şunlara dikkat edin:

  • Kısaca, README Dosyaları: Projenin ne işe yaradığını, hangi teknolojilerin kullanıldığını ve nasıl çalıştırılacağını açıklayan detaylı README dosyaları oluşturun.
  • İşin aslı, kod Standartları: İsimlendirme kurallarına (camelCase) uyun ve gereksiz yorum satırlarından kaçının.
  • Bir noktada, modülerlik: Kodunuzu parçalara ayırın; tek bir dosyada yüzlerce satır kod yazmak kötü bir izlenim bırakır.

Sıkça sorulan davranışsal sorular

Kısaca, teknik yetkinlik kadar "soft skill" dediğimiz sosyal beceriler de değerlendirilir. Bu sorulara STAR (Situation, Task, Action, Result) yöntemiyle cevap vermeniz önerilir.

"Bir teknik anlaşmazlık yaşadığınızda nasıl çözersiniz?"

Burada mülakatçı, egonuzu nasıl yönettiğinizi ve ortak paydada nasıl buluştuğunuzu anlamaya çalışır. Şöyle ki, "Veriye dayalı karar verme" ve "açık iletişim" anahtar kelimelerini tercih edin. Örnek: "Bir mimari seçiminde değişik fikirdeydik, her iki yöntemin artılarını ve eksilerini listeleyip küçük bir PoC (Proof of Concept) yaparak performans testleri sonucunda ortak karara vardık."

"En zorlandığınız teknik problem neydi ve nasıl çözdünüz?"

Açıkçası, bu soru, problem çözme yeteneğinizi ve öğrenme azminizi ölçer. Sorunu tanımlayın, denediğiniz başarısız yöntemleri anlatın ve sonunda nasıl bir çözüm bulduğunuzu açıklayın. Bu süreçte kullandığınız debug araçlarından (Instruments, LLDB) bahsetmek teknik derinliğinizi kanıtlar.

Özet ve son tavsiyeler

Kısaca, IOS geliştirici mülakatları, hem derinlemesine dil bilgisi hem de geniş bir ekosistem hakimiyeti gerektirir. Swift'in temellerinden başlayarak, bellek yönetimi, modern UI frameworkleri ve mimari desenler üzerinde uzmanlaşmak sizi rekabette öne taşır.

İşin aslı, hazırlık sürecinizde sadece teorik okumalar yapmayın; ufak projeler geliştirin. Mevcut projelerinizi refactor edin ve kod inceleme (code review) süreçlerine dahil olun. En güçlü öğrenme yolu, karşılaşılan hataları çözmektir. Teknik hazırlığınızı tamamladıktan sonra, yetkinliklerinizi en güçlü şekilde yansıtan bir Cv oluştur aşamasına geçerek hayalinizdeki işe bir adım daha yaklaşabilirsiniz.

Başarılar dileriz!

ATS uyumlu CV'ni dakikalar içinde hazırla.

Ücretsiz Başla
İçindekiler