Eski bir kod tabanında, neyin kullanıldığını ve neyin kullanılmadığını hemen nasıl öğrenebilirim?


21

Bana, bu kod tabanını koruyan bir sözleşmenin yapılmasının öncüsü olarak, önemli bir eski kod tabanının göründüğünü değerlendirmem istendi.

Bu ilk kez bu durumda değilsin. Bu örnekte, kod, bir kerede en az binlerce oyuncuyu destekleyen oldukça yüksek profilli ve oldukça yüksek yüklü bir çok oyunculu oyun sitesi içindir. Bu tür pek çok site olduğu gibi, bu bir ön ve arka uç teknolojilerin bir karışımıdır.

İçeriden dışarıdan görüldüğü gibi yapı, bir karmaşa. Her yerde "_OLD" ve "_DELETE" ekli klasörler var. Klasörlerin birçoğunun hiçbir amacı yok gibi görünüyor veya çok şifreli adları var. Meşru görünümlü klasörler içinde bile etrafta herhangi bir sayıda eski, kullanılmayan komut dosyası olabilir. Sadece bu değil, şüphesiz başka türlü işlemsel komut dosyalarında bile çok sayıda geçersiz kod bölümü var (çok daha az acil bir endişe).

Bu, yerleşik görevlilerden, sitenin orijinal geliştiricilerine / servis sahiplerine geri dönüşüdür. Bu tür senaryolarda anlaşılır bir şekilde tipik olduğu gibi, görevli, sözleşmeyi ve yasal olarak yeni seçilen bakana itmek için gerekli olanların dışında devir ile hiçbir şey yapmak istemez. Bu yüzden mevcut site yapısı hakkında bilgiyi görevlinin dışına çıkarmak sadece söz konusu değil.

Kod tabanına girmek için akla gelen tek yaklaşım sitenin kökünde başlamak ve yavaşça ama kesinlikle bağlantılı komut dosyalarında gezinmek ... ve muhtemelen yüzlerce kullanımda olan ve olmayan yüzlerce kişi var. Sitenin önemli bir bölümünün Flash uygulamasında olduğu göz önüne alındığında, özellikle eski Flash uygulamalarında, diğer komut dosyalarına bağlantılar metin dosyalarından (.AS / ActionScript) değil, ikili dosyalara (.FLA'lar) gömülebildiğinden, bu daha da kolaydır.

Bu yüzden, herhangi birinin kod temeli değerlendirmenin bir bütün olarak değerlendirilebilirlik açısından nasıl yaklaşılacağı konusunda daha iyi önerileri olup olmadığını merak ediyorum. Web sunucusunun işletim sistemindeki dosyalara bir erişim sıklığı grafiğine bakmanın bir yolu olsaydı harika olurdu, çünkü bu, hangi dosyaların daha kritik olduğu konusunda bir fikir verebilir. Hiç kullanılmamış dosyaları elimine edebilme (bazı dosyalar yılda yalnızca bir kez kullanılabildiğinden).


7
Flash hakkında yeterince bilgim yok, ancak kod yokken derleme hataları alırsanız, başvuruda bulunup bulunmadıklarını görmek için klasörleri yeniden adlandırabilirsiniz.
Oded

Kötü çözüm: Bunları silin ve hataları / hata raporlarını bekleyin. (Sadece kurtarılabilir olduğundan emin olun!)
Izkata

1
@Nick Bir sonraki sözleşme aşamasının bir parçası olarak değerlendirme için para alıp alamayacağınızı, hala teklif vermek zorunda olduğunuzu veya başka bir şekilde elde etmek zorunda olup olmadığınızı açıklayabilir misiniz? Cevabınız "bir araç var" sorusunu değiştirmeyecek, ancak bazılarımız yanıtları yeniden oluşturabiliriz: durumunuza daha iyi uyan bir süreç (örneğin sizi mahvetmekten alıkoymak gibi).
jcmeloni

@jcmeloni Hayır, değerlendirme için para alamıyorum. Ancak tecrübelerime ve son birkaç gündür aldığım küçük şeylerden, şu anda masada başka hiç kimse yok. Yetenek setim oldukça sıra dışı, bu yüzden alıntılara dayanarak rekabet edebilecek başka kimseye sahip olmadıkları için daha da rahatım. Söz konusu asıl teklif, müşterimden müşterime, sözleşmeyi yeniden vermeyi planlayan müşterisine. Gerçekten de, sonumdan beri, söz konusu teklifi vermelerine yardımcı olmak istiyorum . HTH.
Mühendis

@Oded Rename, deneme yanılma silinmesinden kesinlikle daha kolaydır! Orada iyi düşünüyorum. Kutuda bir araç daha var.
Mühendis

Yanıtlar:


32

Yapmanız istendiğinde , müşterinize bu kod üzerinde yapılacak herhangi bir çalışma için diğer müşteriye (kabusun sahibi) uygun bir teklif yazması için girdi sağlamak olduğundan , devam edeceğim. Bir uzuv ve bu noktada bu satırlar boyunca kapsamlı bir test veya yeniden yapılanma veya herhangi bir şey yapmayacağınızı söyleyin. Kaba bir tahminde bulunmak için muhtemelen çok kısa bir zamanınız vardır. Cevabım aynı durumdaki tecrübelerime dayanıyor ve eğer yorumum yanlışsa, izleyen her şeyi göz ardı et.

  • Hangi sayfaların ve içeriğin ne olduğu hakkında bir fikir edinmek için bir örümcek aracı kullanın. Temel bir linkchecker aracı bile - "denetim amaçlı örümcek" aracı değil - bu konuda faydalı olacaktır.
  • Temel bir denetim / envanter tablosu oluşturun. Bu, dosyaların bir listesi ve dizin tarafından düzenlenen son değiştirilme süreleri kadar basit olabilir. Bu kapsamda bir fikir edinmek yardımcı olacak ve size _OLD ve _DELETE gibi dizinlere olsun a) değerlendirme şeyler dayandığını büyük bir not yapabilirsiniz değil de bu dizinlere b) bu dizinlerin bulunması ve potansiyel için Kaba / gizli kabuslar , müşterinizin teklifinde bir şekilde dikkate alınması gereken daha derin sorunlara işaret eder . _OLD veya _DELETE'deki muhtemel sorunları numaralandırmak için bir milyon yıl harcamak zorunda değilsiniz; bilgi nihai teklife eklenecektir.
  • Tamamen web tabanlı bir uygulama gibi sesleri gözden geçirdiğinize göre, standart log analizörü araçları bile arkadaşınız olacak. E-tabloya, "bu, erişilen komut dosyalarının ilk 10'unda" ifadesini veya bazılarını ekleyebileceksiniz. Komut dosyaları Flash dosyalarına gömülü olsa ve bu nedenle büyük olmasa bile, POST veya GET üzerinden erişilmeleri ve sunucu günlüklerinde görünmeleri yüksek bir olasılıktır. 100'e (veya tam tersi) değil, 10 tane yüksek erişilebilir kodunuz olduğunu biliyorsanız, bu size bakım çalışmalarının nasıl olacağı konusunda iyi bir fikir verecektir.

