Binlerce kod satırı herhangi bir belge olmadan nasıl okunur? [kapalı]


12

Daha önce bir WPF projesi için iyi bir TimeLine kontrolü arıyordum. Ben bir cevap buldum İşte beni direkt bu codeplex projesi .

Şimdi kültür ihtiyacımı karşılamak için kodu değiştirmek istiyorum. Ama bazı uyumsuzluklar var!

Sorum şu:

Böyle binlerce kod satırıyla nasıl etkileşime giriyorsunuz?

DÜZENLE:

Herhangi bir kısayol harika olacak!


3
zam isteyin. her zaman yardımcı olur. (bundan bir motivasyon yapabilirler)
Görünen Ad

2
Her şey netleşene kadar başınızı masaya vurun.
jellyfishtree

19
Bir fili nasıl yersin? ... Her seferinde bir ısırık.
Bill

1
O ne @Jalal onlar düşünmeni istiyorum.
Mateen Ulhaq

2
@DisplayName, havuç ve motivasyona sopa yaklaşımının ilkel bilişsel beceri gerektiren herhangi bir çalışma için kötü bir çözüm olduğu gösterilmiştir. Motivasyon bilimi ödül sisteminden daha karmaşıktır. Dan Pink'in 'Drive: Bizi motive eden şey hakkındaki şaşırtıcı gerçek' e göz atın, şaşırtıcı bir okuma. Veya kısaltılmış bir versiyon için bu video tüpüne göz atın. youtube.com/watch?v=u6XAPnuFjJc
Ryan Taylor

Yanıtlar:


37

Bunu yapabilmek için yeterli olduğunu anladığınızda kaynak koduna yorumlar eklersiniz. Giderek daha fazla anladığınız için bu yorumları şiddetle yeniden düzenleyin.


3
+1 ve iyi bir yol, kaynak koduna göz atarken belgeleri yazmaktır. Ve katkınızı neden op koordinatörlerine geri göndermelisiniz?

1
+1 Ayrıca, kodu değiştirirseniz, gelecek nesillerin yaptıklarınızla karıştırılmaması için yorumlarınızı da değiştirdiğinizden emin olun. Tüm bu dokümanı yapmaktan utanç duyun ve insanların nefret etmesini sağlayın, çünkü bu yanlış!
Michael K

1
Orijinal proje dağıtılmış bir kaynak kontrol sisteminde ise (git gibi) çatallamak, değişikliklerinizi aşamalı olarak yapmak ve bir şekilde yapın, böylece isteğe bağlı olarak değişikliklerinizi orijinalle daha sonra birleştirebilirsiniz

8
  1. Kodda ilerleyin
  2. Gerektiği gibi yeniden adlandırın
  3. Gerektiğinde refactor
  4. Tamamen anlayana kadar tekrarlayın

... ve kod bunun için teşekkür edecek. ;-)


7
Üretim kodundaki rastgele yerleri değiştirmek daha kolay olduğu için çok iyi bir fikir değil. Yalnızca özellik istekleri kod değişikliğine neden olmalıdır, yeniden çarpanlara ayırma bir özellik isteğidir. Ne kadar iyi olursanız olun, kod sonları, bazen aptalca yan etkiler müşterilerin güvenir. Refactor sadece çok emin olduğunuz kodu. Unutmayın, birim testleri bile hiçbir şeyi garanti etmez.
Coder

Kabul etti, ancak sadece bir tasarımı denemek için yeniden düzenleme, kodun neden olduğu gibi yazıldığını anlamanıza yardımcı olabilir (veya kötü / garip bir şekilde yapıldığını doğruladığınızı doğrulayın). Bu değişiklikleri korumak zorunda değilsiniz.
Ricky Clarkson

+1 Kodlayıcı. Ve bu cevap şu anda birim testlerden bile bahsetmiyor . Korkunç.
MarkJ

Üzgünüm, büyük bir yeniden düzenleme demek değildi. Küçük refactoring, temizlik türü şeyler hakkında daha fazla konuşuyordu. Sonuçta, kodun amacının açık olduğu noktaya geleceksiniz.
John MacIntyre

5

Tek bir işlem yapın, bu eylemin nasıl gerçekleştirildiğini bulmak için kodda hata ayıklayın (tekrar tekrar). Daha iyi anlamak için aynı dili basit bir dilde yazın!


