AvustralyaYazılım

Miras Kod (Legacy Code) İle Çalışmak

Merhaba, 

Geçen sene Sydney’de ilk tam zamanlı işime başladığımda haliyle çok mutluydum. Yanlış anlaşılmasın hala mutluyum :). İnsan Türkiye’den dışarı baktığında bütün projelerin yenilikçi, güncel ve son trendleri takip eden, agile olan, yani bir nevi her şeyin daha düzenli olduğu hissine kapılıyor. Ne de olsa bunlar yabancılar ileri teknolojiyi bunlar geliştiriyor. Ancak kazın ayağı öyle değil, Türkiye’de yaşadıklarımı aratmayacak projeler çıktı karşıma hep. 

Bu makalenin konusu projeye yaklaşık 10 yıl önce başlanmış ve haliyle içindeki frameworkler, yazım metodolojisi aklınıza gelebilecek her şey eski. Bu yazı serisi bu çağ dışı kod ile benim nasıl boğuştuğumun yazısı olacak. Bu uygulama iç müşterilerin kullandığı bir web uygulaması ve MVC3, C#, Jquery, NHibernate, Fluent gibi teknolojiler ile geliştirilmiş ve geliştiriliyor. Her gün aktif bir şekilde 3 ayrı ülkede (Avustralya, İngiltere ve Amerika) 100’ün üzerinde kullanıcı ve 2000’den fazla müşteriye hizmet veriyor. Bir müşteri yönetim sistemi denebilir.

Kodu açar açmaz göze çarpan problemler(code smells)

  • Değişken adları anlamsız. Mesela, repository ‘r’ olarak isimlendirilmiş, 1’den fazla varsa ‘r1’, ‘r2’ diye gidiyor.
  • Metod adları manasız. DefaultPrice adında bir method var ve 4–5 ayrı yere kayıt atıyor. Bu methodun amacı ne anlamak mümkün değil.
  • Magical string’ler her yerde. Müşteriye, kullanıcıya ve değişik id’lere göre if kodları var. Yani eğer müşteriId 23 ise default price 0 olsun gibi.
  • Sorgu cümleleri string olarak controller actionların içinde. Select, insert update ve delete sorgularının %90’ı strıng birleştirme yoluyla method içinde oluşturuluyor.
  • View Model ?! O da ne. ViewModel kullanılmamış. NHibernate’in oluşturduğu bütün classlar doğrudan view’da kullanılıyor.
  • Çok uzun methodlar var.1200 satırlık bir method var. Adı UpgradeClient. Bu koda dokunmak yürek istiyor. Neresinden tutsan elinde kalıyor.
  • S.O.L.I.D.’in sadece S’si değil hiç bir harfi yok. Hiçbir method tek bir iş yapmıyor.

Sonradan farkedilenler.

  • Her ülke için en az 2 database server var(1mysql, 1mssql). 8 tane connection string. Bu kadar çok connection string hem kafa karıştırıyor hem de aynı amaca hizmet eden farklı connection stringler var.
  • Herkes kafasına göre geliştirme yapıyor. Kod standardı yok. Aynı işi yapan bir dolu method var. Aynı class’ın içinde 5 ayrı Email gönderen method var. Aralarında birebir aynı işi yapan da var.
  • Kodda goto kullanılan yerler var! Goto kullanımını herhalde bir 15 yıldır görmemiştim iyi oldu hatıralarım canlandı.
  • Hiç Unit Test yok. Daha doğrusu 3–5 tane yazmışlar zamanında o kadar. Yazılan o 3–5 test de çalışmıyor zaten.
  • Bağımlılıklardan(dependencies) test yazmanın da imkanı yok. Test yazmak imkansız, her şey iç içe geçmiş durumda.
  • Database değişikliklerini takip etmenin imkanı yok. Bir yer patlak verince anlaşılıyor. Database’de bir değişiklik yapıldığında onu 3 ülkenin tüm databaselerinde yapmak gerek unutursan patlar.
  • Visual Studio’nun kod analiz aracı bize yönetilebilirliğin 0 olduğu methodlar olduğunu gösteriyor. Calculate Code Metrics’i çalıştırınca maintainibility 0 olan bir dolu method bize kodun ne kadar yönetilemez olduğunu kanıtlıyor.
  • Herşey manuel. Kod canlıya copy paste ile çıkılıyor. DevOps yapılmak isteniyor ancak mevcut durumda uygulamak gerçekten çok zor.

Bu durumda siz ne yapardınız bunu bir düşünün bakalım. Bu arada şirket yeni yeni büyüdüğü için işleri otomatize etmek istiyor ama altyapı pek uygun değil ve şirket kültürü de buna tam uyum sağlayamamış. Yani herşey eskisi gibi olsun istiyor insanlar. 

Aklınıza her yazılımcı gibi yeniden yazalım bunu falan gibi fikirler gelebilir ancak hepimiz biliyoruz ki bu çok düşük bir ihtimal. Zaten çalışan ürün var elimizde neden tekrar yazalım ki bir daha? (Haklı olarak patron bakışı)

Yani bu kodu ufak ufak dokunuşlar ile refactoring yapıp yönetilebilirligini(manageable) arttırmak hem de yeni geliştirmeleri yapmak gerekiyor. Burada şunu da eklemem gerek. Şirket durumun farkında ve bunu değiştirip modern bir yapıya geçmek istiyor. Çünkü artık işler büyüyor ve bu yapı ile daha ileri gitmenin mümkün olmadığı da açık.

Bu bölüm ilerleyen makalelere bir giriş olsun diye içinde bulunulan durumu özetlediğim çok parçalı bir makalenin birincisidir. Devamı haftaya…

2.Bölüm

Leave a Reply

Your email address will not be published. Required fields are marked *