5000 satır kopyala-yapıştır
Yaklaşık 5000 satırlık kopyalanmış kod nasıl bir yüke dönüştü — ve onu ortadan kaldırmak bize soyutlamanın doğru zamanı hakkında ne öğretti. Bir kahramanlık hikâyesi değil, alınmış bir ders.
Bu nedir? · Mühendislik Hikâyesi
Edinilmiş bir tecrübe — bir hata, oluşma sebebi ve kazandırdığı ders. Gizli, müşteri bilgisi olmadan, dramasız. Hata bir kahraman değil, bir öğretmendir. Genel bakışa git
- Yazar
- Batunet Engineering
- Okuma süresi
- 4 dk
- Seviye
- İleri düzey
- Durum
- Onaylandı
Bu sayfada
Bu hikâye, başlangıçta hata olarak fark edilmeyen bir hatayı anlatıyor; çünkü tam tersi gibi görünür: dikkatli olmak gibi. Hikâye bilinçli olarak genel tutuldu — sistem, kişi ve tarih belirtilmeden. Geriye ders kalıyor ve bu ders tek bir vakanın çok ötesinde geçerli.
Durum
Zamanla büyümüş bir kod tabanında, pek çok yerde yerine getirilmesi gereken tekrarlayan bir görev vardı. İlk seferinde yazıldı. İkinci seferinde kopyalandı. Üçüncü seferde kopyalamak artık alışkanlık olmuştu. Zamanla sisteme dağılmış, neredeyse aynı olan yaklaşık 5000 satırlık bir kod birikimi oluştu — her kopya biraz uyarlanmış, hiçbiri diğeriyle tam olarak aynı değil.
Başlangıç varsayımları
Bunun arkasındaki varsayım tembellik değil, bilinçli ve savunulabilir bir tutumdu: Kopyalamak güvenlidir. Her kopya bağımsızdır; burada yapılan bir değişiklik orada hiçbir şeyi bozamaz. Ortak bir soyutlama ise bütün bu yerlerin gerçekten aynı şeyi kastettiğine dair bir bahis olurdu — ve yanlış bir soyutlama, tekrardan daha pahalıdır. Konunun biçimi netleşmediği sürece beklemek doğru karar gibi görünüyordu. O noktaya kadar bu tutum gerçekten de doğrudur.
Sorun
Zamanla bu denge tersine döndü. Güvenlik olarak düşünülen şey bir yüke dönüştü. Ortak kural değişecek olduğunda onu birçok kopyada aynı anda değiştirmek gerekiyordu — ve hepsinin bulunduğundan asla emin olunamıyordu. Kopyalar birbirinden uzaklaştı: Bir yerde yapılan düzeltme diğerlerine ulaşmadı ve aynı görev, hangi kopyanın çalıştığına göre farklı davrandı. "Bağımsız" olan "tutarsız" hâle gelmişti; üstelik bu dönüşümü işaretleyen tek bir gün olmadan.
Neden
Asıl neden tekrarın kendisi değildi — kod tekrarı meşru bir araçtır. Neden, gözden kaçan bir sinyaldi. Tekrar, kopyalar gerçekten bağımsız olduğu ve ayrı ayrı geliştiği sürece ucuzdur. Kopyalar birlikte değişmeye başladığı anda pahalılaşır — çünkü o noktada artık tesadüfen benzeyen kod parçaları değil, birçok sürümü olan tek bir kuraldır. Bu sinyal mevcuttu: Bu yerler hep birlikte değişiyordu ve birbirinden uzaklaşıyordu. Hata, sinyali uzun süre olduğu gibi okuyamamaktı.
Karar
Karar, biçim nihayet netleştiğinde verildi — hem de tam da net olduğu için. Çok sayıdaki kopya zamanla ortak kuralın gerçek şeklini görünür kılmıştı; daha önce bu şekil ancak tahmin edilebilirdi. Artık bir bahis söz konusu değildi: Soyutlama erken değil, kanıtlanmıştı. Böylece kod konsolide edildi — ortak görev tek ve net bir yere kavuştu.
Uygulama
Yeniden yapılandırma tek bir sıçramayla değil, küçük ve geri alınabilir adımlarla yapıldı. Önce gerçek ortaklık ayıklandı — tüm kopyaların gerçekten paylaştığı şey, yalnızca tesadüfen aynı görünenden ayrıldı. Bu ortaklık net bir sınırın arkasında tam olarak bir kez ifade edildi. Ardından kopyalar tek tek buna geçirildi; her birinde, herhangi bir iyileştirme yapılmadan önce davranışın değişmeden kalması hedeflendi. Sonunda kod miktarı yaklaşık yüzde 90 küçülmüştü — aynı yetenek, birçok yer yerine tek bir yerde.
Ödünleşimler
Konsolidasyon bedava değildir ve her zaman doğru değildir. Artık tek bir soyutlamanın bakımı yapılmalıdır; daha önce dağınık olanı bir araya toplar ve o tek yeri önemli kılar. Erken tekrarın bedeli — yani beklemek — tek bir kopyadan daha pahalı olacak yanlış soyutlamayı kurmamanın bilinçli karşılığıydı. Kopyalar gerçekten bağımsız kalsaydı farklı karar verirdik: O durumda birleştirmek, ayrı durması gereken şeyleri birbirine bağlayan bir hata olurdu.
Öğrendiklerimiz
Ders ne "asla kopyalama" ne de "her zaman soyutla". İkisi de dogmadır ve dogmalar düşünmenin yerini alır. İşe yarayan soru şudur: Bu yerlerin birlikte değişmesi gerekiyor mu? Cevap hayır olduğu sürece tekrar ucuz ve dürüsttür. Cevap evet olduğu anda — kopyalar birlikte hareket etmeye başladığı anda — soyutlamanın zamanı gelmiştir ve o zaman bunu kararlılıkla yapmak gerekir. DRY, birbirine ait olan bilgiyi hedefler; tesadüfen aynı görünen satırları değil. Hata hiçbir zaman kopyalamakta değildi; dönüşümü fark etmemekteydi.
Bu deneyim Batunet'i nasıl değiştirdi
O günden beri "Don't Repeat Yourself" ilkesini bir kural olarak değil, bir soru olarak ele alıyoruz — ve bu soruyu code review'larda bilinçli olarak soruyoruz: Bu kısım birlikte mi değişiyor? Kopyalar bağımsız olduğu sürece vicdanımız rahat şekilde kopyalıyoruz ve artık bağımsız olmadıklarına dair sinyale dikkat ediyoruz. Gözden kaçan bir dönüşüm, bakma alışkanlığına dönüştü. Bedelini kendiniz ödediğiniz bir dersin değeri budur: Çalışma biçiminizin bir parçası hâline gelir.
İleri okuma
- Rehber: On yıl sonra hâlâ çalışan yazılım — bağlılık (coupling) ve değiştirilebilirlik neden yazılımın ömrü boyunca belirleyicidir.
- Karar: Başlangıç noktası olarak modüler monolit — yapıyı önceden değil, bir sorun gerektirdiğinde eklemek.
- Uygulama kılavuzu: Legacy bir monoliti modernize etmek — küçük, geri alınabilir adımlarla konsolidasyon.
- Bakış açısı: Erken soyutlama neden karmaşıklık yaratır — yanlış soyutlama, tekrardan daha pahalıdır.
- Sözlük: DRY (Don't Repeat Yourself) — satırları değil, bilgiyi bir kez ifade etmek.
İyi dersler geriye dönüp bakıldığında apaçık görünür. Değer, onları bilmekte değil, geçerli oldukları anı fark etmektedir.
Referans verilen bileşenler
Mühendislik yolculuğunuza devam edin.
Bağlantılı kavramlar, stratejik kararlar, rehberler ve yaklaşımlar — bir link yığını olarak değil, tutarlı bir akış halinde.
Mühendislik kararları
Uygulama kılavuzları
Bakış açıları
Bu alanda somut bir projeniz mi var?
Referans rehberleri düşünce yapımızı yansıtır. Kendi sisteminiz için doğrudan yönetimle konuşun — teknik düzeyde, satış baskısı olmadan.
