66 puan yazan GN⁺ 2025-08-18 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Geliştiricilerin sıkça düştüğü sezgisel olmayan tuzaklar derlenerek, ortaya çıkması kolay hataların nedenleri tanıtılıyor
  • HTML, CSS, Unicode/metin kodlaması, kayan nokta, zaman gibi çeşitli teknolojilerde sık yaşanan sorunlar ele alınıyor
  • Her dil ve framework'te sözdizimi ve davranıştaki ince farklar nedeniyle yanlış anlama veya hataların oluşabileceği vurgulanıyor
  • Eşzamanlılık, ağ iletişimi, veritabanı gibi backend'in temel alanlarında gerçek üretim ortamında ortaya çıkabilecek tuzaklar örneklerle açıklanıyor
  • Çeşitli örnekler ve referans bağlantılarıyla sorun durumları, çözüm yolları ve beklenmedik davranışların nasıl iyileştirilebileceği anlatılıyor

HTML ve CSS

  • Flexbox/Grid'de varsayılan min-width değeri

    • min-width varsayılan olarak auto
    • min-width: auto, içerik boyutuna göre belirlenir ve flex-shrink, overflow: hidden, width: 0, max-width: 100% ayarlarına göre önceliklidir
    • Öneri: min-width: 0 açıkça belirtin
  • CSS'te yatay ve dikey farkı

    • width: auto üst öğenin alanını doldurmaya çalışır, height: auto ise içeriğe uyum sağlar
    • inline, inline-block, float öğelerinde width: auto genişlemez
    • margin: 0 auto yatay ortalama sağlar, margin: auto 0 ise dikey ortalama yapmaz (ancak flex-direction: column durumunda dikey ortalama mümkündür)
    • Margin collapsing yalnızca dikey yönde olur
    • writing-mode: vertical-rl gibi yerleşim yönü değişirse davranış da tersine döner
  • Block Formatting Context (BFC)

    • display: flow-root ile BFC oluşturulur (overflow: hidden/auto/scroll, display: table vb. ile de mümkündür ancak yan etkileri vardır)
    • Dikey bitişik kardeş öğelerin margin'lerinin çakışması veya çocuk öğe margin'lerinin üst öğe dışına taşması BFC ile önlenebilir
    • Üst öğe yalnızca float çocuklar içeriyorsa yüksekliği 0'a çöker → BFC ile düzeltilebilir
    • border ya da padding varsa margin collapsing oluşmaz
  • Stacking Context

    • Yeni bir stacking context oluşturan koşullar
      • transform, filter, perspective, mask, opacity gibi render özellikleri
      • position: fixed veya sticky
      • z-index belirtilmiş olması + absolute/relative konumlandırma
      • z-index belirtilmiş olması + flexbox/grid içindeki öğe
      • isolation: isolate
    • Özellikleri
      • z-index yalnızca stacking context içinde geçerlidir
      • position: absolute/fixed koordinatları en yakın positioned ata öğeye göre belirlenir
      • sticky, stacking context'i aşarak çalışmaz
      • overflow: visible olsa bile stacking context nedeniyle kırpılabilir
      • background-attachment: fixed, stacking context'e göre yerleştirilir
  • Viewport birimleri

    • Mobil tarayıcıda adres çubuğu/navigasyon çubuğu kaydırma sırasında ekrandan kaybolursa 100vh değeri değişir
    • Güncel çözüm: 100dvh kullanın
  • Absolute Position referansı

    • position: absolute, ebeveyne değil, en yakın relative/absolute ya da stacking context ata öğeye göre konumlanır
  • Blur davranışı

    • backdrop-filter: blur, çevredeki öğeleri dikkate almaz
  • Float'ın etkisiz kalması

    • Üst öğe flex veya grid ise çocuk öğenin float özelliği etkisizdir
  • Yüzdelik width/height birimleri

    • Üst öğenin boyutu önceden belirlenmemişse çalışmaz (döngüsel referansı önlemek için)
  • Inline öğe özellikleri

    • display: inline, width, height, margin-top, margin-bottom değerlerini yok sayar
  • Whitespace işleme

    • HTML'de satır sonları varsayılan olarak boşluk kabul edilir, art arda gelen boşluklar teke indirilir
    • <pre> boşluk daraltmayı engeller ancak başlangıç/bitiş kısmındaki davranışı özeldir
    • Çoğu içeriğin başındaki/sonundaki boşluk yok sayılır ama <a> istisnadır
    • inline-block öğeler arasındaki boşluk/satır sonu gerçek aralık olarak gösterilir (flex/grid'de bu olmaz)
  • text-align

    • Metin ve inline öğelerin hizalanmasında uygulanır, ancak block öğeleri hizalamaz
  • box-sizing

    • Varsayılan değer content-box → padding/border dahil edilmez
    • width: 100% + padding ayarlandığında üst öğenin alanı aşılabilir
    • Çözüm: box-sizing: border-box
  • Cumulative Layout Shift

    • <img> için width ve height öznitelikleri belirtilmezse, görsel yüklemesi geciktiğinde yerleşim kayması oluşur
    • Öneri: CLS'yi önlemek için bu öznitelikleri belirtin
  • Chrome'da dosya indirme ağ isteği

    • DevTools ağ panelinde görünmez (ayrı bir sekmede işlenir)
    • Analiz gerekiyorsa chrome://net-export/ kullanın
  • HTML içinde JavaScript ayrıştırma sorunu

    • <script>console.log('</script>')</script> gibi bir durumda ilk </script> kapanış etiketi olarak algılanır
    • Referans: Safe JSON in script tags

Unicode ve metin kodlaması

  • Kod noktaları ve grapheme cluster'lar

    • Grapheme cluster, GUI'deki "karakter birimi"dir
    • Görünür ASCII karakterlerinde 1 kod noktası = 1 grapheme cluster
    • Emoji, birden fazla kod noktasından oluşan tek bir grapheme cluster olabilir
    • UTF-8'de kod noktası 1~4 bayttır; bayt sayısıyla kod noktası sayısı aynı değildir
    • UTF-16'da kod noktası 2 bayt veya 4 bayt olabilir (surrogate pair)
    • Standart, cluster içindeki kod noktası sayısına sınır koymaz; ancak implementasyonlarda performans nedeniyle sınırlar bulunabilir
  • Dillere göre string davranışı farkları

    • Rust: Dahili string yapısı UTF-8 kullanır, len() bayt sayısını verir, doğrudan indeksleme yapılamaz, chars().count() kod noktası sayısını verir, UTF-8 geçerliliği sıkı biçimde doğrulanır
    • Golang: String fiilen bir bayt dizisidir; uzunluk ve indeksleme bayt düzeyindedir, çoğunlukla UTF-8 kullanılır
    • Java, C#, JS: UTF-16 tabanlıdır, uzunluk 2 bayt birimleriyle ölçülür, indeksleme de 2 bayt birimleriyle yapılır, surrogate pair vardır
    • Python: len() kod noktası sayısını döndürür, indeksleme ise tek bir kod noktasını içeren string döndürür
    • C++: std::string için kodlama kısıtı yoktur, bir bayt vektörü gibi davranır, uzunluk/indeksleme bayt düzeyindedir
    • Bahsedilen diller arasında grapheme cluster düzeyinde uzunluk/indeksleme yapan bir dil yoktur
  • BOM (Byte Order Mark)

    • Bazı metin dosyalarında BOM bulunur; örneğin EF BB BF → UTF-8 kodlamasını gösterir
    • Daha çok Windows'ta kullanılır; Windows dışı yazılımlar BOM'u işleyemeyebilir
  • Diğer dikkat edilmesi gerekenler

    • İkili veri dizeye dönüştürülürken, hatalı kısımlar � (U+FFFD) ile değiştirilir
    • Confusable characters vardır (birbirine benzer görünen karakterler)
    • Normalleştirme (Normalization): Örn. é, U+00E9 (tek kod noktası) veya U+0065+U+0301 (iki kod noktası) olarak ifade edilebilir
    • Zero-width characters ve Invisible characters vardır
    • Satır sonu farkı: Windows CRLF \r\n, Linux/MacOS ise LF \n kullanır
    • Han unification: Dillere göre şekli biraz farklı olan karakterler aynı kod noktasını kullanır
      • Yazı tipi, dile özgü varyantları içererek uygun şekilde render eder
      • Uluslararasılaştırmada doğru yazı tipi varyantını seçmek gerekir

Kayan nokta (Floating point)

  • NaN özellikleri

    • NaN, kendisi dahil hiçbir değerle eşit değildir (NaN == NaN her zaman false olur)
    • NaN != NaN her zaman true olur
    • NaN içeren işlemlerin sonucu çoğunlukla NaN olarak yayılır
  • Özel değerler

    • +Inf ve -Inf vardır, NaN'den farklıdır
    • -0.0, +0.0'dan ayrı bir değerdir
      • Karşılaştırma işlemlerinde aynı kabul edilir, ancak bazı hesaplamalarda farklı davranır
      • Örn: 1.0 / +0.0 == +Inf, 1.0 / -0.0 == -Inf
  • JSON ile uyumluluk

    • JSON standardı NaN ve Inf'e izin vermez
      • JS JSON.stringify, NaN ve Inf'i nulla dönüştürür
      • Python json.dumps(...), NaN ve Infinity'yi olduğu gibi yazar (standart ihlali)
        • allow_nan=False seçeneğinde NaN/Inf varsa ValueError oluşur
      • Golang json.Marshal, NaN/Inf varsa hata döndürür
  • Hassasiyet sorunları

    • Kayan noktalı sayıları doğrudan karşılaştırmak başarısız olabilir → abs(a - b) < ε biçimi önerilir
    • JS tüm sayıları kayan noktalı sayı olarak işler
      • Güvenli tamsayı aralığı -(2^53 - 1) ~ 2^53 - 1
      • Bu aralığın dışına çıkıldığında tamsayı gösterimi hatalı olur
      • Büyük tamsayılar için BigInt kullanılması önerilir
      • JSON'da güvenli aralığı aşan tamsayılar varsa, JSON.parse sonucu elde edilen değer hatalı olabilir
      • Milisaniye tabanlı zaman damgaları 287.396 yıla kadar güvenlidir, nanosaniye tabanlı olanlarda sorun çıkar
  • İşlem kurallarının geçerli olmaması

    • İşlem sırasına bağlı hassasiyet kaybı nedeniyle birleşme ve dağılım özellikleri tam anlamıyla geçerli olmaz
    • Paralel işlemler (matris çarpımı, toplam vb.) deterministik olmayan sonuçlar üretebilir
  • Performans

    • Bölme, çarpmadan çok daha yavaştır
    • Aynı sayıya birden çok kez bölünüyorsa, önce tersi alınıp çarpma yapılarak optimizasyon sağlanabilir
  • Donanıma bağlı farklar

    • FMA (Fused Multiply-Add) desteği: Bazı donanımlar ara hesapları daha yüksek hassasiyetle yapar
    • Subnormal range işleme: Modern donanımlar destekler, ancak bazı eski sistemler bunu 0 olarak işler
    • Yuvarlama modu farkları
      • RNTE (en yakın çift sayıya yuvarlama), RTZ (0'a doğru kesme) gibi modlar vardır
      • x86/ARM'de thread-local mutable durum olarak ayarlanabilir
      • GPU'larda yuvarlama modu komut düzeyinde farklıdır
    • Trigonometrik fonksiyonlar, logaritma gibi matematiksel fonksiyonların davranışı farklı olabilir
    • x86'da eski 80 bit FPU ve per-core rounding mode bulunur → kullanılması önerilmez
    • Bunlar dışında da çeşitli etkenler nedeniyle donanıma göre kayan nokta sonuçları değişebilir
  • Hassasiyeti artırma yöntemleri

    • Hesaplama grafiğini sığ tutun (ardışık çarpma yapısını azaltın)
    • Ara değerlerin aşırı büyük veya aşırı küçük olmasından kaçının
    • FMA gibi donanımsal işlemlerden yararlanın

Zaman (Time)

  • Artık saniye (Leap second)

    • Unix zaman damgası artık saniyeleri yok sayar
    • Artık saniye olduğunda, çevresindeki aralıkta zaman uzatılır veya kısaltılır (Leap smear)
  • Saat dilimi (Time zone)

    • UTC ve Unix zaman damgası dünya genelinde ortaktır
    • İnsanın okuduğu saat bilgisi bölgesel saat dilimine bağlıdır
    • Veritabanında zaman damgası saklayıp UI katmanında dönüştürmek önerilir
  • Yaz saati uygulaması (DST)

    • Bazı bölgelerde yaz aylarında saatler 1 saat ayarlanır
  • NTP senkronizasyonu

    • Senkronizasyon sırasında zamanın "geri gitmesi" durumu yaşanabilir
  • Sunucu saat dilimi ayarı

    • Sunucunun UTC olarak ayarlanması önerilir
    • Dağıtık sistemlerde düğümlerin saat dilimleri farklıysa sorun çıkar
    • Sistem saat dilimi değiştirildikten sonra veritabanının yeniden yapılandırılması veya yeniden başlatılması gerekir
  • Donanım saati vs sistem saati

    • Donanım saatinde saat dilimi kavramı yoktur
    • Linux: donanım saatini UTC olarak ele alır
    • Windows: donanım saatini yerel saat olarak ele alır

Java

  • == nesne referanslarını karşılaştırır; nesne içeriğini karşılaştırmak için .equals kullanmak gerekir
  • equals ve hashcode override edilmezse, map/set içinde nesne eşdeğerliği referans temelli değerlendirilir
  • Bir map'in key nesnesinin veya bir set öğesi nesnesinin içeriği değiştirilirse konteyner davranışı bozulur
  • List<T> döndüren metotlar duruma göre mutable ArrayList veya immutable Collections.emptyList() döndürebilir; ikincisini değiştirmeye çalışınca UnsupportedOperationException oluşur
  • Optional<T> döndüren metotların null döndürdüğü durumlar vardır (önerilmez)
  • finally bloğunda return yapılırsa, try veya catch içinde oluşan exception yok sayılır ve finally dönüş değeri uygulanır
  • interrupt'ı yok sayan kütüphaneler vardır; IO içeren sınıf başlatma süreci interrupt nedeniyle bozulabilir
  • Thread pool'da .submit() ile verilen task'lerin exception'ları varsayılan olarak log'a yazılmaz, yalnızca future üzerinden görülebilir; future yok sayılırsa exception da görülemez
    • scheduleAtFixedRate işleri exception oluştuğunda sessizce durur
  • Sayı literal'i 0 ile başlıyorsa sekizlik sayı olarak işlenir (0123 → 83)
  • Debugger, yerel değişkenlerin .toString() metodunu çağırır; bazı sınıfların toString() metodunda yan etki bulunduğundan debug sırasında kod davranışı değişebilir (IDE'de devre dışı bırakılabilir)

Golang

  • append(), capacity uygunsa belleği yeniden kullanır; subslice'a append yapmak üst dilimin belleğinin de üzerine yazabilir
  • defer, blok scope'u bittiğinde değil, fonksiyon return ettiğinde çalışır
  • defer, mutable değişkenleri capture eder
  • nil ile ilgili
    • nil slice ile empty slice farklıdır
    • string nil olamaz, yalnızca boş dize olabilir
    • nil map'ten okuma yapılabilir ama yazma yapılamaz
    • interface nil davranışının bir tuhaflığı vardır: data pointer null olsa bile type info null değilse nil ile eşit değildir
  • Dead wait: Go'da gerçek eşzamanlılık hatası örnekleri vardır
  • Timeout türleri çeşitlidir; net/http içinde ayrıntılı biçimde ele alınır

C/C++

  • std::vector öğe işaretçilerini sakladıktan sonra vector büyürse yeniden tahsis gerçekleşir, işaretçiler geçersiz hale gelir
  • literal string ile oluşturulan std::string geçici bir nesne olabilir; c_str() çağrıldığında risklidir
  • yineleme sırasında container değiştirilirse iterator geçersiz hale gelir
  • std::remove gerçekte silme yapmaz, öğeleri yeniden düzenler; silmek için erase gerekir
  • sayısal literal 0 ile başlıyorsa sekizlik sayı olarak işlenir (0123 → 83)
  • Undefined behavior (UB): optimizasyon sürecinde UB serbestçe değiştirilebilir, bu yüzden buna bağımlı olmak tehlikelidir
    • başlatılmamış belleğe erişim UB'dir
    • char*'ı struct işaretçisine dönüştürürken nesne ömrü başlamadan önce erişim UB'dir, memcpy ile başlatma önerilir
    • hatalı bellek erişimi (null işaretçi vb.) UB'dir
    • tamsayı overflow/underflow UB'dir (unsigned türlerde 0'ın altına underflow olabilir)
    • Aliasing: farklı türde işaretçiler aynı belleği gösterirse strict aliasing rule nedeniyle UB oluşur
      • istisnalar: 1) kalıtım ilişkisine sahip türler 2) char*, unsigned char*, std::byte* dönüşümü (ters dönüşüm için geçerli değildir)
      • zorunlu dönüşüm için memcpy veya std::bit_cast önerilir
    • hizasız bellek erişimi UB'dir
  • Bellek hizalaması
    • 64 bit tamsayıların adresi 8'e tam bölünebilmelidir
    • ARM üzerinde hizasız erişim crash'e neden olabilir
    • bir byte buffer'ını doğrudan struct olarak yorumlamak hizalama sorunlarına yol açar
    • hizalama, struct padding oluşturarak bellek israfına neden olabilir
    • bazı SIMD komutları (AVX vb.) yalnızca hizalanmış veriyi işleyebilir; genellikle 32 byte hizalama gerekir

