Büyük projeleri nasıl takip ediyorsunuz?


16

Birçok farklı dosyaya sahip bir projeyle uğraşırken, parçaların birbirleriyle nasıl etkileşime girdiğini her zaman izlemiyorum. Daha küçük bileşenleri tek başına anlamakta hiçbir zaman gerçekten sorun yaşamadım, ancak projenin karmaşıklığı arttıkça, kendimi neler olup bittiğine dair zihinsel bir anlayış inşa edemiyorum. Yöntem ve kaynak dosyalarının sayısı arttıkça bunu özellikle OOP projelerinde fark ediyorum.

Geçmişim: Ben kendi kendini yetiştirmiş bir web programcısıyım. Çoğunlukla hızlı ve kirli senaryolar için python ile uğraştım, ancak birkaç temel django projesi de yaptım . Gibi web çerçeveler gibi balona çünkü bir tek dosya düzeni basitlikte, ben kolayca ne olup bittiğini takip (çoğunlukla) tutabilir.

Şimdi kendimi bir başkasının geliştirdiği büyük bir Zend Framework PHP projesi ile etkileşime girmem gereken bir durumda buluyorum ve çok sayıda dosyaya yayılmış kodu anlamaya çalışmaktan bunalmışım.

Başka birinin geliştirdiği büyük bir kod tabanını anlamak için hangi teknikleri ve süreçleri yararlı buldunuz? Büyük resmi kavramanıza yardımcı olan herhangi bir diyagram var mı?


Muhtemelen bir UML bileşen şeması?
maple_shaft

Yanıtlar:


7

Büyük bir kod tabanını anlamanın hilesi hepsini anlamaya çalışmak değil. Belirli bir boyuttan sonra, her şeyin kafasında zihinsel bir model tutamazsınız. Önce üzerinde çalışmanız gereken herhangi bir görev için mantıklı bir bağlantı noktasıyla başlıyorsunuz, daha sonra oradan dallıyorsunuz, sadece ihtiyacınız olan parçaları öğreniyor ve geri kalanının ilan edildiği gibi çalıştığına güveniyorsunuz. Tıpkı özyinelemeyi anlamak gibi. Tüm yığını kafanızda tutmaya çalışırsanız beyniniz patlar.

Grep, hata ayıklayıcılar ve zeka arkadaşlarınız burada. Bir işlevin nasıl çağrıldığını bilmiyorsanız, üzerine bir kesme noktası ayarlayın ve yığın izinde aşağı doğru ilerleyin.

Dikkat edilmesi gereken diğer bir şey, büyük kod tabanlarının hiçbir yerden çıkmamasıdır. Ne kadar büyükse, üzerinde daha fazla programcı olan deneyim var, bu yüzden onlara nereden başlayacaklarını sorun, ancak spesifik olun. "Yeni bir ödeme sağlayıcısı eklemem gerekiyor. Kodun neresine bakmalıyım?" Gibi sorular sorun. Kod tabanının tamamını anlamaya çalışmak yerine sadece bu göreve odaklanın ve tanıdıklığınız parça parça büyüyecektir.


Anlayışınız için teşekkürler. Vrep w / ctags grep ile birlikte kullanıyorum. Hala PHP Xdebug alışkın. Ancak son paragrafınızın en faydalı tavsiye olduğunu düşünüyorum.
linqq

Yine de sana soracağım son bir soru daha var. Yeni bir ödeme işlemcisi ekleme prosedürünü öğrendiğinizi varsayalım. Zihinsel olarak saklamanın ötesinde, bu tür bilgileri takip etmenin favori bir
yolunuz

Basit tutuyorum. Kısa vadeli beyaz tahtama devam ediyor. Uzun vadede, tarayıcı yer imleri ve yedeklenmiş bir diskteki bir proje klasörü hangi formatta olursa olsun ilgili dosyaları en mantıklıdır. Kelime belgelerim, pdf'lerim, elektronik tablolar, düz metin dosyalarım, kısayollar ve kayıtlı e-postalarım var. Zihin haritalama yazılımı, wiki, evernote, vb. Gibi daha entegre çözümler denedim ve asla uzun vadede koruyamam.
Karl Bielefeldt

"Daha büyük, daha fazla programcı üzerinde deneyim var" mutlaka orada hala işe yaramıyorlar ya da iyi hatırlayamayabilirler (yönetim)
user1821961

2

Kısayol yok. Sadece acı çekmelisin.

Diyagramları nasıl alacağınızla ilgili sorunuzu cevaplamak için, oksijen istediğiniz şeydir. AFAIK PHP ile çalışır.