Normalde bunu hata ayıklama modunda çalışamayan bir projeyle karşılaşana kadar da yaparım! Her zaman başlatma sırasında çöküyor! :( Ancak Yayın Modunda iyi çalışıyor: S
Afriza N. Arief

@afriza NE FUCK. Bu gerçekten kötü bir kod, size hangi hataları verdiğini kontrol edin.
Daniel S

@afriza, düzeltilecek ilk şey!

4

Joel Spolsky'nin blogunda (şu anda makaleyi bulamıyor) geri döndüğünde yazdığı bir şey gerçekten bu konuda bana yapıştı:

Kodun nasıl doğal insan dili olmadığını söyledi, ama programcılar olarak, bunun olduğunu ve onu bu şekilde okuyabilmemiz gerektiğini kolayca düşünüyoruz. Sonuç olarak, çoğumuz yeni koda bakıyoruz ve sanki İngilizce bir metin bloğuymuş gibi hemen "okuyabiliyoruz" ve anlayabiliyoruz.

Bence anahtar sadece yavaş, metodik ve bilimsel olmak. Ve diğerleri söylediler - giderken (ve hatta refactor) yorum. "Sadece bakmalı ve hemen anlamalıyım" zihninin içine düşmeyin.

Oh, ve evet, bazen bu tuzağa düşüyorum. "Söylediğim gibi yap, benim yaptığım gibi değil" ve tüm bunlar. :)


Gerçek şu ki, "sadece okuyabileceğiniz" İngilizce metin genellikle doğrusaldır, ilk başta kodun sindirilmesinin genellikle zor olmasının nedeni genellikle doğrusal olmaması ve hilenin sadece parçalanmasıdır. Geliştiricilerin kullandığı farklı uygulama deyimlerinin bolluğu da genellikle yardımcı olmaz, ancak ilk aşama genellikle bir hata ayıklayıcı aracılığıyla kodu çalıştırır ve neyin ne olduğunu görmek için kesme noktalarını kullanır. Sadece okumaya çalışmak oldukça anlamsız bir alıştırmadır. Cidden, en son ne zaman yazdığınız kodu okudunuz? (bu sona kadar başlar.)
ocodo

Aslında, iyi yazılmış kodun okunması kolaydır, ancak metin olarak değil. Sadece yapı taşlarını görmek ve çekirdek yapıyı anlamak için her şeyi okumanıza gerek yok. Eski skool kodu gibi kötü kodlama yaklaşımları veya SOLID ve kalıpların kötüye kullanılması bu görevi çok zorlaştırabilir.
Coder

4

SE-Radio bu konu hakkında Dave Thomas ile röportaj yaptı

Bu podcast bölümü, projenin 'kültürüne' girmek ve orijinal sakinlerin nasıl yaşadığını anlamak için birçok ipucu ve tekniğe sahiptir.


Dave Thomas'ın deneyimiyle ilgili komik kısım, belgelerin - üst düzey bir genel bakışın ötesinde - hiçbir istisna olmaksızın (neredeyse) hiçbir dokümantasyondan daha kötü olmasıdır . (Tecrübelerime göre, çoğu dokümantasyon, "ne" veya "nasıl" hakkında yüzey düzeyinde bir anlayış sağlayan, daha sonra yanıltıcı olmayacak şekilde değişmez bir şekilde bırakılmış olması nedeniyle.)
Michael Kropat

2

Bunu son zamanlarda 100.000'den fazla LOC projesi ile yapmak zorunda kaldım. İlk fikrim, 100.000 satır metinden ziyade 100 veya hatta 1000 düğümlü grafiklerden desen görmek daha kolaydı.

