Mülakat neyi ölçer?
Anadolu Market'in veri ekibine Python geliştirici alınıyor. İlk tur kavram soruları: "GIL nedir, pandas'ı neden etkilemez?" İkinci tur canlı kodlama: "Şu sipariş listesinde toplamı X eden iki ürünü bul." Üçüncü tur sistem tasarımı: "Günde milyonlarca siparişi işleyen bir boru hattını (pipeline) nasıl kurarsın?" Üç tur üç farklı şeyi ölçer: dili gerçekten anlıyor musun, problemi yapılandırılmış biçimde çözebiliyor musun, büyük resmi görüyor musun. Bu ders üçünü de çalıştırır; ağırlık ikinci turda, çünkü en çok orada elenilir.
Sık sorulan Python kavram soruları
Aşağıdaki tablo, mülakatlarda en sık çıkan kavram sorularını ve bir cümlelik çekirdek cevaplarını listeler. Cevabı ezberleme; her birini küçük bir örnekle gösterebilecek kadar anla.
| Soru | Çekirdek cevap | Takip sorusu |
|---|---|---|
| GIL nedir? | CPython'da aynı anda yalnızca bir iş parçacığının Python bytecode çalıştırmasına izin veren kilit | Neden threading I/O için işe yarar ama CPU için yaramaz? (I/O beklerken kilit bırakılır; numpy/pandas C kodu da bırakır) |
| Mutable default argüman | Varsayılan değer tanım anında bir kez oluşur; liste/sözlük çağrılar arasında paylaşılır | Çözüm? (None + içeride oluştur) |
| is ile == farkı | is kimlik (aynı nesne mi), == eşitlik (__eq__) | Neden x is None doğru, x == None yanlış stil? (None tekildir; __eq__ ezilebilir) |
| Shallow / deep copy | Shallow dış kabı kopyalar, iç nesneler paylaşılır; deep özyinelemeli kopyalar | list(x), x[:], x.copy() hangisi? (hepsi shallow) |
| Generator vs list | Generator tembel, tek geçişlik, O(1) bellek; liste tüm veriyi tutar, tekrar gezilir | sum(x*x for x in r) neden sum([x*x for x in r])'den iyi? |
| Decorator | Fonksiyon alıp fonksiyon döndüren fonksiyon; @ sözdizimi şekerdir | functools.wraps neden? (ad ve docstring korunur) |
| __slots__ | Örnek başına __dict__ yerine sabit alanlar; bellek ve erişim hızı kazancı | Dezavantaj? (dinamik nitelik eklenemez, çoklu kalıtımda (inheritance) dikkat) |
Üçünü kodla doğrula; mülakatta "göstereyim" diyebilmek güven verir:
import copy
# is vs ==
a = [1, 2]
b = [1, 2]
print(a == b, a is b) # True False
# shallow vs deep
siparis = {"id": 1, "urunler": ["kalem"]}
s1 = siparis.copy()
s2 = copy.deepcopy(siparis)
siparis["urunler"].append("defter")
print(s1["urunler"], s2["urunler"]) # paylaşılan liste / bağımsız liste
# mutable default
def ekle(x, kutu=[]):
kutu.append(x)
return kutu
print(ekle(1), ekle(2)) # aynı liste iki kez
# __slots__
class Nokta:
__slots__ = ("x", "y")
def __init__(self, x, y):
self.x, self.y = x, y
n = Nokta(1, 2)
print(hasattr(n, "__dict__")) # False
Algoritma soruları: kalıpları tanı
Mülakat sorularının büyük kısmı beş altı kalıba iner. Soruyu duyunca kalıbı tanırsan çözümün yarısı bitmiştir.
1. Sözlükle sayım ve arama: iki toplam
"Listede toplamı hedef eden iki elemanın indekslerini bul." Kaba yol çift döngü, O(n²). Akıllı yol: gördüğün her sayıyı sözlüğe koy, sıradaki sayının tamamlayıcısı (hedef - sayı) sözlükte mi diye bak. Tek geçiş, O(n).
def iki_toplam(sayilar, hedef):
gorulen = {} # değer -> indeks
for i, s in enumerate(sayilar):
kalan = hedef - s
if kalan in gorulen:
return [gorulen[kalan], i]
gorulen[s] = i
return []
fiyatlar = [250, 90, 410, 160, 300]
print(iki_toplam(fiyatlar, 500)) # 250 + 250 yok; 90 + 410 -> [1, 2]
print(iki_toplam(fiyatlar, 1000)) # []
Aynı kalıp "anagram grupları"nda anahtarı sıralanmış harfler yaparak, "en çok tekrar eden ürün"de Counter ile görünür. Soru "bul, say, grupla" diyorsa sözlük düşün.
2. Küme ile O(n): en uzun ardışık dizi
"Sırasız sayılarda en uzun ardışık sayı dizisinin uzunluğu?" Sıralamak O(n log n). Küme ile O(n): her sayı için, bir eksiği kümede yoksa bu bir dizinin başıdır; ileri say.
def en_uzun_ardisik(sayilar):
kume = set(sayilar)
en_iyi = 0
for s in kume:
if s - 1 not in kume: # yalnızca dizi başlarından say
n = 1
while s + n in kume:
n += 1
en_iyi = max(en_iyi, n)
return en_iyi
print(en_uzun_ardisik([100, 4, 200, 1, 3, 2])) # 1,2,3,4 -> 4
Neden O(n)? Her sayı yalnızca ait olduğu dizinin başından itibaren bir kez sayılır. Mülakatçı "neden while içinde while var ama O(n)?" diye sorar; cevap bu.
3. Kayan pencere (sliding window)
"Art arda k günün en yüksek toplam cirosu" ya da "tekrarsız en uzun alt dize." Sabit ya da esneyen bir pencereyi sağa kaydırırsın; giren elemanı ekler, çıkanı çıkarırsın. Her adımda yeniden toplamak O(n·k); pencereyle O(n).
def en_iyi_pencere(ciro, k):
toplam = sum(ciro[:k])
en_iyi, bas = toplam, 0
for i in range(k, len(ciro)):
toplam += ciro[i] - ciro[i - k]
if toplam > en_iyi:
en_iyi, bas = toplam, i - k + 1
return bas, en_iyi
gunluk = [120, 300, 80, 450, 200, 90, 310]
print(en_iyi_pencere(gunluk, 3)) # (1, 830): 300+80+450
4. İki pointer ve ikili arama
Sıralı veride iki uçtan ortaya yürümek (iki pointer) ya da ortadan ikiye bölmek (ikili arama, O(log n)) klasik kalıplardır. bisect modülü ikili aramayı hazır verir ama mülakatta elle yazmanı isterler: lo, hi sınırları ve mid hesabı; döngü lo <= hi sürdükçe.
def ikili_ara(sirali, hedef):
lo, hi = 0, len(sirali) - 1
while lo <= hi:
mid = (lo + hi) // 2
if sirali[mid] == hedef:
return mid
if sirali[mid] < hedef:
lo = mid + 1
else:
hi = mid - 1
return -1
print(ikili_ara([3, 8, 15, 21, 42, 57], 21)) # 3
print(ikili_ara([3, 8, 15, 21, 42, 57], 22)) # -1
5. BFS: en kısa yol
Grafta "A'dan B'ye en az kaç adım?" sorusunda genişlik öncelikli arama (BFS) kullanılır: kuyruk (collections.deque) ve ziyaret edilenler kümesi. Depo ağı, sosyal bağlantı, kelime merdiveni; hepsi aynı kalıp.
from collections import deque
depolar = {
"İstanbul": ["Bursa", "Kocaeli"],
"Bursa": ["İstanbul", "Eskişehir"],
"Kocaeli": ["İstanbul", "Ankara"],
"Eskişehir": ["Bursa", "Ankara"],
"Ankara": ["Kocaeli", "Eskişehir"],
}
def en_kisa_adim(graf, bas, hedef):
kuyruk = deque([(bas, 0)])
ziyaret = {bas}
while kuyruk:
dugum, adim = kuyruk.popleft()
if dugum == hedef:
return adim
for komsu in graf.get(dugum, []):
if komsu not in ziyaret:
ziyaret.add(komsu)
kuyruk.append((komsu, adim + 1))
return -1
print(en_kisa_adim(depolar, "İstanbul", "Ankara")) # 2
Karmaşıklık: Big-O konuşabilmek
Her çözümden sonra mülakatçı "karmaşıklığı ne?" diye sorar. Kısa sözlük: sözlük/küme erişimi O(1) ortalama; listede arama O(n); sıralama O(n log n); çift döngü O(n²); ikili arama O(log n); BFS O(V + E). Bellek için de aynı soru gelir: ek sözlük tutuyorsan O(n) bellek. "Daha iyisi var mı?" sorusuna, mümkünse "hayır, çünkü her elemana en az bir kez bakmak gerekir" gibi bir alt sınır argümanı ver.
in listede O(n), kümede O(1). String birleştirmede döngüde += yerine liste toplayıp "".join. list.pop(0) O(n), deque.popleft() O(1). Bunları söylemek "dili biliyor" izlenimi verir.Canlı kodlama ipuçları
- Soruyu tekrar et ve netleştir: Girdi boş olabilir mi? Negatif sayı var mı? Tekrar eden eleman? Çıktı indeks mi değer mi? Her soru bir puan.
- Küçük bir örnek yaz: 4-5 elemanlı girdi ve beklenen çıktı. Örnek olmadan kod yazma.
- Önce kaba çözümü söyle: "Çift döngüyle O(n²) olur; sözlükle O(n)'e indirebilirim." Mülakatçı düşünme sürecini görmek ister.
- Sesli düşün, sessiz yazma: Takıldığında "burada iki seçenek var" de. Sessizlik en kötü sinyaldir.
- Yazdıktan sonra örnekle izle: Kodu satır satır örnek üzerinde yürüt. Kenar durumları (boş, tek eleman, hepsi aynı) kontrol et.
- Karmaşıklığı kendin söyle: Sorulmadan "zaman O(n), bellek O(n)" de.
- Temiz ad ve küçük fonksiyon:
a, b, tmpyerinegorulen, kalan. Test edilebilir fonksiyon yaz,printile değilreturnile sonuç ver.
Sistem tasarımı için Python
Üst düzey pozisyonlarda "Ilgaz Bank'ın işlem akışını işleyen bir servis tasarla" tarzı sorular gelir. Beklenen, kod değil, bileşenler ve seçimler: giriş (API, kuyruk), işleme (worker havuzu), depolama (ilişkisel/belge), gözlemleme (log, metrik). Python özelinde şunları söyleyebilmek fark yaratır: I/O yoğun servis için asyncio + FastAPI; CPU yoğun iş için multiprocessing ya da ayrı worker; büyük veri için pandas yerine parçalı işleme ya da polars/duckdb; durum paylaşımı için Redis; kuyruk için Celery/RQ ya da bulut kuyruğu. Her seçimi "neden" ile bağla: "GIL yüzünden CPU işini thread'e değil process'e veririm."
Derinleş: eksik kalan beş kalıp
Ders boyunca sözlük, küme, kayan pencere, iki pointer, ikili arama ve BFS kalıplarını gördün. Mülakat sorularının geri kalanının çoğu beş kalıba daha iner: yığın (stack), yığın-kuyruk (heap), önek toplamı (prefix sum), dinamik programlama (dynamic programming) ve geri izleme (backtracking). Bunlara aralık birleştirme ve LRU önbellek gibi "tasarım" sorularını eklersen klasik soru havuzunun büyük bölümünü kapsamış olursun. Özyinelemenin (recursion) temelini "Özyineleme" dersinde, sıralama algoritmalarının içini "Algoritmalar" dersinde gördün; burada mülakat açısından bakıyoruz.
| Soruda duyduğun | Kalıp | Python aracı | Tipik karmaşıklık |
|---|---|---|---|
| "eşleşen parantez", "bir sonraki büyük eleman", "geri al" | Yığın | list.append / pop | O(n) |
| "en büyük k", "en sık k", "sıralı listeleri birleştir", "en kısa yol (ağırlıklı)" | Heap | heapq | O(n log k) |
| "toplamı k olan alt dizi sayısı", "aralık toplamı" | Önek toplamı + sözlük | itertools.accumulate, dict | O(n) |
| "en az kaç", "kaç farklı yol", "en uzun ortak" | Dinamik programlama | liste tablosu, functools.cache | O(n·m) |
| "tüm kombinasyonlar", "tüm permütasyonlar", "geçerli tüm yerleşimler" | Geri izleme | özyineleme + liste | üstel |
| "çakışan aralıklar", "toplantı odası" | Sırala + tara | sorted(key=...) | O(n log n) |
1. Yığın: son giren ilk çıkar
Parantez doğrulama en klasik yığın sorusudur. Bir adım ötesi monoton yığındır: "her gün için fiyatın kaç gün sonra yükseleceğini bul" gibi sorularda, henüz cevabı bulunmamış günlerin indekslerini azalan sırada yığında tutarsın. Her indeks bir kez girip bir kez çıktığı için toplam O(n) olur.
def gecerli_mi(ifade):
eslesme = {")": "(", "]": "[", "}": "{"}
yigin = []
for c in ifade:
if c in "([{":
yigin.append(c)
elif c in eslesme:
if not yigin or yigin.pop() != eslesme[c]:
return False
return not yigin
print(gecerli_mi("{[()()]}"), gecerli_mi("([)]"), gecerli_mi("(("))
def kac_gun_sonra(fiyat):
sonuc = [0] * len(fiyat)
yigin = [] # cevabı bekleyen günlerin indeksleri
for i, f in enumerate(fiyat):
while yigin and fiyat[yigin[-1]] < f:
j = yigin.pop()
sonuc[j] = i - j
yigin.append(i)
return sonuc
print(kac_gun_sonra([73, 74, 75, 71, 69, 72, 76, 73]))
2. Heap: en büyük k ve ağırlıklı en kısa yol
heapq en küçük elemanı her zaman h[0]'da tutan bir min-heap'tir; ekleme ve çıkarma O(log n). "En büyük k" için boyutu k olan bir min-heap tut: yeni eleman tepedekinden büyükse değiştir. Böylece n elemanı O(n log k)'da tararsın; heapq.nlargest bunu hazır yapar. Max-heap gerekiyorsa değerleri eksiyle çarparak koy. Dijkstra algoritması da heap'e dayanır: her adımda en yakın düğümü çıkarırsın.
import heapq
siparisler = [("S1", 420), ("S2", 90), ("S3", 1250), ("S4", 610), ("S5", 300)]
print(heapq.nlargest(2, siparisler, key=lambda s: s[1]))
def dijkstra(graf, bas):
mesafe = {bas: 0}
h = [(0, bas)]
while h:
d, u = heapq.heappop(h)
if d > mesafe.get(u, float("inf")):
continue # eski, geçersiz kayıt
for v, w in graf.get(u, []):
yeni = d + w
if yeni < mesafe.get(v, float("inf")):
mesafe[v] = yeni
heapq.heappush(h, (yeni, v))
return mesafe
yollar = {"Depo": [("Kadıköy", 12), ("Beşiktaş", 7)],
"Beşiktaş": [("Kadıköy", 3), ("Şişli", 4)],
"Kadıköy": [("Ataşehir", 6)], "Şişli": [("Ataşehir", 15)]}
print(dijkstra(yollar, "Depo"))
3. Önek toplamı
onek[i] ilk i elemanın toplamıysa, i..j aralığının toplamı onek[j+1] - onek[i] olur. "Toplamı k olan kaç alt dizi var?" sorusunda her konumda "şimdiye kadarki toplam - k" değerinin daha önce kaç kez görüldüğünü sözlükte sayarsın. Negatif sayılar olduğunda kayan pencere çalışmaz, önek toplamı çalışır; bu ayrımı söylemek artı puandır.
4. Dinamik programlama
İki işaret ara: optimal alt yapı (büyük problemin cevabı küçüklerinkinden kurulur) ve örtüşen alt problemler (aynı küçük problem tekrar tekrar çözülür). İki yazım şekli vardır: yukarıdan aşağı (özyineleme + functools.cache) ve aşağıdan yukarı (tablo). Mülakatta önce özyinelemeli tanımı söyle, sonra tabloya çevir.
from functools import cache
def para_ustu(bozuklar, tutar):
"""En az kaç bozuk para? Mümkün değilse -1."""
SONSUZ = float("inf")
dp = [0] + [SONSUZ] * tutar # dp[t]: t tutarı için en az para
for t in range(1, tutar + 1):
for b in bozuklar:
if b <= t and dp[t - b] + 1 < dp[t]:
dp[t] = dp[t - b] + 1
return dp[tutar] if dp[tutar] != SONSUZ else -1
print(para_ustu([1, 5, 10, 25], 63), para_ustu([5, 10], 3))
@cache
def yol_sayisi(satir, sutun):
"""Izgarada sol üstten sağ alta yalnız sağ/aşağı giderek kaç yol?"""
if satir == 1 or sutun == 1:
return 1
return yol_sayisi(satir - 1, sutun) + yol_sayisi(satir, sutun - 1)
print(yol_sayisi(3, 7), yol_sayisi.cache_info().hits)
[1, 3, 4] ile 6 için 4+1+1 (3 para) verir; doğrusu 3+3 (2 para). Mülakatçı tam bu karşı örneği sorar: greedy önerirsen neden doğru olduğunu kanıtlamaya hazır ol.5. Geri izleme ve aralıklar
Geri izleme, seçim yap, özyinele, seçimi geri al döngüsüdür. "Toplamı hedef olan tüm kombinasyonlar" ya da "tüm alt kümeler" bu kalıptır; dalı erken kesmek (pruning, ör. sıralı adaylarda toplam aşınca break) süreyi ciddi biçimde düşürür. Aralık sorularında ise neredeyse her zaman ilk adım başlangıca göre sıralamaktır.
def birlestir(araliklar):
sonuc = []
for bas, bit in sorted(araliklar):
if sonuc and bas <= sonuc[-1][1]:
sonuc[-1][1] = max(sonuc[-1][1], bit)
else:
sonuc.append([bas, bit])
return sonuc
print(birlestir([(9, 11), (1, 3), (2, 6), (8, 10), (15, 18)]))
def alt_kumeler(ogeler):
sonuc, secim = [], []
def gez(i):
if i == len(ogeler):
sonuc.append(secim.copy()) # kopyala: secim değişmeye devam edecek
return
secim.append(ogeler[i]); gez(i + 1) # al
secim.pop(); gez(i + 1) # alma (geri al)
gez(0)
return sonuc
print(alt_kumeler(["çay", "simit", "peynir"]))
collections.Counter.most_common, heapq.merge, bisect.bisect_left, itertools.combinations ve functools.cache kullanmak serbesttir; ama "bunu elle yazabilir misin?" sorusuna hazır ol. Önce hazır aracı söyle, sonra elle yazmayı teklif et.Bu ders her rol için ortak çekirdeği veriyor: Python kavramları, algoritma kalıpları, canlı kodlama ve davranışsal sorular. Ama bir veri analisti ile bir backend geliştiricinin mülakatı aynı değildir. Bu bölüm iki şey ekliyor: öğrenme yoluna göre "hangi bölüm sana ne kadar lazım" haritası ve kendi kendine uygulayabileceğin 45 dakikalık bir deneme mülakatı senaryosu.
Öğrenme yollarına göre harita
| Yol | Bu dersten öncelik | Ardından çalış | Mülakatta ağırlık |
|---|---|---|---|
| Veri analisti | Kavram soruları, sözlükle sayım, davranışsal sorular | Veri mülakatı (SQL, pandas, metrik, vaka), İş metrikleri | SQL canlı yazım, pandas ile analiz, iş sorusunu metriğe çevirme |
| Veri bilimci / ML | Kavramlar, Big-O, kayan pencere, heap | Veri mülakatı, ML derslerindeki SSS'ler | İstatistik, model değerlendirme, sızıntı, A/B testi, ev ödevi |
| Veri mühendisi | Kalıpların tamamı, Big-O, ev ödevi | Veri mülakatı, Mülakat kalıpları 2, Sistem tasarımı | SQL, ETL tasarımı, idempotentlik, bölümleme, orkestrasyon |
| Backend / web | Kalıpların tamamı, canlı kodlama ipuçları | Mülakat kalıpları 2, Sistem tasarımı | Algoritma (orta), API ve veritabanı tasarımı, önbellek, güvenlik |
| AI mühendisi | Kavramlar, sözlük/küme kalıpları, ev ödevi | Sistem tasarımı (LLM servisleri), LLM dersleri | RAG tasarımı, değerlendirme, maliyet ve gecikme |
| Otomasyon | Kavramlar, sayım ve metin kalıpları | Python Arena (Kolay/Orta) | Dosya, Excel, hata yönetimi; çoğunlukla pratik görev |
| Sertifika (PCEP/PCAP) | Kavram soruları ve "yanlış ama sık verilen cevaplar" | Mülakat kalıpları 2, sınav bölümü | Dil ayrıntısı: kapsam, değişebilirlik, istisnalar, OOP |
Haritayı şöyle kullan: kendi satırındaki ilk sütunu bu derste pekiştir, ikinci sütundaki dersleri sırayla bitir, üçüncü sütunu deneme mülakatlarında ağırlık olarak kullan. Python Arena'da rolüne uygun alan süzgeciyle günde 1-2 soru çözmek, kalıpları otomatikleştirmenin en verimli yoludur.
45 dakikalık deneme mülakatı
Gerçek teknik mülakatların çoğu 45-60 dakikadır ve benzer bir akışı izler. Bir arkadaşınla rol değiştirerek ya da kendi kendine süre tutarak uygula; ekranını kaydet ve sonra izle. Senaryo Anadolu Market'in backend/veri pozisyonuna göre yazıldı.
| Dakika | Bölüm | Görüşmeci ne yapar? | Sen ne yapmalısın? |
|---|---|---|---|
| 0-5 | Tanışma | "Kendinden ve son projenden bahset." | 90 saniyelik hazır özet: kim, ne yaptın, hangi sonuç |
| 5-10 | Kavram ısınması | 2-3 kısa soru: değişebilirlik, üreteç, GIL | Kısa tanım + örnek; bilmediğini kabul et ama akıl yürüt |
| 10-35 | Canlı kodlama | Bir problem, sonra bir takip sorusu | Netleştir → örnek → kaba çözüm → iyileştir → test et |
| 35-40 | Tasarım/vaka | "Bunu günde 10 milyon siparişe nasıl ölçeklersin?" | Darboğazı adlandır, iki seçenek ve ödünleşimini söyle |
| 40-45 | Senin soruların | "Sormak istediğin bir şey var mı?" | Ekip, kod inceleme (code review), yayın süreci üzerine 2 hazır soru |
Canlı kodlama problemi (25 dakika)
Görev: "Sipariş akışında her sipariş (musteri_id, zaman_sn) olarak geliyor. Son 60 saniyede 3'ten fazla sipariş veren müşterileri, sınırı ilk aştıkları an itibarıyla raporla." Takip sorusu: "Akış sıralı gelmiyorsa ne değişir? Bellek sınırlıysa?"
from collections import defaultdict, deque
def supheliler(siparisler, pencere=60, sinir=3):
son = defaultdict(deque) # müşteri -> penceredeki zamanlar
bulunan = {}
for musteri, t in siparisler: # zaman sırasıyla geldiğini varsayıyoruz (netleştir!)
q = son[musteri]
q.append(t)
while q[0] <= t - pencere: # pencereden çıkanları at
q.popleft()
if len(q) > sinir and musteri not in bulunan:
bulunan[musteri] = t
return bulunan
akis = [(7, 0), (7, 10), (9, 12), (7, 30), (7, 55), (9, 70), (7, 61), (7, 62)]
print(supheliler(akis))
Değerlendirme ölçütleri: Soruyu netleştirdin mi (pencere dahil mi, sıralı mı)? Kaba çözümü söyleyip (her siparişte tüm geçmişi taramak, O(n²)) iyileştirdin mi? Karmaşıklığı söyledin mi (her zaman en fazla bir kez eklenip çıkarılır: O(n) zaman, O(müşteri × pencere) bellek)? Kenar durumları denedin mi (aynı saniyede sipariş, tam 60 saniye sınırı)?
Kendini puanla
| Ölçüt | 1 (zayıf) | 3 (iyi) |
|---|---|---|
| Problem çözme | Doğrudan koda atladı, varsayım sormadı | Netleştirdi, örnek üzerinde düşündü, alternatifleri tarttı |
| Kod | Çalışmadı ya da okunmuyor | Çalışıyor, adlar anlamlı, fonksiyonlara bölünmüş |
| İletişim | Sessiz yazdı | Düşündüğünü sesli anlattı, ipucunu kullandı |
| Test | Hiç denemedi | Kendi örnekleriyle ve kenar durumlarla denedi |
| Karmaşıklık | Bilmiyor | Zaman ve bellek için doğru O(...) ve gerekçe |
Soruyu kalıba indirgeme pratiği
Her gün bir soru çöz ve çözümden sonra şu üç satırı yaz: kalıp (sözlük / küme / pencere / iki pointer / ikili arama / BFS-DFS / dinamik programlama), karmaşıklık, kenar durumları. Bir ay sonra soruları duyar duymaz kalıbı göreceksin. Dinamik programlama (en uzun ortak alt dizi, para üstü) ve heap (en büyük k eleman, heapq.nlargest) bu dersin kapsamı dışında kalan ama sık sorulan iki kalıptır; sırada onlar olsun.
Yanlış ama sık verilen cevaplar
"GIL Python'ı tek çekirdekli yapar" (yanlış: multiprocessing ve C uzantıları çekirdekleri kullanır). "Tuple değişmezdir, içi de değişmez" (yanlış: tuple içindeki liste değişir). "Decorator yalnızca loglama içindir" (eksik: önbellek, yetki, yeniden deneme, kayıt). "is daha hızlıdır, hep onu kullan" (yanlış: kimlik ile eşitlik farklı sorulardır; küçük tamsayı önbelleği yanıltır).
Ev ödevi projesi (take-home)
Bazı şirketler canlı kodlama yerine ev ödevi verir. Değerlendirme ölçütleri: README (nasıl çalışır, nasıl test edilir), testler, tip ipuçları (type hint), lint temizliği, küçük ve odaklı commit'ler, hata yönetimi. Bir önceki dersin kalite zincirini uygula; "çalışıyor" yetmez, "üretime konabilir" izlenimi ver.
Davranışsal sorular
"Zor bir hatayı nasıl buldun?" sorusuna STAR biçiminde cevap ver: Durum, Görev, Eylem, Sonuç. Teknik ayrıntı ver (profil aldım, darboğaz sorgu birleştirmedeydi, indeks ekledim) ama bir dakikayı geçme.