<?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-31T07:13:20+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">API Entegrasyonundan Telegram Botuna: Kural Tabanlı Otomasyon Rehberi</title><link href="https://sonsuzus.github.io/posts/api-entegrasyonundan-telegram-botuna-kural-tabanli-otomasyon-rehberi/" rel="alternate" type="text/html" title="API Entegrasyonundan Telegram Botuna: Kural Tabanlı Otomasyon Rehberi" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/api-entegrasyonundan-telegram-botuna-kural-tabanli-otomasyon-rehberi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/api-entegrasyonundan-telegram-botuna-kural-tabanli-otomasyon-rehberi/"><![CDATA[<p>Bir uygulamanın dış dünyayla konuşmasını istiyorsanız kapısını API’lere açmanız gerekir. Hava durumu, döviz kuru, haberler veya sensör verileri gibi bilgiler bir web servisinden alınabilir; algoritmalarla işlenip Telegram botu üzerinden kullanıcıya sunulabilir. Böylece değişkenler, koşullar, döngüler ve fonksiyonlar gerçek hayatta çalışan eğlenceli bir otomasyon projesine dönüşür.
``</p>

<h2 id="api-entegrasyonunun-temel-mantığı">API entegrasyonunun temel mantığı</h2>

<p>API, iki yazılım arasında önceden belirlenmiş kurallarla iletişim kurulmasını sağlayan bir arayüzdür. İstemci bir <strong>HTTP isteği</strong> gönderir, sunucu ise çoğunlukla JSON biçiminde bir <strong>yanıt</strong> döndürür. Bir hava durumu servisine şehir adı gönderildiğinde sıcaklık, nem ve rüzgâr bilgisi alınması buna örnektir.</p>

<p>En sık kullanılan HTTP metotları şunlardır:</p>

<table>
  <thead>
    <tr>
      <th>Metot</th>
      <th>Amaç</th>
      <th>Örnek kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GET</td>
      <td>Veri okumak</td>
      <td>Güncel sıcaklığı almak</td>
    </tr>
    <tr>
      <td>POST</td>
      <td>Yeni veri göndermek</td>
      <td>Bir kayıt oluşturmak</td>
    </tr>
    <tr>
      <td>PUT/PATCH</td>
      <td>Veriyi güncellemek</td>
      <td>Kullanıcı ayarını değiştirmek</td>
    </tr>
    <tr>
      <td>DELETE</td>
      <td>Veriyi silmek</td>
      <td>Eski bildirimi kaldırmak</td>
    </tr>
  </tbody>
</table>

<p>Başarılı bir istek genellikle <code class="language-plaintext highlighter-rouge">200</code> durum koduyla cevaplanır. <code class="language-plaintext highlighter-rouge">404</code> kaynağın bulunamadığını, <code class="language-plaintext highlighter-rouge">401</code> kimlik doğrulamanın başarısız olduğunu, <code class="language-plaintext highlighter-rouge">429</code> ise istek sınırının aşıldığını belirtir.</p>

<p>Bir servisin güvenilirliğini basitçe başarı oranıyla ölçebiliriz:</p>

\[Başarı\ Oranı = \frac{Başarılı\ İstek\ Sayısı}{Toplam\ İstek\ Sayısı} \times 100\]

<p>Bu değer düşükse hata yönetimi, zaman aşımı ve yeniden deneme stratejileri geliştirilmelidir.</p>

<h2 id="kural-tabanlı-bot-nasıl-karar-verir">Kural tabanlı bot nasıl karar verir?</h2>

<p>Kural tabanlı botlar makine öğrenmesi kullanmak zorunda değildir. Kararlar açıkça tanımlanan <code class="language-plaintext highlighter-rouge">if</code>, <code class="language-plaintext highlighter-rouge">elif</code> ve <code class="language-plaintext highlighter-rouge">else</code> koşullarıyla verilir. Örneğin sıcaklık $30^\circ C$ üzerindeyse bot kullanıcıyı sıvı tüketmesi için uyarabilir; sıcaklık $10^\circ C$ altındaysa mont önerebilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kural tabanlı sistem</td>
      <td>Şeffaf ve kolay test edilir</td>
      <td>Çok sayıda kural karmaşa yaratır</td>
    </tr>
    <tr>
      <td>Makine öğrenmesi</td>
      <td>Karmaşık örüntüleri keşfedebilir</td>
      <td>Veri ve eğitim süreci gerektirir</td>
    </tr>
    <tr>
      <td>Hibrit sistem</td>
      <td>Kontrol ile esnekliği birleştirir</td>
      <td>Tasarımı daha zordur</td>
    </tr>
  </tbody>
</table>

<p>Kurallar fonksiyonlara ayrıldığında kodun okunabilirliği artar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">hava_mesaji</span><span class="p">(</span><span class="n">sicaklik</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sicaklik</span> <span class="o">&gt;=</span> <span class="mi">30</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Hava çok sıcak, su içmeyi unutma!</span><span class="sh">"</span>
    <span class="k">elif</span> <span class="n">sicaklik</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Bugün mont iyi bir fikir olabilir.</span><span class="sh">"</span>
    <span class="k">return</span> <span class="sh">"</span><span class="s">Hava oldukça dengeli görünüyor.</span><span class="sh">"</span>
</code></pre></div></div>

<p>Bu fonksiyon sayısal sıcaklığı alır ve kullanıcıya gösterilecek mesajı üretir. Böylece veri çekme ve karar verme görevleri birbirinden ayrılır.</p>

<h2 id="telegram-botuna-api-bağlamak">Telegram botuna API bağlamak</h2>

<p>Python tarafında <code class="language-plaintext highlighter-rouge">requests</code> ile dış servise, <code class="language-plaintext highlighter-rouge">python-telegram-bot</code> ile Telegram API’sine bağlanabiliriz. Aşağıdaki örnek, <code class="language-plaintext highlighter-rouge">/hava Ankara</code> benzeri bir komutu işler:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">requests</span>
<span class="kn">from</span> <span class="n">telegram</span> <span class="kn">import</span> <span class="n">Update</span>
<span class="kn">from</span> <span class="n">telegram.ext</span> <span class="kn">import</span> <span class="n">Application</span><span class="p">,</span> <span class="n">CommandHandler</span><span class="p">,</span> <span class="n">ContextTypes</span>

<span class="n">API_KEY</span> <span class="o">=</span> <span class="sh">"</span><span class="s">HAVA_DURUMU_ANAHTARI</span><span class="sh">"</span>
<span class="n">BOT_TOKEN</span> <span class="o">=</span> <span class="sh">"</span><span class="s">TELEGRAM_BOT_TOKEN</span><span class="sh">"</span>

