Bir uygulamanın kötü bir kod temeli üzerine inşa edildiğini nasıl ispat edersiniz?


23

Şu anda daha önce işimde çalışan bazı geliştiriciler tarafından oluşturulan bir sistemi inceliyorum. Sistem, kullanıcının bakış açısından oldukça iyi çalışıyor, ancak kod incelemesine geçerken çok karışık bir durum. Kullanımın yüksek artışlarına rağmen, uygulamanın oluşturulma şeklinin gelecekteki güncellemeler için geçerli olmayacağına ikna oldum.

Sorun şu ki, ne kadar kötü olduğunu bildiğimden ama üstlerim bilmiyor. Yöneticime ispat edebilirim, böylece sorunu gerçekten görüyor ve mevcut kod tabanında minimum triyaj yapmaya ikna edilebilir ve yakın gelecekte uygulamanın bir sonraki sürümü için yeni bir geliştirme çizgisine başlayabilir?


6
programmers.stackexchange.com/questions/59050/… Belki de "büyük yeniden yazma" işleminin ne kadar kötü bir şekilde yapıldığına dikkat etmeden önce iş perspektifinden biter. Daha üst düzey bir programcının yapacağı şey bu olurdu.
quentin-starin

22
@qes, "büyük yeniden yazma" yapmaktan daha kötü olan tek şey, "büyük yeniden yazma" nın felç edici bir korkusudur. Mevcut pozisyonuma başladığımda, kaynak kontrolü, hata izleme veya testler olmadan iki veya üç farklı programcının Perl CGI karmaşasını miras aldım. Bazı inandırıcı sürdü, ancak eski kodu korurken Ruby on Rails'de yeniden yazmak için onay aldım. 5 ay sonra, araçlar daha kullanıcı dostuydu ve aylar yerine günler veya haftalar içinde yeni özellikler ekleyebilirdik. Kullanıcılar çok mutlu, ve fikrimi kaybetmiyorum. "Büyük yeniden yazma", tamamen kaçınmayı değil, sağlam bir gerekçe gerektirir.
Jason Lewis

1
@JasonLewis: (Sanırım önceki yorumumdaki bağlantıyı takip etmedin mi?) Bir yıldan daha kısa bir süre önce, bir üst düzeyin sahip olabileceği ve sahip olabileceği önemli becerilerden yoksun olarak kendini tanımlayan birine kötü bir şekilde tavsiye edilir. Yeni bir projeye başlarken nereden başlayacağınızı bilmek.
quentin-starin

5
@ JasonLewis Size tamamen katılıyorum. Birisi SE'de bir uygulamayı yeniden yazmak istediğinde, birçok insan bu "büyük bir yeniden yazma yapma" ideolojisiyle birlikte gelir. Bunu yapmamak için kesinlikle birçok neden olduğunu düşünüyorum ama ne pahasına olursa olsun kaçınmamalısınız. Bir 100k kod satırının yeniden yazılmasına katıldım ve anlattıklarınıza çok benzer bir başarı elde ettik. Modül ile modülünü bile yeniden yazabildik (kullanıcı arayüzünün ilk kısmı, ardından sunucu, sonra kalan kısım). 12 ay sonra çok mutlu bir müşteri tabanımız var ve aldığımız karardan herkes gurur duyuyor.
Alex

2
Bu, daha genel bir sorunun bir parçasıdır: selefinizin uzun vadeli masraflarla derhal sonuçlanması. Devralırken, aynı çıktıyı neden sürdüremediğinizi açıklamalısınız.
David Thornley

Yanıtlar:


23

'Ama şimdi çalışıyor', yazılım mühendislerinin meşru hayal kırıklıklarına verilen standart yönetim yanıtıdır. Yapacağım ilk şey, belgeleri (varsa) derlemek ve kod ile belgeler arasındaki çelişkileri göstermek için kullanmaktı.

Yapabiliyorsanız, kapsamlı bir birim test paketi hazırlayın. Bunları her değişiklikle çalıştırın, böylece mevcut kod tabanında suçlanabilecek gerilemeleri belgeleyebilirsiniz.

