Eski kod — sadece eski kod değildir. İşletmeye para getiren ancak geliştirmeyi yavaşlatan, çalışan bir sistemdir. Mobil geliştirmede, eski kod Objective-C ile yazılmış olabilir, güncel olmayan kütüphaneler veya mimari desenler kullanabilir. CAST Software (2024) raporuna göre, kurumsal projelerde bir kod satırının ortalama yaşı 14 yılı aşmaktadır. Eski kodla çalışma stratejisi, onun bir fren mi yoksa yönetilebilir bir varlık mı olacağını belirler.
Önemli Noktalar
Eski kod — üretimde çalışmaya devam eden ancak artık modern kalite standartlarını karşılamayan kod veya sistem. Eski kod, güncel olmayan bir dilde (örneğin, Objective-C Swift yerine) yazılmış olabilir, desteklenmeyen kütüphaneler veya uzun süredir anti-desen olarak kabul edilen mimari desenler kullanabilir.
Eski kodun temel özelliği testlerin olmamasıdır. Michael Feathers (2004)'ün tanımına göre, eski kod testleri olmayan koddur. Davranışı güvenli bir şekilde değiştiremiyorsanız, sistem yaşı ne olursa olsun eski kod statüsündedir. Birim testi olmayan yeni kod ilk günden itibaren eski koddur.
Eski kod mutlaka kötü değildir. Java 8'de iyi tasarlanmış bir sistem, coroutine'lerle Kotlin'deki karmaşık koddan daha güvenilir ve anlaşılır olabilir. Kod yaşı kalitenin bir göstergesi değildir — önemli olan sistemin ne kadar kolay değiştirilip genişletilebildiğidir.
Her başarılı sistem zamanla eski kod haline gelir. Bu doğal bir süreçtir: teknolojiler, kodun yeniden yazılabileceğinden daha hızlı gelişir. 5 yıl önce Swift 2 ile yazılmış bir uygulama, oluşturulduğu anda modern olmasına rağmen bugün eski koddur.
Eski kodun iş değeri genellikle hafife alınır. Sistem güvenilir bir şekilde çalışır, işlemleri işler, verileri depolar — yeniden yazma risk taşır. Standish Group (2024)'e göre, tamamen yeniden yazma projelerinin %35'i başarısızlıkla sonuçlanır. Ekonomik olarak eski koddan kurtulmak değil, onunla çalışmayı öğrenmek haklıdır.
En iyi stratejiler kademeli geçiş, eski kodu yeni arayüzlerin arkasında kapsülleme ve otomatik testlerdir. Eski kod, yalnızca öngörülebilir bir maliyetle değiştirilemez hale geldiğinde sorun olur.
Otomatik testlerin eksikliği — ana göstergedir. Tek bir satırı değiştirdikten sonra bir geliştirici testleri çalıştırıp hiçbir şeyin bozulmadığını doğrulayamıyorsa, eski kodla karşı karşıyasınız demektir. Ek bir belirti: dağıtım süreci saatler alır ve manuel adımlar gerektirir.
Dokümantasyon kodla eşleşmiyor — başka bir işaret. Mimari diyagramlar güncel değil, yorumlar zaten değişmiş bir davranışı tanımlıyor. Yeni bir geliştirici için öğrenme süresi bir ayı aşıyor — yüksek karmaşıklık ve düşük bakım yapılabilirliğin işareti.
Ek belirtiler: net sınırları olmayan monolitik mimari, ana doğrulama yöntemi olarak manuel test, uzun CI hattı (30 dakikadan fazla), güncel sürümleri olmayan kütüphanelerin kullanımı ve ilgili modülleri bozmadan bağımlılıkları güncelleyememe.
Kırılgan kod olgusu — bir yerdeki değişiklik diğer üç yeri bozar. Bu, modüllerin birbiri hakkında çok fazla şey bildiği sıkı bağlılığın bir sonucudur. Bağlılık ne kadar yüksekse, sistem o kadar hızlı eski kod kategorisine geçer.
Hız düşüşü — ana risk. Basit bir özellik eklemek, kodu incelemek için saatler ve test etmek için günler gerektirir. Stripe (2024)'e göre, geliştiriciler zamanlarının %33'ünü, projedeki eski kod modüllerinin varlığıyla doğrudan ilişkili olan teknik borcu aşmak için harcarlar.
Uzmanlık sızıntısı — orijinal kodun yazarları şirketten ayrılır ve dokümantasyon eksiktir. Yeni geliştiriciler bilinmeyen modüllere dokunmaktan korkar, bu da donmuş kod etkisine yol açar: modül gelişmez ancak çalışmaya devam eder. Bu tür sistemlerin otobüs faktörü kritik derecede düşüktür.
Güvenlik — güncel olmayan kütüphaneler bilinen güvenlik açıkları içerir. Java projelerinde OpenSSL 1.0.2 veya Jackson'un eski sürümlerini kullanmak, işletmeye itibar ve müşteri kaybettirebilecek güvenlik olaylarına giden doğrudan bir yoldur.
Ekip motivasyon kaybı — iyileştirme stratejisi olmadan eski kodla çalışmak geliştirici memnuniyetini azaltır. Ekip ürünle gurur duymayı bırakır, personel devir hızı artar ve bu da sistem geliştirmeyi daha da yavaşlatır.
Characterization tests — eski koddaki herhangi bir değişiklikten önceki ilk adımdır. Kodu bilinen giriş verileriyle çalıştırın ve beklenen çıktıyı kaydedin. Bu testler mevcut davranışı bir spesifikasyon olarak yakalar. Golden master testing, çıktının bir referans dosyasıyla karşılaştırıldığı bir varyanttır.
Seam analizi — davranışı değiştirmeden bağlılığın kırılabileceği noktaları bulmak. Michael Feathers birkaç tür seam tanımlar: preprocessor seam, object seam, link seam. Object seam en yaygın olanıdır: gerçek bir nesneyi bir arayüz aracılığıyla test saplamasıyla değiştirmek.
Sprout method ve Sprout class — eski kodun içine değil, yanına yeni kod ekleme teknikleridir. Mevcut bir metodu değiştirmek yerine, istenen mantıkla yeni bir metod oluşturun ve onu eskisinden çağırın. Bu, çalışan kodu bozma riskini en aza indirir.
class LegacyPaymentProcessor {
def process(payment) {
// dokunulmaması gereken 200 satır eski kod
logPayment(payment) // sprout yöntemi
}
def logPayment(payment) {
// eski kodun yanına eklenen yeni kod
}
}
Strangler Fig deseni — eski kod geçişi için önerilen yaklaşımdır. Yeni bir modül paralel olarak oluşturulur, trafik kademeli olarak eskiden yeniye yönlendirilir. Eski modül, istek almayı bıraktığında doğal olarak ölür. Desen riskleri en aza indirir ve sorun durumunda geri almayı sağlar.
Branch by Abstraction — eski ve yeni uygulamanın üzerinde bir soyutlama oluşturulan tekniktir. İstemci kodu soyutlamaya geçer ve eski uygulama kademeli olarak değiştirilir. Örnek: ağ katmanını AFNetworking'den Alamofire'a tek bir NetworkService protokolü aracılığıyla değiştirmek.
Aşamalı geçiş — geçişi küçük adımlara bölmek: eski modülü kapsülle → testler yaz → yeni modül oluştur → paralel çalıştır → eski modülü kaldır. Her adım, her an dağıtıma izin veren kararlı bir sistem durumuyla sona erer.
Sıkça Sorulan Sorular
Tamamen yeniden yazma en riskli seçenektir. Projelerin yalnızca %25'i Big Rewrite'i zamanında başarıyla tamamlar. Strangler Fig desenini uygulamak daha iyidir: ürünü durdurmadan modülleri kademeli olarak değiştirin. Her yineleme iş değeri getirir ve riskler zamana yayılır.
Characterization tests ile başlayın: modülü bilinen verilerle çalıştırın, sonucu kaydedin. Golden master testing davranışı yakalamanın basit bir yoludur. Her kod satırına dokunduğunuzda test ekleyin. 6 ay içinde gerilemelere karşı koruyan bir yapıya sahip olacaksınız.
Sistem kararlıysa, sık değişiklik gerektirmiyorsa ve diğer modüllerin geliştirme hızını etkilemiyorsa — bırakın. Bozuk değilse, tamir etme düşük değişiklik sıklığına sahip izole eski kod modülleri için makul bir yaklaşımdır. Koda yalnızca iş değişiklikleri gerektiğinde dokunun.
Anlamsal sürümleme kullanın ve adım adım güncelleyin: patch → minor → major. Her kütüphane için uyumluluk testleri yazın. Dependabot veya Renovate, güncelleme PR'ları oluşturmayı otomatikleştirir. Bir kütüphane kullanımdan kaldırılmışsa, bir soyutlama aracılığıyla değiştirilmesini planlayın.
Teknik borç ertelenen iyileştirmelerin maliyetini tahmin etmek için bir metafordur. Eski kod zaten güncelliğini yitirmiş belirli bir sistem veya koddur. Teknik borç bir ayda birikebilirken, eski kod zaman gerektirir. Her teknik borç eski kod haline gelmez, ancak her eski kod teknik borç içerir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun