İçeriğe geç
🐞
Yazılım Hataları

Yaygın Yazılım Hataları

Yeni başlayanların ve deneyimlilerin sık yaptığı hatalar. Her birinde hatalı kod, doğru kod, nedeni ve nasıl önleneceği yan yana.

52 yaygın hataHatalı ve doğru kod yan yana Hata çözmek için komutlar →
Webino App Ekibi Son güncelleme:

Hata (bug) nedir?

Yazılımda bir şeyin beklendiği gibi çalışmamasına "bug" (böcek) denir. Hatalar üç ana türe ayrılır:

Sözdizimi hatası (syntax error)

Dilin yazım kurallarına uymamak: unutulan parantez, tırnak veya noktalı virgül. Program hiç çalışmaz ama hatanın yerini hemen söyler.

Örnek Python
print("Merhaba"
# SyntaxError: '(' was never closed
💥

Çalışma zamanı hatası (runtime error)

Kod kurallara uygundur ama çalışırken imkânsız bir şey olur: sıfıra bölmek, olmayan bir dosyayı açmak gibi. Program o satırda durur.

Örnek Python
print(10 / 0)
# ZeroDivisionError: division by zero

Mantık hatası (logic error)

En sinsi tür: program hata vermeden çalışır ama yanlış sonuç üretir. Bilgisayar ne yazdıysan onu yapar, ne demek istediğini değil.

Örnek Python
ortalama = 80 + 100 / 2
print(ortalama)
# 130.0 yazar, 90 değil!
# Doğrusu: (80 + 100) / 2

Hata ayıklamanın 5 adımı

Hata ayıklama (debugging), bir hatanın nedenini bulup düzeltme işidir. Hangi dilde olursa olsun bu adımlar işe yarar.

  1. 1

    Hata mesajını sonuna kadar oku

    Özellikle son satıra ve satır numarasına bak. Mesaj sorunun ne olduğunu ve nerede olduğunu çoğu zaman açıkça söyler.

  2. 2

    Hatayı tekrar oluştur

    Hatanın hangi adımlarda ortaya çıktığını bul. Her seferinde tekrar edebildiğin bir hata, çözülmeye yarı yarıya yaklaşmış demektir.

  3. 3

    Değerleri ekrana yazdır

    Şüphelendiğin yerlere print() veya console.log() ekleyerek değişkenlerin gerçekte ne olduğunu gör.

  4. 4

    Sorunu küçült

    Kodun parçalarını tek tek dene ya da geçici olarak kapat. Hatanın olduğu yeri adım adım daralt.

  5. 5

    Anlat ve sor

    Kodunu birine, hatta masandaki bir lastik ördeğe satır satır anlat; çoğu zaman anlatırken hatayı kendin bulursun. Olmazsa hata mesajını yapay zekaya veya Stack Overflow'a sor.

En yaygın hatalar

Her hatada hatalı kod, doğru kod, günlük hayattan bir benzetme, nasıl fark edeceğin ve nasıl önleyeceğin var.

Güvenlik Seviye: Başlangıç

#1 Şifreleri ve API anahtarlarını kodun içine yazmak

Hesap erişimi ve beklenmedik kullanım maliyeti doğurabilecek bir güvenlik hatası.

#1 Şifreleri ve API anahtarlarını kodun içine yazmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
API_ANAHTARI = "sk-12345-gizli-anahtar"
baglan(API_ANAHTARI)
Doğru Python
import os

# Anahtar kodda değil, ortam değişkeninde durur
API_ANAHTARI = os.environ["API_ANAHTARI"]
baglan(API_ANAHTARI)

Örneğin çalışma ortamı: Bu parça uygulamaya eklenmek içindir. API_ANAHTARI ortam değişkeni ve kendi baglan işlevin tanımlı olmalıdır; burada gerçek bir bağlantı kurulmaz.

Günlük hayattan benzetme

Evinin anahtarını kapının önündeki paspasın altına saklamak gibi.

Nasıl fark edersin?

GitHub'dan veya kullandığın servisten "anahtarın sızdı" e-postası gelir; hesabında tanımadığın kullanımlar ve faturalar görürsün.

Neden sorun?

Kod GitHub'a yüklendiğinde anahtarı herkes görebilir. Otomatik botlar internetteki kodları sürekli tarar ve sızan anahtarları dakikalar içinde bulup kötüye kullanabilir.

Nasıl önlenir?

  • Şifre ve anahtarları ortam değişkenlerinde ya da .env dosyasında tut.
  • Yeni gizli dosyaları .gitignore ile dışla. Daha önce izlenmiş veya yayımlanmış dosyalar bu işlemle geçmişten silinmez; sızan anahtarı hemen iptal et.
  • Bir anahtar yanlışlıkla paylaşıldıysa hemen iptal et ve yenisini oluştur.
Güvenlik Seviye: Orta

#2 Kullanıcının yazdığına körü körüne güvenmek

SQLite örneği: sorgu metni ile kullanıcı verisini ayır.

#2 Kullanıcının yazdığına körü körüne güvenmek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
isim = input("Kullanıcı adı: ")
sorgu = "SELECT * FROM uyeler WHERE isim = '" + isim + "'"
imlec.execute(sorgu)
Doğru Python
isim = input("Kullanıcı adı: ")
# Soru işareti sayesinde girdi komut değil, sadece veri olarak kullanılır
imlec.execute("SELECT * FROM uyeler WHERE isim = ?", (isim,))

Örneğin çalışma ortamı: Bu SQLite parçasında imlec, açık bir bağlantının cursor nesnesidir; uyeler tablosu önceden oluşturulmuş olmalıdır. Başka sürücülerde yer tutucu biçimi değişebilir.

Günlük hayattan benzetme

Bankada müşterinin yazdığı dilekçeyi okumadan, içindeki her şeyi talimat diye yerine getirmek gibi.

Nasıl fark edersin?

Formlara tek tırnak (') yazıldığında sayfa hata verir ya da tuhaf sonuçlar gösterir.

Neden sorun?

Kullanıcının yazdığı metin doğrudan sorguya eklendiğinde, kötü niyetli biri isim yerine özel karakterler yazarak sorguyu değiştirebilir ve başka üyelerin bilgilerine erişebilir.

Nasıl önlenir?

  • Veritabanı sürücüsüne uygun parametreli sorgu kullan; bu örnekte SQLite için ? yer tutucu var.
  • Girdiyi kontrol et: uzunluk, izin verilen karakterler, beklenen biçim.
  • ORM kullansan da ham SQL ve kullanıcı girdilerini güvenli işle; sürücüye uygun parametreleme gerekir.
Güvenlik Seviye: Orta

#3 Kullanıcı şifrelerini olduğu gibi saklamak

Veritabanı sızarsa bütün şifreler okunur hâle gelir.

#3 Kullanıcı şifrelerini olduğu gibi saklamak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
kullanici = {"isim": "ayse", "sifre": "123456"}
veritabanina_kaydet(kullanici)
Doğru Python
import bcrypt

# Şifrenin geri çözülemeyen bir "özeti" saklanır
ozet = bcrypt.hashpw("123456".encode(), bcrypt.gensalt())
kullanici = {"isim": "ayse", "sifre_ozeti": ozet}
veritabanina_kaydet(kullanici)

Örneğin çalışma ortamı: bcrypt paketinin kurulması ve kendi veritabanina_kaydet işlevinin tanımlanması gerekir. 123456 yalnızca açıklayıcı örnektir; gerçek parola olarak kullanılmamalıdır.

Günlük hayattan benzetme

Herkesin şifresini bir deftere yazıp çekmecede saklamak gibi; defteri kim bulursa hepsini okur.

Nasıl fark edersin?

Veritabanına baktığında şifreleri olduğu gibi okuyabiliyorsan bu hata var demektir.

Neden sorun?

İnsanlar aynı şifreyi birçok yerde kullanır. Senin veritabanın sızarsa, kullanıcılarının e-posta ve banka hesapları da tehlikeye girer.

Nasıl önlenir?

  • Şifreleri bcrypt veya argon2 gibi özetleme (hash) yöntemleriyle sakla.
  • Şifreleri asla geri çözülebilir şekilde saklama.
  • Mümkünse giriş işlemleri için hazır ve güvenilir sistemler kullan.
Güvenlik Seviye: Orta

#4 Butonu gizlemeyi yetkilendirme sanmak

Arayüzde görünmeyen işlem sunucuda hâlâ erişilebilir olabilir.

#4 Butonu gizlemeyi yetkilendirme sanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
// Yalnızca görünümü değiştirir:
silButonu.hidden = !kullanici.admin;
Doğru JavaScript
// Arayüz yalnızca kullanıcı deneyimidir.
// Sunucu her istekte kimliği ve yetkiyi doğrular.
// Yetkisiz isteğe 403 döndürür; işlem yapılmaz.

Örneğin çalışma ortamı: Bu kod açıklayıcı yorumlardan oluşur. Gerçek kimlik ve yetki kontrolü, kullanılan sunucu çatısında her korunan istekte uygulanmalıdır.

Günlük hayattan benzetme

Kapıdaki yazıyı kaldırmak, kilit takmak değildir.

Nasıl fark edersin?

Sunucu testinde yetkisiz hesabın işlem sonucunu ve HTTP durumunu kontrol et.

Neden sorun?

Tarayıcı kodu ziyaretçinin kontrolündedir. Bir düğmeyi gizlemek veya yerel role bakmak sunucu kaynağını korumaz. Her hassas işlemde sunucu tarafı kontrol gerekir.

Nasıl önlenir?

  • Yetkiyi varsayılan kapalı tasarla.
  • Aynı işlemi yetkisiz test hesabıyla sınamadan tamamlandı sayma.
Güvenlik Seviye: Orta

#5 Kullanıcı metnini innerHTML ile yorumlamak

Girdi HTML olarak işlenebilir; güvenlik riski doğar.

#5 Kullanıcı metnini innerHTML ile yorumlamak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
sonuc.innerHTML = kullaniciMetni;
Doğru JavaScript
sonuc.textContent = kullaniciMetni;

Örneğin çalışma ortamı: Tarayıcı örneği: sonuc bir DOM öğesi, kullaniciMetni gösterilecek metindir. Bu değişkenler uygulamada önceden tanımlanmalıdır.

Günlük hayattan benzetme

Bir mektubu okumakla içindeki talimatı uygulamak aynı şey değildir.

Nasıl fark edersin?

Örnek bir HTML etiketi metin olarak mı görünür yoksa öğeye mi dönüşür bak.

Neden sorun?

HTML yorumlanması gerekmeyen yerde textContent kullanmak hem niyeti açıklar hem gereksiz HTML enjeksiyonunu önler. Zengin içerik gerekiyorsa güvenilir temizleme ve uygun çıktı politikası gerekir.

Nasıl önlenir?

  • Düz metin için textContent kullan.
  • Sunucu ve istemci çıktı bağlamlarını ayrı değerlendir.
Güvenlik Seviye: Orta

#6 Parola ve erişim anahtarını log’a yazmak

Kayıt dosyaları da gizli veri sızıntısı kaynağı olabilir.

#6 Parola ve erişim anahtarını log’a yazmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
console.log("Giriş:", eposta, parola);
Doğru JavaScript
console.log("Giriş denemesi", {
  islemId: "ornek-123",
  durum: "basarisiz"
});

Günlük hayattan benzetme

Kasayı kilitleyip şifresini kapının yanındaki deftere yazmak gibidir.

Nasıl fark edersin?

Başarılı ve başarısız işlemlerin loglarını örnek verilerle incele.

Neden sorun?

Log kayıtları ekipler, servisler veya hata izleme sistemleri arasında dolaşabilir. Bir sırrı koddan kaldırmak yetmez; konsol ve ağ kayıtlarında da bulunmamalıdır.

Nasıl önlenir?

  • Parola ve token alanlarını kaydetme.
  • Kayıt erişimini ve saklama süresini sınırla.
Güvenlik Seviye: Orta

#7 İç hata ayrıntılarını herkese göstermek

Dosya yolları ve sistem bilgileri gereksiz yere açığa çıkar.

#7 İç hata ayrıntılarını herkese göstermek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
except Exception as hata:
    return str(hata)
Doğru Python
import logging

logger = logging.getLogger(__name__)

def islemi_calistir(islem_id, islem):
    try:
        return islem()
    except Exception:
        logger.exception("İşlem başarısız. Referans: %s", islem_id)
        return "İşlem tamamlanamadı. Referans: " + islem_id

Örneğin çalışma ortamı: islemi_calistir işlevine bir referans kimliği ve çağrılabilir işlem verilir. Günlüklerin erişimini ve hassas veri içermemesini ayrıca düzenle.

Günlük hayattan benzetme

Müşteriye bütün arka ofis dosyalarını vermek yerine takip numarası vermek gibidir.

Nasıl fark edersin?

Hata yanıtında dosya yolu, sorgu veya anahtar görünüyor mu denetle.

Neden sorun?

Kullanıcıya anlamlı ve güvenli bir mesaj, geliştiriciye ise erişimi sınırlı ayrıntılı kayıt gerekir. Geniş Exception yakalama uygulama sınırında bilinçli kullanılmalı; her fonksiyonda hataları yutmamalıdır.

Nasıl önlenir?

  • Kullanıcı mesajı ile teknik log’u ayır.
  • Referans numarasıyla kayıtları eşleştir.
Güvenlik Seviye: Orta

#8 .gitignore’un eski sırrı geçmişten sildiğini sanmak

Takibe alınmış dosya yalnızca ignore eklenince kaybolmaz.

#8 .gitignore’un eski sırrı geçmişten sildiğini sanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Terminal
# .env zaten commit edildi
# Sadece .gitignore eklemek geçmişi temizlemez.
Doğru Terminal
git status
git ls-files .env
# Sır sızdıysa önce sağlayıcıdan iptal et.
# Takibi kaldırmak ve geçmişi temizlemek ayrı işlemlerdir.

Günlük hayattan benzetme

Gazeteye basılmış bir bilgiyi gelecekteki baskıdan çıkarmak eski kopyaları geri almaz.

Nasıl fark edersin?

git ls-files ile dosyanın takip durumunu incele; geçmiş kayıtlarını denetle.

Neden sorun?

.gitignore henüz takip edilmeyen dosyaları hedefler. Geçmişe girmiş bir anahtarın iptali ilk adımdır; geçmiş düzenleme ekip koordinasyonu gerektirebilir.

Nasıl önlenir?

  • Sırrı hemen iptal et ve yenisini oluştur.
  • Geçmiş temizliğini resmi yönergeyle, ekipten habersiz zorlamadan yap.
Güvenlik Seviye: Orta

#9 UPDATE veya DELETE sorgusunda WHERE koşulunu unutmak

Tek bir kaydı değiştirmek isterken tablodaki tüm kayıtları değiştirir veya siler.

#9 UPDATE veya DELETE sorgusunda WHERE koşulunu unutmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı SQL
-- Sadece 42 numaralı siparişi iptal etmek isterken:
UPDATE siparisler
SET durum = 'Iptal';
Doğru SQL
-- Önce hangi satırın etkileneceğini SELECT ile gör:
SELECT id, durum FROM siparisler WHERE id = 42;

-- Ardından birincil anahtar (Primary Key) ile güncelle:
UPDATE siparisler
SET durum = 'Iptal'
WHERE id = 42;

Günlük hayattan benzetme

Apartmanda tek bir dairenin ziline basmak yerine tüm binanın ana şalterini indirmek gibidir.

Nasıl fark edersin?

Çalıştırmadan önce sorguda WHERE ve benzersiz id koşulu olup olmadığını kontrol et; etkilenen satır sayısı (Affected rows) 1 mi bak.

Neden sorun?

SQL’de WHERE yazılmazsa veritabanı motoru komutu tablodaki bütün satırlara uygular. Bu durum söz dizimi hatası olmadığı için veritabanı itiraz etmez ve saniyeler içinde binlerce satırın verisi bozulabilir.

Nasıl önlenir?

  • UPDATE veya DELETE yazmadan önce aynı koşulla SELECT çalıştır.
  • Kritik işlemleri BEGIN TRANSACTION içinde dene; etkilenen satır sayısını kontrol etmeden COMMIT etme.
Mantık Hataları Seviye: Başlangıç

#10 Karşılaştırma yerine atama yapmak (= ile ===)

Tek bir eşittir işareti, koşulu her zaman doğru yapabilir.

#10 Karşılaştırma yerine atama yapmak (= ile ===) — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
let yas = 15;

if (yas = 18) {
  console.log("Reşit");
}
// Ekrana her zaman "Reşit" yazar!
Doğru JavaScript
let yas = 19;
if (yas >= 18) {
  console.log("Reşit");
}

Günlük hayattan benzetme

"Yaşın 18 mi?" diye sormak yerine "Yaşın artık 18 olsun!" demek gibi.

Nasıl fark edersin?

Koşul her zaman doğru ya da her zaman yanlış çalışır; değişkenin değeri kendiliğinden değişmiş gibi görünür.

Neden sorun?

Tek = bir değeri atar, karşılaştırmaz. Hatalı kodda yas değişkenine 18 atanır ve koşul her zaman doğru sayılır.

Nasıl önlenir?

  • Karşılaştırma için JavaScript'te ===, Python'da == kullan.
  • Kod editöründe uyarıları (linter) açık tut. Bu hatayı çoğu zaman senin yerine yakalar.
Mantık Hataları Seviye: Başlangıç

#11 Bir eksik / bir fazla saymak

Listeler 0'dan başlar. Bunu unutmak programı çökertir.

#11 Bir eksik / bir fazla saymak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
meyveler = ["elma", "armut", "kiraz"]

for i in range(len(meyveler) + 1):
    print(meyveler[i])
# IndexError: list index out of range
Doğru Python
meyveler = ["elma", "armut", "kiraz"]

for meyve in meyveler:
    print(meyve)

Günlük hayattan benzetme

Merdiven basamaklarını sayarken bir basamak fazla çıkmaya çalışıp boşluğa basmak gibi.

Nasıl fark edersin?

"index out of range" hatası alırsın ya da listenin ilk veya son elemanı atlanır.

Neden sorun?

3 elemanlı bir listenin sıra numaraları 0, 1 ve 2'dir. 3 numaralı eleman yoktur, bu yüzden program hata verir.

Nasıl önlenir?

  • Mümkün olduğunda sıra numarasıyla değil, doğrudan elemanlar üzerinde dön.
  • Döngülerde başlangıç ve bitiş değerlerini bir kez daha kontrol et.
Mantık Hataları Seviye: Orta

#12 Ondalık sayıların tam doğru olduğunu sanmak

JavaScript Number örneğinde ikili kayan nokta gösterimi küçük bir fark oluşturur.

#12 Ondalık sayıların tam doğru olduğunu sanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
console.log(0.1 + 0.2 === 0.3);
// false!
console.log(0.1 + 0.2);
// 0.30000000000000004
Doğru JavaScript
// Para hesaplarını kuruş cinsinden tam sayıyla yap
const toplamKurus = 10 + 20;
console.log(toplamKurus === 30); // true
console.log((toplamKurus / 100).toFixed(2) + " TL"); // "0.30 TL"

Günlük hayattan benzetme

1/3'ü ondalık olarak tam yazamamak gibi: 0,3333... her zaman biraz eksik kalır.

Nasıl fark edersin?

Hesaplarda 0,30000000000000004 gibi tuhaf sayılar ve kuruş farkları görürsün.

Neden sorun?

Bilgisayarlar ondalık sayıları ikilik sistemde saklar ve bazı sayıları tam olarak gösteremez. Bu küçük farklar özellikle para hesaplarında sorun çıkarır.

Nasıl önlenir?

  • Para örneklerinde tutarlı küçük birimde tam sayı veya uygun decimal türü kullan.
  • toFixed yalnızca metinsel gösterimi yuvarlar; hesaplama hatasını geriye dönük düzeltmez.
  • Yaklaşık karşılaştırmada ölçek ve iş kuralına uygun tolerans seç; her işe tek bir epsilon yetmez.
Mantık Hataları Seviye: Başlangıç

#13 Sonsuz döngü yazmak

Bitiş koşulu hiç gerçekleşmeyen bir döngü programı kilitler.

#13 Sonsuz döngü yazmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
sayac = 1

while sayac <= 5:
    print(sayac)
# sayac hiç artmıyor, ekrana sonsuza kadar 1 yazar!
Doğru Python
sayac = 1

while sayac <= 5:
    print(sayac)
    sayac += 1  # Her turda 1 artır

Günlük hayattan benzetme

"Bardak dolana kadar su koy" talimatını dibi delik bir bardak için vermek gibi.

Nasıl fark edersin?

Program hiç bitmez, bilgisayarın fanı hızlanır ya da tarayıcı sekmesi donar.

Neden sorun?

while döngüsü koşul doğru olduğu sürece döner. Döngünün içinde koşulu değiştiren bir şey yoksa döngü hiç bitmez.

Nasıl önlenir?

  • Döngü değişkeninin her turda değiştiğinden emin ol.
  • Mümkünse kaç kez döneceği belli olan for döngüsünü tercih et.
  • Program donarsa terminalde Ctrl + C ile durdurabilirsin.
Mantık Hataları Seviye: Orta

#14 Boş (null) değeri kontrol etmemek

Olmayan bir şeyin özelliğine ulaşmaya çalışmak programı çökertir.

#14 Boş (null) değeri kontrol etmemek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
const kullanici = null;

console.log(kullanici.isim);
// TypeError: Cannot read properties of null
Doğru JavaScript
const kullanici = null;

// ?. boşsa durur, ?? varsayılan değeri verir
console.log(kullanici?.isim ?? "Misafir");
// "Misafir"

Günlük hayattan benzetme

Boş bir zarfın içindeki mektubu okumaya çalışmak gibi.

Nasıl fark edersin?

"Cannot read properties of null" veya Java'da "NullPointerException" hatası alırsın.

Neden sorun?

Bir değişken bazen boş (null veya undefined) olabilir: kullanıcı giriş yapmamıştır, veri henüz gelmemiştir. Kontrol etmeden içine ulaşmaya çalışmak hata verir.

Nasıl önlenir?

  • Kullanmadan önce değerin dolu olup olmadığını kontrol et.
  • JavaScript'te ?. ve ??, Swift'te if let ve ?? kullan.
  • Mümkünse değişkenlere baştan mantıklı bir varsayılan değer ver.
Mantık Hataları Seviye: Başlangıç

#15 Formdaki sayıları metin olarak toplamak

5 ile 2 girildiğinde 7 yerine 52 görünür.

#15 Formdaki sayıları metin olarak toplamak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
const a="5", b="2";
console.log(a+b); // 52
Doğru JavaScript
const a="5", b="2";
if (a.trim() && b.trim() && Number.isFinite(Number(a)) && Number.isFinite(Number(b))) {
  console.log(Number(a)+Number(b)); // 7
}

Günlük hayattan benzetme

İki etiketin üzerine yazan rakamları yan yana yapıştırmak, içindeki miktarları toplamak değildir.

Nasıl fark edersin?

Girdi ve typeof çıktısını birlikte yaz; beklenen toplamı elle hesapla.

Neden sorun?

input.value metin döndürür. + işlecinde bir metin varsa birleştirme oluşabilir. Dönüşümün başarılı olması kadar boş girişin ne anlama geldiği de önemlidir.

Nasıl önlenir?

  • Türü konsolda typeof ile incele.
  • Boşluğu ayrı kontrol et, Number.isFinite ile sayıyı doğrula.
Mantık Hataları Seviye: Başlangıç

#16 Promise sonucunu beklemeden kullanmak

Veri yerine Promise veya undefined görürsün.

#16 Promise sonucunu beklemeden kullanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
async function veri(){ return 5; }
console.log(veri()+1);
Doğru JavaScript
async function veri(){ return 5; }
async function basla(){
  const n=await veri();
  console.log(n+1); // 6
}
basla();

Günlük hayattan benzetme

Sipariş fişi yemeğin kendisi değildir; mutfağın sonucu hazırlamasını beklemelisin.

Nasıl fark edersin?

Konsolda Promise nesnesi görüyorsan çağrının dönüşünü incele.

Neden sorun?

async fonksiyon her zaman Promise döndürür. Sonuç hazır olduğunda hesap yapmak için async bağlamda await veya then gerekir.

Nasıl önlenir?

  • Beklenen dönüş türünü yaz.
  • Bekleme ve hata yolunu birlikte planla.
Mantık Hataları Seviye: Başlangıç

#17 forEach içinde async işlemlerin bitmesini beklemek

Dış kod, döngüdeki işler tamamlanmadan ilerler.

#17 forEach içinde async işlemlerin bitmesini beklemek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
await [1,2].forEach(async n=>{
  await Promise.resolve(n);
});
console.log("Bitti");
Doğru JavaScript
async function basla(){
  for (const n of [1,2]) {
    const sonuc=await Promise.resolve(n);
    console.log(sonuc);
  }
  console.log("Bitti");
}
basla();

Günlük hayattan benzetme

Birden fazla kişiye iş verip bitirdiklerini sormadan “hepsi bitti” demek gibidir.

Nasıl fark edersin?

Bitti mesajından önce tüm görev sonuçlarının geldiğini kayıtlarla kontrol et.

Neden sorun?

forEach callback’lerin döndürdüğü Promise’ları beklemez ve kendisi undefined döndürür. Sıralı işler için for...of, bağımsız işler için uygun sınırlarla Promise.all değerlendirilebilir.

Nasıl önlenir?

  • İşlerin sıralı mı paralel mi olması gerektiğini belirle.
  • Çok sayıda isteği sınırsız paralel başlatma.
Mantık Hataları Seviye: Başlangıç

#18 Değişebilir varsayılan argümanı paylaşmak

Önceki çağrının listesi sonraki çağrıya taşınır.

#18 Değişebilir varsayılan argümanı paylaşmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
def ekle(x, liste=[]):
    liste.append(x)
    return liste
print(ekle(1))
print(ekle(2))
Doğru Python
def ekle(x, liste=None):
    if liste is None:
        liste=[]
    liste.append(x)
    return liste
print(ekle(1))  # [1]
print(ekle(2))  # [2]

Günlük hayattan benzetme

Her müşteriye yeni sepet vermek yerine öncekinin sepetini devretmek gibidir.

Nasıl fark edersin?

İkinci çağrıda ilk çağrıdan kalan öğe görünüyor mu bak.

Neden sorun?

Varsayılan değer fonksiyon tanımlandığında bir kez oluşturulur. Liste gibi değişebilir bir nesne sonraki çağrılarda tekrar kullanılabilir.

Nasıl önlenir?

  • Yeni liste için None kontrolü yap.
  • Fonksiyonu art arda iki kez çağırarak test et.
Mantık Hataları Seviye: Başlangıç

#19 Liste atamasını bağımsız kopya sanmak

Bir adı değiştirince diğerinde de değişiklik görünür.

#19 Liste atamasını bağımsız kopya sanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
a=[1,2]
b=a
b.append(3)
print(a)  # [1,2,3]
Doğru Python
a=[1,2]
b=a.copy()
b.append(3)
print(a)  # [1,2]
print(b)  # [1,2,3]

Günlük hayattan benzetme

Aynı eve iki adres etiketi yapıştırmak, ikinci bir ev oluşturmaz.

Nasıl fark edersin?

id veya is ile nesne kimliğini ve değişiklik sonrası iki listeyi karşılaştır.

Neden sorun?

b=a aynı nesneye ikinci bir ad bağlar. copy yüzeysel kopyadır; iç içe listelerin iç nesneleri hâlâ paylaşılabilir.

Nasıl önlenir?

  • Bağımsızlık ihtiyacını açıkça belirle.
  • İç içe verilerde yüzeysel kopyanın sınırını test et.
Mantık Hataları Seviye: Başlangıç

#20 Listeyi gezerken aynı listeden öğe silmek

Bazı öğeler atlanır ve sonuç girdiye göre değişir.

#20 Listeyi gezerken aynı listeden öğe silmek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
a=[1,2,3,4]
for x in a:
    if x<3: a.remove(x)
print(a)
Doğru Python
a=[1,2,3,4]
a=[x for x in a if x>=3]
print(a)  # [3,4]

Günlük hayattan benzetme

Yürüdüğün sıranın önünden sandalyeleri kaldırınca sonraki sandalyenin yeri değişir.

Nasıl fark edersin?

Yan yana iki uygun öğe kaldığında biri atlanıyor mu kontrol et.

Neden sorun?

Bir öğe silinince sonraki öğelerin indeksleri değişir. Döngünün ilerleyişi ile listenin yeni yapısı uyuşmaz. Yeni bir liste üretmek davranışı daha açık kılar.

Nasıl önlenir?

  • Filtreleme için yeni liste oluştur.
  • Ardışık silinecek öğelerle test et.
Mantık Hataları Seviye: Başlangıç

#21 Sıfıra bölme ve boş liste durumunu unutmak

Normal veri çalışırken boş veri hata verir.

#21 Sıfıra bölme ve boş liste durumunu unutmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
puanlar=[]
print(sum(puanlar)/len(puanlar))
Doğru Python
puanlar=[]
if puanlar:
    print(sum(puanlar)/len(puanlar))
else:
    print("Henüz puan yok")

Günlük hayattan benzetme

Hiç öğrenci yokken toplam puanı öğrenci sayısına bölmeye çalışmak gibidir.

Nasıl fark edersin?

Listenin uzunluğunu bölme işleminden önce incele.

Neden sorun?

Ortalama hesaplamak için eleman sayısı en az bir olmalıdır. Boş veri gerçek bir durumdur; her zaman bozuk girdi anlamına gelmez.

Nasıl önlenir?

  • Sınır durumları için beklenen davranışı yaz.
  • Boş, tek öğeli ve çok öğeli veriyle dene.
Mantık Hataları Seviye: Başlangıç

#22 JavaScript sort() ile sayıları metin gibi sıralamak

2, 10, 3 beklediğin sıraya girmeyebilir.

#22 JavaScript sort() ile sayıları metin gibi sıralamak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
const a=[2,10,3];
console.log(a.sort()); // [10,2,3]
Doğru JavaScript
const a=[2,10,3];
console.log([...a].sort((x,y)=>x-y)); // [2,3,10]

Günlük hayattan benzetme

Raf numaralarını sayı büyüklüğüne göre değil sözlükteki yazılışına göre dizmek gibidir.

Nasıl fark edersin?

10 içeren örnekle sonucu ve orijinal diziyi kontrol et.

Neden sorun?

Karşılaştırıcı verilmezse sort öğeleri metinsel sırayla karşılaştırır. Ayrıca orijinal diziyi değiştirir; burada önce kopya alarak yan etkiyi ayırdık.

Nasıl önlenir?

  • Sayısal karşılaştırıcı kullan.
  • Orijinal diziyi değiştirmek isteyip istemediğini belirle.
Mantık Hataları Seviye: Başlangıç

#23 UTC tarihi yerel günle aynı sanmak

Gece yarısı yakınında takvim günü değişebilir.

#23 UTC tarihi yerel günle aynı sanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
const gun=new Date().toISOString().slice(0,10);
// UTC günüdür; yerel gün olmayabilir.
Doğru JavaScript
const d=new Date();
const gun=[d.getFullYear(),
  String(d.getMonth()+1).padStart(2,"0"),
  String(d.getDate()).padStart(2,"0")].join("-");

Günlük hayattan benzetme

Aynı anda farklı şehirlerde farklı tarihler olabileceğini unutmak gibidir.

Nasıl fark edersin?

UTC ile yerel saat farkını ve hedef kullanımını kontrol et.

Neden sorun?

toISOString UTC üretir. Bir olayı zaman çizgisinde saklamak ile kullanıcının yerel takvim gününü seçmek farklı gereksinimlerdir. Hangi zaman diliminin esas olduğunu açıkça belirle.

Nasıl önlenir?

  • Takvim günü ve zaman damgasını ayır.
  • Farklı zaman dilimi ve gece yarısı sınırında test et.
Mantık Hataları Seviye: Başlangıç

#24 SQL’de boş (NULL) değerleri = NULL ile aramak

Sorgu hata vermez ama tabloda NULL kayıtlar olsa bile 0 satır döndürür.

#24 SQL’de boş (NULL) değerleri = NULL ile aramak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı SQL
-- Telefon numarası girilmemiş üyeleri bulmak istiyoruz:
SELECT ad, eposta FROM uyeler
WHERE telefon = NULL;
Doğru SQL
SELECT ad, eposta FROM uyeler
WHERE telefon IS NULL;

-- Dolu olanları filtrelemek için:
-- WHERE telefon IS NOT NULL;

Günlük hayattan benzetme

Henüz fiyatı belli olmayan bir ürünün fiyatını “0 TL olanlar” rafında aramak gibidir; etiketsiz ürün ayrı kontrol edilir.

Nasıl fark edersin?

Sorgu 0 satır döndürdüğünde filtrelediğin sütunda gerçekten NULL kayıt olup olmadığını IS NULL ile kontrol et.

Neden sorun?

SQL’de NULL “bilinmeyen veya girilmemiş değer” demektir; sıfır ya da boş metin ("") değildir. Bilinmeyen bir değerin başka bir şeye eşit olup olmadığı (= veya !=) karşılaştırılamaz; sonuç UNKNOWN olur ve WHERE satırı eler.

Nasıl önlenir?

  • NULL kontrolünde her zaman IS NULL veya IS NOT NULL kullan.
  • Boş metin ("") ile NULL değerini tabloda ayrı test et.
Mantık Hataları Seviye: Başlangıç

#25 C# ve Java’da başlatılmamış (null) nesnenin özelliğine erişmek

Program çalışırken NullReferenceException veya NullPointerException ile çöker.

#25 C# ve Java’da başlatılmamış (null) nesnenin özelliğine erişmek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı C#
string isim = null;
// null olan bir nesnenin metodunu çağırmak hataya yol açar:
Console.WriteLine(isim.ToUpper());
Doğru C#
string isim = null;
if (!string.IsNullOrEmpty(isim)) {
    Console.WriteLine(isim.ToUpper());
} else {
    Console.WriteLine("İsim henüz girilmedi.");
}
// Veya null-birleştirme ile varsayılan değer:
Console.WriteLine((isim ?? "Misafir").ToUpper());

Günlük hayattan benzetme

Henüz inşa edilmemiş bir evin kapısını açmaya çalışmak gibidir; elinde sadece boş bir arsa kaydı vardır.

Nasıl fark edersin?

Hata satırında nokta (.) işlecinden hemen önceki değişkenin değerini hata ayıklayıcıda (debugger) kontrol et; hangisinin null olduğunu bul.

Neden sorun?

Bir değişken tanımlanıp bellekte gerçek bir nesneye bağlanmadığında değeri null olur. Olmayan bir nesnenin uzunluğunu (Length) veya metodunu (ToUpper) çağırmak çalışma zamanında hataya neden olur.

Nasıl önlenir?

  • Dışarıdan veya veritabanından gelen değerleri kullanmadan önce null kontrolü yap.
  • Modern C#’ta ?. (null-conditional) ve ?? (null-coalescing) işleçlerinden yararlan.
Mantık Hataları Seviye: Başlangıç

#26 SQL’de toplama (COUNT/SUM) yaparken GROUP BY yazmayı unutmak

Bölümlere göre personel sayısını çekerken veritabanı hata verir veya tek satır döndürür.

Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı SQL
-- Bölüm bazında çalışan sayısını listelemek isterken GROUP BY unutulmuş:
SELECT bolum, COUNT(*) AS calisan_sayisi
FROM personeller;
Doğru SQL
-- Bölümlere göre gruplayarak her bölümün toplamını doğru getir:
SELECT bolum, COUNT(*) AS calisan_sayisi
FROM personeller
GROUP BY bolum
ORDER BY calisan_sayisi DESC;

Günlük hayattan benzetme

Tüm sınıfların sınav kağıtlarını tek bir torbaya doldurup her sınıfın ayrı ortalamasını çıkarmaya çalışmak gibidir; önce kağıtları sınıflara göre ayırmak gerekir.

Nasıl fark edersin?

Hata mesajında “not contained in either an aggregate function or the GROUP BY clause” ifadesini kontrol et.

Neden sorun?

COUNT, SUM, AVG gibi toplama fonksiyonları satırları tek bir sonuca indirger. Sorguda hem tekil bir sütun (bolum) hem de toplama fonksiyonu varsa veritabanı hangi sütuna göre gruplama yapılacağını bilmek zorundadır.

Nasıl önlenir?

  • SELECT listesinde toplama fonksiyonu dışında kalan sütunları GROUP BY ifadesine ekle.
  • Gruplanmış veride filtreleme yapmak için WHERE yerine HAVING kullanıldığını hatırla.
Yeni Başlayanlar Seviye: Başlangıç

#27 Hata mesajını okumadan kodu değiştirmek

Hata mesajı düşmanın değil, sana yol gösteren bir not.

#26 SQL’de toplama (COUNT/SUM) yaparken GROUP BY yazmayı unutmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
sayi = input("Bir sayı gir: ")
print(sayi + 5)
# TypeError: can only concatenate str (not "int") to str
Doğru Python
ham = input("Bir tam sayı gir: ")
try:
    sayi = int(ham)
    print(sayi + 5)
except ValueError:
    print("Lütfen geçerli bir tam sayı yaz.")

Günlük hayattan benzetme

Arabadaki uyarı ışığını görmezden gelip rastgele parçaları değiştirmek gibi.

Nasıl fark edersin?

Aynı hatayı tekrar tekrar görürsün ya da düzelttiğini sanırken yeni hatalar çıkar.

Neden sorun?

Mesaj sorunu açıkça söylüyor: bir yazı (str) ile bir sayı (int) toplanmaya çalışılıyor. Mesajı okumadan rastgele değişiklik yapmak, yeni hatalar doğurur.

Nasıl önlenir?

  • Hata mesajının en son satırını oku. Asıl sorun genelde oradadır.
  • Mesajdaki satır numarasına git.
  • Anlamadığın mesajı kopyalayıp yapay zekaya "bunu basitçe açıkla" diye sor.
Yeni Başlayanlar Seviye: Başlangıç

#28 Anlamsız değişken isimleri kullanmak

a, b, c ile yazılan kodu bir hafta sonra sen bile anlamazsın.

#28 Anlamsız değişken isimleri kullanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
a = 1200
b = 0.20
c = a * b
print(c)
Doğru Python
fiyat = 1200
kdv_orani = 0.20
kdv_tutari = fiyat * kdv_orani
print(kdv_tutari)

Günlük hayattan benzetme

Mutfaktaki bütün kavanozlara etiket yerine "a", "b", "c" yazmak gibi.

Nasıl fark edersin?

Kendi kodunu okurken "bu değişken neydi?" diye takılırsın.

Neden sorun?

Kod bir kez yazılır ama defalarca okunur. İsimler ne işe yaradığını anlatmazsa hata bulmak ve kodu değiştirmek çok zorlaşır.

Nasıl önlenir?

  • Değişkene içinde ne tuttuğunu anlatan bir isim ver.
  • Kısaltmalardan kaçın: kt yerine kdv_tutari yaz.
Yeni Başlayanlar Seviye: Başlangıç

#29 Sürüm kontrolünü bağımsız yedekle karıştırmak

"proje_son_SON_gercekten_son.zip" tanıdık geliyor mu?

#29 Sürüm kontrolünü bağımsız yedekle karıştırmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Klasör
proje.zip
proje_son.zip
proje_son_SON.zip
proje_son_gercekten_son.zip
Doğru Terminal
git init
git add .
git commit -m "Ana sayfa eklendi"

Günlük hayattan benzetme

Ödevini hiç kaydetmeden saatlerce yazıp bilgisayarın kapanması gibi.

Nasıl fark edersin?

Çalışan bir hâli kaybettin ve neyi değiştirdiğini hatırlamıyorsun.

Neden sorun?

Bir şeyi bozduğunda çalışan en son hâline geri dönemezsin. Hangi dosyanın güncel olduğu da karışır.

Nasıl önlenir?

  • Git ile anlamlı kayıtlar al; önce hangi dosyaların eklendiğini incele.
  • Uzak depo kodun ikinci kopyasını sağlayabilir; kayıtlı olmayan dosyalar ve kullanıcı verileri için ayrıca yedek planla.
  • Yedekten geri yüklemeyi dene; Git geçmişi tek başına bütün kayıp senaryolarını çözmez.
Yeni Başlayanlar Seviye: Başlangıç

#30 Girintiye (boşluklara) dikkat etmemek

Python'da boşluklar süs değil, kuralın kendisidir.

#30 Girintiye (boşluklara) dikkat etmemek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
if 5 > 3:
print("Beş, üçten büyük")
# IndentationError: expected an indented block
Doğru Python
if 5 > 3:
    print("Beş, üçten büyük")

Günlük hayattan benzetme

Bir yemek tarifinde hangi adımın hangi başlığa ait olduğunu karıştırmak gibi.

Nasıl fark edersin?

IndentationError hatası alırsın ya da kod beklediğin bloğun dışında çalışır.

Neden sorun?

Python, hangi satırın if, for veya def bloğuna ait olduğunu girintiye bakarak anlar. Girinti yoksa ya da yanlışsa ya hata verir ya da kod yanlış yerde çalışır.

Nasıl önlenir?

  • Python stil önerisi olarak girinti düzeyi başına 4 boşluk kullan; aynı blokta tutarlı ol ve sekmelerle boşlukları karıştırma.
  • Sekme (Tab) ile boşluğu aynı dosyada karıştırma; editörün bunu otomatik ayarlasın.
  • VS Code gibi editörler girintiyi senin yerine düzgün tutar.
Yeni Başlayanlar Seviye: Başlangıç

#31 Büyük/küçük harf farkını unutmak

Çoğu dilde `Isim` ile `isim` tamamen farklı iki şeydir.

#31 Büyük/küçük harf farkını unutmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
let kullaniciAdi = "ayse";

console.log(kullaniciadi);
// ReferenceError: kullaniciadi is not defined
Doğru JavaScript
let kullaniciAdi = "ayse";

console.log(kullaniciAdi);

Günlük hayattan benzetme

Kapıdaki isim "Ayşe" iken "ayşe" diye seslenince kimsenin cevap vermemesi gibi.

Nasıl fark edersin?

"is not defined" ya da "cannot find symbol" gibi hatalar alırsın.

Neden sorun?

JavaScript, Python, Java, C# ve Swift büyük/küçük harfe duyarlıdır. Tek bir harfin farkı bilgisayar için bambaşka bir isim demektir.

Nasıl önlenir?

  • İsimlendirmede tek bir stil seç ve hep onu kullan (ör. kullaniciAdi).
  • Editörün otomatik tamamlama özelliğini kullan; ismi elle yazmana gerek kalmaz.
Yeni Başlayanlar Seviye: Başlangıç

#32 print ile return’ü aynı şey sanmak

Ekranda sonuç görünür ama fonksiyon None döndürür.

#32 print ile return’ü aynı şey sanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
def topla(a,b):
    print(a+b)
sonuc=topla(2,3)
print(sonuc)  # None
Doğru Python
def topla(a,b):
    return a+b
sonuc=topla(2,3)
print(sonuc*2)  # 10

Günlük hayattan benzetme

Sonucu tahtaya yazmak ile soran kişiye bir değer teslim etmek farklıdır.

Nasıl fark edersin?

Değişkene atanan değerin None olup olmadığını incele.

Neden sorun?

print gözlenebilir çıktı üretir, return ise çağıran koda değer verir. Dönüş ifadesi olmayan fonksiyon Python’da None döndürür.

Nasıl önlenir?

  • Hesaplama ile ekrana yazmayı ayır.
  • Fonksiyon sonucunu başka bir hesapta kullanarak dene.
Yeni Başlayanlar Seviye: Başlangıç

#33 Aynı id değerini birden fazla öğede kullanmak

Bağlantı ve JavaScript yanlış öğeyi seçebilir.

#33 Aynı id değerini birden fazla öğede kullanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı HTML
<h2 id="ders">HTML</h2>
<h2 id="ders">CSS</h2>
Doğru HTML
<h2 id="html-dersi">HTML</h2>
<h2 id="css-dersi">CSS</h2>

Günlük hayattan benzetme

İki evin aynı sokakta aynı kapı numarasına sahip olması gibidir.

Nasıl fark edersin?

document.querySelectorAll("#ders").length ile beklenmeyen tekrarları kontrol et.

Neden sorun?

id bir belgede benzersiz olmalıdır. Tekrar kullanmak label eşleşmelerini, bölüm bağlantılarını ve querySelector sonucunu belirsizleştirir. Tekrar eden tasarım için class kullanılır.

Nasıl önlenir?

  • İç bağlantı kimliklerini benzersiz üret.
  • Ortak görünümü class ile paylaş.
Yeni Başlayanlar Seviye: Başlangıç

#34 Placeholder’ı alan etiketi yerine kullanmak

Yazmaya başlayınca alanın amacı kaybolur.

#34 Placeholder’ı alan etiketi yerine kullanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı HTML
<input placeholder="E-posta">
Doğru HTML
<label for="eposta">E-posta adresin</label>
<input id="eposta" name="eposta" type="email" autocomplete="email">

Günlük hayattan benzetme

Bir kutunun adını içine bir şey koyunca silinen etiketle yazmak gibidir.

Nasıl fark edersin?

Yazmaya başlayınca ne istendiği hâlâ belli mi bak.

Neden sorun?

Placeholder örnek verebilir ama kalıcı bir ad değildir. label, alanın amacını görünür kılar ve yardımcı teknolojiler için ilişki kurar.

Nasıl önlenir?

  • Her alana görünür etiket koy.
  • Label ile input for/id eşleşmesini kontrol et.
Yeni Başlayanlar Seviye: Başlangıç

#35 Dosya adında büyük/küçük harf farkını kaçırmak

Yerelde çalışan görsel yayında 404 verebilir.

#35 Dosya adında büyük/küçük harf farkını kaçırmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı HTML
<!-- Dosyanın adı kapak.jpg -->
<img src="Kapak.JPG" alt="Kapak">
Doğru HTML
<img src="images/kapak.jpg" alt="Ders kitabının kapağı">

Örneğin çalışma ortamı: images/kapak.jpg dosyasının projende gerçekten bulunması gerekir; bu ad otomatik indirilen bir örnek görsel değildir.

Günlük hayattan benzetme

Rehberde iki farklı isim aramak gibidir; benzer görünmesi aynı kayıt olduğu anlamına gelmez.

Nasıl fark edersin?

404 yanıtındaki yolu gerçek dosya adıyla harf harf karşılaştır.

Neden sorun?

Sunucunun dosya sistemi harfleri ayırabilir. Yanlış klasör, uzantı veya büyük harf tek bir dosyanın bulunamamasına yeter.

Nasıl önlenir?

  • Dosya adlarında tutarlı küçük harf kullan.
  • Network panelinde aranan tam URL’ye bak.
Yeni Başlayanlar Seviye: Başlangıç

#36 Formdaki düğmenin varsayılan gönderimini unutmak

Bir hesap düğmesi sayfayı beklenmedik biçimde yeniler.

#36 Formdaki düğmenin varsayılan gönderimini unutmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı HTML
<form>
  <button>Önizle</button>
</form>
Doğru HTML
<form>
  <button type="button">Önizle</button>
  <button type="submit">Gönder</button>
</form>

Günlük hayattan benzetme

Taslak düğmesiyle posta kutusuna gerçekten gönderen düğmeyi karıştırmak gibidir.

Nasıl fark edersin?

Tıklama sonrası URL, Network ve sayfa yenilenmesini izle.

Neden sorun?

Form içindeki türü belirtilmemiş button çoğu durumda submit davranışı gösterir. Her düğmenin amacını açıkça belirtmek olay akışını sadeleştirir.

Nasıl önlenir?

  • Göndermeyen düğmede type="button" kullan.
  • Gerçek gönderimde submit olayını ele al.
Yeni Başlayanlar Seviye: Başlangıç

#37 Süslü parantez bloğu ({ }) dışında değişkene erişmeye çalışmak (CS0103)

Derleyici “The name does not exist in the current context” hatası verir.

#37 Süslü parantez bloğu ({ }) dışında değişkene erişmeye çalışmak (CS0103) — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı C#
int puan = 85;
if (puan >= 50) {
    string sonuc = "Geçti";
}
// sonuc yalnızca if bloğunun içinde tanımlıdır:
Console.WriteLine(sonuc); // Hata CS0103
Doğru C#
int puan = 85;
string sonuc = "Kaldı";
if (puan >= 50) {
    sonuc = "Geçti";
}
Console.WriteLine(sonuc); // Geçti

Günlük hayattan benzetme

Sadece toplantı odasının beyaz tahtasına yazılan notu koridordan okumaya çalışmak gibidir; odadan çıkınca o nota erişemezsin.

Nasıl fark edersin?

Derleyicinin verdiği CS0103 veya cannot find symbol hatasındaki satır numarasına git; değişkenin hangi { } bloğu içinde tanımlandığına bak.

Neden sorun?

C#, Java ve JavaScript gibi dillerde süslü parantez { } içinde tanımlanan bir değişkenin yaşam alanı (scope) o parantez kapandığında biter. Dışarıdan erişilmek istenen değişken üst kapsamda tanımlanmalıdır.

Nasıl önlenir?

  • Hem if hem else sonrasında kullanacağın değişkeni bloktan önce tanımla.
  • Yazım hatası (büyük/küçük harf farkı) olup olmadığını da kontrol et; C# ve Java harf duyarlıdır.
Düzen & Performans Seviye: Başlangıç

#38 Aynı kodu kopyalayıp yapıştırmak

Bir şeyi değiştirmek istediğinde her yeri tek tek düzeltmen gerekir.

#38 Aynı kodu kopyalayıp yapıştırmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
print("Merhaba Ayşe, hoş geldin!")
print("Merhaba Mehmet, hoş geldin!")
print("Merhaba Zeynep, hoş geldin!")
Doğru Python
def selamla(isim):
    print(f"Merhaba {isim}, hoş geldin!")

for isim in ["Ayşe", "Mehmet", "Zeynep"]:
    selamla(isim)

Günlük hayattan benzetme

Aynı adresi 10 farklı deftere yazmak; taşındığında hepsini tek tek düzeltmek zorunda kalırsın.

Nasıl fark edersin?

Bir düzeltmeyi bir yerde yapıp diğer kopyaları unutursun; program bazı yerlerde eski gibi davranır.

Neden sorun?

Mesajı değiştirmek istediğinde tüm kopyaları bulman gerekir. Birini unutursan program tutarsız davranır.

Nasıl önlenir?

  • Tekrar eden kodu bir fonksiyona taşı.
  • Benzer işleri listeler ve döngülerle yap.
Düzen & Performans Seviye: Orta

#39 Döngünün içinde gereksiz iş yapmak

Aynı işi bin kez yapmak sayfayı yavaşlatır.

#39 Döngünün içinde gereksiz iş yapmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
for (let i = 0; i < 1000; i++) {
  // Aynı arama her turda yeniden yapılıyor
  const urunler = document.querySelectorAll(".urun");
  urunler[i]?.classList.add("goster");
}
Doğru JavaScript
// Arama bir kez yapılıyor
const urunler = document.querySelectorAll(".urun");

for (const urun of urunler) {
  urun.classList.add("goster");
}

Örneğin çalışma ortamı: Tarayıcı örneği: .urun sınıfına sahip DOM öğelerinin bulunduğu bir sayfada dene.

Günlük hayattan benzetme

Markete her ürün için ayrı ayrı gidip gelmek; tek seferde hepsini almak varken.

Nasıl fark edersin?

Veri büyüdükçe sayfa veya program belirgin şekilde yavaşlar.

Neden sorun?

Döngünün içindeki her satır, döngü kaç kez dönüyorsa o kadar çalışır. Değişmeyen bir işi içeride yapmak zaman kaybıdır.

Nasıl önlenir?

  • Döngü boyunca değişmeyen işleri döngünün dışına al.
  • Program yavaşsa önce döngülerin içine bak.
Düzen & Performans Seviye: Orta

#40 Hataları sessizce yutmak

Hatayı gizlemek onu çözmez, sadece bulmayı zorlaştırır.

#40 Hataları sessizce yutmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Python
try:
    dosya = open("ayarlar.txt")
except:
    pass
Doğru Python
from pathlib import Path
try:
    ayarlar = Path("ayarlar.txt").read_text(encoding="utf-8")
except FileNotFoundError:
    print("Dosya yok; varsayılan ayarlar kullanılacak.")
    ayarlar = ""

Günlük hayattan benzetme

Duman dedektörünün pilini, öttüğü için çıkarmak gibi.

Nasıl fark edersin?

Program hata vermez ama yanlış çalışır ve sorunun nereden çıktığını bulamazsın.

Neden sorun?

except: pass her türlü hatayı görmezden gelir. Program daha sonra anlamsız bir yerde bozulur ve asıl sebebi bulamazsın.

Nasıl önlenir?

  • Sadece beklediğin hatayı yakala (FileNotFoundError gibi).
  • Hata olduğunda ekrana ya da kayıt dosyasına anlaşılır bir mesaj yaz.
Düzen & Performans Seviye: Başlangıç

#41 fetch yanıtında HTTP hatasını kontrol etmemek

404 gelse de kod başarı yoluna devam edebilir.

#41 fetch yanıtında HTTP hatasını kontrol etmemek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
const r=await fetch("/veri.json");
const veri=await r.json();
Doğru JavaScript
const r=await fetch("/veri.json");
if (!r.ok) throw new Error(`HTTP ${r.status}`);
const veri=await r.json();

Örneğin çalışma ortamı: Tarayıcı modülü veya async işlev bağlamında çalışır. /veri.json sunucunda bulunmalıdır; örnek, HTTP hata kontrolünü gösterir.

Günlük hayattan benzetme

Kargo gelmiş olabilir ama kutunun içindeki belge “ürün bulunamadı” diyebilir.

Nasıl fark edersin?

Network panelinde durum koduna ve Response içeriğine bak.

Neden sorun?

fetch ağ hatalarında reddedilebilir ama HTTP 404 veya 500 yanıtları otomatik olarak başarısız Promise yapmaz. İçerik JSON değilse ayrıca ayrıştırma hatası oluşur.

Nasıl önlenir?

  • status veya ok değerini kontrol et.
  • Ağ hatası, HTTP durumu ve veri biçimini ayrı ele al.
Düzen & Performans Seviye: Başlangıç

#42 Flex veya Grid çocuğunun daralamamasını unutmak

Uzun uygulama adı kartı veya sayfayı taşır.

#42 Flex veya Grid çocuğunun daralamamasını unutmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı CSS
.liste { display:grid; grid-template-columns:1fr 1fr; }
.kart { white-space:nowrap; }
Doğru CSS
.liste { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); }
.kart { min-width:0; overflow-wrap:anywhere; }
@media(max-width:600px){ .liste { grid-template-columns:1fr; } }

Günlük hayattan benzetme

Küçük kutuya tek parça çok uzun bir cetvel koymaya çalışmak gibidir.

Nasıl fark edersin?

scrollWidth ile clientWidth farkını ve hangi çocuğun taşıdığını incele.

Neden sorun?

İçerikten gelen minimum genişlik ve satır kırılmaması, sütunun daralmasını engelleyebilir. İçeriği kesmek yerine kartın boyutlanmasını ve metnin sarılmasını birlikte düzelt.

Nasıl önlenir?

  • Uzun isim ve bağlantı örneği kullan.
  • 320px ve büyütülmüş metinle test et.
Düzen & Performans Seviye: Başlangıç

#43 Paketi başka Python yorumlayıcısına kurmak

Kurulum başarılı der ama import modülü bulamaz.

#43 Paketi başka Python yorumlayıcısına kurmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Terminal
pip install ornek-paket
python program.py
Doğru Terminal
python -m pip --version
python -c "import sys; print(sys.executable)"
# Gerekli paketi aynı yorumlayıcıyla kur:
# python -m pip install PAKET_ADI

Günlük hayattan benzetme

Bir sınıfa kitap bırakıp başka sınıfta aramak gibidir.

Nasıl fark edersin?

sys.executable ve pip yolunu aynı terminalde kontrol et.

Neden sorun?

Bilgisayarda birden fazla Python ve pip olabilir. Komutların çalışması aynı ortamı kullandıkları anlamına gelmez. Kurulum ve editör yorumlayıcısı eşleştirilmelidir.

Nasıl önlenir?

  • Sanal ortam kullan.
  • python -m pip ile yorumlayıcıya bağlı kurulum yap.
Düzen & Performans Seviye: Başlangıç

#44 CSS’te her sorunu !important ile çözmek

Bir kuralı düzeltirken sonraki değişikliği zorlaştırırsın.

#44 CSS’te her sorunu !important ile çözmek — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı CSS
.kart { color: red !important; }
.kart { color: blue; }
Doğru CSS
.kart { color: red; }
.kart.vurgulu { color: blue; }

Günlük hayattan benzetme

Bir toplantıda her cümleyi bağırarak söylemek öncelik sırasını anlaşılır yapmaz.

Nasıl fark edersin?

Tarayıcıda üstü çizili kuralı ve nedenini incele.

Neden sorun?

Bir kuralın kazanmasında köken, önem, katman, özgüllük ve kaynak sırası rol oynar. !important bazen gerekli olabilir ama nedenini anlamadan eklemek denetimi zorlaştırır.

Nasıl önlenir?

  • Computed ve Styles panellerinde kazanan kuralı bul.
  • Gereksiz tekrarları ve çok derin seçicileri azalt.
Düzen & Performans Seviye: Başlangıç

#45 Aynı olay dinleyicisini tekrar tekrar bağlamak

Tek tıklama birden fazla kayıt veya işlem üretir.

#45 Aynı olay dinleyicisini tekrar tekrar bağlamak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
function ac(){
  buton.addEventListener("click",()=>kaydet());
}
ac(); ac();
Doğru JavaScript
function kaydetHandler(){ kaydet(); }
buton.addEventListener("click",kaydetHandler);
// Bileşen kapanırken:
// buton.removeEventListener("click",kaydetHandler);

Örneğin çalışma ortamı: buton bir DOM öğesi, kaydet uygulamana ait işlevdir. Bileşenin kapanma akışında aynı işleyiciyi kaldıracak kodu da çalıştırmalısın.

Günlük hayattan benzetme

Bir zile her gün yeni kablo ekleyince tek basışta birçok zil çalar.

Nasıl fark edersin?

İşleyiciye sayaç koy; paneli birkaç kez açıp bir kez tıkla.

Neden sorun?

Her yeni anonim fonksiyon ayrı bir dinleyicidir. Tekrarlanan açılışlarda bağlamak, bir tıklamanın birden fazla işi çalıştırmasına yol açabilir.

Nasıl önlenir?

  • Dinleyiciyi yaşam döngüsünde bir kez bağla.
  • Kaldırmak için aynı fonksiyon referansını tut.
Düzen & Performans Seviye: Başlangıç

#46 İlişkili alt kayıtlar varken ana kaydı silmeye çalışmak (Foreign Key hatası)

Siparişi olan bir müşteriyi silmek istediğinde veritabanı işlemi reddeder.

#46 İlişkili alt kayıtlar varken ana kaydı silmeye çalışmak (Foreign Key hatası) — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı SQL
-- Müşterinin siparişleri varken doğrudan silmek:
DELETE FROM musteriler WHERE id = 10;
-- Hata: Cannot delete or update a parent row: a foreign key constraint fails
Doğru SQL
-- Seçenek 1: Kaydı tamamen silmek yerine pasife al (Soft Delete - Önerilen):
UPDATE musteriler SET aktif = 0 WHERE id = 10;

-- Seçenek 2: Gerçekten silinecekse önce bağlı alt kayıtları temizle:
DELETE FROM siparisler WHERE musteri_id = 10;
DELETE FROM musteriler WHERE id = 10;

Günlük hayattan benzetme

İçinde hâlâ kiracı oturan bir binayı tapudan düşürmeye çalışmak gibidir; önce bağlı sözleşmelerin durumu çözülmelidir.

Nasıl fark edersin?

Hata mesajında FOREIGN KEY constraint fails veya REFERENCE constraint ifadesini ve hangi tablonun engel olduğunu oku.

Neden sorun?

Yabancı anahtar (Foreign Key) kısıtlaması veri bütünlüğünü korur. Müşteriyi silersen o müşteriye ait siparişler “sahipsiz” (yetim kayıt) kalır; veritabanı bunu önlemek için silme işlemini durdurur.

Nasıl önlenir?

  • Gerçek projelerde müşteri veya ürün kayıtlarını DELETE ile silmek yerine aktif/silindi sütunuyla pasife almayı değerlendir.
  • Tablo tasarlarken ON DELETE RESTRICT veya ON DELETE CASCADE davranışını iş kuralına göre bilinçli seç.
Düzen & Performans Seviye: Başlangıç

#47 Veritabanı servisi kapalıyken veya yanlış portla bağlanmak

Uygulama “Connection refused”, “Port 3306” veya “Error 26” hatasıyla açılmaz.

#47 Veritabanı servisi kapalıyken veya yanlış portla bağlanmak — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Terminal
# MySQL veya SQL Server servisi çalışmıyorken uygulama başlatılır:
# Error: connect ECONNREFUSED 127.0.0.1:3306
# veya SQL Server Hata 26: Belirtilen sunucu/örnek bulunurken hata
Doğru Terminal
# 1. Servisin çalıştığını doğrula (MySQL 3306, MSSQL 1433 portunu kullanır)
# 2. Bağlantı dizesinde (Connection String) sunucu adı ve portu kontrol et:
# MySQL: Server=127.0.0.1;Port=3306;Database=okul_db;Uid=root;Pwd=...;
# MSSQL: Server=localhost\SQLEXPRESS;Database=OkulDB;Trusted_Connection=True;

Günlük hayattan benzetme

Kapalı bir mağazanın kapısını çalmak veya yanlış daire numarasına gitmek gibidir; içeride kimse yanıt vermez.

Nasıl fark edersin?

Hata mesajında ECONNREFUSED, Port 3306/1433 veya Error 26 geçiyorsa koddan önce veritabanı servisinin açık olup olmadığına bak.

Neden sorun?

Kodun doğru olsa bile arka planda veritabanı motoru (MySQL veya SQL Server servisi) çalışmıyorsa ya da farklı bir port/örnek adı (instance) dinliyorsa bağlantı kurulamaz.

Nasıl önlenir?

  • Uygulamayı çalıştırmadan önce MySQL Workbench, XAMPP veya SSMS ile veritabanına bağlanabildiğini doğrula.
  • Bağlantı ayarlarını kod içine gömmek yerine ortam değişkeni (.env veya appsettings.json) üzerinden oku.
Düzen & Performans Seviye: Başlangıç

#48 Java’da public class adı ile dosya adının uyuşmaması

Kod derlenmez veya çalışırken ClassNotFoundException / NoClassDefFoundError verir.

#48 Java’da public class adı ile dosya adının uyuşmaması — Hata ve çözüm görseli
Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Java
// Dosya adı: ogrenci.java (küçük harfle kaydedilmiş)
public class Ogrenci {
    public static void main(String[] args) {
        System.out.println("Merhaba Java");
    }
}
Doğru Java
// Dosya adı sınıf adıyla birebir aynı olmalı: Ogrenci.java
public class Ogrenci {
    public static void main(String[] args) {
        System.out.println("Merhaba Java");
    }
}

Günlük hayattan benzetme

Pasaporttaki isimle uçak biletindeki ismin farklı olması gibidir; güvenlik kontrolünden geçemezsin.

Nasıl fark edersin?

Derleme hatasında “class X is public, should be declared in a file named X.java” mesajını kontrol et.

Neden sorun?

Java derleyicisi (javac), public olarak işaretlenen her sınıfın kendisiyle birebir aynı adı (büyük/küçük harf dahil) taşıyan bir .java dosyasında bulunmasını zorunlu tutar. Ayrıca üstte package bildirimi varsa klasör yapısı da buna uymalıdır.

Nasıl önlenir?

  • Dosya adını ve public class adını her zaman BüyükDeveNotasyonu (PascalCase) ile birebir aynı yaz.
  • Komut satırında çalıştırırken javac Ogrenci.java ile derle, ardından uzantısız olarak java Ogrenci komutuyla çalıştır.
Yeni Başlayanlar Seviye: Başlangıç

#49 Python 'pip' veya 'python' komutu bulunamadı (PATH Hatası)

Windows veya macOS terminalinde "pip is not recognized" ya da "command not found: python" hatası ve kesin çözümü.

Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı Terminal
pip install requests
# 'pip' is not recognized as an internal or external command
Doğru Terminal
# Windows'ta py başlatıcısı ile çalıştır:
py -m pip install requests

# macOS / Linux'ta python3 ile çalıştır:
python3 -m pip install requests

Günlük hayattan benzetme

Telefon rehberine kaydetmediğin bir kişiyi sadece adıyla aramaya çalışmak gibidir; telefon numarayı bilmediği için kimi arayacağını bulamaz.

Nasıl önlenir?

  • Python kurulum ekranının ilk adımındaki "Add python.exe to PATH" kutucuğunu mutlaka işaretle.
  • Doğrudan pip yazmak yerine her zaman py -m pip veya python3 -m pip kullan.
Yeni Başlayanlar Seviye: Başlangıç

#50 VS Code Live Server açılmıyor veya sayfayı yenilemiyor

"Open a folder or workspace" uyarısı veya HTML kaydedildiğinde tarayıcının güncellenmemesi sorunu.

Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı HTML
<!-- <body> etiketi olmadan yazılan HTML -->
<h1>Merhaba Dünya</h1>
Doğru HTML
<!DOCTYPE html>
<html lang="tr">
<body>
  <h1>Merhaba Dünya</h1>
</body>
</html>

Neden sorun?

Live Server eklentisi iki şeye ihtiyaç duyar: VS Code'da tek bir dosya değil bir klasörün (File → Open Folder) açılmış olması ve HTML sayfasında kapanan bir </body> etiketinin bulunması.

Nasıl çözülür?

  • VS Code'da File → Open Folder ile projenin bulunduğu klasörü aç.
  • Boş HTML dosyasında ! yazıp Tab tuşuna basarak tam <body>...</body> iskeletini oluştur.
Yeni Başlayanlar Seviye: Başlangıç

#51 XAMPP "MySQL Shutdown Unexpectedly" (Port 3306) hatası

XAMPP kontrol panelinde MySQL'i başlatırken kırmızı hata verip hemen kapanması ve çözümü.

Hatalı örneği, çözümü ve kontrol adımlarını aç
Hata Mesajı XAMPP
Error: MySQL shutdown unexpectedly.
This may be due to a blocked port (3306), missing dependencies...
Çözüm (my.ini veya Servisler) Terminal / Config
# 1. Çözüm: Windows Hizmetler'de açık kalan MySQL80 servisini durdur:
net stop MySQL80

# 2. Çözüm: XAMPP > MySQL > Config > my.ini içinde portu 3307 yap:
port=3307

Neden olur?

Bilgisayara daha önce bağımsız MySQL Server kurulduysa arka plandaki MySQL80 servisi 3306 portunu zaten kullanıyordur. Aynı porta iki MySQL sunucusu bağlanamaz.

Adım adım çözüm

  • Görev Yöneticisi → Hizmetler sekmesinden MySQL80 hizmetini sağ tıklayıp Durdur de.
  • Veya XAMPP'ta MySQL satırındaki Config → my.ini dosyasını açıp 3306 yazan yerleri 3307 olarak kaydet.
Yeni Başlayanlar Seviye: Başlangıç

#52 JavaScript "Cannot read properties of null (reading 'addEventListener')"

Tarayıcı konsolunda en sık karşılaşılan TypeError hatası: HTML elemanı henüz yüklenmeden veya yanlış seçiciyle erişmeye çalışmak.

Hatalı örneği, çözümü ve kontrol adımlarını aç
Hatalı JavaScript
// Eleman sayfada yoksa querySelector null döndürür:
const buton = document.querySelector("#kaydet-butonu");
buton.addEventListener("click", kaydet);
// TypeError: Cannot read properties of null
Doğru JavaScript
// <script defer src="app.js"> kullan ve elemanı kontrol et:
const buton = document.querySelector("#kaydet-butonu");
buton?.addEventListener("click", kaydet);

Neden olur?

Ya <script> etiketi <head> içinde defer olmadan çalıştığı için HTML henüz çizilmemiştir ya da yazdığın #id / .class adı HTML'dekiyle uyuşmuyordur.

Nasıl önlenir?

  • Script etiketine her zaman defer ekle: <script defer src="script.js"></script>.
  • Eleman her sayfada olmayabilirse buton?.addEventListener(...) (optional chaining) kullan.

Hata yapmak öğrenmenin parçası

Her yazılımcı hata yapar. Önemli olan hatayı okuyup anlamak. Takıldığın bir hata mesajını yapay zekaya sormak için hazır komutlarımızı kullanabilirsin.

Yazılım komutlarına git →