Geri adım atmak ve yeni gözlerle koda bakmak nasıl? [kapalı]


53

Geçen yıl zengin bir müşteri uygulaması geliştirmek için tek kişilik bir ekip olarak geçirdim (buna değer için 35.000'den fazla LoC). Şu anda kararlı ve üretimde. Ancak, projenin başında becerilerimin paslı olduğunu biliyorum, bu yüzden şüphesiz kodda önemli konular var. Bu noktada, konuların çoğu mimarlık, yapı ve etkileşimlerdir - kolay problemler, hatta mimarlık / tasarım problemleri çoktan silinmiştir.

Ne yazık ki, bu proje ile o kadar çok zaman geçirdim ki, dışını düşünmekte zorlanıyorum - kusurları tasarımın derinliklerinde gömülü veya içsel görmek için yeni bir bakış açısıyla yaklaşıyorum.

Kafamın dışına ve kodumun dışına nasıl çıkarım, böylece daha yeni bir görünüm kazanabilir ve daha iyi hale getirebilirim?


15
Gelecekte, lütfen çapraz göndermeyin . Yanlış StackExchange sitesine göndererek bir hata yaptıysanız, geçişi işaretleyin ve nereye ait olduğunu düşündüğünüzü açıklayın ve bir moderatör sizin için soruyu taşıyacaktır.
maple_shaft

Tamam, yapacak! :) Birkaç kişi kapanmak için işaret etti, hareket etmek değil, bu yüzden tüm soruyu sildim ve buraya getirdim.
BenCole

Evet! - insanlar 'bayrak' düğmesini değil, 'kapat' düğmesini tıklamıştı (en azından öyle olduğunu düşünüyorum). Bundan sonra kendim işaretleyeceğim ve yine de göçü bekleyeceğim.
BenCole


IMO, Bir şeyleri geliştirmek için yollar bulamazsanız, o zaman yeterince bilmiyorsunuz. Geçmişte gerçekten harika tasarımlar yarattım , ancak bir süre sonra geri döndüğümde neden bu kadar aptalca bir şey yaptığımı merak ediyorum. Her neyse, tasarımınızın gayet iyi olduğu yaklaşımını kabul edebilirsiniz. Sonra, özellikler eklediğinizde, zor olsaydı, nasıl kolaylaştırabileceğinizi anlayın.
Dunk

Yanıtlar:


46

Buna yaklaşmanın yolları:

  • Teknoloji ve işletme problemine aşina birisini bulun ve konuşun. Tek kişilik bir takımda bu zor olabilir, ancak genellikle en iyi seçenek.
  • Bir süre farklı bir proje üzerinde çalışın. Bu da zor olabilir, ancak bir hafta ara vermek bile size taze bir bakış açısı kazandırabilir.
  • Varsa, açık kaynaklı ürünler gibi benzer projelere veya ürünlere bakın. Kodu kopyalamamaya dikkat edin, ancak fikre tamamen farklı şekilde yaklaşmış olabilirler.
  • Yeni bir dil, kütüphane veya çerçeve öğrenin. İlgili teknikler, sahip olduğunuz aynı problemlere farklı şekilde nasıl yaklaşılabileceğiniz konusunda size fikir verebilir.
  • Tasarım veya dil / çerçeve hakkında iyi bir kitap / blog / dergi okuyun. Ne düzeyde bir beceride olduğunuzu bilmiyorum ama bu sitede diğer cevaplarda birçok alternatif var.

Ele almak istediğiniz belirli örnekler varsa, belki de onları buraya gönderin.


6
+1 yeni bir dil / çerçeve öğrenir. Bir komut dosyası dilinde çalışıyorsanız, nesne yönelimli bir dil öğrenin. OO ise, işlevsel (lisp-ish) bir tane öğren. +1 okuma - özellikle veri yapıları, tasarım desenleri, yeniden düzenleme ve en iyi uygulamalar. Henüz yapmadıysanız, Joel, Yazılım kitaplarını okuyunuz. Sizi yeni fikirlere açık tutmak için kullanıcı gruplarını ve bu siteyi de öneririm. ACM bölgenizde görüşmeler yaparsa katılın ve katılın!
GlenPeterson

2
Daha spesifik olarak, dilleri henüz öğrenmediyseniz, Haskell'i öğrenin, herkesin programlama problemlerine yaklaşım şeklinizi temelden nasıl değiştireceği konusunda abartıyor ve düşkün olduğunuzu düşündüm. İyi bir bilim adamı olarak hipotezimi sınamayı öğrenerek ortaya koydum, çok hatalıydım. Sen olur zaten Haskell öğrenmiş değil eğer farklı sonradan geçerli tasarımınızı yaklaşır.
Jimmy Hoffa