Bu yüzden 45 dakika geçirdim ve ondan ihtiyaç duyduğum şeyi ayrıştırmak ve nesne ilişkilerini çizmek için kısa (<100LOC) bir Python programı yazdım. Ben oluşturulan Graphviz bir olan kaynak, gerçekten kolay oluşturmak için dil. (Burada Python ile ilgili özel bir şey yok: Ruby veya C # veya Common Lisp veya bunu yapabilen her şey.)

Diğer projelerde, insanların modül bağımlılıkları, çağrı grafikleri, sürüm geçmişi, her türlü şey için Graphviz kullandıklarını gördüm. Şimdiye kadarki en büyük program görselleştirme meta aracı.

(Belki de derleyiciler aldım , ancak bir programcı bir sorunla karşılaştığında, sorunun bir programa kaynak kodunu içermesi dışında, yanıtın her zaman "bir program yaz!" Gibi görünmesini tuhaf buluyorum. )


1

Çalışırken hata ayıklayıcıda adım atın, yeni, büyük bir kod tabanını anlamanın neredeyse tek yolu budur.


2
Binlerce kod satırınız olduğunda (özellikle onlarca veya yüzlerce KLOC'den bahsederken) ve / veya bu kodun bir kısmı şablonlarda bulunuyorsa bu pratik bir seçenek değildir. Yeni (ve kötü belgelendirilmiş) bir kod tabanını kavramak için, işletmenin de devreye girmesi ve kodun çalışması gereken bağlamı anlamaya çalışması gerekir. Kodu bir hata ayıklayıcı ile geçip anlayabiliyorsanız, bu kod tabanı başlamak için o kadar büyük değildi (çoğu durumda bir hata ayıklayıcı kullanımını oldukça gereksiz
kılmaktadır

Woe betide bir hata ayıklayıcıda hata ayıklamak için çok büyükse betide . Kodun bilinen bir girdi ve çıktıya tepki verdiğini görmek, "ne" ile "nasıl" bilgisinin dönüştürülmesine yardımcı olur. "Neden" sorusu hiçbir zaman tek başına bir hata ayıklayıcı ile cevaplanabilecek bir soru değildir, ancak hata ayıklama sırasında IDE'de görebileceğiniz satır içi kaynak yorumları olabilir.
grrussel

@grrussel Katılmam gerekiyor çünkü bu benim yaptığım şey değil ... Temsilci olup olmadığımı bilmiyorum! Ben tür garip kesme noktası kullanmak görebilirsiniz (ama yine de açıkça adım değil) ve ben bir parça diğerine ilişkilendirmek için izin IDE özellikleri kullanıyorum.
Murph

1

Gerçekten dolgunluktan kaçmak için hiçbir kısayol olmadığını anlayın. (Ve bu cümle ile ilgili sorun yaşarsanız, eğitiminiz SORELY ihmal edilmiştir. Robert A. Heinlein tarafından "Stranger In Strangeger" dan alınmıştır.)

Her seferinde bir sayfa, her seferinde bir rutin okuyun. Yorum ekle. Büyük veri yapılarının resimlerini çizin. Algoritmaları tanır. Önceki bilgilerden yararlanın.

Hata ayıklayıcıyı çalıştırmak için günaha karşı koy. Hata ayıklayıcı görünümü çok küçük: tek seferde bir satır görüyorsunuz, ancak nerede olduğunuzu veya nereye gittiğinizi gerçekten görmüyorsunuz.


Ayıklayıcı bazı kongre açıklıyor orijinal kod yazarın değişkenler içeride beklenen şeyler konusunda sözleşmeler (örn onlar Tam Yol veya dosya adı veya göreli yolu bekliyor musunuz?) Ve daha birçok şey hala bence önemlidir bu yüzden
Afriza N. Arief

2
-1 olduğunu düşündüğünüz için "grok" kelimesini kullandığınız için
Carson63000

1

Ne yaparsanız yapın, elinizden geldiğince yazabilirsiniz, böylece hiç kimse sahip olduğunuz pozisyonda bitmez.


1

ipuçlarını kullanmanız gerekir. neye bakmanız gerektiğine dair bir ipucu alın ve ortamınızın veya IDE'nizin arama kodunu, değiştirmeniz gereken kodun istediğiniz bölümüne getirebilecek şekilde kapsamlı bir şekilde kullanın.

14 bin satırlık java kodunu okumak hiç mantıklı değil. Arama işlevi hayat kurtarıcıdır


0

Farklı insanların farklı öğrenme stilleri vardır, bu yüzden YMMV. Bu durumda yaptığım ilk şey, en az bir kez tüm kod tabanı okumaktır. Bu bana her şeyin nerede olduğu hakkında genel bir fikir veriyor. Sonra daha ayrıntılı incelemek için bir bölüm seçiyorum. Veri yapıları başlamak için iyi bir yer olacaktır. Ne olup bittiğine dair genel bir fikrim olduğunda, kodun ilkiyle etkileşen başka bir kısmı için de aynısını yapıyorum. Yeterli yinelemelerden sonra, kodun nasıl çalıştığı konusunda iyi bir fikrim var.


0

Tüm programlamada olduğu gibi, sadece kodlanmamış büyük kod parçaları değil, en iyi yol onu parçalara ayırmaktır. Bu hem kafanızda hem de görsel olarak kodda yapmanız gereken bir şey. Bu, büyük kalın yorumlar veya birden çok satır sonu eklemek anlamına gelebilir. Bu parçaları görmek için kaydırırken yardımcı olur. Kodun mantıksal parçalarını bulmaya çalışın.

Tabii ki, bitleri anladığınız zaman, muhtemelen o anda bilmediğiniz bir şey hakkında yorum yapın, muhtemelen anlamadığınız bir şey hakkında notlar yazın.

Ayrıca tüm parçayı en baştan anlamaya çalışmamanızı tavsiye ederim. Bunun yerine, şu anda bilmeniz gereken parçaları anlamaya çalışın ve gerisini daha sonra çalışın.


0

Ben kullanarak başlayacağı Leo Editor içinde @shadow modu aktif kullanımı ile klonlanmış düğümler . Bu, kod değiştirilmeden incelenen her kod bölümü için notlar ve yorumlar eklemenize olanak tanır ve ek açıklamalar her zaman bağlamda, bahsettiği kodun yanında olacaktır. Dokümanlar için örnek bir iş akışı:

Örneğin, Leo'daki bir hatayı düzelttiğimde, hatayı temsil etmek için sıradan bir düğüm oluşturuyorum. Bu hata düğümü, Leo'nun kaynak kodundaki hata ile ilgili tüm verileri görmemdir. Hata ile ilgili kodu keşfettikçe, düğümlerini klonlayıp hata düğümü altında taşıyorum. Ayrıca böcek düğümünün çocukları olarak sıradan düğümler ekleyeceğim. Bu düğümler orijinal hata raporunu, hatayı nasıl düzelttiğimin açıklamalarını, test verilerini veya saklamak isteyebileceğim diğer notları içerir.

Hata düğümünü oluşturduktan sonra, sadece o düğüme ve çocuklarına odaklanıyorum. Anahatta atlamak zorunda kalmadan böcek düğümünü ve çocuklarını inceleyebilirim. İhtiyacım olan her şey tek bir yerde. Aslında hatayı düzeltmeye geldiğimde bunu klonları değiştirerek yapabilirim. Yine, taslak etrafında atlamak zorunda değilim. Tüm taslağın ne kadar büyük veya karmaşık olduğu önemli değildir: Ben sadece böcek düğümü ve çocukları ile ilgileniyorum. Bu son derece dar odak, hataların düzeltilmesini çok daha kolay hale getirir.


0

Kaynağın diyagramlarını çizin: veri ilişkileri, fonksiyonel ilişkiler, nesne ilişkileri. Toplama, veri akışı ve kod akışını belirleyin. Resimler bunun yorumlarından çok daha iyidir ve koddan ayrı tutulabilir.


0

Herhangi bir şeyi yeniden düzenlemeden önce testler yazın. Birçok test. Devralınan karmaşaya nasıl yazıldığına bağlı olacağından, en azından çağrılabilir küçük kod bloklarına yönelik çok özel testler.

Başlamak için testler yazmanın avantajı, test etmeden önce kodu bir çeşit anlayışa sahip olmanız gerektiğidir, bu nedenle yazdığınız her test umarım biraz bilgi kazanacaktır. Ayrıca, varsayımların yanında varsayımlarınızla da testleri ağır bir şekilde yorumlayabilirsiniz.

Önce testi yaparak, kodda bilmediğiniz devirme efektlerine sahip bir şeyi değiştirme riskiyle karşılaşmazsınız. Kodu yeniden düzenlemeye geldiğinizde bir güvenlik ağınız da olacaktır.


0

Genel bir sınıf diyagramı oluşturmak için doxygen gibi araçlar kullanıyorum, her sınıfın ne yaptığını anlamamı sağlıyor.

Sonra hata kuyruğundan kolay bir hata alıyorum (yöneticim bana zor bir tane atamadan önce: P), daha sonra bu işlevselliği hata ayıklayıcıya çalıştırın ve kaba bir veri akışı veya kod akışı modeli oluşturmaya çalışın.

Örneğin, bazı yazılımlarda dışa aktarma işlevselliği: bu yüzden kaynak verilerin nasıl okunduğunu anlamaya çalışıyorum, kodun neresinden (temel arayüz), sınıfları ve kod akış diyagramlarını kullanarak sınıfın sorumlu olduğu verileri doğru şekilde okuduğumu değerlendirebilirim sınıf diyagramları ve akış şemalarına sahip olduğunuzda, anlayışın yarısının yapıldığını düşünüyorum.


0

Önemsiz bir kusura yaklaşın, örneğin bir NullPointerException. Başlangıçta eşzamanlılık ile ilgili herhangi bir şeyden kaçının, doğası gereği bir kerede çok sayıda kodun anlaşılmasını içerecek her şey.

Birkaç hatayı düzelttikten sonra muhtemelen oldukça iyi bir fikriniz olacak. Her durumda benim için çalışıyor.


-2

Temel olarak, temiz bir kod yazma eylemi tasarımdan başlamalıdır. OOP dilinde kodlama yapıyorsak, bir UML geliştirin, akranlarınızla paylaşın ve tasarımın belirsiz olmadığı konusunda ikna olun. Her halükarda, geliştiriciler tasarımın belirsizliği değil sorunu çözdüğüne ikna olmalıyız.

Kodlama söz konusu olduğunda, tasarımın koda dönüştürülmesini sağlamalıyız, yani bir sınıfa veya yapıya ait bir Varlık, işlev için bir işlem vb.

Ve beyaz bir kağıt geçti http://queue.acm.org/detail.cfm?id=2063168 stili kodlama veya çoğu IDE gibi biz uzay, girinti, Yazı varyasyonu kullanabilirsiniz nasıl FAZLA yazmak için kullanabilirsiniz bahsediyor İnsanların makineler kadar anlayabileceği TEMİZLİK kodu. Yorum ücretsiz kod yazma konusunda daha fazla vurgu yapar, böylece kodumuz paragrafların kendisi olarak görünür.

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.