Yazılım geliştirme becerilerini şekillendir.
Türkçe ve İngilizce pratik öğrenme içerikleri.
Java
Java Basics
String
Java Basics kategorisinin ilk topic'i: `String`'in IMMUTABLE tasarımı, string pool ve `==` vs `equals()` tuzağı, `+` ile birleştirmenin O(n^2) maliyeti vs `StringBuilder`'ın amortized O(1)'i (gerçek, ısıtılmış bir ölçümle), `String.format()`/text block'lar (Java 15+), ve split/join/replace/trim/strip gibi yardımcı metotlar.
Arrays
Java Basics kategorisinin ikinci topic'i: dizilerin sabit boyutlu, bitişik bellek yapısı, çok boyutlu diziler (jagged array dahil), `Arrays` yardımcı sınıfı (sort/binarySearch/equals/fill/copyOf), array covariance ve `ArrayStoreException` tuzağı, `Arrays.asList()`'in görünüm (view) olması, ve varargs.
Scanner
Java Basics kategorisinin üçüncü topic'i: `Scanner`'ın token tabanlı okuma modeli, klasik `nextInt()` + `nextLine()` tuzağı, `useDelimiter()` ile özel ayırıcılar, `File` üzerinden okuma, `Scanner` ile `BufferedReader` arasındaki gerçek bir performans farkı, ve `InputMismatchException`/`NoSuchElementException` istisna yönetimi.
Wrapper Classes & Autoboxing
Java Basics kategorisinin dördüncü topic'i: ilkel tiplerin nesne karşılıkları (Integer/Double/Boolean vb.), autoboxing/autounboxing, Integer önbellekleme (-128..127) ve `==` tuzağı, null bir wrapper'ı unboxing yapmanın gerçek bir NullPointerException fırlatması, autoboxing'in sıkı döngülerdeki performans maliyeti, ve wrapper sınıflarının generic koleksiyonları mümkün kılması.
File Reading
Java Basics kategorisinin beşinci topic'i (File I/O'nun okuma yarısı): `Path`/`Files` temelleri, `Files.readAllLines()`/`Files.readString()`, `BufferedReader` ile satır satır okuma, `Files.lines()`'in lazy ve Closeable olması, dosyada kelime arama, ve `NoSuchFileException` ile `FileNotFoundException` arasındaki gerçek fark.
File Writing
Java Basics kategorisinin altıncı topic'i (File I/O'nun yazma yarısı): `Files.writeString()`/`Files.write()`, `StandardOpenOption.APPEND` ile sona ekleme, `BufferedWriter` ile yazma, `Files.copy()` ile dosya kopyalama, `Files.createDirectories()`, bir dizin ağacını silmenin standart deseni, ve CSV dosyası yazma.
Reflection
Java'da çalışma zamanında sınıf, alan, metot ve constructor bilgisine erişme ve bunları dinamik olarak kullanma.
Date & Time API
Java'da java.time paketi; LocalDate/LocalTime/LocalDateTime, Instant, ZonedDateTime/OffsetDateTime, Duration/Period/ChronoUnit, formatlama/parse, saat dilimleri ve legacy Date/Calendar'dan geçiş.
Exceptions
Exception'lara Giriş
Bir exception'ın gerçekte ne olduğu -- neden var olduğu (dönüş-değeri-tabanlı hata sinyallemesinin sorunları), Java'nın checked exception tasarım kararının kısa tarihçesi, bir exception nesnesinin taşıdığı mesaj/cause/stack trace, yakalanmamış bir exception'ın programı nasıl sonlandırdığı, stack trace okumak ve propagation, ve yaygın runtime exception tetikleyicileri (NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException). Bu serinin 7 dersinin ilki, henüz try/catch mekaniği yok.
Try-Catch ve Finally
Bir exception'ı gerçekten handle etmenin mekanizması: temel try-catch bloğu, birden fazla catch bloğu (sırayla eşleşme, süper sınıf/alt sınıf sıralama kısıtı), | ile multi-catch (Java 7+), finally'nin koşulsuz olarak her zaman çalışması, ve finally içinde return/throw'un try/catch'in ürettiği her şeyi sessizce ezmesi. Exception Handling serisinin 2.'si.
Exception Hiyerarşisi
Throwable, Error, Exception ve RuntimeException arasındaki miras ilişkisi -- her exception'ın tek bir ortak kökten geldiği, catch bloklarının bir türün herhangi bir atasını da hedefleyebildiği (polimorfik yakalama), ve instanceof ile bu hiyerarşinin çalışma zamanında nasıl sorgulanacağı. Exception Handling serisinin 3.'sü.
Checked ve Unchecked Exception'lar
Checked exception'ın derleyici tarafından zorlanan throws/catch sözleşmesi ile unchecked exception'ın (RuntimeException ailesi) bu zorunluluğu hiç taşımaması arasındaki fark -- ikisi arasında ne zaman hangisinin seçileceği, checked bir exception'ı cause parametresiyle unchecked'e sarmalamak, ve override edilen bir metotta throws bildiriminin yalnızca DARALTILABİLECEĞİ kısıtı. Exception Handling serisinin 4.'sü.
Throw ve Throws
throw ifadesinin çalışma zamanında bir Throwable nesnesini JVM'e teslim etmesi ile throws bildiriminin yalnızca derleme-zamanı bir sözleşme olması arasındaki fark -- fail-fast doğrulama, yakalanan bir exception'ı cause parametresiyle farklı bir türle yeniden fırlatmak, ve checked exception'ın çağrı zinciri boyunca yakalanmadan yayılması. Exception Handling serisinin 5.'si.
Özel (Custom) Exception Oluşturmak ve Fırlatmak
Kendi exception türünü Exception (checked) ya da RuntimeException (unchecked) genişleterek tanımlamak -- ekstra bağlam (context) taşıyan alanlar eklemek, Throwable'ın dört standart constructor'ını yansıtmak, ve ortak bir custom base sınıfıyla kendi küçük exception hiyerarşini kurmak. Exception Handling serisinin 6.'sı.
Exception Handling Best Practices
Önceki altı dersin mekaniğinin üzerine kurulan pratikler -- exception'ları kontrol akışı için kullanma ve yutma anti-pattern'leri, catch bloklarını spesifikten genele doğru doğru sırada yakalamak, ve yalnızca gerçekten anlamlı bir tepki verilebilecek yerde yakalamak. Exception Handling serisinin 7. ve son dersi, tüm seriyi özetleyen bir kapanış bölümüyle.
Generics
Generics'e Giriş
Generics'in neden var olduğu (pre-generics raw type/cast/ClassCastException sorunu), tür güvenliğinin derleme zamanında nasıl sağlandığı, generic sınıflar ve interface'ler, ve tür parametresi adlandırma kuralı. Generics serisinin 1.'si.
Generic Metotlar
Sınıfının generic olup olmamasından bağımsız olarak kendi tür parametresini bildiren generic metotlar -- metot tür parametreleri, birden fazla tür parametresi, tür çıkarımı (type inference) ve açık tür tanığı (type witness). Generics serisinin 2.'si.
Sınırlı Tür Parametreleri
Üst sınırlar (`<T extends ...>`), `&` ile birleştirilen birden fazla sınır, sınıflarla ve interface'lerle sınırlama, ve bir tür parametresini sınırlamanın tür parametresine hangi metotların çağrılabileceğini nasıl genişlettiği. Generics serisinin 3.'sü.
Wildcard'lar
Sınırsız wildcard (`<?>`), üst sınırlı wildcard (`<? extends T>`), alt sınırlı wildcard (`<? super T>`), üçü arasındaki fark, ve PECS (Producer Extends, Consumer Super) kuralı -- Java generics'in en yaygın yanlış anlaşılan bölümü, gerçek örneklerle adım adım. Generics serisinin 4.'sü.
Koleksiyonlarla Generics
List<T>, Set<T> ve Map<K,V> gibi generic koleksiyonlar, koleksiyonlarla tür güvenliği, List<Object>'in neden List<String> OLMADIĞI (generics değişmezliği, tam işleniş), ve diamond operatörü/var ile tür çıkarımı. Generics serisinin 5.'si.
Type Erasure ve Generics'in Kısıtları
Type erasure'ın (tür silme) ne olduğu, generic türlere çalışma zamanında ne olduğu, `new T()` ve generic array'lerin neden izin verilmediği, statik üyeler ve generics, ve generics'in çalışma zamanı kısıtlarının pratikte (raw type/unchecked uyarı/heap pollution) nasıl karşımıza çıktığı. Generics serisinin 6. ve son dersi.
Control Flow
if / else
Yeni Control Flow kategorisinin ilk topic'i: `if`/`else`'in temel kullanımı, `else if` zinciri, iç içe koşullar, altı karşılaştırma operatörü (`==`/`!=`/`<`/`>`/`<=`/`>=`) ve ondalıklı sayı/`String` karşılaştırma tuzakları, `&&`/`||`/`!` mantıksal operatörleri ve kısa devre değerlendirme, ve üçlü (ternary) operatör.
switch
Control Flow kategorisinin ikinci topic'i: klasik `case`/`break` sözdizimi ve fall-through tuzağı, modern ok (`->`) sözdizimi, switch İFADESİ ve `yield`, birden fazla etiket ve enum kapsayıcılık (exhaustiveness) kontrolü, ve `String`/enum üzerinde `switch` kullanımı.
for Loop
Control Flow kategorisinin üçüncü topic'i: klasik üç bölümlü (init;condition;update) `for` sözdizimi, `break` ile erken çıkış, `continue` ile bir adımı atlama, kasıtlı/kasıtsız sonsuz döngüler, virgüllü init/update ile birden fazla değişken, ve klasik index tabanlı dizi gezinme.
Enhanced for Loop
Control Flow kategorisinin dördüncü topic'i: dizi/koleksiyon üzerinde for-each sözdizimi, üç gerçek sınırı (indekse erişilememesi, döngü değişkeninin bir kopya olması ve yapısal değişikliğin ConcurrentModificationException fırlatması, birden fazla koleksiyonu paralel gezememe), ve klasik `for` ile ne zaman hangisinin kullanılacağı.
while & do-while Loops
Control Flow kategorisinin beşinci topic'i: temel `while` sözdizimi, gövdeyi en az bir kez çalıştıran `do-while`, while vs do-while karşılaştırması, break/continue, Scanner ile girdi doğrulama döngüsü, ve uygulamalı örnek olarak Sayı Tahmin Oyunu (Number Guessing Game).
Nested Loops
Control Flow kategorisinin altıncı ve son topic'i: temel iç içe `for` döngüsü, 2 boyutlu dizi gezinme, etiketsiz break/continue'nun yalnızca en içteki döngüyü etkilemesi, etiketli (labeled) break/continue, ve O(n²) performans farkındalığı.
Collections
Lists
Collections kategorisinin ilk topic'i: `List` arayüzü, `ArrayList` ile `LinkedList`'in gerçek bir ısıtılmış ölçümle karşılaştırılan performans farkı, `List.of()`/`Collections.unmodifiableList()`/`List.copyOf()` ile immutable listeler, `Iterator`/`ListIterator` ile güvenli dolaşma, `List.sort(Comparator)` ile sıralama, ve `subList()`/`toArray()`.
Sets
Collections kategorisinin ikinci topic'i: `Set` arayüzü ve tekrar eden elemanlara izin vermemesi, `HashSet`/`LinkedHashSet`/`TreeSet` farkları, `NavigableSet` metotları, `equals()`/`hashCode()` sözleşmesinin `HashSet` için neden kritik olduğu (gerçek bir hata örneğiyle), küme işlemleri (birleşim/kesişim/fark), ve List/HashSet/TreeSet arasındaki gerçek bir performans ölçümü.
Maps
Collections kategorisinin üçüncü topic'i: `Map<K,V>` arayüzü (her anahtar bir kez, değerlere eşlenir), `HashMap`/`LinkedHashMap`/`TreeMap` farkları, `NavigableMap` metotları, immutable map'ler (`Map.of()`/`Map.copyOf()`), Java 8'in modern API'si (`getOrDefault()`/`computeIfAbsent()`/`merge()`), ve `entrySet()` ile `keySet()+get()` arasındaki gerçek bir performans ölçümü.
Queues & Collections Utility
Collections kategorisinin son topic'i: `Queue`/`Deque` arayüzleri (offer()/poll()/peek() vs add()/remove()/element()), `ArrayDeque`'ın hem kuyruk hem stack olarak `LinkedList`/`java.util.Stack`'a tercih edilmesi, `PriorityQueue`'nun heap tabanlı ve toString()'inin sıralı OLMADIĞI gerçek bir keşif, ve `Collections` yardımcı sınıfının sort/shuffle/max/binarySearch gibi statik metotları.
Object-Oriented Programming
Interface
Java'da davranış sözleşmeleri tanımlama; default/static/private metotlar ve sealed interface'ler.
Abstract Class
Java'da ortak durum ve davranışı paylaşan soyut sınıflar; constructor, Template Method Pattern ve abstract class vs interface karşılaştırması.
Inheritance
Java'da kalıtım (inheritance); extends, constructor zinciri, method overriding, field hiding, upcasting/downcasting ve composition vs inheritance karşılaştırması.
Polymorphism
Java'da çok biçimlilik (polymorphism); method overloading, overload çözümleme kuralları, covariant return type, polymorphism vs inheritance ve composition ile Strategy Pattern.
Concurrency
Threads
Java'da thread'ler; oluşturma (Thread/Runnable), lifecycle, thread metotları, race condition, synchronized, volatile, wait/notify, Atomic sınıflar, ReentrantLock ve deadlock.
Functional Interfaces & Streams
Lambda Expressions
Lambda expression syntax'ının tamamı: parametre yazım kuralları, expression body vs block body, derleyicinin lambda'ya bağlamdan tip vermesi (target typing), effectively final değişken yakalama, ve lambda'nın anonymous inner class'tan farkı.
Built-in Functional Interfaces
java.util.function paketindeki hazır interface'ler: Predicate<T>, Function<T,R>, Consumer<T>, Supplier<T>, UnaryOperator<T>, BinaryOperator<T>. Dört method reference biçimi: Class::staticMethod, object::instanceMethod, Class::instanceMethod, Class::new.
Stream API Temelleri
Stream API'nin temelleri: Stream nedir, Collection'dan Stream'e geçiş, pipeline'ın üç aşaması (source/intermediate/terminal). Intermediate operation'lar: filter(), map(), flatMap(), distinct(), sorted(), peek(), limit(), skip(). Lazy evaluation ve stream'in tek kullanımlık doğası.
Terminal Operations
Stream pipeline'ını tetikleyip sonuç üreten terminal operation'lar: forEach(), reduce(), count(), min()/max(), findFirst()/findAny(), anyMatch()/allMatch()/noneMatch(), toList()/toArray(). Kısa devre (short-circuiting) davranışı ve count()'un source boyutundan doğrudan hesaplanabilme optimizasyonu.
Collectors
Collectors sınıfının sunduğu hazır collect() tarifleri: toList()/toSet(), joining(), groupingBy() (+ downstream collector olarak counting()/mapping()), partitioningBy(), toMap(). Bir Collector'ın üç bileşeni: supplier, accumulator, combiner.
Optional
Optional<T>: bir değerin bulunmama ihtimalini tip sisteminde ifade etmek. of()/ofNullable()/empty() ile oluşturma, orElse() vs orElseGet() (eager vs lazy), orElseThrow(), map()/flatMap(), ifPresent()/ifPresentOrElse(), filter().
Primitive & Parallel Streams
IntStream/LongStream/DoubleStream ile autoboxing maliyetinden kaçınmak, boxed()/mapToInt() köprüleri. parallelStream() ile paralel çalışma, forEach() vs forEachOrdered() sıralama farkı, thread-safe olmayan paylaşılan durum tuzağı, ne zaman kullanılmalı ve neden her zaman daha hızlı olmadığı.
Spring Boot
Spring Core
Dependency Injection ve IoC
Spring'e değinmeden, saf Java ile Inversion of Control, Dependency Injection ve constructor/setter/field injection.
Spring IoC Container ve Bean Yaşam Döngüsü
BeanFactory/ApplicationContext, bean lifecycle, @PostConstruct/@PreDestroy, bean scope'ları, @Lazy ve circular dependency çözümü.
Component Scanning ve Configuration
@Component/@Service/@Repository/@Controller stereotype'ları, @ComponentScan, @Autowired (field/setter/constructor), @Qualifier ve @Primary.
Spring Boot Auto-Configuration ve Properties
@SpringBootApplication, @Conditional ailesi (@ConditionalOnClass/@ConditionalOnMissingBean/@ConditionalOnProperty), @Value, @ConfigurationProperties, @Profile ve ApplicationEvent/@EventListener.
Transaction Management
@Transactional'ın proxy tabanlı mekanizması, rollback kuralları, propagation (REQUIRED/REQUIRES_NEW), self-invocation tuzağı, isolation levels, readOnly, TransactionTemplate ve @TransactionalEventListener.
Spring MVC
Spring MVC Temelleri
DispatcherServlet, MVC deseni (Model/View/Controller) ve @Controller ile @RestController arasındaki fark.
Mapping Annotation'ları ve HTTP Metotları
@RequestMapping ve beş kısayolu (@GetMapping/@PostMapping/@PutMapping/@PatchMapping/@DeleteMapping), consumes/produces ve HTTP metotlarının safe/idempotent semantiği.
Path Variable'lar ve Request Parametreleri
@PathVariable, @RequestParam ve @RequestHeader ile bir HTTP isteğinin URL'sinden ve header'larından veri okumak; path variable ile query parametresi arasındaki fark.
Request ve Response Handling
@RequestBody ile istek gövdesini nesneye çevirmek, ResponseEntity ile yanıtı tam kontrol etmek, HTTP durum kodları ve content negotiation.
Validation & Exception Handling
Bean Validation (@NotBlank, @Size, @Email, @Pattern) ile @Valid, iç içe nesnelerde cascading, @ExceptionHandler, @RestControllerAdvice ve RFC 7807 ProblemDetail ile standart hata yönetimi.
Spring MVC Views ve Thymeleaf
Model, ModelMap ve ModelAndView ile view'a veri taşımanın üç yolu; Thymeleaf'in "natural templating" felsefesi; Thymeleaf değişken/link/mesaj ifadeleri (@{...}, #{...} ve dolar-süslü-parantez erişimi); th:if, th:each, th:fragment; SpringEL seçim ifadeleri (.?[...] / #vars); ve projenin kendi layout'una referansla MVC vs REST karşılaştırması.
Advanced Spring MVC
HandlerInterceptor (preHandle/postHandle/afterCompletion) ve Filter vs Interceptor ayrımı; WebMvcConfigurer ile interceptor kaydı ve global CORS yapılandırması; same-origin policy, preflight request ve @CrossOrigin; MultipartFile ile dosya yükleme ve boyut sınırları.
REST API Tasarımı
Entity'yi doğrudan dışarı vermenin riskleri ve DTO deseni; Pageable/Page/Sort ile sayfalama, sıralama ve query parametreleriyle filtreleme; URI versioning vs header versioning; idempotency ve Idempotency-Key header'ı ile POST'u idempotent yapmak; HATEOAS (kısa bakış).
Spring MVC'de Test Yazmak
MockMvc ve @WebMvcTest ile web katmanı testleri; @MockitoBean ile bağımlılıkları sahteleme; model(), view() ve jsonPath() ile doğrulama; request body, path variable/query param, validation hataları ve multipart dosya yükleme testleri; bu projenin gerçek HomeController'ı ve TopicController'ı için gerçek testler.
Microservices
Microservices Temelleri
Monolitik mimarinin sınırları, mikroservis mimarisinin temel özellikleri, servis sınırlarını (bounded context) belirlemek, database per service, CAP teoremi ve Conway Yasası'na kısa bir bakış -- hiç kod yazmadan, kavramsal bir giriş.
Mikroservis Yapılandırma
Tek bir Spring Boot mikroservisini (order-service) baştan sona yapılandırmak: kendi giriş noktası, kendi application.yml'i (port, uygulama adı, veritabanı), REST controller ile API sözleşmesi, service katmanı, domain modeli ve health check.
Servisler Arası İletişim
order-service'in yanına ikinci bir mikroservis (inventory-service) eklemek ve ikisini Spring'in RestClient'ıyla senkron bir REST çağrısıyla konuşturmak: stok kontrolü, hata yönetimi (servis ayakta değilse ne olur), ve servisler arası DTO ayrımı. Kategorinin gerçek, çalıştırılabilir Pratik Proje'sine buradan ulaşılıyor.
Servis Keşfi ve Eureka
order-service'in inventory-service'i artık sabit kodlanmış bir URL yerine bir İSİMLE bulması: Eureka Server (merkezi kayıt defteri), Eureka Client (spring.application.name'in keşif anahtarına dönüşmesi), DiscoveryClient ile doğrudan sorgu, @LoadBalanced RestClient ile isimle çağrı yapma, heartbeat/eviction/self-preservation modu, ve Eureka'nın CAP teoreminin AP tarafını seçmesi.
API Gateway
order-service ve inventory-service'in artık dış istemciler için tek bir giriş noktası üzerinden erişilebilir olması: Spring Cloud Gateway ile ayrı bir api-gateway uygulaması kurmak, rota (route) predicate/URI/filtre üçlüsü, lb:// ile Eureka üzerinden keşif tabanlı yönlendirme, özel bir GlobalFilter yazmak (kursun ilk reaktif kodu), ve correlation id gibi sistem geneli konuların neden gateway'de kalıp iş mantığının serviste kalması gerektiği.
Resilience4j
order-service'in inventory-service çağrılarını manuel try/catch hata yönetiminin ötesine taşıması: Resilience4j ile @CircuitBreaker (CLOSED/OPEN/HALF_OPEN durum makinesi) ve @Retry annotation'larını ResilientStockClient'a uygulamak, fallback metotlarının devre açıldığında ne yaptığı, Spring proxy mekanizmasının self-invocation'da neden çalışmadığı, ve rate limiter/bulkhead'in circuit breaker'dan farklı bir riske karşı koruması.
Configuration Management
Her servisin şimdiye kadar kendi application.yml'inde tuttuğu yapılandırmayı Spring Cloud Config ile merkezileştirmek: @EnableConfigServer ile ayrı bir config-server uygulaması kurmak, bir Config Repository'nin neyi merkezileştirmeye değdiğine karar vermesi, spring.config.import ile Config Client olmak, profillerle ortam bazlı override, @RefreshScope ile yeniden başlatmadan yapılandırma yenileme, ve sırların neden düz metin olarak saklanmaması gerektiği.
Event-Driven Architecture ve Kafka
Bu kategorideki her servisler arası çağrının şimdiye kadar senkron olmasının yarattığı zaman ve doğrudan-bilgi bağlantısını Kafka ile kaldırmak: topic/partition kavramları, order-service'in KafkaTemplate ile OrderPlacedEvent yayınlaması, inventory-service'in @KafkaListener ile tepki vermesi, senkron vs asenkron arasında ne zaman hangisinin seçileceği, en az bir kez teslimat garantisinin her tüketiciyi idempotent yapmayı gerektirmesi, ve JSON serialization tercihi.
Distributed Transactions
Event-Driven Architecture ve Kafka dersinin açık bıraktığı boşluğu kapatmak -- inventory-service stok rezerve edemezse order-service'in zaten commit ettiği siparişe ne olur: Two-Phase Commit'in mikroservislerde neden nadir olduğu, Saga deseni (yerel işlemler + kompansasyon eylemleri), choreography ile StockReservationFailedEvent üzerinden iki yönlü bir saga akışı kurmak, kompansasyonun bir rollback olmadığı, ve Outbox deseninin bir olayın hiç yayınlanmama riskini kapatması.
Observability
API Gateway ve Resilience4j derslerinin kasıtlı olarak açık bıraktığı iki ipliği kapatmak: correlation id'yi order-service'in kendi loglarına (MDC) ve inventory-service'e giden çağrılara GERÇEKTEN yaymak, structured (JSON) loglama, Micrometer/Actuator ile metrikler, distributed tracing'in aynı correlation id kavramı üzerine inşa edilmesi, ve Resilience4j'nin Micrometer'la zaten otomatik entegre olması.
Security
Bu kategorideki her dersin şimdiye kadar varsaydığı koşulsuz güveni kapatmak: Spring Security'yi projeye ilk kez tanıtmak, authentication vs authorization ayrımı, JWT'nin kendi kendine yeterli doğası, api-gateway ve order-service'te AYRI AYRI JWT doğrulaması (zero trust), role-bazlı authorization, ve kimliğin correlation id'ye paralel şekilde servisler arası yayılması.
Deployment
Bu kategorinin şimdiye kadar her dersinin localhost varsayımının gerçek dünyada nasıl deploy edildiği: multi-stage Dockerfile ile küçük image'lar, tüm sistemi (eureka-server, config-server, api-gateway, order-service, inventory-service, Kafka) tek bir docker-compose dosyasında orkestre etmek, container'larda ortam değişkeni ile yapılandırma, depends_on'un health check olmadan neden yetmediği, ve Kubernetes'e kısa/dürüst bir bakış.
Advanced Spring
Java Bean Validation
Spring MVC'nin "Validation & Exception Handling" dersinin üzerine inşa edilir -- işaret kısıtları (@Positive/@PositiveOrZero/@Negative/@NegativeOrZero), tarih/saat kısıtları (@Past/@Future/@PastOrPresent/@FutureOrPresent), tam ondalık sınırlar (@DecimalMin/@DecimalMax/@Digits), validation mesajlarını özelleştirmek, custom constraint annotation + ConstraintValidator ile çapraz alan validasyonu, ve validation grupları. Advanced Spring serisinin 1.'si.
Exception Handling
Spring MVC'nin "Validation & Exception Handling" ve bu kategorinin "Java Bean Validation" derslerinin üzerine inşa edilir -- MethodArgumentNotValidException'ın gerçekte ne taşıdığı, validasyon hatalarını ProblemDetail'e dönüştürmek (çapraz-alan hatalar dahil), custom ProblemDetail özellikleri, domain exception'ları doğru HTTP durum koduna (400/404/409/422/500) eşlemek, ResponseEntityExceptionHandler ile merkezileştirme, ve internal detay sızdırmayan güvenli hata yanıtları. Advanced Spring serisinin 2. ve son dersi.
Task Execution & Scheduling
"Threads"in dil seviyesinde işlediği thread pool temelinin üzerine inşa edilir -- Spring'in TaskExecutor soyutlaması, @Async ve @EnableAsync ile arka plan işi, self-invocation'ın @Async'i neden bozduğu ("Transaction Management"taki AYNI proxy tuzağı), @Scheduled ile fixed rate/fixed delay/initial delay/cron ifadeleri, ve scheduling'in kendi ayrı thread pool'unun (TaskScheduler) yapılandırılması. Advanced Spring serisinin 3.'sü.
Spring Batch
Neden büyük ölçekli batch işlemlerinin `@Scheduled`'ın tek başına sağlayamadığı bir yapıya ihtiyacı olduğu -- Job/Step/chunk-odaklı işleme zihinsel modeli, tek bir CSV-'den-veritabanına sipariş içe aktarma örneği boyunca ItemReader/ItemProcessor/ItemWriter, JobParameters/JobInstance/JobExecution ayrımı, JobRepository ile yeniden başlatılabilirlik, skip/retry fault tolerance, ve `@Scheduled` ile pratik birleşim. Advanced Spring serisinin 4.'sü.
Spring Data JPA
JPA, Hibernate ve Spring Data JPA
Bir Java nesnesini bir veritabanına kalıcı hale getirme sorunundan başlayarak, ORM → JPA (spesifikasyon) → Hibernate (implementasyon) → Spring Data JPA (repository soyutlaması) → Spring Boot (auto-configuration) zihinsel modeli, bu projenin gerçek Topic/TopicRepository sınıflarıyla inşa ediliyor. Spring Data JPA kategorisinin 1.'si.
Entities and the Repository Abstraction
@Entity/@Id/@GeneratedValue/@Column mapping'i, @Table/@Enumerated/nullable-unique kısıtları/argümansız constructor/entity vs DTO/equals()-hashCode() (kısaca), ve Repository → CrudRepository → PagingAndSortingRepository → JpaRepository hiyerarşisinin her katmanının ne kattığı -- bu projenin gerçek Topic/Category/TopicRepository sınıflarıyla. Spring Data JPA kategorisinin 2.'si.
Query Methods and JPQL with @Query
Spring Data JPA'nın bir repository metodunun adından bir sorguyu nasıl çıkardığı (findBy/existsBy/countBy, And/Or/OrderBy), @Query ile JPQL yazmak ve isimli parametreler, toplu güncelleme/silme için @Modifying, join fetch, ve ne zaman bir native query'ye başvurulacağı -- bu projenin gerçek repository'leriyle. Spring Data JPA kategorisinin 3.'sü.
Pagination, Sorting, and Projections
"REST API Tasarımı"nın controller-seviyesinde çözdüğü Pageable/Sort'un, repository seviyesinde gerçekte nasıl LIMIT/OFFSET + count sorgusuna dönüştüğü, findAll(Sort)/derived metotlarla sıralama, ve bütün bir entity yerine yalnızca ihtiyaç duyulan alanları döndüren interface-tabanlı ve record/constructor-expression projection'lar -- bu projenin gerçek Topic/TopicTranslation sınıflarıyla. Spring Data JPA kategorisinin 4.'sü.
Dynamic Queries with Specifications
"REST API Tasarımı"nın bellek içinde bıraktığı isteğe bağlı filtrelemeyi, JPA'nın Criteria API'si (Root/CriteriaQuery/CriteriaBuilder/Predicate) üzerine ince bir sarmalayıcı olan Specification interface'i, JpaSpecificationExecutor, Specification.where/and/or ile birleştirme, ve findAll(Specification, Pageable) ile gerçek sayfalamayla birleştirme -- bu projenin gerçek Topic entity'siyle. Spring Data JPA kategorisinin 5.'si.
Relationships, Fetching, and the N+1 Problem
@OneToMany/@ManyToMany mapping ("Transaction Management"in zaten kapsamlıca işlediği @ManyToOne'un ötesinde), cascade türleri (PERSIST/MERGE/REMOVE/ALL) ve orphanRemoval, N+1 probleminin somut gösterimi, ve @EntityGraph/batch fetching/projection'larla üç farklı düzeltme -- bu projenin gerçek Topic/Category/QuizQuestion sınıflarıyla. Spring Data JPA kategorisinin 6.'sı.
The Persistence Context and Locking
"Transaction Management"in zaten kapsamlıca işlediği dirty checking'in NEDEN çalıştığı -- persistence context'in kendisi, entity yaşam döngüsü durumları (transient/managed/detached/removed), first-level cache, persist/merge/detach, flush zamanlaması -- ve iki transaction aynı satıra dokunduğunda ne olduğu: @Version ile optimistic locking, @Lock ile pessimistic locking. Spring Data JPA kategorisinin 7.'si.
Auditing in Spring Data JPA
Bu projenin gerçek QuestionIngestService'inin elle yazdığı LocalDateTime.now() deseninden başlayarak, @CreatedDate/@LastModifiedDate, @EntityListeners(AuditingEntityListener.class) + @EnableJpaAuditing bağlantısı, @CreatedBy/@LastModifiedBy, AuditorAware<T>, ve @MappedSuperclass ile audit alanlarını paylaşmak. Spring Data JPA kategorisinin 8.'si.
Testing Spring Data JPA Repositories
"Spring MVC'de Test Yazmak"ın yalnızca isim olarak andığı @DataJpaTest ve TestEntityManager -- bu projenin kendi Mockito-mock'lanmış servis testlerinin bırakmadan geçtiği boşluğu (bir sorgunun gerçekten çalıştığının hiç doğrulanmaması) kapatıyor; derived query/custom @Query testi, ve embedded test veritabanı vs gerçek PostgreSQL vs Testcontainers -- bu projenin kendi application-test.yml'inin gerçek yorumuna dayanarak. Spring Data JPA kategorisinin 9. ve son dersi.
React
React Fundamentals
React Nedir?
React'in ne olduğu, neden ortaya çıktığı, library ile framework arasındaki fark, SPA kavramı ve React'in nerede kullanıldığı -- sade bir dille, hiç kod yazmadan.
Bir React Projesi Oluşturmak
Node.js ve npm, Vite ile yeni bir proje oluşturma, proje yapısı, package.json, npm run dev ve development ile production farkı.
JSX
JSX nedir, HTML ile farkları, süslü parantez { } ile JavaScript gömme, attribute'lar ve className, JSX kuralları ve conditional rendering'e kısa bir bakış.
Components & Props
Components
Component nedir, fonksiyon olarak nasıl yazılır, nasıl kullanılır (render edilir), isimlendirme kuralı ve yeniden kullanılabilirlik -- basit örneklerle.
Props
Props nedir, parent'tan child'a veri gönderme, birden fazla prop, destructuring, varsayılan değerler ve props'un normal fonksiyon parametrelerinden farkı.
Component Composition
children prop'u, iç içe component'ler ve composition ile inheritance arasındaki fark -- yeniden kullanılabilir bir Card component'i mini projesiyle.
State & Events
Events
React'te olay (event) sistemi -- onClick, event handler tanımlamak, onChange, onSubmit ve event object -- basit örneklerle.
State
State nedir, useState ile nasıl tanımlanır, nasıl güncellenir, bir önceki state'e göre güncelleme ve state immutability -- basit örneklerle.
Conditional Rendering
if, ternary (? :) ve && operatörü ile koşula göre farklı arayüz göstermek, ve koşula göre farklı component'ler döndürmek -- basit örneklerle.
Lists & Keys
map() ile liste render etmek, key prop'u nedir, neden önemlidir, ve en yaygın hata olan index'i key olarak kullanmak -- basit örneklerle.
Hooks
What Are Hooks?
Hook nedir, neden var, Hooks kuralları (Rules of Hooks) ve function component'lerle ilişkisi -- basit örneklerle.
useEffect
Side effect nedir, useEffect ile nasıl çalıştırılır, dependency array'in üç kullanımı, cleanup fonksiyonu ve yaygın infinite loop hatası -- basit örneklerle.
useRef
DOM referansları, render'lar arası kalıcı değerler, useRef vs useState, ve useRef'i useEffect ile birlikte kullanmak -- basit örneklerle.
useMemo & useCallback
Memoization nedir, useMemo ile hesaplama sonucunu ve nesne referansını, useCallback ile fonksiyon referansını önbelleğe almak, ve ne zaman kullanılmaması gerektiği -- basit örneklerle.
Custom Hooks
Custom hook nedir, use öneki ve isimlendirme kuralı, aynı hook'u birden fazla kez kullanmak, ve bir useFetch örneği -- basit örneklerle.
Forms
Controlled Components
Controlled component nedir, value ve onChange ile bir input'u state'e bağlamak, checkbox/select'lerde de aynı deseni kullanmak -- basit örneklerle.
Form Handling
onSubmit ile formu göndermek, birden fazla alanı tek bir state nesnesiyle yönetmek, validation ve hata mesajları göstermek -- basit örneklerle.
Routing
React Router Basics
react-router ile bir React uygulamasına sayfa geçişi eklemek -- BrowserRouter, Routes, Route, Link, NavLink ve tanımsız URL'ler için Not Found sayfası, basit örneklerle.
Route Parameters & Navigation
URL'in içine değişken değerler koymak (route parametreleri), useParams ile okumak, Outlet ile iç içe route'lar kurmak, ve useNavigate ile programatik yönlendirme -- basit örneklerle.
API & Data Fetching
Fetching Data
React'te fetch ile bir sunucudan veri çekmek ve göndermek -- GET, POST, PUT, DELETE, loading ve error handling, basit örneklerle.
React + REST API
React'in bir REST API'ye bağlanması -- API katmanını bir api.js modülünde ayırmak, listeleme, oluşturma ve silme işlemlerini birlikte yönetmek, basit örneklerle.
State Management
Sharing State
Birden fazla component'in aynı state'e ihtiyaç duyduğu durumlar -- state'i yukarı taşımak (lifting state up) ve props drilling sorunu, basit örneklerle.
Context API
React'in props drilling'e yerleşik çözümü Context API -- createContext, useContext, Provider, ve context'i bir custom hook'a sarmalamak, basit örneklerle.
Advanced React
React Performance
React.memo, useMemo ve useCallback ile gereksiz yeniden render'ları önlemek, ve React'in Profiler component'i ile render sürelerini ölçmek -- basit örneklerle.
Error Boundaries
React'te render sırasındaki hataları yakalayan class component'ler: getDerivedStateFromError, componentDidCatch, error boundary'lerin kapsamı ve yakalamadıkları, basit örneklerle.
Lazy Loading & Code Splitting
React.lazy ile component'leri sonradan yüklemek, route bazlı code splitting, named export'larla lazy kullanmak, ve koşullu lazy loading -- basit örneklerle.
Suspense
Suspense'in fallback prop'u, iç içe Suspense sınırları, React 19'un use() hook'u ile Suspense entegrasyonu, ve Suspense'in otomatik yapmadıkları -- basit örneklerle.
Portals
react-dom'un createPortal fonksiyonu ile component'leri farklı bir DOM düğümüne render etmek -- modal'lar, event bubbling davranışı, ve portal hedefi ayarlamak, basit örneklerle.
Testing
Component Testing
Vitest ve React Testing Library kurulumu, render+screen ile ilk test, getByRole/getByLabelText ile sorgulama, jest-dom matcher'ları, ve koşullu render'ı test etmek -- basit örneklerle.
User Interaction Testing
user-event ile gerçekçi etkileşim simülasyonu, tıklamayı ve yazmayı test etmek, form gönderimini vi.fn() ile doğrulamak, ve asenkron UI güncellemelerini findBy* ile test etmek -- basit örneklerle.
Production
Build & Deployment
npm run build ile production build almak, Vite'ta ortam değişkenleri (VITE_ öneki, .env), ve tamamen statik bir React uygulamasını Vercel'e deploy etmek -- basit örneklerle.
React + Spring Boot Deployment
React'i Vercel'e, gerçek bir Spring Boot REST API'sini Render'a (Docker) deploy etmek, ortam değişkenleriyle backend adresini yönetmek, ve production CORS yapılandırması -- basit örneklerle.
Artificial Intelligence
AI Fundamentals
Yapay Zeka Nedir?
Yapay zekanın gerçekte ne anlama geldiğine dair net bir harita -- dar ve genel yapay zeka, geleneksel yazılımdan farkı, ve Machine Learning, Deep Learning, Generative AI'ın birbiriyle ilişkisi.
Machine Learning
Machine Learning'in gerçekte ne olduğu -- training ve inference farkı, supervised/unsupervised/reinforcement öğrenme türleri, ve overfitting/underfitting'in eğitimi nasıl yanlış gösterebileceği.
Deep Learning
Neural network'lerin nasıl yapılandırıldığı -- katmanlar, ağırlıklar, aktivasyon fonksiyonları -- ve backpropagation ile eğitim, ve CNN/RNN/transformer mimarilerine kısa bir bakış.
Generative AI
Generative AI'ın discriminative modellerden farkı, metin/görüntü üreten modellerin nasıl çalıştığı, Large Language Model'lere kısa bir önizleme, ve akıcılık ile doğruluk arasındaki kritik ayrım.
Large Language Models
Large Language Model'ler Nasıl Çalışır?
LLM'lerin mekanik olarak ne olduğu, pretraining ve knowledge cutoff, base model ile instruction-tuned model farkı, ve in-context learning ile context kavramına ilk bakış.
Token'lar ve Context Window'lar
Token'ların ve tokenization'ın ne olduğu, context window'un sert sınırı, context dolduğunda ne olduğu, ve truncation/summarization/retrieval ile sınırlı context'i yönetme stratejileri.
Prompting and Prompt Engineering
Prompt yapısı (system/user/assistant rolleri), zero-shot ve few-shot prompting, etkili prompt yazma pratikleri, ve chain-of-thought gibi yaygın prompting tekniklerine giriş.
LLM Yetenekleri ve Sınırlamaları
LLM'lerin gerçekten güçlü olduğu alanlar, hallucination'ın neden olduğu, knowledge cutoff'un etkisi, akıl yürütme sınırları, ve eğitim verisindeki bias'ın nasıl yeniden üretildiği.
Tools & MCP
Tools and Function Calling
Bir LLM'in gerçek kod çalıştırmasını isteyebilmesini sağlayan tool use/function calling mekanizması: tool-calling loop, bir tool'u tanımlamak, ve tool use'un bir "agent"tan farkı.
MCP'ye Giriş
Model Context Protocol (MCP) nedir, hangi N×M entegrasyon problemini çözer, host/client/server rolleri, ve bir server'ın sunabileceği tools/resources/prompts primitive'leri.
MCP Mimarisi
MCP'nin mesaj biçimi olan JSON-RPC 2.0, stdio ve Streamable HTTP transport'ları, initialize/discover/invoke bağlantı yaşam döngüsü, ve capability negotiation.
TypeScript ile MCP Sunucusu Oluşturma
Resmi TypeScript SDK'sıyla gerçek, çalıştırılabilir bir MCP server ve client inşa etme: proje kurulumu, registerTool ile tool tanımlama, in-memory transport üzerinden bağlanma, ve gerçek çıktı.
AI Agents
Bir AI Agent Nedir?
Bir AI agent'i tanımlayan şey: gözlemle-karar ver-eyleme geç loop'u, tek bir tool call'dan farkı, ve otonomi spektrumu.
Agent Planlama ve Akıl Yürütme Kalıpları
Bir agent'ın "karar ver" adımının somut kalıpları: ReAct, plan-and-execute, reflection, ve bir loop'un ne zaman durması gerektiği.
Agent Davranışını Kontrol Etmek
Bir agent loop'unu güvenli kılan korkuluklar: adım sınırları, human-in-the-loop onayı, en az yetki ilkesi, ve observability.
TypeScript ile Bir AI Agent Oluşturma
Gerçek, çalışan bir agent loop inşa edin: deterministik, açıkça simüle edilmiş bir karar adımı, "Building an MCP Server"daki gerçek MCP tool'larını gerçekten çağırıyor.
AI Development Tools
Claude Code ile AI Destekli Yazılım Geliştirme
Gerçek bir Spring Boot özelliğini, gerçek bir Claude Code terminal oturumunda analiz edip planlayın, uygulayın, test edin ve gözden geçirin: Plan Mode, izin modeli, ve gerçekten yakalanmış hatalarla.
Claude Code CLI: Komutlar ve Kullanım
Terminali kapatıp geri dönmekten context yönetimine, izin modlarından komut keşfetmeye: Claude Code CLI'ını günlük kullanımda etkin kullanmak için hızlı bir başvuru kaynağı -- resmi dokümantasyon ve gerçek bir CLI oturumuyla doğrulanmış.
PostgreSQL
PostgreSQL Foundations
PostgreSQL ve İlişkisel Model
İlişkisel bir veritabanının ne olduğu, PostgreSQL'in özellikle ne olduğu, Spring Boot → Spring Data JPA → Hibernate → SQL → PostgreSQL yığını, ve bu projenin gerçek TopicRepository'sinin bir çağrısının bu yığından nasıl geçtiği -- hiç SQL sözdizimi olmadan, yalnızca zihinsel model. PostgreSQL kursunun ve PostgreSQL Foundations kategorisinin 1.'si.
PostgreSQL'e Bağlanmak: psql ve Gerçek Bir Spring Boot DataSource
Docker ile yerel bir PostgreSQL çalıştır, psql ile doğrudan bağlan, ve bu projenin kendi Spring Boot DataSource yapılandırmasının PostgreSQL seviyesinde gerçekte ne anlama geldiğini gör. PostgreSQL Foundations kategorisinin 2.'si.
Databases, Schemas, Tables, and Basic SQL Syntax
Sunucu → veritabanı → şema → tablo hiyerarşisi, CREATE TABLE sözdizimi bu projenin kendi gerçek V1__init_schema.sql'i üzerinden okunarak, kolon tanımları/kısıtlar, SQL yorumları, ve DDL ile DML arasındaki ilk ayrım. PostgreSQL Foundations kategorisinin 3.'sü.
PostgreSQL Data Types
INTEGER/BIGINT/BIGSERIAL, VARCHAR/TEXT, BOOLEAN, ve DATE/TIMESTAMP/TIMESTAMPTZ -- her birinin bu projenin kendi gerçek Topic/TopicTranslation/Question entity'lerindeki karşılık gelen Java alan türüne (Long/String/boolean/LocalDateTime) nasıl eşlendiği. PostgreSQL Foundations kategorisinin 4.'sü.
Constraints and Keys
PRIMARY KEY, FOREIGN KEY ve referential integrity, ON DELETE CASCADE vs. RESTRICT (bu projenin kendi quiz_question_link tablosundaki gerçek kontrastıyla), composite UNIQUE, CHECK kısıtları, ve BIGSERIAL PRIMARY KEY'in GenerationType.IDENTITY'ye nasıl bağlandığı. PostgreSQL Foundations kategorisinin 5.'si.
Inserting, Updating, and Deleting Data
INSERT/UPDATE/DELETE, bu projenin kendi gerçek INSERT ... SELECT ve UPDATE ... WHERE migration'larıyla, RETURNING, ON CONFLICT (upsert), ve Flyway'in migration'ların neden hiç ON CONFLICT'e ihtiyaç duymadığını nasıl garanti ettiği. PostgreSQL Foundations kategorisinin 6.'sı.
SELECT and Filtering
SELECT'in temel şekli, SELECT * yerine kolonları açıkça adlandırma, karşılaştırma/mantıksal operatörler, LIKE desen eşleştirme, IN/BETWEEN, ve NULL'ın neden = ile değil yalnızca IS NULL ile filtrelenebildiği -- bu projenin kendi gerçek topic/category tablosu üzerinde. PostgreSQL Foundations kategorisinin 7.'si.
Sorting, Limiting, and Pagination
ORDER BY, LIMIT/OFFSET, ve NULLS FIRST/LAST -- Spring Data JPA kursundaki Pageable/Sort/Page<T>'in altta gerçekte hangi ham SQL'e dönüştüğü, bu projenin kendi gerçek topic tablosu üzerinde. PostgreSQL Foundations kategorisinin 8.'i.
JOINs
INNER/LEFT/RIGHT/FULL JOIN, bu projenin kendi gerçek topic→category→course zinciriyle ve gerçek TopicRepository.findBySlugWithCategoryAndCourse JPQL join fetch'iyle -- ve "henüz İngilizce'de yayınlanmamış topic'leri bulma" gibi gerçek bir LEFT JOIN örneğiyle. PostgreSQL Foundations kategorisinin 9.'u.
Aggregation and GROUP BY
COUNT/SUM/AVG/MIN/MAX, GROUP BY, ve HAVING -- Spring Data JPA'nın Pageable/Sort/projection kelime dağarcığında hiç karşılığı olmayan, tamamen yeni materyal -- bu projenin kendi gerçek "kategori başına topic" LEFT JOIN + GROUP BY sorgusuyla. PostgreSQL Foundations kategorisinin 10.'u ve SONUNCUSU.
Advanced PostgreSQL
Subqueries, CTEs, and Window Functions
Scalar ve korelasyonlu subquery'ler, WITH (CTE) zincirleme, ve window fonksiyonları (ROW_NUMBER, RANK, PARTITION BY) -- GROUP BY'nin aksine satırları çökertmeden onlar arasında hesaplama, bu projenin kendi gerçek topic tablosuyla. Advanced PostgreSQL kategorisinin 1.'i.
PostgreSQL-Specific Data Types: UUID, JSON/JSONB, and Arrays
UUID (BIGSERIAL'a alternatif olarak, trade-off'larla), JSON vs. JSONB, ->/->>/@> ile JSONB sorgulama, ve array'ler (ANY/@>/unnest) -- bu projenin gerçek şemasının hiçbirini kullanmadığı dürüstçe belirtilerek, illüstratif ama bu projenin domain'ine bağlı örneklerle. Advanced PostgreSQL kategorisinin 2.'si.
Indexes and Query Performance with EXPLAIN
EXPLAIN/EXPLAIN ANALYZE, Seq Scan vs. Index Scan, bu projenin kendi gerçek idx_topic_category B-tree index'iyle CREATE INDEX, partial/expression index'ler, ve OFFSET'in maliyetine keyset pagination'la geri dönüş. Advanced PostgreSQL kategorisinin 3.'ü.
Transactions and Concurrency in PostgreSQL
psql'de gerçek BEGIN/COMMIT/ROLLBACK, MVCC'nin mekanik açıklaması (xmin/xmax), SELECT ... FOR UPDATE ile satır-seviyesi kilitleme, ve bilerek üretilip açıklanan bir deadlock -- "Transaction Management"in isolation kapsamını TEKRARLAMADAN. Advanced PostgreSQL kategorisinin 4.'ü ve SONUNCUSU -- PostgreSQL kursunun 14/14 topic'ini tamamlıyor.
Git & GitHub
Git Fundamentals
Git Fundamentals
Git nedir, GitHub'dan nasıl farklıdır, ve working tree/staging area/repository zihinsel modeli -- git init, status, add, commit, diff ve log ile. Git & GitHub kursunun ve Git Fundamentals kategorisinin 1.'si.
Working With Commits
İyi commit mesajları yazmak, git log/git show ile geçmişte gezinmek, git commit -am, ve git commit --amend'in var olan bir commit'i yerinde değiştirmek yerine YENİ bir commit oluşturduğunu anlamak. HEAD ve HEAD~1/HEAD~2 referansları.
Undoing Changes
git restore ile working tree değişikliklerini geri almak, git reset'in soft/mixed/hard modları arasındaki fark, ve git revert ile paylaşılan commit'leri güvenle geri almak. HEAD, staging area ve working tree arasındaki ilişki, ve git reset --hard'ın veri kaybı riski.
Branches & Merging
Branch oluşturmak/silmek/yeniden adlandırmak, git switch ile branch değiştirmek, git merge ile fast-forward ve merge commit'in farkı, merge conflict'lere giriş, ve gerçekçi bir Spring Boot feature branch workflow'u. git switch'in git checkout'a neden tercih edildiği.
GitHub & Remotes
Remote nedir, git clone/push/fetch/pull nasıl çalışır, fetch'in pull'dan farkı (fetch: entegre etmeden indir, pull: fetch + entegre), tracking branch'ler ve git push -u, ve yerel/remote branch'leri senkronize etmek.
Pull Requests
Pull Request nedir, gerçekçi bir feature branch workflow'u üzerinden nasıl oluşturulur/incelenir/onaylanır, merge vs squash-and-merge farkı, merge sonrası branch'leri silmek, ve branch protection rules.
Advanced Git
Rebase & Squash
Rebase nedir, merge'den farkı, git rebase -i ile commit'leri squash/reorder/reword etmek, rebase conflict'lerini çözmek, paylaşılan geçmişi yeniden yazmanın tehlikesi, ve git push --force ile --force-with-lease arasındaki fark.
Merge Conflicts
Bir merge conflict'i tam olarak nedir, conflict marker'ları (<<<<<<<, =======, >>>>>>>) nasıl okunur, gerçek Java kod örnekleriyle nasıl çözülür, merge ve rebase sırasında aynı mekanik, ve git merge --abort/git rebase --abort ile güvenli iptal.
Stash
git stash ile commit edilmemiş değişiklikleri bir kenara kaydetmek, apply vs pop farkı, çoklu ve isimlendirilmiş stash'ler, git stash drop/clear, ve takip edilmeyen dosyaları stash'lemek. Gerçekçi bir "işi yarıda bırakıp başka göreve geçmek" senaryosu.
Advanced Git & Best Practices
git cherry-pick, git reflog (özellikle kayıp commit'leri kurtarma mekanizması olarak), git blame, alias'lar, iyi branch/commit konvansiyonları, ve merge/rebase/squash/revert'i özetleyen bir karşılaştırma. Bir geliştirme takımı için Git en iyi pratikleri.
Practical Git & GitHub Workflow
Kursun tamamında öğretilen her şeyi tek, gerçekçi bir uçtan uca Spring Boot senaryosunda birleştiren kapanış dersi: clone, feature branch, commit/amend, push, Pull Request, inceleme geri bildirimi, main üzerine rebase, conflict çözümü, force-with-lease, ve squash and merge.
Docker
Docker Fundamentals
Docker Nedir?
Docker'ın ne olduğu, container'ların sanal makinelerden nasıl farklı olduğu, image ile container arasındaki fark, Docker Engine, ve Docker Hub -- Docker kursunun ve Docker Fundamentals kategorisinin 1.'si.
Docker CLI Temelleri
docker pull, docker images, docker run, docker ps, docker logs, docker exec, docker stop/start, ve docker rm -- bir PostgreSQL container'ının tam yaşam döngüsü üzerinden, gerçek örneklerle anlatılıyor.
Docker İmajları ve Dockerfile
Bir Dockerfile nedir, FROM, WORKDIR, COPY, RUN, EXPOSE talimatları, CMD ile ENTRYPOINT arasındaki fark, ve docker build ile bir image inşa etmek -- jenerik, minimal bir web sunucusu örneği üzerinden.
Bir Spring Boot Uygulamasını Docker'a Taşımak
Bir Spring Boot JAR'ı için JRE vs JDK base image seçimi, .dockerignore, multi-stage build'ler, ve container-farkında JVM bellek boyutlandırması -- bu projenin kendi gerçek learning-platform uygulaması üzerinden.
Docker in Practice
Docker Networking
Varsayılan bridge network'ün container'lar arasında isim çözümlemesini neden desteklemediği, user-defined network'lerle docker network create, container'dan container'a isimle iletişim, ve localhost'un bir container içinde neden farklı bir şey ifade ettiği.
Docker Volumes
Container'ların neden ephemeral (geçici) olduğu, named volume'lar, docker run -v ile bir volume mount etmek, PostgreSQL'in verisini nerede sakladığı, named volume vs bind mount, ve kalıcılığın bilinçli bir testle doğrulanması.
Docker Compose
docker-compose.yml, service'ler, depends_on, Compose'ın otomatik servis-adı-ile-networking'i, ve volumes -- "Docker Networking" ile "Docker Volumes"un elle yaptığı her şeyi tek bir dosyaya ve docker compose up'a indirerek.
Production İçin Docker (Java Uygulamaları)
Layer caching ile daha hızlı rebuild'ler, root olmayan bir kullanıcı, Dockerfile HEALTHCHECK, Compose'un depends_on: condition: service_healthy'siyle gerçek bağımlılık hazırlığını beklemek, ve production konfigürasyonu/sırlar.
Pratik Proje: Docker ile Spring Boot + PostgreSQL
Bu kursun her dersinin işlediği her parçayı -- multi-stage Dockerfile, non-root kullanıcı, HEALTHCHECK, Docker Compose, named volume, otomatik networking -- küçük, tam bir Spring Boot + PostgreSQL task tracker uygulamasında bir araya getiren, kursun kapanış dersi.