Logo
Ana Sayfa
ÖZEL KODLAMA DERSLERİ
Yazılım Özel Ders
Tüm birebir programlara genel bakış
Python Yazılım Kursu
Sıfırdan ileri seviyeye birebir Python
Java Yazılım Kursu
OOP odaklı birebir Java eğitimi
AP Computer Science Principles
AP CSP sınav hazırlığı
GRUP DERSLERİ
Python & Django Masterclass
SINIRLI KONTENJAN
Java & Spring Boot Masterclass
SINIRLI KONTENJAN
C# .NET Masterclass
SINIRLI KONTENJAN
VİDEO DERSLER
Sıfırdan Temel Python Kursu
Kendi Hızında Öğren
ÜCRETSİZ
Seviye Testi
Ücretsiz — Python, Java, algoritma seviye testleri
Kariyerini Keşfet
Sertifika Doğrula
Belge numarası ve soyad ile doğrulama

Java'da println Yerine Loglama Kütüphaneleri: SLF4J ve Log4j Mantığı

Yazar: Berk Keskin 24.08.2026 ~13 dk okuma 13 Okunma
java-da-println-yerine-loglama-slf4j-log4j

Java'da println yerine loglama yapmanın temel nedeni, konsol çıktısının prod ortamında hem takip edilemez hem de yönetilemez olmasıdır. System.out.println geliştirme sırasında hızlı bir kontrol imkânı sunsa da, gerçek bir uygulamada zaman damgası, log seviyesi, thread bilgisi ve dosyaya yazma gibi ihtiyaçları karşılamaz. SLF4J ve Log4j gibi loglama kütüphaneleri, bu eksiklikleri gidermek için tasarlanmış; hangi bilginin ne zaman, nereye ve hangi önem derecesiyle kaydedileceğini kontrol etmeyi mümkün kılan sistemlerdir. Bu yazıda println'in neden yetersiz kaldığını, log seviyelerinin mantığını ve SLF4J'nin Log4j ile ilişkisini kavramsal olarak ele alacağız.

System.out.println Neden Gerçek Projelerde Yetersiz Kalır?

System.out.println çağrısı, arka planda senkron bir şekilde konsola yazma işlemi yapar. Bu, tek bir çağrı için önemsiz görünse de, yoğun bir döngü içinde binlerce kez çalıştırıldığında ciddi bir performans maliyetine dönüşür; her satır konsola aktarılırken uygulamanın diğer işleri beklemesi gerekir ve bu birikimli gecikme özellikle yüksek trafikli sistemlerde fark edilir hale gelir. Bunun yanında println çıktısı doğrudan standart çıktı akışına bağımlıdır; bir sunucuda arka planda çalışan bir uygulamanın konsol çıktısını gerçek zamanlı izlemek çoğu zaman mümkün değildir, dolayısıyla geliştirme ortamında işe yarayan bu yöntem prod ortamında pratik olarak görünmez hale gelir.

Bir diğer sorun, println'in kod içine gömülü kalmasıdır. Bir hata ayıklama satırını eklediğinizde, onu daha sonra kapatmak veya seviyesini değiştirmek için kodu tekrar derleyip yeniden dağıtmanız gerekir; "şimdi aç, sorun çözülünce kapat" gibi dışarıdan kontrol edilebilir bir mekanizma yoktur. Oysa loglama kütüphaneleri bu seviyeyi dışarıdan, kod değiştirmeden ayarlamaya izin verir.

println çıktısında ayrıca bağlam bilgisi de eksiktir. Örneğin System.out.println("Kullanıcı bulunamadı") satırı, bu hatanın hangi sınıfta, hangi metotta, ne zaman ve hangi thread'de oluştuğunu söylemez. Bir loglama kütüphanesi ise aynı mesajı zaman damgası, sınıf adı ve thread kimliğiyle birlikte üretebilir; bu da hatayı ayıklarken saatlerce kod arasında gezinmek yerine doğrudan kaynağa gitmeyi sağlar.

Çoklu thread ortamında bu eksiklik daha da belirginleşir. Birden fazla thread aynı anda println çağırdığında, çıktılar konsola iç içe geçmiş biçimde düşebilir; bir thread'in satırı diğerinin ortasına karışabilir ve okunabilirlik tamamen kaybolur. Bu tür karmaşık senaryolarla erken tanışmak isteyen ve sağlam alışkanlıklar edinmek isteyen öğrenciler için Java özel ders programı bu konuları uygulamalı örneklerle pekiştirme fırsatı sunar.

