<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>sade.dev — Production&apos;da Upgrade</title><description>Runtime, framework ve bağımlılık upgrade&apos;ini teknik bir iş değil, risk kararı olarak ele almak: tetikleyiciler, envanter, karar matrisi, hedef sürüm, ön koşullar, rollout ve upgrade etmeme kararı.</description><link>https://sade.dev/tr/series/production-upgrade/</link><language>tr-TR</language><atom:link href="https://sade.dev/tr/series/production-upgrade/rss.xml" rel="self" type="application/rss+xml"/><item><title>Upgrade&apos;i Ertelemenin Maliyeti</title><link>https://sade.dev/tr/journal/upgrade-ertelemenin-maliyeti/</link><guid isPermaLink="true">https://sade.dev/tr/journal/upgrade-ertelemenin-maliyeti/</guid><description>PHP 7.1 → 8.2 upgrade&apos;i &quot;çalışıyor ya&quot; diye ertelendi. Fatura sonra geldi: bağımlılık kilidi, toplu breaking change ve aylara yayılan bug&apos;lar.</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PHP 7.1’den stabil 8.2’ye geçmeyi önerdiğimde cevap kısaydı: “Çalışıyor, ne gerek var?” Cevap doğruydu — o gün hiçbir şey bozuk değildi. Bozulmaya başlayan şey görünmüyordu: paketler eski PHP desteğini tek tek kesiyor, uygulama 7.1’e kilitleniyordu.&lt;/p&gt;
&lt;p&gt;“Çalışıyor” cümlesi bugünü anlatır. Faturayı ise sonraki günler keser.&lt;/p&gt;
&lt;p&gt;İtiraz mantıksız değil, o yüzden hafife almıyorum. Bozuk olmayan bir şeye zaman ayırmak, hiçbir şey kazanılmıyormuş gibi görünür. Haklı bir cümleyi çürütmek için cümleyle tartışmak yetmez; sayıyla gelmek gerekir. Aşağıdaki, o cümlenin bana neye mal olduğunun hesabı: hangi mekanizmayla, hangi kalemlerle ve hangi kısmı ölçebildiğimle.&lt;/p&gt;
&lt;h2 id=&quot;kilit-nasıl-kuruluyor&quot;&gt;Kilit Nasıl Kuruluyor&lt;/h2&gt;
&lt;p&gt;Kilit tek bir günde kurulmadı; her paket güncellemesinde bir kapı daha kapandı.&lt;/p&gt;
&lt;p&gt;Mekanizma sıradan. Bir paket yeni sürümünde eski runtime’ı desteklemeyi bırakır. Runtime yükseltilmediği için o sürüm kurulamaz, eski sürümde kalınır. Aynı şey bir sonraki pakette olur, ardından bir sonrakinde. Hiçbiri tek başına alarm üretmez: eski sürüm çalışmaya devam eder.&lt;/p&gt;
&lt;p&gt;Bir noktadan sonra güncellenebilen paket kalmaz. Buna &lt;strong&gt;bağımlılık kilidi&lt;/strong&gt; diyorum: uygulama runtime’a, paketler uygulamaya, hepsi birlikte 7.1’e bağlanmış durumda. Çıkış tek parça. Runtime’ı yükseltmeden hiçbir paketi ileri alamıyordum; paketleri ileri almadan da yükseltmenin neye mal olacağını göremiyordum.&lt;/p&gt;
&lt;p&gt;Kilit bu yüzden fark edilmeden kuruluyor. Her kapanan kapı tek başına ertelenebilir bir ayrıntı; hiçbir paket güncellemesi “upgrade’i bugün yapmalıyız” dedirtecek kadar büyük görünmüyor. Kararı ertelemek her seferinde makul. Makul kararların toplamı ise bir köşeye sıkışmak oluyor.&lt;/p&gt;
&lt;p&gt;Kilidin en kötü yanı sessiz olması. Hiçbir hata mesajı “bugün bir kapı daha kapandı” demiyor. Bunu ancak bir paketi güncellemeye çalıştığınız gün, güncellemenin neden kurulmadığını okurken fark ediyorsunuz.&lt;/p&gt;
&lt;p&gt;Kendi sisteminizde bakılacak işaret basit: Bekleyen paket güncellemelerinden kaçı, runtime sürümü yüzünden kurulamıyor? Sıfırdan büyük her sayı, bir kapının kapanmış olduğunu gösterir.&lt;/p&gt;
&lt;h2 id=&quot;elimdeki-tek-rakam&quot;&gt;Elimdeki Tek Rakam&lt;/h2&gt;
&lt;p&gt;Önerdiğim gün iş, 1–2 günlük bir upgrade’di. Kilit kurulurken ise her paket güncellemesi birkaç saat tutuyordu. İkisi de küçük bir iş gibi duruyordu ve bu yüzden ertelemek kolaydı.&lt;/p&gt;
&lt;p&gt;Küçük iş, ertelemek için iyi bir adaydır; “önce acil olanı bitirelim” cümlesi her takvimde yer bulur.&lt;/p&gt;
&lt;p&gt;Ertelenince iş yalnız büyümedi, biriktiği için tek parça hâline geldi. Sürüm atlamak zorunda kaldım: 7.1’den 8.2’ye adım adım değil, aradaki her şeyi tek seferde geçerek. Önüme onlarca breaking change ve deprecated metot çıktı ve hepsi aynı anda çözülmek zorundaydı. Parça parça ödenebilecek bir borç, tek bir tahsilata dönüştü.&lt;/p&gt;
&lt;p&gt;Rakamın asıl öğrettiği, tutarın kendisi değil iş türünün değişmesi. Birkaç saatlik paket güncellemeleri istenen sırayla, istenen günde yapılabilen parçalı işlerdi. Onlarca breaking change ise bölünemeyen, başlayınca bitmesi gereken tek bir iş. Ertelemek işi büyütmekle kalmadı, esnekliğini de aldı.&lt;/p&gt;
&lt;p&gt;Bu, elimdeki tek rakam: 1–2 günlük iş, artı her paket güncellemesinde birkaç saat. Ertelemenin toplam bedelini bunun yanına koyabilecek bir ölçümüm yok. Koymayacağım da; ölçmediğim bir sayıyı yazmak, “çalışıyor ya” cevabından daha kötü bir argüman olur.&lt;/p&gt;
&lt;p&gt;Yine de bu tek rakam bile bir konuşmayı başlatmaya yeter. “Çalışıyor ya” karşısına “hiçbir şey kazanmıyoruz” diye değil, “şimdi 1–2 gün, sonra tek seferde onlarca değişiklik” diye gidebilirsiniz. İkisi arasındaki farkı yöneticiye açıklamak için ölçüm şart değil, yalnız karşılaştırmanın yönü yeter.&lt;/p&gt;
&lt;p&gt;Rakamı nasıl çıkaracağınız serinin 7. bölümünde; hangi upgrade’in önce geleceği 3. bölümde. Burada yalnız şunu söylüyorum: bu karşılaştırmayı o gün masaya koyabilseydim, “çalışıyor” cevabı tek başına yetmezdi.&lt;/p&gt;
&lt;h2 id=&quot;faturanın-asıl-kalemi&quot;&gt;Faturanın Asıl Kalemi&lt;/h2&gt;
&lt;p&gt;Breaking change’leri temizledik; beklemediğimiz şey, ondan sonra gelen bug’lardı.&lt;/p&gt;
&lt;p&gt;Breaking change’in iyi bir özelliği var: hata mesajı onu gösterir. Listeyi çıkarırsınız, tek tek kapatırsınız, biter. Bu kalem uzun ama bellidir: büyüklüğünü kabaca kestirir, takvime yerleştirir, yöneticiye de söyleyebilirsiniz.&lt;/p&gt;
&lt;p&gt;Bug’lar öyle değildi. Bir kısmı yalnız tek bir case’de ortaya çıkıyordu — sık tetiklenmeyen bir yol, belirli bir veri, belirli bir sıra. Böyle bir bug’ı önce görmek, sonra yeniden üretmek, sonra nedenini bulmak gerekiyor. Her biri ayrı bir araştırma. Çözümleri aylara yayıldı. Bir bug kapanıyor, başka bir case’de bir başkası çıkıyordu.&lt;/p&gt;
&lt;p&gt;Planlama açısından ikisini ayrı yazmak gerekiyor. Breaking change tahmin edilebilir bir kalem; bug’lar edilemez. Bütçeyi yalnız birincisine göre kurarsanız, ikincisi bütçenin dışında, takvimin içinde yaşanır.&lt;/p&gt;
&lt;p&gt;Asıl maliyet orada: &lt;strong&gt;uzun kuyruk&lt;/strong&gt;. Toplu geçişin bedeli takvime sığar, kuyruğun bedeli sığmaz. Üstelik onlarca değişikliği bir arada taşıyınca her bug’ın kaynağı onlarca adaydan biri oldu; hangisinin hangi değişiklikten geldiğini ayırmak ayrı bir iş çıkardı.&lt;/p&gt;
&lt;h2 id=&quot;çalışıyor-bugünü-anlatır&quot;&gt;Çalışıyor Bugünü Anlatır&lt;/h2&gt;
&lt;p&gt;“Çalışıyor ya” itirazına “teknik borç var” demek yetmiyor; karşınızdaki bunu bir görüş olarak duyuyor. İş diliyle cevap vermek için riski kalemlere ayırmak gerekiyor. Ertelenen her upgrade dört kalem biriktirir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Destek bitişi:&lt;/strong&gt; runtime ya da framework’ün bakımı bitince yeni düzeltme gelmez. Takvimde belli bir gün, bilinen bir tarih.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE’ye açık kalma süresi:&lt;/strong&gt; desteğin bittiği günden sonra duyurulan her CVE için resmi yama gelmez; dağıtımınız ya da ücretli bir uzatılmış destek yamalamıyorsa açık, siz yükseltene kadar sistemde durur. Sayaç desteğin bittiği gün başlar, upgrade günü durur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bağımlılık kilidi:&lt;/strong&gt; paketler eski sürüme sabitlendikçe güncelleme seçenekleri daralır. Kilit kurulduktan sonra tek çıkış, her şeyi birlikte taşımak.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Büyüyen sürüm farkı:&lt;/strong&gt; aradaki sürüm sayısı arttıkça tek seferde çözülecek breaking change ve deprecated metot sayısı artar. Benim vakamda bu, onlarca kalemdi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bunların hiçbiri bugün bir hata üretmiyor ve izleme panelinde görünmüyor; hepsi yarın ödenecek. Yönetici açısından da fark bu: bozuk bir şey için bütçe istemek kolay, bozulmamış bir şeyin neden bozulacağını anlatmak zor. Kalemleri adlandırmak bu yüzden işe yarıyor, çünkü her biri bir tarihe, bir sayaca ya da bir sayıya bağlanabilir.&lt;/p&gt;
&lt;p&gt;Dört kalemin özeti şu: &lt;strong&gt;çalışıyor bugünü anlatır, risk yarının bilanço kalemidir.&lt;/strong&gt; Upgrade’in bedeli bellidir ve ödemeyi siz zamanlarsınız. Ertelemenin bedeli ise belirsizdir ve tahsilat zamanını siz seçemezsiniz.&lt;/p&gt;
&lt;aside class=&quot;tan-note&quot; aria-label=&quot;Tan diyor ki&quot; data-astro-cid-6xbnywkz&gt;&lt;p class=&quot;tan-note-head&quot; data-astro-cid-6xbnywkz&gt;&lt;img src=&quot;https://sade.dev/_astro/head-icon.BAMJxdJq_ZnUyWL.webp&quot; srcset=&quot;https://sade.dev/_astro/head-icon.BAMJxdJq_ZnUyWL.webp 1x, https://sade.dev/_astro/head-icon.BAMJxdJq_Zgjk1k.webp 2x&quot; alt loading=&quot;lazy&quot; decoding=&quot;async&quot; data-astro-cid-6xbnywkz=&quot;true&quot; width=&quot;32&quot; height=&quot;32&quot; class=&quot;tan-note-icon&quot;&gt;&lt;span class=&quot;tan-note-label&quot; data-astro-cid-6xbnywkz&gt;Tan diyor ki&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;tan-note-body&quot; data-astro-cid-6xbnywkz&gt;Yazı ertelemenin bedelini açıkça gösteriyor. Benim takıldığım yer, ispat yükünün hep upgrade&amp;#39;i önerende kalması. Yükseltmek için gerekçe isteniyor, beklemek için gerekçe soran pek çıkmıyor. İki soru da aynı masaya konsaydı “çalışıyor” cevabı bu kadar kolay kazanır mıydı?&lt;/p&gt;&lt;/aside&gt;
&lt;h2 id=&quot;ne-zaman-bırakırsınız&quot;&gt;Ne Zaman Bırakırsınız?&lt;/h2&gt;
&lt;p&gt;Upgrade etmemek de meşru bir karar olabilir; hangi durumlarda olduğunu serinin &lt;span data-scheduled=&quot;/tr/journal/upgrade-etmeme-karari/&quot;&gt;8. bölümüne&lt;/span&gt; bırakıyorum. Buradaki itirazım ertelemeye değil, ertelemenin bir karar olarak yazılmamasına.&lt;/p&gt;
&lt;p&gt;Ertelemek bilinçli bir karar olabilir; ama yazılı olmayan karar, bir gün sürpriz olarak geri gelir. Tarihi ve gerekçesi yazılmış bir erteleme risk yönetimidir, yazılmamış olan ise yalnızca unutmaktır.&lt;/p&gt;
&lt;p&gt;Bugün yapabileceğiniz tek bir şey var: kullandığınız runtime ve framework sürümlerinin destek bitiş tarihlerine bakın, bir yere yazın. Sistemin envanteri yoksa bile iki satır yeter: ne çalışıyor, desteği ne zaman bitiyor. Bir sonraki “neden?” sorusunda elinizde en azından bir tarih olur. Tarihin yanına, sistemin o güne kadar kaç sürüm geride kalacağını da yazarsanız, soru “çalışıyor mu” olmaktan çıkıp “ne zaman ödeyeceğiz” olur; konuşma da orada başlar.&lt;/p&gt;
&lt;p&gt;Kendinize sorun: bu sistemi bugün yükseltmek 1–2 günlük bir iş olsaydı yapar mıydınız? Cevap evetse, bekleyerek elde edeceğiniz şey yok; yalnız iş büyüyor.&lt;/p&gt;
&lt;p&gt;Seri buradan devam ediyor: 1. bölümde upgrade’i tetikleyen durumlar, 2. bölümde neyin yükseltileceğini görmek için envanter ve katmanlar, 3. bölümde karar matrisi; 8. bölüme kadar hedef sürüm, ön koşullar, rollout ve organizasyon.&lt;/p&gt;
&lt;p&gt;Upgrade’i ertelediğinizde riski kapatmazsınız; faturayı bir sonraki güne yazarsınız.&lt;/p&gt;</content:encoded><category>technical-debt</category><category>decisions</category><category>dependencies</category><category>opinion</category><category>Journal</category><author>info@muhammetsafak.com (Muhammet Şafak)</author></item></channel></rss>