Kafayı yiyecektim cidden. Şu eski, kimsenin dokunmaya cesaret edemediği, belki 10 yıllık bir modül var ya, işte ona yeni bir özellik eklemem gerekiyordu. İçinde ne global değişkenler var, ne anlaşılmaz goto'lar... Dokunursam her şeyi bozacağım korkusuyla, onunla direkt konuşmak yerine, etrafına bir "proxy katman" örmeye karar verdim. Meğerse yaptığım şey, yeni bir legacy katmanı yaratmaktan başka bir şey değilmiş.
Korkunun Mantığa Etkisi
Düşünüyordum ki, "Eski koda dokunmuyorum, sadece onu sarmalayan, kontrollü bir arayüz yazıyorum. Güvenli." Ama bu arayüz de, eski kodun tuhavvi davranışlarını (mesela bazen null dönmesi, bazen boş string) yeni koduma taşımak zorunda kaldı. Sonra bu arayüze bağlı başka bir helper yazdım. Sonra o helper'ı kullanan bir servis... Bakmışım, monolith'in üstüne, eski kodun tuğlalarından örülmüş yeni bir monolith inşa etmişim.
Kısır Döngü ve Farkındalık
Fark ettim ki bu, bir kısır döngü. Eski kod korkunç → Dokunmaktan kork → Etrafına yama yap → Yama da zamanla eskiyor → Yeni biri gelip yamadan da korkmaya başla. Technical debt (teknik borç) değil de, sanki teknik faiz tuzağına düşmüşüz. Her yeni özellik, o ilk lanetli modülden daha uzaklaşmak yerine, ona daha sıkı bağlanmamıza neden oluyor.
Çıkış Yolu? (Belki)
Artık şu stratejiyi denemeye çalışıyorum: Yeni bir şey yapmadan önce, o eski kodu anlamak için küçük, izole testler yazıyorum. Ne yediğini, ne kustuğunu anlamaya çalışıyorum. Sonra, mümkünse onu tamamen değiştirmek yerine, küçük adımlarla refactor etmeye başlıyorum. "Önce çalışsın, sonra düzeltirim" mantığı, beni bu bataklığa sürükleyen ana şeydi.
Siz de böyle "korkudan doğan yeni legacy kodlar" yazıyor musunuz? Bu kısır döngüyü kırmanın daha akıllıca, risksiz (ya da daha az riskli) bir yolu var mı? Yoksa hepimiz birer "legacy inşaat ustası" mı olacağız?
Düşünüyordum ki, "Eski koda dokunmuyorum, sadece onu sarmalayan, kontrollü bir arayüz yazıyorum. Güvenli." Ama bu arayüz de, eski kodun tuhavvi davranışlarını (mesela bazen null dönmesi, bazen boş string) yeni koduma taşımak zorunda kaldı. Sonra bu arayüze bağlı başka bir helper yazdım. Sonra o helper'ı kullanan bir servis... Bakmışım, monolith'in üstüne, eski kodun tuğlalarından örülmüş yeni bir monolith inşa etmişim.
Java:
// Eskisi (Dokunulmaz)
public class LegacyMonster {
public static Object doWeirdThing(String input) {
// ... 500 satır korku filmi
}
}
// Benim "Çözümüm" (Yeni Legacy)
public class LegacyWrapper {
public CleanResult doThingSafely(String input) {
Object weirdOutput = LegacyMonster.doWeirdThing(input);
// 100 satır daha, weirdOutput'u temizlemeye çalışan kod
return new CleanResult(); // (Belki)
}
}
Fark ettim ki bu, bir kısır döngü. Eski kod korkunç → Dokunmaktan kork → Etrafına yama yap → Yama da zamanla eskiyor → Yeni biri gelip yamadan da korkmaya başla. Technical debt (teknik borç) değil de, sanki teknik faiz tuzağına düşmüşüz. Her yeni özellik, o ilk lanetli modülden daha uzaklaşmak yerine, ona daha sıkı bağlanmamıza neden oluyor.
Artık şu stratejiyi denemeye çalışıyorum: Yeni bir şey yapmadan önce, o eski kodu anlamak için küçük, izole testler yazıyorum. Ne yediğini, ne kustuğunu anlamaya çalışıyorum. Sonra, mümkünse onu tamamen değiştirmek yerine, küçük adımlarla refactor etmeye başlıyorum. "Önce çalışsın, sonra düzeltirim" mantığı, beni bu bataklığa sürükleyen ana şeydi.
Siz de böyle "korkudan doğan yeni legacy kodlar" yazıyor musunuz? Bu kısır döngüyü kırmanın daha akıllıca, risksiz (ya da daha az riskli) bir yolu var mı? Yoksa hepimiz birer "legacy inşaat ustası" mı olacağız?