Log Seviyeleri Nedir? DEBUG, INFO, WARN ve ERROR Mantığı

Loglama kütüphanelerinin println'e göre en somut avantajı, mesajları önem derecesine göre sınıflandırabilmesidir. Bu sınıflandırmaya log seviyeleri denir ve her seviye farklı bir amaca hizmet eder.

  • DEBUG: Geliştirme sürecinde bir değişkenin değerini, bir metodun hangi parametrelerle çağrıldığını veya bir akışın hangi dalından geçtiğini izlemek için kullanılır. Örneğin bir sipariş hesaplama metodunda ara toplamın her adımda ne olduğunu görmek isteyebilirsiniz.
  • INFO: Uygulamanın normal işleyişiyle ilgili, sorun olmayan ama bilinmesi faydalı olayları kaydeder. "Uygulama başlatıldı" veya "Kullanıcı girişi başarılı" gibi mesajlar bu seviyeye örnektir.
  • WARN: Henüz bir hataya dönüşmemiş ama dikkat edilmesi gereken durumları işaret eder. Örneğin bir dış servise yapılan çağrının beklenenden uzun sürmesi WARN seviyesinde loglanabilir.
  • ERROR: Uygulamanın beklenmedik bir şekilde davrandığı, bir işlemin tamamlanamadığı durumları kaydeder; genellikle bir exception ile birlikte gelir.

Bazı kütüphaneler bunlara ek olarak daha ayrıntılı bir TRACE seviyesi ve çok daha kritik durumlar için FATAL seviyesi de sunar; TRACE, DEBUG'dan bile daha ince taneli bir izleme sağlarken FATAL genellikle uygulamanın çalışmaya devam edemeyeceği durumları işaret eder. Ancak günlük geliştirme pratiğinde en sık kullanılan dörtlü DEBUG, INFO, WARN ve ERROR'dur.

Bu seviyelerin asıl gücü, ortam bazlı filtreleme yapılabilmesinden gelir. Geliştirme ortamında DEBUG seviyesi açık tutularak her ayrıntı izlenebilirken, prod ortamında genellikle sadece WARN ve ERROR seviyeleri aktif bırakılır. Böylece hem gereksiz log hacmi oluşmaz hem de disk ve performans kaynakları boşa harcanmaz. Bir uygulamanın saniyede binlerce isteği işlediği bir prod sisteminde her isteği DEBUG seviyesinde loglamak, hem log dosyalarını devasa boyutlara ulaştırır hem de asıl önemli WARN/ERROR mesajlarının bu yığın içinde kaybolmasına neden olur. Bu yüzden seviye filtreleme, sadece bir "açma kapama" özelliği değil, okunabilirlik ve sistem performansı açısından doğrudan bir tasarım kararıdır.

SLF4J Nedir? Facade Mantığı ve Log4j ile İlişkisi

SLF4J Nedir? Facade Mantığı ve Log4j ile İlişkisi

SLF4J (Simple Logging Facade for Java), kendi başına loglama işlemini gerçekleştiren bir kütüphane değil; farklı loglama kütüphaneleri için ortak bir arayüz, yani bir facade (cephe) görevi gören bir yapıdır. Java'daki facade pattern mantığında olduğu gibi, geliştirici karmaşık alt sistemlerle doğrudan konuşmak yerine, sade ve tutarlı bir arayüz üzerinden işlem yapar; asıl işi kim yapacak sorusu alt katmanlara bırakılır.

Pratikte bu şu anlama gelir: kodunuzu SLF4J'nin sunduğu Logger arayüzüne göre yazarsınız, ancak bu logların gerçekte nasıl işleneceğine — konsola mı yazılacak, dosyaya mı kaydedilecek, hangi formatta tutulacak — Log4j gibi bir implementasyon karar verir. SLF4J arka planda hangi kütüphanenin çalıştığını bilmenizi gerektirmez; kod tarafında değişen tek şey bağımlılık yapılandırmasıdır, iş mantığınızdaki log çağrıları aynı kalır.

Bu ayrım, özellikle junior bir geliştirici için önemli bir esneklik sağlar. Bir projede loglama altyapısı değiştirilmek istendiğinde — örneğin bir implementasyondan başka birine geçilirken — SLF4J'ye yazılmış kod satırlarının hiçbiri değişmez, yalnızca arka plandaki bağımlılık güncellenir. Bu da kodun bakımını kolaylaştırır ve loglama kararını iş mantığından bağımsız hale getirir.

