0% found this document useful (0 votes)
2 views11 pages

Learning Program

Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views11 pages

Learning Program

Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

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.

You might also like