Son olarak, bir geliştiriciyi işine güvendiğiniz başka bir departmandan çekebilirseniz, kodun üzerine ikinci bir çift göz atın. 'Bu saçmalık' diyen bir geliştiricinin görevden alınması kolaydır, bir süredir etrafta olan üst düzey bir geliştiricinin kendisi için kefil olup, 'Hayır, Jim, haklıdır. Bu boktan bir krakerin saçmalıkları. '

Tabii ki, hepsi ortamınıza, şirket büyüklüğünüze vb. Bağlıdır.

Eğer okumadıysanız, Pragmatik Programcı'ya her zaman bir göz atmanızı öneririm . Sadece her yazılım uzmanı için okumaya ihtiyaç duyulmamalı, aynı zamanda yazılım mühendisliğini bir zanaat olarak görmeyen yönetim, meslektaşlar, kullanıcılar vb.


7
Doküman yok ve kod cehennemini yeniden yakmayacağımız sürece hemen hemen denenemez. Tartışma sırasında başka bir geliştiriciye ulaşmanın yardımcı olabileceğinden, çok sayıda meslektaşım tarafından desteklendiğimden oldukça eminim.
ChrisR

@ChrisRamakers Bu harika bir haber (destek, doktora eksikliği!). Yöneticilerin çoklu geliştiricilerin mesleki görüşlerini reddetmeleri / reddetmeleri zor (imkansız olmasa da) . Ve eğer destekçileriniz şirkette daha uzun süredir çalışıyorsa, kuruluşun iç politikasını yönlendirmede değerli deneyime sahip olabilirler. İyi şanslar!
Jason Lewis,

Ek olarak, bazı yük test yazılımlarına sahipseniz, yüksek yük altında nasıl kırılabileceğini gösterebilirsiniz.
HLGEM

13

Yönetim açısından bakıldığında, sistemde yanlış olan bir şey yok ve sadece şikayet ediyorsunuz çünkü [sadece yeniden yazmak istiyorsunuz / önceki mühendislerin ne yaptığını anlamadınız / işinizin kolay olmasını istiyorsanız]. Biraz saman adam, ama tepedeki biri şu anda işlerin iyi yürüdüğünü gördüğünde, yaptığınız bir krizi görmekten kaçınırlar (eminim orada bir yerde bir iklim değişikliği alegorisi var ...) .

Bir dereceye kadar, bir noktaya sahipler. Yönetim, sürümler orijinal tahmininin çok ötesine geçtiğinde sorunları görüyor, tahminler yapılan iş için çok yüksek görünüyor, "bu bizim mevcut kod tabanımızla mümkün değil" ve QA'dan geçen hataların yüksek oranda görülüyor. İşler güzelce sarılıyorsa, kafanıza dokunmak ve elinizden gelenin en iyisini yapmanızı söylemek kolaydır, çünkü bu durum alt çizgiyi etkilemez.

Ne yapacağınız, kuruluşunuza ve yazılımın kendisine bağlıdır. Temel olarak, yine de, kötü eski kuralların bir sonucu olarak ortaya çıkan her komplikasyonun belgelenmesini öneririm. Görevleri tahmin ederken, eski kod tabanının hangi yönlerinin bu ek maliyeti eklediğine dair ayrıntılı açıklamalar ile neden bu kadar uzun süreceğini düşündüğünüzü açık bir şekilde belirtin. Hatalar koda girildiğinde, bu hatanın neden kaymaya başladığının nedenlerini ve eski kod tabanındaki sorunların nasıl sorumlu olduğunu dahil edin.

Endişelerinizi paydaşlara, yazılımın orijinal tasarımını geçtiğini ve şimdi de geliştirmeye devam etmekte sorun yaşayacağını önerecek şekilde ifade etmenizi öneririm.


5