Daha genel olarak, yeni bir kod temeli karşılaşırken kabaca aşağıdaki aşamalardan geçiyorum:

  1. Kullanıcı açısından ne yaptığını anlayın. Uygulamayı gerçekte bir güç kullanıcısı gibi kullanabilirsiniz. Gerçek son kullanıcıların onunla nasıl çalıştığını anlayın. Bu, ne yaptıklarını sağlam bir şekilde anlayana kadar onlarla oturmayı gerektirebilir.

  2. Mümkünse orijinal geliştiricilerle iletişim kurun. İlk olarak, son kullanıcı deneyimiyle teşvik edilen mimari sorularınız olacaktır. Daha sonra, uç durumlar ve ayrıntılar hakkında uygulama sorularınız olacak. Geliştiricilerden yanıt alabilmek, herhangi bir yorum veya belgeden çok daha fazla yardımcı olacaktır (ki bu en iyi eksik ve çoğu zaman yanıltıcı veya tamamen yok).

  3. Hangi çerçeveyi kullanırsanız kullanın. En azından, üretim uygulamasına girmeden önce bu çerçeveyle bir "merhaba dünya" veya başka bir basit uygulama oluşturabilmelisiniz.

  4. Tüm dağıtım sürecini kavrayın (orijinal geliştiriciler elinizi tutarken en iyi şekilde yapın). Geçerli kod tabanını alıp oluşturup bir test / doğrulama / prod ortamı aracılığıyla dağıtamıyorsanız, tost edersiniz. En küçük değişiklik bile tüm dağıtım çemberlerinden atlamayı gerektirecek, bu yüzden bu kısmı neden hemen indirmeyesiniz? Bunu yaparken, uygulama tarafından kullanılan tüm güzel sunuculara, veritabanlarına, hizmetlere ve komut dosyalarına tanıtılacaksınız - "nerede yaşadığını" bileceksiniz.

  5. Fonksiyonel testleri (varsa) kavrayın. İşin düzgün çalışıp çalışmadığını nasıl anlarsınız? İnsanların başvurunun bakımı ve beslenmesi için ne yapması gerekir?

  6. Uygulamanın günlüklerini öğrenin. PHP ile hiç çalışmama rağmen, vahşi bir tahmin yapacağım ve herhangi bir ciddi PHP uygulamasının bir tür günlüğe sahip olacağını söyleyeceğim. Günlükleri anlarsanız, hata ayıklama sorunlarının zamanı geldiğinde iyi bir başlangıç ​​noktasına sahip olursunuz.

---- Buraya kadar, kod tabanına yakından bakmayı bile söylememiştim. Orada bir LOT bile kod bakmadan büyük proje hakkında bilgi edinebilirsiniz. Bir noktada, elbette, kod ile rahat olmanız gerekir. İşte bana yardımcı olan:

  1. Diyagramlar için doxygen , sizin için çağrı grafikleri ve diğer ilişkiler oluşturacak mükemmel bir araçtır. PHP yeteneği var! Doxygen'i denemediyseniz, kesinlikle bir spin vermelisiniz. Rağmen bir çerçeve içinde kod için ne kadar anlaşılır olacağını kefil olamaz, ama yardımcı olabilir. Orijinal geliştiriciler, kodlarının oksijenle oluşturulmuş dokümanları sunulduğunda gördükleri şeyden genellikle şok olurlar. İyi haber şu ki, gerçekten hafızasını çalıştırıp size daha iyi yardımcı oluyor.

  2. Bir dizi birim testiniz varsa, bunlara yakından bakmak uygulamanın iç çalışmalarına bir pencere sağlamalıdır. Bunlar, değişiklik yaparken tanıtabileceğiniz hataları aramak için de ilk yer olacaktır.

  3. IDE yer imleri, kod tabanındaki etkin noktaları etiketlemek için paha biçilmezdir. Bunlar arasında hızla geçiş yapabilmek anlayışı geliştirecektir.

  4. Son hata raporlarını ve çözümlerini okumak, etkin noktaları anlamak için de değerlidir ve kod tabanının en alakalı bölümlerini hızlandırmanıza yardımcı olacaktır.


1

İstendiği gibi, burada bir cevap olarak yorumum.

Başkalarının kodlarıyla çalışırken, statik yapı hakkında genel bir fikir vermek için UML sınıf diyagramları oluşturmaya veya mümkünse oluşturmaya eğilimliyim. Görsel diyagram, özellikle daha sonra geri dönüp bir dersin içeriğini unuttuğumda bana yardımcı oluyor. Bazen collaborateurs arasındaki etkileşimleri dışarı satır yanı dinamik davranışı için yaparız, ama bunu yapma o sık sık.

Kod tabanı testler (entegrasyon veya birim) içeriyorsa, bunlar bazen de kontrol edilmeye değerdir.


1

Aslında bunu yeni bir müşterinin başka bir geliştirici tarafından bırakılan bir ürün için geliştirmelere ihtiyaç duyduğu bu hafta boyunca yapmaya başlayacağım. İzlenecek adımlar aşağıdadır:

a) Uygulamanın nasıl aktığını bilmeye yardımcı olan, kullanılan programlama çerçevesini belirleyin.

b) En çok kullanacağımız bölümler olduğu için, günlük kaydı, özel durum işleme, MVC, veritabanı bağlantısı, denetim, görünüm (sayfa oluşturma) gibi ortak hizmetleri belirleyin.

