<?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-29T07:13:22+00:00</updated><id>https://sonsuzus.github.io/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">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">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">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><entry><title type="html">Programlama Dillerinin Kişilik Testi: Python INTJ mi, Haskell INTP mi?</title><link href="https://sonsuzus.github.io/posts/programlama-dillerinin-kisilik-testi-python-intj-mi-haskell-intp-mi/" rel="alternate" type="text/html" title="Programlama Dillerinin Kişilik Testi: Python INTJ mi, Haskell INTP 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/programlama-dillerinin-kisilik-testi-python-intj-mi-haskell-intp-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/programlama-dillerinin-kisilik-testi-python-intj-mi-haskell-intp-mi/"><![CDATA[<p>Programlama dilleri bir kişilik testine girseydi sonuçları nasıl çıkardı? Python planlı, özgüvenli bir INTJ mi olurdu; Haskell ise soyut düşüncelere dalıp öğle yemeğini unutan bir INTP mi? Elbette dillerin gerçek kişilikleri yok. Yine de MBTI benzetmesi; sözdizimi, tip sistemi ve paradigma gibi kuru görünen kavramları eğlenceli biçimde karşılaştırmak için şaşırtıcı derecede kullanışlıdır.</p>

<p>``</p>

<h2 id="önce-testin-bilimsel-olmayan-bilimi">Önce Testin Bilimsel Olmayan Bilimi</h2>

<p>Bir programlama dilinin “kişiliğini” üç eksende modelleyebiliriz: ne kadar kural koyduğu, belirsizliğe ne kadar izin verdiği ve programcıyı hangi düşünme biçimine yönlendirdiği. Eğlencelik puanımız şöyle olsun:</p>

\[K = 0.4T + 0.3P + 0.3S\]

<p>Burada $T$ tip sisteminin katılığını, $P$ paradigmanın yönlendiriciliğini, $S$ ise sözdizimsel disiplini temsil eder. Yüksek $K$, dili daha planlı ve kuralcı; düşük $K$ ise daha esnek ve doğaçlamacı gösterir. Bu denklem akademik bir ölçüm değil, tasarım tercihlerini konuşmayı kolaylaştıran mizahi bir mercektir.</p>

<h2 id="python-stratejik-intj-mi-uyumlu-enfp-mi">Python: Stratejik INTJ mi, Uyumlu ENFP mi?</h2>

<p>Python ilk bakışta INTJ havası verir: okunabilirlik konusunda güçlü fikirleri vardır, gereksiz karmaşayı sevmez ve “Bunu yapmanın tercihen tek bir açık yolu olmalı” der. Girintiyi sözdiziminin parçası yapması da masasındaki kalemleri cetvelle hizalayan biri gibidir.</p>

<p>Ancak dinamik tip sistemi Python’ın daha esnek tarafını gösterir. Bir değişkenin türü çalışma zamanında belirlenebilir; ördek gibi yürüyor ve vaklıyorsa muhtemelen ördektir. Dolayısıyla Python, plan yapan fakat plan değişince kriz çıkarmayan bir <strong>INTJ–ENFP melezi</strong> sayılabilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">toplam</span><span class="p">(</span><span class="n">degerler</span><span class="p">):</span>
    <span class="c1"># Aynı davranışı destekleyen farklı koleksiyonlarla çalışır.
</span>    <span class="k">return</span> <span class="nf">sum</span><span class="p">(</span><span class="n">degerler</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">toplam</span><span class="p">([</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">]))</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">toplam</span><span class="p">((</span><span class="mf">2.5</span><span class="p">,</span> <span class="mf">3.5</span><span class="p">)))</span>
</code></pre></div></div>

<p>Bu fonksiyon, parametrenin kesin sınıfını sormaz; yalnızca <code class="language-plaintext highlighter-rouge">sum</code> ile uyumlu olmasını bekler. Esneklik üretkenliği artırır, fakat bazı hataları çalışma zamanına bırakabilir.</p>

<h2 id="haskell-safkan-intp">Haskell: Safkan INTP</h2>

<p>Haskell, “Önce problemi matematiksel olarak tanımlayalım” diyen INTP’dir. Saf fonksiyonlar, değişmez veriler ve güçlü statik tip sistemi onun zihinsel laboratuvarıdır. Yan etkiler bile kapıdan ellerini yıkamadan giremez; <code class="language-plaintext highlighter-rouge">IO</code> gibi yapılarla açıkça modellenir.</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">kareler</span> <span class="o">::</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span>
<span class="n">kareler</span> <span class="n">sayilar</span> <span class="o">=</span> <span class="n">map</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="o">-&gt;</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span> <span class="n">sayilar</span>
</code></pre></div></div>

<p>Tip imzası, fonksiyonun tamsayı listesini alıp yine tamsayı listesi ürettiğini önceden bildirir. Fonksiyon dış dünyayı değiştirmez; aynı girdi için daima aynı sonucu verir. Bu özellik şu eşitlikle anlatılabilir:</p>

\[f(x) = f(x) \quad \text{her çağrıda}\]

<h2 id="diğer-diller-partiye-katılırsa">Diğer Diller Partiye Katılırsa</h2>

<table>
  <thead>
    <tr>
      <th>Dil</th>
      <th>Eğlencelik tip</th>
      <th>Tasarım karakteri</th>
      <th>Partideki davranışı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Python</td>
      <td>INTJ/ENFP</td>
      <td>Okunabilir, pragmatik, dinamik</td>
      <td>Herkesle hızlıca proje başlatır</td>
    </tr>
    <tr>
      <td>Haskell</td>
      <td>INTP</td>
      <td>Saf, soyut, güçlü tipli</td>
      <td>Partinin mantıksal modelini kurar</td>
    </tr>
    <tr>
      <td>Java</td>
      <td>ISTJ</td>
      <td>Kurallı, açık, kurumsal</td>
      <td>Davetiye sınıfı ve üç arayüz yazar</td>
    </tr>
    <tr>
      <td>JavaScript</td>
      <td>ENFP</td>
      <td>Esnek, olay odaklı, sürprizli</td>
      <td>Bir anda sunucuda da çalışmaya başlar</td>
    </tr>
    <tr>
      <td>Rust</td>
      <td>ESTJ</td>
      <td>Güvenlikçi, performanslı, disiplinli</td>
      <td>Belleği kimin ödünç aldığını kontrol eder</td>
    </tr>
    <tr>
      <td>C</td>
      <td>ISTP</td>
      <td>Minimal, doğrudan, donanıma yakın</td>
      <td>Müzik sistemini tornavidayla hızlandırır</td>
    </tr>
  </tbody>
</table>

<h2 id="benzetmenin-arkasındaki-gerçek-ders">Benzetmenin Arkasındaki Gerçek Ders</h2>

<p>Kişilik etiketleri şaka olsa da temel ayrımlar gerçektir. Statik tipli diller hataların bir bölümünü derleme aşamasında yakalar; dinamik diller ise hızlı deneme ve esnek modelleme sağlar. Saf fonksiyonel yaklaşım durum değişimini sınırlar, nesne yönelimli yaklaşım davranış ile veriyi nesnelerde birleştirir, sistem dilleri de donanım üzerindeki kontrolü öne çıkarır.</p>