Aşağıdaki örnek, basit bir Java sınıfında SLF4J üzerinden farklı seviyelerde log üretmenin temel mantığını gösterir:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SiparisServisi {

    private static final Logger logger = LoggerFactory.getLogger(SiparisServisi.class);

    public void siparisOlustur(String musteriId, double tutar) {
        logger.debug("Siparis olusturma baslatildi, musteriId={}", musteriId);

        if (tutar <= 0) {
            logger.warn("Gecersiz tutar denemesi: {}", tutar);
            return;
        }

        try {
            logger.info("Siparis basariyla olusturuldu, musteriId={}, tutar={}", musteriId, tutar);
        } catch (Exception e) {
            logger.error("Siparis olusturulurken hata olustu", e);
        }
    }
}

Bu örnekte dikkat edilmesi gereken nokta, Logger ve LoggerFactory sınıflarının SLF4J'den geldiği ancak gerçek log yazma işleminin hangi kütüphane tarafından yürütüldüğünün koddan anlaşılamamasıdır — bu tam olarak facade mantığının amacıdır. Bu tür temel tasarım desenlerini ve loglama pratiklerini sıfırdan, uygulamalı biçimde öğrenmek isteyenler canlı Java eğitimi ile konuyu bir eğitmen eşliğinde adım adım pekiştirebilir.

println ile Loglama Kütüphanelerini Karşılaştırma

Bir önceki bölümde SLF4J'nin facade mantığını ve Log4j ile ilişkisini ele aldık. Şimdi bu ayrımın günlük geliştirme pratiğine nasıl yansıdığına bakalım. System.out.println ile bir loglama kütüphanesi arasındaki fark sadece sözdizimi değil, çalışma zamanı davranışıdır. Aşağıdaki tablo bu farkı somutlaştırır.

Kriter println Loglama Kütüphanesi (SLF4J/Log4j)
Performans Her çağrı doğrudan konsola yazar, koşulsuz çalışır Seviye kontrolüyle gereksiz çağrılar devre dışı bırakılabilir
Ortam bazlı filtreleme Yoktur, kod değiştirilmeden kapatılamaz Geliştirme ve prod ortamı için farklı seviyeler tanımlanabilir
Çıktı hedefi Yalnızca konsol Konsol, dosya veya harici izleme sistemine yönlendirilebilir
Thread güvenliği Çoklu iş parçacığında çıktılar karışabilir Kayıtların tutarlı ve ayrıştırılabilir biçimde tutulması hedeflenir
Prod uygunluğu Kalıcı kayıt bırakmadığı için sınırlı Kalıcı, filtrelenebilir ve analiz edilebilir kayıt üretir

Tablodaki fark aslında tek bir şeye indirgenebilir: kontrol. println ile yazdığınız her satır, kod derlendiği andan itibaren sabittir; hangi ortamda çalışırsa çalışsın aynı şekilde davranır. Bir loglama kütüphanesinde ise hangi seviyenin görüneceğini, çıktının nereye gideceğini ve hangi bilgilerin kaydedileceğini kod değiştirmeden ayarlayabilirsiniz. Küçük bir ödev projesinde bu fark hissedilmeyebilir, ama birden fazla bileşenin aynı anda çalıştığı, birden fazla kişinin geliştirdiği bir sistemde bu esneklik günlük iş akışının parçası hâline gelir.

Projeye Loglama Eklemek: Adım Adım Süreç

Projeye Loglama Eklemek: Adım Adım Süreç