Kod kapsamı ve kod incelemesi yapabilen çeşitli araçlar vardır. Teknolojinize uygun Google araçları, bunlar normalde endüstri standardı araçlardır. Bu araçları kullanmanızı ve kod kalitesi raporunu bulmanızı ve Yöneticiye sunmanızı öneririm. Eleştirinizin yapıcı ve politik olmadığından emin olun.


evet, ortalama döngüsel karmaşıklığı hesaplamayı ve bunu argüman olarak kullanmayı düşündüm ama bunun yönetime bir şey kanıtlamayacağından eminim. Ama denemeye değer, thnx
ChrisR

5
@ ChrisRamakers: Bir yöneticiye hiçbir şey "kanıtlanamaz". "Kanıtı" unut. Veri toplamak. Gerçeklerin hepsi senin. Daha fazla gerçek daha inandırıcıdır. Ancak "kanıt" yok.
S.Lott

4

Yönetimin basit bir değişim talebi olduğunu düşündüğü yeri anlaması kolay bir örnek seçin, ancak mevcut tasarım nedeniyle bu çok daha zor.

Özel istekleri yerine getirmelerini istemiyorsunuz, ancak HERHANGİ bir değişiklik talebinin nasıl olacağını bilmelerini sağladığınızdan emin olun. Kimse bir uygulama ile köşeye boyanmak istemez. Geliştiriciler YAGNI'ye inanıyor, ancak yönetim CYA'ya inanıyor.

Yük testi için öneriler iyi bir yaklaşım olabilir, ancak artan kullanım endişelerinin herhangi bir gerçek dünya büyüme potansiyelini karşıladığına ikna olmayabilirler (Şirket bir yılda iki katına çıkmayacak).

Her şey görecelidir. Vaktinizi harcayabileceğiniz daha önemli projeler için planları olduğunda kaynakları bu projeye koymak istemeyebilirler. Büyük resmi görmemiş olarak etiketlenmeyin.


1
Değişikliği yaptıktan sonra, kötü bir kod tabanında birçok farklı kaynak dosyaya dokunacak olan diff dosyasını gösterip, "bununla ne ilgisi var?" eleman, vb. Yönetime Bu çalışmanın ne kadarının, yani, zaman == $$ 'ın zayıf kod temeli ile ilgili olduğunu ve ileriye dönük değişikliklerin bu özelliğe sahip olacağını açıklayın.
Larry OBrien

3

Bir şeyi kanıtlamak hakkında konuştuğunuzda, tüm bu bilimsel yöntem olayları devreye giriyor ve bunun ne anlama geldiğinin bir kısmı, doğru olanın kararlaştırılmasının nesnel standartlarını kabul edecekseniz, soruşturma üzerine, sinir bozucu gerçeklerin olasılığını kabul etmelisiniz. senin yanında olmadığın ortaya çıktı.

Senin durumunda, kanıtlanması gereken 2 şey olduğunu düşünüyorum.

İlk olarak, geçerli kod temeli "kötü" dür. Muhtemelen kanıtlayabileceğiniz şey, "bu kodu inceleyen hemen hemen tüm geliştiricilerin profesyonel görüşü kötüdür" dür.

İkincisi, şirketin kod tabanını yeniden yazmaktan daha iyi olacağı. Bu bir sorun çünkü ilk nokta doğru olsa bile, ikinci olmayabilir. Ayrıca, bu belirlemeyi yapacak kadar bilginiz yok. Bu, yönetimin işidir ve birinci nokta hakkındaki profesyonel yargınıza saygı duymalarını istiyorsanız, ikincisi ile ilgili olanlara saygı göstermelisiniz.

Ancak verdiğiniz bilgiler olmadan ikinci nokta hakkında karar veremezler. Koddaki sorunların işletmeyi nasıl etkileyeceği ve yeniden yazmanın işletmeyi nasıl etkileyeceği hakkında bildiklerinizi bildirmeniz gerekir. Bu zordur, çünkü ikisi de belirsizliği olan bir geleceği tahmin etmeyi içerir.

