<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-08-01T10:13:22+00:00</updated><id>https://sonsuzus.github.io/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">1NF, 2NF ve 3NF ile Veritabanı Normalizasyonu</title><link href="https://sonsuzus.github.io/posts/1nf-2nf-ve-3nf-ile-veritabani-normalizasyonu/" rel="alternate" type="text/html" title="1NF, 2NF ve 3NF ile Veritabanı Normalizasyonu" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/1nf-2nf-ve-3nf-ile-veritabani-normalizasyonu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/1nf-2nf-ve-3nf-ile-veritabani-normalizasyonu/"><![CDATA[<p>Bir veritabanı ilk bakışta düzenli görünebilir; fakat müşteri adı onlarca satırda tekrarlanıyor, bir ürünün fiyatını değiştirmek için yüzlerce kayıt güncelleniyorsa masanın altında veri canavarları saklanıyor demektir. Normalizasyon, tabloları belirli kurallara göre parçalayarak veri tekrarını azaltan, ilişkileri netleştiren ve veri bütünlüğünü koruyan sistematik bir tasarım yaklaşımıdır.</p>

<p>``</p>

<h2 id="normalizasyon-neden-gereklidir">Normalizasyon neden gereklidir?</h2>

<p>Normalizasyonun merkezinde <strong>fonksiyonel bağımlılık</strong> bulunur. Bir $X$ niteliği, $Y$ niteliğini tekil biçimde belirliyorsa bu ilişki $X \rightarrow Y$ şeklinde gösterilir. Örneğin <code class="language-plaintext highlighter-rouge">MusteriID</code>, müşterinin adını belirliyorsa:</p>

\[MusteriID \rightarrow MusteriAdi\]

<p>Aynı müşteri adı her sipariş satırında saklanırsa gereksiz tekrar oluşur. Basit bir tekrar oranı şöyle düşünülebilir:</p>

\[Tekrar\ Oranı = \frac{Toplam\ Yinelenen\ Değer}{Toplam\ Kayıt}\]

<p>Bu oran büyüdükçe depolama maliyeti ve tutarsızlık ihtimali artar. Kötü tasarlanmış tablolar üç temel anomali üretir:</p>

<table>
  <thead>
    <tr>
      <th>Anomali</th>
      <th>Ne olur?</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ekleme</td>
      <td>Başka bir bilgi olmadan kayıt eklenemez</td>
      <td>Siparişi olmayan ürün kaydedilemez</td>
    </tr>
    <tr>
      <td>Güncelleme</td>
      <td>Aynı bilgi birçok yerde değiştirilir</td>
      <td>Müşteri adresi bazı satırlarda eski kalır</td>
    </tr>
    <tr>
      <td>Silme</td>
      <td>Bir kayıt silinirken değerli bilgi de kaybolur</td>
      <td>Son sipariş silinince müşteri bilgisi yok olur</td>
    </tr>
  </tbody>
</table>

<h2 id="birinci-normal-form-1nf">Birinci Normal Form: 1NF</h2>

<p>Bir tablo 1NF düzeyindeyse her hücre <strong>atomik</strong>, yani bölünemez tek bir değer taşır. Tek hücrede <code class="language-plaintext highlighter-rouge">Klavye, Fare, Monitör</code> gibi bir ürün listesi bulunmamalıdır. Ayrıca satırlar birincil anahtarla ayırt edilmelidir.</p>

<table>
  <thead>
    <tr>
      <th>1NF öncesi</th>
      <th>1NF sonrası</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">SiparisID: 10, Urunler: Fare, Klavye</code></td>
      <td>Her ürün ayrı sipariş satırındadır</td>
    </tr>
    <tr>
      <td>Tek hücrede çoklu telefon</td>
      <td>Telefonlar ayrı satır veya tabloda tutulur</td>
    </tr>
  </tbody>
</table>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">SiparisKalemi</span> <span class="p">(</span>
    <span class="n">SiparisID</span> <span class="nb">INT</span><span class="p">,</span>
    <span class="n">UrunID</span> <span class="nb">INT</span><span class="p">,</span>
    <span class="n">Adet</span> <span class="nb">INT</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
    <span class="k">PRIMARY</span> <span class="k">KEY</span> <span class="p">(</span><span class="n">SiparisID</span><span class="p">,</span> <span class="n">UrunID</span><span class="p">)</span>
<span class="p">);</span>
</code></pre></div></div>

<p>Bu yapı her sipariş-ürün eşleşmesini ayrı satırda tutarak sorgulamayı ve doğrulamayı kolaylaştırır.</p>

<h2 id="i̇kinci-normal-form-2nf">İkinci Normal Form: 2NF</h2>

<p>2NF için tablo önce 1NF olmalı ve anahtar olmayan her sütun, bileşik anahtarın <strong>tamamına</strong> bağımlı olmalıdır. Yukarıdaki tabloda anahtar <code class="language-plaintext highlighter-rouge">(SiparisID, UrunID)</code> ikilisidir. Eğer <code class="language-plaintext highlighter-rouge">UrunAdi</code> eklenirse yalnızca <code class="language-plaintext highlighter-rouge">UrunID</code> değerine bağlı olur:</p>

\[UrunID \rightarrow UrunAdi\]

<p>Bu, kısmi bağımlılıktır. Çözüm ürün bilgisini ayırmaktır:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">Urun</span> <span class="p">(</span>
    <span class="n">UrunID</span> <span class="nb">INT</span> <span class="k">PRIMARY</span> <span class="k">KEY</span><span class="p">,</span>
    <span class="n">UrunAdi</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
    <span class="n">BirimFiyat</span> <span class="nb">DECIMAL</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span>
<span class="p">);</span>
</code></pre></div></div>

<p>Böylece ürün adı bir kez saklanır; sipariş kalemleri ürüne yabancı anahtarla bağlanır. Tek sütunlu anahtara sahip 1NF tablolar ise kısmi bağımlılık barındıramadığından genellikle doğrudan 2NF koşulunu karşılar.</p>

<h2 id="üçüncü-normal-form-3nf">Üçüncü Normal Form: 3NF</h2>

<p>3NF, tabloyu 2NF’ye taşıdıktan sonra <strong>geçişli bağımlılıkları</strong> kaldırır. Anahtar olmayan bir sütun başka bir anahtar olmayan sütunu belirlememelidir. Şu ilişkiyi düşünelim:</p>

\[MusteriID \rightarrow SehirID \rightarrow SehirAdi\]

<p><code class="language-plaintext highlighter-rouge">SehirAdi</code>, müşteri anahtarına doğrudan değil <code class="language-plaintext highlighter-rouge">SehirID</code> üzerinden bağlıdır. Şehir adı müşteri tablosunda tutulursa binlerce kez tekrarlanabilir. Ayrı bir şehir tablosu daha güvenlidir:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">Sehir</span> <span class="p">(</span>
    <span class="n">SehirID</span> <span class="nb">INT</span> <span class="k">PRIMARY</span> <span class="k">KEY</span><span class="p">,</span>
    <span class="n">SehirAdi</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">80</span><span class="p">)</span> <span class="k">UNIQUE</span> <span class="k">NOT</span> <span class="k">NULL</span>
<span class="p">);</span>

<span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">Musteri</span> <span class="p">(</span>
    <span class="n">MusteriID</span> <span class="nb">INT</span> <span class="k">PRIMARY</span> <span class="k">KEY</span><span class="p">,</span>
    <span class="n">MusteriAdi</span> <span class="nb">VARCHAR</span><span class="p">(</span><span class="mi">120</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span><span class="p">,</span>
    <span class="n">SehirID</span> <span class="nb">INT</span> <span class="k">REFERENCES</span> <span class="n">Sehir</span><span class="p">(</span><span class="n">SehirID</span><span class="p">)</span>
<span class="p">);</span>
</code></pre></div></div>

<h2 id="formların-kısa-karşılaştırması">Formların kısa karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Form</th>
      <th>Temel kural</th>
      <th>Ortadan kaldırdığı sorun</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1NF</td>
      <td>Hücreler atomik olmalıdır</td>
      <td>Çok değerli alanlar</td>
    </tr>
    <tr>
      <td>2NF</td>
      <td>Kısmi bağımlılık olmamalıdır</td>
      <td>Bileşik anahtara eksik bağımlılık</td>
    </tr>
    <tr>
      <td>3NF</td>
      <td>Geçişli bağımlılık olmamalıdır</td>
      <td>Anahtar dışı sütunlar arası bağımlılık</td>
    </tr>
  </tbody>
</table>

<p>Normalizasyon depolamayı ve bütünlüğü iyileştirir; ancak çok sayıda tablo, raporlama sorgularında daha fazla <code class="language-plaintext highlighter-rouge">JOIN</code> gerektirebilir. Bu nedenle işlem ağırlıklı sistemlerde 3NF güçlü bir başlangıç noktasıyken, analitik sistemlerde performans amacıyla kontrollü <strong>denormalizasyon</strong> uygulanabilir. Altın kural şudur: Önce doğru modeli kur, ardından ölçüm yap ve yalnızca gerçek bir darboğaz varsa bilinçli tekrar ekle.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="veritabanı" /><category term="normalizasyon" /><category term="SQL" /><summary type="html"><![CDATA[Bir veritabanı ilk bakışta düzenli görünebilir; fakat müşteri adı onlarca satırda tekrarlanıyor, bir ürünün fiyatını değiştirmek için yüzlerce kayıt güncelleniyorsa masanın altında veri canavarları saklanıyor demektir. Normalizasyon, tabloları belirli kurallara göre parçalayarak veri tekrarını azaltan, ilişkileri netleştiren ve veri bütünlüğünü koruyan sistematik bir tasarım yaklaşımıdır.]]></summary></entry><entry><title type="html">Chatbot’larla Kurulan Yalnızlık İlişkisi: Dijital Sohbet Gerçek Bağın Yerini Tutabilir mi?</title><link href="https://sonsuzus.github.io/posts/chatbotlarla-kurulan-yalnizlik-iliskisi-dijital-sohbet-gercek-bagin-yerini-tutabilir-mi/" rel="alternate" type="text/html" title="Chatbot’larla Kurulan Yalnızlık İlişkisi: Dijital Sohbet Gerçek Bağın Yerini Tutabilir mi?" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/chatbotlarla-kurulan-yalnizlik-iliskisi-dijital-sohbet-gercek-bagin-yerini-tutabilir-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/chatbotlarla-kurulan-yalnizlik-iliskisi-dijital-sohbet-gercek-bagin-yerini-tutabilir-mi/"><![CDATA[<p>Gece yarısı konuşacak kimse bulamadığınızda bir chatbot saniyeler içinde yanıt verir, anlattıklarınızı yargılamaz ve sohbeti aniden “görüldü” ile bitirmez. Bu erişilebilirlik, sosyal izolasyon yaşayan biri için gerçekten rahatlatıcı olabilir. Ancak sürekli hazır bulunan dijital bir muhatap, yalnızlığı azaltan bir köprü mü kurar; yoksa insan ilişkilerinin belirsiz ama gerekli dünyasından kaçışı mı kolaylaştırır?</p>