Loglama kütüphanesini bir projeye entegre etmek karmaşık bir işlem değildir, ancak adımların mantıklı bir sırayla ilerlemesi anlaşılırlığı artırır. Aşağıdaki sıralama, hem kavramsal hem pratik açıdan izlenmesi önerilen genel akışı gösterir.

  1. Bağımlılığı ekleme: Maven veya Gradle üzerinden ilgili loglama kütüphanesi projeye bağımlılık olarak tanımlanır. Bu adım önce yapılır çünkü kütüphane sınıfları projeye dahil olmadan sonraki hiçbir adım çalışmaz.
  2. Logger nesnesi oluşturma: Log kaydı üretilecek sınıf içinde, o sınıfa özel bir logger nesnesi tanımlanır. Logger genellikle sınıf bazında oluşturulur, böylece log çıktısında hangi sınıftan geldiği ayrıca belli olur.
  3. Uygun seviye seçme: Yazılacak her log satırı için DEBUG, INFO, WARN veya ERROR seviyelerinden biri seçilir. Bu adım logger nesnesi hazır olduktan sonra gelir çünkü seviye seçimi, her çağrının anlamını belirler.
  4. Çıktı hedefinin yapılandırılması: Log kayıtlarının konsola mı, bir dosyaya mı yoksa her ikisine birden mi yazılacağı belirlenir. Bu adım en sona bırakılır çünkü hedef ayarı, kod içindeki log çağrılarından bağımsız, dışarıdan yönetilen bir yapılandırma meselesidir.

Bu sıralamanın mantığı şudur: önce araç projeye dahil edilir, sonra araç kullanılabilir hâle getirilir, ardından ne kaydedileceğine karar verilir, en son da bu kayıtların nereye gideceği belirlenir. Bu adımları ilk kez uygularken takılınan noktalar genellikle seviye seçimi ve yapılandırma ayrımıdır; bu tür konularda birebir ilerlemek isteyen öğrenciler için Java özel ders desteği, kod üzerinde canlı örneklerle bu ayrımı netleştirmeye yardımcı olabilir.

Prod Ortamında Log Dosyalarının Rolü

Geliştirme ortamında bir hatayı fark ettiğinizde IDE konsoluna bakmak yeterlidir. Ancak canlı (prod) ortamda böyle bir lüks yoktur; uygulama genellikle bir sunucu üzerinde, kimsenin ekranına bakmadığı bir terminalde çalışır. Konsol çıktısı bu ortamda ya hiç görünmez ya da anlık olarak kaybolur. Bu yüzden prod ortamında asıl güvenilir kaynak, diske yazılan log dosyalarıdır.

Bir senaryo düşünelim: gece saat 03.00'te, kimsenin sistemde olmadığı bir anda uygulama beklenmedik bir hata verip bir işlemi yarıda kesiyor. Sabah ekip işe geldiğinde sorunu fark ediyor ama konsol çıktısı zaten uçup gitmiş durumda; o anı yeniden görmenin tek yolu, o gece diske yazılmış log dosyasını açmaktır. Log dosyasında hangi seviyede hangi mesajın, hangi zaman damgasıyla kaydedildiğine bakarak hatanın hangi adımda, hangi koşulda ortaya çıktığı geriye dönük olarak yeniden kurulabilir. println ile çalışan bir sistemde bu tür bir geriye dönük analiz mümkün değildir, çünkü kaydedilen hiçbir şey yoktur.

Log dosyalarının sürekli büyümesi de ayrı bir sorun oluşturur; bir uygulama aylarca kesintisiz çalıştığında tek bir dosya kontrolsüz biçimde şişebilir. Bu noktada devreye log rotasyonu kavramı girer: belirli bir büyüklüğe veya süreye ulaşan log dosyası kapatılır, arşivlenir ve yeni kayıtlar için taze bir dosya açılır. Böylece hem disk alanı verimli kullanılır hem de eski kayıtlara ihtiyaç duyulduğunda hangi döneme ait olduğu belli, düzenli bir arşiv ortaya çıkar. Rotasyonun tam olarak nasıl yapılandırılacağı kullanılan araca göre değişir, ancak junior bir geliştiricinin bilmesi gereken temel fikir şudur: log dosyaları sonsuza kadar tek parça hâlinde büyümemeli, düzenli aralıklarla bölünüp arşivlenmelidir.

Maven veya Gradle ile Loglama Bağımlılığı Ekleme Mantığı

Bir Java projesine loglama kütüphanesi eklemek, elle jar dosyası indirip classpath'e atmaktan çok daha pratik bir yöntemle yapılır: bağımlılık yönetim araçları üzerinden. Maven veya Gradle kullanıyorsanız, loglama kütüphanesini projenize dahil etmek için yapmanız gereken şey, ilgili bağımlılığı proje yapılandırma dosyanıza (Maven'da pom.xml, Gradle'da build.gradle) tanımlamaktır. Araç, o bağımlılığı ve onun kendi ihtiyaç duyduğu alt kütüphaneleri (transitive dependency) otomatik olarak indirir, projenizin derleme ve çalışma yoluna (classpath) ekler. Bu, sizin manuel dosya yönetimiyle uğraşmanızı ortadan kaldırır.