Ancak sorunu ticari açıdan belirtmeye çalışabilirsiniz. Değişiklik ve gerileme için ne kadar zaman harcanıyor? Yeniden yazma maliyeti ne olur? Yeniden yazılmamışsa, mevcut sistemin maliyetleri zaman içinde ne kadar hızlı artacaktır? Peki ya kullanımda bir artış varsa, mevcut kod tutulursa bir felaket şansı nedir? Bunların hiçbirini gerçekten bilemezsiniz, ancak diğerlerinden daha iyi bir tahmin verebilirsiniz. Bunları ne kadar doğru tahmin edebileceğinizi düşündüğünüzü iletmek için bir aralık veya bir şey verin.

Çoğu geliştirici berbat kodu korumayı sevmez. Bu nedenle, geliştirici bakış açısıyla yeniden yazmak için akıllı olmayan bir kodun, işletme perspektifinden yeniden yazmaya değmeyeceği durum ne yazık ki olabilir.

Örneğin, yeniden yazma karlı olsa bile, parayı şirketin başka bir yerinde geçirmenin fırsat maliyetinden daha düşük olabilir. Veya kötü kod tabanının değiştirilmesi ve daha fazla gerileme olması daha uzun sürebilir, ancak yeniden yazma işlemini karlı hale getirmek için yeterli olmayabilir. Önümüzdeki birkaç ay içinde satın alınmayı düşünüyor olabilirler ve bir tekrar yazmaya para harcamak kitaplarda görünecek, ancak buggy yazılımı başaramayacak.

İş perspektifinden düşünmeye çalışın ve istediğinizi elde etmek için sayıları pişirmeyin. Büyük bir yeniden yazma neredeyse hiç bir zaman iş dünyasından bir fikir sahibi değildir. Doğrudan kanıtlanamayan bir şeyi ispatlamak istiyorsanız, bunu ispatlamak için elinizden geleni yapın. Eğer bir yol ile gelip için elinizden geleni denemeye devam ederse değil sıfırdan ama yoktan yeniden yazmak için belki, markaları duygusu ile gelip sonra gerçekten sıfırdan yeniden yazmak için zamanı. Ve bu çabayı göstermek, kendinize değil (kendinizin değil, şirketin çıkarlarını temsil ediyorsunuz, değil mi?) Şirketinizin çıkarlarını temsil etme konusunda ciddi olduğunuzu gösterecektir.


2

Sanırım kod tabanı ile ilgili neyin kötü olduğuna bağlı. "Benim yaptığım gibi olmaz" olmak, kötü bir kod tabanı olduğu anlamına gelmez.

Aslında kötü bir kod tabanı yapan şeyler:

  • Güvenlik açıkları

    Sunucuyu, uygulamayı ve / veya verileri savunmasız bırakan sorunlar. Özellikle hassas şirket, müşteri veya müşteri verilerini risk altında bırakan herhangi bir şey. Bunların belgelenmesi kolay olmalıdır.

  • Kırık Çalışma

    Çalışıyor, çünkü verilere masaj yapıyorsunuz ve çalışmaya devam etmesi için uygulama üzerinde neredeyse sürekli çalışıyorsunuz. Gidecek olursan ve kimse durmazsa, artık işe yaramayacaktı. - Bunu yapmak için ne kadar zaman harcadığınızı belgeleyin. Ve ne kadar tasarruf edebileceğinizi unutmayın. Oldukça sık bu işlemler kullanıcılar için de yetersizdir ve siz de bunu belgeleyebilirsiniz.

  • Aslında çalışmıyor

    İşe benziyor ancak sonuçlar yanlış. Bu genellikle, çizginin aşağısındaki sayıların eşleşmemesi, yüksek hata oranı vb. Gibi sorunlara neden olur.

Kötü kod temeli değil (sadece iyi değil):

  • Eski desteklenmeyen teknoloji üzerine yazılmış. (VB6, COBOL, .net1.1 Vb.)

