<?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-07-29T10:13:23+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">Bellek Sızıntılarının Psikanalizi: Kodun Bilinçdışında Biriken Nesneler</title><link href="https://sonsuzus.github.io/posts/bellek-sizintilarinin-psikanalizi-kodun-bilincdisinda-biriken-nesneler/" rel="alternate" type="text/html" title="Bellek Sızıntılarının Psikanalizi: Kodun Bilinçdışında Biriken Nesneler" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/bellek-sizintilarinin-psikanalizi-kodun-bilincdisinda-biriken-nesneler</id><content type="html" xml:base="https://sonsuzus.github.io/posts/bellek-sizintilarinin-psikanalizi-kodun-bilincdisinda-biriken-nesneler/"><![CDATA[<p>Bir program bazen hiçbir şeyi unutamaz. Kullanıcı pencereyi kapatır, işlem tamamlanır, nesnenin hikâyedeki rolü biter; fakat kod, geçmişiyle bağını kesmez. Belleğin karanlık bir köşesinde duran bu nesneler, dijital bilinçdışının bastırılmış anıları gibidir. Uygulama çalışmayı sürdürürken onların kapladığı alan büyür ve sonunda sistem, konuşamadığı meseleleri RAM tüketerek ifade etmeye başlar.
``</p>
<h2 id="bellek-sızıntısı-gerçekten-nedir">Bellek sızıntısı gerçekten nedir?</h2>

<p>Bellek sızıntısı, artık işe yaramayan bir bellek bölgesinin serbest bırakılamaması durumudur. Buradaki kritik ayrım, belleğin yalnızca <strong>kullanılıyor görünmesi</strong> ile gerçekten <strong>gerekli olması</strong> arasındadır. Bir nesneye hâlâ erişilebiliyorsa çöp toplayıcı onu canlı kabul eder; nesnenin uygulama açısından hiçbir anlam taşımaması bu kararı değiştirmez.</p>

<p>Bir sürecin yaklaşık bellek davranışını şöyle düşünebiliriz:</p>

\[M(t) = M_0 + A(t) - F(t)\]

<p>Burada $M_0$ başlangıç belleği, $A(t)$ ayrılan toplam alan, $F(t)$ ise geri verilen alandır. İş yükü sabitlenmesine rağmen $A(t)-F(t)$ sürekli büyüyorsa ortada yalnızca yoğun kullanım değil, muhtemel bir sızıntı vardır.</p>

<table>
  <thead>
    <tr>
      <th>Psikanalitik metafor</th>
      <th>Yazılımdaki karşılığı</th>
      <th>Ortaya çıkan belirti</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bastırılmış anı</td>
      <td>Serbest bırakılmamış bellek</td>
      <td>RAM kullanımının büyümesi</td>
    </tr>
    <tr>
      <td>Koparılamayan bağ</td>
      <td>Gereksiz nesne referansı</td>
      <td>Çöp toplayıcının nesneyi silememesi</td>
    </tr>
    <tr>
      <td>Tekrarlama dürtüsü</td>
      <td>Her istekte yeniden kaynak ayırma</td>
      <td>Düzenli ve basamaklı artış</td>
    </tr>
    <tr>
      <td>Terapi</td>
      <td>Profiling ve hata ayıklama</td>
      <td>Sızıntı kaynağının görünür olması</td>
    </tr>
  </tbody>
</table>

<h2 id="manuel-yönetim-unutma-sorumluluğu-geliştiricide">Manuel yönetim: Unutma sorumluluğu geliştiricide</h2>

<p>C ve C++ gibi dillerde bellek ayırmak ile onu serbest bırakmak geliştiricinin sorumluluğundadır. Aşağıdaki fonksiyon, her çağrıda yeni bir alan oluşturur ancak bu alanı geri vermez:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span>
<span class="kt">void</span> <span class="nf">rapor_uret</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">veriler</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="mi">1000</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">veriler</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>

    <span class="n">veriler</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="c1">// İşlem bitti, fakat free(veriler) çağrılmadı.</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Fonksiyon sona erdiğinde <code class="language-plaintext highlighter-rouge">veriler</code> işaretçisi kaybolur. Ayrılan bölgeye artık erişilemez, dolayısıyla sonradan <code class="language-plaintext highlighter-rouge">free</code> çağırmak da mümkün değildir. Çözüm, sahiplik süresini açıkça belirlemektir:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">rapor_uret</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">veriler</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="mi">1000</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">veriler</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>

    <span class="n">veriler</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="c1">// Verilerle yapılan işlemler burada tamamlanır.</span>

    <span class="n">free</span><span class="p">(</span><span class="n">veriler</span><span class="p">);</span>
    <span class="n">veriler</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">free</code>, kaynağı sisteme iade eder. İşaretçiyi <code class="language-plaintext highlighter-rouge">NULL</code> yapmak ise yanlışlıkla aynı alanı yeniden kullanma riskini azaltır.</p>

<h2 id="çöp-toplayıcı-her-şeyi-çözer-mi">Çöp toplayıcı her şeyi çözer mi?</h2>

<p>JavaScript, Java ve C# gibi dillerde garbage collector erişilemeyen nesneleri otomatik olarak temizler. Ancak otomasyon, psikolojik bağları koparamaz; gereksiz bir referans korunuyorsa nesne hâlâ erişilebilir sayılır.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">gecmisMesajlar</span> <span class="o">=</span> <span class="p">[];</span>

<span class="kd">function</span> <span class="nf">mesajiIsle</span><span class="p">(</span><span class="nx">mesaj</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">analiz</span> <span class="o">=</span> <span class="p">{</span>
    <span class="na">hamVeri</span><span class="p">:</span> <span class="nx">mesaj</span><span class="p">,</span>
    <span class="na">zaman</span><span class="p">:</span> <span class="nb">Date</span><span class="p">.</span><span class="nf">now</span><span class="p">(),</span>
    <span class="na">sonuc</span><span class="p">:</span> <span class="nx">mesaj</span><span class="p">.</span><span class="nf">toUpperCase</span><span class="p">()</span>
  <span class="p">};</span>

  <span class="nx">gecmisMesajlar</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="nx">analiz</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">gecmisMesajlar</code> sınırsız büyüdüğü için her analiz bellekte kalır. Burada sızıntı, unutulmuş bir <code class="language-plaintext highlighter-rouge">free</code> çağrısından değil, tasarımsal olarak bitmeyen saklama davranışından doğar. Sınırlı bir önbellek daha sağlıklıdır:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">SINIR</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>

<span class="nx">gecmisMesajlar</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="nx">analiz</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">gecmisMesajlar</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="nx">SINIR</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">gecmisMesajlar</span><span class="p">.</span><span class="nf">shift</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="kodun-terapi-seansı">Kodun terapi seansı</h2>

<p>Sızıntıları bulmak için Chrome DevTools Heap Snapshot, Valgrind, AddressSanitizer veya VisualVM gibi araçlar kullanılabilir. Tek bir ölçüme bakmak yerine aynı senaryoyu defalarca çalıştırıp bellek eğrisini izlemek gerekir. İşlem bittikten sonra bellek başlangıç seviyesine yaklaşmıyorsa nesnelerin referans zincirleri incelenmelidir.</p>

<p>Sonuçta iyi bellek yönetimi, yalnızca alan boşaltmak değildir; bir kaynağın <strong>kim tarafından</strong>, <strong>ne kadar süreyle</strong> ve <strong>hangi koşulda</strong> tutulacağını bilmektir. İnsan geçmişiyle yüzleşerek, program ise referanslarını keserek hafifler. Bazen en etkili optimizasyon, koda nazikçe şunu söylemektir: Artık bunu bırakabilirsin.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bellek yönetimi" /><category term="memory leak" /><category term="hata ayıklama" /><summary type="html"><![CDATA[Bir program bazen hiçbir şeyi unutamaz. Kullanıcı pencereyi kapatır, işlem tamamlanır, nesnenin hikâyedeki rolü biter; fakat kod, geçmişiyle bağını kesmez. Belleğin karanlık bir köşesinde duran bu nesneler, dijital bilinçdışının bastırılmış anıları gibidir. Uygulama çalışmayı sürdürürken onların kapladığı alan büyür ve sonunda sistem, konuşamadığı meseleleri RAM tüketerek ifade etmeye başlar.]]></summary></entry><entry><title type="html">Derleyicilerin Sabrı: Bir Program Kaç Kez Reddedilerek Öğrenilir?</title><link href="https://sonsuzus.github.io/posts/derleyicilerin-sabri-bir-program-kac-kez-reddedilerek-ogrenilir/" rel="alternate" type="text/html" title="Derleyicilerin Sabrı: Bir Program Kaç Kez Reddedilerek Öğrenilir?" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/derleyicilerin-sabri-bir-program-kac-kez-reddedilerek-ogrenilir</id><content type="html" xml:base="https://sonsuzus.github.io/posts/derleyicilerin-sabri-bir-program-kac-kez-reddedilerek-ogrenilir/"><![CDATA[<p>Programlama öğrenirken derleyicinin kırmızı hata mesajları bazen kişisel bir eleştiri gibi hissedilir: “Yine olmadı!” Oysa derleyici öfkeli bir kapı görevlisi değil, son derece katı kuralları olan bir dil öğretmenidir. Programımızı her reddedişinde neyi henüz doğru ifade edemediğimizi gösterir. Bu nedenle başarılı bir program, çoğu zaman ilk denemede kabul edilen değil; geri bildirimlerle adım adım düzeltilen programdır.</p>

<p>``</p>

<h2 id="reddedilmek-neden-öğrenmenin-parçasıdır">Reddedilmek neden öğrenmenin parçasıdır?</h2>

<p>Derleyici, kaynak kodu makinenin çalıştırabileceği bir biçime dönüştürmeden önce sözdizimi ve tür kuralları gibi koşulları denetler. Bir koşul sağlanmadığında hata üretir. Bu süreç pedagojik açıdan bir <strong>geri bildirim döngüsü</strong> oluşturur:</p>

<ol>
  <li>Öğrenci bir çözüm tahmini geliştirir.</li>
  <li>Tahmini kod biçiminde ifade eder.</li>
  <li>Derleyici bu ifadeyi sınar.</li>
  <li>Hata mesajı, tahmin ile dilin kuralları arasındaki farkı gösterir.</li>
  <li>Öğrenci zihinsel modelini günceller.</li>
</ol>

<p>Bunu basitçe şöyle gösterebiliriz:</p>

\[\text{Kod} \rightarrow \text{Geri Bildirim} \rightarrow \text{Düzeltme} \rightarrow \text{Yeni Kod}\]

<p>Öğrenme açısından önemli olan hata sayısını sıfırlamak değil, her denemeden elde edilen bilgiyi artırmaktır. Kabaca bir öğrenme verimi tanımlarsak:</p>

\[V = \frac{\text{Kazanılan yeni bilgi}}{\text{Tekrarlanan deneme sayısı}}\]

<p>Aynı değişikliği düşünmeden on kez yapmak düşük; hata mesajını okuyup varsayımı sınamak ise yüksek verimlidir.</p>

<h2 id="bütün-hatalar-aynı-değildir">Bütün hatalar aynı değildir</h2>