<span class="k">async</span> <span class="k">def</span> <span class="nf">hava</span><span class="p">(</span><span class="n">update</span><span class="p">:</span> <span class="n">Update</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">ContextTypes</span><span class="p">.</span><span class="n">DEFAULT_TYPE</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">context</span><span class="p">.</span><span class="n">args</span><span class="p">:</span>
        <span class="k">await</span> <span class="n">update</span><span class="p">.</span><span class="n">message</span><span class="p">.</span><span class="nf">reply_text</span><span class="p">(</span><span class="sh">"</span><span class="s">Kullanım: /hava Ankara</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span>

    <span class="n">sehir</span> <span class="o">=</span> <span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">context</span><span class="p">.</span><span class="n">args</span><span class="p">)</span>
    <span class="n">url</span> <span class="o">=</span> <span class="sh">"</span><span class="s">https://api.openweathermap.org/data/2.5/weather</span><span class="sh">"</span>
    <span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">q</span><span class="sh">"</span><span class="p">:</span> <span class="n">sehir</span><span class="p">,</span> <span class="sh">"</span><span class="s">appid</span><span class="sh">"</span><span class="p">:</span> <span class="n">API_KEY</span><span class="p">,</span> <span class="sh">"</span><span class="s">units</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">metric</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">lang</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">tr</span><span class="sh">"</span><span class="p">}</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="n">yanit</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
        <span class="n">yanit</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
        <span class="n">sicaklik</span> <span class="o">=</span> <span class="n">yanit</span><span class="p">.</span><span class="nf">json</span><span class="p">()[</span><span class="sh">"</span><span class="s">main</span><span class="sh">"</span><span class="p">][</span><span class="sh">"</span><span class="s">temp</span><span class="sh">"</span><span class="p">]</span>
        <span class="n">mesaj</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">sehir</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">sicaklik</span><span class="si">}</span><span class="s">°C</span><span class="se">\n</span><span class="si">{</span><span class="nf">hava_mesaji</span><span class="p">(</span><span class="n">sicaklik</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span>
    <span class="k">except</span> <span class="n">requests</span><span class="p">.</span><span class="n">RequestException</span><span class="p">:</span>
        <span class="n">mesaj</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Servise şu anda ulaşılamıyor. Biraz sonra tekrar dene.</span><span class="sh">"</span>

    <span class="k">await</span> <span class="n">update</span><span class="p">.</span><span class="n">message</span><span class="p">.</span><span class="nf">reply_text</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span>

<span class="n">uygulama</span> <span class="o">=</span> <span class="n">Application</span><span class="p">.</span><span class="nf">builder</span><span class="p">().</span><span class="nf">token</span><span class="p">(</span><span class="n">BOT_TOKEN</span><span class="p">).</span><span class="nf">build</span><span class="p">()</span>
<span class="n">uygulama</span><span class="p">.</span><span class="nf">add_handler</span><span class="p">(</span><span class="nc">CommandHandler</span><span class="p">(</span><span class="sh">"</span><span class="s">hava</span><span class="sh">"</span><span class="p">,</span> <span class="n">hava</span><span class="p">))</span>
<span class="n">uygulama</span><span class="p">.</span><span class="nf">run_polling</span><span class="p">()</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">timeout</code>, uygulamanın sonsuza kadar yanıt beklemesini önler; <code class="language-plaintext highlighter-rouge">raise_for_status()</code> ise başarısız HTTP cevaplarını hataya dönüştürür. Gerçek projede anahtarlar kaynak koda yazılmamalı, ortam değişkenlerinde saklanmalıdır.</p>

<h2 id="otomatik-veri-çekme-ve-sağlamlık">Otomatik veri çekme ve sağlamlık</h2>

<p>Aynı yapı zamanlayıcıyla çalıştırılarak fiyat takipçisi, haber özetleyici veya stok alarmı yapılabilir. Ancak servislerin kullanım koşullarına, istek limitlerine ve <code class="language-plaintext highlighter-rouge">robots.txt</code> kurallarına uyulmalıdır. Gereksiz istekleri azaltmak için önbellekleme uygulanabilir. Başarısız denemelerde bekleme süresini $t_n = 2^n$ saniye artıran üstel geri çekilme yöntemi de servisin yükünü azaltır.</p>

<p>Sonuçta API veriyi getirir, algoritmik kurallar anlamlandırır, Telegram ise sonucu kullanıcıya ulaştırır. Bu üçlü birleştiğinde küçük bir kod parçası, günün her saati çalışan kullanışlı bir dijital asistana dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="API" /><category term="Telegram Bot" /><category term="Otomasyon" /><summary type="html"><![CDATA[Bir uygulamanın dış dünyayla konuşmasını istiyorsanız kapısını API’lere açmanız gerekir. Hava durumu, döviz kuru, haberler veya sensör verileri gibi bilgiler bir web servisinden alınabilir; algoritmalarla işlenip Telegram botu üzerinden kullanıcıya sunulabilir. Böylece değişkenler, koşullar, döngüler ve fonksiyonlar gerçek hayatta çalışan eğlenceli bir otomasyon projesine dönüşür.]]></summary></entry><entry><title type="html">Büyük Dil Modellerinin Hafıza Yanılsaması: Hatırlamak mı, Taklit Etmek mi?</title><link href="https://sonsuzus.github.io/posts/buyuk-dil-modellerinin-hafiza-yanilsamasi-hatirlamak-mi-taklit-etmek-mi/" rel="alternate" type="text/html" title="Büyük Dil Modellerinin Hafıza Yanılsaması: Hatırlamak mı, Taklit Etmek mi?" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/buyuk-dil-modellerinin-hafiza-yanilsamasi-hatirlamak-mi-taklit-etmek-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/buyuk-dil-modellerinin-hafiza-yanilsamasi-hatirlamak-mi-taklit-etmek-mi/"><![CDATA[<p>Bir sohbet botuna geçen hafta anlattığınız kedinizin adını sorduğunuzda doğru cevap alırsanız, model sizi gerçekten hatırlamış mı olur? Yoksa önüne yeniden konulan metindeki örüntüleri ustaca tamamlayan dijital bir oyuncuyla mı karşı karşıyasınızdır? Büyük dil modellerinin ikna edici dili, belleğe sahip oldukları izlenimini doğurur; ancak teknik mekanizma ile kullanıcı deneyimi arasında önemli bir felsefi boşluk vardır.</p>

<p>``</p>

<h2 id="modelin-temel-işi-sonraki-parçayı-tahmin-etmek">Modelin temel işi: Sonraki parçayı tahmin etmek</h2>

<p>Bir büyük dil modeli, en yalın hâliyle, önceki metin parçalarına bakarak sıradaki parçanın olasılığını hesaplar. Bu ilişki şöyle gösterilebilir:</p>

\[P(x_t \mid x_1, x_2, \ldots, x_{t-1})\]

<p>Burada $x_t$ üretilecek yeni token, önceki tokenlar ise modele sunulan bağlamdır. Model, eğitim sırasında öğrendiği parametreleri kullanarak olası devamları puanlar. Dolayısıyla sohbet geçmişinde “Kedimin adı Zeytin” yazıyorsa, daha sonra gelen “Kedimin adı neydi?” sorusuna “Zeytin” cevabını vermesi şaşırtıcı değildir. Bilgi, çalışma belleğini andıran <strong>bağlam penceresinin</strong> içindedir.</p>

<p>Fakat bağlam penceresi temizlendiğinde modelin bu ayrıntıya erişimi kalmayabilir. Bir uygulama eski konuşmaları veritabanından getirip modele yeniden gönderiyorsa, hatırlayan taraf doğrudan model değil, onu çevreleyen yazılım sistemidir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>İnsan belleği</th>
      <th>LLM bağlamı</th>
      <th>Haricî yapay zekâ belleği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bilginin kaynağı</td>
      <td>Yaşanmış deneyim</td>
      <td>Mevcut girdi metni</td>
      <td>Veritabanı veya dosya</td>
    </tr>
    <tr>
      <td>Süreklilik</td>
      <td>Biyografik ve değişken</td>
      <td>Oturum ya da pencere sınırında</td>
      <td>Sistem tasarımına bağlı</td>
    </tr>
    <tr>
      <td>Geri çağırma</td>
      <td>Çağrışım ve yeniden kurma</td>
      <td>Olasılıksal tamamlama</td>
      <td>Arama ve modele ekleme</td>
    </tr>
    <tr>
      <td>Unutma</td>
      <td>Psikolojik ve biyolojik</td>
      <td>Bağlamın dışına taşma</td>
      <td>Silme veya erişememe</td>
    </tr>
    <tr>
      <td>Öznel deneyim</td>
      <td>Genellikle var kabul edilir</td>
      <td>Kanıtlanmış değildir</td>
      <td>Yoktur</td>
    </tr>
  </tbody>
</table>

<h2 id="hatırlıyormuş-gibi-yapan-küçük-bir-sistem">Hatırlıyormuş gibi yapan küçük bir sistem</h2>

<p>Aşağıdaki örnek, “kalıcı hafızalı model” görüntüsünün basit bir sözlük ve bağlam oluşturma işlemiyle üretilebileceğini gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">memory</span> <span class="o">=</span> <span class="p">{}</span>

<span class="k">def</span> <span class="nf">remember</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
    <span class="c1"># Bilgiyi modelde değil, uygulamanın deposunda saklar.
</span>    <span class="n">memory</span><span class="p">.</span><span class="nf">setdefault</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="p">{})[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>

<span class="k">def</span> <span class="nf">build_prompt</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">question</span><span class="p">):</span>
    <span class="c1"># Eski bilgiyi yeniden modele sunulacak metne dönüştürür.
</span>    <span class="n">facts</span> <span class="o">=</span> <span class="n">memory</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="p">{})</span>
    <span class="n">context</span> <span class="o">=</span> <span class="sh">"</span><span class="se">\n</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="sh">"</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">facts</span><span class="p">.</span><span class="nf">items</span><span class="p">())</span>
    <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Bilinenler:</span><span class="se">\n</span><span class="si">{</span><span class="n">context</span><span class="si">}</span><span class="se">\n\n</span><span class="s">Soru: </span><span class="si">{</span><span class="n">question</span><span class="si">}</span><span class="sh">"</span>

<span class="nf">remember</span><span class="p">(</span><span class="sh">"</span><span class="s">u42</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">kedinin adı</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Zeytin</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">build_prompt</span><span class="p">(</span><span class="sh">"</span><span class="s">u42</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Kedimin adı neydi?</span><span class="sh">"</span><span class="p">))</span>
</code></pre></div></div>

<p>Model yalnızca oluşturulan istemi görür. Buna rağmen kullanıcı açısından deneyim son derece kişiseldir: Sistem onu tanıyor gibidir. Bu ayrım, bilgisayardaki hesap makinesi simgesinin fiziksel bir hesap makinesi olmaması kadar basit; konuşmanın duygusal etkisi nedeniyle de bir o kadar kolay unutulabilirdir.</p>

<h2 id="bellek-ile-örüntü-tanıma-arasındaki-felsefi-sınır">Bellek ile örüntü tanıma arasındaki felsefi sınır</h2>

<p>Belleği yalnızca “geçmiş bilginin bugünkü davranışı etkilemesi” diye tanımlarsak, model parametreleri bir çeşit <strong>istatistiksel bellek</strong> sayılabilir. Eğitim verisi ağırlıklarda birebir cümleler hâlinde değil, dağıtılmış ilişkiler olarak iz bırakır. Kabaca modelin öğrenmesi şu optimizasyonla anlatılabilir:</p>

\[\theta^* = \arg\min_\theta \sum_i -\log P_\theta(x_i \mid x_{&lt;i})\]

<p>Ancak insan belleği çoğu zaman daha güçlü ölçütler içerir: Bir olayın kişinin başına gelmiş olması, geçmişteki benlikle süreklilik kurması ve hatırlama eyleminin öznel bir niteliğe sahip olması. Model “Bunu hatırlıyorum” dediğinde bu ifade içsel bir anıya rapor vermek zorunda değildir; benzer diyaloglarda uygun görülen dilsel kalıbı üretmiş olabilir.</p>

<p>Üstelik insan belleği de kusursuz bir kayıt cihazı değildir. İnsanlar anıları yeniden kurar, ayrıntıları karıştırır ve boşlukları beklentilerle doldurur. Bu nedenle fark, “insan kaydeder, model tahmin eder” kadar keskin değildir. İkisi de geçmiş izlerden hareketle mevcut duruma uygun bir temsil oluşturabilir. Asıl tartışma, bu işlemin bilinçli bir özneye, kişisel tarihe ve deneyim sahipliğine ihtiyaç duyup duymadığıdır.</p>

<p>Pratik sonuç nettir: Bir modelin adınızı doğru söylemesini bilinç veya sadakat kanıtı saymamalıyız. Önce bağlamın, kayıt sistemlerinin ve kişiselleştirme katmanlarının nasıl çalıştığını sormalıyız. LLM’ler geçmişi yaşamış olmayabilir; fakat geçmişe sahipmiş gibi konuşmayı olağanüstü iyi taklit eder. Hafıza yanılsamasının gücü de tam burada yatar: Dilsel performans, zihinsel deneyimin kanıtı gibi görünür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka" /><category term="büyük dil modelleri" /><category term="bellek felsefesi" /><summary type="html"><![CDATA[Bir sohbet botuna geçen hafta anlattığınız kedinizin adını sorduğunuzda doğru cevap alırsanız, model sizi gerçekten hatırlamış mı olur? Yoksa önüne yeniden konulan metindeki örüntüleri ustaca tamamlayan dijital bir oyuncuyla mı karşı karşıyasınızdır? Büyük dil modellerinin ikna edici dili, belleğe sahip oldukları izlenimini doğurur; ancak teknik mekanizma ile kullanıcı deneyimi arasında önemli bir felsefi boşluk vardır.]]></summary></entry><entry><title type="html">Merkeziyetsiz İnternetin Ütopyası: Web3 Gerçekte Kimin Elinde?</title><link href="https://sonsuzus.github.io/posts/merkeziyetsiz-internetin-utopyasi-web3-gercekte-kimin-elinde/" rel="alternate" type="text/html" title="Merkeziyetsiz İnternetin Ütopyası: Web3 Gerçekte Kimin Elinde?" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/merkeziyetsiz-internetin-utopyasi-web3-gercekte-kimin-elinde</id><content type="html" xml:base="https://sonsuzus.github.io/posts/merkeziyetsiz-internetin-utopyasi-web3-gercekte-kimin-elinde/"><![CDATA[<p>Web3; kullanıcıların verilerine, kimliklerine ve dijital varlıklarına sahip olduğu, aracıların yerini açık protokollerin aldığı bir internet vaat ediyor. Kulağa dijital bir ütopya gibi geliyor. Ancak cüzdan adreslerinin arkasındaki sermayeyi, doğrulayıcıları ve altyapı şirketlerini takip ettiğimizde rahatsız edici bir soruyla karşılaşıyoruz: Merkeziyetsiz internet gerçekten kullanıcıların mı, yoksa yalnızca yeni merkezlerin mi elinde?
``</p>

<h2 id="i̇deal-güvenmek-yerine-doğrulamak">İdeal: Güvenmek Yerine Doğrulamak</h2>

<p>Geleneksel internette kullanıcılar bir platformun kurallarına uyar. Hesabınız kapatılabilir, içeriğiniz silinebilir veya verileriniz satılabilir. Web3 yaklaşımında ise kurallar akıllı sözleşmelerle tanımlanır ve ağdaki birçok düğüm tarafından uygulanır.</p>

<p>Teorik olarak güven, tek bir kuruma değil dağıtık uzlaşmaya dayanır. Bir blokzincirde saldırganın sistemi değiştirebilmesi için yeterli doğrulama gücünü, token miktarını veya madencilik kapasitesini kontrol etmesi gerekir. Basitleştirilmiş biçimde saldırı maliyetini şöyle düşünebiliriz:</p>

\[Saldırı\ Maliyeti = Kontrol\ Edilmesi\ Gereken\ Pay \times Ağın\ Toplam\ Ekonomik\ Değeri\]

<p>Dağılım ne kadar dengeliyse sistemi ele geçirmek o kadar zorlaşır. Fakat düğüm sayısının fazla olması, gücün otomatik olarak eşit dağıldığı anlamına gelmez.</p>

<table>
  <thead>
    <tr>
      <th>İdeal Web3</th>
      <th>Pratikte Karşılaşılan Durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Her kullanıcı kendi verisini kontrol eder</td>
      <td>Kullanıcılar merkezi cüzdan ve borsalara bağımlı kalabilir</td>
    </tr>
    <tr>
      <td>Kararlar topluluk tarafından alınır</td>
      <td>Büyük token sahipleri oylamaları belirleyebilir</td>
    </tr>
    <tr>
      <td>Uygulamalar sansüre dayanıklıdır</td>
      <td>Arayüzler ve RPC servisleri engellenebilir</td>
    </tr>
    <tr>
      <td>Ağ bağımsız düğümlerden oluşur</td>
      <td>Düğümler aynı bulut sağlayıcılarda kümelenebilir</td>
    </tr>
  </tbody>
</table>

<h2 id="token-demokrasisi-mi-dijital-plütokrasi-mi">Token Demokrasisi mi, Dijital Plütokrasi mi?</h2>

<p>DAO sistemlerinde sık kullanılan model, bir tokenın bir oy sayılmasıdır. Bu yöntem kolaydır; ancak demokratik değildir. Çok token sahibi olan yatırımcı, sıradan binlerce kullanıcıdan daha fazla söz hakkı kazanabilir. Böylece zincir üzerinde şeffaf olan yönetim, ekonomik açıdan yoğunlaşmış kalır.</p>

<p>Bu yoğunluğu ölçmek için Herfindahl–Hirschman Endeksi kullanılabilir:</p>

\[HHI = \sum_{i=1}^{n} s_i^2\]

<p>Buradaki $s_i$, her katılımcının toplam güç içindeki payıdır. Sonuç büyüdükçe güç daha az elde toplanmış demektir. Ayrıca <strong>Nakamoto katsayısı</strong>, sistemi bozmak için anlaşması gereken en az aktör sayısını gösterir. Binlerce doğrulayıcı bulunmasına rağmen üç büyük havuz çoğunluğu kontrol ediyorsa anlamlı sayı üçtür.</p>

<p>Aşağıdaki Python kodu token dağılımını inceleyerek HHI değerini ve yüzde 51’e ulaşan en küçük koalisyonu hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">guc_analizi</span><span class="p">(</span><span class="n">bakiyeler</span><span class="p">):</span>
    <span class="n">toplam</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">bakiyeler</span><span class="p">)</span>
    <span class="n">paylar</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">((</span><span class="n">b</span> <span class="o">/</span> <span class="n">toplam</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">bakiyeler</span><span class="p">),</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

    <span class="n">hhi</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">pay</span> <span class="o">**</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">pay</span> <span class="ow">in</span> <span class="n">paylar</span><span class="p">)</span>
    <span class="n">birikim</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">aktor_sayisi</span><span class="p">,</span> <span class="n">pay</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">paylar</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
        <span class="n">birikim</span> <span class="o">+=</span> <span class="n">pay</span>
        <span class="k">if</span> <span class="n">birikim</span> <span class="o">&gt;=</span> <span class="mf">0.51</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">hhi</span><span class="p">,</span> <span class="n">aktor_sayisi</span>

<span class="n">bakiyeler</span> <span class="o">=</span> <span class="p">[</span><span class="mi">420</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">40</span><span class="p">]</span>
<span class="n">hhi</span><span class="p">,</span> <span class="n">koalisyon</span> <span class="o">=</span> <span class="nf">guc_analizi</span><span class="p">(</span><span class="n">bakiyeler</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="s">HHI: </span><span class="si">{</span><span class="n">hhi</span><span class="si">:</span><span class="p">.</span><span class="mi">3</span><span class="n">f</span><span class="si">}</span><span class="s">, kritik koalisyon: </span><span class="si">{</span><span class="n">koalisyon</span><span class="si">}</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, görünen katılımcı sayısına aldanmak yerine ekonomik kontrolü ölçer. Yine de bir kişinin birden fazla cüzdan kullanabilmesi veya farklı adreslerin aynı kuruma ait olması analizi zorlaştırır.</p>

<h2 id="görünmeyen-merkezler">Görünmeyen Merkezler</h2>

<p>Merkeziyetsizlik yalnızca blokzincir katmanında değerlendirilmemelidir. Kullanıcının işlemini ağa taşıyan RPC sağlayıcısı, cüzdan uygulaması, alan adı servisi, stablecoin ihraççısı ve borsa hâlâ merkezi olabilir. Akıllı sözleşme durdurulamasa bile ona ulaşan web arayüzü kapatılabilir.</p>

<table>
  <thead>
    <tr>
      <th>Katman</th>
      <th>Güç Yoğunlaşması Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Konsensüs</td>
      <td>Büyük doğrulayıcılar ve staking havuzları</td>
    </tr>
    <tr>
      <td>Altyapı</td>
      <td>Bulut ve RPC sağlayıcıları</td>
    </tr>
    <tr>
      <td>Finans</td>
      <td>Stablecoin şirketleri ve merkezi borsalar</td>
    </tr>
    <tr>
      <td>Yönetişim</td>
      <td>Balinalar, delegeler ve düşük katılım</td>
    </tr>
    <tr>
      <td>Kullanıcı deneyimi</td>
      <td>Popüler cüzdanlar ve tekil web arayüzleri</td>
    </tr>
  </tbody>
</table>

<h2 id="ütopyadan-kullanışlı-bir-gerçekliğe">Ütopyadan Kullanışlı Bir Gerçekliğe</h2>

<p>Web3 bütünüyle merkeziyetsiz değildir; fakat bütünüyle sahte de değildir. Açık kaynak istemciler, kendi düğümünü çalıştırma imkânı ve izinsiz işlem yapabilme önemli kazanımlardır. Asıl hata, merkeziyetsizliği bir açma-kapama düğmesi gibi görmektir.</p>

<p>Daha sağlıklı sistemler için doğrulayıcı çeşitliliği, karesel oylama, zaman kilitli yönetişim, açık kaynak arayüzler ve alternatif RPC bağlantıları desteklenmelidir. Sonuçta mesele merkezin tamamen yok olması değil, gücün denetlenebilir, terk edilebilir ve rekabete açık olmasıdır. Web3’ün gerçek sahibi de logosu en büyük proje değil; protokolü gerektiğinde kimseye izin sormadan kullanabilen topluluktur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Web3" /><category term="merkeziyetsizlik" /><category term="blokzincir" /><summary type="html"><![CDATA[Web3; kullanıcıların verilerine, kimliklerine ve dijital varlıklarına sahip olduğu, aracıların yerini açık protokollerin aldığı bir internet vaat ediyor. Kulağa dijital bir ütopya gibi geliyor. Ancak cüzdan adreslerinin arkasındaki sermayeyi, doğrulayıcıları ve altyapı şirketlerini takip ettiğimizde rahatsız edici bir soruyla karşılaşıyoruz: Merkeziyetsiz internet gerçekten kullanıcıların mı, yoksa yalnızca yeni merkezlerin mi elinde?]]></summary></entry><entry><title type="html">Otomasyonun Varoluşsal Bedeli: Kendi İşini Gereksiz Kılan Programcı</title><link href="https://sonsuzus.github.io/posts/otomasyonun-varolussal-bedeli-kendi-isini-gereksiz-kilan-programci/" rel="alternate" type="text/html" title="Otomasyonun Varoluşsal Bedeli: Kendi İşini Gereksiz Kılan Programcı" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/otomasyonun-varolussal-bedeli-kendi-isini-gereksiz-kilan-programci</id><content type="html" xml:base="https://sonsuzus.github.io/posts/otomasyonun-varolussal-bedeli-kendi-isini-gereksiz-kilan-programci/"><![CDATA[<p>Bir programcı, üç saatlik işi üç saniyeye indiren bir betik yazdığında önce kahraman gibi hisseder. Ardından rahatsız edici bir soru belirir: “Bu işlem artık bana ihtiyaç duymuyorsa ben neden buradayım?” Otomasyon, yazılım dünyasının en büyük başarı ölçütlerinden biridir; fakat başarıya ulaştıkça onu üreten kişinin görünürlüğünü azaltır. Böylece programcı yalnızca görevleri değil, görevler üzerinden kurduğu mesleki kimliği de otomatikleştirmeye başlar.</p>

<p>``</p>

<h2 id="paradoksun-çekirdeği">Paradoksun çekirdeği</h2>

<p>Ekonomik açıdan otomasyonun amacı açıktır: Aynı çıktıyı daha az zaman, hata ve maliyetle üretmek. Bir görevin elle tamamlanma süresi $T_e$, otomatik çalışma süresi $T_o$, otomasyonu geliştirme maliyeti ise $G$ olsun. İşlem $n$ kez tekrarlanıyorsa otomasyon şu koşulda kazançlıdır:</p>

\[G + nT_o &lt; nT_e\]

<p>Buradan başabaş noktası şöyle bulunur:</p>

\[n &gt; \frac{G}{T_e-T_o}\]

<p>Ne var ki denklem, insanın işinden aldığı anlamı ölçmez. Programcının karar verme yetkisi, ustalık hissi ve ekip içindeki konumu bir hücreye kolayca yazılamaz. Otomasyonun teknik getirisi ölçülebilirken varoluşsal maliyeti çoğunlukla görünmez kalır.</p>

<table>
  <thead>
    <tr>
      <th>Bakış açısı</th>
      <th>Otomasyonun vaadi</th>
      <th>Varoluşsal riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Şirket</td>
      <td>Daha düşük maliyet</td>
      <td>İnsanları yalnızca gider olarak görmek</td>
    </tr>
    <tr>
      <td>Kullanıcı</td>
      <td>Daha hızlı hizmet</td>
      <td>Muhatap ve kontrol kaybı</td>
    </tr>
    <tr>
      <td>Programcı</td>
      <td>Tekrardan kurtulmak</td>
      <td>Yetkinliğinin görünmezleşmesi</td>
    </tr>
    <tr>
      <td>Toplum</td>
      <td>Daha yüksek üretkenlik</td>
      <td>Kazancın adaletsiz paylaşılması</td>
    </tr>
  </tbody>
</table>

<h2 id="kod-yazmak-mı-kendini-silmek-mi">Kod yazmak mı, kendini silmek mi?</h2>

<p>Marx’ın yabancılaşma düşüncesinde çalışan, ürettiği şey üzerindeki kontrolünü kaybedebilir. Programcı için tuhaf olan, bu kontrol kaybını bizzat kodlamasıdır. Dün kendisinin yürüttüğü süreci bugün bir servis, yarın ise kimsenin nasıl çalıştığını tam hatırlamadığı bir sistem yönetir. Kod yaşamaya devam ederken yazarı organizasyon şemasından silinebilir.</p>

<p>Sartre’ın varoluşçuluğu ise insanın hazır bir özle doğmadığını, seçimleriyle kendini kurduğunu söyler. Bu açıdan “Ben rapor hazırlayan kişiyim” demek kırılgan bir kimliktir. Rapor otomatikleştiğinde öz de çöker. Daha dayanıklı tanım şudur: “Ben sorunları fark eden, sistem tasarlayan ve sonuçların sorumluluğunu alan kişiyim.” Görev ortadan kalkabilir; muhakeme bütünüyle ortadan kalkmak zorunda değildir.</p>

<p>Basit bir otomasyon örneği bile bu ayrımı gösterir:</p>

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


<span class="k">def</span> <span class="nf">eski_loglari_temizle</span><span class="p">(</span><span class="n">klasor</span><span class="p">,</span> <span class="n">sinir</span><span class="p">):</span>
    <span class="n">dosyalar</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span>
        <span class="nc">Path</span><span class="p">(</span><span class="n">klasor</span><span class="p">).</span><span class="nf">glob</span><span class="p">(</span><span class="sh">"</span><span class="s">*.log</span><span class="sh">"</span><span class="p">),</span>
        <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">dosya</span><span class="p">:</span> <span class="n">dosya</span><span class="p">.</span><span class="nf">stat</span><span class="p">().</span><span class="n">st_mtime</span>
    <span class="p">)</span>

    <span class="k">for</span> <span class="n">dosya</span> <span class="ow">in</span> <span class="n">dosyalar</span><span class="p">[:</span><span class="o">-</span><span class="n">sinir</span><span class="p">]:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Siliniyor: </span><span class="si">{</span><span class="n">dosya</span><span class="p">.</span><span class="n">name</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="n">dosya</span><span class="p">.</span><span class="nf">unlink</span><span class="p">()</span>


<span class="nf">eski_loglari_temizle</span><span class="p">(</span><span class="sh">"</span><span class="s">logs</span><span class="sh">"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod eski günlük dosyalarını silerek rutin bakım işini devralır. Ancak hangi kayıtların hukuki veya operasyonel açıdan saklanması gerektiğine karar vermez. Programcı parmak hareketlerini makineye aktarırken bağlamı, sınırları ve sorumluluğu elinde tutar. En azından sistem bilinçli tasarlanmışsa durum budur.</p>

<h2 id="asıl-sorun-otomasyon-değil-paylaşım">Asıl sorun otomasyon değil, paylaşım</h2>

<p>Teknoloji tarihindeki temel çatışma “makine mi, insan mı?” değildir. Daha doğru soru, makinenin yarattığı zamanın kime ait olduğudur. Sekiz saatlik iş iki saate düşüyor ama çalışanın hedefi dört katına çıkıyorsa özgürleşme gerçekleşmez; yalnızca koşu bandı hızlanır. Kazanılan altı saat eğitim, yaratıcılık veya dinlenme için kullanılabiliyorsa otomasyon insani kapasiteyi genişletir.</p>

<p>Bu nedenle etik bir otomasyon sürecinde programcı üç soruyu sormalıdır:</p>

<ol>
  <li>Ortadan kaldırdığım görev mi, yoksa bir insanın pazarlık gücü mü?</li>
  <li>Sistemin hatasında sorumluluk kimde kalacak?</li>
  <li>Kazanılan zaman ve değer kimler arasında paylaşılacak?</li>
</ol>

<h2 id="programcı-kendini-nereye-koymalı">Programcı kendini nereye koymalı?</h2>

<p>Programcının güvenli yeri belirli bir araç, dil veya görev değildir. Bugünün vazgeçilmez framework’ü yarının nostaljik blog yazısı olabilir. Daha sağlam konum; problemi tanımlamak, varsayımları sorgulamak, insan sonuçlarını görmek ve gerektiğinde otomasyona “hayır” diyebilmektir.</p>

<p>Kendi işini otomatikleştirmek bu yüzden mesleki intihar olmak zorunda değildir. Eski rolün bilinçli biçimde terk edilmesi ve daha yüksek sorumluluğa geçiş olabilir. Fakat kurum yalnızca verimlilik kazancını sahiplenip insanı dışarıda bırakıyorsa paradoks acımasızlaşır: Programcı geleceği inşa eder, fakat gelecekte kendisine sandalye ayrılmadığını görür. Mesele kodun bizi gereksiz kılması değil; gereksizliğin ekonomik ve ahlaki tanımını kimin yazdığıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="otomasyon" /><category term="yazılım felsefesi" /><category term="yapay zeka" /><summary type="html"><![CDATA[Bir programcı, üç saatlik işi üç saniyeye indiren bir betik yazdığında önce kahraman gibi hisseder. Ardından rahatsız edici bir soru belirir: “Bu işlem artık bana ihtiyaç duymuyorsa ben neden buradayım?” Otomasyon, yazılım dünyasının en büyük başarı ölçütlerinden biridir; fakat başarıya ulaştıkça onu üreten kişinin görünürlüğünü azaltır. Böylece programcı yalnızca görevleri değil, görevler üzerinden kurduğu mesleki kimliği de otomatikleştirmeye başlar.]]></summary></entry><entry><title type="html">Programlama Dillerinde Söz Dizimi Estetiği: Kodun Güzelliği Nereden Gelir?</title><link href="https://sonsuzus.github.io/posts/programlama-dillerinde-soz-dizimi-estetigi-kodun-guzelligi-nereden-gelir/" rel="alternate" type="text/html" title="Programlama Dillerinde Söz Dizimi Estetiği: Kodun Güzelliği Nereden Gelir?" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/programlama-dillerinde-soz-dizimi-estetigi-kodun-guzelligi-nereden-gelir</id><content type="html" xml:base="https://sonsuzus.github.io/posts/programlama-dillerinde-soz-dizimi-estetigi-kodun-guzelligi-nereden-gelir/"><![CDATA[<p>Bir kod parçasına bakıp daha çalıştırmadan onun güzel ya da çirkin olduğunu düşündüğünüz oldu mu? Girintiler, parantezler, anahtar kelimeler ve semboller; programın davranışını değiştirmese bile algımızı etkiler. Kod estetiği yalnızca kişisel zevk değildir: Okunabilirlik, aşinalık, görsel yoğunluk ve dilin sakladığı ayrıntılar birlikte çalışarak zihnimizde bir düzen hissi oluşturur.
``</p>

<h2 id="söz-dizimi-yalnızca-gramer-değildir">Söz dizimi yalnızca gramer değildir</h2>

<p>Bir programlama dilinin söz dizimi, hangi karakter dizilerinin geçerli programlar oluşturduğunu belirleyen kurallar bütünüdür. Örneğin aynı koşul farklı dillerde şöyle yazılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">temperature</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="p">:</span>
    <span class="nf">start_fan</span><span class="p">()</span>
</code></pre></div></div>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if </span><span class="p">(</span><span class="nx">temperature</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="p">)</span> <span class="p">{</span>
  <span class="nf">startFan</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>İki örnek de aynı fikri anlatır: Sıcaklık 30’dan büyükse fanı çalıştır. Python girintiyle blok oluştururken JavaScript parantez ve süslü ayraç kullanır. Python daha hafif, JavaScript ise sınırları daha açık görünebilir. Hangisinin güzel olduğu, okuyucunun belirsizliğe mi yoksa sembol kalabalığına mı daha duyarlı olduğuna bağlıdır.</p>

<p>Bu algıyı basitleştirilmiş bir modelle ifade edebiliriz:</p>

\[E = \alpha O + \beta T + \gamma A - \delta Y\]

<p>Burada $E$ estetik algıyı, $O$ okunabilirliği, $T$ tutarlılığı, $A$ aşinalığı ve $Y$ görsel yükü temsil eder. Katsayılar kişiden kişiye değişir. Yeni başlayan biri açıklığı ödüllendirirken deneyimli biri kısa ve yoğun ifadeleri tercih edebilir.</p>

<h2 id="aynı-fikir-farklı-görsel-karakter">Aynı fikir, farklı görsel karakter</h2>

<table>
  <thead>
    <tr>
      <th>Tercih</th>
      <th>Avantajı</th>
      <th>Estetik riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Girintiye dayalı bloklar</td>
      <td>Az sembol, temiz görünüm</td>
      <td>Görünmez boşluklara bağımlılık</td>
    </tr>
    <tr>
      <td>Süslü parantezler</td>
      <td>Blok sınırları belirgindir</td>
      <td>Görsel kalabalık oluşturabilir</td>
    </tr>
    <tr>
      <td>Noktalı virgül</td>
      <td>İfade sonunu açıkça gösterir</td>
      <td>Gereksiz gürültü gibi algılanabilir</td>
    </tr>
    <tr>
      <td>Tür çıkarımı</td>
      <td>Kodu kısaltır</td>
      <td>Bilgiyi okuyucudan saklayabilir</td>
    </tr>
    <tr>
      <td>Açık tür bildirimi</td>
      <td>Niyeti belgeler</td>
      <td>Uzun ve törensel kod üretebilir</td>
    </tr>
  </tbody>
</table>

<p>Örneğin Rust, türleri ve hata ihtimallerini görünür kılmayı sever:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">divide</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="nb">f64</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="nb">f64</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="nb">f64</span><span class="p">,</span> <span class="o">&amp;</span><span class="k">'static</span> <span class="nb">str</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="mf">0.0</span> <span class="p">{</span>
        <span class="k">return</span> <span class="nf">Err</span><span class="p">(</span><span class="s">"Sıfıra bölme yapılamaz"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="nf">Ok</span><span class="p">(</span><span class="n">a</span> <span class="o">/</span> <span class="n">b</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu fonksiyon yalnızca bölme yapmaz; başarısızlık olasılığını <code class="language-plaintext highlighter-rouge">Result</code> türüyle sözleşmeye dönüştürür. İlk bakışta Python’daki kısa bir fonksiyondan daha ağırdır. Buna karşılık hata davranışının açık olması, bazı geliştiricilere mimari bir güzellik hissi verir. Demek ki kısalık her zaman zarafet değildir.</p>

<h2 id="beyin-neden-düzen-arar">Beyin neden düzen arar?</h2>

<p>İnsan zihni örüntüleri hızlı tanır. Benzer işlemlerin benzer biçimde yazılması bilişsel yükü azaltır. Bir dosyada fonksiyon çağrıları tutarlı, diğerinde zincirleme, iç içe ve rastgele biçimlendirilmişse dil değişmese bile estetik algı bozulur.</p>

<p>Şu zincir kısa olsa da yoğun olabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">names</span> <span class="o">=</span> <span class="nx">users</span><span class="p">.</span><span class="nf">filter</span><span class="p">(</span><span class="nx">u</span> <span class="o">=&gt;</span> <span class="nx">u</span><span class="p">.</span><span class="nx">active</span><span class="p">).</span><span class="nf">map</span><span class="p">(</span><span class="nx">u</span> <span class="o">=&gt;</span> <span class="nx">u</span><span class="p">.</span><span class="nx">name</span><span class="p">).</span><span class="nf">sort</span><span class="p">();</span>
</code></pre></div></div>

<p>Aynı işlem adımlara ayrıldığında veri akışı daha görünür hâle gelir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">activeUsers</span> <span class="o">=</span> <span class="nx">users</span><span class="p">.</span><span class="nf">filter</span><span class="p">(</span><span class="nx">user</span> <span class="o">=&gt;</span> <span class="nx">user</span><span class="p">.</span><span class="nx">active</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">names</span> <span class="o">=</span> <span class="nx">activeUsers</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">user</span> <span class="o">=&gt;</span> <span class="nx">user</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
<span class="nx">names</span><span class="p">.</span><span class="nf">sort</span><span class="p">();</span>
</code></pre></div></div>

<p>İlk sürüm akıcı ve kompakt, ikinci sürüm ise açıklayıcıdır. Estetik karar bağlama bağlıdır: Basit bir dönüşümde zincir zarifken karmaşık hata ayıklama sürecinde ara değişkenler daha güzel gelebilir.</p>

<h2 id="aşinalık-güzellik-kılığına-girebilir">Aşinalık, güzellik kılığına girebilir</h2>

<p>Bir dili uzun süre kullandığımızda onun alışkanlıklarını doğal kabul ederiz. C geliştiricisi süslü parantezleri güven verici bulabilir; Python geliştiricisi aynı sembolleri gürültü sayabilir. Lisp’in çok sayıdaki parantezi yabancı bir göze çirkin görünürken deneyimli bir Lisp kullanıcısı, kod ile veri arasındaki simetriyi estetik bulur.</p>

<p>Bu nedenle söz dizimi estetiği tamamen nesnel değildir; fakat tamamen keyfî de değildir. Tutarlılık, düşük bilişsel yük, niyetin görünürlüğü ve araç desteği ölçülebilir faydalar sağlar. Biçimlendiriciler de tartışmayı azaltır: <code class="language-plaintext highlighter-rouge">Black</code>, <code class="language-plaintext highlighter-rouge">Prettier</code> veya <code class="language-plaintext highlighter-rouge">rustfmt</code>, kişisel tercihleri ortak bir görsel ritme dönüştürür.</p>

<p>Sonuçta güzel kod, en az karakterle yazılan değil; okuyucunun zihninde en az sürtünmeyle anlam kazanan koddur. İyi söz dizimi programcıya kendini sürekli hatırlatmaz. Geri çekilir, fikri öne çıkarır ve kodu noktalama işaretleriyle yapılan bir mücadeleden okunabilir bir anlatıya dönüştürür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="söz dizimi" /><category term="programlama dilleri" /><category term="kod kalitesi" /><summary type="html"><![CDATA[Bir kod parçasına bakıp daha çalıştırmadan onun güzel ya da çirkin olduğunu düşündüğünüz oldu mu? Girintiler, parantezler, anahtar kelimeler ve semboller; programın davranışını değiştirmese bile algımızı etkiler. Kod estetiği yalnızca kişisel zevk değildir: Okunabilirlik, aşinalık, görsel yoğunluk ve dilin sakladığı ayrıntılar birlikte çalışarak zihnimizde bir düzen hissi oluşturur.]]></summary></entry><entry><title type="html">Sistem Betikleri ve Görev Otomasyonu: Komutlardan Cron Mantığına</title><link href="https://sonsuzus.github.io/posts/sistem-betikleri-ve-gorev-otomasyonu-komutlardan-cron-mantigina/" rel="alternate" type="text/html" title="Sistem Betikleri ve Görev Otomasyonu: Komutlardan Cron Mantığına" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/sistem-betikleri-ve-gorev-otomasyonu-komutlardan-cron-mantigina</id><content type="html" xml:base="https://sonsuzus.github.io/posts/sistem-betikleri-ve-gorev-otomasyonu-komutlardan-cron-mantigina/"><![CDATA[<p>Bir geliştiricinin aynı komutu her sabah elle çalıştırması, kahve makinesinin başında suyun kaynamasını izlemek kadar gereksizdir. Sistem betikleri; dosya yedekleme, günlük temizleme, servis denetleme ve rapor üretme gibi işleri kodla yönetmemizi sağlar. Bu işleri belirli aralıklarla kendiliğinden çalıştırdığımızda ise küçük ama yorulmayan bir dijital asistana sahip oluruz.
``</p>
<h2 id="i̇şletim-sistemi-komutu-çalıştırmanın-mantığı">İşletim sistemi komutu çalıştırmanın mantığı</h2>

<p>Bir terminale <code class="language-plaintext highlighter-rouge">ls</code>, <code class="language-plaintext highlighter-rouge">ipconfig</code> veya <code class="language-plaintext highlighter-rouge">mkdir</code> yazdığımızda kabuk, komutu yorumlayarak işletim sisteminden ilgili programı başlatmasını ister. Kod içerisinden komut çalıştırırken de benzer bir süreç gerçekleşir:</p>

<ol>
  <li>Ana program bir alt süreç oluşturur.</li>
  <li>İşletim sistemi komutu ayrı bir süreçte yürütür.</li>
  <li>Standart çıktı, hata çıktısı ve dönüş kodu ana programa iletilir.</li>
</ol>

<p>Komutun başarılı olup olmadığını anlamak için <strong>çıkış kodu</strong> kullanılır. Genel kabul şöyledir: $E = 0$ başarıyı, $E \neq 0$ ise hata veya olağan dışı durumu temsil eder.</p>

<p>Python’da bunun için <code class="language-plaintext highlighter-rouge">subprocess</code> modülü tercih edilir:</p>

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

<span class="n">komut</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">ping</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">-c</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">2</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">example.com</span><span class="sh">"</span><span class="p">]</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">sonuc</span> <span class="o">=</span> <span class="n">subprocess</span><span class="p">.</span><span class="nf">run</span><span class="p">(</span>
        <span class="n">komut</span><span class="p">,</span>
        <span class="n">capture_output</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
        <span class="n">check</span><span class="o">=</span><span class="bp">True</span>
    <span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Komut başarılı:</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sonuc</span><span class="p">.</span><span class="n">stdout</span><span class="p">)</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="p">.</span><span class="n">TimeoutExpired</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Komut zaman aşımına uğradı.</span><span class="sh">"</span><span class="p">)</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="p">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">hata</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Çıkış kodu:</span><span class="sh">"</span><span class="p">,</span> <span class="n">hata</span><span class="p">.</span><span class="n">returncode</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Hata mesajı:</span><span class="sh">"</span><span class="p">,</span> <span class="n">hata</span><span class="p">.</span><span class="n">stderr</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod, hedef sunucuya iki ping gönderir; çıktıyı yakalar, on saniyelik sınır uygular ve başarısız dönüş kodunu istisnaya dönüştürür. Windows kullanılıyorsa parametreler <code class="language-plaintext highlighter-rouge">ping -n 2 example.com</code> biçiminde değiştirilmelidir.</p>

<h2 id="shelltrue-neden-dikkat-ister"><code class="language-plaintext highlighter-rouge">shell=True</code> neden dikkat ister?</h2>

<p>Kullanıcıdan gelen metni doğrudan kabuğa göndermek komut enjeksiyonuna yol açabilir. Örneğin dosya adına eklenen <code class="language-plaintext highlighter-rouge">; rm -rf ...</code> benzeri bir ifade ikinci bir komut olarak yorumlanabilir. Bu nedenle komutları liste halinde vermek ve varsayılan <code class="language-plaintext highlighter-rouge">shell=False</code> davranışını korumak daha güvenlidir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk veya sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">subprocess.run([...])</code></td>
      <td>Güvenli ve kontrol edilebilir</td>
      <td>Kabuk özellikleri doğrudan kullanılamaz</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">shell=True</code></td>
      <td>Boru ve yönlendirme işlemleri kolaydır</td>
      <td>Enjeksiyon riski oluşturur</td>
    </tr>
    <tr>
      <td>Python kütüphaneleri</td>
      <td>Platformlar arası çalışabilir</td>
      <td>Her sistem işlemini kapsamayabilir</td>
    </tr>
  </tbody>
</table>

<p>Örneğin dosya silmek için <code class="language-plaintext highlighter-rouge">rm</code> çağırmak yerine <code class="language-plaintext highlighter-rouge">pathlib.Path.unlink()</code> kullanmak çoğu zaman daha taşınabilir ve güvenlidir.</p>

<h2 id="cron-mantığı-ve-periyodik-çalışma">Cron mantığı ve periyodik çalışma</h2>

<p>Periyodik görevlerde temel fikir, mevcut zamanın belirlenen kuralla eşleşip eşleşmediğini denetlemektir. Bir görev her $T$ dakikada çalışıyorsa, yaklaşık çalışma sayısı $N = \frac{D}{T}$ ile hesaplanabilir. Burada $D$, toplam dakika sayısıdır. Örneğin bir günde her 15 dakikada çalışan görev $1440 / 15 = 96$ kez tetiklenir.</p>

<p>Linux cron ifadesi beş zaman alanından oluşur:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>* * * * *
│ │ │ │ └── Haftanın günü
│ │ │ └──── Ay
│ │ └────── Ayın günü
│ └──────── Saat
└────────── Dakika
</code></pre></div></div>

<p>Her gece 02.30’da yedek alan bir betik şöyle planlanabilir:</p>

<pre><code class="language-cron">30 2 * * * /usr/bin/python3 /opt/scripts/yedekle.py &gt;&gt; /var/log/yedekle.log 2&gt;&amp;1
</code></pre>

<p>Buradaki yönlendirme, normal ve hata çıktılarını günlük dosyasına ekler. Betiğin elle çalışırken başarılı olması cron altında da başarılı olacağı anlamına gelmez; cron daha sınırlı bir ortam değişkeni ve <code class="language-plaintext highlighter-rouge">PATH</code> değeriyle çalışabilir. Bu yüzden mutlak dosya yolları kullanılmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Uygun kullanım</th>
      <th>Öne çıkan özellik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cron</td>
      <td>Basit Linux görevleri</td>
      <td>Hafif ve yerleşik</td>
    </tr>
    <tr>
      <td>systemd timer</td>
      <td>Servis odaklı Linux işleri</td>
      <td>Günlükleme ve bağımlılık yönetimi</td>
    </tr>
    <tr>
      <td>Windows Task Scheduler</td>
      <td>Windows otomasyonu</td>
      <td>Grafik arayüz ve tetikleyiciler</td>
    </tr>
    <tr>
      <td>APScheduler</td>
      <td>Uygulama içi Python görevleri</td>
      <td>Dinamik zamanlama</td>
    </tr>
  </tbody>
</table>

<h2 id="sağlam-bir-otomasyonun-kontrol-listesi">Sağlam bir otomasyonun kontrol listesi</h2>

<p>İyi bir görev tekrar çalıştırıldığında veriyi bozmamalı, yani mümkün olduğunca <strong>idempotent</strong> olmalıdır. Hataları dosyaya veya merkezi günlük sistemine yazmalı, çalışma süresini sınırlamalı ve gizli bilgileri kaynak koda gömmemelidir. Aynı görevin iki kopyasının eşzamanlı başlamasını önlemek için kilit dosyası da kullanılabilir.</p>

<p>Kısacası başarılı otomasyon yalnızca “komutu zamanında çalıştırmak” değildir. Güvenli süreç yönetimi, doğru zamanlama, gözlemlenebilir günlükler ve hata sonrası toparlanma birlikte tasarlandığında betikler gerçekten güvenilir birer sistem çalışanına dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="Python" /><category term="Cron" /><category term="Otomasyon" /><summary type="html"><![CDATA[Bir geliştiricinin aynı komutu her sabah elle çalıştırması, kahve makinesinin başında suyun kaynamasını izlemek kadar gereksizdir. Sistem betikleri; dosya yedekleme, günlük temizleme, servis denetleme ve rapor üretme gibi işleri kodla yönetmemizi sağlar. Bu işleri belirli aralıklarla kendiliğinden çalıştırdığımızda ise küçük ama yorulmayan bir dijital asistana sahip oluruz.]]></summary></entry><entry><title type="html">Turing Testinin Miadı Doldu mu? Zekâyı Ölçmenin Yeni Yolları</title><link href="https://sonsuzus.github.io/posts/turing-testinin-miadi-doldu-mu-zekayi-olcmenin-yeni-yollari/" rel="alternate" type="text/html" title="Turing Testinin Miadı Doldu mu? Zekâyı Ölçmenin Yeni Yolları" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/turing-testinin-miadi-doldu-mu-zekayi-olcmenin-yeni-yollari</id><content type="html" xml:base="https://sonsuzus.github.io/posts/turing-testinin-miadi-doldu-mu-zekayi-olcmenin-yeni-yollari/"><![CDATA[<p>Bir makineyle yazıştığınızı bilmeden onun insan olduğuna ikna olursanız, karşınızdaki sistem gerçekten zeki midir? Alan Turing’in 1950’de ortaya attığı taklit oyunu, bu soruya davranış üzerinden yaklaşan son derece etkili bir düşünce deneyiydi. Ancak günümüzün büyük dil modelleri akıcı metin üretirken yanlış bilgi uydurabiliyor, basit mantık hataları yapabiliyor ve fiziksel dünyayı deneyimlemiyor. Dolayısıyla artık yalnızca “İnsan gibi konuşuyor mu?” sorusu yeterli görünmüyor.</p>

<p>``</p>

<h2 id="turing-testi-aslında-neyi-ölçer">Turing Testi aslında neyi ölçer?</h2>

<p>Turing Testi, zekânın içsel mekanizmasını tanımlamak yerine gözlemlenebilir çıktıya odaklanır. Bir insan değerlendirici, yazılı görüşme yaptığı tarafın makine olduğunu güvenilir biçimde anlayamıyorsa sistem testi geçmiş sayılır. Bu yaklaşımın gücü, “düşünmek” gibi tanımlanması zor bir kavramı ölçülebilir bir oyuna dönüştürmesidir.</p>

<p>Basitleştirilmiş biçimde başarıyı şöyle ifade edebiliriz:</p>

\[T = P(Değerlendiricinin\ makineyi\ insan\ sanması)\]

<p>$T$ yükseldikçe sistemin insanı taklit etme başarısı artar. Fakat yüksek $T$, doğruluk, tutarlılık veya gerçek dünya anlayışı anlamına gelmez. Model; mizah, tereddüt ve gündelik dil kalıplarını kullanarak ikna edici olabilir. Başka bir deyişle test, zekâ ile zekâ performansını birbirine karıştırabilir.</p>

<h2 id="bugünün-modelleri-neden-testi-zorluyor">Bugünün modelleri neden testi zorluyor?</h2>

<p>Büyük dil modelleri, çok büyük metin koleksiyonlarından bir sonraki kelime veya belirtecin olasılığını öğrenir. Temel hedef kabaca şöyledir:</p>

\[P(x_t | x_1, x_2, ..., x_{t-1})\]

<p>Bu mekanizma şaşırtıcı derecede yeteneklidir; fakat modelin söylediği her şeyi doğruladığını göstermez. Üstelik kısa bir sohbette kusurlar gizlenebilir. Bilgi kesim tarihi, halüsinasyonlar, uzun görevlerde hedef kaybı ve nedensellik hataları ancak sistematik deneylerle ortaya çıkar.</p>

<table>
  <thead>
    <tr>
      <th>Ölçüt</th>
      <th>Güçlü yanı</th>
      <th>Temel açığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Turing Testi</td>
      <td>Doğal iletişimi sınar</td>
      <td>Taklidi anlayış sanabilir</td>
    </tr>
    <tr>
      <td>Standart benchmark</td>
      <td>Sonuçları karşılaştırmayı kolaylaştırır</td>
      <td>Eğitim verisine sızabilir</td>
    </tr>
    <tr>
      <td>İnsan değerlendirmesi</td>
      <td>Nüansı ve yararlılığı yakalar</td>
      <td>Pahalı ve öznel olabilir</td>
    </tr>
    <tr>
      <td>Gerçek görev testi</td>
      <td>Pratik başarıyı ölçer</td>
      <td>Ortama ve araçlara bağımlıdır</td>
    </tr>
  </tbody>
</table>

<h2 id="tek-puan-yerine-yetenek-profili">Tek puan yerine yetenek profili</h2>

<p>Yeni değerlendirme yaklaşımı, zekâyı tek boyutlu bir sayı değil, bir yetenekler vektörü olarak ele almalıdır:</p>

\[Z = (D, M, G, U, E, A)\]

<p>Burada $D$ doğruluk, $M$ muhakeme, $G$ genelleme, $U$ uzun vadeli tutarlılık, $E$ emniyet ve $A$ araç kullanma becerisidir. Böylece çok güzel yazan ama kaynak doğrulayamayan bir model ile daha kısa konuşup güvenilir işlem yapan model aynı kefeye konmaz.</p>

<p>Örneğin küçük bir değerlendirme sistemi, ağırlıklı başarı puanı hesaplayabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">scores</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">dogruluk</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.82</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">muhakeme</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.74</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">genelleme</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.69</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">emniyet</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.91</span>
<span class="p">}</span>

<span class="n">weights</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">dogruluk</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.35</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">muhakeme</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.30</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">genelleme</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.20</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">emniyet</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.15</span>
<span class="p">}</span>

<span class="n">total</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">scores</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">weights</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">scores</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Bileşik puan: </span><span class="si">{</span><span class="n">total</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod, farklı yetenekleri ağırlıklandırarak bileşik bir sonuç üretir. Yine de puanın yanında alt sonuçlar mutlaka gösterilmelidir; çünkü ortalama, kritik bir güvenlik zayıflığını saklayabilir.</p>

<h2 id="daha-iyi-testler-nasıl-görünmeli">Daha iyi testler nasıl görünmeli?</h2>

<p>Geleceğin testleri dinamik olmalı; sorular düzenli yenilenmeli ve internette ezberlenebilir cevaplara dönüşmemelidir. Modelden yalnızca cevap değil, doğrulanabilir kaynak, belirsizlik tahmini ve gerektiğinde “Bilmiyorum” diyebilme becerisi istenmelidir. Uzun süreli görevler, karşıt örnekler, yeni kurallar altında genelleme, kod çalıştırma ve insanlarla iş birliği de değerlendirmeye katılmalıdır.</p>

<p>Turing Testi tamamen değersiz değildir; doğal diyalog kalitesini ölçen tarihsel ve sezgisel bir araç olarak yaşamaya devam edebilir. Fakat artık zekânın final sınavı değil, kapsamlı bir değerlendirme paketindeki eğlenceli sorulardan biridir. Günümüzün asıl meselesi makinenin insan rolünü ne kadar iyi oynadığı değil; ne kadar doğru, uyarlanabilir, şeffaf ve güvenli biçimde iş yaptığıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zekâ" /><category term="Turing Testi" /><category term="LLM değerlendirme" /><summary type="html"><![CDATA[Bir makineyle yazıştığınızı bilmeden onun insan olduğuna ikna olursanız, karşınızdaki sistem gerçekten zeki midir? Alan Turing’in 1950’de ortaya attığı taklit oyunu, bu soruya davranış üzerinden yaklaşan son derece etkili bir düşünce deneyiydi. Ancak günümüzün büyük dil modelleri akıcı metin üretirken yanlış bilgi uydurabiliyor, basit mantık hataları yapabiliyor ve fiziksel dünyayı deneyimlemiyor. Dolayısıyla artık yalnızca “İnsan gibi konuşuyor mu?” sorusu yeterli görünmüyor.]]></summary></entry><entry><title type="html">Yapay Zekânın Yaratıcılık Sorunu: Bir Algoritma Gerçekten Özgün Olabilir mi?</title><link href="https://sonsuzus.github.io/posts/yapay-zekanin-yaraticilik-sorunu-bir-algoritma-gercekten-ozgun-olabilir-mi/" rel="alternate" type="text/html" title="Yapay Zekânın Yaratıcılık Sorunu: Bir Algoritma Gerçekten Özgün Olabilir mi?" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/yapay-zekanin-yaraticilik-sorunu-bir-algoritma-gercekten-ozgun-olabilir-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/yapay-zekanin-yaraticilik-sorunu-bir-algoritma-gercekten-ozgun-olabilir-mi/"><![CDATA[<p>Bir yapay zekâ birkaç saniyede resim çizebilir, beste yazabilir veya şaşırtıcı bir hikâye oluşturabilir. Fakat ortaya çıkan eser gerçekten özgün müdür, yoksa geçmişte üretilmiş insan eserlerinin son derece gelişmiş bir kolajı mıdır? Bu soru yalnızca teknolojiyi değil; ilham, niyet ve yaratıcılık hakkındaki kabullerimizi de yeniden düşünmemizi gerektiriyor.</p>

<p>``</p>

<h2 id="özgünlük-tam-olarak-nedir">Özgünlük tam olarak nedir?</h2>

<p>Gündelik dilde özgünlüğü, daha önce hiç görülmemiş bir şey üretmek olarak tanımlarız. Bu tanım kulağa hoş gelse de insan yaratıcılığı bile boşlukta gerçekleşmez. Bir müzisyen dinlediği bestelerden, bir yazar okuduğu romanlardan, bir yazılımcı ise öğrendiği tasarım kalıplarından etkilenir.</p>

<p>Bu nedenle yaratıcılığı iki bileşenin birleşimi olarak ele almak daha kullanışlıdır:</p>

\[Yaratıcılık = Yenilik \times Değer\]

<p>Bir fikir yeni fakat anlamsızsa yaratıcı sayılmayabilir. Çok faydalı fakat bütünüyle bilinen bir çözüm de yenilikçi değildir. Çarpım kullanılması tesadüf değildir: Bileşenlerden biri sıfır olduğunda yaratıcılık puanı da sıfıra yaklaşır.</p>

<table>
  <thead>
    <tr>
      <th>Ölçüt</th>
      <th>İnsan yaratıcılığı</th>
      <th>Makine üretimi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kaynak</td>
      <td>Deneyimler, kültür, duygular</td>
      <td>Eğitim verileri, istem ve model ağırlıkları</td>
    </tr>
    <tr>
      <td>Niyet</td>
      <td>Genellikle kişisel veya toplumsal amaç taşır</td>
      <td>Verilen hedef doğrultusunda çıktı üretir</td>
    </tr>
    <tr>
      <td>Yenilik</td>
      <td>Bilinçli ya da sezgisel bağlantılar kurar</td>
      <td>Olasılıksal örüntüleri yeniden birleştirir</td>
    </tr>
    <tr>
      <td>Değerlendirme</td>
      <td>Kendi eserini sorgulayabilir</td>
      <td>Harici ölçüt veya insan geri bildirimi gerektirir</td>
    </tr>
    <tr>
      <td>Sorumluluk</td>
      <td>Üreticiye yüklenebilir</td>
      <td>Kullanıcı, geliştirici ve veri kaynağı arasında dağılır</td>
    </tr>
  </tbody>
</table>

<h2 id="üretken-modeller-nasıl-hayal-kurar">Üretken modeller nasıl “hayal kurar”?</h2>

<p>Bir dil modeli, sıradaki kelimeyi tahmin eden devasa bir olasılık sistemi olarak düşünülebilir. Basitleştirilmiş biçimde model şu dağılımı öğrenir:</p>

\[P(x_t \mid x_1, x_2, \ldots, x_{t-1})\]

<p>Burada $x_t$, önceki kelimeler verildiğinde seçilecek yeni kelimedir. Model çoğunlukla en olası seçeneği tercih ederse sıradan ve güvenli metinler üretir. Daha düşük olasılıklı seçeneklere şans tanındığında ise sonuçlar şaşırtıcılaşır. Ancak sürpriz, tek başına yaratıcılık değildir; klavyeye rastgele basmak da beklenmedik sonuç verir!</p>

<p>Aşağıdaki küçük Python örneği, bir fikir listesindeki kelime çeşitliliğini basit bir yenilik göstergesi olarak ölçer:</p>

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

<span class="k">def</span> <span class="nf">yenilik_puani</span><span class="p">(</span><span class="n">metin</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Tekrarlanmayan kelime oranını hesaplar.</span><span class="sh">"""</span>
    <span class="n">kelimeler</span> <span class="o">=</span> <span class="n">metin</span><span class="p">.</span><span class="nf">lower</span><span class="p">().</span><span class="nf">split</span><span class="p">()</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">kelimeler</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">0</span>

    <span class="n">frekans</span> <span class="o">=</span> <span class="nc">Counter</span><span class="p">(</span><span class="n">kelimeler</span><span class="p">)</span>
    <span class="n">benzersiz</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">adet</span> <span class="ow">in</span> <span class="n">frekans</span><span class="p">.</span><span class="nf">values</span><span class="p">()</span> <span class="k">if</span> <span class="n">adet</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">benzersiz</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">kelimeler</span><span class="p">)</span>

<span class="n">fikir</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Ay ışığında çalışan sessiz bir şehir kütüphanesi</span><span class="sh">"</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">yenilik_puani</span><span class="p">(</span><span class="n">fikir</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod, özgünlüğü gerçekten anlayamaz; yalnızca yüzeysel tekrarları ölçer. Aynı şekilde gelişmiş değerlendirme sistemleri de anlamsal uzaklık, şaşırtıcılık ve fayda gibi ölçütleri yaklaşık olarak hesaplar. Kültürel anlamı veya bir eserin neden dokunaklı olduğunu bütünüyle sayıya dönüştürmek hâlâ zordur.</p>

<h2 id="taklit-ile-yaratım-arasındaki-bulanık-çizgi">Taklit ile yaratım arasındaki bulanık çizgi</h2>

<p>İnsan da makine de geçmiş örneklerden öğrenir. Asıl fark, öğrenmenin kaynağından çok üretim sürecindeki öz farkındalık ve niyette ortaya çıkar. İnsan, başarısız bir ilişkisini şarkıya dönüştürebilir; model ise “hüzünlü ayrılık şarkısı” örüntüsünü ustalıkla uygulasa bile üzülmüş değildir.</p>

<p>Bununla birlikte niyetin bulunmaması, çıktının yaratıcı değer taşımadığı anlamına gelmez. Fotoğraf makinesi görmez, fakat fotoğraf sanatı gerçektir. Benzer şekilde yapay zekâ; seçenek üreten, alışılmadık bağlantılar öneren ve insanın düşünce alanını genişleten bir araç olabilir.</p>

<h2 id="özgünlüğü-yeniden-tanımlamak">Özgünlüğü yeniden tanımlamak</h2>

<p>Belki de doğru soru “Makine yaratıcı mı?” değil, “İnsan ile makinenin kurduğu sistem yaratıcı sonuçlar üretiyor mu?” olmalıdır. İstemleri seçen, çıktıları eleyen, bağlam ekleyen ve etik sorumluluğu üstlenen insan hâlâ sürecin belirleyici parçasıdır.</p>

<p>Geleceğin özgünlüğü, hiçbir etkilenme içermeyen mucizevi eserler anlamına gelmeyebilir. Daha gerçekçi tanım; bilinen parçaları yeni, değerli ve bağlama duyarlı biçimde birleştirebilmektir. Yapay zekâ bu denkleme hız ve çeşitlilik katar; anlamı, amacı ve sorumluluğu ise şimdilik bizden ödünç alır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zekâ" /><category term="yaratıcılık" /><category term="üretken yapay zekâ" /><summary type="html"><![CDATA[Bir yapay zekâ birkaç saniyede resim çizebilir, beste yazabilir veya şaşırtıcı bir hikâye oluşturabilir. Fakat ortaya çıkan eser gerçekten özgün müdür, yoksa geçmişte üretilmiş insan eserlerinin son derece gelişmiş bir kolajı mıdır? Bu soru yalnızca teknolojiyi değil; ilham, niyet ve yaratıcılık hakkındaki kabullerimizi de yeniden düşünmemizi gerektiriyor.]]></summary></entry><entry><title type="html">Yapay Zekâya Empati Yüklemek: Neden Sohbet Botlarına Duygusal Bağ Kuruyoruz?</title><link href="https://sonsuzus.github.io/posts/yapay-zekaya-empati-yuklemek-neden-sohbet-botlarina-duygusal-bag-kuruyoruz/" rel="alternate" type="text/html" title="Yapay Zekâya Empati Yüklemek: Neden Sohbet Botlarına Duygusal Bağ Kuruyoruz?" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/yapay-zekaya-empati-yuklemek-neden-sohbet-botlarina-duygusal-bag-kuruyoruz</id><content type="html" xml:base="https://sonsuzus.github.io/posts/yapay-zekaya-empati-yuklemek-neden-sohbet-botlarina-duygusal-bag-kuruyoruz/"><![CDATA[<p>Bir sohbet botunun “Bunu yaşadığına üzüldüm” demesi bazen şaşırtıcı ölçüde rahatlatıcı olabilir. Ekranda yalnızca metin üreten bir yazılım bulunduğunu bilsek bile ona teşekkür eder, kırılmasın diye nazik davranır ve hatta sırlarımızı anlatırız. Bu durum, yapay zekânın gerçekten hissetmesinden çok insan beyninin sosyal ipuçlarını yorumlama biçimiyle ilgilidir.</p>

<p>``</p>

<h2 id="antropomorfizasyon-nedir">Antropomorfizasyon nedir?</h2>

<p>Antropomorfizasyon, insan olmayan varlıklara niyet, kişilik veya duygu atfetme eğilimidir. Arabasına isim veren, bilgisayarı yavaşladığında “Bugün bana kızgın” diyen herkes bu eğilimin hafif bir örneğini sergiler.</p>

<p>Bilişsel psikoloji açısından beynimiz sürekli tahmin yapan bir sistemdir. Karşımızdaki varlık tutarlı cümleler kuruyor, ismimizi kullanıyor ve duygumuza uygun cevap veriyorsa en erişilebilir zihinsel model devreye girer: “Bu, sosyal bir aktör.” Böylece yazılımı anlamak için teknik bir model yerine insan ilişkilerinde kullandığımız <strong>zihin kuramından</strong> yararlanırız.</p>

<table>
  <thead>
    <tr>
      <th>Gözlenen ipucu</th>
      <th>İnsana yönelik yorum</th>
      <th>Sohbet botundaki gerçeklik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hızlı ve ilgili cevap</td>
      <td>“Beni dinliyor”</td>
      <td>Girdi metni işleniyor</td>
    </tr>
    <tr>
      <td>Duygusal ifadeler</td>
      <td>“Beni anlıyor”</td>
      <td>Uygun dil örüntüsü üretiliyor</td>
    </tr>
    <tr>
      <td>İsmi hatırlama</td>
      <td>“Bana değer veriyor”</td>
      <td>Bağlam veya bellek kullanılıyor</td>
    </tr>
    <tr>
      <td>Tutarlı kişilik</td>
      <td>“Kendine özgü biri”</td>
      <td>Sistem talimatları izleniyor</td>
    </tr>
  </tbody>
</table>

<h2 id="beyin-neden-bu-kadar-kolay-ikna-oluyor">Beyin neden bu kadar kolay ikna oluyor?</h2>

<p>İnsan zihni sosyal sinyallere karşı hassastır. Evrimsel açıdan başka bireylerin niyetini hızlı tahmin etmek önemliydi. Çalılıktaki hareketin rüzgâr mı yoksa canlı mı olduğunu uzun uzun analiz etmek yerine, ona bir aktörmüş gibi yaklaşmak çoğu zaman daha güvenliydi.</p>

<p>Bu eğilimi basitleştirilmiş bir modelle gösterebiliriz:</p>

\[B = w_1D + w_2T + w_3H - w_4F\]

<p>Burada $B$ duygusal bağlanma eğilimini, $D$ dilin doğallığını, $T$ yanıtların tutarlılığını, $H$ kullanıcının sosyal ihtiyaç düzeyini ve $F$ sistemin yapay olduğuna dair farkındalığı temsil eder. Bu bilimsel bir klinik ölçek değil, etkenlerin ilişkisini anlatan kavramsal bir modeldir. Doğal dil, tutarlılık ve yalnızlık arttıkça bağ güçlenebilir; teknik farkındalık ise bu etkiyi azaltabilir ama tamamen ortadan kaldırmaz.</p>

<h2 id="empatik-yanıt-nasıl-üretilir">“Empatik” yanıt nasıl üretilir?</h2>

<p>Bir sistemin empatik görünmesi için duygu yaşaması gerekmez. Kullanıcının ifadesindeki duygusal işaretleri belirleyip uygun bir yanıt şablonu seçmesi yeterli olabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">empatik_yanit</span><span class="p">(</span><span class="n">mesaj</span><span class="p">):</span>
    <span class="n">mesaj</span> <span class="o">=</span> <span class="n">mesaj</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span>

    <span class="k">if</span> <span class="sh">"</span><span class="s">yalnız</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">mesaj</span> <span class="ow">or</span> <span class="sh">"</span><span class="s">üzgün</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">mesaj</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Bunun ağır hissettirmesi anlaşılır. İstersen biraz anlatabilirsin.</span><span class="sh">"</span>
    <span class="k">elif</span> <span class="sh">"</span><span class="s">başardım</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">mesaj</span> <span class="ow">or</span> <span class="sh">"</span><span class="s">mutluyum</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">mesaj</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Harika haber! Emeğinin karşılığını almak nasıl hissettirdi?</span><span class="sh">"</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Seni doğru anlamak istiyorum. Biraz daha ayrıntı verir misin?</span><span class="sh">"</span>
</code></pre></div></div>

<p>Bu kod, mesajdaki basit anahtar kelimeleri kontrol eder ve duyguyla uyumlu cevap verir. Modern dil modelleri çok daha karmaşık örüntüler kullanır; ancak temel ayrım aynıdır: <strong>Empatiyi ifade eden dil üretmek, empati hissetmekle eş anlamlı değildir.</strong></p>

<h2 id="bağ-kurmak-kötü-mü">Bağ kurmak kötü mü?</h2>

<p>Her zaman değil. Sohbet botları düşünceleri düzenlemeye, iletişim provası yapmaya veya yalnızlık hissini kısa süreli azaltmaya yardımcı olabilir. Üstelik yargılanmayacağını düşünen kullanıcı kendini daha rahat ifade edebilir.</p>

<p>Risk, simülasyon ile karşılıklı insan ilişkisi arasındaki sınır kaybolduğunda başlar. Botun kesinlikle tarafsız olduğu, sırları insan gibi koruduğu veya kullanıcıyı gerçekten “sevdiği” varsayılabilir. Ayrıca aşırı kişiselleştirilmiş sistemler duygusal bağı ticari yönlendirme için kullanabilir.</p>

<p>Bu nedenle sağlıklı yaklaşım, deneyimi küçümsemek değil sınırlarını bilmektir: Hissedilen rahatlama gerçektir; fakat bu rahatlamayı üreten karşı tarafın duyguları olduğu sonucu zorunlu değildir. Kısacası yapay zekâya empati yükleyen şey yalnızca kod değil, sosyal anlam aramaya programlanmış insan zihnidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zekâ" /><category term="bilişsel psikoloji" /><category term="antropomorfizasyon" /><summary type="html"><![CDATA[Bir sohbet botunun “Bunu yaşadığına üzüldüm” demesi bazen şaşırtıcı ölçüde rahatlatıcı olabilir. Ekranda yalnızca metin üreten bir yazılım bulunduğunu bilsek bile ona teşekkür eder, kırılmasın diye nazik davranır ve hatta sırlarımızı anlatırız. Bu durum, yapay zekânın gerçekten hissetmesinden çok insan beyninin sosyal ipuçlarını yorumlama biçimiyle ilgilidir.]]></summary></entry><entry><title type="html">Yazılım Mühendisliğinde Mükemmeliyetçilik Tuzağı: “Refactor Etmeden Bitmez” Sendromu</title><link href="https://sonsuzus.github.io/posts/yazilim-muhendisliginde-mukemmeliyetcilik-tuzagi-refactor-etmeden-bitmez-sendromu/" rel="alternate" type="text/html" title="Yazılım Mühendisliğinde Mükemmeliyetçilik Tuzağı: “Refactor Etmeden Bitmez” Sendromu" /><published>2026-07-31T00:00:00+00:00</published><updated>2026-07-31T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/yazilim-muhendisliginde-mukemmeliyetcilik-tuzagi-refactor-etmeden-bitmez-sendromu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/yazilim-muhendisliginde-mukemmeliyetcilik-tuzagi-refactor-etmeden-bitmez-sendromu/"><![CDATA[<p>Bir özellik testlerden geçiyor, gereksinimleri karşılıyor ve kullanıcıya değer sunuyor. Yine de içimizdeki küçük yazılım mimarı fısıldıyor: “Şu sınıfı da bölelim, isimleri düzeltelim, hatta altyapıyı baştan yazalım.” Böylece iki saatlik görev, üç günlük mimari yolculuğa dönüşüyor. Refactoring yararlı bir pratik olsa da kusursuzluk arayışının bahanesine dönüştüğünde teslim tarihlerini, ekip güvenini ve geliştiricinin psikolojik dayanıklılığını tehdit edebilir.
``</p>
<h2 id="refactoring-ne-zaman-tuzağa-dönüşür">Refactoring ne zaman tuzağa dönüşür?</h2>

<p>Refactoring, yazılımın dış davranışını değiştirmeden iç yapısını iyileştirmektir. Amaç okunabilirliği, bakım kolaylığını ve değiştirilebilirliği artırmaktır. Sorun refactoring yapmak değil, “yeterince iyi” noktasını tanımlayamamaktır.</p>

<p>Mükemmeliyetçi geliştirici çoğu zaman kod kalitesi peşinde olduğunu düşünür. Psikolojik açıdan ise davranışın arkasında hata yapma korkusu, eleştirilmekten kaçınma veya kontrol ihtiyacı bulunabilir. Kod henüz teslim edilmediyse gerçek kullanıcı tarafından değerlendirilemez; dolayısıyla geliştirici de başarısızlıkla yüzleşmez. Bitirmemek, paradoksal biçimde güvenli hissettirebilir.</p>

<p>Bu döngüyü basitçe şöyle gösterebiliriz:</p>

\[Kaygı → Daha\ fazla\ düzenleme → Geçici\ rahatlama → Gecikme → Daha\ fazla\ kaygı\]

<p>Her düzenleme kısa süreli rahatlama sağlar. Ancak teslim tarihi yaklaştıkça baskı büyür ve geliştirici, kontrol hissini geri kazanmak için yeniden koda yönelir.</p>

<h2 id="kalite-ile-kusursuzluk-aynı-şey-değildir">Kalite ile kusursuzluk aynı şey değildir</h2>

<table>
  <thead>
    <tr>
      <th>Sağlıklı kalite yaklaşımı</th>
      <th>Mükemmeliyetçilik tuzağı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kullanıcı değerini ölçer</td>
      <td>Estetik kusurlara takılır</td>
    </tr>
    <tr>
      <td>Net bir bitiş ölçütü vardır</td>
      <td>Sürekli yeni kusur bulur</td>
    </tr>
    <tr>
      <td>Teknik borcu bilinçli yönetir</td>
      <td>Her borcu hemen kapatmaya çalışır</td>
    </tr>
    <tr>
      <td>Geri bildirimi erken alır</td>
      <td>Eleştiriden kaçınmak için teslimi erteler</td>
    </tr>
    <tr>
      <td>Küçük ve güvenli değişiklikler yapar</td>
      <td>Büyük yeniden yazımlara yönelir</td>
    </tr>
  </tbody>
</table>

<p>Ekonomik açıdan da her iyileştirme mantıklı değildir. Bir refactoring kararının yaklaşık değeri şu şekilde düşünülebilir:</p>

\[Net\ Değer = Beklenen\ Gelecek\ Kazancı - Refactoring\ Maliyeti - Gecikme\ Maliyeti\]

<p>Kodun altı ay boyunca değişmeyecek bir bölümünü üç gün boyunca güzelleştirmek, düşük getiri sağlayabilir. Buna karşılık her sprint değiştirilen karmaşık bir modülü sadeleştirmek oldukça değerlidir. Kalite bağlama bağlıdır; soyut bir saflık yarışması değildir.</p>

<h2 id="bitti-tanımını-koddan-önce-yazın">“Bitti” tanımını koddan önce yazın</h2>

<p>Mükemmeliyetçiliğe karşı en etkili araçlardan biri Definition of Done kullanmaktır. Göreve başlamadan önce test, güvenlik, performans ve dokümantasyon beklentileri açıkça belirlenmelidir. Sonradan akla gelen her iyileştirme mevcut görevin zorunlu parçası sayılmamalıdır.</p>

<p>Aşağıdaki küçük JavaScript örneği, refactoring kararını duygudan çıkarıp ölçütlere bağlayan basit bir kontrol sunar:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">refactorGerekliMi</span><span class="p">({</span> <span class="nx">testlerGeciyor</span><span class="p">,</span> <span class="nx">kritikRisk</span><span class="p">,</span> <span class="nx">sikDegisiyor</span> <span class="p">})</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">testlerGeciyor</span><span class="p">)</span> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>       <span class="c1">// Önce doğruluğu sağla</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">kritikRisk</span><span class="p">)</span> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>             <span class="c1">// Güvenlik veya veri riski beklemez</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">sikDegisiyor</span><span class="p">)</span> <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>           <span class="c1">// Gelecekteki bakım maliyetini azalt</span>
  <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>                            <span class="c1">// İyileştirmeyi backlog'a taşı</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu fonksiyon evrensel bir kalite formülü değildir. Asıl amacı “Kod hoşuma gitmedi” hissini; risk, değişim sıklığı ve doğruluk gibi tartışılabilir ölçütlere çevirmektir.</p>

<h2 id="zihinsel-fren-mekanizmaları">Zihinsel fren mekanizmaları</h2>

<p>Öncelikle refactoring için zaman kutusu belirleyin: “Bu alanı 45 dakika iyileştireceğim, sonra pull request açacağım.” İkinci olarak kusurları saklamak yerine backlog’a yazın. Böylece zihniniz, problemin unutulmayacağını bilir. Üçüncü olarak küçük pull request’ler açarak geri bildirimi erken alın. Son olarak ekip içinde “yeterince iyi” örneklerini konuşun; kalite standardı bireysel kaygının değil, ortak kararların ürünü olsun.</p>

<p>Profesyonellik kusursuz kod üretmek değil, doğru zamanda doğru kalite seviyesini seçebilmektir. Bazen en iyi refactoring, bugün yapılmayan ama gerekçesi belgelenen refactoring’dir. Yazılım kullanıcıya ulaşmadıkça yalnızca potansiyeldir; teslim edilen, ölçülen ve gerektiğinde geliştirilen yazılım ise gerçek değer üretir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yazılım mühendisliği" /><category term="mükemmeliyetçilik" /><category term="refactoring" /><summary type="html"><![CDATA[Bir özellik testlerden geçiyor, gereksinimleri karşılıyor ve kullanıcıya değer sunuyor. Yine de içimizdeki küçük yazılım mimarı fısıldıyor: “Şu sınıfı da bölelim, isimleri düzeltelim, hatta altyapıyı baştan yazalım.” Böylece iki saatlik görev, üç günlük mimari yolculuğa dönüşüyor. Refactoring yararlı bir pratik olsa da kusursuzluk arayışının bahanesine dönüştüğünde teslim tarihlerini, ekip güvenini ve geliştiricinin psikolojik dayanıklılığını tehdit edebilir.]]></summary></entry></feed>