Karmaşık bir sitede bile, yukarıda özetlediğim şey, bir gün veya bir buçuk günde yapabileceğiniz bir şey. Sen vereceksin cevap beri senin istemci bu" gibi bir şey burada popo muazzam ağrı olacak ve olduğu buna göre teklif bu yüzden, sadece bir domuz üzerinde ruj koyarak olacak bazı nedenleri aşağıda "veya" herhangi bir makul kişi, sürdürmemeyi, baştan başlamayı teklif eder, bu yüzden buna göre teklif vermelisiniz "veya hatta" bu fena değil, ama belirli bir zaman diliminde tutarlı bir iş akışı olacaktır, bu nedenle teklif verin " Mesele şu ki , teklif verecekler ve bu nedenle, tam bir içerik ve mimari denetimi yapmak için doğrudan işe alınmış olsaydınız, olacağınız kadar kesin olmanıza gerek kalmayacak.


2
+1 Bu harika bir cevap. Bu +5 düğmesi nerede ...
Mühendis

1
TL; DR: mecbur kalana kadar kendini bir tavşan deliğine atma. :)
jcmeloni

4

" Eski Kodla Etkili Çalışma " kitabındaki kalıpları kullanarak mevcut kaynak kodunu (yeniden yazma yerine) yeniden düzenlemeyi şiddetle tavsiye ederim .

Kitap, ünite testlerinde eski kodların verimli bir şekilde kapsanması için çeşitli mekanizmalar hakkında ayrıntılı bilgi verir, böylece daha sonra kodu güvenli bir şekilde yeniden düzenlemeye başlayabilirsiniz. Kitap, bölümün, yaklaşımın arkasındaki felsefeyi tanımlayan bölümleri ve daha sonra “Değişiklik yapmak sonsuza dek sürecek”, “Çok fazla zamanım yok ve onu değiştirmeye ihtiyacım var” gibi belirli sorunları çözen birkaç bölümden oluşuyor. ve "Bu sınıfa bir test donanımına giremiyorum". Bu bölümlerin her birinde, testte gerçek dünyadaki sorunlara en iyi uygulamaları nasıl uygulayacağınızı öğrenmenize yardımcı olan ayrıntılı ve kanıtlanmış teknikler bulunmaktadır.

Kitabı okumak beni “yalnız değiliz” ... ve birçoğumuzun veya belki de hepimizin yönetimi zorlaşan karmaşık kod tabanlarıyla çalıştığı hissi verdi. Kitapta listelenen teknikler bana çok umut verdi ve ben onları hemen hemen uygulayabildim.

Joel Spolsky'nin blog yazısı, sıfırdan başlamak yerine neden var olan bir çalışma kodu tabanını tutmanın en iyi nedenini açıklamak için harika bir iş çıkardı. Özetleyen makaleden bir alıntı seçtim, ancak harika bir okuma.

“Programcıların her zaman kodu atmak ve yeniden başlamak istemelerinin ince bir nedeni var. Bunun nedeni, eski kodun bir karışıklık olduğunu düşünmeleridir. Ve işte ilginç gözlem: muhtemelen yanlışlar. Eskileri düşünmelerinin nedeni kod bir karmaşadır, çünkü kardinal, temel programlama yasasıdır:

Kod okumak, yazmaktan daha zor. ". - http://www.joelonsoftware.com/articles/fog000000000069.html


4
+1. Joel'in yorumuna cevaben, "Çok iyi olmamalı." Çünkü sorunu doğal olarak görmüyorum. Kısmen pek çok insanın kodlu kod yazdığı ve umursamadığı gerçeği olarak görüyorum, diğerleri ise oldukça iyi kod yazıyor, ancak sadece basit olan "kendini belgeleyen kod" kavramıyla yaşıyorlar. Birinin kendi kodlama stili gizlilik içinde tüm isteklerini dile getirir, ancak kamuya açık kod tabanları söz konusu olduğunda yarın yokmuş gibi yorumlar ortaya çıkar. Acıtmaz. Ve son olarak, eski bir kod bazında, sıkı bir zaman bütçesiyle işleri yürütmek zorunda olan insanlar var.
Mühendis

2

Tipik bir Java kod tabanında, PMD, FindBugs veya Sonar gibi araçları kullanmayı düşüneceğim ve sonra raporlama araçlarını (ölü kod, belgelenmemiş kod, kopya kod vb.) Anlamaya çalışacağım.

Raporlara dayanarak uygulamanın / sitenin farklı katmanlarını bulmaya çalışacağım (işletme katmanı, DB, SQL, vb.)

Katmanlar birleştirilirse (sunucu uygulamasında html, java kodunda sql) önce bu adımların her birinin ayrıştırılmasıyla başlayacağım, izole edilmiş sayılmalı ve her birinin sonunda bir şube açıp sonra birleştirme işlemini gerçekleştirebilirsiniz. .


1
Teşekkürler. Her ne kadar cevabınız Java’ya özgü olsa da, katmanlı yaklaşımınızı görmek, soğan soymak, tabiri caizse görmek ilginç. Düşünmek için bir şey.
Mühendis

1

Açıklamanızdan, bu kodun sürdürülemez bir duruma geldiği görülüyor, bu da en iyi yaklaşımın muhtemelen tam bir yeniden yazma olduğu anlamına geliyor. Geliştiricilerin dağınık bir kod tabanını sürdürülebilir kılmak için çalışan kaliteli araçlar olsaydı, çok daha küçük bir maaşları olurdu. Eski gereksiz kodu klasörlerden temizlemek ve temizlemek mümkündür, ancak bu manuel bir görevdir ve makul bir süre olmadan hiçbir şey yapmazsınız. Burada sadece tahmin ediyorum, ancak çalışan kodun kendisi de dosya yapısı kadar karışık bir durumdur, bu da aktif olarak çalışan koda göre kod tabanının kırpılmasını sağladığınızda bile bir kabus olacağı anlamına gelir. Herhangi bir şeyi güncellemek veya düzeltmek için

Mevcut kodu elde etmek için gereken çabanın korunabilir bir durumda olması gerektiğinin, bir yeniden yazmaya başlamadan eşit veya daha büyük olacağını vurguluyorum. Bir şeyleri korumanın bir kısmı, "kulübenin arkasına alın ve ne zaman vurulacağını" bilmek.


