Monolithic PHP Spagetti Codebase üstlenmeden veya yeniden yazma

9 Cevap php

Ben gerçekten çok kötü tasarlanmış PHP spagetti kod proje miras ettik. Son zamanlarda trafiği iyi bir bit kazanıyor oldu ve yoksul monolitik kod tabanının üstüne performans sorunları başlıyor. Onun tıknaz 16GB özel makine üzerinde performans maxing gerçekten olmamalıdır zaman.

Ben performans sorunu yardım etmek için sağ yarasa kapalı bazı performans tweaks yapmayı planlıyorum, ama bu yine de gerçekten korkunç kod tabanı yardımcı olmayacaktır. Ekip, küçük ama çok yakında büyümek için bekliyor olduğunu.

I the troubles of doing a complete rewrite üzerine Joel'ın makaleyi okuyun ve endişeleri görmek ettik. Ama bir yeniden yazma düşünmeden önce kod tabanı ne kadar kötü olmak zorunda mı?

PHP işleme mantığı biri genellikle bir "görünüm" düşünün ne içine araya girdi vardır. Daha da kötüsü, bazı yerlerde SQL ifadeleri bu aynı dosyaları vardır! Sunum ve mantık tek gerçek ayırma fonksiyon kütüphaneleri olarak hizmet birkaç PHP komut vardır. Hatta o çağrı eğer bu komut ... ORM şeylerin çoğunu yapmak. Yavaş yavaş bu refrakter çalışırken bir kabus gibi görünüyor.

Düşünce ve görüşleri ... Açık duruşmaya ancak ilgi değil, "Kaçmak, kaçmak!".

9 Cevap

Ben kodu yeniden yazmak yapmadan önce oldukça dang kötü olmak zorunda söyleyebilirim, aslında, ben gerçekten şu anda (Netscape ne bakınız) çalışan büyük bir kod temeli yeniden neden iyi bir sebep düşünemiyorum.

Ayrıca, ben sadece (Ben zaten bir kere bu savaşı dövüştüm) ay önce (senin değil, onların gözünde) zaten ne vardı almak için zaman / kaynak bir demet geçirmek için yönetimi ikna zor bir zaman olurdu düşünüyorum.

O dedi, size kod en önemli ya da en yavaş bölümleri almak ve daha sorunsuz size sistemi çalıştırmak ve daha sonra gelecekte daha kolay idame sağlamak için onları refactor.

Üzgünüm, ama eski kodu ile ilgili sadece size daha önce olduğundan daha iyi dokunma ve altın demektir herhangi bir kod emin olun, işin sadece bir parçasıdır.

Ben, senin için iyi şanslar iyi haberlerim olsaydı.

Öncelikle, ben özür dilerim orijinal kod ile ilgisi olsaydı. Bir daha olmayacak. Ben genç ve naif oldu.

O dedi, bu sizin için biraz daha kolay gitmek yapmak için bir yaklaşım, kucağına düşmek iyi bir kodun bir külçe ve yeni özellikleri veya büyük hata düzeltmeleri olarak start nugget ile onları inşa etmektir. Sonunda nugget be uygulama olacaktır.

Eğer başka bir yerde iş bulmak ve anonim yardım için replacement StackOverflow savunmalarını cevap o zaman.

Edit:

Daha ciddi bir not, PHPDoc gibi bir araç kapmak ve sistemini belgeleyen başlatmak için kullanabilirsiniz. PHPDoc genellikle aynı amaca hizmet yinelenen öğeler ve şeyler arayabilirsiniz bir web sitesi çıktılar. Ayrıca yeni belge kodu için yardımcı olacaktır.

Bebek adımları.

Aynı anda tüm kodu refactor kalkmayın - Sorun kod muhtemelen korkunç bir şekilde kıracak olduğunu ve hala iyi bir ayıklama durumda olmayacaktır. Eğer bir seferde küçük adımlar bile, size bunları istediğiniz gibi yaptığınız değişiklikler çalıştığını doğrulamak edebilirsiniz.

Yinelenen kodu bulun (muhtemelen vardır) ve bu refactor. Bu kod temeli küçük ve yönetmek için daha kolay hale getirecek.