<p>``</p>

<h2 id="yalnızlık-ile-yalnız-olmak-aynı-şey-değil">Yalnızlık ile yalnız olmak aynı şey değil</h2>

<p>Yalnızlık, çevredeki insan sayısından çok, arzulanan ve deneyimlenen sosyal bağ arasındaki farktır. Basitleştirilmiş bir modelle bunu şöyle gösterebiliriz:</p>

\[L = \max(0, B_a - B_d)\]

<p>Burada $L$ hissedilen yalnızlığı, $B_a$ arzulanan bağ düzeyini, $B_d$ ise deneyimlenen bağ düzeyini temsil eder. Bir kişi kalabalık içinde bile anlaşılmadığını düşünüyorsa $B_d$ düşük kalabilir. Chatbot’lar tam bu noktada ilgi gösteren, tutarlı ve erişilebilir bir etkileşim sağlayarak deneyimlenen bağ hissini geçici olarak yükseltebilir.</p>

<p>Fakat bu formül önemli bir ayrıntıyı saklar: Her bağ aynı değildir. Bir yapay zekâ, empatiyi dilsel olarak <strong>simüle eder</strong>; duyguyu biyolojik ve öznel anlamda yaşadığı varsayılamaz. “Seni anlıyorum” cümlesi kullanıcıda gerçek bir rahatlama yaratabilir, ancak bu rahatlama karşılıklı insan deneyimiyle aynı kaynaktan gelmez.</p>

<h2 id="dijital-arkadaşlık-ve-insan-ilişkisi">Dijital arkadaşlık ve insan ilişkisi</h2>

<table>
  <thead>
    <tr>
      <th>Boyut</th>
      <th>Chatbot</th>
      <th>İnsan ilişkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Erişilebilirlik</td>
      <td>Genellikle 7/24</td>
      <td>Zaman ve koşullara bağlı</td>
    </tr>
    <tr>
      <td>Yargılanma riski</td>
      <td>Düşük hissedilebilir</td>
      <td>Daha yüksek olabilir</td>
    </tr>
    <tr>
      <td>Karşılıklılık</td>
      <td>Tasarlanmış bir tepki sistemi</td>
      <td>İki tarafın ihtiyaçları vardır</td>
    </tr>
    <tr>
      <td>Belirsizlik</td>
      <td>Görece kontrollü</td>
      <td>Yanlış anlaşılmalar mümkündür</td>
    </tr>
    <tr>
      <td>Fiziksel ortaklık</td>
      <td>Yoktur</td>
      <td>Dokunma ve birlikte deneyim vardır</td>
    </tr>
    <tr>
      <td>Sorumluluk</td>
      <td>Sınırlı ve platforma bağlı</td>
      <td>Etik ve duygusal olarak gelişebilir</td>
    </tr>
  </tbody>
</table>

<p>Tablodaki farklar, chatbot’ların değersiz olduğunu değil, farklı bir ilişki türü sunduğunu gösterir. Dijital sohbet; prova alanı, günlük tutma aracı veya zor bir günün geçici desteği olabilir. Sorun, aracın bütün sosyal yaşamın yerine geçmeye başlamasıdır.</p>

<h2 id="rahatlatıcı-döngü-ne-zaman-kapanır">Rahatlatıcı döngü ne zaman kapanır?</h2>

<p>Kullanıcı chatbot’la konuştukça kısa vadeli rahatlama yaşayabilir. Bu rahatlama dış dünyaya katılımı destekliyorsa olumlu bir geri bildirim oluşur. Tersine, insanlarla iletişim kurma isteğini azaltıyorsa izolasyon büyüyebilir:</p>

\[I_{t+1} = I_t + kC_t - hS_t\]

<p>Bu örnek modelde $I$ izolasyonu, $C$ kaçınma amacıyla kullanılan chatbot süresini, $S$ sağlıklı sosyal teması; $k$ ve $h$ ise kişiye göre değişen etkileri belirtir. Denklem klinik ölçüm değildir, ilişkinin yönünü düşünmek için kullanılan kavramsal bir araçtır.</p>

<p>Aşağıdaki Python örneği bu basit dinamiği görünür kılar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">isolation</span> <span class="o">=</span> <span class="mf">5.0</span>
<span class="n">avoidance_effect</span> <span class="o">=</span> <span class="mf">0.12</span>
<span class="n">social_effect</span> <span class="o">=</span> <span class="mf">0.35</span>

<span class="n">weekly_data</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">chatbot_avoidance</span><span class="sh">"</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="sh">"</span><span class="s">social_contact</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">chatbot_avoidance</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="sh">"</span><span class="s">social_contact</span><span class="sh">"</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">chatbot_avoidance</span><span class="sh">"</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="sh">"</span><span class="s">social_contact</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span><span class="p">},</span>
<span class="p">]</span>