Normalde, yeniden yazma ve yazma yaklaşımında seninle% 100 olurdum. Ancak bu durumda (ve en azından şimdilik), sadece birkaç hafta sürecek olan daha kapsamlı bir revizyondan ziyade, sadece siteyi korumak için çalışmam için bana para ödenecek. Ayrıca, şu anda yapmak istesem bile, bunu yapmaktan ve hareket halindeyken yaptığım diğer sözleşmelerden vazgeçmekle yetinemedim, çünkü bunun için haftalık uygunluğum açıkça sınırlı - birincil sözleşmem yerine getirilmeli. Haftada en az 40 saat.
Mühendis

1
Atmak ve yeniden yazmak ile katılmıyorum! Gönderen joelonsoftware.com/articles/fog0000000069.html ... "Orada programcılar her zaman kod atmak ve baştan başlamak istiyorum ince bir sebebi sebebi eski kod bir karışıklık olduğunu düşünüyorum olmasıdır. Bu. Ve burada ilginç bir gözlem : Muhtemelen yanlıştırlar. Eski kodun bir karışıklık olduğunu düşünmelerinin nedeni, kardinal, temel bir programlama yasasıdır: Kod okumak, yazmaktan daha zordur. ” Bunun yerine, refactoring'i şiddetle tavsiye ederim: amazon.ca/Working-Effectively-Legacy-Michael-Feathers/dp/…
Kyle Hodgson

1
@KyleHodgson bazen kod aslında bir karışıklıktır ve bu noktada okumadan önce kodu bulmak için bir karışıklık olduğu zaman, başlama zamanı.
Ryathal

Evet, sanırım bu kitap okunmaya değer gözükse de, o kadar açık değil. Kod tabanının boyutuna / karmaşıklığına ve işi yapmak için mevcut olan sıcak gövdelere çok bağlıdır.
Mühendis

1

Bir web tarayıcısı, hangi URL’lerin erişilebilir olduğunu belirlemenize yardımcı olabilir. Özellikle Flash veya JavaScript’ten bağlantılar çıkaracak kadar akıllıysa. Bir web sayfanızın listesine sahip olduktan sonra, üzerinden gidin ve başvurdukları dosyaları listeleyin. Bu işlemden sonra kalan her şey ölü kod olarak kabul edilmelidir.


1
Son cümleyle kesinlikle aynı fikirde değilim. Paletli, hangi sayfaların tek bir veya çoklu başlangıç ​​noktalarıyla yönlendirilmiş grafik olarak birbirine bağlandığını öğrenebilir. Ancak, bir web sitesinden bahsederken, diğer sayfalara bağlantı veren ancak bunlara işaret eden hiçbir bağlantı bulunmayan "açılış sayfaları" olarak da adlandırılır. Ayrıca, diğer sayfalarla bağlantısı kesilen eski idari arayüz parçaları olabilir. Şu anda bu tür bir projem var.
scriptin

0

Not: Siz kodun kullanımına ilişkin sorular sorurken veritabanı kullanımına vurgu yapıyorum. Cevap, bahsettiğim her noktada her iki durumda da geçerlidir.

Son paragrafta kendi sorunuzu kısmen yanıtladınız: uygulama çalışırken neyin erişildiğini görün.

  1. Sen isteyebilirsiniz veritabanını profil ve bir gün için tüm sorguları kayıt profilleyici sormak. Size en çok kullanılan veritabanı nesnelerine genel bir bakış verecektir, fakat hangilerinin hiç kullanılmadığını söylemeyecektir. Ayrıca, sonuçlara hala dikkat etmeniz gerekir: örneğin bir tablo yalnızca saklı yordamlar aracılığıyla kullanılabilir, ancak profildeki sorgulara baktığınızda, tablo hiç kullanılmamış gibi görünür.

  2. Kaynak kodunu incelemek, sorguları aramak daha yararlıdır ve tüm sorguları topladıktan sonra, sıklık açısından değil (bu bir profilleyicinin kullanışlı olduğu yerdir) değil, kullanılan / değil açısından veritabanı kullanımını iyi bir şekilde anlayabilirsiniz. kullanılan tablolar. Ne yazık ki, yıllarca kodlanmış temelde kötü yazılmış / tutulmayanlar için , özellikle sorgular dinamik bir şekilde oluşturulmuşsa, son derece zor olabilir ve hataya açık olabilir (a select, tablonun adı olarak bir parametre kullanan bir yöntem hayal edin ; kaynak koduna bakarak parametrenin olası değerlerinin ne olduğunu biliyor olabilirsiniz?).

  3. Statik analiz ve bazı derleyiciler ölü kodu da ortaya çıkarabilir, ancak yine de istediğiniz cevabı vermez.

  4. Verilerin kendisinin veya veritabanı meta verilerinin analizi bazı ilginç bilgileri ortaya çıkarabilir. Örneğin, tablo iddia etmek kolay olurdu LogonAudit(uniqueidentifier LogonAuditId, datetime LogonEvent, ...)o 10 000 2006 2009 yıl boyunca günde kayıtları ve eylül ne kayıt, 18 içeriyorsa artık kullanılmaz th , 2009. Aynı a için geçerli değildir çoğunlukla salt okunur olması için girilen verileri içeren tablo.

