Golang Backend Geliştirme Öğrenme
Programı
Bu doküman, Golang backend geliştirme bilginizi ileriye taşımak için tasarlanmış 12
haftalık detaylı bir öğrenme programını içermektedir. Her bir konuya 2 hafta ayrılmış
olup, teorik öğrenme, pratik çalışma görevleri ve proje önerileri sunulmaktadır.
1. Konu: Testing (2 Hafta)
1.1. Teorik Öğrenme
Go'da Temel Test Kavramları: testing paketi, test fonksiyonları ( TestXxx ),
örnekler ( ExampleXxx ), benchmark testleri ( BenchmarkXxx ), fuzz testleri
( FuzzXxx ).
Unit Testler: Birim testlerin önemi, yazma prensipleri (isolated, fast, repeatable,
self-validating, timely), test edilebilir kod yazma.
Integration Testler: Entegrasyon testlerinin amacı, dış bağımlılıklarla (veritabanı,
API'ler vb.) test yapma stratejileri.
Table Driven Testler: Go'da test senaryolarını düzenlemenin etkili bir yolu.
Test Yardımcıları ve Kütüphaneler: testify (assert, require, mock, suite),
gomock (mocking).
Test Coverage: Kod kapsamı analizi ve önemi.
Test Ortamları: Test veritabanları, test sunucuları, httptest paketi.
1.2. Pratik Çalışma Görevleri
Basit bir Go fonksiyonu için unit testler yazın.
Bir REST API endpoint'i için httptest kullanarak entegrasyon testleri yazın.
testify/assert ve testify/require kullanarak testlerinizi daha okunaklı hale
getirin.
Bir interface'in mock implementasyonunu testify/mock veya gomock ile
oluşturun ve testlerinizde kullanın.
Table Driven Test yaklaşımını kullanarak birden fazla senaryoyu test edin.
Mevcut bir projenizde test coverage raporu oluşturun ve analiz edin.
1.3. Proje Önerileri
Basit Bir CRUD API'sinin Test Edilmesi: Bir kullanıcı yönetimi (CRUD) API'si
geliştirin ve tüm katmanlarını (handler, service, repository) unit ve entegrasyon
testleriyle kapsayın. Veritabanı bağımlılıkları için mock veya testcontainers
kullanın.
Hesap Makinesi Uygulaması: Temel matematiksel işlemleri (toplama, çıkarma,
çarpma, bölme) yapan bir Go paketi yazın ve tüm fonksiyonları için kapsamlı unit
testler oluşturun. Edge case'leri (sıfıra bölme vb.) test etmeyi unutmayın.
URL Kısaltma Servisi: Basit bir URL kısaltma servisi (kullanıcıdan uzun URL alıp
kısa URL döndüren) geliştirin. Bu servisin hem API katmanını hem de veritabanı
etkileşimlerini test edin. Kısa URL oluşturma ve yönlendirme mantığını test edin.
2. Konu: Clean Architecture / Onion Architecture (2
Hafta)
2.1. Teorik Öğrenme
Mimari Prensipler: Katmanlı mimariler, bağımlılık yönü prensibi (Dependency
Rule), bağımsızlık (Framework, UI, Database, External Agency bağımsızlığı).
Clean Architecture: Robert C. Martin (Uncle Bob) tarafından ortaya konulan
Clean Architecture prensipleri, katmanları (Entities, Use Cases, Interface
Adapters, Frameworks and Drivers) ve sorumlulukları.
Onion Architecture (Hexagonal Architecture/Ports and Adapters): Jeffrey
Palermo tarafından ortaya konulan Onion Architecture prensipleri, iç ve dış
katmanlar, portlar ve adaptörler kavramları.
Go'da Clean/Onion Architecture Uygulaması: Go'nun interface ve struct
yapılarını kullanarak bu mimarileri nasıl uygulayacağınız. Paket yapısı ve dizin
düzeni önerileri.
Avantajları ve Dezavantajları: Bu mimarilerin test edilebilirlik, sürdürülebilirlik,
esneklik ve geliştirme hızı üzerindeki etkileri.
2.2. Pratik Çalışma Görevleri
Basit bir Go projesi oluşturun ve Clean Architecture katmanlarına ayırın (domain,
usecase, infrastructure, delivery).
Her katmanın sadece kendisine izin verilen katmanlara bağımlı olduğundan emin
olun (bağımlılık yönü kuralına uygunluk).
Bir use case (örneğin, kullanıcı oluşturma) implementasyonu yapın ve bu use
case'in sadece domain katmanına bağımlı olduğunu gösterin.
Veritabanı (örneğin PostgreSQL) entegrasyonunu infrastructure katmanında
yapın ve use case katmanının bu detaydan habersiz olmasını sağlayın.
Bir HTTP handler (delivery katmanı) yazın ve bu handler'ın use case katmanını
çağırdığını, doğrudan infrastructure katmanıyla etkileşime girmediğini gösterin.
2.3. Proje Önerileri
E-ticaret Sipariş Yönetim Sistemi: Basit bir e-ticaret sipariş yönetim sistemi
(ürün ekleme, sipariş oluşturma, sipariş durumunu güncelleme) geliştirin. Bu
projede Clean Architecture veya Onion Architecture prensiplerini uygulayın. Her
katmanın sorumluluklarını net bir şekilde ayırın ve bağımlılıkları yönetin.
Blog Platformu: Kullanıcıların blog yazıları oluşturabileceği, düzenleyebileceği
ve okuyabileceği bir blog platformu backend'i geliştirin. Domain katmanında
Post , User gibi varlıkları tanımlayın. Use case katmanında CreatePost ,
GetUserPosts gibi iş mantıklarını implemente edin. Infrastructure katmanında
veritabanı (PostgreSQL/MongoDB) ve delivery katmanında HTTP API'yi kullanın.
Not Alma Uygulaması: Kullanıcıların not oluşturabileceği, düzenleyebileceği,
silebileceği ve listeleyebileceği basit bir not alma uygulaması backend'i
oluşturun. Bu projede katmanlı mimariyi uygulayarak her bir katmanın (domain,
application/usecase, infrastructure, presentation/delivery) nasıl çalıştığını
gösterin.
3. Konu: Design Patterns (2 Hafta)
3.1. Teorik Öğrenme
Tasarım Desenlerine Giriş: Tasarım desenleri nedir, neden kullanılır, Gang of
Four (GoF) sınıflandırması (Creational, Structural, Behavioral).
Creational Patterns (Yaratımsal Desenler): Nesne oluşturma mekanizmalarını
soyutlar.
Singleton: Bir sınıfın yalnızca bir örneğinin olmasını sağlar.
Factory Method: Nesne oluşturma sorumluluğunu alt sınıflara devreder.
Abstract Factory: Birbiriyle ilişkili veya bağımlı nesne ailelerini oluşturmak
için bir arayüz sağlar.
Builder: Karmaşık nesnelerin adım adım oluşturulmasını sağlar.
Prototype: Mevcut nesneleri kopyalayarak yeni nesneler oluşturur.
Structural Patterns (Yapısal Desenler): Nesnelerin ve sınıfların daha büyük
yapılar oluşturmak için nasıl bir araya getirileceğini düzenler.
Adapter: Uyumsuz arayüzlere sahip sınıfların birlikte çalışmasını sağlar.
Bridge: Soyutlama ve implementasyonu birbirinden ayırır.
Composite: Nesneleri ağaç yapıları halinde birleştirerek, istemcilerin tek
tek nesnelerle ve nesne kompozisyonlarıyla aynı şekilde etkileşim
kurmasını sağlar.
Decorator: Nesnelere dinamik olarak yeni sorumluluklar ekler.
Facade: Bir alt sistemdeki karmaşık arayüzleri basitleştirir.
Proxy: Başka bir nesneye erişimi kontrol eden bir vekil sağlar.
Behavioral Patterns (Davranışsal Desenler): Nesneler arasındaki iletişimi ve
sorumluluk dağılımını düzenler.
Observer: Bir nesnedeki değişiklikleri birden çok bağımlı nesneye otomatik
olarak bildirir.
Strategy: Bir algoritma ailesini tanımlar ve her birini ayrı bir sınıf içine
kapsüller.
Command: Bir isteği, isteği gerçekleştirmek için gerekli tüm bilgilerle
birlikte bir nesne olarak kapsüller.
Iterator: Bir koleksiyonun elemanlarına sırayla erişmek için bir yol sağlar.
Chain of Responsibility: Bir isteği, birden çok işleyici nesne arasında
geçirme mekanizması sağlar.
Go İdiomatik Desenler: Go diline özgü veya Go topluluğunda yaygın olarak
kullanılan desenler (örneğin, Functional Options Pattern, Context Pattern, Fan-
in/Fan-out).
3.2. Pratik Çalışma Görevleri
Seçtiğiniz bir Creational Pattern (örneğin Factory Method veya Builder)
kullanarak Go'da bir nesne oluşturma mekanizması implemente edin.
Bir Structural Pattern (örneğin Adapter veya Decorator) kullanarak mevcut bir Go
kodunu yeniden düzenleyin.
Bir Behavioral Pattern (örneğin Observer veya Strategy) kullanarak Go'da bir iş
akışı implemente edin.
Go'nun context paketi ile Context Pattern 'i kullanarak bir HTTP isteğinde
zaman aşımı veya iptal mekanizması ekleyin.
Functional Options Pattern 'i kullanarak bir Go kütüphanesi veya
yapılandırma fonksiyonu yazın.
3.3. Proje Önerileri
Bildirim Sistemi: Farklı kanallardan (e-posta, SMS, push bildirimi) bildirim
gönderebilen bir sistem geliştirin. Bu sistemde Strategy Pattern'i kullanarak farklı
bildirim gönderme yöntemlerini yönetin. Ayrıca, Observer Pattern'i kullanarak
belirli olaylara abone olan farklı bildirim alıcılarını implemente edin.
Rapor Oluşturucu: Farklı formatlarda (PDF, CSV, JSON) raporlar oluşturabilen bir
uygulama geliştirin. Bu projede Factory Method veya Abstract Factory Pattern'i
kullanarak farklı rapor formatlarını üreten nesneleri soyutlayın. Ayrıca, Builder
Pattern'i kullanarak karmaşık rapor nesnelerini adım adım oluşturun.
Oyun Karakteri Yaratıcısı: Farklı özelliklere (sınıf, ırk, yetenekler) sahip oyun
karakterleri yaratabilen bir Go uygulaması yazın. Bu projede Builder Pattern'i
kullanarak karakter nesnelerini oluşturun. Ayrıca, Decorator Pattern'i kullanarak
karakterlere dinamik olarak yeni yetenekler ekleyin.
4. Konu: Domain Driven Design (DDD) (2 Hafta)
4.1. Teorik Öğrenme
DDD Temelleri: DDD nedir, neden önemlidir, karmaşık iş alanlarını yönetmek için
nasıl kullanılır.
Ubiquitous Language (Ortak Dil): İş uzmanları ve geliştiriciler arasında ortak bir
dil oluşturmanın önemi.
Domain Katmanı: İş mantığının kalbi, bağımsız ve saf iş kuralları.
Stratejik Tasarım (Strategic Design): Büyük ölçekli sistemlerde domainleri
yönetme.
Bounded Context (Sınırlı Bağlam): Bir domainin belirli bir bölümü için
tutarlı bir model ve ortak dilin geçerli olduğu sınır.
Context Map (Bağlam Haritası): Farklı Bounded Context'ler arasındaki
ilişkileri görselleştirme.
Shared Kernel, Customer/Supplier, Conformist, Anti-Corruption Layer
(ACL), Separate Ways: Bounded Context'ler arası entegrasyon stratejileri.
Taktiksel Tasarım (Tactical Design): Bounded Context içindeki domain modelini
detaylandırma.
Entity (Varlık): Kimliği olan ve yaşam döngüsü boyunca değişebilen
nesneler.
Value Object (Değer Nesnesi): Kimliği olmayan, değerine göre eşitliği
belirlenen nesneler.
Aggregate (Küme): Bir veya daha fazla Entity ve Value Object'i tutarlı bir
birim olarak gruplayan ve dışarıdan erişimi kontrol eden yapı.
Domain Service (Domain Servisi): Birden fazla Aggregate veya Entity
üzerinde işlem yapan iş mantığı.
Repository (Depo): Aggregate'lerin kalıcılığını yöneten arayüz.
Domain Event (Domain Olayı): Domainde gerçekleşen ve diğer domain
bileşenlerini veya sistemleri ilgilendiren önemli olaylar.
Go'da DDD Uygulaması: Go'nun basitliği ve interface odaklı yapısıyla DDD
prensiplerini nasıl uygulayacağınız. Paket ve dizin yapısı önerileri.
4.2. Pratik Çalışma Görevleri
Basit bir iş senaryosu (örneğin, bir bankacılık işlemi) için Ubiquitous Language
tanımlayın.
Bu senaryo için Bounded Context'leri ve aralarındaki ilişkileri belirleyin, basit bir
Context Map çizin.
Belirlediğiniz bir Bounded Context içinde Entity, Value Object ve Aggregate'leri
Go struct'ları ve interface'leri kullanarak modelleyin.
Bir Aggregate için Repository interface'i tanımlayın ve basit bir in-memory
implementasyonunu yapın.
Bir Domain Service implemente edin ve bu servisin Aggregate'ler üzerinde nasıl
işlem yaptığını gösterin.
Basit bir Domain Event tanımlayın ve bu olayın nasıl yayımlanıp tüketilebileceğini
gösterin.
4.3. Proje Önerileri
Kargo Takip Sistemi: Bir kargo takip sistemi için DDD prensiplerini uygulayın.
Shipment , Location , Customer gibi domain varlıklarını tanımlayın. Tracking
ve Delivery gibi Bounded Context'leri ayırın. Her bir Bounded Context içinde
Aggregate'leri, Repository'leri ve Domain Service'leri modelleyin. Kargo durumu
güncellemeleri için Domain Event'leri kullanın.
Online Kurs Platformu: Kullanıcıların kurslara kaydolabileceği, dersleri
tamamlayabileceği ve sertifika alabileceği bir online kurs platformu backend'i
geliştirin. Course , Student , Enrollment gibi domain varlıklarını belirleyin.
Course Management ve Student Progress gibi Bounded Context'leri ayırın. Her
bir Bounded Context içinde DDD taktiksel tasarım kalıplarını uygulayın.
Rezervasyon Sistemi: Bir otel veya restoran rezervasyon sistemi için DDD
yaklaşımını kullanın. Reservation , Room/Table , Guest gibi varlıkları
modelleyin. Booking ve Availability gibi Bounded Context'leri ayırın.
Rezervasyon oluşturma, iptal etme ve güncelleme gibi iş akışlarını Domain
Service'ler aracılığıyla yönetin.
5. Konu: N-Layer Architecture (2 Hafta)
5.1. Teorik Öğrenme
N-Layer Architecture Temelleri: Katmanlı mimarinin tanımı, amacı ve
avantajları (separation of concerns, maintainability, scalability, testability).
Tipik Katmanlar:
Presentation Layer (Sunum Katmanı): Kullanıcı arayüzü veya API
endpointleri (HTTP handler, gRPC server).
Application Layer (Uygulama Katmanı): İş akışlarını ve use case'leri
yönetir, domain katmanını koordine eder.
Domain Layer (İş Mantığı Katmanı): İş kurallarını, varlıkları, değer
nesnelerini ve domain servislerini içerir. (DDD ile benzerlikler ve farklılıklar).
Infrastructure Layer (Altyapı Katmanı): Veritabanı erişimi, harici servis
entegrasyonları, loglama, güvenlik gibi teknik detayları içerir.
Katmanlar Arası İletişim: Bağımlılık yönü (üst katmanlar alt katmanlara
bağımlıdır, alt katmanlar üst katmanlardan habersizdir), DTO (Data Transfer
Object) kullanımı.
N-Tier vs N-Layer: Fiziksel dağıtım (tier) ve mantıksal ayrım (layer) arasındaki
farklar.
Go'da N-Layer Uygulaması: Go'nun paket yapısı ve interface'leri kullanarak
katmanları nasıl organize edeceğiniz. Klasör yapısı önerileri.
Avantajları ve Dezavantajları: Bu mimarinin ne zaman tercih edilmesi gerektiği
ve olası zorlukları.
5.2. Pratik Çalışma Görevleri
Basit bir Go projesi oluşturun ve 3 katmanlı (Presentation, Application/Service,
Infrastructure/Repository) bir yapı kurun.
Her katman için ayrı Go paketleri oluşturun.
Presentation katmanında bir HTTP handler yazın.
Application/Service katmanında iş mantığını içeren bir servis implemente edin.
Infrastructure/Repository katmanında bir veritabanı (örneğin SQLite) etkileşimi
için repository implemente edin.
Katmanlar arası iletişimi DTO'lar ve interface'ler aracılığıyla sağlayın.
Her katmanın sadece kendisine izin verilen katmanlara bağımlı olduğundan emin
olun.
5.3. Proje Önerileri
Basit Bir Görev Yönetim Sistemi: Kullanıcıların görev ekleyebileceği,
listeleyebileceği, güncelleyebileceği ve silebileceği bir görev yönetim sistemi
backend'i geliştirin. Bu projede N-Layer mimarisini uygulayın. Presentation
katmanında HTTP API, Application katmanında iş mantığı, Infrastructure
katmanında veritabanı (PostgreSQL) etkileşimi olsun.
Ürün Katalog Servisi: Bir e-ticaret sitesi için ürün katalog servisi (ürünleri
listeleme, detaylarını görüntüleme, kategoriye göre filtreleme) geliştirin. Bu
projede N-Layer mimarisini kullanarak ürün verilerini yönetin. Veritabanı olarak
MongoDB kullanabilirsiniz.
Hava Durumu Servisi: Harici bir hava durumu API'sinden veri çekip, bu veriyi
işleyip kullanıcılara sunan bir servis geliştirin. Presentation katmanında HTTP
API, Application katmanında veri işleme ve Infrastructure katmanında harici API
ile iletişim olsun.
6. Konu: Asynchronous Communication (2 Hafta)
6.1. Teorik Öğrenme
Senkron ve Asenkron İletişim: Farkları, avantajları ve dezavantajları.
Asenkron İletişim Desenleri:
Message Queues (Mesaj Kuyrukları): Mesaj kuyrukları nedir, nasıl çalışır,
kullanım senaryoları (işlem ayrıştırma, yük dengeleme, hata toleransı).
Publish/Subscribe (Pub/Sub): Yayıncı/Abone modeli nedir, nasıl çalışır,
kullanım senaryoları (olay tabanlı mimariler, gerçek zamanlı veri akışları).
Event-Driven Architecture (Olay Tabanlı Mimari): Olayların rolü, olay
kaynakları, olay tüketicileri.
Go ve Asenkron İletişim:
Goroutines ve Channels: Go'nun yerleşik eşzamanlılık mekanizmalarıyla
asenkron işlemler nasıl yapılır.
Context: Uzun süreli asenkron işlemlerin yönetimi, iptali ve zaman aşımı.
Popüler Mesaj Brokerları ve Go Entegrasyonları:
RabbitMQ: Temel kavramlar (Exchange, Queue, Binding), Go client
kütüphaneleri ( streadway/amqp ).
Apache Kafka: Temel kavramlar (Topic, Partition, Consumer Group), Go
client kütüphaneleri ( segmentio/kafka-go , confluentinc/confluent-
kafka-go ).
Redis Pub/Sub: Redis'in Pub/Sub yetenekleri ve Go ile kullanımı.
NATS: Hafif ve yüksek performanslı mesajlaşma sistemi.
Hata Yönetimi ve Yeniden Deneme Mekanizmaları: Asenkron sistemlerde hata
yönetimi ve mesajların güvenilir bir şekilde işlenmesi.
6.2. Pratik Çalışma Görevleri
Basit bir Goroutine ve Channel kullanarak asenkron bir işlem (örneğin, uzun
süren bir hesaplama) implemente edin.
[Link] kullanarak bir Goroutine'in iptal edilmesini veya zaman
aşımına uğramasını sağlayın.
RabbitMQ veya Kafka kullanarak basit bir mesaj üretici (producer) ve tüketici
(consumer) uygulaması yazın. Mesajları gönderip almayı test edin.
Redis Pub/Sub kullanarak basit bir yayıncı ve abone uygulaması geliştirin.
Bir HTTP isteği geldiğinde, asenkron bir şekilde bir mesaj kuyruğuna mesaj
gönderen bir servis implemente edin ve bu mesajın başka bir servis tarafından
işlendiğini gösterin.
6.3. Proje Önerileri
Gerçek Zamanlı Sohbet Uygulaması: WebSocket kullanarak basit bir gerçek
zamanlı sohbet uygulaması backend'i geliştirin. Mesajların dağıtımı için Redis
Pub/Sub veya NATS kullanın.
Resim İşleme Kuyruğu: Kullanıcıların resim yükleyebileceği ve bu resimlerin
asenkron olarak işlenip (boyutlandırma, filtre uygulama vb.) depolandığı bir
servis geliştirin. Resim işleme görevlerini bir mesaj kuyruğuna (RabbitMQ veya
Kafka) gönderin ve ayrı bir worker servisi bu görevleri tüketsin.
Log Toplama ve Analiz Sistemi: Farklı servislerden logları toplayan ve bunları
merkezi bir mesaj brokerına (Kafka) gönderen bir sistem geliştirin. Ayrı bir servis
bu logları tüketip analiz etsin ve bir veritabanına kaydetsin.