Yeni bir teknolojiye geçmenin avantajlarına dikkat edin. Riski en aza indirebilmeniz ve kullanıcı ve yönetim güvenini oluşturabilmeniz için parçaları tek tek hareket ettiren bir geçiş yolu bulmaya çalışın. Mantığın temelde orijinalle aynı olduğundan emin olun.

  • Belgelenmemiş / kötü biçimlendirilmiş kod

Bu, sizin için düzeltmesi en kolay olanıdır çünkü genellikle yorum ekleyebilir ve biçimlendirmeyi düzelterek kodu gerçekten etkileyerek düzeltebilirsiniz. Ancak yeniden yazma gerektirmez. Bunun diğer sorunlarla birleştirildiğini düşünüyorsanız, yapılacak ilk şey bunu düzeltmektir, böylece kodun uygulanabilirliğini daha iyi değerlendirebilirsiniz.


1

Bir şekilde kendi sorunuzu cevapladınız.

Onları sisteme para harcamaya ikna etmenin yolu, kullanıcı için iyi çalışmaz hale gelene kadar beklemektir. Ölçeklemeyeceğini düşünüyorsanız, bunun olmasını bekleyin veya kanıtlamak için bir yük testi yapın.

Bu daha sonra basit bir temizlik önerisi, ölçeklendirmek X saate mal olacak.


8
Tek sorun, eğer sistem için temel bir sorumluluğu varsa, artık çalışmadığı zaman suçlanacak. “Ama sen başlamadan işe yaradı !” Diyecekler. Bu yüzden proaktif bir yaklaşım önerdim. , Bunları önceden uyarın bildirilen sorunları ve kırıldığında sonra kıçını kaplıdır ve sadece o yüzden patronuna söylemiştim 'demek, ama o ben söyledim söyleyebiliriz onu patronunun patronu için öylesine'.
Jason Lewis

3
@Jason - Amacını anlıyorum, ama benim tecrübeme göre inkar, aşağı doğru işlemektedir ve 'ona öyle demiştin', zincirleme yolunda 'takım oyuncusu olmayan' ile çok hızlı bir şekilde karşılanacaktır.
Jonno

2
Çok fazla bireysel işyeri bağlıdır, ama ben ... size katılıyorum ben daha iyi iyi ifade edebilirim ... Benim asıl nokta oluyor nedenlerini belgeleyen edildi gidiş , önceden başarısız noktayı savunarak ve mevcut evraklar ne zaman olursa olsun ... en iyi senaryo, düzeltmenize izin verilir. Ortalama, başarısız olduğunda becerilmezsin. O ;-) başarısız sonra iş avcılık sonunda ne zaman müstakbel işveren için son pozisyonu neden terk En kötüsü de, derinden nasıl ve etkileyici (canlı ayrıntılarla) açıklamak için yeterli bunları düzeltmek için sistem ve onun zayıflıklarını ve nasıl grok
Jason Lewis

1
@JasonLewis Eğer şirketteki oyuncular I told you soo zamanki gibi cümle kullanıyorlarsa , bu OP'nin uzun süre çalışmak isteyeceği bir yer değil, toksik bir suç kültürüdür. İyi bir yönetici suçlamaz, iyi bir yönetici sorunları kabul eder ve bir plan yapar.
maple_shaft

@maple_shaft Katılıyorum. Bu sözleri tam anlamıyla kastetmedim, daha fazla bütün üsleri örtmeye değiniyordum. İdeal olarak, hepimizin komuta zinciri boyunca iyi, destekleyici yöneticileri olur. Bununla birlikte, çoğu zaman orta ölçüme açık bir sistem kurduk, böylece sahip olduğumuz işi, istediğimiz işe taş atmak olarak kullanabiliriz.
Jason Lewis

1

Bu zor bir durum çünkü kullanıcının bakış açısından her şey artık kabul edilebilir ve istikrarlı bir noktada. Öncelikle teknik olmayan yöneticilerle, şu anda endişelenecek bir şey yok, ancak kod tabanının yeniden yazılmasını istemek muazzam bir karar, özellikle de bekar bir erkeğin (kendin) fikrinde ve çabalarında hafifçe alınmaması gereken bir karar. .