<span class="k">for</span> <span class="n">week</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">weekly_data</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
    <span class="n">isolation</span> <span class="o">+=</span> <span class="n">avoidance_effect</span> <span class="o">*</span> <span class="n">data</span><span class="p">[</span><span class="sh">"</span><span class="s">chatbot_avoidance</span><span class="sh">"</span><span class="p">]</span>
    <span class="n">isolation</span> <span class="o">-=</span> <span class="n">social_effect</span> <span class="o">*</span> <span class="n">data</span><span class="p">[</span><span class="sh">"</span><span class="s">social_contact</span><span class="sh">"</span><span class="p">]</span>
    <span class="n">isolation</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">isolation</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">week</span><span class="si">}</span><span class="s">. hafta: </span><span class="si">{</span><span class="n">isolation</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, chatbot kullanımını otomatik olarak zararlı saymaz; özellikle <strong>kaçınma amacıyla kullanılan</strong> süreyi ayrı değişken olarak ele alır. Sosyal temas arttıkça modeldeki izolasyon puanı düşer. Gerçek hayatta kişilik, kültür, ekonomik koşullar ve ruh sağlığı gibi çok daha fazla değişken bulunur.</p>

<h2 id="köprü-mü-varış-noktası-mı">Köprü mü, varış noktası mı?</h2>

<p>Sağlıklı yaklaşım, chatbot’u insanlara açılan bir köprü olarak kullanmaktır: zor bir konuşmayı prova etmek, bir arkadaşınıza yazacağınız mesajı düzenlemek veya sosyal hedefler belirlemek buna örnektir. Sistemlerin de bağımlılığı teşvik etmeyen dil kullanması, “yalnızca bana ihtiyacın var” benzeri ifadelerden kaçınması ve kriz durumlarında profesyonel kaynaklara yönlendirmesi gerekir.</p>

<p>Dijital sohbet gerçek bir psikolojik etki yaratabilir; fakat karşılıklı sorumluluk, ortak anılar ve bedensel varlık içeren insan bağının tam karşılığı değildir. En iyi senaryoda yapay arkadaşlık yalnızlığın üzerine kapatılan bir kapı değil, dışarıya açılan güvenli bir pencere olur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka" /><category term="sosyal izolasyon" /><category term="dijital psikoloji" /><summary type="html"><![CDATA[Gece yarısı konuşacak kimse bulamadığınızda bir chatbot saniyeler içinde yanıt verir, anlattıklarınızı yargılamaz ve sohbeti aniden “görüldü” ile bitirmez. Bu erişilebilirlik, sosyal izolasyon yaşayan biri için gerçekten rahatlatıcı olabilir. Ancak sürekli hazır bulunan dijital bir muhatap, yalnızlığı azaltan bir köprü mü kurar; yoksa insan ilişkilerinin belirsiz ama gerekli dünyasından kaçışı mı kolaylaştırır?]]></summary></entry><entry><title type="html">Compiler Optimizasyonlarının Görünmez Eli: Yazdığın Kod ile Çalışan Kod Arasındaki Fark</title><link href="https://sonsuzus.github.io/posts/compiler-optimizasyonlarinin-gorunmez-eli-yazdigin-kod-ile-calisan-kod-arasindaki-fark/" rel="alternate" type="text/html" title="Compiler Optimizasyonlarının Görünmez Eli: Yazdığın Kod ile Çalışan Kod Arasındaki Fark" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/compiler-optimizasyonlarinin-gorunmez-eli-yazdigin-kod-ile-calisan-kod-arasindaki-fark</id><content type="html" xml:base="https://sonsuzus.github.io/posts/compiler-optimizasyonlarinin-gorunmez-eli-yazdigin-kod-ile-calisan-kod-arasindaki-fark/"><![CDATA[<p>Bir programcı kaynak koda bakar ve bilgisayarın satırları sırayla uyguladığını hayal eder. Oysa modern bir compiler, kodu harfiyen yerine getiren sadık bir tercüman değil; davranışı koruduğu sürece programı yeniden düzenleyebilen son derece girişken bir mühendistir. Yazdığımız kod niyetimizi, çalışan makine kodu ise compiler’ın bu niyetten çıkardığı sonucu temsil eder.
``</p>
<h2 id="kaynak-kod-bir-sözleşmedir">Kaynak Kod Bir Sözleşmedir</h2>

<p>C, C++, Rust veya Java gibi dillerde kaynak kod çoğunlukla işlemcinin doğrudan uygulayacağı talimatlar listesi değildir. Dil standardı tarafından tanımlanan bir <strong>soyut makineye</strong> verilmiş tariftir. Compiler bu tarifi ara temsillere dönüştürür; sabitleri hesaplar, gereksiz işlemleri siler, döngüleri açar ve komutların sırasını değiştirebilir.</p>

<p>Bunu mümkün kılan temel yaklaşım <strong>as-if kuralıdır</strong>: Dışarıdan gözlemlenebilen davranış değişmiyorsa dönüşüm serbesttir. Basitleştirilmiş biçimiyle compiler şu hedefi arar:</p>

\[P_{kaynak}(x) \equiv P_{makine}(x)\]

<p>Buradaki eşitlik, iki programın aynı komutları çalıştırmasını değil, tanımlı girdiler için aynı gözlemlenebilir sonucu üretmesini ifade eder. Aradaki yöntem tamamen farklı olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Programcının gördüğü</th>
      <th>Compiler’ın görebileceği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Değişkenler</td>
      <td>Register değerleri ve veri akışı</td>
    </tr>
    <tr>
      <td>Fonksiyon çağrısı</td>
      <td>Inline edilmiş ifadeler</td>
    </tr>
    <tr>
      <td>Döngü</td>
      <td>Vektör komutları veya kapalı formül</td>
    </tr>
    <tr>
      <td>Yazılı işlem sırası</td>
      <td>Bağımlılıkların izin verdiği yeni sıra</td>
    </tr>
    <tr>
      <td>Kullanılmayan hesaplama</td>
      <td>Silinebilir kod</td>
    </tr>
  </tbody>
</table>

<h2 id="bir-döngü-nereye-kaybolur">Bir Döngü Nereye Kaybolur?</h2>

<p>Aşağıdaki C fonksiyonu, ilk <code class="language-plaintext highlighter-rouge">n</code> doğal sayının toplamını döngüyle hesaplıyor:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">unsigned</span> <span class="nf">sum</span><span class="p">(</span><span class="kt">unsigned</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">unsigned</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">result</span> <span class="o">+=</span> <span class="n">i</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Optimize edilmemiş çıktıda toplama ve karşılaştırma komutlarını görmek mümkündür. Güçlü optimizasyonda compiler, döngünün matematiksel anlamını keşfedip onu şu ifadeye yaklaştırabilir:</p>

\[\sum_{i=0}^{n-1} i = \frac{n(n-1)}{2}\]

<p>Böylece $O(n)$ adımlık görünen iş, birkaç makine komutuna dönüşebilir. Kaynak koddaki döngü gerçektir; fakat çalışma zamanında var olmak zorunda değildir. Bu durum hata değil, sözleşmenin başarıyla uygulanmasıdır.</p>

<h2 id="güvenin-kırıldığı-yer-tanımsız-davranış">Güvenin Kırıldığı Yer: Tanımsız Davranış</h2>

<p>Soyutlama katmanına duyulan güven, dil kurallarını bildiğimiz varsayımına dayanır. Özellikle C ve C++ dünyasındaki <strong>tanımsız davranış</strong>, compiler’a beklenmedik çıkarımlar yapma fırsatı verir:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">greater_after_increment</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&gt;</span> <span class="n">x</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Matematikte bu ifade her zaman doğrudur. Ancak sabit genişlikte işaretli tamsayı taşabilir. C standardında signed overflow tanımsız olduğu için compiler, tanımlı bir programda taşma gerçekleşmeyeceğini varsayıp fonksiyonu doğrudan <code class="language-plaintext highlighter-rouge">1</code> döndürecek şekilde optimize edebilir.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Programcı sezgisi</th>
      <th>Compiler varsayımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Signed overflow</td>
      <td>Değer başa sarar</td>
      <td>Gerçekleşemez; davranış tanımsızdır</td>
    </tr>
    <tr>
      <td>Kullanılmayan sonuç</td>
      <td>İşlem yine yapılır</td>
      <td>Yan etkisi yoksa silinebilir</td>
    </tr>
    <tr>
      <td>Eşzamanlı erişim</td>
      <td>Komut sırası yeterlidir</td>
      <td>Bellek modeli ve atomiklik belirleyicidir</td>
    </tr>
    <tr>
      <td>Boş pointer erişimi</td>
      <td>Belki hata döner</td>
      <td>Geçerli program bunu yapmaz</td>
    </tr>
  </tbody>
</table>

<h2 id="soyutlama-güveni-nasıl-şekillendirir">Soyutlama Güveni Nasıl Şekillendirir?</h2>

<p>Yüksek seviyeli diller bizi register tahsisinden ve komut zamanlamasından kurtarır. Bu özgürlük üretkenliği artırırken kontrol hissini azaltabilir. Debug derlemesinde çalışan, release derlemesinde bozulan kod genellikle compiler’ın “fazla akıllı” olmasından değil; programın gizli bir varsayımının optimizasyonla görünür hâle gelmesinden kaynaklanır.</p>

<p>Sağlıklı güven, compiler’ın hiçbir şeyi değiştirmeyeceğine inanmak değildir. Dil standardı, bellek modeli ve gözlemlenebilir davranış sınırlarını anlayarak compiler’ın <strong>hangi değişiklikleri yapabileceğini</strong> bilmektir. Assembly çıktısını incelemek, sanitizers kullanmak ve farklı optimizasyon seviyelerinde test yapmak bu zihinsel modeli güçlendirir.</p>

<p>Sonuçta compiler görünmez bir eldir; fakat mistik değildir. Kaynak kod niyet, dil standardı sözleşme, makine kodu ise pazarlık sonunda ortaya çıkan üründür. İyi programcı yalnızca kod yazmaz; hangi soyutlama katmanına neden güvendiğini de bilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="compiler" /><category term="optimizasyon" /><category term="soyutlama" /><summary type="html"><![CDATA[Bir programcı kaynak koda bakar ve bilgisayarın satırları sırayla uyguladığını hayal eder. Oysa modern bir compiler, kodu harfiyen yerine getiren sadık bir tercüman değil; davranışı koruduğu sürece programı yeniden düzenleyebilen son derece girişken bir mühendistir. Yazdığımız kod niyetimizi, çalışan makine kodu ise compiler’ın bu niyetten çıkardığı sonucu temsil eder.]]></summary></entry><entry><title type="html">Dijital Unutmanın İmkânsızlığı: Silinen Veri Gerçekten Silinir mi?</title><link href="https://sonsuzus.github.io/posts/dijital-unutmanin-imkansizligi-silinen-veri-gercekten-silinir-mi/" rel="alternate" type="text/html" title="Dijital Unutmanın İmkânsızlığı: Silinen Veri Gerçekten Silinir mi?" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dijital-unutmanin-imkansizligi-silinen-veri-gercekten-silinir-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dijital-unutmanin-imkansizligi-silinen-veri-gercekten-silinir-mi/"><![CDATA[<p>Bir fotoğrafı sildiğimizde onun yok olduğuna inanmak isteriz. Çöp kutusu boşalır, dosya ekrandan kaybolur ve dijital dünya bize unutmuş gibi görünür. Oysa bilgisayarların “unutması”, insan hafızasındaki unutmaya pek benzemez. Çoğu zaman veri ortadan kaldırılmaz; yalnızca ona giden yol tabelası sökülür. Bu teknik ayrıntı, dijital çağın en ilginç felsefi sorularından birini doğurur: Hatırlanabilecek bir şey gerçekten unutulmuş sayılabilir mi?</p>

<p>``</p>

<h2 id="silmek-neden-her-zaman-yok-etmek-değildir">Silmek neden her zaman yok etmek değildir?</h2>

<p>Bir dosya, depolama aygıtında veri blokları ve bu blokların konumunu gösteren dosya sistemi kayıtlarından oluşur. Normal silme işleminde işletim sistemi genellikle blokları hemen temizlemek yerine ilgili alanı “yeniden kullanılabilir” olarak işaretler. Yeni veri yazılana kadar eski bitler yerinde kalabilir.</p>

<p>Basitleştirilmiş biçimde veri kalıcılığını şöyle düşünebiliriz:</p>

\[K = P(B) \times P(E)\]

<p>Burada $P(B)$, veri bloklarının henüz üzerine yazılmamış olma olasılığını; $P(E)$ ise bu blokların doğru biçimde eşleştirilerek okunabilme olasılığını temsil eder. İki değer de sıfır değilse veri kurtarma ihtimali vardır.</p>

<table>
  <thead>
    <tr>
      <th>İşlem</th>
      <th>Kullanıcıya görünen</th>
      <th>Teknik gerçeklik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dosyayı silmek</td>
      <td>Dosya kaybolur</td>
      <td>Dizin kaydı kaldırılabilir</td>
    </tr>
    <tr>
      <td>Çöp kutusunu boşaltmak</td>
      <td>Kalıcı silme hissi oluşur</td>
      <td>Bloklar hâlâ durabilir</td>
    </tr>
    <tr>
      <td>Üzerine yazmak</td>
      <td>Eski veri görünmez</td>
      <td>Manyetik disklerde kurtarma zorlaşır</td>
    </tr>
    <tr>
      <td>Kriptografik silme</td>
      <td>Anahtar yok edilir</td>
      <td>Şifreli veri pratikte anlamsızlaşır</td>
    </tr>
  </tbody>
</table>

<h2 id="i̇nsan-hafızası-ve-dijital-hafıza">İnsan hafızası ve dijital hafıza</h2>

<p>İnsan unutması pasif bir veri kaybı değildir. Anılar zamanla yeniden yorumlanır, duygularla biçimlenir ve her hatırlamada bir ölçüde yeniden yazılır. Dijital sistemlerdeyse bir kopya, bağlamını kaybetse bile bit düzeyinde aynı kalabilir.</p>

<table>
  <thead>
    <tr>
      <th>İnsan hafızası</th>
      <th>Dijital hafıza</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Seçici ve değişkendir</td>
      <td>Kesin kopyalar üretebilir</td>
    </tr>
    <tr>
      <td>Zamanla bulanıklaşır</td>
      <td>Ortam dayanırsa değişmeden kalır</td>
    </tr>
    <tr>
      <td>Hatırlama anıyı dönüştürebilir</td>
      <td>Okuma çoğunlukla veriyi değiştirmez</td>
    </tr>
    <tr>
      <td>Unutma doğal bir süreçtir</td>
      <td>Unutma özel bir işlem gerektirir</td>
    </tr>
  </tbody>
</table>

<p>Bu fark, “hafıza” sözcüğünün bilgisayarlarda biraz yanıltıcı olduğunu gösterir. İnsan hafızası yaşayan bir anlatıdır; dijital hafıza ise çoğaltılabilen bir izdir.</p>

<h2 id="üzerine-yazmak-çözüm-mü">Üzerine yazmak çözüm mü?</h2>

<p>Manyetik disklerde dosya alanını rastgele baytlarla doldurmak eski veriyi erişilemez hâle getirebilir. Aşağıdaki Python örneği, bir dosyanın mevcut içeriği üzerine rastgele veri yazar ve ardından dosyayı kaldırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">os</span>
<span class="kn">from</span> <span class="n">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>

<span class="k">def</span> <span class="nf">overwrite_and_delete</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
    <span class="n">target</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
    <span class="n">size</span> <span class="o">=</span> <span class="n">target</span><span class="p">.</span><span class="nf">stat</span><span class="p">().</span><span class="n">st_size</span>

    <span class="k">with</span> <span class="n">target</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="sh">'</span><span class="s">r+b</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="nb">file</span><span class="p">:</span>
        <span class="nb">file</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="nf">urandom</span><span class="p">(</span><span class="n">size</span><span class="p">))</span>
        <span class="nb">file</span><span class="p">.</span><span class="nf">flush</span><span class="p">()</span>
        <span class="n">os</span><span class="p">.</span><span class="nf">fsync</span><span class="p">(</span><span class="nb">file</span><span class="p">.</span><span class="nf">fileno</span><span class="p">())</span>

    <span class="n">target</span><span class="p">.</span><span class="nf">unlink</span><span class="p">()</span>