<table>
  <thead>
    <tr>
      <th>Hata türü</th>
      <th>Derleyicinin söylediği</th>
      <th>Öğrencinin öğrenebileceği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sözdizimi hatası</td>
      <td>“Bu cümle dil bilgisine uymuyor.”</td>
      <td>Parantez, noktalı virgül ve anahtar kelime kuralları</td>
    </tr>
    <tr>
      <td>Tür hatası</td>
      <td>“Bu değer burada kullanılamaz.”</td>
      <td>Veri türleri ve işlemlerin sınırları</td>
    </tr>
    <tr>
      <td>Bağlama hatası</td>
      <td>“Bu adı bulamıyorum.”</td>
      <td>Kapsam, bildirim ve modül ilişkileri</td>
    </tr>
    <tr>
      <td>Mantık hatası</td>
      <td>Derleyici çoğunlukla sessizdir.</td>
      <td>Test yazma, problem çözme ve algoritmik düşünme</td>
    </tr>
  </tbody>
</table>

<p>İlk üç grupta derleyici doğrudan yardımcı olabilir. Mantık hatalarında ise program geçerli olduğu hâlde yanlış sonuç üretir. Yani “derlendi” demek, “doğru çalışıyor” demek değildir.</p>

<h2 id="bir-hata-mesajını-laboratuvar-notuna-çevirmek">Bir hata mesajını laboratuvar notuna çevirmek</h2>

<p>Aşağıdaki C++ kodunda bilinçli bir tür uyuşmazlığı vardır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">yas</span> <span class="o">=</span> <span class="s">"18"</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">gelecekYas</span> <span class="o">=</span> <span class="n">yas</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">gelecekYas</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Derleyici, <code class="language-plaintext highlighter-rouge">std::string</code> ile <code class="language-plaintext highlighter-rouge">int</code> değerlerinin bu şekilde toplanamayacağını söyler. Mesaj ilk bakışta uzun ve ürkütücü olabilir; ancak temel soru basittir: <strong>Toplama işleminin iki tarafındaki türler nedir?</strong> Metni önce sayıya dönüştürerek sorun çözülür:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">gelecekYas</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">stoi</span><span class="p">(</span><span class="n">yas</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</code></pre></div></div>

<p>Burada yalnızca bir satır düzeltilmedi. Öğrenci, metin olarak saklanan <code class="language-plaintext highlighter-rouge">"18"</code> ile sayısal <code class="language-plaintext highlighter-rouge">18</code> arasındaki farkı keşfetti. İyi hata analizi, yamadan çok kavram üretir.</p>

<h2 id="pedagojik-olarak-daha-iyi-hata-alışkanlıkları">Pedagojik olarak daha iyi hata alışkanlıkları</h2>

<p>Hata mesajını görür görmez kodu rastgele değiştirmek yerine şu yöntem uygulanabilir:</p>

<ul>
  <li>Önce mesajdaki <strong>ilk hatayı</strong> okuyun; sonraki hatalar onun zincirleme sonucu olabilir.</li>
  <li>Dosya ve satır numarasını bulun, fakat problemin bir önceki satırdan kaynaklanabileceğini unutmayın.</li>
  <li>“Derleyici ne bekliyordu, ne buldu?” sorusunu yazılı olarak cevaplayın.</li>
  <li>Aynı hatayı küçük bir örnekte yeniden üretin.</li>
  <li>Çözümden sonra hangi kuralı öğrendiğinizi tek cümleyle kaydedin.</li>
</ul>

<table>
  <thead>
    <tr>
      <th>Verimsiz yaklaşım</th>
      <th>Öğretici yaklaşım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mesajı okumadan kodu değiştirmek</td>
      <td>Hatanın anahtar bölümünü ayıklamak</td>
    </tr>
    <tr>
      <td>Çözümü doğrudan kopyalamak</td>
      <td>Çözümün neden çalıştığını açıklamak</td>
    </tr>
    <tr>
      <td>Tüm dosyayı birden düzenlemek</td>
      <td>Tek değişkeni değiştirip yeniden derlemek</td>
    </tr>
    <tr>
      <td>Hatayı başarısızlık saymak</td>
      <td>Hatayı sınanabilir geri bildirim saymak</td>
    </tr>
  </tbody>
</table>

<h2 id="derleyicinin-gerçek-sabrı">Derleyicinin gerçek sabrı</h2>

<p>Derleyici aslında sonsuz sabırlıdır: Aynı programı yüzüncü kez de aynı tarafsızlıkla inceler. Sabrı tükenen genellikle öğrencidir. Bu yüzden amaç, kaç kez reddedildiğimizi saymak değil, her ret ile sorumuzu daha kesin hâle getirmektir. Programlama ustalığı hatasız kod yazmak değil; hata ile karşılaşıldığında paniği yönteme, mesajı bilgiye ve reddedilmeyi yeni bir deneye dönüştürebilmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="derleyiciler" /><category term="hata mesajları" /><category term="programlama eğitimi" /><summary type="html"><![CDATA[Programlama öğrenirken derleyicinin kırmızı hata mesajları bazen kişisel bir eleştiri gibi hissedilir: “Yine olmadı!” Oysa derleyici öfkeli bir kapı görevlisi değil, son derece katı kuralları olan bir dil öğretmenidir. Programımızı her reddedişinde neyi henüz doğru ifade edemediğimizi gösterir. Bu nedenle başarılı bir program, çoğu zaman ilk denemede kabul edilen değil; geri bildirimlerle adım adım düzeltilen programdır.]]></summary></entry><entry><title type="html">ES Modules ile Büyük Projelerde Kod Organizasyonu</title><link href="https://sonsuzus.github.io/posts/es-modules-ile-buyuk-projelerde-kod-organizasyonu/" rel="alternate" type="text/html" title="ES Modules ile Büyük Projelerde Kod Organizasyonu" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/es-modules-ile-buyuk-projelerde-kod-organizasyonu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/es-modules-ile-buyuk-projelerde-kod-organizasyonu/"><![CDATA[<p>Bir JavaScript projesi büyüdükçe tek dosyada yaşayan kod, çekmecesine ne bulursa atan bir geliştiricinin odasına dönüşebilir. Değişkenler çakışır, fonksiyonların nerede kullanıldığı belirsizleşir ve küçük bir değişiklik beklenmedik yerleri bozar. ES Modules, kodu anlamlı dosyalara bölerek bu karmaşayı yönetmemizi ve dosyalar arasındaki bağı açıkça tanımlamamızı sağlar.</p>

<p>``</p>

<h2 id="modül-nedir">Modül Nedir?</h2>

<p>Modül, belirli bir sorumluluğu yerine getiren ve kendi kapsamına sahip JavaScript dosyasıdır. Örneğin kullanıcı işlemleri <code class="language-plaintext highlighter-rouge">user.js</code>, matematik yardımcıları <code class="language-plaintext highlighter-rouge">math.js</code>, API iletişimi ise <code class="language-plaintext highlighter-rouge">api.js</code> içerisinde tutulabilir. Her dosya yalnızca dışarı açmak istediği değerleri <code class="language-plaintext highlighter-rouge">export</code> eder; başka dosyalar da bu değerleri <code class="language-plaintext highlighter-rouge">import</code> ile kullanır.</p>

<p>Bu yaklaşımın temelinde <strong>kapsülleme</strong> bulunur. Bir modülün içindeki değişkenler varsayılan olarak diğer modüllerin global alanına sızmaz. Böylece iki farklı dosyada <code class="language-plaintext highlighter-rouge">result</code> adında değişken bulunması sorun yaratmaz.</p>

<p>Kod karmaşıklığını kabaca şu şekilde düşünebiliriz: Dosya sayısı $n$ ve her dosyanın ortalama sorumluluk sayısı $s$ olsun. Tek dosyalı yapıda zihinsel yük yaklaşık $n \times s$ iken iyi ayrıştırılmış modüllerde geliştirici çoğunlukla yalnızca ilgili modülün $s$ sorumluluğuna odaklanır. Elbette bu matematiksel bir performans ölçümü değil, modülerliğin bilişsel faydasını anlatan basit bir modeldir.</p>

<h2 id="named-export-ve-default-export">Named Export ve Default Export</h2>

<p>ES Modules iki temel dışa aktarma yöntemi sunar:</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Named Export</th>
      <th>Default Export</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dosyadaki sayı</td>
      <td>Birden fazla olabilir</td>
      <td>Yalnızca bir tane olabilir</td>
    </tr>
    <tr>
      <td>İçe aktarma adı</td>
      <td>Aynı ad kullanılmalıdır</td>
      <td>İstenilen ad verilebilir</td>
    </tr>
    <tr>
      <td>Kullanım amacı</td>
      <td>Yardımcı fonksiyonlar, sabitler</td>
      <td>Modülün ana değeri</td>
    </tr>
    <tr>
      <td>Yeniden adlandırma</td>
      <td><code class="language-plaintext highlighter-rouge">as</code> ile yapılır</td>
      <td>Doğrudan yapılabilir</td>
    </tr>
  </tbody>
</table>

<p>Named export kullanan bir matematik modülü oluşturalım:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// math.js</span>
<span class="k">export</span> <span class="kd">const</span> <span class="nx">PI</span> <span class="o">=</span> <span class="mf">3.14159</span><span class="p">;</span>