Burada kavramsal olarak anlaşılması gereken kritik nokta şudur: SLF4J API'si ile Log4j gibi bir implementasyon, iki ayrı bağımlılık olarak eklenir. SLF4J'yi facade (cephe) olarak projeye dahil ettiğinizde, bu sadece bir arayüz seti getirir; gerçek log yazma işini yapan motor değildir. Log satırlarının fiilen bir dosyaya, konsola veya başka bir hedefe yazılabilmesi için, arkada çalışacak somut bir implementasyon bağımlılığının da ayrıca eklenmesi gerekir. Bu ayrım, bir önceki bölümde bahsedilen facade mantığının bağımlılık yönetimine yansımasıdır: API tarafı sabit kalırken, motor tarafı proje ihtiyacına göre değiştirilebilir.

Pratikte junior bir geliştiricinin karşılaştığı en yaygın hata, sadece SLF4J API'sini eklemek ve arkasında hiçbir implementasyon olmadığı için loglama çağrılarının hiçbir çıktı üretmemesidir. Bu durumda hata mesajı almazsınız, sadece log satırları sessizce kaybolur. Bu yüzden bağımlılık eklerken iki parçayı birlikte düşünmek, ileride "neden loglarım görünmüyor" sorusuyla zaman kaybetmemek için önemlidir. Bu tür bağımlılık yönetimi mantığı, sadece loglamaya özgü değil; Java ekosisteminde kullanılan hemen her kütüphane için geçerli genel bir çalışma prensibidir ve bunu erken kavramak, ileride farklı kütüphanelerle çalışırken de işinizi kolaylaştırır. Bu tür temel kavramları adım adım pekiştirmek isteyenler Java öğrenme sürecine dair yazılar üzerinden konuyu farklı açılardan da inceleyebilir.

Sürüm numarası seçimi veya yapılandırma dosyasının tam içeriği proje ve zamana göre değişebileceğinden, burada net bir sürüm veya dosya içeriği vermek yerine akışın mantığını kavramak daha kalıcıdır: önce API, sonra implementasyon, ardından (varsa) implementasyona özel ayar dosyası.

Junior Geliştiriciler İçin Loglama Alışkanlıkları

Loglama, sadece hata ayıklama aracı değil, aynı zamanda bir iletişim alışkanlığıdır. Kodunuzu sizden sonra okuyacak bir ekip arkadaşı, log satırlarına bakarak uygulamanın hangi adımdan geçtiğini, hangi verilerle çalıştığını ve nerede sorun çıktığını anlayabilmelidir. İyi yazılmış log mesajları, kod okunabilirliğini artırır çünkü akışı takip etmek için debugger'ı açıp adım adım ilerlemek yerine, log çıktısına bakmak çoğu zaman yeterli olur. Ekip çalışmasında bu, özellikle prod ortamında canlı bir sorunu araştırırken zaman kazandıran bir alışkanlığa dönüşür. Ancak burada dengeyi tutturmak önemlidir. Her satıra log basmak, "aşırı loglama" olarak bilinen ve aslında faydadan çok zarar getiren bir alışkanlıktır. Bir metodun her değişkenini, her döngü adımını DEBUG seviyesinde loglamak, log dosyalarını gereksiz yere şişirir, önemli bilgiyi gürültünün içinde kaybettirir ve performansı olumsuz etkileyebilir. Junior geliştiricilerin sık yaptığı bu hata, aslında "ne zaman loglamalıyım" sorusunu netleştirerek çözülür: bir işlemin başlangıcı, sonucu, beklenmeyen bir durum veya hata anı loglanmaya değerdir; sıradan her adım değil.

Anlamlı bir log mesajı, sadece "hata oluştu" demek yerine neyin, hangi değerle olduğunu belirtir. Örneğin aşağıdaki gibi bir kullanım, sorunu araştıran kişiye doğrudan ipucu verir:

logger.warn("Kullanıcı bulunamadı, id={}", kullaniciId);
logger.error("Siparis kaydedilemedi, siparisId={}, hata={}", siparisId, e.getMessage());