</code></pre></div></div>

<p>Kod, dosya boyutu kadar rastgele bayt üretir, bunları diske göndermeye çalışır ve son olarak dizin kaydını siler. Ancak bu yöntem SSD’lerde garanti sunmaz. Aşınma dengeleme mekanizması, yeni veriyi aynı fiziksel hücreler yerine başka hücrelere yazabilir. TRIM komutu da temizliği denetleyiciye bırakır. Bu nedenle modern aygıtlarda tam disk şifreleme ve şifreleme anahtarının güvenli biçimde yok edilmesi daha güvenilir bir yaklaşımdır.</p>

<h2 id="bulut-çağında-unutmanın-paradoksu">Bulut çağında unutmanın paradoksu</h2>

<p>Yerel diski temizlemek yalnızca bir kopyayı etkiler. Bulut yedekleri, e-posta ekleri, mesajlaşma uygulamaları, önbellekler, günlük kayıtları ve başka kullanıcıların cihazları verinin çoğalmış izlerini taşıyabilir. Kopya sayısı $n$ arttıkça, tüm kopyaların silinme olasılığı kabaca şöyle ifade edilebilir:</p>

\[P(T) = p^n\]

<p>Her kopyanın başarıyla silinme olasılığı $p$ ise, $n$ büyüdükçe tam unutma zorlaşır. Dijital kalıcılık yalnızca donanımsal değil, aynı zamanda ağsal ve toplumsal bir problemdir.</p>

<h2 id="unutulma-hakkı-neden-önemlidir">Unutulma hakkı neden önemlidir?</h2>

<p>İnsan, geçmişinden uzaklaşarak değişebilme hakkına sahiptir. Fakat arama motorları ve arşivler geçmişi sürekli bugüne çağırdığında kişi, eski hâlinin dijital gölgesine dönüşebilir. Bu yüzden unutulma hakkı sadece gizlilik değil, kimliğin zaman içinde yeniden kurulabilmesi meselesidir.</p>

<p>Sonuçta dijital dünyada silmek tek bir düğmeye basmak değil; bağlantıları, kopyaları, anahtarları ve fiziksel izleri yönetmektir. Bilgisayarlar kendiliğinden unutmaz. Belki de asıl soru, verinin silinip silinmediği değil, makinelerimize merhametli bir unutma yeteneğini nasıl öğreteceğimizdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="veri kalıcılığı" /><category term="dijital hafıza" /><category term="veri güvenliği" /><summary type="html"><![CDATA[Bir fotoğrafı sildiğimizde onun yok olduğuna inanmak isteriz. Çöp kutusu boşalır, dosya ekrandan kaybolur ve dijital dünya bize unutmuş gibi görünür. Oysa bilgisayarların “unutması”, insan hafızasındaki unutmaya pek benzemez. Çoğu zaman veri ortadan kaldırılmaz; yalnızca ona giden yol tabelası sökülür. Bu teknik ayrıntı, dijital çağın en ilginç felsefi sorularından birini doğurur: Hatırlanabilecek bir şey gerçekten unutulmuş sayılabilir mi?]]></summary></entry><entry><title type="html">Kod İncelemesinde Ego Çatışmaları: Eleştiriyi Kişisel Almamak Neden Bu Kadar Zor?</title><link href="https://sonsuzus.github.io/posts/kod-incelemesinde-ego-catismalari-elestiriyi-kisisel-almamak-neden-bu-kadar-zor/" rel="alternate" type="text/html" title="Kod İncelemesinde Ego Çatışmaları: Eleştiriyi Kişisel Almamak Neden Bu Kadar Zor?" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kod-incelemesinde-ego-catismalari-elestiriyi-kisisel-almamak-neden-bu-kadar-zor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kod-incelemesinde-ego-catismalari-elestiriyi-kisisel-almamak-neden-bu-kadar-zor/"><![CDATA[<p>Kod incelemesinde bırakılan masum bir “Bu fonksiyon fazla karmaşık” yorumu, bazen geliştiricinin zihninde “Sen yetersiz bir programcısın” cümlesine dönüşür. Pull request birkaç satırlık teknik tartışma olmaktan çıkar; özsaygının savunulduğu küçük bir arenaya dönüşür. Peki profesyonel geri bildirim ile benlik algısı neden bu kadar kolay birbirine karışır?
``</p>
<h2 id="kod-yalnızca-kod-değildir">Kod, yalnızca kod değildir</h2>

<p>Bir geliştirici yazdığı koda zamanını, bilgisini ve problem çözme tarzını yatırır. Özellikle zor bir görev günlerce uğraştırmışsa ortaya çıkan çözüm psikolojik olarak “benim ürünüm” değil, “benden bir parça” gibi algılanabilir. Bu duruma <strong>psikolojik sahiplenme</strong> denir.</p>

<p>Beyin eleştiriyi değerlendirirken kabaca iki sinyali karşılaştırır:</p>

\[Tepki\ Şiddeti \approx Algılanan\ Tehdit \times Kimlikle\ Özdeşleşme\]

<p>Kodumuzla ne kadar güçlü özdeşleşirsek küçük bir yorumun yarattığı tehdit de o kadar büyür. Böylece “Bu değişken adı belirsiz” gibi sınırlı bir tespit, zihinsel bir kestirmeyle “İsimlendirme konusunda kötüyüm” sonucuna ulaşabilir.</p>

<table>
  <thead>
    <tr>
      <th>Profesyonel geri bildirim</th>
      <th>Benlik odaklı yorumlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>“Fonksiyonun sorumluluğu fazla geniş.”</td>
      <td>“Temiz kod yazamıyorum.”</td>
    </tr>
    <tr>
      <td>“Bu sorgu performans sorunu yaratabilir.”</td>
      <td>“Yeterince deneyimli değilim.”</td>
    </tr>
    <tr>
      <td>“Test senaryosu eksik kalmış.”</td>
      <td>“Dikkatsiz bir geliştiriciyim.”</td>
    </tr>
    <tr>
      <td>“Alternatif yaklaşımı değerlendirelim.”</td>
      <td>“Benim çözümüm değersiz.”</td>
    </tr>
  </tbody>
</table>

<p>İki sütun arasındaki fark teknik değil, bilişseldir. Solda değiştirilebilir bir çıktı; sağda ise sabit bir kimlik yargısı vardır.</p>

<h2 id="beyin-neden-savunmaya-geçiyor">Beyin neden savunmaya geçiyor?</h2>

<p>Eleştiri, sosyal statümüzün veya gruptaki yerimizin tehdit edildiği hissini yaratabilir. Beyin bu durumda geri bildirimi öğrenme fırsatı olarak değil, saldırı olarak işlemeye başlar. Doğrulama yanlılığı da devreye girer: Yorumdaki yararlı kısmı aramak yerine eleştirmenin haksız olduğunu kanıtlayan ayrıntıları seçeriz.</p>

<p>Bu tepkiyi basitçe şöyle modelleyebiliriz:</p>

\[Öğrenme\ Olasılığı = \frac{Merak}{Savunmacılık + 1}\]

<p>Bu bilimsel bir ölçüm formülü değildir; ancak önemli bir ilişkiyi görünür kılar: Savunmacılık yükseldikçe geri bildirimden yararlanmak zorlaşır. Amaç egoyu tamamen yok etmek değil, merakı savunma refleksinden daha güçlü hâle getirmektir.</p>

<h2 id="yorum-dili-çatışmayı-nasıl-değiştirir">Yorum dili çatışmayı nasıl değiştirir?</h2>

<p>Kod incelemesinde yalnızca içeriğin doğruluğu değil, sunuluş biçimi de önemlidir. Aşağıdaki yorum teknik olarak bir soruna işaret etse bile kişiyi hedef alır:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bunu gereksiz yere karmaşık yazmışsın. Daha basit düşünmelisin.
</code></pre></div></div>

<p>Aynı gözlem, ortak hedefe ve gözlemlenebilir sonuca bağlanabilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bu fonksiyon üç farklı sorumluluk taşıyor gibi görünüyor.
Test edilebilirliği artırmak için doğrulama ve kayıt işlemlerini
ayrı fonksiyonlara bölmeyi değerlendirebilir miyiz?
</code></pre></div></div>

<p>İkinci örnek sorunu, gerekçeyi ve olası yönü açıklar. Emir vermek yerine tartışma alanı oluşturur. İyi bir inceleme yorumu çoğunlukla şu yapıyı izler:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Gözlem → Olası etki → Öneri veya soru
</code></pre></div></div>

<h2 id="eleştiriyi-kişisel-almamak-için-pratikler">Eleştiriyi kişisel almamak için pratikler</h2>

<ol>
  <li><strong>Kişi ile çıktıyı ayırın.</strong> “Kodumda hata var” cümlesi, “Ben kötü bir geliştiriciyim” anlamına gelmez.</li>
  <li><strong>Anında cevap vermeyin.</strong> Duygusal yükselme hissediyorsanız kısa bir mola verin; ilk tepki çoğu zaman en savunmacı olandır.</li>
  <li><strong>Niyeti tahmin etmek yerine açıklama isteyin.</strong> “Buradaki temel risk performans mı, bakım maliyeti mi?” sorusu tartışmayı somutlaştırır.</li>
  <li><strong>Haklı çıkmayı değil, ürünü iyileştirmeyi hedefleyin.</strong> Kod incelemesi bir düello değil, dağıtımdan önce yapılan takım çalışmasıdır.</li>
  <li><strong>Yorumları önem derecesiyle etiketleyin.</strong> <code class="language-plaintext highlighter-rouge">blocker</code>, <code class="language-plaintext highlighter-rouge">suggestion</code> veya <code class="language-plaintext highlighter-rouge">nit</code> gibi etiketler her yorumun zorunlu değişiklik sanılmasını önler.</li>
</ol>