Belge. Kod geçmesi ve bunu yapmak için ne gerekiyor kod hakkında ve ne bir fikir olsun, bir not defteri dışarı atın. Eğer genel bir projenin iyi bir fikir edinebilirsiniz bu şekilde.

Bir süre sonra sıkıcı ve sıkıcı alacak, ancak bunu devam ederseniz kod temeli zamanla artıracak - Eğer üstlenmeden dışında yapılacak başka bir şey var emin olun.

Son ama en az değil: sabırlı olun - üstlenmeden zaman alır.

I documents how it works today (değişiklik öncesi) bir zihin haritası ile başlamak istiyorum.

Sonra performansı "düşük asılı meyve" örneğin mücadele önbellek-mümkün dosyalar olarak gönderilen resimler, scriptler, css vardır? Genel işlevleri içine sıvamış olabilir Herhangi bir kopyala / yapıştır kodu.

Sonra "nihai" ideal tasarım planı ... ve buradan oraya almak gerekir kaç evreleri belirler.

Sonra 1 faz yok. ;-)

İyi listesi andyk. Ne de aklıma geldi size şeyler kırmak yok emin olmak için ilk ünite testleri (phpunit) yazmak oldu.

Ben spagetti bir mimari sorun değil, işlevsel bir olduğunu söyleyebilirim. Mimari tarafı için, muhtemelen bazı noktada gerek rewrite var ... çıkış yolu yoktur derim. Eğer yazılım iyi bir eğilim oluyor öngörülüyor ise, neden both mevcut şube ve yeniden yazılamaz şube sürdürmek, daha fazla zaman koyarak yeniden yazmak için planı değil. Bu bir sürü iş olabilir, ama sizin durumunuzda bir yatırım olduğunu söyleyebilirim.

On the other hand, evlat için en iyi strateji at this point, yavaş kısmını belirlemek için profilleyiciyi (Xdebug veya Zend) çalıştırın ve ardından just tweak it etmektir. Hayır üstlenmeden, görünümde ilgisi çirkin bir iş mantığı görmezden. Sadece performans tweaked almak istiyorum.

Yani benim tavsiye:

  1. Kaçınılmaz yeniden yazmak için Planı
  2. Sadece yerine yeniden mimar optimizasyonu odaklanmak

Benim düşünceme göre, yapmanız gereken ilk şey, Visio kadar yangın ve bir akış şemasında tüm süreci analiz elde etmektir. Daha sonra - program gerçekten ne çok üst düzey bir görünümü var - Eğer sınıfa mantık topakları patlak verebilir, ya da gerekli olduğunu düşündüğünüz başka ne yapmak.

Seni performans üzerinde hit alıyorsun nerede analiz ederek başlamak istiyorum. Birçok durumda performans sorunları nedeniyle kötü veritabanı tuning ortaya çıkar.

Biz yaklaşık 10 yaşında bir kritik eski ASP uygulaması var, yılda kod kollarını ve bacaklarını büyüdü ve yerlerde bakım baş ağrısı biraz. O dedi, ve kod gibi bazı çirkin cehennem iken, bizim sorunların en yoksul veritabanı ayarlama neden ediliyor - endeksleri, bayat indeksler, yanlış indeksler, bu tür şeyler eksikliği.

Dalmadan önce tam bir sorunlar daha sonra düzeltici eylem almak için ne bir informed karar ilk nerede belirlemek yeniden yazmak. Kodunuzu spagetti canavarı kabus olabilir, ama sorunların kök yerde yalan olabilir.

Ben çok zaman geçti, biliyorum, ama gelmek için başkalarının iyiliği için: Biz bu görevi size yardımcı olabilecek yeni bir araç var. Bu denir nWire for PHP. Bu Eclipse PDT ve Zend Studio 7.x için bir kod keşif eklentisi

Kodunuzu analiz ettikten sonra, bu aynı zamanda grafiksel olarak sunulabilir vb call hiyerarşi, çağırmaları, dosya kapanım, gibi tüm dernekler sunabilirsiniz. Biz oldukça büyük projeler üzerinde kullanarak pek çok müşteri var. Bu kaybolmak geliştiricileri için mükemmel bir araçtır büyük kod temeli olduğunu.