Bu iki satır, sadece bir şeyin yanlış gittiğini değil, hangi kullanıcı veya siparişle ilgili olduğunu da gösterir. Böyle bir log mesajı olmadan sadece "hata oluştu" yazmak, prod ortamında binlerce satır arasında kaybolan, işe yaramaz bir kayıt olmaktan öteye geçmez.

Gerçek proje ortamına geçişte bu alışkanlığın farkı net biçimde görülür. Okul projelerinde hata genellikle konsolu izleyerek anlık yakalanır; ancak gerçek bir sistemde geliştirici çoğu zaman hatanın olduğu anda orada değildir, sorunu saatler veya günler sonra log dosyalarına bakarak çözer. Bu yüzden düzenli, tutarlı ve anlamlı loglama alışkanlığı kazanmış bir junior geliştirici, ekip içinde daha az soru soran, sorunları daha hızlı kendi başına çözebilen biri olarak öne çıkar.

Sık Sorulan Sorular

System.out.println kullanmak neden tamamen yanlış sayılır?

Tamamen yanlış değildir; öğrenme aşamasında veya çok küçük denemelerde kullanılabilir. Ancak gerçek projelerde seviye ayrımı yapamaması, çıktının nereye yazılacağını kontrol edememesi ve performans/yönetim esnekliği sunmaması nedeniyle yetersiz kalır, bu yüzden loglama kütüphaneleriyle değiştirilir.

SLF4J ile Log4j arasındaki fark tam olarak nedir?

SLF4J, kod içinde kullandığınız ortak bir arayüz (facade) sağlar; Log4j ise bu arayüzün arkasında gerçek log yazma işini yapan implementasyonlardan biridir. Kodunuz SLF4J API'sine yazılır, hangi implementasyonun çalıştığı bağımlılık yapılandırmasında belirlenir.

Hangi durumda DEBUG, hangi durumda ERROR seviyesi kullanılmalı?

DEBUG, geliştirme sırasında akışı detaylı takip etmek için kullanılan, prod ortamında genelde kapalı tutulan bir seviyedir. ERROR ise uygulamanın normal işleyişini bozan, doğrudan müdahale gerektiren beklenmeyen durumlar için kullanılır.

Prod ortamında log seviyesi nasıl değiştirilir?

Log seviyesi genellikle kullanılan loglama implementasyonunun yapılandırma dosyası üzerinden ayarlanır. Bu sayede kodu yeniden derlemeden, sadece yapılandırmayı güncelleyerek hangi seviyedeki logların üretileceği kontrol edilebilir.

Log dosyaları ne kadar süre saklanmalı?

Bu süre projenin ihtiyacına, disk kapasitesine ve varsa yasal saklama gerekliliklerine göre değişir; bu yüzden tek bir kesin süre vermek yerine, log rotasyonu mantığıyla eski dosyaların düzenli biçimde arşivlenmesi veya silinmesi planlanır.

Küçük bir okul projesinde loglama kütüphanesi kullanmaya gerek var mı?

Zorunlu değildir, ancak erken alışmak faydalıdır. Küçük bir projede bile SLF4J gibi bir yapıyı denemek, gerçek iş ortamına geçişte kütüphaneye ve log seviyesi mantığına yabancılık çekmemenizi sağlar.

SLF4J kullanmadan doğrudan Log4j kullanmak mümkün mü?

Teknik olarak mümkündür, kodunuzu doğrudan Log4j'nin kendi API'sine yazabilirsiniz. Ancak bu durumda ileride implementasyon değiştirmek isterseniz kod tabanınızda daha fazla değişiklik yapmanız gerekir; bu yüzden SLF4J gibi bir facade katmanı tercih edilir.

println'den loglama kütüphanelerine geçiş, küçük görünen ama gerçek proje deneyiminde fark yaratan bir adımdır. Seviye mantığını, facade yapısını ve bağımlılık yönetimini kavramak, Java öğrenme sürecinizin doğal bir parçası olarak ilerler; bu temelleri sağlamlaştırmak isteyenler Java özel ders içeriğine göz atabilir.

Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

İlgili Eğitimler

Berk Keskin — Yazılım Geliştirici ve Eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; bugün öğrencinin seviyesine ve hedefine göre şekillenen sürdürülebilir öğrenme sistemleri tasarlıyor. 300'den fazla kişiye ezber değil, düşünerek kod yazmayı öğretti — Berk Akademi'de izlemeye değil üretmeye dayalı öğrenme kültürünü o kuruyor.

WhatsApp Hemen Ara