Bu yüzden, zorlu teknik borç nedeniyle yeniden yazmak için dava açmaya çalışıyorsunuz (sizce, bizim için hiçbir örneğimiz yok ve bunun için sözünüzü almak zorundayız) ve en zor durumdasınız. bu sisteme özellikler ekleme ve ekleme zorluğu yaşamaktadır.

Yeni özelliklere ilişkin tahminleriniz yüksek olacak, bu yüksek rakamları gerçeklerle doğrulayın, bu şeylerin gerçekten çok zaman alacağını kanıtlayın. Bunu doğru bir şekilde iletmezseniz, yöneticiniz yetersiz olduğunuzu varsayabilir ve kesinlikle bunu istemezsiniz. Yüksek tahminleri sorgularken, biriken teknik borcun neden mevcut yazılıma hızlı ve ucuz bir şekilde özellikler ekleyebilme yeteneğini engellediğini düşündüğünüzü açıklayın. Yöneticinizde birlikte sürmek için iki beyin hücresi varsa, çok hızlı bir şekilde anlamaya başlayacaktır.

Mesele şu ki, yöneticinizi ikna etmeye çalışmamalısınız, ancak müdürünüzü, yeniden yazmanın kabul edilebilir bir kurs olduğuna ikna edebileceği uygun (ve dikkatlice seçilmiş) bilgilerle yönlendirin . Yöneticiye başından beri onun fikri olduğunu düşünmesini sağlamalısın.


1

Öncelikle kod tabanınızdaki birikmiş teknik borcu belirleyin. Ardından , devam etmeden önce yönetimi teknik borcu ödemeye nasıl ikna edeceğinizin açıklandığı bu soruya ve cevaplara bir göz atın .


0

Bütün olgun yazılımların karışıklık gibi görünmesinin bir nedeni var :

  1. Bütün bu karışıklık, işletmenin güvendiği kritik mantığı kodluyor. Onsuz hiçbir şey işe yaramaz. Her sorunu kullanıcı problemini çözmek için gerekliydi.
  2. Biraz modası geçmiş bir teknoloji kullanıyor. Mevcut programcılar, bazı şablon sihirlerini kullanmazlarsa, bunun sadece bir karışıklık olduğunu düşünüyor gibi görünüyor. Bu bozuk bir manzara. Tüm detayları öğrenirken daha büyük bir projeye geç gelen herkes bu aşamada olacaktır.
  3. Bir süre önce kritik olan gereksinimler artık o kadar kritik değil. Bunun nedeni, yazılımın zaten bu sorunları çözmesidir. Projeye geç geliyorsa, yazılım iyi bir neden olmadan karmaşık görünüyor - sorun artık yok, ancak koddaki karmaşıklık hala var.

Bu tür bir tutum, programcıların cehalet veya tembellikten kaynaklanan büyük teknik borcu bahane etmelerine neden olur. Bir programcının işi, soyutlamaları kullanarak iş mantığını kodlamaktır. Değişken özellikler, kodlanmış sihirli sayılarla değil meta verilerde yaşamalıdır. İkincisi, 'biraz modası geçmiş' öznel olabilir. IMHO, 'biraz modası geçmiş', çerçevenin / platformun hala aktif olarak geliştirildiği ve bir yükseltme yolum olduğu anlamına geliyor. Alternatif 'eski'. 3 numara affedilmez. Az önce kabadayı tarif ettin. Hiç kimse kod tabanını yeniden temizlemiş veya temizlememiştir ve bu kabul edilebilir mi?
Jason Lewis,

Elbette, ama soyutlamaları kullanarak iş mantığını kodladıktan sonra sonuç ne ... Kod karmaşık gözükecek. Bu "karışıklık" ın tanımı. (3) karmaşık değildir, çünkü hala zorunlu değildir; sorun çözüldükten sonra bile ortadan kalkması gerekmedi.
tp1
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.