<p>Bu nedenle “en iyi kişilik” olmadığı gibi en iyi programlama dili de yoktur. Haskell finansal kuralları güvenle modelleyebilir, Python veri analizi prototipini hızlandırabilir, Rust kritik sistemlerde bellek güvenliği sağlayabilir. Asıl kişilik testi dile değil geliştiriciye yöneliktir: Belirsizlikle flört mü ediyorsun, yoksa derleyicinin sana sürekli “Bunu gerçekten düşündün mü?” demesini mi istiyorsun?</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="programlama dilleri" /><category term="MBTI" /><category term="dil tasarımı" /><summary type="html"><![CDATA[Programlama dilleri bir kişilik testine girseydi sonuçları nasıl çıkardı? Python planlı, özgüvenli bir INTJ mi olurdu; Haskell ise soyut düşüncelere dalıp öğle yemeğini unutan bir INTP mi? Elbette dillerin gerçek kişilikleri yok. Yine de MBTI benzetmesi; sözdizimi, tip sistemi ve paradigma gibi kuru görünen kavramları eğlenceli biçimde karşılaştırmak için şaşırtıcı derecede kullanışlıdır.]]></summary></entry><entry><title type="html">Regex’in Karanlık Tarafı: Okunabilirlik ile Güç Arasındaki Ebedi Çatışma</title><link href="https://sonsuzus.github.io/posts/regexin-karanlik-tarafi-okunabilirlik-ile-guc-arasindaki-ebedi-catisma/" rel="alternate" type="text/html" title="Regex’in Karanlık Tarafı: Okunabilirlik ile Güç Arasındaki Ebedi Çatışma" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/regexin-karanlik-tarafi-okunabilirlik-ile-guc-arasindaki-ebedi-catisma</id><content type="html" xml:base="https://sonsuzus.github.io/posts/regexin-karanlik-tarafi-okunabilirlik-ile-guc-arasindaki-ebedi-catisma/"><![CDATA[<p>Düzenli ifadeler, yani regex, programcının araç çantasındaki İsviçre çakısı gibidir: Metin arar, veriyi ayıklar, biçimi doğrular ve bazen tek satırda küçük bir mucize gerçekleştirir. Ne var ki bu mucizeyi altı ay sonra yeniden gören geliştirici, kendisini antik bir yazıtı çözmeye çalışırken bulabilir. Regex’in aynı anda hem sevilmesinin hem de nefret edilmesinin temelinde tam olarak bu çelişki vardır: Olağanüstü ifade gücü, kolayca okunabilirliğin düşmanına dönüşebilir.
``</p>
<h2 id="regex-neden-bu-kadar-güçlü">Regex neden bu kadar güçlü?</h2>

<p>Teorik olarak düzenli ifadeler, <strong>düzenli dilleri</strong> tanımlamak için kullanılır. Klasik regex yapıları sonlu durum makineleriyle modellenebilir. Bir metin $n$ karakterden oluşuyorsa ve motor deterministik bir sonlu otomat gibi çalışıyorsa arama maliyeti çoğunlukla yaklaşık olarak</p>

\[T(n) = O(n)\]

<p>seviyesindedir. Başka bir deyişle motor, metni soldan sağa tarar ve her karakter için sınırlı miktarda iş yapar.</p>

<p>Örneğin basit bir kullanıcı adı kuralı şöyle yazılabilir:</p>

<pre><code class="language-regex">^[a-zA-Z][a-zA-Z0-9_]{2,15}$
</code></pre>

<p>Bu ifade, kullanıcı adının harfle başlamasını ve toplam uzunluğunun 3 ile 16 karakter arasında olmasını sağlar. Kısa, güçlü ve elle yazılmış onlarca koşuldan daha özlüdür. Sorun, kurallar çoğaldığında başlar.</p>

<h2 id="gücün-faturası-bilişsel-yük">Gücün faturası: Bilişsel yük</h2>

<p>Regex soldan sağa okunan doğal bir cümle değildir. Nokta, yıldız, soru işareti ve parantez gibi sembollerin her biri bağlama göre farklı davranır. Bu nedenle karakter sayısının az olması, kodun basit olduğu anlamına gelmez.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tek ve yoğun regex</td>
      <td>Kısa, hızlı uygulanabilir</td>
      <td>Okuması ve değiştirmesi zor</td>
      <td>Basit, sabit kurallar</td>
    </tr>
    <tr>
      <td>Parçalara ayrılmış regex</td>
      <td>Niyet daha görünürdür</td>
      <td>Biraz daha uzun kod üretir</td>
      <td>Karmaşık doğrulamalar</td>
    </tr>
    <tr>
      <td>Normal programlama kodu</td>
      <td>Hata mesajları ve akış nettir</td>
      <td>Daha fazla satır gerektirir</td>
      <td>İş kuralları ve ayrıntılı doğrulama</td>
    </tr>
    <tr>
      <td>Ayrıştırıcı kütüphanesi</td>
      <td>Yapısal veride güvenilirdir</td>
      <td>Ek bağımlılık getirir</td>
      <td>HTML, SQL veya programlama dilleri</td>
    </tr>
  </tbody>
</table>

<p>Örneğin JavaScript’te tarih parçalarını yakalayan ifadeye doğrudan saldırmak yerine parçaları adlandırabiliriz:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">year</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">(?&lt;year&gt;</span><span class="se">\\</span><span class="s2">d{4})</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">month</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">(?&lt;month&gt;0[1-9]|1[0-2])</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">day</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">(?&lt;day&gt;0[1-9]|[12]</span><span class="se">\\</span><span class="s2">d|3[01])</span><span class="dl">"</span><span class="p">;</span>

<span class="c1">// Parçaları birleştirerek YYYY-MM-DD biçimini kontrol eder.</span>
<span class="kd">const</span> <span class="nx">datePattern</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">RegExp</span><span class="p">(</span><span class="s2">`^</span><span class="p">${</span><span class="nx">year</span><span class="p">}</span><span class="s2">-</span><span class="p">${</span><span class="nx">month</span><span class="p">}</span><span class="s2">-</span><span class="p">${</span><span class="nx">day</span><span class="p">}</span><span class="s2">$`</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">match</span> <span class="o">=</span> <span class="nx">datePattern</span><span class="p">.</span><span class="nf">exec</span><span class="p">(</span><span class="dl">"</span><span class="s2">2026-07-16</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="nx">match</span><span class="p">?.</span><span class="nx">groups</span><span class="p">);</span>
</code></pre></div></div>

<p>Bu yöntem birkaç satır daha uzundur; fakat okuyucu hangi bölümün neyi temsil ettiğini hemen anlayabilir. Ayrıca adlandırılmış gruplar, <code class="language-plaintext highlighter-rouge">$1</code> ve <code class="language-plaintext highlighter-rouge">$2</code> gibi unutulmaya mahkûm referanslardan daha açıklayıcıdır.</p>

<h2 id="backtracking-karanlık-tarafın-gerçek-patronu">Backtracking: Karanlık tarafın gerçek patronu</h2>

<p>Bazı regex motorları eşleşme başarısız olduğunda önceki kararlarına dönerek başka yollar dener. Buna <strong>backtracking</strong> denir. İç içe nicelik belirteçleri, denenen yolların sayısını dramatik biçimde artırabilir:</p>

<pre><code class="language-regex">^(a+)+$
</code></pre>

<p>Bu ifade yalnızca <code class="language-plaintext highlighter-rouge">a</code> karakterlerinden oluşan metinlerde masum görünür. Ancak sonuna farklı bir karakter eklenen uzun bir girdi, motoru çok sayıda olasılığı denemeye zorlayabilir. Kötü durumda süre yaklaşık</p>

\[T(n) = O(2^n)\]

<p>seviyesine yaklaşabilir. Bu durum yalnızca performans sorunu değildir; saldırganların özel girdilerle uygulamayı yavaşlattığı <strong>ReDoS</strong> güvenlik açığına dönüşebilir.</p>

<h2 id="regex-ne-zaman-bırakılmalı">Regex ne zaman bırakılmalı?</h2>

<p>Regex; e-posta içinden alan adı ayıklamak, log satırlarını süzmek veya sabit biçimleri doğrulamak için harikadır. Fakat iç içe geçmiş HTML, dengeli parantezler ya da bağlama bağlı iş kuralları söz konusuysa uygun bir ayrıştırıcı daha güvenlidir. Bir ifade yorum satırı olmadan açıklanamıyorsa onu parçalara ayırmak, testlerle belgelemek veya tamamen normal koda taşımak gerekir.</p>

<p>Sonuçta regex kötü değildir; yalnızca yoğunlaştırılmış güçtür. İyi kullanıldığında zarif bir neşter, ölçüsüz kullanıldığında ise bakım ekibine bırakılmış sembolik bir mayın tarlasıdır. En iyi regex, sadece çalışan değil, bir sonraki geliştiricinin de korkmadan değiştirebildiği regex’tir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="regex" /><category term="okunabilirlik" /><category term="yazılım geliştirme" /><summary type="html"><![CDATA[Düzenli ifadeler, yani regex, programcının araç çantasındaki İsviçre çakısı gibidir: Metin arar, veriyi ayıklar, biçimi doğrular ve bazen tek satırda küçük bir mucize gerçekleştirir. Ne var ki bu mucizeyi altı ay sonra yeniden gören geliştirici, kendisini antik bir yazıtı çözmeye çalışırken bulabilir. Regex’in aynı anda hem sevilmesinin hem de nefret edilmesinin temelinde tam olarak bu çelişki vardır: Olağanüstü ifade gücü, kolayca okunabilirliğin düşmanına dönüşebilir.]]></summary></entry><entry><title type="html">Yazılımcıların Batıl İnançları: Dokunma, Çalışıyor!</title><link href="https://sonsuzus.github.io/posts/yazilimcilarin-batil-inanclari-dokunma-calisiyor/" rel="alternate" type="text/html" title="Yazılımcıların Batıl İnançları: Dokunma, Çalışıyor!" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/yazilimcilarin-batil-inanclari-dokunma-calisiyor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/yazilimcilarin-batil-inanclari-dokunma-calisiyor/"><![CDATA[<p>Bir yazılım ekibinde yeterince uzun süre kalırsanız şu cümleyi mutlaka duyarsınız: “O satırı silmeyin; neden çalıştığını kimse bilmiyor.” Bu uyarı bazen yorum satırında, bazen ekip sohbetinde, bazen de yıllardır şirkette çalışan bir geliştiricinin ciddi bakışlarında yaşar. Kod artık yalnızca teknik bir yapı değildir; etrafında tabular, ritüeller ve kuşaktan kuşağa aktarılan efsaneler oluşmuştur.
``
Antropolojik açıdan batıl inanç, belirsizlik karşısında kontrol hissi üreten davranıştır. Yağmur duası ile dağıtım öncesinde belirli bir kupadan kahve içmek aynı bilimsel değere sahip olmayabilir; fakat psikolojik işlevleri benzerdir. Yazılım sistemleri büyüdükçe tek bir kişinin bütünü anlaması zorlaşır. Bir değişikliğin riskini kabaca</p>

\[R = P(\text{hata}) \times E(\text{etki})\]

<p>olarak düşünürsek eski, belgesiz ve kritik bir modülde hem hata olasılığı hem de etkinin büyüklüğü yüksek algılanır. Bilgi eksikliği bu hesabı ölçülebilir olmaktan çıkarır; boşluğu ise söylentiler doldurur.</p>

<h2 id="kabile-hafızası-ve-kutsal-kod">Kabile Hafızası ve Kutsal Kod</h2>

<p>Ekiplerin “kutsal” kabul ettiği kod genellikle geçmişte büyük bir arızayla ilişkilidir. Bir geliştirici satırı değiştirmiş, üretim sistemi çökmüş ve olayın ayrıntıları zamanla unutulmuştur. Geriye yalnızca yasak kalır. Antropolojide buna kültürel aktarım diyebiliriz: Gerekçe kaybolsa bile davranış yaşamaya devam eder.</p>

<table>
  <thead>
    <tr>
      <th>Ritüel veya inanç</th>
      <th>Görünür gerekçe</th>
      <th>Muhtemel teknik köken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cuma günü dağıtım yapılmaz</td>
      <td>“Kesin sistem çöker”</td>
      <td>Hafta sonu destek ekibi eksikliği</td>
    </tr>
    <tr>
      <td>Eski fonksiyona dokunulmaz</td>
      <td>“Denge bozulur”</td>
      <td>Test ve dokümantasyon eksikliği</td>
    </tr>
    <tr>
      <td>Sunucu yeniden başlatılır</td>
      <td>“Kendine gelir”</td>
      <td>Bellek sızıntısı veya kilitlenme</td>
    </tr>
    <tr>
      <td>Belirli sırayla komut çalıştırılır</td>
      <td>“Başka türlü olmuyor”</td>
      <td>Gizli durum ve bağımlılıklar</td>
    </tr>
  </tbody>
</table>

<p>Bu davranışlar tamamen anlamsız değildir. Çoğu, gerçek bir tehlikenin kaba biçimde kodlanmış hatırasıdır. Sorun, geçici önlemin zamanla açıklanamaz bir dogmaya dönüşmesidir.</p>

<h2 id="totem-olarak-yorum-satırı">Totem Olarak Yorum Satırı</h2>

<p>Aşağıdaki yorum birçok kod tabanının mağara duvarı resmidir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// DOKUNMA: Bu gecikme kaldırılırsa ödeme işlemi bazen iki kez çalışıyor.</span>
<span class="k">await</span> <span class="nf">sleep</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
<span class="k">await</span> <span class="nf">processPayment</span><span class="p">(</span><span class="nx">order</span><span class="p">);</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">sleep</code>, muhtemelen bir yarış durumunu tesadüfen bastırır. Ancak yorum neden-sonuç ilişkisini açıklamadığı için ekip gecikmeyi koruyan bir ritüel geliştirir. Daha mühendisçe yaklaşım, işlemi benzersiz bir anahtarla idempotent hâle getirmektir:</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">processPayment</span><span class="p">(</span><span class="nx">order</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">key</span> <span class="o">=</span> <span class="s2">`payment:</span><span class="p">${</span><span class="nx">order</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">if </span><span class="p">(</span><span class="k">await</span> <span class="nf">paymentExists</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="k">return</span><span class="p">;</span>

  <span class="k">await</span> <span class="nf">createPayment</span><span class="p">({</span> <span class="nx">key</span><span class="p">,</span> <span class="na">orderId</span><span class="p">:</span> <span class="nx">order</span><span class="p">.</span><span class="nx">id</span> <span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu sürümde aynı sipariş yeniden işlense bile ikinci ödeme oluşturulmaz. Ritüelin yerine doğrulanabilir bir kural konmuştur.</p>

<h2 id="şamanlar-kıdemliler-ve-bilgi-tekelleri">Şamanlar, Kıdemliler ve Bilgi Tekelleri</h2>

<p>Bazı ekiplerde yalnızca bir kişi üretim sunucusunu “sakinleştirmeyi” bilir. Bu kişi modern bir sistem şamanına dönüşür: Hangi servisin önce başlatılacağını, hangi logun kötü alamet sayıldığını ve hangi betiğin yalnızca salı günleri çalıştığını bilir. Bu uzmanlık kısa vadede değerlidir; uzun vadede ise otobüs faktörünü düşürür. Sistemi bilen kişi sayısını $n$ ile gösterirsek, $n=1$ durumu teknik olduğu kadar örgütsel bir risktir.</p>

<p>Sağlıklı ekipler kişiyi küçümsemek yerine bilgisini görünür kılar. Olay sonrası değerlendirmeler suçlama amacıyla değil, efsaneyi kanıta dönüştürmek için yapılmalıdır. Karakterizasyon testleri mevcut davranışı kaydeder; gözlemlenebilirlik araçları gizli bağımlılıkları açığa çıkarır; küçük ve geri alınabilir değişiklikler korkuyu azaltır.</p>

<h2 id="büyüyü-mühendisliğe-dönüştürmek">Büyüyü Mühendisliğe Dönüştürmek</h2>

<p>“Dokunmayın” uyarısıyla karşılaştığınızda kodu kahramanca silmek de başka bir irrasyonel ritüeldir. Önce geçmiş olayları araştırın, log ve metrik ekleyin, davranışı testlerle sabitleyin ve değişikliği kademeli yayımlayın. Amaç ekip folklorunu yok etmek değil, içindeki teknik sinyali ayıklamaktır.</p>

<p>Sonuçta yazılımcı batıl inançları cehaletten çok belirsizliğin ürünüdür. İyi mühendislik, insanlara “korkmayın” demekle yetinmez; korkunun yerine deney, ölçüm ve geri dönüş planı koyar. Böylece kutsal kod sıradan koda, şaman bilgisi dokümantasyona, gizemli ritüeller de anlaşılır süreçlere dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yazılım kültürü" /><category term="teknik borç" /><category term="antropoloji" /><summary type="html"><![CDATA[Bir yazılım ekibinde yeterince uzun süre kalırsanız şu cümleyi mutlaka duyarsınız: “O satırı silmeyin; neden çalıştığını kimse bilmiyor.” Bu uyarı bazen yorum satırında, bazen ekip sohbetinde, bazen de yıllardır şirkette çalışan bir geliştiricinin ciddi bakışlarında yaşar. Kod artık yalnızca teknik bir yapı değildir; etrafında tabular, ritüeller ve kuşaktan kuşağa aktarılan efsaneler oluşmuştur.]]></summary></entry></feed>