c) Yaygın kullanıcı akışlarından (uygulamada) geçip bunları kodun düzenlendiği şekilde hizalamaya çalışın

d) Bazı değişiklikler yapmaya ve nasıl ortaya çıktıklarını görmeye çalışın. Bu en büyük adımdır çünkü değişiklik yapmaya başlayana kadar kod hala bir kara kutudur ....

Önümüzdeki iki hafta boyunca başka hangi fikirlerle karşılaşacağımı size bildireceğim


0

Benim düşüncem, belgeleri okumalısınız. Bilgisayar korsanlarının size "kod belgelerdir" demeyi sevdiğini ve herhangi bir belge yazmamak için bir bahane olarak kullandığını biliyorum, ancak yanlışlar. Milyonlarca kod satırından oluşan devasa bir yazılım projesi olan Linux çekirdeğine bakalım: Bir kitap okumadan kimsenin gerçekten taze olabileceğini sanmıyorum ve sadece al. Çalıştığınız kod belgelenmemişse (veya daha küçük bir proje varsa iyi yorumlanmışsa), muhtemelen iyi bir kod değildir.


Kod seyrek olarak yorumlanır ve başka şekilde belgelenmez. Bu üzücü ama kendim belgeleme eksikliğini değiştirmek için yapabileceğim hiçbir şey yok.
linqq

Geriye dönük yorum eklemek genellikle anlamsızdır, çünkü yapabileceğiniz tek şey kodu İngilizce olarak yeniden yazmaktır. Orijinal kodlayıcının zihnini geri alamazsınız, bu yüzden işleri neden yaptığı gibi yaptığı hakkında önemli yorumlar yazamazsınız .
MattDavey

0

Sıfır dokümantasyon ile gerçekten büyük bir şeyle çalışıyorsanız (Ben de oradaydım, bu kaba!), Yardımcı olduğunu bulduğum şey üzerinde çalıştığınız kısmı izole etmeye çalışmaktır. Kodun bu bölümünde, verilerin / olayların / mesajların / etkileşimlerin bu üniteye nasıl girip çıktığını öğrenin. Başka bir deyişle, arayüzü tersine mühendislik. Bir yere yaz. Bir dahaki sefere başka bir ünitede çalıştığınızda (ilk çalıştığınız üniteyle konuşuyorsa bonus), aynı şeyi yapın. Tüm belgelerinizi saklayın. Bundan birkaç ay sonra, şeyin nasıl aktığına dair güzel bir resminiz olacak.

Üzerinde çalıştığınız küçük bir birimin arayüzünü bulun ve daha sonra başvurmak üzere kaydedin. Zamanla, çalışma şeklinin çoğunu bir araya getireceksiniz. Programınızın ne yaptığını bulun ve bu mesajın nasıl aktığını izleyin. Örneğin, sisteminiz bir giriş ağı mesajı alıp bir çıkış mesajı gönderirse, tüm ayrıntılar hakkında endişelenmeden bu mesajın sistemden nasıl aktığını izleyin - nereye gittiğine bakın.


0

Ne yaptığım, java'dan UML'ye ters çevrilmiş tüm dosyalardan tek bir UML modeli oluşturmaktır. Bu yaklaşım, modelin artık sadece projenin soyut bir görünümü olmadığı, projenin tamamen MOF ve dolayısıyla UML ile eşleştirildiği anlamına gelir.

Aldığım her biri sınıflandırıcılar vb. Tarafından oluşturulan paketlerden oluşan birden fazla alt modelden oluşan büyük bir tek modeldir. Aynı yöntem, A projesinde bir sınıflandırıcı ve B projesinde başka bir sınıflandırıcı çağırabilir. Projenin tüm yapısını görmenin tek yolu, her ikisini aynı anda tersine çevirmektir. Bileşen diyagramları oluşturmak için zamanım yok ve bilgiler doğru değil. Bilgisayardan tüm projeyi benim için tersine çevirmesini istemeyi tercih ederim. Takımla her bir yinelemede bir tersine dönüyorum ve tüm diyagramlarım hemen güncelleniyor. Tersine mühendislik artımlıdır ve Java - UML Ids eşleştirmesini kullanır. Her bir java elemanının, yeniden projelendirilse bile tüm proje ömrü boyunca aynı kalan tek ve benzersiz bir MOF elemanına eşlendiği anlamına gelir. Bunu yapmak UML modellemesi için sınır oluşturmaz ve çok çok büyük ve karmaşık proje modellemesine izin verir. Bilginiz için 5.000.000 satırdan fazla OOP kodu içeren projeyle çalışıyorum. Tüm projelerim doğru şekilde ters çevrilmiş ve grafiksel gezinme mümkün

Sadece sınıf diyagramları kullanıyorum çünkü UML modelimden her zaman güncel olan gerektiği kadar çok görünüm oluşturabiliyorum. Ayrıca çok karmaşık projeleri de modelleyebilirim.

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.