<span class="k">export</span> <span class="kd">function</span> <span class="nf">circleArea</span><span class="p">(</span><span class="nx">radius</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">PI</span> <span class="o">*</span> <span class="nx">radius</span> <span class="o">**</span> <span class="mi">2</span><span class="p">;</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nf">validateRadius</span><span class="p">(</span><span class="nx">radius</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">radius</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">PI</code> ve <code class="language-plaintext highlighter-rouge">circleArea</code> dışarı açılmıştır. <code class="language-plaintext highlighter-rouge">validateRadius</code> ise modülün özel uygulama detayı olarak kalır. İhtiyacımız olan değerleri başka bir dosyada seçerek alabiliriz:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// app.js</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">circleArea</span><span class="p">,</span> <span class="nx">PI</span> <span class="nx">as</span> <span class="nx">circlePI</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">./math.js</span><span class="dl">"</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">circleArea</span><span class="p">(</span><span class="mi">5</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">circlePI</span><span class="p">);</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">as</code> anahtar kelimesi, içe aktarılan değerin yerel adını değiştirir. Böylece isim çakışmaları kontrollü biçimde çözülür.</p>

<p>Bir modül tek bir ana sınıf veya fonksiyon sunuyorsa default export tercih edilebilir:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// UserService.js</span>
<span class="k">export</span> <span class="k">default</span> <span class="kd">class</span> <span class="nc">UserService</span> <span class="p">{</span>
  <span class="k">async</span> <span class="nf">getUser</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`/api/users/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
    <span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu sınıf <code class="language-plaintext highlighter-rouge">import UserService from "./UserService.js";</code> şeklinde alınabilir. Süslü parantez kullanılmaması, default import için önemli bir ayrıntıdır.</p>

<h2 id="tarayıcıda-ve-nodejste-kullanım">Tarayıcıda ve Node.js’te Kullanım</h2>

<p>Tarayıcıya bir dosyanın modül olduğunu söylemek için <code class="language-plaintext highlighter-rouge">type="module"</code> eklenir:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"module"</span> <span class="na">src=</span><span class="s">"./app.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<p>Modül betikleri otomatik olarak strict mode ile çalışır ve varsayılan olarak ertelenir. Node.js tarafında ise <code class="language-plaintext highlighter-rouge">package.json</code> dosyasına <code class="language-plaintext highlighter-rouge">"type": "module"</code> eklenebilir. Dosya yollarında uzantı kullanmak, ortamlar arası davranışı daha öngörülebilir hâle getirir.</p>

<h2 id="dinamik-import-ve-performans">Dinamik Import ve Performans</h2>

<p>Her modülü başlangıçta yüklemek zorunda değiliz. <code class="language-plaintext highlighter-rouge">import()</code> fonksiyonu bir Promise döndürerek kodun ihtiyaç anında indirilmesini sağlar:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">button</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="k">async </span><span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="p">{</span> <span class="nx">openEditor</span> <span class="p">}</span> <span class="o">=</span> <span class="k">await</span> <span class="k">import</span><span class="p">(</span><span class="dl">"</span><span class="s2">./editor.js</span><span class="dl">"</span><span class="p">);</span>
  <span class="nf">openEditor</span><span class="p">();</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Bu yöntem özellikle yönetim paneli, grafik editörü veya raporlama ekranı gibi ağır özelliklerde kullanışlıdır. Paketleyiciler ayrıca kullanılmayan named export’ları <strong>tree shaking</strong> ile üretim paketinden çıkarabilir.</p>

<h2 id="sağlıklı-bir-modül-yapısı-i̇çin-i̇puçları">Sağlıklı Bir Modül Yapısı İçin İpuçları</h2>

<p>Modülleri dosya boyutuna göre değil, sorumluluğa göre ayırın. Dairesel bağımlılıklardan kaçının; <code class="language-plaintext highlighter-rouge">a.js</code>, <code class="language-plaintext highlighter-rouge">b.js</code> dosyasını, <code class="language-plaintext highlighter-rouge">b.js</code> de tekrar <code class="language-plaintext highlighter-rouge">a.js</code> dosyasını içe aktarıyorsa mimariyi gözden geçirin. Ortak davranışları bağımsız bir yardımcı modüle taşımak genellikle çözüm olur.</p>

<p>Sonuç olarak ES Modules yalnızca dosya bölme yöntemi değildir. Açık bağımlılıklar, izole kapsam, yeniden kullanılabilirlik ve daha kolay test edilebilirlik sunan bir tasarım aracıdır. İyi organize edilmiş modüller sayesinde proje büyürken kod tabanı korkutucu bir labirente değil, tabelaları düzgün yerleştirilmiş bir şehre dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="ES Modules" /><category term="Kod Organizasyonu" /><summary type="html"><![CDATA[Bir JavaScript projesi büyüdükçe tek dosyada yaşayan kod, çekmecesine ne bulursa atan bir geliştiricinin odasına dönüşebilir. Değişkenler çakışır, fonksiyonların nerede kullanıldığı belirsizleşir ve küçük bir değişiklik beklenmedik yerleri bozar. ES Modules, kodu anlamlı dosyalara bölerek bu karmaşayı yönetmemizi ve dosyalar arasındaki bağı açıkça tanımlamamızı sağlar.]]></summary></entry><entry><title type="html">Fonksiyonel Programlamanın Budist Yanı: Yan Etkisiz Bir Hayat Mümkün mü?</title><link href="https://sonsuzus.github.io/posts/fonksiyonel-programlamanin-budist-yani-yan-etkisiz-bir-hayat-mumkun-mu/" rel="alternate" type="text/html" title="Fonksiyonel Programlamanın Budist Yanı: Yan Etkisiz Bir Hayat Mümkün mü?" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/fonksiyonel-programlamanin-budist-yani-yan-etkisiz-bir-hayat-mumkun-mu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/fonksiyonel-programlamanin-budist-yani-yan-etkisiz-bir-hayat-mumkun-mu/"><![CDATA[<p>Bir fonksiyonun dış dünyaya tutunmadan yalnızca aldığı değerlerle çalışması, zihnin geçmişe ve beklentilere tutunmadan ânı gözlemlemesine şaşırtıcı biçimde benzer. Fonksiyonel programlama ile Budist düşünce aynı şey değildir; fakat <strong>saflık</strong>, <strong>değişmezlik</strong> ve <strong>bağımlılıkların farkında olma</strong> kavramları üzerinden verimli bir benzetme kurabiliriz. Belki aydınlanmaya ulaşamayız ama en azından üretimde gizemli biçimde değişen global değişkenlerden kurtulabiliriz.</p>

<p>``</p>

<h2 id="saf-fonksiyon-karması-kolay-hesaplama">Saf fonksiyon: Karması kolay hesaplama</h2>

<p>Saf fonksiyon, aynı girdiye her zaman aynı çıktıyı verir ve fonksiyonun dışındaki dünyayı değiştirmez. Matematiksel olarak bunu şöyle düşünebiliriz:</p>

\[f(x) = y\]

<p>Eğer $x$ değişmiyorsa $y$ de değişmez. Fonksiyon; dosyaya yazmaz, global değişken güncellemez veya gizlice ağ isteği göndermez. Böylece sonucunu anlamak için evrenin bütün geçmişini bilmemiz gerekmez.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">indirimliFiyat</span> <span class="o">=</span> <span class="p">(</span><span class="nx">fiyat</span><span class="p">,</span> <span class="nx">oran</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">fiyat</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nx">oran</span><span class="p">);</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">indirimliFiyat</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">));</span> <span class="c1">// Her zaman 800</span>
</code></pre></div></div>

<p>Bu fonksiyon yalnızca parametrelerine bağlıdır. Test etmek için veritabanı, sahte sunucu ya da dolunay gerekmez. Budist düşüncedeki eylem-sonuç ilişkisine benzetirsek, girdiler koşulları; dönüş değeri ise bu koşullardan doğan sonucu temsil eder.</p>

<p>Buna karşılık aşağıdaki fonksiyon dış duruma bağımlıdır:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">vergiOrani</span> <span class="o">=</span> <span class="mf">0.20</span><span class="p">;</span>

<span class="kd">function</span> <span class="nf">toplamFiyat</span><span class="p">(</span><span class="nx">fiyat</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Fiyat hesaplandı</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// Gözlemlenebilir yan etki</span>
  <span class="k">return</span> <span class="nx">fiyat</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="nx">vergiOrani</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Sonucu anlamak için <code class="language-plaintext highlighter-rouge">vergiOrani</code> değişkeninin o andaki değerini bilmeliyiz. Üstelik konsola yazmak da hesaplamanın dışında bir etki üretir. Yan etki mutlaka kötü değildir; programların kullanıcıya ulaşması için ekrana yazması, veri kaydetmesi ve ağla konuşması gerekir. Önemli olan yan etkileri <strong>tanımak, sınırlamak ve yönetmektir</strong>.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Saf fonksiyon</th>
      <th>Yan etkili fonksiyon</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aynı girdide sonuç</td>
      <td>Daima aynı</td>
      <td>Dış duruma göre değişebilir</td>
    </tr>
    <tr>
      <td>Test edilebilirlik</td>
      <td>Kolay</td>
      <td>Ek kurulum gerekebilir</td>
    </tr>
    <tr>
      <td>Durumla ilişki</td>
      <td>Açık parametreler</td>
      <td>Gizli bağımlılıklar olabilir</td>
    </tr>
    <tr>
      <td>Felsefi benzetme</td>
      <td>Berrak neden-sonuç</td>
      <td>Birbirine bağlı koşullar ağı</td>
    </tr>
  </tbody>
</table>

<h2 id="değişmezlik-bırakmak-mı-kopyalamak-mı">Değişmezlik: Bırakmak mı, kopyalamak mı?</h2>

<p>Değişmezlik, bir veri oluşturulduktan sonra onu yerinde değiştirmemektir. Güncelleme gerektiğinde eski değeri bozmak yerine yeni bir değer üretiriz. Bu yaklaşım, “hiçbir şey değişmez” demez. Tam tersine değişimin sürekli olduğunu kabul eder; fakat geçmiş durumun üzerine kontrolsüzce yazmaz.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sepet</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nf">freeze</span><span class="p">([</span>
  <span class="p">{</span> <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Çay</span><span class="dl">"</span><span class="p">,</span> <span class="na">adet</span><span class="p">:</span> <span class="mi">1</span> <span class="p">}</span>
<span class="p">]);</span>

<span class="kd">const</span> <span class="nx">yeniSepet</span> <span class="o">=</span> <span class="nx">sepet</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">urun</span> <span class="o">=&gt;</span>
  <span class="nx">urun</span><span class="p">.</span><span class="nx">ad</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">Çay</span><span class="dl">"</span> <span class="p">?</span> <span class="p">{</span> <span class="p">...</span><span class="nx">urun</span><span class="p">,</span> <span class="na">adet</span><span class="p">:</span> <span class="nx">urun</span><span class="p">.</span><span class="nx">adet</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">}</span> <span class="p">:</span> <span class="nx">urun</span>
<span class="p">);</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">sepet</code> korunur, <code class="language-plaintext highlighter-rouge">yeniSepet</code> ise değişimi temsil eder. Böylece zaman içindeki durumları karşılaştırmak, hatayı geri almak ve eşzamanlı işlemleri güvenle yürütmek kolaylaşır.</p>

<table>
  <thead>
    <tr>
      <th>Değiştirilebilir durum</th>
      <th>Değişmez veri</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aynı nesne güncellenir</td>
      <td>Yeni bir değer oluşturulur</td>
    </tr>
    <tr>
      <td>Geçmiş bilgi kaybolabilir</td>
      <td>Önceki sürüm korunabilir</td>
    </tr>
    <tr>
      <td>Paylaşım yarış koşulu doğurabilir</td>
      <td>Paralel kullanım daha güvenlidir</td>
    </tr>
    <tr>
      <td>“Bu ne zaman değişti?” sorusu zordur</td>
      <td>Veri akışı daha görünürdür</td>
    </tr>
  </tbody>
</table>

<h2 id="bağımlı-oluş-ve-fonksiyon-bileşimi">Bağımlı oluş ve fonksiyon bileşimi</h2>

<p>Budist felsefedeki bağımlı oluş düşüncesi, olayların tek başına değil koşullarla ortaya çıktığını vurgular. Fonksiyonel programlamada da büyük bir sonucu küçük dönüşümlerin bileşimi olarak ifade edebiliriz:</p>

\[h(x) = (g \circ f)(x) = g(f(x))\]

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">temizle</span> <span class="o">=</span> <span class="nx">metin</span> <span class="o">=&gt;</span> <span class="nx">metin</span><span class="p">.</span><span class="nf">trim</span><span class="p">().</span><span class="nf">toLowerCase</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">selamla</span> <span class="o">=</span> <span class="nx">ad</span> <span class="o">=&gt;</span> <span class="s2">`Merhaba, </span><span class="p">${</span><span class="nx">ad</span><span class="p">}</span><span class="s2">!`</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">mesajOlustur</span> <span class="o">=</span> <span class="nx">ad</span> <span class="o">=&gt;</span> <span class="nf">selamla</span><span class="p">(</span><span class="nf">temizle</span><span class="p">(</span><span class="nx">ad</span><span class="p">));</span>
</code></pre></div></div>

<p>Her adım açık, bağımsız ve sınanabilirdir. Karmaşık davranış, gizli mutasyonlardan değil küçük fonksiyonların düzenli ilişkisinden doğar.</p>

<h2 id="yan-etkisiz-hayat-mümkün-mü">Yan etkisiz hayat mümkün mü?</h2>

<p>Tamamen yan etkisiz bir program, kullanıcıdan veri alamaz ve sonuç gösteremez; tamamen etkisiz bir hayat da pek hayat sayılmazdı. Fonksiyonel yaklaşımın hedefi dünyadan kaçmak değil, dünya ile temas edilen sınırları görünür kılmaktır. Hesaplamaları saf merkezde tutup ağ, dosya ve arayüz işlemlerini dış katmanlara taşıyabiliriz.</p>

<p>Sonuçta iyi kod da dengeli bir zihin gibi davranır: Neye bağlı olduğunu bilir, geçmişi gizlice değiştirmez ve ürettiği etkinin sorumluluğunu taşır. Nirvana garanti değil; fakat daha öngörülebilir testler ve daha huzurlu hata ayıklama oldukça gerçekçidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="fonksiyonel programlama" /><category term="saf fonksiyonlar" /><category term="değişmezlik" /><summary type="html"><![CDATA[Bir fonksiyonun dış dünyaya tutunmadan yalnızca aldığı değerlerle çalışması, zihnin geçmişe ve beklentilere tutunmadan ânı gözlemlemesine şaşırtıcı biçimde benzer. Fonksiyonel programlama ile Budist düşünce aynı şey değildir; fakat saflık, değişmezlik ve bağımlılıkların farkında olma kavramları üzerinden verimli bir benzetme kurabiliriz. Belki aydınlanmaya ulaşamayız ama en azından üretimde gizemli biçimde değişen global değişkenlerden kurtulabiliriz.]]></summary></entry><entry><title type="html">Her On Yılın “Nihai Programlama Dili”: Bitmeyen Teknolojik İyimserlik Döngüsü</title><link href="https://sonsuzus.github.io/posts/her-on-yilin-nihai-programlama-dili-bitmeyen-teknolojik-iyimserlik-dongusu/" rel="alternate" type="text/html" title="Her On Yılın “Nihai Programlama Dili”: Bitmeyen Teknolojik İyimserlik Döngüsü" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/her-on-yilin-nihai-programlama-dili-bitmeyen-teknolojik-iyimserlik-dongusu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/her-on-yilin-nihai-programlama-dili-bitmeyen-teknolojik-iyimserlik-dongusu/"><![CDATA[<p>Yazılım dünyası belirli aralıklarla aynı heyecanı yeniden yaşar: Yeni bir programlama dili çıkar, eski dillerin bütün kusurlarını çözdüğü söylenir ve kısa süre içinde onun “geleceğin tek dili” olacağı ilan edilir. Fakat gelecek geldiğinde o dil ya belirli bir alana yerleşmiş, başka araçlarla birlikte kullanılmaya başlanmış ya da sessizce teknoloji tarihindeki yerini almıştır. Bu durum yalnızca pazarlama hevesi değil; yazılımın doğasından kaynaklanan döngüsel bir iyimserliktir.</p>

<p>``</p>

<h2 id="dün-de-gelecek-bugünkü-kadar-parlaktı">Dün de “gelecek” bugünkü kadar parlaktı</h2>

<p>1950’lerde FORTRAN, makine kodunun zahmetini ortadan kaldırarak bilimsel programlamayı dönüştürdü. 1960’larda COBOL, iş dünyasının ortak dili olma iddiasıyla yükseldi. 1980’lerde nesne yönelimli programlama, karmaşıklığı sınıflar ve nesnelerle kontrol edecekti. 1990’larda Java’nın “bir kez yaz, her yerde çalıştır” sloganı platform bağımsızlığını vaat etti. 2010’larda Go sadeliği, Rust ise bellek güvenliğini merkeze aldı.</p>

<p>Bu dillerin hiçbiri başarısız değildir. Hatta bazıları olağanüstü başarılıdır. Yanlış olan, belirli bir dönemin baskın problemini çözmenin bütün gelecek problemlerini çözmek anlamına geldiğini düşünmektir.</p>

<table>
  <thead>
    <tr>
      <th>Dönem</th>
      <th>Öne çıkan yaklaşım</th>
      <th>Büyük vaat</th>
      <th>Karşılaşılan gerçeklik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1950–1960</td>
      <td>FORTRAN, COBOL</td>
      <td>Donanım ayrıntılarından kurtulmak</td>
      <td>Taşınabilirlik ve bakım sorunları</td>
    </tr>
    <tr>
      <td>1980–1990</td>
      <td>C++, Smalltalk</td>
      <td>Karmaşıklığı nesnelerle yönetmek</td>
      <td>Derin kalıtım ve sıkı bağımlılık</td>
    </tr>
    <tr>
      <td>1990–2000</td>
      <td>Java</td>
      <td>Her platformda aynı program</td>
      <td>Sanal makine maliyeti ve ekosistem yükü</td>
    </tr>
    <tr>
      <td>2010–2020</td>
      <td>Go, Rust</td>
      <td>Basit eşzamanlılık veya güvenli sistemler</td>
      <td>Öğrenme eğrisi ve alan bağımlılığı</td>
    </tr>
    <tr>
      <td>2020 sonrası</td>
      <td>Yeni nesil diller ve yapay zekâ</td>
      <td>Kodlama yükünü büyük ölçüde kaldırmak</td>
      <td>Doğrulama, güvenlik ve bakım ihtiyacı</td>
    </tr>
  </tbody>
</table>

<h2 id="neden-tek-bir-dil-yetmiyor">Neden tek bir dil yetmiyor?</h2>

<p>Programlama dili tasarımı bir optimizasyon problemidir. Bir dilin sadelik, performans, güvenlik, taşınabilirlik ve ifade gücü gibi hedefleri aynı anda en üst düzeye çıkarması beklenir. Ancak pratikte bu hedefler arasında ödünleşim vardır. Bunu kabaca şöyle gösterebiliriz:</p>

\[Q = w_sS + w_pP + w_gG + w_tT - C\]

<p>Burada $S$ sadeliği, $P$ performansı, $G$ güvenliği, $T$ taşınabilirliği, $C$ ise öğrenme ve işletme maliyetini temsil eder. $w$ katsayıları projeye göre değişir. Bir oyun motorunda performansın ağırlığı yüksekken finans uygulamasında güvenlik, küçük bir otomasyon betiğinde ise geliştirme hızı daha önemli olabilir. Dolayısıyla evrensel “en iyi dil” yoktur; yalnızca belirli koşullar için uygun diller vardır.</p>

<p>Üstelik her soyutlama bir alt katmana dayanır. Basit görünen bir işlem bile çalışma zamanı, işletim sistemi ve donanımla ilişkilidir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">concurrent.futures</span> <span class="kn">import</span> <span class="n">ThreadPoolExecutor</span>

<span class="k">def</span> <span class="nf">hesapla</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="c1"># İş yükünü temsil eden basit bir hesaplama yapar.
</span>    <span class="k">return</span> <span class="n">sayi</span> <span class="o">*</span> <span class="n">sayi</span>

<span class="k">with</span> <span class="nc">ThreadPoolExecutor</span><span class="p">(</span><span class="n">max_workers</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span> <span class="k">as</span> <span class="n">havuz</span><span class="p">:</span>
    <span class="n">sonuclar</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">havuz</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="n">hesapla</span><span class="p">,</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)))</span>

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

<p>Kod kısa ve okunaklıdır; fakat iş parçacığı zamanlaması, işlemci çekirdekleri, Python çalışma zamanı ve görev türü performansı etkiler. Dil ayrıntıları gizler, ancak onları yok etmez. Joel Spolsky’nin meşhur ifadesiyle bütün önemsiz olmayan soyutlamalar bir noktada “sızdırır”.</p>

<h2 id="döngüsel-iyimserliğin-motoru">Döngüsel iyimserliğin motoru</h2>

<p>Yeni diller genellikle gerçek bir acıya tepki olarak doğar. Eski araçların sorunları görünür, yeni aracın sorunları ise henüz keşfedilmemiştir. Bu algı farkını şöyle özetleyebiliriz:</p>

\[Algılanan\ Yenilik = Görünür\ Faydalar - Henüz\ Görülmeyen\ Maliyetler\]

<p>Konferanslar, şirket yatırımları ve sosyal medya da bu farkı büyütür. Bir dil yalnızca teknik araç değil; topluluk, kariyer fırsatı ve kimlik hâline gelir. İnsanlar teknolojiyi değerlendirirken bazen sözdizimini değil, umutlarını savunur.</p>

<p>“Nihai dil” ilanlarının kaybolması ilerlemenin başarısız olduğu anlamına gelmez. Aksine her kuşak, önceki kuşağın fikirlerini yeniden işler. Rust sahiplik sistemini yaygınlaştırır, Kotlin null güvenliğini erişilebilir kılar, TypeScript dinamik ekosisteme statik denetim ekler. Kazanan tek bir dil değil, diller arasında taşınan fikirlerdir.</p>

<p>Bu yüzden yeni bir dil tanıtıldığında “Hepsinin yerini alacak mı?” yerine “Hangi ödünleşimi farklı yapıyor?” diye sormak daha sağlıklıdır. Geleceğin nihai dili muhtemelen hiç gelmeyecek; fakat onu ararken geliştirdiğimiz kavramlar yazılımı sürekli daha güvenli, anlaşılır ve üretken hâle getirecektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="programlama dilleri" /><category term="teknoloji tarihi" /><category term="yazılım kültürü" /><summary type="html"><![CDATA[Yazılım dünyası belirli aralıklarla aynı heyecanı yeniden yaşar: Yeni bir programlama dili çıkar, eski dillerin bütün kusurlarını çözdüğü söylenir ve kısa süre içinde onun “geleceğin tek dili” olacağı ilan edilir. Fakat gelecek geldiğinde o dil ya belirli bir alana yerleşmiş, başka araçlarla birlikte kullanılmaya başlanmış ya da sessizce teknoloji tarihindeki yerini almıştır. Bu durum yalnızca pazarlama hevesi değil; yazılımın doğasından kaynaklanan döngüsel bir iyimserliktir.]]></summary></entry><entry><title type="html">Kuantum Bilgisayarların Felsefi Kâbusu: Süperpozisyon Özgür İradeyi Kurtarabilir mi?</title><link href="https://sonsuzus.github.io/posts/kuantum-bilgisayarlarin-felsefi-kabusu-superpozisyon-ozgur-iradeyi-kurtarabilir-mi/" rel="alternate" type="text/html" title="Kuantum Bilgisayarların Felsefi Kâbusu: Süperpozisyon Özgür İradeyi Kurtarabilir mi?" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kuantum-bilgisayarlarin-felsefi-kabusu-superpozisyon-ozgur-iradeyi-kurtarabilir-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kuantum-bilgisayarlarin-felsefi-kabusu-superpozisyon-ozgur-iradeyi-kurtarabilir-mi/"><![CDATA[<p>Klasik bilgisayarların dünyasında bitler uslu çocuklardır: Ya 0’dırlar ya da 1. Kuantum bilgisayarlardaki kübitler ise ölçülene kadar her iki olasılığı da taşıyabilir. Bu tuhaflık, “Evren önceden yazılmış bir program mı?” sorusunu yeniden gündeme getiriyor. Fakat küçük bir uyarı: Bir kübitin kararsız görünmesi, insanın özgür olduğu anlamına otomatik olarak gelmez.</p>

<p>``</p>

<h2 id="kübit-gerçekten-aynı-anda-0-ve-1-mi">Kübit gerçekten aynı anda 0 ve 1 mi?</h2>

<p>Bir klasik bitin durumu yalnızca $0$ veya $1$ olabilir. Kübit ise şu biçimde gösterilir:</p>

\[|psi&gt; = alpha|0&gt; + beta|1&gt;\]

<p>Buradaki $alpha$ ve $beta$, olasılık genlikleridir ve</p>

\[|alpha|^2 + |beta|^2 = 1\]

<table>
  <tbody>
    <tr>
      <td>koşulunu sağlar. Ölçüm yaptığımızda $</td>
      <td>alpha</td>
      <td>^2$ olasılıkla 0, $</td>
      <td>beta</td>
      <td>^2$ olasılıkla 1 elde ederiz. Kübit, ölçümden önce gizlice seçilmiş sıradan bir değeri cebinde taşımak zorunda değildir. Süperpozisyon, yalnızca “sonucu bilmiyoruz” demek değil; girişim deneylerinde fiziksel etkileri görülebilen bir kuantum durumudur.</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Klasik bit</th>
      <th>Kübit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Durum</td>
      <td>0 veya 1</td>
      <td>Durumların süperpozisyonu</td>
    </tr>
    <tr>
      <td>Okuma</td>
      <td>Değeri doğrudan verir</td>
      <td>Olasılıksal sonuç üretir</td>
    </tr>
    <tr>
      <td>Kopyalama</td>
      <td>Kolayca kopyalanabilir</td>
      <td>Bilinmeyen durum kusursuz kopyalanamaz</td>
    </tr>
    <tr>
      <td>Evrim</td>
      <td>Mantık kapılarıyla</td>
      <td>Üniter kuantum kapılarıyla</td>
    </tr>
  </tbody>
</table>

<p>Burada önemli bir ayrıntı var: Kuantum durumunun ölçüm öncesindeki evrimi Schrödinger denklemi altında deterministiktir. Yani başlangıç durumu biliniyorsa dalga fonksiyonunun nasıl gelişeceği belirlenebilir. Belirsizlik özellikle ölçüm sonucunda karşımıza çıkar.</p>

<h2 id="determinizmin-çatlayan-duvarı">Determinizmin çatlayan duvarı</h2>

<p>Klasik determinizm, evrenin bir andaki bütün koşulları bilinse geleceğin hesaplanabileceğini savunur. Laplace’ın hayalî “cin”i, her parçacığın konumunu ve hızını bilerek yarını okuyabilirdi. Kuantum mekaniğinde ise Heisenberg belirsizlik ilkesi bu hayali sınırlar:</p>

\[Delta x \cdot Delta p &gt;= hbar/2\]

<p>Bu eşitsizlik yalnızca ölçüm cihazlarımızın kötü olduğunu söylemez. Standart yoruma göre konum ve momentum gibi bazı nicelikler aynı anda sınırsız kesinliğe sahip değildir. Bell deneyleri de sonuçların basit, yerel ve önceden saklanmış değişkenlerle açıklanamayacağını güçlü biçimde göstermiştir.</p>

<p>Yine de kuantum teorisinin bütün yorumları aynı hikâyeyi anlatmaz:</p>

<table>
  <thead>
    <tr>
      <th>Yorum</th>
      <th>Temel fikir</th>
      <th>Determinizm durumu</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kopenhag</td>
      <td>Ölçüm sonucu olasılıksaldır</td>
      <td>Sonuçlar belirlenmez</td>
    </tr>
    <tr>
      <td>Çoklu Dünyalar</td>
      <td>Tüm sonuçlar farklı dallarda gerçekleşir</td>
      <td>Evrensel evrim deterministiktir</td>
    </tr>
    <tr>
      <td>Bohm mekaniği</td>
      <td>Gizli değişkenler parçacıkları yönlendirir</td>
      <td>Determinist ama yerel değildir</td>
    </tr>
  </tbody>
</table>

<p>Dolayısıyla “Kuantum fiziği determinizmi kesin olarak öldürdü” cümlesi biraz fazla cesurdur. Daha doğru ifade, klasik ve yerel determinizmin ciddi şekilde yara aldığıdır.</p>

<h2 id="bir-kübitlik-yazı-tura">Bir kübitlik yazı tura</h2>

<p>Aşağıdaki Qiskit örneği, bir kübiti Hadamard kapısıyla eşit süperpozisyona getirip ölçer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">qiskit</span> <span class="kn">import</span> <span class="n">QuantumCircuit</span>
<span class="kn">from</span> <span class="n">qiskit_aer</span> <span class="kn">import</span> <span class="n">AerSimulator</span>

<span class="n">circuit</span> <span class="o">=</span> <span class="nc">QuantumCircuit</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">circuit</span><span class="p">.</span><span class="nf">h</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>          <span class="c1"># Kübiti eşit süperpozisyona hazırlar
</span><span class="n">circuit</span><span class="p">.</span><span class="nf">measure</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># Kuantum durumunu klasik bite dönüştürür
</span>
<span class="n">simulator</span> <span class="o">=</span> <span class="nc">AerSimulator</span><span class="p">()</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">simulator</span><span class="p">.</span><span class="nf">run</span><span class="p">(</span><span class="n">circuit</span><span class="p">,</span> <span class="n">shots</span><span class="o">=</span><span class="mi">1000</span><span class="p">).</span><span class="nf">result</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="nf">get_counts</span><span class="p">())</span>
</code></pre></div></div>

<p>Sonuçlar yaklaşık olarak <code class="language-plaintext highlighter-rouge">{'0': 500, '1': 500}</code> dağılımına yaklaşır. Ancak her çalıştırmada tam olarak aynı sayıları görmeyiz. Kod bize kuantum olasılığını gösterir; bilinçli tercih yapan minik bir kübit göstermez.</p>

<h2 id="rastgelelik-özgürlük-değildir">Rastgelelik özgürlük değildir</h2>

<p>Bir kararın önceden belirlenmemiş olması, onun özgürce verildiğini kanıtlamaz. Seçiminiz nöronlardaki kuantum rastgeleliğinden kaynaklanıyorsa bu, kontrolün sizde değil kozmik bir zar atışında olduğu anlamına da gelebilir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Anlamı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Determinizm</td>
      <td>Gelecek, önceki durum ve yasalarca belirlenir</td>
    </tr>
    <tr>
      <td>Rastgelelik</td>
      <td>Sonuç önceden kesin değildir</td>
    </tr>
    <tr>
      <td>Özgür irade</td>
      <td>Eylemin özneye, nedenlere ve sorumluluğa bağlanmasıdır</td>
    </tr>
  </tbody>
</table>

<p>Kuantum hesaplama özgür iradeyi ne kanıtlar ne de çürütür. Fakat evreni kusursuz çalışan klasik bir saat gibi düşünmenin yetersiz olabileceğini gösterir. Belki felsefi kâbus kübitin hem 0 hem 1 olması değil; özgürlüğün yalnızca bu iki seçenekten birini rastgele seçmekten çok daha karmaşık olmasıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kuantum bilgisayarlar" /><category term="özgür irade" /><category term="determinizm" /><summary type="html"><![CDATA[Klasik bilgisayarların dünyasında bitler uslu çocuklardır: Ya 0’dırlar ya da 1. Kuantum bilgisayarlardaki kübitler ise ölçülene kadar her iki olasılığı da taşıyabilir. Bu tuhaflık, “Evren önceden yazılmış bir program mı?” sorusunu yeniden gündeme getiriyor. Fakat küçük bir uyarı: Bir kübitin kararsız görünmesi, insanın özgür olduğu anlamına otomatik olarak gelmez.]]></summary></entry><entry><title type="html">LocalStorage ve Fetch API ile Tarayıcıda Dinamik Veri Yönetimi</title><link href="https://sonsuzus.github.io/posts/localstorage-ve-fetch-api-ile-tarayicida-dinamik-veri-yonetimi/" rel="alternate" type="text/html" title="LocalStorage ve Fetch API ile Tarayıcıda Dinamik Veri Yönetimi" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/localstorage-ve-fetch-api-ile-tarayicida-dinamik-veri-yonetimi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/localstorage-ve-fetch-api-ile-tarayicida-dinamik-veri-yonetimi/"><![CDATA[<p>Modern web uygulamaları yalnızca ekranda bilgi göstermez; kullanıcı tercihlerini hatırlar, sunuculardan güncel veriler alır ve bağlantı kesildiğinde bile belirli işlevleri sürdürebilir. JavaScript’in <strong>LocalStorage</strong> ve <strong>Fetch API</strong> araçları, bu deneyimi oluşturmanın iki temel parçasıdır. Biri verileri tarayıcıda saklarken diğeri uygulamanın dış dünyayla konuşmasını sağlar.</p>

<p>``</p>

<h2 id="localstorage-nasıl-çalışır">LocalStorage nasıl çalışır?</h2>

<p>LocalStorage, aynı kaynağa ait verilerin tarayıcıda anahtar-değer çiftleri biçiminde tutulmasını sağlar. Buradaki “aynı kaynak”; protokol, alan adı ve port birleşiminin aynı olması demektir. Örneğin <code class="language-plaintext highlighter-rouge">https://ornek.com</code> ile <code class="language-plaintext highlighter-rouge">http://ornek.com</code> farklı depolama alanlarına sahiptir.</p>

<p>Veriler tarayıcı kapatılsa bile korunur. Ancak LocalStorage yalnızca <strong>metin</strong> saklayabilir. Bir nesneyi doğrudan kaydetmeye çalışırsak anlamlı içeriği yerine <code class="language-plaintext highlighter-rouge">[object Object]</code> sonucuyla karşılaşabiliriz. Bu nedenle nesneler <code class="language-plaintext highlighter-rouge">JSON.stringify()</code> ile metne çevrilmeli, okunurken <code class="language-plaintext highlighter-rouge">JSON.parse()</code> ile geri dönüştürülmelidir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">kullanici</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">ad</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Ada</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">tema</span><span class="p">:</span> <span class="dl">"</span><span class="s2">karanlik</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">bildirimler</span><span class="p">:</span> <span class="kc">true</span>
<span class="p">};</span>

<span class="c1">// Nesneyi JSON metnine dönüştürerek saklar.</span>
<span class="nx">localStorage</span><span class="p">.</span><span class="nf">setItem</span><span class="p">(</span><span class="dl">"</span><span class="s2">kullanici</span><span class="dl">"</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">kullanici</span><span class="p">));</span>

<span class="c1">// Saklanan metni yeniden JavaScript nesnesine çevirir.</span>
<span class="kd">const</span> <span class="nx">kayit</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nf">getItem</span><span class="p">(</span><span class="dl">"</span><span class="s2">kullanici</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">okunanKullanici</span> <span class="o">=</span> <span class="nx">kayit</span> <span class="p">?</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="nx">kayit</span><span class="p">)</span> <span class="p">:</span> <span class="kc">null</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">okunanKullanici</span><span class="p">?.</span><span class="nx">tema</span><span class="p">);</span>
</code></pre></div></div>

<p>Temel işlemler oldukça sadedir: <code class="language-plaintext highlighter-rouge">setItem()</code> veri ekler veya günceller, <code class="language-plaintext highlighter-rouge">getItem()</code> okur, <code class="language-plaintext highlighter-rouge">removeItem()</code> belirli bir kaydı siler, <code class="language-plaintext highlighter-rouge">clear()</code> ise kaynağa ait bütün kayıtları temizler.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>LocalStorage</th>
      <th>Sunucu veritabanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Veri konumu</td>
      <td>Kullanıcının tarayıcısı</td>
      <td>Uzak sunucu</td>
    </tr>
    <tr>
      <td>Kalıcılık</td>
      <td>Tarayıcı verisi silinene kadar</td>
      <td>Sunucu politikasına bağlı</td>
    </tr>
    <tr>
      <td>İnternet gereksinimi</td>
      <td>Yok</td>
      <td>Genellikle var</td>
    </tr>
    <tr>
      <td>Güvenlik</td>
      <td>Hassas veriler için uygun değil</td>
      <td>Doğru yapılandırmayla daha güvenli</td>
    </tr>
    <tr>
      <td>Veri tipi</td>
      <td>Yalnızca metin</td>
      <td>Çok sayıda veri tipi</td>
    </tr>
  </tbody>
</table>

<p>Tarayıcıların LocalStorage için genellikle birkaç megabaytlık sınırı bulunur. Yaklaşık kapasite hesabı $K \approx n \times b$ biçiminde düşünülebilir. Burada $n$ karakter sayısını, $b$ ise karakter başına kullanılan ortalama baytı temsil eder. Büyük dosyalar ve görseller bu alana doldurulmamalıdır.</p>

<h2 id="fetch-api-ile-sunucuya-ulaşmak">Fetch API ile sunucuya ulaşmak</h2>

<p>Fetch API, HTTP isteklerini Promise tabanlı olarak gerçekleştirir. <code class="language-plaintext highlighter-rouge">fetch()</code> hemen nihai veriyi değil, gelecekte oluşacak sonucu temsil eden bir Promise döndürür. Bu yapı <code class="language-plaintext highlighter-rouge">async/await</code> ile daha okunabilir hâle gelir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nf">kullanicilariGetir</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">try</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">yanit</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://jsonplaceholder.typicode.com/users</span><span class="dl">"</span><span class="p">);</span>

    <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">yanit</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="s2">`HTTP hatası: </span><span class="p">${</span><span class="nx">yanit</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="kd">const</span> <span class="nx">kullanicilar</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">yanit</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
    <span class="nx">localStorage</span><span class="p">.</span><span class="nf">setItem</span><span class="p">(</span><span class="dl">"</span><span class="s2">kullanicilar</span><span class="dl">"</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">kullanicilar</span><span class="p">));</span>
    <span class="k">return</span> <span class="nx">kullanicilar</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Veriler alınamadı:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">hata</span><span class="p">);</span>
    <span class="k">return</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="nx">localStorage</span><span class="p">.</span><span class="nf">getItem</span><span class="p">(</span><span class="dl">"</span><span class="s2">kullanicilar</span><span class="dl">"</span><span class="p">)</span> <span class="o">||</span> <span class="dl">"</span><span class="s2">[]</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu örnek önce sunucudan veri almaya çalışır. İstek başarısız olursa daha önce LocalStorage’a kaydedilmiş verileri kullanır. Böylece basit bir önbellek mekanizması elde edilir. Fetch yalnızca ağ hatalarında otomatik olarak reddedilir; <code class="language-plaintext highlighter-rouge">404</code> veya <code class="language-plaintext highlighter-rouge">500</code> gibi HTTP cevaplarında <code class="language-plaintext highlighter-rouge">response.ok</code> ayrıca kontrol edilmelidir.</p>

<table>
  <thead>
    <tr>
      <th>HTTP metodu</th>
      <th>Amaç</th>
      <th>Tipik kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GET</td>
      <td>Veri okumak</td>
      <td>Ürün listesini almak</td>
    </tr>
    <tr>
      <td>POST</td>
      <td>Yeni veri oluşturmak</td>
      <td>Kullanıcı kaydetmek</td>
    </tr>
    <tr>
      <td>PUT/PATCH</td>
      <td>Veriyi güncellemek</td>
      <td>Profil düzenlemek</td>
    </tr>
    <tr>
      <td>DELETE</td>
      <td>Veriyi silmek</td>
      <td>Yorumu kaldırmak</td>
    </tr>
  </tbody>
</table>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://api.example.com/tercihler</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span>
  <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">POST</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">headers</span><span class="p">:</span> <span class="p">{</span> <span class="dl">"</span><span class="s2">Content-Type</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span> <span class="p">},</span>
  <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">({</span> <span class="na">tema</span><span class="p">:</span> <span class="dl">"</span><span class="s2">karanlik</span><span class="dl">"</span> <span class="p">})</span>
<span class="p">});</span>
</code></pre></div></div>

<h2 id="güvenlik-ve-doğru-kullanım">Güvenlik ve doğru kullanım</h2>

<p>LocalStorage içeriğine sayfadaki JavaScript erişebilir. Bu nedenle parola, kredi kartı bilgisi veya uzun ömürlü erişim anahtarları burada saklanmamalıdır. Bir XSS açığı, kayıtlı verilerin saldırgan tarafından okunmasına yol açabilir. Sunucudan gelen içerik de doğrulanmadan <code class="language-plaintext highlighter-rouge">innerHTML</code> ile sayfaya basılmamalıdır.</p>

<p>En sağlıklı yaklaşım; LocalStorage’ı tema, dil ve geçici önbellek gibi düşük riskli bilgiler için kullanmak, önemli verileri sunucuda tutmak ve Fetch isteklerinde hata, zaman aşımı ve yüklenme durumlarını kullanıcıya açıkça göstermektir. Böylece uygulama hem hızlı hem dayanıklı olur; kullanıcı da boş ekrana bakıp internet tanrılarına dua etmek zorunda kalmaz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="JavaScript" /><category term="LocalStorage" /><category term="Fetch API" /><summary type="html"><![CDATA[Modern web uygulamaları yalnızca ekranda bilgi göstermez; kullanıcı tercihlerini hatırlar, sunuculardan güncel veriler alır ve bağlantı kesildiğinde bile belirli işlevleri sürdürebilir. JavaScript’in LocalStorage ve Fetch API araçları, bu deneyimi oluşturmanın iki temel parçasıdır. Biri verileri tarayıcıda saklarken diğeri uygulamanın dış dünyayla konuşmasını sağlar.]]></summary></entry><entry><title type="html">Neden Bazı Programcılar Vim’i Bırakamıyor? Alışkanlık, Kimlik ve Araç Bağımlılığı</title><link href="https://sonsuzus.github.io/posts/neden-bazi-programcilar-vimi-birakamiyor-aliskanlik-kimlik-ve-arac-bagimliligi/" rel="alternate" type="text/html" title="Neden Bazı Programcılar Vim’i Bırakamıyor? Alışkanlık, Kimlik ve Araç Bağımlılığı" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/neden-bazi-programcilar-vimi-birakamiyor-aliskanlik-kimlik-ve-arac-bagimliligi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/neden-bazi-programcilar-vimi-birakamiyor-aliskanlik-kimlik-ve-arac-bagimliligi/"><![CDATA[<p>Bir programcının Vim hakkında konuşmaya başlaması bazen teknik bir sohbetten çok aile yadigârını anlatmasına benzer. “Hızlı”, “hafif” ve “her sunucuda var” gibi makul gerekçeler sıralanır; ardından tuş kombinasyonları, nokta komutu ve fare kullanmamanın erdemleri gelir. Fakat Vim bağlılığını yalnızca verimlilikle açıklamak eksik kalır. Burada alışkanlık döngüleri, emekle kurulan duygusal bağ, topluluk üyeliği ve profesyonel kimlik aynı terminal penceresinde buluşur.
``</p>

<h2 id="editör-değil-öğrenilmiş-bir-hareket-sistemi">Editör değil, öğrenilmiş bir hareket sistemi</h2>

<p>Vim’in temel farkı <strong>modal</strong> olmasıdır. Normal modda tuşlar karakter yazmak yerine komut verir; ekleme modunda ise metin oluşturur. Böylece düzenleme, tek tek düğmelere basmaktan ziyade küçük bir dil konuşmaya dönüşür. Örneğin <code class="language-plaintext highlighter-rouge">dw</code> “sonraki kelimeyi sil”, <code class="language-plaintext highlighter-rouge">ci"</code> ise “tırnakların içini değiştir” anlamına gelir.</p>

<p>Bu yapı, başlangıçta yüksek bilişsel yük üretir. Zamanla komutlar prosedürel belleğe taşınır ve kullanıcı artık adımları bilinçli biçimde düşünmez. Basitleştirilmiş bir öğrenme modeli şöyle gösterilebilir:</p>

\[T(n) = T_{min} + (T_0 - T_{min})e^{-kn}\]

<p>Burada $T(n)$, $n$ tekrar sonrasındaki işlem süresi; $T_0$ başlangıç süresi, $T_{min}$ ulaşılabilecek alt sınır ve $k$ öğrenme hızıdır. Yeterli tekrar sonrasında komut, zihinsel bir problem olmaktan çıkarak parmakların bildiği bir harekete dönüşür.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Vim’e yeni başlayan</th>
      <th>Deneyimli Vim kullanıcısı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Komut kullanımı</td>
      <td>Bilinçli olarak hatırlar</td>
      <td>Kas belleğiyle uygular</td>
    </tr>
    <tr>
      <td>Modal yapı</td>
      <td>Kafa karıştırıcıdır</td>
      <td>Düzenleme dilidir</td>
    </tr>
    <tr>
      <td>Yapılandırma</td>
      <td>Ek iş gibi görünür</td>
      <td>Kişisel yatırım sayılır</td>
    </tr>
    <tr>
      <td>Araç değişimi</td>
      <td>Kolay görünebilir</td>
      <td>Akışı bozan maliyettir</td>
    </tr>
  </tbody>
</table>

<h2 id="alışkanlık-döngüsü-ve-anlık-ödül">Alışkanlık döngüsü ve anlık ödül</h2>

<p>Psikolojide alışkanlıklar çoğunlukla <strong>tetikleyici, davranış ve ödül</strong> döngüsüyle açıklanır. Vim’de tetikleyici, düzenlenmesi gereken metindir. Davranış kısa bir komut dizisidir; ödül ise değişikliğin anında ve zarif biçimde gerçekleşmesidir. Özellikle karmaşık bir düzenlemeyi birkaç tuşla tamamlamak küçük ama güçlü bir yeterlilik hissi verir.</p>

<p>Aşağıdaki komut, geçerli satırdaki ilk <code class="language-plaintext highlighter-rouge">foo</code> ifadesini <code class="language-plaintext highlighter-rouge">bar</code> ile değiştirir:</p>

<div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">:</span>s<span class="sr">/foo/</span>bar/
</code></pre></div></div>

<p>Bu yalnızca kısa bir komut değildir. Kullanıcıya “Metni ben kontrol ediyorum” hissi veren hızlı bir geri bildirim mekanizmasıdır. Benzer ödüller tekrarlandıkça araç kullanımı otomatikleşir.</p>

<h2 id="emek-sahiplik-ve-batık-maliyet">Emek, sahiplik ve batık maliyet</h2>

<p>Vim kullanıcıları genellikle kendi yapılandırmalarını yıllar içinde geliştirir. Örneğin şu ayarlar satır numaralarını açar ve aramayı yazarken sonuçları gösterir:</p>

<div class="language-vim highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">set</span> <span class="k">number</span>
<span class="k">set</span> <span class="nb">incsearch</span>
<span class="k">set</span> <span class="nb">ignorecase</span>
<span class="k">set</span> <span class="nb">smartcase</span>
</code></pre></div></div>

<p>Bu dosya büyüdükçe editör, fabrikadan çıkmış standart bir araç olmaktan uzaklaşır; kullanıcının tercihlerini taşıyan kişisel bir çalışma ortamına dönüşür. <strong>IKEA etkisi</strong>, insanların emek verdikleri şeylere daha fazla değer biçtiğini söyler. Batık maliyet yanılgısı da geçmişte harcanan zamanın gelecekteki tercihler üzerinde gereğinden fazla etkili olabileceğini açıklar.</p>

<p>Ancak her bağlılık irrasyonel değildir. Araç değiştirme maliyeti kabaca şöyle düşünülebilir:</p>

\[M = E + Y + A\]

<p>Burada $E$ eğitim süresi, $Y$ yeni yapılandırma emeği, $A$ ise geçiş sırasında yaşanan akış kaybıdır. Vim becerisi yüksek biri için bu toplam gerçekten büyük olabilir.</p>

<h2 id="araçtan-kimliğe">Araçtan kimliğe</h2>

<p>“Vim kullanıyorum” ifadesi zamanla “Ben klavye odaklı, sistemleri anlayan ve araçlarını özelleştiren bir programcıyım” mesajına dönüşebilir. Topluluk şakaları, <code class="language-plaintext highlighter-rouge">.vimrc</code> paylaşımları ve editör tartışmaları bu kimliği pekiştirir. Sosyal kimlik kuramına göre insanlar ait oldukları gruplardan benlik değerinin bir kısmını elde eder. Vim topluluğu da ortak bir jargon ve ustalık ölçütleri sunar.</p>

<p>Sorun, araç tercihi ahlaki üstünlük yarışına dönüştüğünde başlar. Vim kullanmak disiplinin garantisi olmadığı gibi başka bir editör kullanmak da teknik yetersizlik değildir. Sağlıklı bağlılık, aracın işe hizmet etmesidir; bağımlılık ise işin aracı savunmaya hizmet etmeye başlamasıdır.</p>

<p>Sonuçta bazı programcılar Vim’i bırakamaz çünkü yalnızca bir editörü değil, yıllarca geliştirdikleri hareket hafızasını, kişisel çalışma alanını ve mesleki benliklerinin küçük bir parçasını bırakmaları gerekir. Çıkmak için <code class="language-plaintext highlighter-rouge">:q</code> yeterli olabilir; fakat psikolojik olarak çıkış komutu biraz daha uzundur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Vim" /><category term="programcı psikolojisi" /><category term="geliştirici araçları" /><summary type="html"><![CDATA[Bir programcının Vim hakkında konuşmaya başlaması bazen teknik bir sohbetten çok aile yadigârını anlatmasına benzer. “Hızlı”, “hafif” ve “her sunucuda var” gibi makul gerekçeler sıralanır; ardından tuş kombinasyonları, nokta komutu ve fare kullanmamanın erdemleri gelir. Fakat Vim bağlılığını yalnızca verimlilikle açıklamak eksik kalır. Burada alışkanlık döngüleri, emekle kurulan duygusal bağ, topluluk üyeliği ve profesyonel kimlik aynı terminal penceresinde buluşur.]]></summary></entry><entry><title type="html">Neden Eski COBOL Kodları Hâlâ Bankaları Ayakta Tutuyor?</title><link href="https://sonsuzus.github.io/posts/neden-eski-cobol-kodlari-hala-bankalari-ayakta-tutuyor/" rel="alternate" type="text/html" title="Neden Eski COBOL Kodları Hâlâ Bankaları Ayakta Tutuyor?" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/neden-eski-cobol-kodlari-hala-bankalari-ayakta-tutuyor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/neden-eski-cobol-kodlari-hala-bankalari-ayakta-tutuyor/"><![CDATA[<p>Bir banka kartıyla kahve aldığınızda, işleminizin arkasında sizden, baristadan ve muhtemelen kahve makinesinden daha yaşlı bir kod çalışıyor olabilir. 1959’da geliştirilen COBOL, modern görünmemesine rağmen hesap bakiyelerinden maaş ödemelerine kadar kritik finansal süreçleri yönetmeye devam ediyor. Bu durum yalnızca teknik bir nostalji değil; toplumun görünmez biçimde eski yazılımlara bağlandığını gösteren devasa bir mühendislik hikâyesidir.</p>

<p>``</p>

<h2 id="cobol-neden-bu-kadar-uzun-yaşadı">COBOL neden bu kadar uzun yaşadı?</h2>

<p>COBOL, <strong>Common Business-Oriented Language</strong> ifadesinin kısaltmasıdır. Dil; ticari kayıtların işlenmesi, rapor üretimi ve yüksek hacimli finansal işlemler için tasarlandı. Sözdizimi bugünün dillerine göre uzun görünür, fakat okunabilirliği dönemine göre önemli bir avantajdı.</p>

<p>Basitleştirilmiş bir işlem mantığı şöyle yazılabilir:</p>

<div class="language-cobol highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">IF</span><span class="w"> </span><span class="n">ACCOUNT-BALANCE</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">PAYMENT-AMOUNT</span><span class="w">
    </span><span class="k">SUBTRACT</span><span class="w"> </span><span class="n">PAYMENT-AMOUNT</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">ACCOUNT-BALANCE</span><span class="w">
    </span><span class="k">MOVE</span><span class="w"> </span><span class="s2">"</span><span class="s">APPROVED</span><span class="s2">"</span><span class="w"> </span><span class="k">TO</span><span class="w"> </span><span class="n">TRANSACTION-STATUS</span><span class="w">
</span><span class="k">ELSE</span><span class="w">
    </span><span class="k">MOVE</span><span class="w"> </span><span class="s2">"</span><span class="s">DECLINED</span><span class="s2">"</span><span class="w"> </span><span class="k">TO</span><span class="w"> </span><span class="n">TRANSACTION-STATUS</span><span class="w">
</span><span class="k">END-IF</span><span class="p">.</span><span class="w">
</span></code></pre></div></div>

<p>Bu kod, bakiye yeterliyse ödeme tutarını hesaptan düşer ve işlemi onaylar. Gerçek bankacılık sistemleri elbette çok daha karmaşıktır; eşzamanlı işlemler, günlük kayıtları, güvenlik kontrolleri ve geri alma mekanizmaları içerir. Yine de temel fikir aynıdır: Veriyi doğru, tutarlı ve hızlı biçimde işlemek.</p>

<p>COBOL sistemlerinin önemli bölümü <strong>mainframe</strong> adı verilen yüksek güvenilirlikli bilgisayarlarda çalışır. Bu makineler saniyede binlerce işlemi yönetebilir ve yıllarca kesintisiz hizmet verebilir. Başka bir deyişle mesele yalnızca eski kod değildir; kod, donanım, veri biçimleri ve operasyon ekipleri birlikte çalışan bir ekosistemdir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>COBOL ve mainframe</th>
      <th>Modern bulut uygulaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel öncelik</td>
      <td>İşlem tutarlılığı</td>
      <td>Esneklik ve hızlı geliştirme</td>
    </tr>
    <tr>
      <td>Ölçekleme</td>
      <td>Güçlü merkezi sistem</td>
      <td>Dağıtık kaynaklar</td>
    </tr>
    <tr>
      <td>Değişiklik riski</td>
      <td>Genellikle yüksek</td>
      <td>Mimariye göre değişken</td>
    </tr>
    <tr>
      <td>Uzman erişimi</td>
      <td>Giderek azalıyor</td>
      <td>Görece daha yaygın</td>
    </tr>
    <tr>
      <td>Kanıtlanmış çalışma süresi</td>
      <td>On yıllar</td>
      <td>Çoğunlukla daha kısa</td>
    </tr>
  </tbody>
</table>

<h2 id="çalışıyorsa-neden-değiştirmiyoruz">Çalışıyorsa neden değiştirmiyoruz?</h2>

<p>Bir bankanın çekirdek sistemini yenilemek, telefon uygulamasını güncellemeye benzemez. Milyonlarca müşterinin bakiyesi, kredi planı, faiz hesabı ve geçmiş işlemi yeni sisteme eksiksiz taşınmalıdır. Küçük bir yuvarlama farkı bile büyük ölçekte ciddi sonuçlar doğurabilir.</p>

<p>Örneğin $N$ hesapta oluşan ortalama hata $e$ ise toplam parasal sapma kabaca</p>

\[E = N \times e\]

<p>şeklinde düşünülebilir. On milyon hesapta yalnızca $0{,}01$ TL hata oluşması, toplamda $100.000$ TL tutarsızlık demektir. Üstelik finansal sistemlerde sorun sadece para değildir; denetim kayıtları ve hukuki yükümlülükler de korunmalıdır.</p>

<p>Risk basitçe şu bileşenlerle modellenebilir:</p>

\[R = P(\text{arıza}) \times \text{etki}\]

<p>Eski sistemlerde arıza olasılığı bakım zorlukları nedeniyle artabilir. Ancak plansız bir dönüşümün etkisi de çok büyük olduğundan bankalar çoğu zaman “kontrollü yaşlandırma” yaklaşımını seçer.</p>

<h2 id="asıl-kırılganlık-koddan-ibaret-değil">Asıl kırılganlık koddan ibaret değil</h2>

<p>COBOL kodunun eski olması otomatik olarak kötü olduğu anlamına gelmez. Asıl tehlike, sistemi anlayan uzmanların emekli olması ve kurumsal bilginin belgelenmemesidir. Bazı kurallar yalnızca kodun içinde saklıdır: otuz yıl önce eklenmiş bir vergi istisnası, artık kimsenin hatırlamadığı bir ürün veya gece yarısı çalışan özel bir mutabakat süreci gibi.</p>

<p>Bu bağımlılık toplumsaldır. Bankalar durduğunda maaşlar yatmaz, kartlar çalışmaz, işletmeler ödeme alamaz ve kamu transferleri aksar. Dolayısıyla COBOL bakımı özel bir şirketin teknik borcu olmaktan çıkarak ekonomik altyapı meselesine dönüşür.</p>

<h2 id="çözüm-bir-gecede-yeniden-yazmak-değil">Çözüm: Bir gecede yeniden yazmak değil</h2>

<p>En güvenli yaklaşım genellikle kademeli modernizasyondur. Önce test kapsamı artırılır, sistem davranışları belgelenir ve COBOL uygulamasının önüne API katmanları eklenir. Ardından düşük riskli işlevler parça parça yeni platformlara taşınır. Eski ve yeni sistem bir süre paralel çalıştırılarak sonuçları karşılaştırılır.</p>

<p>COBOL bugün bankaları ayakta tutuyor çünkü başarısız değil, aksine fazlasıyla başarılı oldu. Fakat bu başarı sonsuz güvence sağlamıyor. Geleceğin görevi eski kodla alay etmek değil; onun taşıdığı bilgiyi kaybetmeden, toplumu sarsmadan ve dijital ekonominin fişini çekmeden dönüşümü gerçekleştirmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="COBOL" /><category term="miras sistemler" /><category term="bankacılık teknolojileri" /><summary type="html"><![CDATA[Bir banka kartıyla kahve aldığınızda, işleminizin arkasında sizden, baristadan ve muhtemelen kahve makinesinden daha yaşlı bir kod çalışıyor olabilir. 1959’da geliştirilen COBOL, modern görünmemesine rağmen hesap bakiyelerinden maaş ödemelerine kadar kritik finansal süreçleri yönetmeye devam ediyor. Bu durum yalnızca teknik bir nostalji değil; toplumun görünmez biçimde eski yazılımlara bağlandığını gösteren devasa bir mühendislik hikâyesidir.]]></summary></entry><entry><title type="html">Pivot Kim Olacak? Quicksort’tan Toplumsal Hiyerarşilere Algoritmik Bir Yolculuk</title><link href="https://sonsuzus.github.io/posts/pivot-kim-olacak-quicksorttan-toplumsal-hiyerarsilere-algoritmik-bir-yolculuk/" rel="alternate" type="text/html" title="Pivot Kim Olacak? Quicksort’tan Toplumsal Hiyerarşilere Algoritmik Bir Yolculuk" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/pivot-kim-olacak-quicksorttan-toplumsal-hiyerarsilere-algoritmik-bir-yolculuk</id><content type="html" xml:base="https://sonsuzus.github.io/posts/pivot-kim-olacak-quicksorttan-toplumsal-hiyerarsilere-algoritmik-bir-yolculuk/"><![CDATA[<p>Bir sınıftaki öğrencileri nota, çalışanları performansa veya kredi başvurularını risk puanına göre sıraladığımızı düşünelim. İlk bakışta bu işlemler Quicksort’un yaptığına benzer: Bir ölçüt seçilir, herkes bu ölçüte göre gruplara ayrılır ve düzen ortaya çıkar. Ancak insanları sıralarken kullanılan “pivot”, yalnızca teknik bir değişken değildir; fırsatları, görünürlüğü ve gücü belirleyen toplumsal bir tercihe dönüşebilir.</p>

<p>``</p>

<h2 id="önce-quicksortu-masaya-yatırmak">Önce Quicksort’u Masaya Yatırmak</h2>

<p>Quicksort, <strong>böl ve yönet</strong> yaklaşımına dayanan bir sıralama algoritmasıdır. Diziden bir pivot seçer; küçük değerleri pivotun soluna, büyük değerleri sağına taşır. Ardından aynı işlemi iki alt grup üzerinde tekrarlar.</p>

<p>Ortalama çalışma süresi şu bağıntıyla modellenebilir:</p>

\[T(n)=2T\left(\frac{n}{2}\right)+O(n)=O(n\log n)\]

<p>Fakat pivot sürekli en küçük veya en büyük eleman seçilirse gruplar dengesizleşir:</p>

\[T(n)=T(n-1)+O(n)=O(n^2)\]

<p>Yani pivot seçimi, algoritmanın kaderini değiştirir. İşte metaforun kapısı tam burada açılır: Toplumlarda da başarıyı ölçmek için seçilen merkezi kriterler, insanları dengeli biçimde değerlendirebilir veya mevcut eşitsizlikleri derinleştirebilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">quicksort</span><span class="p">(</span><span class="n">insanlar</span><span class="p">,</span> <span class="n">olcut</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">insanlar</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">insanlar</span>

    <span class="n">pivot</span> <span class="o">=</span> <span class="n">insanlar</span><span class="p">[</span><span class="nf">len</span><span class="p">(</span><span class="n">insanlar</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">]</span>
    <span class="n">dusuk</span> <span class="o">=</span> <span class="p">[</span><span class="n">kisi</span> <span class="k">for</span> <span class="n">kisi</span> <span class="ow">in</span> <span class="n">insanlar</span> <span class="k">if</span> <span class="nf">olcut</span><span class="p">(</span><span class="n">kisi</span><span class="p">)</span> <span class="o">&lt;</span> <span class="nf">olcut</span><span class="p">(</span><span class="n">pivot</span><span class="p">)]</span>
    <span class="n">esit</span> <span class="o">=</span> <span class="p">[</span><span class="n">kisi</span> <span class="k">for</span> <span class="n">kisi</span> <span class="ow">in</span> <span class="n">insanlar</span> <span class="k">if</span> <span class="nf">olcut</span><span class="p">(</span><span class="n">kisi</span><span class="p">)</span> <span class="o">==</span> <span class="nf">olcut</span><span class="p">(</span><span class="n">pivot</span><span class="p">)]</span>
    <span class="n">yuksek</span> <span class="o">=</span> <span class="p">[</span><span class="n">kisi</span> <span class="k">for</span> <span class="n">kisi</span> <span class="ow">in</span> <span class="n">insanlar</span> <span class="k">if</span> <span class="nf">olcut</span><span class="p">(</span><span class="n">kisi</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nf">olcut</span><span class="p">(</span><span class="n">pivot</span><span class="p">)]</span>

    <span class="k">return</span> <span class="nf">quicksort</span><span class="p">(</span><span class="n">dusuk</span><span class="p">,</span> <span class="n">olcut</span><span class="p">)</span> <span class="o">+</span> <span class="n">esit</span> <span class="o">+</span> <span class="nf">quicksort</span><span class="p">(</span><span class="n">yuksek</span><span class="p">,</span> <span class="n">olcut</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod, kişileri verilen bir ölçüte göre sıralar. Teknik açıdan masum görünen <code class="language-plaintext highlighter-rouge">olcut</code> fonksiyonu gelir, sınav puanı veya üretkenlik olabilir. Fakat ölçüt geçmişteki ayrıcalıkları içeriyorsa algoritma onları sorgulamaz; yalnızca daha düzenli hâle getirir.</p>

<h2 id="pivot-ile-ayrıcalık-arasındaki-benzerlik">Pivot ile Ayrıcalık Arasındaki Benzerlik</h2>

<p>Bir işe alım sistemi “başarılı çalışan” profilini mevcut yöneticilere bakarak oluşturursa yöneticiler toplumsal pivot hâline gelir. Onlara benzeyen adaylar uygun, uzak kalanlar riskli sayılabilir. Böylece sistem, geçmiş hiyerarşiyi geleceğin matematiksel standardına dönüştürür.</p>

<table>
  <thead>
    <tr>
      <th>Quicksort kavramı</th>
      <th>Toplumsal metafor</th>
      <th>Olası sorun</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Pivot</td>
      <td>Başarı standardı</td>
      <td>Tek bir grubun norm kabul edilmesi</td>
    </tr>
    <tr>
      <td>Karşılaştırma</td>
      <td>Puanlama ve değerlendirme</td>
      <td>Bağlamın göz ardı edilmesi</td>
    </tr>
    <tr>
      <td>Bölümleme</td>
      <td>Sınıf veya statü grupları</td>
      <td>Keskin ve kalıcı kategoriler</td>
    </tr>
    <tr>
      <td>Özyineleme</td>
      <td>Düzenin yeniden üretilmesi</td>
      <td>Eşitsizliğin nesiller boyunca sürmesi</td>
    </tr>
    <tr>
      <td>Dengesiz dizi</td>
      <td>Fırsat eşitsizliği</td>
      <td>Bazı grupların sürekli geride kalması</td>
    </tr>
  </tbody>
</table>

<h2 id="hızlı-olmak-adil-olmak-değildir">Hızlı Olmak, Adil Olmak Değildir</h2>

<p>Bir algoritmanın doğruluğu ile adaleti aynı şey değildir. Quicksort, tanımlanan karşılaştırma kuralına göre kusursuz sıralama yapabilir; ancak kuralın ahlaki açıdan doğru olup olmadığını bilemez. Benzer şekilde kredi modeli ödememe riskini doğru tahmin ederken belirli mahalleleri dolaylı biçimde cezalandırabilir.</p>

<p>Algoritmik adalette kullanılan ölçütlerden biri <strong>demografik eşitliktir</strong>:</p>

\[P(\hat{Y}=1\mid A=a)=P(\hat{Y}=1\mid A=b)\]

<p>Bu ifade, farklı grupların olumlu karar alma oranlarının eşit olmasını ister. <strong>Fırsat eşitliği</strong> ise gerçekten uygun kişiler arasındaki kabul oranlarına odaklanır:</p>

\[P(\hat{Y}=1\mid Y=1,A=a)=P(\hat{Y}=1\mid Y=1,A=b)\]

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Temel soru</th>
      <th>Kör noktası</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Verimlilik</td>
      <td>Sonuç ne kadar hızlı üretiliyor?</td>
      <td>Sonucun kime zarar verdiği</td>
    </tr>
    <tr>
      <td>Doğruluk</td>
      <td>Tahminler ne kadar isabetli?</td>
      <td>Hataların gruplara dağılımı</td>
    </tr>
    <tr>
      <td>Eşitlik</td>
      <td>Gruplar benzer fırsat alıyor mu?</td>
      <td>Bireysel farklılıklar</td>
    </tr>
    <tr>
      <td>Açıklanabilirlik</td>
      <td>Karar anlaşılabiliyor mu?</td>
      <td>Açıklamanın adil olduğu varsayımı</td>
    </tr>
  </tbody>
</table>

<h2 id="metaforun-sınırı-ve-asıl-ders">Metaforun Sınırı ve Asıl Ders</h2>

<p>İnsanlar sayı değildir; toplum da sıralanmayı bekleyen bir dizi değildir. Bu nedenle Quicksort benzetmesi bir çözüm değil, düşünme aracıdır. Ama güçlü bir uyarı sunar: <strong>Pivotu kim seçiyor, karşılaştırma kuralını kim yazıyor ve yanlış tarafta kalanların itiraz hakkı var mı?</strong></p>

<p>Adil sistemler yalnızca daha iyi kodla kurulmaz. Temsilî veri, etki analizi, bağımsız denetim, açıklanabilir kararlar ve insan müdahalesi gerekir. Bazen en adil seçenek, sıralamayı iyileştirmek değil; herkesi tek bir hiyerarşiye sokma fikrini sorgulamaktır. Çünkü toplumsal hayatta mesele yalnızca $O(n\log n)$ hızına ulaşmak değil, hiçbir insanı görünmez bir pivotun gölgesinde bırakmamaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritmalar" /><category term="quicksort" /><category term="algoritmik adalet" /><summary type="html"><![CDATA[Bir sınıftaki öğrencileri nota, çalışanları performansa veya kredi başvurularını risk puanına göre sıraladığımızı düşünelim. İlk bakışta bu işlemler Quicksort’un yaptığına benzer: Bir ölçüt seçilir, herkes bu ölçüte göre gruplara ayrılır ve düzen ortaya çıkar. Ancak insanları sıralarken kullanılan “pivot”, yalnızca teknik bir değişken değildir; fırsatları, görünürlüğü ve gücü belirleyen toplumsal bir tercihe dönüşebilir.]]></summary></entry></feed>