Bu dört nokta birlikte kullanılan tabloların bir listesini verecektir. Kalanlar kullanılmış veya kullanılmamış. İddialar yapabilir ve bunları test edebilirsiniz, ancak iyi ünite testleri kapsamı olmadan, kolay olmaz. Herhangi bir "kolay" yol da başarısız olur. Örneğin, bir products_delme_not_usedtablonuz varsa, tablonun hiç kullanılmadığını ve kodunuzda "products_delme_not_used" ifadesini kontrol edebilirsiniz. Bu iyimser: DailyWTF adayını eski bir kod tabanında bulmak alışılmadık bir durum değil:

// Warning: WTF code below. Read with caution, never reuse it, and don't trust
// the comments.

private IEnumerable<Product> GetProducts()
{
    // Get all the products.
    return this.GetEntities<Product>("PRODUCT");
}

private IEnumerable<T> GetEntities<T>(string tableName)
{
    // Everyone knows that SQL is case sensitive.
    tableName = tableName.ToLower();

    if (tableName == "user" || tableName == "product")
    {
        // Those tables were renamed recently in the database. Don't have time
        // to refactor the code to change the names everywhere.
        // TODO: refactor the code and remove this `if` block.
        tableName += "s";
    }

    if (this.IsDelme(tableName))
    {
        // We have some tables which are marked for deletion but are still
        // used, so we adjust their name.
        tableName = this.Delme(tableName);
    }

    return this.DoSelectQuery<T>("select top 200 * from " + tableName);
}

private bool IsDelme(string name)
{
    // Find if the table is among candidates for removal.
    List<string> names = this.Query<string>("select Names from DelmeTables");
    return names.Contains(name);
}

private string Delme(string name)
{
    // Return the new name for a table renamed for deletion.
    return string.Join("_", new [] { name, "delme", "not", "used" });
}

Bu kodun gerçekte products_delme_not_usedtablo kullandığını öğrenebilir misiniz ?

Yerinde olsam, olurdum:

  1. Tüm veritabanı nesnelerini yerinde tutun,
  2. Tüm başvuruyu yeniden yansıtmak (buna değdi ise),
  3. Belge (yeniden düzenleme yapılırken) uygulamayı ve özellikle veritabanı kullanımını.

Son iki adımı tamamladığınızda, muhtemelen artık kullanılmayan tabloların adlarını belirlemeye yardımcı olacak ve daha fazla veya daha az güvenli bir şekilde kaldırabilecek, veritabanı kullanımını daha iyi anlayacaksınız.


0

Bana öyle geliyor ki, bir fiyat teklifi oluşturmak için yeterli bilgiyi edinmeniz gerekiyor, bu yüzden bu çabaya konsantre olacağım.

Bu sitede kaç tane kullanım vakası bulunduğunu belirlemeye çalışırım. Bu, genellikle sitenin ne kadar büyük ve karmaşık olduğu ve sitenin / uygulamanın yeniden oluşturulması veya sürdürülmesinin ne kadar zaman alacağı konusunda bir fikir verir.

Evet, bazen kodun artık kullanılmadığı ve uygulamanın gerçekte olduğundan biraz daha büyük görünmesine neden olacağı doğrudur, ancak bunun rakamları en fazla% 20'den daha fazla etkileyeceğini sanmıyorum. O yüzden bu kısım için endişelenmem.

Kaynak koduna bakmak, web sayfaları ve veritabanı tabloları bunu keşfetmenize yardımcı olmalıdır.

Ayrıca, bu proje için harcayacağınız aylık saati, önceden belirlenmiş bir ücret karşılığında kendinizi korumak için sınırlamayı düşünebilirsiniz.

Neyin kullanıldığını ve kullanılmadığını keşfetmek için gerçekten kolay bir yol yoktur. Kod analizi araçları yardımcı olabilir, ancak böyle karışık bir kötülükle uğraştığınızdan beri, yardımcı olabilecek tek bir araç olduğunu sanmıyorum. Her belirli alan için muhtemelen yardımcı olabilecek bir kod analiz aracı bulabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.