1
Konferansa git burada eklenmeli, IMO. Aşağıda ayrıntılı cevaplarıma bakınız.
Macke

Farklı proje için +1. Günlük yaptığınız işin kapsamı dışında tamamen bir şey deneyin. Taze bir mimari zorluğun yanı sıra birkaç paralellik bulacaksınız.
Gecikme

13

Lastik ördek hata ayıklaması : Bir kod parçası veya modül ya da özellik ile oturun ve yüksek sesle açıklayın. Kendinizi yanlış, aptal veya basit bir şey söylerken bulduğunuzda araştırmak için bir sorun olarak yazmayın.


9

Öğrenmeye ve becerilerini geliştirmeye devam et. Ne bilmediğinizi bilmek zordur, ancak onu gördüğünüzde, bu "aha" anı size çarpacaktır. Başka bir dil veya tasarım deseni öğrenmekten gelebilir.

Sizden bir değişiklik yapmanız istenecek. Kodunuzun çok esnek olmayan ve çok fazla çalışma gerektirecek kısımları bulabilirsiniz. Bu mutlaka bir başarısızlık değildir, çünkü ilk başta her şeyi düşünemezsiniz.

Kullanıcılar şikayet etmeye başlayacak. Sadece her şeyin harika olduğunu düşündüğünüzde ...


7

Kısa bir hafıza yardımcı olur. Bir hafta önce bir şeyleri değiştiren "salak" hakkında şikayette bulundum, sadece kaynak kontrolünden bulmak için bendim.

İyi bir ilk adım, geliştirilebilecek kodu tanımlamaktır. En sık değişen dosyalar için kaynak kontrolünüze bakın. Hangi kodla çalışmak en zorudur? En çok hangi hataları kodlar? Ne tür değişiklikler kod boyunca bir dalgalanma etkisine neden olur? Bu aşamada, bilmek zorunda değilsiniz neden kodu zahmetli sadece, o da zahmetli bu.

Çalışılacak alanları belirledikten sonra sorunun gerçekte ne olduğunu anlamaya çalışın. Tasarım problemlerini kategorize etmek için sistematik bir yaklaşım gösteren kitaplar var. Martin Fowler's Refactoring'e , Herb Sutter'ın C ++ Kodlama Standartlarına , Robert Martin'in Temiz Koduna , vb. Bakın.

Sorunun olası olduğunu belirledikten sonra, düzeltmenin farklı yollarını deneyin. Örneğin, uyguladığınız kural "kalıtım yerine kompozisyonu tercih ediyor" ise, kompozisyonu değiştirin ve nasıl hissettiğini görün.

Açıkçası, bir başkası koduna bakmak için yararlı olabilir, ancak, çünkü o, her zaman düşündüğünüzden kadar yararlı değil çok daha tanıdık kod herkesten daha neden sorunların türlü ve tasarım ardındaki nedenleri . Kendi tasarımınızı objektif olarak değerlendirmenin bazı yollarını öğrenmek, büyük kar payları ödeyecektir.


3
Aptal dürüstlüğü için +10 yorumu yap. :)
Jennifer S

2
"Kurallar" tabanlı yaklaşımla ilgili olarak, statik analiz araçlarını çalıştırma (örneğin, C için lint, JavaScript için JsLint, Java için Findbugs, .NET için FxCop) sık sık yararlı ipuçları verebilir ve kod metriklerinin (ör. Döngüsel karmaşıklık, LCOM4) gösterebilir Kodun hangi kısımlarının sorunlu olabileceğini size. Elbette beyninizi her zaman kullanmalı ve bu tür araçların tavsiyelerini bir tuz tuzu ile almalısınız.
Daniel Pryden

4

Başka bir kişinin koduna bakmasını sağla. Bakacak başka bir kişi bulamazsanız, başka bir kişiye göstereceğiniz gibi etkileşimin tam bir tanımını yazın. Kararlarınızı bir başkasına (sadece pratikte olsa bile) açıklamaya çalışmak süreci, NEDEN şeyleri belirli bir şekilde yaptığınızı düşünmenize ve mantığınızda herhangi bir delik görmenize yardımcı olabilir.


3
Teknik olmayan bir kişiye bile açıklama yapmanın faydalı olduğunu düşünüyorum. Programcı olmayanların tasarımı anlamasını ve neden bir pencere fabrikası fabrikası fabrikasına ihtiyaç duyması gerektiğini tatmin edici bir şekilde açıklayabilirsem, o zaman belki bir pencere fabrikası fabrikası fabrikası kullanmak iyi olur.
Leif Carlsen