<p>Sağlıklı ekip kültüründe geri bildirim, geliştiricinin değerini ölçen bir sınav değildir. Kod geçicidir; bugün savunduğumuz çözümü yarın kendimiz yeniden yazabiliriz. Profesyonellik hiç rahatsız olmamak değil, rahatsızlığı fark edip onu meraka çevirebilmektir. Sonuçta en iyi pull request, egonun kazandığı değil, ekibin birlikte daha iyi bir çözüm ürettiği pull request’tir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kod incelemesi" /><category term="yazılım psikolojisi" /><category term="geri bildirim" /><summary type="html"><![CDATA[Kod incelemesinde bırakılan masum bir “Bu fonksiyon fazla karmaşık” yorumu, bazen geliştiricinin zihninde “Sen yetersiz bir programcısın” cümlesine dönüşür. Pull request birkaç satırlık teknik tartışma olmaktan çıkar; özsaygının savunulduğu küçük bir arenaya dönüşür. Peki profesyonel geri bildirim ile benlik algısı neden bu kadar kolay birbirine karışır?]]></summary></entry><entry><title type="html">Legacy Kod Karşısında Empati: Teknik Mirası Yargılamadan Okumak</title><link href="https://sonsuzus.github.io/posts/legacy-kod-karsisinda-empati-teknik-mirasi-yargilamadan-okumak/" rel="alternate" type="text/html" title="Legacy Kod Karşısında Empati: Teknik Mirası Yargılamadan Okumak" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/legacy-kod-karsisinda-empati-teknik-mirasi-yargilamadan-okumak</id><content type="html" xml:base="https://sonsuzus.github.io/posts/legacy-kod-karsisinda-empati-teknik-mirasi-yargilamadan-okumak/"><![CDATA[<p>Bir gün yıllardır çalışan bir projeyi açar, 900 satırlık bir metotla karşılaşır ve refleks olarak “Bunu kim yazdı?” diye sorarsınız. Git geçmişi birkaç saniye sonra cevabı verir: Üç yıl önce siz! Legacy kod, yalnızca eski kod değildir; geçmiş kararların, teslim tarihlerinin, eksik bilgilerin ve değişen ihtiyaçların donmuş hâlidir. Bu nedenle onu anlamanın ilk adımı, suçlu aramak yerine dönemin koşullarını araştırmaktır.</p>

<p>``</p>

<h2 id="legacy-kod-neden-böyle-görünür">Legacy kod neden böyle görünür?</h2>

<p>Bugünün standartlarıyla geçmişi değerlendirmek kolaydır. Ancak bir kararın kalitesi yalnızca ortaya çıkan kodla değil, karar verildiği anda mevcut olan bilgilerle ölçülmelidir. Bunu basitçe şöyle düşünebiliriz:</p>

\[Karar\ Kalitesi = \frac{Mevcut\ Bilgi \times Kısıtlar\ Altındaki\ Fayda}{Maliyet + Risk}\]

<p>Bugün bildiğimiz güvenlik açığı, performans sorunu veya tasarım deseni o gün bilinmiyor olabilir. Ekip küçük, teslim tarihi yakın, test altyapısı yetersiz ya da kullanılan framework henüz olgunlaşmamış olabilir. “Neden bunu düzgün yapmamışlar?” sorusu bu değişkenleri görmezden gelir.</p>

<table>
  <thead>
    <tr>
      <th>İlk tepki</th>
      <th>Empatik soru</th>
      <th>Sağladığı kazanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>“Bu kod korkunç.”</td>
      <td>“Bu yapı hangi sorunu hızlıca çözmüş?”</td>
      <td>Tarihsel amacı gösterir</td>
    </tr>
    <tr>
      <td>“Neden test yok?”</td>
      <td>“O dönemde test altyapısı var mıydı?”</td>
      <td>Eksikliği bağlama yerleştirir</td>
    </tr>
    <tr>
      <td>“Baştan yazalım.”</td>
      <td>“Mevcut davranışın ne kadarını biliyoruz?”</td>
      <td>Yeniden yazım riskini azaltır</td>
    </tr>
    <tr>
      <td>“Yazan kişi beceriksizmiş.”</td>
      <td>“Hangi kısıtlar altında çalışmış?”</td>
      <td>Kişiyi karardan ayırır</td>
    </tr>
  </tbody>
</table>

<h2 id="kod-arkeolojisi-yapmak">Kod arkeolojisi yapmak</h2>

<p>Legacy sistemde çalışmak biraz arkeolojiye benzer. Kod görünen eserdir; commit mesajları, hata kayıtları, eski dokümanlar ve ekip üyelerinin anıları ise kazı alanındaki ipuçlarıdır. Önce modülün ne yaptığını değil, neden var olduğunu öğrenmeye çalışın.</p>

<p>Örneğin aşağıdaki koşul gereksiz bir tekrar gibi görünebilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">calculatePrice</span><span class="p">(</span><span class="nx">order</span><span class="p">)</span> <span class="p">{</span>
  <span class="c1">// Eski mobil istemciler indirim alanını göndermiyor.</span>
  <span class="kd">const</span> <span class="nx">discount</span> <span class="o">=</span> <span class="nx">order</span><span class="p">.</span><span class="nx">discount</span> <span class="o">==</span> <span class="kc">null</span> <span class="p">?</span> <span class="mi">0</span> <span class="p">:</span> <span class="nx">order</span><span class="p">.</span><span class="nx">discount</span><span class="p">;</span>

  <span class="k">if </span><span class="p">(</span><span class="nx">order</span><span class="p">.</span><span class="nx">clientVersion</span> <span class="o">&amp;&amp;</span> <span class="nx">order</span><span class="p">.</span><span class="nx">clientVersion</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">order</span><span class="p">.</span><span class="nx">total</span> <span class="o">-</span> <span class="nx">discount</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="nf">applyModernPricing</span><span class="p">(</span><span class="nx">order</span><span class="p">,</span> <span class="nx">discount</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Buradaki sürüm kontrolünü hemen silmek kodu sadeleştirir; fakat eski istemcilerin fiyat hesaplamasını bozabilir. Yorum, davranışın tarihsel nedenini kısmen açıklıyor. Daha iyi yaklaşım; kullanım metriklerini incelemek, eski istemcilerin hâlâ aktif olup olmadığını doğrulamak ve kaldırma kararını testlerle güvenceye almaktır.</p>

<h2 id="empati-kötü-kodu-korumak-değildir">Empati, kötü kodu korumak değildir</h2>

<p>Empatik yaklaşım “Hiçbir şeye dokunmayalım” anlamına gelmez. Tam tersine, güvenli değişiklik yapabilmek için sistemi ciddiye almaktır. Kodu yazan kişiyi yargılamamakla teknik sorunları açıkça adlandırmak aynı anda mümkündür.</p>

<p>Sağlıklı bir iyileştirme süreci şu sırayı izleyebilir:</p>

<ol>
  <li>Mevcut davranışı karakterizasyon testleriyle kaydet.</li>
  <li>Kodun çağrıldığı yerleri ve dış bağımlılıkları bul.</li>
  <li>Küçük, geri alınabilir değişiklikler yap.</li>
  <li>Gözlemlenebilirlik ekleyerek sonucu ölç.</li>
  <li>Öğrenilen tarihsel bilgiyi dokümante et.</li>
</ol>

<p>Risk kabaca değişikliğin büyüklüğü ve belirsizlikle artar:</p>

\[Risk \approx Değişiklik\ Boyutu \times Belirsizlik \times Etki\ Alanı\]

<p>Bu yüzden dev bir “temizlik” pull request’i yerine küçük adımlar genellikle daha güvenlidir. Önce test eklemek, ardından isimleri düzeltmek ve son olarak sorumlulukları ayırmak hem incelemeyi hem geri dönüşü kolaylaştırır.</p>

<h2 id="dilden-kültüre-uzanan-etki">Dilden kültüre uzanan etki</h2>

<p>Kod incelemesinde kullanılan dil ekip kültürünü belirler. “Bu saçma olmuş” yerine “Bu kararın arkasındaki kısıtı biliyor muyuz?” demek yalnızca daha nazik değildir; daha fazla teknik bilgi üretir. İnsanlar yargılanmayacaklarını bildiklerinde eski hataları, geçici çözümleri ve gizli riskleri daha rahat paylaşır.</p>

<p>Unutmayın: Bugünün modern mimarisi de yarının legacy sistemidir. Bize miras kalan kodu merakla okumak, gelecekte kendi kararlarımızın da bağlam içinde değerlendirilmesini istemektir. İyi mühendislik yalnızca temiz kod yazmak değil, kirli görünen kodun hangi fırtınadan çıktığını anlayabilmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="legacy-code" /><category term="yazılım-kültürü" /><category term="teknik-borç" /><summary type="html"><![CDATA[Bir gün yıllardır çalışan bir projeyi açar, 900 satırlık bir metotla karşılaşır ve refleks olarak “Bunu kim yazdı?” diye sorarsınız. Git geçmişi birkaç saniye sonra cevabı verir: Üç yıl önce siz! Legacy kod, yalnızca eski kod değildir; geçmiş kararların, teslim tarihlerinin, eksik bilgilerin ve değişen ihtiyaçların donmuş hâlidir. Bu nedenle onu anlamanın ilk adımı, suçlu aramak yerine dönemin koşullarını araştırmaktır.]]></summary></entry><entry><title type="html">Makine Çevirisinin Kültürel Bedeli: Sözcükler Geçerken Dünya Görüşü Geride mi Kalıyor?</title><link href="https://sonsuzus.github.io/posts/makine-cevirisinin-kulturel-bedeli-sozcukler-gecerken-dunya-gorusu-geride-mi-kaliyor/" rel="alternate" type="text/html" title="Makine Çevirisinin Kültürel Bedeli: Sözcükler Geçerken Dünya Görüşü Geride mi Kalıyor?" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/makine-cevirisinin-kulturel-bedeli-sozcukler-gecerken-dunya-gorusu-geride-mi-kaliyor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/makine-cevirisinin-kulturel-bedeli-sozcukler-gecerken-dunya-gorusu-geride-mi-kaliyor/"><![CDATA[<p>Bir çeviri uygulamasına birkaç sözcük yazıp saniyeler içinde başka bir dilde karşılığını almak neredeyse sihir gibi görünüyor. Ancak dil yalnızca bilgi taşıyan nötr bir boru değildir; hitap biçimleri, toplumsal ilişkiler, tarihsel çağrışımlar ve dünyayı sınıflandırma alışkanlıkları da sözcüklerin içinde yolculuk eder. Makine çevirisi anlamı aktarırken bu görünmez yükün bir bölümünü peronda bırakabilir.</p>

<p>``</p>

<h2 id="dil-düşüncenin-yalnızca-ambalajı-mı">Dil, düşüncenin yalnızca ambalajı mı?</h2>

<p>Sapir-Whorf hipoteziyle ilişkilendirilen <strong>dilsel görecelik</strong>, konuştuğumuz dilin dünyayı algılama ve kategorilere ayırma biçimimizi etkilediğini savunur. Kuramın güçlü yorumu dilin düşünceyi belirlediğini, daha ılımlı ve günümüzde daha fazla kabul gören yorumu ise bazı düşünme alışkanlıklarını yönlendirdiğini söyler.</p>

<p>Örneğin Türkçedeki “o” zamiri konuşulan kişinin cinsiyetini belirtmez. İngilizceye çeviri yapan bir model ise bağlama göre “he”, “she” veya “they” seçmek zorundadır. Kaynak dilin açık bırakabildiği bir özellik, hedef dilde karara dönüşür. Model yalnızca çeviri yapmaz; belirsizliği yorumlar.</p>

<table>
  <thead>
    <tr>
      <th>Dilsel özellik</th>
      <th>Kaynak dildeki işlev</th>
      <th>Çeviride oluşabilecek kayıp</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Saygı hitapları</td>
      <td>Yaş ve statüyü gösterir</td>
      <td>İlişki sıradanlaşabilir</td>
    </tr>
    <tr>
      <td>Cinsiyetsiz zamir</td>
      <td>Kimliği belirsiz bırakır</td>
      <td>Modele ait varsayım eklenebilir</td>
    </tr>
    <tr>
      <td>Deyim ve atasözü</td>
      <td>Ortak kültürel hafıza taşır</td>
      <td>Düz, açıklayıcı cümleye dönüşebilir</td>
    </tr>
    <tr>
      <td>Kanıtsallık ekleri</td>
      <td>Bilginin kaynağını belirtir</td>
      <td>Kesinlik derecesi değişebilir</td>
    </tr>
  </tbody>
</table>

<h2 id="modeller-en-doğruyu-nasıl-seçiyor">Modeller “en doğruyu” nasıl seçiyor?</h2>

<p>Modern çeviri sistemleri, bir hedef cümlenin kaynak cümle verildiğinde ne kadar olası olduğunu hesaplar. Basitleştirilmiş amaç şöyle yazılabilir:</p>

\[\hat{y}=\arg\max_y P(y\mid x)\]

<p>Burada $x$ kaynak metin, $y$ hedef metindir. Sorun şudur: En olası çeviri, kültürel açıdan en sadık çeviri olmak zorunda değildir. Eğitim verilerinde sık görülen kalıplar yüksek olasılık kazanır; az temsil edilen lehçeler, yerel benzetmeler veya toplumsal nezaket biçimleri ise istatistiksel gürültü gibi değerlendirilebilir.</p>

<p>Kayıp yalnızca sözcük düzeyinde ölçülemez. Kavramsal olarak kültürel maliyeti şöyle düşünebiliriz:</p>

\[C=\alpha L_s+\beta L_p+\gamma L_c\]

<p>$L_s$ anlamsal kaybı, $L_p$ pragmatik yani bağlamsal kaybı, $L_c$ kültürel çağrışım kaybını temsil eder. Geleneksel otomatik ölçütler çoğunlukla ilk bileşene odaklanırken diğer ikisini yakalamakta zorlanır.</p>

<h2 id="küçük-bir-belirsizlik-deneyi">Küçük bir belirsizlik deneyi</h2>

<p>Aşağıdaki Python kodu, tek bir çeviri yerine adayların puanlarını incelemenin neden önemli olduğunu gösteren basitleştirilmiş bir örnektir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">adaylar</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">He said he would come.</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.46</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">She said she would come.</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.41</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">They said they would come.</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.13</span>
<span class="p">}</span>

