- Sistem tasarımı nedir, hangi soruya cevap verir?
- Tasarım görüşmesinin akışı: nereden başlanır?
- Temel yapı taşları ve ne zaman kullanılırlar?
- Örnek senaryo: kısa bağlantı servisi
- Dayanıklılık ve ölçeklenme: arıza anında sistem ne yapar?
- Mülakata hazırlık: nasıl çalışılır, nelerden kaçınılır?
- Başlangıçtan ileri düzeye öğrenme yolu
- Sık sorulan sorular
Sistem Tasarımı Becerisi: Yöntem, Örnek ve Mülakat Hazırlığı
Yazılım sistem tasarımı adım adım: gereksinimler, kapasite tahmini, veri katmanı, ölçeklenme ve dayanıklılık. System design mülakatına hazırlık rehberi.
Sistem tasarımı nedir, hangi soruya cevap verir?
Yazılım sistem tasarımı, bir ürünün gereksinimlerini karşılayacak bileşenleri, bunların birbiriyle konuşma biçimini ve veriyi nasıl saklayacağını önceden kararlaştırma becerisidir. Kod yazmaktan farklıdır. Kod yazarken bir fonksiyon ya da sınıf düşünürsünüz. Sistem tasarlarken servisleri, veri tabanlarını, önbellekleri, kuyrukları ve bunların arıza anındaki davranışını düşünürsünüz.
Tasarımın temel sorusu şudur: Kullanıcı sayısı, veri hacmi ve istek hızı arttığında sistem bugünkü kararlarımın yükü altında hâlâ çalışır mı? Bu soru yalnızca performansla ilgili değildir. Bakım kolaylığı, maliyet, güvenlik ve ekipler arası sorumluluk bölünmesi de tasarım kararlarını etkiler.
Sistem tasarımı hem günlük işte hem mülakatta karşınıza çıkar. İşte kararlar belirsiz bilgiyle, kısıtlarla ve geçmiş sistemle verilir. Mülakatta ise sınırlı sürede, açık uçlu bir problem üzerinden düşünme biçiminiz değerlendirilir.
Tasarım görüşmesinin akışı: nereden başlanır?
Hem gerçek projede hem mülakatta işe yarayan bir akış vardır.
- Gereksinimleri netleştirin: İşlevsel gereksinimler (sistem ne yapacak) ve işlevsel olmayan gereksinimler (hız, tutarlılık, erişilebilirlik, güvenlik). Soru sormadan çözüm çizmeye başlamak en sık hatadır.
- Kapsamı daraltın: Her şeyi tasarlayamazsınız. Hangi akışın öncelikli olduğunu belirtin.
- Kaba kapasite tahmini yapın: Günlük kullanıcı, okuma ve yazma oranı, veri büyümesi için büyüklük mertebesi çıkarın. Amaç kesin sayı değil, tasarımı yönlendirecek ölçektir.
- Üst düzey mimariyi çizin: İstemci, giriş katmanı, servisler, veri depoları.
- Veri modelini ve erişim kalıplarını tartışın: Hangi sorgular sık, hangileri nadir?
- Darboğazlara inin: Yük dengeleme, önbellek, bölümleme, kuyruk.
- Arıza senaryolarını ve ödünleşimleri açıkça söyleyin: Bir bileşen çökerse ne olur, tutarlılıktan mı vazgeçtiniz yoksa erişilebilirlikten mi?
Bu sıra mekanik değildir. Görüşmeci ya da ekip farklı bir yöne çekebilir. Önemli olan her kararın gerekçesini söyleyebilmektir.
Temel yapı taşları ve ne zaman kullanılırlar?
Çoğu sistem birkaç tekrar eden bileşenin farklı kombinasyonudur. Bunları ne işe yaradıklarıyla bilmek, ezberden daha değerlidir.
Yük dengeleyici, gelen istekleri birden çok sunucuya dağıtır. Sunucu sayısı artarken tek bir giriş noktası sağlar. Önbellek, sık okunan veriyi daha hızlı bir katmanda tutarak veri tabanı yükünü azaltır; karşılığında veri bayatlığı riskini getirir. Mesaj kuyruğu, işlemleri eşzamansız hale getirerek servisleri birbirinden ayırır. Ani yük artışlarını emer, ama sıralama ve tekrar işleme konularında dikkat ister.
Veri katmanında ise ilişkisel veri tabanları tutarlılığın önemli olduğu işlemler için, belge ya da anahtar-değer depoları ise esnek şema ve yüksek yazma hızı gereken durumlar için öne çıkar. Veriyi bölümleme (sharding) ve kopyalama (replikasyon) ölçeklenmenin ve dayanıklılığın temel araçlarıdır. Bunların her biri bir şey kazandırır, bir şey kaybettirir; tasarım bu ödünleşimi bilinçli yapmaktır.
Örnek senaryo: kısa bağlantı servisi
Örneğin kısa bağlantı üreten bir servis tasarlamanız isteniyor. Önce gereksinimleri sorarsınız: bağlantılar süresiz mi tutulacak, kullanıcı özel takma ad seçebilecek mi, tıklama istatistiği gerekli mi? Cevaba göre kapsam belirlenir.
Kapasite tahmininde okuma ve yazma oranı belirleyicidir. Böyle bir servis genellikle yazmadan çok daha fazla okuma alır; bu bilgi önbellek ve okuma ağırlıklı optimizasyon kararlarını yönlendirir. Mimaride bir uygulama katmanı, bağlantı eşlemesini tutan bir depo ve sık kullanılan bağlantılar için önbellek bulunur.
Tartışılacak ödünleşimler vardır. Kısa kodu rastgele mi, sayaçtan mı üreteceksiniz? Sayaç çakışmayı önler ama tek nokta riski yaratır, rastgele üretim çakışma kontrolü ister. İstatistik toplama istek yolunu yavaşlatmasın diye kuyrukla asenkron yapılabilir. Bu örnekte iyi bir cevap, tek bir doğru mimari sunmak değil, seçenekleri gerekçeleriyle sıralamaktır.
Dayanıklılık ve ölçeklenme: arıza anında sistem ne yapar?
Tasarım yalnızca ideal akışı değil, bozuk akışı da kapsar. Bir bağımlı servis yavaşlarsa istekler birikir mi, zaman aşımı var mı, tekrar deneme yükü daha da artırır mı? Bu sorular servis mimarisinin dayanıklılık bölümünü oluşturur.
Sık kullanılan yaklaşımlar şunlardır: zaman aşımı ve sınırlı tekrar deneme, devre kesici ile arızalı bağımlılığı geçici olarak dışarıda bırakma, yük azaltma ile kritik olmayan işleri düşürme, ve idempotent işlemlerle tekrar eden isteklerde aynı sonucu üretme. Gözlemlenebilirlik de tasarımın parçasıdır: metrik, log ve izleme olmadan arıza nedenini bulamazsınız.
Ölçeklenmede iki yönü ayırın. Dikey ölçekleme daha güçlü makine demektir, basittir ama tavanı vardır. Yatay ölçekleme daha çok makine demektir, dağıtık sistem karmaşıklığı getirir. Çoğu karar, ihtiyacın gerçekten ne kadar büyük olduğuna bağlıdır; erken karmaşıklık da bir maliyettir.
Mülakata hazırlık: nasıl çalışılır, nelerden kaçınılır?
Hazırlık için önce temel kavramları oturtun: ağ ve istek akışı, veri tabanı seçimi, önbellekleme, kuyruklar, tutarlılık modelleri. Ardından tipik problemleri (bağlantı kısaltma, mesajlaşma, haber akışı, dosya depolama gibi) kendi başınıza, sesli çözün. Çizim yapın, gerekçe söyleyin, sonra eleştirel biçimde gözden geçirin.
Mülakatta sık görülen hatalar şunlardır:
- Gereksinim sormadan çizime başlamak.
- Moda araçları sıralamak ama neden seçtiğini söyleyememek.
- Tek bir mimariyi tek doğru gibi savunmak, ödünleşimi görmezden gelmek.
- Detaya erken dalmak: kimlik doğrulama şemasına girip temel akışı bitirememek.
- Arıza ve ölçek sorularında sessiz kalmak.
Mümkünse bir arkadaşla ya da mentorla prova yapın. Kendinizi dışarıdan duymak, düşünme boşluklarını ortaya çıkarır. Görüşmeci çoğu zaman tam çözümü değil, iletişimi, önceliklendirmeyi ve ödünleşim bilincini değerlendirir.
Başlangıçtan ileri düzeye öğrenme yolu
Başlangıç aşamasında tek servisli bir uygulamayı veri tabanı, önbellek ve kuyrukla genişletin. Bu bileşenleri gerçekten çalıştırmak, sadece okumaktan çok daha öğreticidir. Orta aşamada çok servisli mimarilere, veri bölümlemeye ve tutarlılık sorunlarına geçin. İleri aşamada gözlemlenebilirlik, kapasite planlama ve maliyet gibi üretim konularına odaklanın.
Mindset kataloğundaki Sistem Tasarımı (System Design) Mülakat Hazırlığı programı, modül başlıklarına göre tasarım görüşmesi akışını ve kapasite tahminini, veri katmanı ve ölçeklenme kararlarını, servis mimarisi ve dayanıklılığı ve senaryo turlarını kapsıyor. Bu yapı, bu sayfadaki akışla örtüşüyor; kendi çalışma planınızı da bu dört başlıkla kurabilirsiniz.
İlgili Mindset programı
Sistem Tasarımı (System Design) Mülakat Hazırlığı
Sık sorulan sorular
Sistem tasarımı mülakatı kimlere sorulur?
Genellikle deneyimli yazılım mühendislerine ve kıdemli pozisyonlara sorulur, ancak şirkete göre orta seviyede de görülebilir. Başlangıç pozisyonlarında ağırlık genellikle algoritma ve kodlamadadır. Başvurduğunuz şirketin mülakat sürecini ve pozisyon kıdemini önceden araştırmak doğru hazırlık planı için gerekir. Bu yüzden başvuracağınız şirketin ilanını ve mülakat sürecini önceden inceleyip hazırlığı o beklentiye göre şekillendirmek akıllıca olur.
Sistem tasarımı için kod yazmam gerekir mi?
Tasarım mülakatlarında genellikle kod beklenmez, beklenen şey mimari kararları çizip gerekçelendirmektir. Yine de bileşenlerin nasıl çalıştığını bilmek için küçük uygulamalar yazmak faydalıdır. Önbellek, kuyruk ya da veri tabanı kullanmış olmak, soyut kavramları somutlaştırır. Önbellek, kuyruk ya da veri tabanı ile küçük denemeler yapmak, mülakatta anlatacağınız şeylerin gerçekten sizin deneyiminiz olmasını sağlar.
Tek bir doğru mimari var mıdır?
Hayır. Tasarım, gereksinimlere, ölçeğe ve kısıtlara göre ödünleşim seçmektir. Bir durumda doğru olan çözüm başka bir durumda gereksiz karmaşıklık olabilir. İyi cevap, seçeneği, gerekçeyi ve vazgeçilen şeyi birlikte söyler. Mülakatta da gerçek projede de karar verirken karşılaştırılan seçenekleri açıkça konuşmak, olgunluk ve deneyim göstergesi sayılır.
Kapasite tahmini nasıl yapılır, kesin sayı şart mı?
Kesin sayı şart değildir. Amaç, kullanıcı sayısından istek hızına, veri büyümesine kadar büyüklük mertebesini çıkarıp tasarımı yönlendirmektir. Varsayımlarınızı açıkça söyleyin; görüşmeci ya da ekip düzeltebilir. Önemli olan hesabın mantığını göstermektir. Çoğu zaman hesap basit çarpmalara dayanır ve asıl değerlendirilen şey, sonucun tasarım kararını nasıl etkilediğini açıklayabilmenizdir.
Sistem tasarımı ile yazılım mimarisi aynı şey mi?
Çok yakınlar ama özdeş değiller. Sistem tasarımı genellikle belirli bir ürünün bileşenlerini ve ölçek kararlarını kapsar. Yazılım mimarisi daha geniş olabilir; kod organizasyonu, ekip yapısı ve uzun vadeli evrim kararlarını da içerir. Pratikte iki alan sürekli iç içe çalışır. Mülakatlarda iki terim sıkça karıştırılır; görüşmeci hangisini kastettiğini sorun, çünkü beklenen derinlik buna göre değişir.