4

Bu durumu çok iyi biliyorum. Bu şekilde sıkışıp kaldığımda projeye farklı bakış açıları koymaya çalışıyorum.

1.) Kullanıcı / müşteri bakış açısı - geri bildirimi kullanın

Maalesef kodumuza kendi kusurlarımızı göremeyeceğimiz şekilde yakalandık çünkü uygulamalarımızı kodladığımız şekilde kullanıyoruz. İnsanların onu nasıl kullandıklarına bakın ve en sezgisel kullanıcı rehberliğinin ne olacağını anlamaya çalışın. UI prototipleriyle oynayın. Bu eğlenceli gözüküyor, ancak kullanım mantığını yeniden tasarlamaya başlamanın zamanı geldiğinde değiştirerek kodunuzun büyük bölümlerini yeniden kodlamanız gerekeceğini öğrenirseniz.

2.) Kodunuzun işlevsel bir analizini yapın ve görselleştirin

Bazı IDE'ler ve çerçeveler sizi örneğin UI ve arka uç kodunu karıştırmaya zorlar. Bunun olmasına izin verirseniz, bir gün kod tabanınızın belirsiz ve kırılması zor bağımlılıklar nedeniyle zorlukla korunabileceği durumuyla karşı karşıya kalacaksınız. Özellikle UI kodunun diğer kodla karıştırılması, spagetti koduna ve gereksiz işlevlere yol açabilir. Kodunuzu, örneğin veritabanı sınıfları, iletişim sınıfları, UI sınıfları, temel sınıflar vb. Gibi işlevsel bloklara bölün ve fonksiyon bloklarına konuşma isimleri verin. Daha sonra, farklı projeler için devasa kod bloklarını yeniden kullanabileceğiniz ve bunları daha yeni sürümlerle değiştirebileceğinizden, mantıklı ve modüler olup olmadığını anlamak için işlevselliği grafiksel bir araçla görselleştirin (bir zihin haritalama aracı kullanıyorum). büyük acı.

Bunu benim deneyimlerime göre yapmanın en iyi yolu, sınıflarınız ile onların kodları arasındaki çağrıları arasındaki tüm bağımlılıkları görselleştiren bir belge oluşturmaktır. Sonuç, arayüz tasarımınızın görselleştirilmesidir. Bu kod haritası tam bir clusterf *** gibi görünüyorsa, hareket etme zamanından daha fazla. Henüz gerçekleşmediyse, kod yapınızı temsil eden ve onu nasıl arayacağınızı ve ne yaptığını düşünmek zorunda olmadığınız şekilde temsil eden uygun bir adlandırma kuralını düşünmelisiniz.

3.) Kalite güvencesine ortak yaklaşımlar kullanın.

Benim favorim FMEA. Kodlama açısından bu, geçmişte neyin yanlış gittiğini analiz etmek değil, neyin yanlış gidebileceğini de düşünmek anlamına gelir. Oldukça yaygın bir örnek aniden bırakılan bir ağ bağlantısıdır. Bunu yaptıktan sonra, hata koşullarını veri kaybı, çökme, yanlış hesaplama ve kullanıcı üzerindeki etkiyi yargılamak gibi sonuçlara göre sınıflandırabilirsiniz. Henüz yapılmadıysa, basitleştirilmiş hata ve istisna sınıflarını ve yordamlarını tanımlamak kodunuzu temiz ve düz tutmanıza yardımcı olabilir. En iyi yol, başka bir şey yazmaya başlamadan önce bunları her yeni kod huzurunda uygulamaktır. (Ben her zaman bu tavsiyeyi kendim takip edemem suçluyum.)

Ayrıca, kendi kodum için bir "iyileştirme teklifi listesi" oluşturmam ve sık sık güncellememe yardımcı oldu. (Dürüst olmak gerekirse, projelerimde kesinlikle gurur duymadığım çok sayıda kod var.) Ayrıca API belgelerinden, geliştirici konferanslarından veya geliştirici dergilerinden en iyi uygulama kodlarını toplamaya ve incelemeye zaman ayırmaya çalışıyorum.

Bu noktaya kadar kodunuza dokunmanıza gerek yok. Neyin yanlış gittiğinin farkına varmak ve kodunuzu nasıl geliştireceğinizi tanımlamanın bir yolunu bulmaktan ibaret.