Python

  • fonksiyon varsayılan argümanları her çağrıda yeniden oluşturulmaz; ilk değer olduğu gibi saklanır

SQL Databases

  • Null işleme

    • x = null çalışmaz, x is null kullanılmalıdır
    • Null kendisine eşit değildir (NaN'e benzer)
    • Unique index, Null tekrarına izin verir (ancak Microsoft SQL Server istisnadır)
    • select distinct içinde Null'un nasıl işlendiği veritabanına göre değişir
    • count(x) ve count(distinct x), Null değeri olan satırları yok sayar
  • Genel davranış

    • tarihin örtük dönüşümü timezone'a bağlı olabilir
    • karmaşık join + distinct, iç içe sorgulardan daha yavaş olabilir
    • MySQL(InnoDB)'de string alanı utf8mb4 değilse 4 byte UTF-8 karakter eklenirken hata oluşur
    • MySQL(InnoDB) varsayılan olarak büyük/küçük harf duyarsızdır
    • MySQL(InnoDB) örtük dönüşüme izin verir: select '123abc' + 1; → 124
    • MySQL(InnoDB) gap lock, deadlock'a neden olabilir
    • MySQL(InnoDB)'de group by ile select sütunları uyuşmazsa deterministik olmayan sonuç döner
    • SQLite'ta strict değilse alan türünün pek anlamı yoktur
    • Foreign key, örtük lock oluşturarak deadlock'a neden olabilir
    • Locking, veritabanına bağlı olarak repeatable read isolation'ı bozabilir
    • dağıtık SQL veritabanları locking'i desteklemeyebilir veya alışılmadık davranış gösterebilir (veritabanına göre değişir)
  • Performans/operasyon

    • N+1 query sorunu, her sorgu hızlı olduğu için slow query log'da görünmez
    • uzun süre çalışan transaction'lar lock sorunları vb. yaratır → transaction'ların hızlı bitirilmesi önerilir
    • tüm tabloyu lock'lama örnekleri
      • MySQL 8.0+'da unique index/foreign key eklerken çoğu durumda eşzamanlı işlem mümkündür
      • eski MySQL sürümlerinde tüm tablo lock'u oluşabilir
      • mysqldump içinde --single-transaction seçeneği yoksa tüm tablo için read lock alınır
      • PostgreSQL'de create unique index veya alter table ... add foreign key, tüm tablo için read lock oluşturur
        • kaçınma yöntemi: create unique index concurrently kullanın
        • foreign key için ... not valid ardından validate constraint yöntemi kullanılır
  • Range sorguları

    • Çakışmayan aralıklar:
      • basit koşul p >= start and p <= end verimsizdir (bileşik indeks olsa bile)
      • verimli yöntem:
        select *   
        from (select ... from ranges where start <= p order by start desc limit 1)   
        where end >= p  
        
        (yalnızca start sütunu indeksi gerekir)
    • Çakışabilen aralıklar:
      • normal B-tree indeksiyle verimsizdir
      • MySQL için spatial index, PostgreSQL için GiST önerilir

Concurrency and Parallelism

  • volatile

    • volatile, lock'un yerini tutamaz ve atomicity sağlamaz
    • lock ile korunan veride volatile gerekmez (lock, memory order garantisi verir)
    • C/C++: volatile yalnızca bazı optimizasyonları engeller, memory barrier eklemez
    • Java: volatile erişimi sequentially-consistent ordering sağlar (gerekirse JVM memory barrier ekler)
    • C#: volatile erişimi release-acquire ordering sağlar (gerekirse CLR memory barrier ekler)
    • bellek okuma/yazma yeniden sıralamasıyla ilgili hatalı optimizasyonları önleyebilir
  • TOCTOU (Time-of-check to time-of-use) problemi

  • SQL veritabanlarında uygulama katmanı kısıt işleme

    • basit bir unique index ile ifade edilemeyen kısıtlar (ör. iki tablo arasında benzersizlik, koşullu benzersizlik, belirli bir süre içinde benzersizlik) uygulamada zorlanıyorsa:
      • MySQL(InnoDB): repeatable read seviyesinde select ... for update sonrası insert ve unique sütunda indeks varsa gap lock sayesinde geçerlidir (ancak gap lock yüksek yük altında deadlock'a neden olabilir → deadlock detection ve retry gerekir)
      • PostgreSQL: repeatable read seviyesinde aynı mantık eşzamanlılık durumlarında yetersizdir (write skew problemi)
        • çözüm yolları:
          • serializable isolation level kullanın
          • uygulama yerine veritabanı kısıtlarını kullanın
            • koşullu benzersizlik → partial unique index
            • iki tablo arasında benzersizlik → ayrı bir tabloya yinelenen veriyi ekleyip unique index kullanın
            • zaman aralığı dışlayıcılığı → range type + exclude constraint
  • Atomic reference counting

    • Arc, shared_ptr gibi yapılarda çok sayıda thread aynı sayacı sık sık değiştirirse performans düşer
  • Read-write lock

    • bazı uygulamalar read lock'tan write lock'a yükseltmeyi desteklemez
    • read lock tutulurken write lock denenirse deadlock oluşabilir

Birçok dilde ortak

  • Null/None/nil kontrolünün atlanması yaygın bir hata nedenidir
  • Döngü sırasında konteyner değiştirilirse tek iş parçacıklı veri yarışı oluşabilir
  • Değiştirilebilir veri paylaşımı hatası: Örn.) Python'da [[0] * 10] * 10 doğru bir 2D dizi oluşturmaz
  • (low + high) / 2 taşmaya neden olabilir → güvenli yöntem low + (high - low) / 2
  • Kısa devre değerlendirmesi (short circuit): a() || b() ifadesinde a true ise b çalışmaz, a() && b() ifadesinde a false ise b çalışmaz
  • Profiler varsayılan olarak yalnızca CPU time içerir → DB beklemesi gibi durumlar flamegraph'ta görünmez ve yanlış yorumlara yol açabilir
  • Regular expression dialect dillere göre farklıdır → JS'de çalışan bir regex Java'da çalışmayabilir

Linux and bash

  • Dizin değiştirildikten sonra pwd özgün yolu gösterir, gerçek yol için pwd -P kullanılır
  • cmd > file 2>&1 → stdout+stderr birlikte dosyaya, cmd 2>&1 > file → yalnızca stdout dosyaya, stderr olduğu gibi kalır
  • Dosya adları büyük/küçük harfe duyarlıdır (Windows'tan farklı olarak)
  • Çalıştırılabilir dosyalar için bir capability sistemi vardır (getcap ile kontrol edilebilir)
  • Unset değişken riski: DIR unset ise rm -rf $DIR/rm -rf / çalıştırma riski doğurur → set -u ile önlenebilir
  • Ortamı uygulama: Bir script'i mevcut shell'e uygulamak için source script.sh kullanılır → kalıcı uygulamak için ~/.bashrc içine ekleyin
  • Bash'te komut önbellekleme vardır: $PATH içindeki dosya taşınırsa ENOENT oluşabilir → hash -r ile önbelleği yenileyin
  • Değişkenler tırnaksız kullanıldığında satır sonları boşluk olarak işlenir
  • set -e: Script hata verdiğinde hemen çıkar, ancak koşul ifadelerinin içinde (||, &&, if) çalışmaz
  • K8s livenessProbe ile debugger çakışması: Breakpoint debugger tüm uygulamayı durdurur ve health check yanıtı başarısız olur → Pod sonlandırılabilir

React

  • Render kodunda state'i doğrudan değiştirmek
  • Hook'ları if/loop içinde kullanmak → kural ihlali
  • useEffect dependency array'inde gerekli değerleri eksik bırakmak
  • useEffect içinde clean up kodunu atlamak
  • Closure trap: Eski state'in yakalanması nedeniyle bug oluşması
  • Veriyi yanlış yerde değiştirmek → impure component
  • useCallback kullanmamak → gereksiz yeniden render tetiklenmesi
  • Memo'lanmış bir componente memo'lanmamış değer vermek memo optimizasyonunu etkisiz kılar

Git

  • Rebase, geçmişi yeniden yazar

    • rebase sonrası normal push çakışır → mutlaka force push gerekir
    • remote branch geçmişi değiştiğinde pull için de --rebase kullanılmalı
    • --force-with-lease bazı durumlarda başka geliştiricilerin commit'lerinin üzerine yazılmasını önleyebilir, ancak yalnızca fetch yapıp pull yapmazsanız bu koruma çalışmaz
  • Merge revert sorunu

    • Merge revert etkisi tam değildir → aynı branch tekrar merge edilirse hiçbir değişiklik olmaz
    • Çözüm: revert'ün revert'ünü yapmak veya daha temiz bir yöntem kullanmak (backup → reset → cherry-pick → force push)
  • GitHub ile ilgili dikkat edilmesi gerekenler

    • API anahtarı gibi bir secret commit edildikten sonra force push ile üzerine yazılsa bile GitHub'da kaydı kalır
    • private repo A'dan fork'lanan B private olsa bile, A public olursa B'nin içeriği de açığa çıkar (silindikten sonra bile erişilebilir)
  • git stash pop: conflict oluşursa stash drop edilmez

  • .DS_Store macOS tarafından otomatik oluşturulur → .gitignore içine **/.DS_Store eklenmesi önerilir

Networking

  • Bazı router ve firewall'lar boşta kalan TCP bağlantılarını sessizce keser → HTTP istemcisi ve DB istemcisinin connection pool'u geçersiz hale gelebilir → çözüm: TCP keepalive ayarı
  • traceroute sonuçları çok güvenilir değildir → bazı durumlarda tcptraceroute daha kullanışlı olabilir
  • TCP slow start gecikme artışının nedeni olabilir → tcp_slow_start_after_idle devre dışı bırakılarak çözülebilir
  • TCP sticky packet sorunu: Nagle algoritması paket gönderimini geciktirir → TCP_NODELAY etkinleştirilerek çözülebilir
  • Backend'i Nginx arkasına yerleştirirken connection reuse ayarı gerekir → ayarlanmazsa yüksek yük altında iç portların tükenmesi nedeniyle bağlantı hatası oluşabilir
  • Nginx varsayılan olarak paket buffering yapar → SSE(EventSource) gecikmesine yol açar
  • HTTP standardı GET ve DELETE isteklerinde body'yi yasaklamaz → bazıları body kullanır, ancak birçok kütüphane ve sunucu bunu desteklemez
  • Tek bir IP üzerinde birden fazla web sitesi barındırılabilir → ayrımı HTTP Host header'ı ile TLS'nin SNI özelliği yapar → yalnızca IP ile erişilemeyen siteler olabilir
  • CORS: Farklı bir origin'e istek gönderildiğinde tarayıcı yanıt erişimini engeller → sunucuda Access-Control-Allow-Origin header'ı ayarlanmalıdır
    • Cookie iletimini de içeriyorsa ek ayarlar gerekir
    • Frontend ve backend aynı domain ve portu kullanıyorsa CORS sorunu olmaz

Other

  • YAML dikkat noktaları

    • YAML boşluğa duyarlıdırkey:value hatalıdır, key: value doğrudur
    • NO ülke kodu tırnaksız yazılırsa false olarak yorumlanabilir
    • Git commit hash'i tırnaksız yazılırsa sayıya dönüştürülebilir
  • Excel CSV sorunu

    • Excel CSV açarken otomatik dönüştürme uygular
      • Tarih dönüşümü: 1/2, 1-22-Jan
      • Büyük sayıların hatalı dönüşümü: 1234567890123456789012345678901234500000
    • Bunun nedeni Excel'in sayıları dahili olarak floating point biçiminde işlemesidir
    • Bu sorun nedeniyle gen adı SEPT1'in yanlış değiştirilmiş olduğu vakalar vardır

Henüz yorum yok.

Henüz yorum yok.