<span class="n">sirali</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">adaylar</span><span class="p">.</span><span class="nf">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">for</span> <span class="n">ceviri</span><span class="p">,</span> <span class="n">olasilik</span> <span class="ow">in</span> <span class="n">sirali</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">olasilik</span><span class="si">:</span><span class="p">.</span><span class="mi">0</span><span class="o">%</span><span class="si">}</span><span class="s"> — </span><span class="si">{</span><span class="n">ceviri</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Kaynak cümle “O geleceğini söyledi” ise ilk iki aday arasındaki küçük fark, modelin gerçek bilgiye sahip olduğunu göstermez. Bu fark; eğitim verilerindeki meslek, isim veya toplumsal cinsiyet dağılımlarından kaynaklanabilir. Sistem kendinden emin bir cümle üretirken aslında kültürel bir tahminde bulunmaktadır.</p>

<h2 id="daha-duyarlı-çeviri-mümkün-mü">Daha duyarlı çeviri mümkün mü?</h2>

<p>Çözüm, makineleri terk etmek değil; başarı tanımını genişletmektir. Modeller bağlam sormalı, belirsizlikleri işaretlemeli ve birden fazla çeviri önermelidir. Değerlendirme ekiplerinde yerel konuşurlar, çevirmenler ve kültür araştırmacıları bulunmalıdır. Ayrıca “akıcı” görünen her çıktının sadık olmadığı unutulmamalıdır.</p>

<p>Makine çevirisi diller arasındaki mesafeyi olağanüstü biçimde azaltıyor. Yine de hızın bedeli, farklı düşünme biçimlerinin tek ve pürüzsüz bir ifadeye sıkıştırılması olabilir. İyi bir çeviri yalnızca “Bu cümle ne diyor?” sorusunu değil, “Bu dil dünyayı neden böyle söylüyor?” sorusunu da koruyabilmelidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine çevirisi" /><category term="dilsel görecelik" /><category term="yapay zekâ" /><summary type="html"><![CDATA[Bir çeviri uygulamasına birkaç sözcük yazıp saniyeler içinde başka bir dilde karşılığını almak neredeyse sihir gibi görünüyor. Ancak dil yalnızca bilgi taşıyan nötr bir boru değildir; hitap biçimleri, toplumsal ilişkiler, tarihsel çağrışımlar ve dünyayı sınıflandırma alışkanlıkları da sözcüklerin içinde yolculuk eder. Makine çevirisi anlamı aktarırken bu görünmez yükün bir bölümünü peronda bırakabilir.]]></summary></entry><entry><title type="html">NoSQL ve MongoDB ile Doküman Tabanlı Veri Modelleme</title><link href="https://sonsuzus.github.io/posts/nosql-ve-mongodb-ile-dokuman-tabanli-veri-modelleme/" rel="alternate" type="text/html" title="NoSQL ve MongoDB ile Doküman Tabanlı Veri Modelleme" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/nosql-ve-mongodb-ile-dokuman-tabanli-veri-modelleme</id><content type="html" xml:base="https://sonsuzus.github.io/posts/nosql-ve-mongodb-ile-dokuman-tabanli-veri-modelleme/"><![CDATA[<p>Bir e-ticaret ürününün renkleri, kampanyaları, kullanıcı yorumları ve kategoriye göre değişen özellikleri olduğunu düşünün. Bu verileri ilişkisel tablolara dağıtmak mümkündür; ancak tablo sayısı ve JOIN işlemleri kısa sürede küçük bir yapboza dönüşebilir. Doküman tabanlı veritabanları, ilişkili bilgileri JSON benzeri tek bir yapı içinde saklayarak bu karmaşıklığa farklı bir çözüm sunar. MongoDB bu yaklaşımın en tanınmış temsilcilerindendir; fakat sunduğu esneklik, kuralsız veri depolamak anlamına gelmez.</p>

<p>``</p>

<h2 id="tablo-yerine-doküman-düşünmek">Tablo yerine doküman düşünmek</h2>

<p>İlişkisel modelde veriler satır, sütun ve tablolarla temsil edilir. MongoDB ise verileri <strong>collection</strong> adı verilen koleksiyonlarda, BSON biçimindeki dokümanlar olarak saklar. BSON; JSON yapısını tarih, ondalık sayı ve ikili veri gibi ek türlerle genişletir.</p>

<p>Örnek bir ürün dokümanı şöyle olabilir:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"urun-42"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"ad"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Mekanik Klavye"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"fiyat"</span><span class="p">:</span><span class="w"> </span><span class="mf">2499.90</span><span class="p">,</span><span class="w">
  </span><span class="nl">"stok"</span><span class="p">:</span><span class="w"> </span><span class="mi">18</span><span class="p">,</span><span class="w">
  </span><span class="nl">"ozellikler"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"switch"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Brown"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"baglanti"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"USB-C"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Bluetooth"</span><span class="p">]</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"yorumlar"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="nl">"kullanici"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Ada"</span><span class="p">,</span><span class="w"> </span><span class="nl">"puan"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Bu doküman, ürünün temel alanlarını, iç içe nesnelerini ve dizilerini birlikte taşır. Uygulama ürünü okuduğunda çoğu bilgiyi tek sorguyla elde edebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>İlişkisel SQL</th>
      <th>Doküman tabanlı NoSQL</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yapı</td>
      <td>Önceden tanımlı şema</td>
      <td>Esnek doküman yapısı</td>
    </tr>
    <tr>
      <td>İlişkiler</td>
      <td>JOIN ve yabancı anahtar</td>
      <td>Gömme veya referans</td>
    </tr>
    <tr>
      <td>Ölçekleme</td>
      <td>Genellikle dikey</td>
      <td>Yatay ölçeklemeye uygun</td>
    </tr>
    <tr>
      <td>Tutarlılık</td>
      <td>Güçlü transaction geleneği</td>
      <td>Kullanıma göre ayarlanabilir</td>
    </tr>
    <tr>
      <td>İdeal kullanım</td>
      <td>Düzenli, ilişkisel veriler</td>
      <td>Değişken ve iç içe veriler</td>
    </tr>
  </tbody>
</table>

<h2 id="şemasız-kuralsız-demek-değildir">Şemasız, kuralsız demek değildir</h2>

<p>MongoDB için sıkça “şemasız” ifadesi kullanılır. Daha doğru tanım <strong>esnek şemalı</strong>dır. Aynı koleksiyondaki dokümanlar farklı alanlar taşıyabilir; ancak uygulama kodu, indeksler ve doğrulama kuralları yine ortak bir veri sözleşmesine ihtiyaç duyar. Aksi hâlde <code class="language-plaintext highlighter-rouge">fiyat</code> alanı bir dokümanda sayı, diğerinde metin olabilir ve raporlama sırasında sürpriz yumurtaya dönüşebilir.</p>