Sonunda eski bir osuruktan günlük iş için bazı ipuçları. Yemekten daha fazla ısırmaktan kaçının. Bu, temiz kodlama için çok fazla baskıya neden olur. Bunu doğru yapmak için nadiren zaman kazanıyorsunuz, ancak sonrasında kusurları düzeltmek için zaman ayırmanız gerekecek.

Hiçbir şey geçici çözüm kadar uzun sürmez, ancak kırıldığında zamanla düzeltmek için genellikle geç kalır. Örnekler, temel çerçevedeki veya işletim sistemindeki bir kusura rağmen çalışacak bir şey almak için kullandığım kötü kesimler veya garip istisnalar. Ardından kusur düzeldi ya da yeni sürüm basitçe API'yi düşürdü…

Sıkışırsanız ve zaman zaman gözden geçirilmesi gereken notları almaktan ve yorum yapmaktan başka bir geçici çözüm bulmak zorunda kalırsanız. Normalde yeni bir şeyler öğrendiğimiz için daha iyi ve daha iyi oluruz. Daha iyi bir yol bulursanız, mümkün olduğu kadar çabuk uygulayın. Aksi takdirde, bir geçici çözüm için istisna kodunu ve istisna istisnasını kendiniz kodlayabilirsiniz. (Aranızda günahsız olan, bana ilk baytı atmasına izin verin.)


2

Küçük şeyleri terleme.

Herkes daha iyi kodlar. İşleri hızlı yaparız ve daha birkaç hafta sonra daha verimli bir şekilde yapılabileceğini anlarız. Mesele şu ki, kodunuzun% 90'ı muhtemelen yeterince iyi.

Hata günlüklerinize bakın ve sorunlara yol açabilecek rutinleri bulun. Hataları bulduğunuzda, kodu gözden geçirebilir ve kodu daha verimli hale getirebilecek şeyleri düşünebilirsiniz. Çoğu zaman, böceğin kendisini düzeltmenin ötesinde, gözle görülür bir iyileştirme yapamayacağınızın farkına varacaksınız, ancak bazen, bir şeyi yapmanın daha iyi bir yolu olduğunu anlayacaksınız.

Kullanıcılarla konuşun ve UX veya hız sorunları gibi sorunları fark ettiklerini görün. Bu sorunları düzeltin ve kodunuzu geliştirmeye çalışın.

Bir noktada, kodunuzun çok kırılgan hale geldiğini ve yapmanız gereken değişiklikleri yapmanın hiçbir yolu olmadığını keşfedeceksiniz. O zaman sistemi nasıl API ile veya test odaklı bir gelişme ile daha esnek hale getirebileceğinizi düşünün. Çoğu durumda, bu API'leri büyük miktarda değişiklik yapmadan koda koymayı başlatabileceğinizi keşfedeceksiniz. Diğer durumlarda, kodu geliştirme çabasının buna değmediğini fark edersiniz.

Artımlı değişiklikler zor olabilir. Amaç, gerekmediğinde tamamen kod tabanını yeniden yazmak değildir. Elbette, bir yıl öncekinden daha iyi bir programcısın, ama şu anda çalışman gereken şey. Bundan 5 yıl sonra, küçük bir programcı size eski koddan şikayet etmeleri durumunda, düzeltmeye çalışmak zorunda kaldıklarını, sadece gülümseyip onayladıklarını ve yazdığını itiraf etmediklerini söyledi.


1

Takımda olabileceğiniz bir şirketten ayrılıp şirket bulmayı düşündünüz mü? İzole veya durgun bir takımda, geliştiricilerin mesleğin sunabileceği birçok şeyi kaçırdığını çok kuvvetli hissediyorum.

Akran değerlendirmeleri, başınızın dışında olan birisinin tavsiyelerde bulunmasına izin verir. Yığın Değişim Kodu İnceleme, şirketinize incelemesi için özel olmayan bazı kodları koymak için iyi bir yer olabilir. Muhtemelen büyük blokları kaldıramaz, ancak birçok program basit bir koddan ve basit olmayan ve birçok problemden başka bir çok koddan oluşur. Tipik bir kod örneği varsa, ancak birçok yerde tekrarlanan ve değiştirilen bir örneğiniz varsa, bu da iyi bir inceleme adayı olabilir. Örneğin, mesajları biçimlendirirseniz, tüm iletilerin gözden geçirilmesini istemeyin, sadece oldukça karmaşık bir örnek ileti.

Kendi kodunuz hakkında daha objektif olmak istiyorsanız, kodlama standardına göre karşılaştırabilir, statik veya dinamik kod denetleyicileri çalıştırabilir veya seyrek olarak belgelendirilmişseniz, yorum eklemek yardımcı olabilir.

Kendi kodunuzu test etmeyi zorlaştıran bir test psikolojisi vardır, ancak ünite testi sırasında bunu yapmak için elimizden gelenin en iyisini yapacağız. Kendi kodunuzu okumak benzer veya daha kötü bir problem olabilir. Birçok alan, mentorları, rekabetçi yargılamayı, koçları vb. Kullanır. Hata raporlama aracına veya müşteri destek departmanına erişimi olan müşteriler, ürün sahaya çıkarıldıktan sonra size kafanızın dışından geri bildirim verecektir. Bu, Agile'nin erken ve sıklıkla serbest bırakma yaklaşımının bir başka harika nedenidir. Şirketinizdeki tek geliştirici siz olabilirsiniz, ancak kodunuzdan etkilenen ve belirli bir açıdan size geri bildirimde bulunabilecek insanlar var.


0

“Bu düşündüğümden daha küçük bir sorun mu, yoksa bu başkalarının da yaşadığı bir sorun mu?”

Sheesh. Zaten yeterli. Kod üretiliyorsa, hatasızsa ve yapması gerekeni yapıyorsa, mimari önemsizdir. En azından şimdilik.

Hepimiz umarım biz giderken öğreniriz. Yazdığım sırada gurur duyduğum bir sürü kod yazdım, sadece bir veya iki yıl sonra korkunç olduğuna karar vermek için. Şu anda, inanılmaz miktarda kod içeren, çok yıllı bir proje üzerinde çalışıyorum, ancak kod çalışıyor. Herhangi birine dokunmak için çok muhafazakar bir yaklaşım izliyorum.

Ve sen de öyle yapmalısın. Şu anda herhangi bir büyük mimari sorun görmüyorsanız, bir yıllık çalışmadan sonra, şu an için önemli bir şey olmadığını varsaymanın sizin için güvenli olabileceğini düşünüyorum. Bu kötü işçilik değil. İlerliyor.


0

Diğer cevaplara ek olarak, bir geliştirici konferansına gitmeyi tavsiye ederim.

Bu, sizi kendi uygulamanız ve iş yeriniz hakkında düşündürecek birçok konuya ve kişiye maruz bırakacaktır. Özellikle de o zaman için neyin işe yarayıp neyin olacağı ve ortaya çıkan sorunlar hakkında konuşacaklar. Uygulamanızla örtüşen büyük bir olasılık var.

Tercihen, bunun için 3 gün sürebilir. Kendi çalışmamla gerekli zihinsel mesafeyi elde etmek ve benimkinden ziyade daha geniş bir topluluğun (konuşmaya) gözlerinden bakmak için yeterince uzun olduğunu buldum.

Bu arada, bu aynı zamanda grup ekipleri her yerde olabileceğinden, insan ekipleri için de geçerlidir.

Son olarak, bunun için onay alamazsanız, yılda bir kez söyleyin, işi değiştirin.


-1
  • Tasarım desenlerini uygulama ve En iyi uygulamalar
  • Uygulama gereksinimlerinize ve gereksinimlerinize göre bir çerçeve, araçlar, paketler vb. Seçin - bunun için çok sayıda aşındırma blogu okumanız ve her bir teknoloji sorununa yönelik çözümler bulmanız gerekir.
  • Tasarım / mimari taslağı oluşturun ve teknik / mimari konularında iyi olan birisiyle görüşün. Geri bildirim ve yorumlar kullanarak bu taslağı geliştirin. istikrarlı bir hal elde edene kadar bunu yapmaya devam edin.
  • Uygulamanın ihtiyaç duyduğu her şeyin yapılandırılabilir ve bakımı yapılabilir olduğu şekilde kod uygulayın

    projenizi yeniden inşa etmek ve yeniden uygulamak kesinlikle uygulamanın daha iyi tutarlılık, performans vb.


-1

Birkaç akıllı insanın kaygılarını dile getirmeye başladığına inanıyorum. Belirli bir bilgi olması gerekiyor. 24x7x365 web sitesi mi? LoB uygulaması? Nerede koşuyor veya barındırılıyor?

Temel hedeflere ve istenen sonuçlara ulaştığınızda, diğerleri dikkatinizi odaklamak ve yönlendirmek için yardımcı olabilir. Kodunuz, belirli bir görev için yazılmış en iyi kod veya en kötüsü olabilir. Gerçekten önemli değil - bu istenen hedefi nasıl etkiler?

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.