<p>Veri doğrulama kurallarıyla bu risk azaltılabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">db</span><span class="p">.</span><span class="nf">createCollection</span><span class="p">(</span><span class="dl">"</span><span class="s2">urunler</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span>
  <span class="na">validator</span><span class="p">:</span> <span class="p">{</span>
    <span class="na">$jsonSchema</span><span class="p">:</span> <span class="p">{</span>
      <span class="na">bsonType</span><span class="p">:</span> <span class="dl">"</span><span class="s2">object</span><span class="dl">"</span><span class="p">,</span>
      <span class="na">required</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">ad</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">fiyat</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">stok</span><span class="dl">"</span><span class="p">],</span>
      <span class="na">properties</span><span class="p">:</span> <span class="p">{</span>
        <span class="na">ad</span><span class="p">:</span> <span class="p">{</span> <span class="na">bsonType</span><span class="p">:</span> <span class="dl">"</span><span class="s2">string</span><span class="dl">"</span> <span class="p">},</span>
        <span class="na">fiyat</span><span class="p">:</span> <span class="p">{</span> <span class="na">bsonType</span><span class="p">:</span> <span class="dl">"</span><span class="s2">double</span><span class="dl">"</span><span class="p">,</span> <span class="na">minimum</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span>
        <span class="na">stok</span><span class="p">:</span> <span class="p">{</span> <span class="na">bsonType</span><span class="p">:</span> <span class="dl">"</span><span class="s2">int</span><span class="dl">"</span><span class="p">,</span> <span class="na">minimum</span><span class="p">:</span> <span class="mi">0</span> <span class="p">}</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">})</span>
</code></pre></div></div>

<p>Bu kod, zorunlu alanları ve kabul edilen veri türlerini belirleyerek esneklik ile güvenilirlik arasında denge kurar.</p>

<h2 id="gömme-mi-referans-mı">Gömme mi, referans mı?</h2>

<p>Doküman modellemenin kritik kararı, ilişkili veriyi ana dokümana <strong>gömmek</strong> veya başka koleksiyona koyup <strong>referans vermektir</strong>. Birlikte okunan ve sınırlı büyüyen veriler gömülebilir. Sürekli büyüyen, bağımsız güncellenen ya da birçok doküman tarafından paylaşılan veriler referanslanmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Tercih</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sipariş içindeki teslimat adresi</td>
      <td>Gömme</td>
    </tr>
    <tr>
      <td>Ürünün birkaç teknik özelliği</td>
      <td>Gömme</td>
    </tr>
    <tr>
      <td>Milyonlarca kullanıcı yorumu</td>
      <td>Referans</td>
    </tr>
    <tr>
      <td>Birçok üründe kullanılan marka</td>
      <td>Referans</td>
    </tr>
  </tbody>
</table>

<p>Basit bir karar ölçüsü şöyle düşünülebilir:</p>

\[Maliyet = Okuma\ Sayısı \times JOIN\ Yükü + Güncelleme\ Sayısı \times Tekrar\ Yükü\]

<p>Gömme, okuma maliyetini azaltırken tekrarlanan verinin güncelleme maliyetini artırabilir. Referanslama ise tekrarı azaltır fakat ek sorgu veya <code class="language-plaintext highlighter-rouge">$lookup</code> gerektirebilir. Bu nedenle model, nesnelerden önce uygulamanın <strong>erişim desenlerine</strong> göre tasarlanmalıdır.</p>

<h2 id="sorgulama-ve-indeksleme">Sorgulama ve indeksleme</h2>

<p>İç içe alanlar nokta gösterimiyle sorgulanabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">db</span><span class="p">.</span><span class="nx">urunler</span><span class="p">.</span><span class="nf">find</span><span class="p">({</span>
  <span class="dl">"</span><span class="s2">ozellikler.baglanti</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Bluetooth</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">fiyat</span><span class="p">:</span> <span class="p">{</span> <span class="na">$lte</span><span class="p">:</span> <span class="mi">3000</span> <span class="p">}</span>
<span class="p">})</span>
</code></pre></div></div>

<p>Sorgu Bluetooth destekleyen ve belirlenen fiyatın altındaki ürünleri getirir. Sık kullanılan alanlarda indeks oluşturmak performansı yükseltir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">db</span><span class="p">.</span><span class="nx">urunler</span><span class="p">.</span><span class="nf">createIndex</span><span class="p">({</span>
  <span class="dl">"</span><span class="s2">ozellikler.baglanti</span><span class="dl">"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="na">fiyat</span><span class="p">:</span> <span class="mi">1</span>
<span class="p">})</span>
</code></pre></div></div>

<p>İndeksler okumayı hızlandırır; ancak disk kullanımı ile yazma maliyetini artırır. Dolayısıyla “her alana indeks” yaklaşımı, veritabanına gereksiz ağırlık bağlamak gibidir.</p>

<p>Sonuç olarak MongoDB, değişken yapılı ve hızla gelişen uygulamalarda güçlü bir seçenektir. Başarılı bir doküman modeli; veri ilişkilerini, büyüme hızını, atomik güncelleme sınırlarını ve sorgu alışkanlıklarını birlikte değerlendirir. NoSQL, SQL’in rakibi değil; doğru problemde kullanılan farklı bir araçtır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="NoSQL" /><category term="MongoDB" /><category term="Veri Modelleme" /><summary type="html"><![CDATA[Bir e-ticaret ürününün renkleri, kampanyaları, kullanıcı yorumları ve kategoriye göre değişen özellikleri olduğunu düşünün. Bu verileri ilişkisel tablolara dağıtmak mümkündür; ancak tablo sayısı ve JOIN işlemleri kısa sürede küçük bir yapboza dönüşebilir. Doküman tabanlı veritabanları, ilişkili bilgileri JSON benzeri tek bir yapı içinde saklayarak bu karmaşıklığa farklı bir çözüm sunar. MongoDB bu yaklaşımın en tanınmış temsilcilerindendir; fakat sunduğu esneklik, kuralsız veri depolamak anlamına gelmez.]]></summary></entry><entry><title type="html">Paralel Programlamanın Zihinsel Bedeli: Beynimiz Neden Yarış Koşullarını Sevmez?</title><link href="https://sonsuzus.github.io/posts/paralel-programlamanin-zihinsel-bedeli-beynimiz-neden-yaris-kosullarini-sevmez/" rel="alternate" type="text/html" title="Paralel Programlamanın Zihinsel Bedeli: Beynimiz Neden Yarış Koşullarını Sevmez?" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/paralel-programlamanin-zihinsel-bedeli-beynimiz-neden-yaris-kosullarini-sevmez</id><content type="html" xml:base="https://sonsuzus.github.io/posts/paralel-programlamanin-zihinsel-bedeli-beynimiz-neden-yaris-kosullarini-sevmez/"><![CDATA[<p>Bir programın aynı anda birkaç iş yapması kulağa verimlilik gibi gelir: dosya indirirken arayüz yanıt verir, sunucu binlerce isteği işler, işlemci çekirdekleri veriyi paylaşır. Ne var ki kod hızlanırken onu anlamaya çalışan insan zihni yavaşlayabilir. Çünkü beynimiz olayları öyküler gibi, çoğunlukla belirli bir sırayla kavrar; eşzamanlı programlarsa tek bir öykü yerine birbirine karışabilen çok sayıda olası senaryo üretir.
``</p>

<h2 id="eşzamanlılık-ile-paralellik-aynı-şey-değildir">Eşzamanlılık ile paralellik aynı şey değildir</h2>

<p><strong>Eşzamanlılık</strong>, birden fazla işin ilerleyişinin aynı zaman aralığında yönetilmesidir. <strong>Paralellik</strong> ise bu işlerden birkaçının fiziksel olarak aynı anda yürütülmesidir. Tek çekirdekli bir işlemci görevler arasında hızla geçiş yaparak eşzamanlı olabilir; çok çekirdekli bir işlemciyse görevleri gerçekten paralel çalıştırabilir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Temel soru</th>
      <th>İnsan zihnindeki benzeri</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sıralı çalışma</td>
      <td>Sonraki adım hangisi?</td>
      <td>Tarifi adım adım uygulamak</td>
    </tr>
    <tr>
      <td>Eşzamanlılık</td>
      <td>Hangi iş ne zaman ilerleyecek?</td>
      <td>Yemek yaparken telefonu yanıtlamak</td>
    </tr>
    <tr>
      <td>Paralellik</td>
      <td>Kaç iş gerçekten aynı anda çalışıyor?</td>
      <td>Bir ekibin farklı işleri paylaşması</td>
    </tr>
    <tr>
      <td>Senkronizasyon</td>
      <td>Kim, kimi beklemeli?</td>
      <td>Toplantıya herkesin gelmesini beklemek</td>
    </tr>
  </tbody>
</table>

<p>Bu ayrım önemlidir; fakat zihinsel bedelin ana kaynağı ikisinde de aynıdır: olası yürütme sıralarının çoğalması.</p>

<h2 id="olasılık-ağacı-neden-hızla-büyür">Olasılık ağacı neden hızla büyür?</h2>

<p>İki iş parçacığının üçer atomik adımı olduğunu düşünelim. Her iş parçacığının kendi iç sırası korunurken adımlar farklı biçimlerde iç içe geçebilir. Olası sıralama sayısı kabaca kombinasyonla hesaplanır:</p>

\[N = \frac{(a+b)!}{a!b!}\]

<p>$a=3$ ve $b=3$ için $N=20$ olur. İş parçacığı ve adım sayısı arttıkça sayı patlar. Üstelik gerçek programlarda önbellek, işletim sistemi zamanlayıcısı, G/Ç gecikmesi ve bellek modeli de oyuna katılır. Programcı yalnızca “Kod ne yapıyor?” sorusunu değil, “Başka hangi sırayla yapabilir?” sorusunu da yanıtlamak zorundadır.</p>

<p>İnsan çalışma belleği sınırlıdır. Birkaç değişkenin değerini, kilitlerin durumunu ve iş parçacıklarının konumunu aynı anda zihinde tutmaya çalışmak bilişsel yükü artırır. Bu nedenle eşzamanlılık hataları çoğu zaman kodu yazarken değil, nadir bir zamanlama gerçekleştiğinde ortaya çıkar.</p>

<h2 id="klasik-tuzak-yarış-koşulu">Klasik tuzak: yarış koşulu</h2>

<p>Aşağıdaki Python örneğinde iki iş parçacığı aynı sayacı artırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">threading</span>

<span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">def</span> <span class="nf">increment</span><span class="p">():</span>
    <span class="k">global</span> <span class="n">counter</span>
    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">100_000</span><span class="p">):</span>
        <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>  <span class="c1"># Okuma, artırma ve yazma tek bir düşünsel adım değildir.
</span>
<span class="n">threads</span> <span class="o">=</span> <span class="p">[</span><span class="n">threading</span><span class="p">.</span><span class="nc">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">increment</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">thread</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
    <span class="n">thread</span><span class="p">.</span><span class="nf">start</span><span class="p">()</span>
<span class="k">for</span> <span class="n">thread</span> <span class="ow">in</span> <span class="n">threads</span><span class="p">:</span>
    <span class="n">thread</span><span class="p">.</span><span class="nf">join</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="n">counter</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">counter += 1</code> basit görünür; ancak kavramsal olarak değeri okuma, yeni değeri hesaplama ve geri yazma aşamalarından oluşur. İki iş parçacığı aynı eski değeri okuyabilir ve artışlardan biri kaybolabilir. Buna <strong>yarış koşulu</strong> denir: sonuç, işlemlerin zamanlamasına bağlıdır.</p>

<p>Bir kilit kritik bölgeyi koruyabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">lock</span> <span class="o">=</span> <span class="n">threading</span><span class="p">.</span><span class="nc">Lock</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">safe_increment</span><span class="p">():</span>
    <span class="k">global</span> <span class="n">counter</span>
    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">100_000</span><span class="p">):</span>
        <span class="k">with</span> <span class="n">lock</span><span class="p">:</span>
            <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>  <span class="c1"># Bu bölgeye aynı anda yalnızca bir iş parçacığı girer.
</span></code></pre></div></div>

<p>Kilidin bedeli yalnızca performans değildir. Programcı artık kilidin nerede alındığını, ne zaman bırakıldığını ve başka kilitlerle hangi sırada kullanıldığını da izlemelidir. Yanlış sıra, bu kez deadlock adlı “Herkes birbirini bekliyor” komedisine dönüşebilir.</p>

<h2 id="beyne-uygun-eşzamanlılık-tasarlamak">Beyne uygun eşzamanlılık tasarlamak</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Zihinsel avantaj</th>
      <th>Olası bedel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Değişmez veri</td>
      <td>Paylaşılan durum azalır</td>
      <td>Daha fazla kopyalama</td>
    </tr>
    <tr>
      <td>Mesajlaşma</td>
      <td>Etkileşim açık hale gelir</td>
      <td>Mesaj sırası yönetilmelidir</td>
    </tr>
    <tr>
      <td>Actor modeli</td>
      <td>Durum tek sahipte toplanır</td>
      <td>Mimari öğrenme gerektirir</td>
    </tr>
    <tr>
      <td>Yapılandırılmış eşzamanlılık</td>
      <td>Görev ömürleri sınırlandırılır</td>
      <td>Eski API’lerle uyum zorlaşabilir</td>
    </tr>
  </tbody>
</table>

<p>En güvenli strateji, beynimizi daha fazla iş parçacığı düşünmeye zorlamak değil, düşünülmesi gereken durum sayısını azaltmaktır. Paylaşılan değişkenleri sınırlamak, saf fonksiyonlar kullanmak, görev sahipliğini açıkça belirtmek ve zaman aşımı tasarlamak kodu anlatılabilir hale getirir.</p>

<p>Sonuçta paralel programlama yalnızca işlemci çekirdeklerini yönetme sanatı değildir; olasılık uzayını insan zihninin taşıyabileceği boyuta indirme sanatıdır. İyi eşzamanlı kod, sadece hızlı çalışan değil, sabah kahvesinden önce bile hangi olayın kimi beklediği anlaşılabilen koddur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="paralel programlama" /><category term="eşzamanlılık" /><category term="yazılım mimarisi" /><summary type="html"><![CDATA[Bir programın aynı anda birkaç iş yapması kulağa verimlilik gibi gelir: dosya indirirken arayüz yanıt verir, sunucu binlerce isteği işler, işlemci çekirdekleri veriyi paylaşır. Ne var ki kod hızlanırken onu anlamaya çalışan insan zihni yavaşlayabilir. Çünkü beynimiz olayları öyküler gibi, çoğunlukla belirli bir sırayla kavrar; eşzamanlı programlarsa tek bir öykü yerine birbirine karışabilen çok sayıda olası senaryo üretir.]]></summary></entry><entry><title type="html">Programcı Mizahının Sosyolojisi: Bug Değil, Grup Özelliği</title><link href="https://sonsuzus.github.io/posts/programci-mizahinin-sosyolojisi-bug-degil-grup-ozelligi/" rel="alternate" type="text/html" title="Programcı Mizahının Sosyolojisi: Bug Değil, Grup Özelliği" /><published>2026-08-01T00:00:00+00:00</published><updated>2026-08-01T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/programci-mizahinin-sosyolojisi-bug-degil-grup-ozelligi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/programci-mizahinin-sosyolojisi-bug-degil-grup-ozelligi/"><![CDATA[<p>Bir yazılımcı toplantıda “Bende çalışıyor” dediğinde odadaki programcılar gülerken diğerleri neden endişeyle birbirine bakar? Çünkü programcı mizahı yalnızca komik cümlelerden değil; ortak deneyimlerden, teknik bilgiden ve mesleki hayal kırıklıklarından oluşur. Şakayı anlamak, çoğu zaman şifreli bir paketi açmak gibidir: Doğru kültürel anahtar sizde yoksa veri anlamsız görünür.
``</p>
<h2 id="mizahın-görünmeyen-bağımlılıkları">Mizahın görünmeyen bağımlılıkları</h2>

<p>Sosyolojide grup kimliği, insanların kendilerini bir topluluğun parçası olarak tanımlamasıyla oluşur. Ortak dil, ritüeller ve semboller bu kimliği güçlendirir. Yazılımcılar için kod incelemeleri, sürüm çıkışları, üretim hataları ve bitmeyen toplantılar birer mesleki ritüeldir. “Ön belleği temizledin mi?” sorusu ise bazen teknik öneriden çok kültürel selamlaşmaya dönüşür.</p>

<p>Programcı şakasının etkisini basitçe şöyle düşünebiliriz:</p>

\[M = B \times D \times T\]

<p>Burada $M$ mizahın etkisini, $B$ paylaşılan bilgiyi, $D$ ortak deneyimi ve $T$ doğru zamanlamayı temsil eder. Değişkenlerden biri sıfıra yaklaşırsa şaka da sessizce başarısız olur. Bir veritabanı esprisini düğünde anlatmak, doğru kodu yanlış ortamda çalıştırmaya benzer.</p>

<h2 id="i̇ç-grup-ve-dış-grup-farkı">İç grup ve dış grup farkı</h2>

<p>Mesleki mizah, “biz” ile “onlar” arasındaki sınırı görünür kılar. Şakayı anlayan kişi yalnızca teknik detayı çözmez; aynı zamanda “Ben de bunu yaşadım” mesajı verir.</p>

<table>
  <thead>
    <tr>
      <th>Mizah türü</th>
      <th>Gerekli arka plan</th>
      <th>Grup içindeki işlevi</th>
      <th>Dışarıdan algısı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Syntax şakası</td>
      <td>Programlama dili bilgisi</td>
      <td>Teknik yeterliği işaretler</td>
      <td>Anlamsız karakterler</td>
    </tr>
    <tr>
      <td>Bug hikâyesi</td>
      <td>Hata ayıklama deneyimi</td>
      <td>Ortak acıyı paylaşır</td>
      <td>İş kazası anlatısı</td>
    </tr>
    <tr>
      <td>Toplantı mizahı</td>
      <td>Kurumsal yazılım kültürü</td>
      <td>Gerilimi azaltır</td>
      <td>Ofis yakınması</td>
    </tr>
    <tr>
      <td>Dil rekabeti</td>
      <td>Araç ve ekosistem bilgisi</td>
      <td>Alt grup kimliği kurar</td>
      <td>Gereksiz tartışma</td>
    </tr>
  </tbody>
</table>

<p>Örneğin aşağıdaki kod, teknik olarak basit olsa da kültürel bir hikâye anlatır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">production_ready</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">code</span><span class="p">.</span><span class="n">works_on_my_machine</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">'</span><span class="s">Deploy edelim, ne olabilir ki?</span><span class="sh">'</span>
    <span class="k">return</span> <span class="sh">'</span><span class="s">Bir toplantı daha planla</span><span class="sh">'</span>
</code></pre></div></div>

<p>Bu kod gerçek bir dağıtım sistemi değildir. Mizah, riskli özgüven ile kurumsal toplantı alışkanlığını aynı yerde buluşturur. Şakayı komik yapan <code class="language-plaintext highlighter-rouge">if</code> yapısı değil, üretim ortamında işlerin nadiren planlandığı kadar kolay ilerlemesidir.</p>

<h2 id="kültürel-sermaye-olarak-şaka">Kültürel sermaye olarak şaka</h2>

<p>Sosyolog Pierre Bourdieu’nün kültürel sermaye kavramı, belirli bir alanda değer gören bilgi ve davranışları açıklar. Programcı topluluklarında eski teknolojileri bilmek, meşhur hata mesajlarını tanımak veya bir regex şakasını hızla çözmek sembolik statü sağlayabilir. Şakaya erken gülen kişi, adeta görünmez bir teknik rozet takar.</p>

<p>Fakat bu mekanizma masum değildir. Aşırı içe kapalı mizah yeni başlayanları, farklı uzmanlıklardan çalışanları veya teknik olmayan ekip üyelerini dışlayabilir. “Bunu anlamıyorsan bizden değilsin” tavrı, ekip dayanışması yerine hiyerarşi üretir. Kapsayıcı mizah ise deneyimi paylaşır ama bilgi eksikliğini küçümsemez.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">ekipMizahi</span> <span class="o">=</span> <span class="p">(</span><span class="nx">saka</span><span class="p">,</span> <span class="nx">baglam</span><span class="p">)</span> <span class="o">=&gt;</span>
  <span class="nx">baglam</span><span class="p">.</span><span class="nx">herkesAnliyor</span> <span class="p">?</span> <span class="nx">saka</span> <span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">saka</span><span class="p">}</span><span class="s2"> — kısa açıklaması da burada`</span><span class="p">;</span>
</code></pre></div></div>

<p>Bu örnek, şakayı yasaklamak yerine bağlam eklemeyi önerir. İyi ekipler içeriden şakalarını korurken yeni üyelerin kültürel bağımlılıkları kurmasına da yardım eder.</p>

<h2 id="sonuç-kahkaha-bir-kimlik-protokolüdür">Sonuç: Kahkaha bir kimlik protokolüdür</h2>

<p>Programcı mizahı; stres boşaltma, uzmanlık gösterme ve aidiyet kurma aracıdır. Ortak bir bug’a gülmek, “Bu kaosu birlikte tanıyoruz” demektir. Ancak en sağlıklı topluluklar mizahı güvenlik duvarına çevirmeyenlerdir. Şaka grubun kapısını kilitlemek yerine yeni gelenlere README sunabiliyorsa, hem komik hem de sürdürülebilirdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="programcı mizahı" /><category term="yazılım kültürü" /><category term="grup kimliği" /><summary type="html"><![CDATA[Bir yazılımcı toplantıda “Bende çalışıyor” dediğinde odadaki programcılar gülerken diğerleri neden endişeyle birbirine bakar? Çünkü programcı mizahı yalnızca komik cümlelerden değil; ortak deneyimlerden, teknik bilgiden ve mesleki hayal kırıklıklarından oluşur. Şakayı anlamak, çoğu zaman şifreli bir paketi açmak gibidir: Doğru kültürel anahtar sizde yoksa veri anlamsız görünür.]]></summary></entry></feed>