Son derece kötü yazılmış kodlarla çalışırken nasıl verimli kalırsınız?


63

Bir işe girmeye karar vermeden önce yazılım endüstrisinde çalışmak, kendi kendini eğitmek ve açık kaynaklara katılmak konusunda fazla tecrübem yok. Şimdi para için çalıştığım için, elbette normal olan bazı hoş olmayan şeylerle de uğraşmak zorundayım.

Kısa süre önce, işi kodlamayı öğrenen bazı programcılar tarafından yazılmış büyük bir SharePoint projesine kayıt eklemek için görevlendirildim. 2 yıllık işbirliğinden sonra müşteri firmamıza geçti, ancak hasar verildi ve şimdi bir şekilde bu kodu korumam gerekiyor.

Kod oldu değil o çok okumak zor. Sorunlara rağmen - her projenin birkaç kopya yapıştırılmış metodu, muazzam ifyuvaları, Macarca Sistemleri, istenmeyen bağlantıları olan bir sınıfı vardır - hala okunabilir.

Ancak, kayıt eklemek kadar basit bir şey üzerinde çalışmakla birlikte kendimi kesinlikle verimsiz buldum. Temel olarak, sadece adım adım kodu gözden geçirmem ve bazı izleme çağrıları eklemem gerekiyor. Ancak, kodun salak o kadar sinir bozucu ki, 10 dakika içinde yoruldum . Başlangıçta, usingyapı ekler , tersine çevirerek iç içe geçirmeyi azaltır if, değişkenleri okunabilir adlara yeniden adlandırırdım - ama proje büyük ve sonunda pes ettim. Bunun yapmam gereken görev olmadığını biliyorum, ama en azından karışıklığı azaltmak bana devam etmem için bir çeşit psikolojik ödül verdi. Püf noktası çalışmayı bıraktı ve işimin% 60’ını hala yapıyorum.

İşten sonra başım ağrıyor ve artık alıştığım memnuniyeti hissetmiyorum - bu da genellikle 10 saat boyunca kod yazmamı ve hala taze hissetmemi sağlayacak.

Bu sadece büyük bir rant değil, çünkü gerçekten gerçek bir sorum var:

Üretken kalmanın ve yel değirmenleriyle savaşmamanın bir yolu var mı?

Önceki programcı tarafından başka bir zekice numara gördüğümde , “Ne kadar aptalca ?” Diye düşünmek yerine, göreve odaklanmak için bir tür psikolojik numara var ? Günlüğe kaydetmenin eklenmesiyle ilgili sorun , kodun ne yaptığını gerçekten anlamak zorunda olduğum ve bunu yaparken beynimi tatsız bir şekilde incittiğimdir.


Macarca notasyonu fena değil, ne hakkında konuştuğunu görmek için orijinal makaleyi okuyun :)
Woot4Moo

14
Macarca'nın fena olmadığını biliyorum. İşte tam da bu yüzden Apps Macarca değil, Sistem Macarca yazmıştım . C # dilinde Hungarian Systems kullanmak için hiçbir anlam göremiyorum çünkü mükemmel tip sistem ve IDE var. Temelde okunamadığı için aynı kapsamda 10 değişkene sahip olmak, her şeyden önce göz korkutucu. obj
Dan

2
Keşke bu soruyu birden fazla oy verebilseydim!
o6tech


9
Beni aşağı indiren yığında huysuz sorular sorarak buharı patlattım.
Erik Reppen

Yanıtlar:


32

Söylediğim için üzgünüm ama tüm işler güneş ışığı ve çekiciliği dolu değil. Geliştirme görevlerinin çoğunluğu, bunun gibi sarhoş işleri içerir. Acı ama gerçek.

Boyanın kurumasını izlemek sıkıcı olsa bile, önemli bir işle görevlendirilirsiniz. İki nedenden ötürü önemlidir: 1. Büyük bir sisteme çok fazla ihtiyaç duyulan günlük kaydını ekler, böylece bir şeyler ters gittiğinde onu bulmanıza yardımcı olacak bir aracınız olur. ve 2. Kod tabanına aşina olmanızı sağlar, böylece bir şey yanlış giderse, atlayıp düzeltebilirsiniz.

Temel olarak burada kendi güvenlik ağınızı yaratıyorsunuz. Cazibe, hayır, ama önemli evet!

Öyleyse, söylenmek kendini nasıl motive etmelisin? İşyerinde akıl almaz bir işim olduğunda kendim için hedefler koyarım. Hafta sonuna kadar x görevini tamamla. Hedefimi yaparsam, kendimi ödüllendiririm. Yeni restoran denemek istiyorum? Bitirirseniz Cuma gecesi gidin. Yeni film çıktı mı? Bitirirseniz hafta sonları görün.

Süpervizörümle konuşurken ve nerede olduğumu ve nasıl ilerlediğimi bilmesini sağlamak beni sorumlu tutar. Onlara Cuma günü yapılacağımı söylersem, Cuma günü b / c'ye kadar yaptırma konusunda daha meyilli hissediyorum, onlara yapmam gerektiğini söyledim.

Bu görevi tamamladığınızda ve bunu iyi yaptıktan sonra, insanların farkedeceği zaman ve bütçeye göre ve bu parlak yeni projenin ortaya çıkması durumunda adınız, onu alan kişi olarak önerilebilir. :)


Özellikle Cuma günkü motivasyona dikkat ediyorum. Şu anki sürümün de Cuma gününe programlanmış olması komik. Bence şükran motivasyonunun hareketli olduğunu da eklemeye değer. Birinin işiniz için minnettar olacağından emin olmanız veya üzerinde çalıştığınız şeyi değiştirmeniz gerekir. Samimi 'teşekkür ederim' sık sık huzursuz saatleri geri alır.
Dan

1
@gaearon - Önerilerin sizin için yararlı olmasına sevindim. Dürtü çalışmasını iyi bir motivasyonla elde etmek sonunda sonuç verir. Geçen yıl şu anki işimde yaptığınız işe benzer bir şey yapmak zorunda kaldım. Bu yıl sıfırdan yazmak için yepyeni bir uygulama verildi. İnsanlar ne yaptığınızı ve ne kadar iyi çalıştığınızı fark edeceklerdir.
Tyanna

3
-1 Neden iş hayatınızı ve kişisel yaşamınızı birbirine bağlıyorsunuz? Bu sürekli fazla mesai kalmak gibi görünüyor -I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac

@Vorac ~ Kendimi motive etmek için yaptığım şeyin bu olduğunu söyledim. Herkes farklıdır. Sizi temin ederim ki sürekli olarak OT çalışmıyorum. Sizi motive eden bir şey bulun ve kullanın. Yapmak istemediğim bir işim varken en iyi madalyayı buluyorum.
Tyanna

1
@BirlikBirinci ~ Benim için, evet. Yapılacaklar listemi bitirmek için geç kalacağım. Vurduğuma emin olmak için vaktimi bütçeliyim. Tamamlayacağımı söylediğimde bir şeyi tamamlamak kendime ve iş arkadaşlarına karşı bütünlüğüm. Ancak, söylediğim sürede yapamayacağımı keşfedersem, planı değiştirir ve amirime bildiririm. Ve eğer biraz geç kalırsam, film / restoran gelecek hafta orada olacak. :)
Tyanna

30

Thedailywtf.com sitesine gönderilecek aday kod pasajlarının bir dosyasını saklayın. Gerçekten göndermeyi düşünmüyorsanız bile, size ortalamadan daha kötü bir kod bulma konusunda parlak bir yön verir.


Keşke bir kez daha oy kullanabilseydim. Bu gerçekten harika bir öneri olduğu ortaya çıktı, şimdi bu adamların gerçek ayarları yapmadan önce kendi değişiklik listelerini uygulama yapılandırma dosyalarında sakladıklarını öğrendim.
Dan

24

Benzer bir durumdaydım, kötü yazılmış, kitlesel kopyalanan ve yapıştırılan kodlardan oluşan büyük bir cesedi temizlemekle görevliydim.

Motivasyonumu ve akıl sağlığımı korumak için current_score, projedeki LOC'yi sayan bir senaryo yazdım (yinelemeyi ortadan kaldırdığım ve daha iyi algoritmalara geçiş yaptığım için giderek azaldı) ve başladığımda bunu LOC ile karşılaştırdım. Ne zaman karşı karşıya kaldığım kod dağından caydırılsam ya da sinirlensem, koşmak current_scorebana somut bir ilerleme hissi verecektir ve bana ne kadar çok şey başardığımı hatırlatırdı. Ve özellikle kötü kod bölümleriyle uğraşırken ne kadar yüksek puan toplayabileceğimi görmek çok eğlenceliydi.

Kendine bir ilerleme hissi vermek ve onu bir tür oyuna dönüştürmek için kolayca yazabileceğin benzer ölçüleri arardım. Kod satırları (sadece çalıştırma wc -l), döngüsel karmaşıklık (sükunetli "ifs" lerin içini temizlerken aşağıya inmeniz gerekir), selefiniz yerine dokunduğunuz kod satırları ( FishEye'in bunu size söyleyebileceğini düşünüyorum. 10 $), vb. Hatta henüz günlük ifadeleri olmayan kod bloklarının sayısını saymakta çok fazla zorlanmadan bir Perl betiği bile yazabilirsiniz .


SourceMonitor
UmNyobe

13

Bu kitabı tavsiye ettim: Eski Kodla Etkili Çalışma , ancak neyse ki okumaya gerek yoktu.

Yaptığınız gibi, kodu tekrar anlayabilmeniz için neye ihtiyacınız olduğunu yeniden düzenleyin ve sadece bir sistemi canlandırdığınızı unutmayın, bunu sürdürürken ödeyecek.
Umarım eve giderken adımına bir bahar koymalıdır.


2
Bu kitap test edilebilir hale getirmek için mevcut kodu yeniden düzenlemekle ilgilidir; Motivasyon konusunda çok yardımcı olacağını sanmıyorum.
Billy ONeal,

2
İyi bir nokta @Billy ONeal, ancak test edilebilir bir koda ve ilgili ölçümlere sahip olmak, motive edici olabilecek ilerlemeyi gösterebilir.
StuperUser

1
Bu kitabı okudum. Kesinlikle okumaya değer. Aslında WEWLC'yi motive edici buldum, çünkü orada olduğum kesin sıkıntıları tam olarak anlayan ve bu sıkıntıları gidermek için etkili yollar tasarlayan biri olduğunu bilmek güzeldi.
Jason Swett

1
Bu kitap çok eski ve modası geçmiş. Eğer okumadıysanız, neden tavsiye edersiniz?
BЈовић

1
@StuperUser Okuduğumda eski olduğunu söyleyebilirim ve acemi kullanıcılar için bazı yararlı tavsiyeler sağlayabilirim.
BЈовић

6

Projeyi parçalara ayırmaya çalışın. Her gün belirli bir parçanın nasıl çalıştığını öğrenir. Hepsini bir kerede anlamaya çalışmak muhtemelen sizi strese sokan şeydir.

Projeyi daha iyi hale getirmekle gurur duyun. Konuşabileceğin başka kodlayıcılar var mı? Bulunan en son mantıkla tartışırken / gülerken su soğutucusunun etrafında durmaya yardımcı olur. İşyerinde neşeli bir atmosferi korumak için bunu yapmaya çalışıyorum.


Evet, topaklarla çalışıyorum ve zaten bir süredir üzerinde çalışıyorum, bu yüzden her bir bileşen hakkında kabaca bir fikrim var. Yine de pek faydası olmadı, çünkü genellikle anlaması zaman alan küçük bir mantık parçası - ve 10 dakika boyunca geçirdiğim 30 satır yönteminin 2 satırda yeniden yazılabileceğini fark ettiğimde sinirleniyorum. Şirkete gelince, maalesef, bu projedeki tek geliştiriciyim ve şu anda müşterinin ofisinde çalışıyorum, böylece gerçekten konuşabileceğim hiç kimse yok.
Dan

@ gaearon - 2 satırlı çözümünüzü uygulamanıza ne engel olur? Yapmanız gereken görevi nasıl yapacağınızı çözmeniz gerekir, müşterinin ofisinde olmadığınız zaman, kodla ilgili sorun daha sonra çözülebilir. Yaptıklarınız, işlerin nasıl yürüdüğü hakkında notlarınızı saklamanız gerekir, böylece ileride daha sonra geri dönebilir ve değişikliklerinizi uygulayabilirsiniz;
Ramhound

@gaearon ah-ha! Sen tek kodlayıcısın. Yani senden önceki adam tek kodlayıcıydı. Tek kodlayıcı olduğunuzda (selefinizden fark ettiğiniz gibi) birçok şeyden kurtulabilirsiniz. Bir sonraki işinizi ararken bunu aklınızda bulundurun. ;)
davidhaskins

@Ramhound Bahse girerim, kod incelemesi olmayacak. Bahse girerim, resmi bir entegrasyon testi yapılmayacaktır. Bu pozisyonlarda birkaç kez çalıştım. Genellikle insanlar sadece yeterince iyi çalışan kod isterler ve mümkün olduğu kadar çabuk isterler. "En iyi uygulamaları" açıklamak, bir duvarla konuşmak gibi, IMHO.
davidhaskins

@Ramhound, bu proje için test yok ve daha temiz kod için sistemi mahvetmekle sorumlu olmak istemiyorum. Geçerli kodun yutulan istisnaları ima ettiği veya başka türlü kötü davranışa dayanmadığı birçok durum vardır; Bu arada, log kaydı eklememin sebeplerinden biri de bu.
Dan

6

Sorularınızı, düşüncelerinizi ve sistem anlayışınızı düzenlemek için kapsamlı notlar alın . Bu, büyük eski sistemlerle uğraşırken benim için harikalar yarattı. Anlayışınızı kristalleştirmeye yardımcı olur, açık soruları kelimelere dökmeye yardımcı olur ve düşünceleriniz zaten bir araya getirildiği için başkalarıyla problemler / sorular / fikirler / vb. Hakkında kendiliğinden iletişim kurmayı kolaylaştırır.

Örnek olarak, bir kod parçasından geçerken, kendime sürekli not alacağım. Bu benim kendimle olan konuşmam. Yalnızca yazma eylemi daha fazla düşüncenin ortaya çıkmasına yardımcı olur ve işleri daha iyi anlamama yardımcı olur. Bir süre sonra bir Eureka'ya sahip olabilirim ve ne düşündüğümü ya da hangi parçaları bir araya getirdiğimi göstermek için kağıt üzerinde "büyük resim" ile küçük bir diyagram çizmem gerekebilir. Bunu her zaman sadece kağıt üzerinde yapıyorum, bilgisayarın tüm dikkatini dağıtmaktan kurtuluyorum. Bu, yaptığım şey hakkında daha sistemli ve düşünceli olmamı sağlıyor.

Bu, temel olarak, bir etki alanı uzmanıyla kalıcı bir sohbet gerçekleştirmenin uygun bir yoludur :)


3

Verimlilik hissedemeyeceğinizi biliyorum çünkü aslında 'günlüğe kaydetme ekliyorum' perspektifinden bakıyorsunuz, aslında günlüğe ekleme ekliyor ve çok fazla yeniden düzenleme yapıyorsunuz. Danışmanınız muhtemelen kod durumunun farkındadır. Artık herkes bunu takdir etmeyebilir, ancak gerçekten ilginç ve zorlu bir özellik eklemek için bir istek aldığınızda, kodu temizlemekten memnuniyet duyarsınız.


Korkarım projeyi yeniden yazmaya başlayacağım, zaten konuştuk. Bu seçeneği daha çok sevsem de, kod atma konusunda verimlilik eklemiyor. Bir sonraki sürümde günlüğe kaydetmenin gerekli olduğunu biliyorum, ve sonra eşyalarımla başa çıkabiliyorum, ama bu beni kafamı karıştırmak için kullanmam gereken kodlar arasında. Anladıktan sonra manyak alıyorum gibi hissediyorum :-)
Dan

1
Atma koduyla çalışma konusunda verimlilik katmıyorSuuure . Düşük riskli bir görevi yerine getirirken kodlamayı anlayabilmeniz için büyük bölümlerden geçersiniz (logging). Kazandığınız bu bilgi, eğer tekrar yazmaya gelirse, çok yardımcı olacaktır . Eğer bir yeniden yazma yoksa, uygulamanın büyük miktarlarını temizlediğinizde hissedeceğiniz ödülü dört gözle beklemeye çalışırsanız, kod tabanının tutarlı ve kalıcı çabalarınızdan ne kadar daha iyi olacağını düşünün.
quentin-starin

2

Bu durumlarda kodun bir bölümünü yeniden yazma eğilimindeyim. Bir alanın daha az emiş yapmasını sağlamak için, başka bir yere kütük kaydı ekliyorum. Sonra biraz daha kod temizle. Kötü kod sadece orada bırakırsanız kötüdür.


Sistem çok kötü uygulamalara dayanıyor, bu yüzden bir yöntemi doğru şekilde yeniden yazmak için tüm projeyi yeniden yazmak zorunda kalacağım (muhtemelen sonunda yapacağım ancak şimdiki sürüm için bazı son teslim tarihlerine sahibim).
Dan

Ya anlıyorum bana inan. Hayatımı acı verici hale getirmek ve bir sonraki alanı temizlemek için temizleyebileceğim bir bölüm seçiyorum. Kod düzeltme, hiçbir zaman zaman ayırmadığınız ancak her zaman zaman ayırmanız gereken bir işlemdir.
Erin

2

İşini değiştir. Örneğin, kod hakkında iyi bir soru sorduğunuzda kendinize 5 puan ve her cevapladığınızda 10 puan verin. Her bir yöntemi yeniden yaktığınızda veya yeni bir özellik eklediğinizde kendinize bir rozet verin. Yeterli puan topladığınızda, kahve molası veya bisküvi gibi ayrıcalıklar elde edersiniz. Tüm projeyi tamamladığınızda, gerçekten istediğiniz bir şeye kendinize davranma ayrıcalığını elde edersiniz.


0

Sıkılmamak ya da sinirlenmemek için püf noktası, böylece üretken kalmanız, kodun kötü tasarlanmış olduğunu kabul etmektir. Konumunuzu kodu anlamak ve güncellemek zorunda kabul etmek, "ne kadar aptalca" hakkında yorum yapmamaya ve sessizce kabul edip devam etmenize izin verecektir.

Diğer bir numara ise günün sonunda dört gözle bekleyecekleri iyi bir ev sahibine sahip olmak. Kız arkadaş, arkadaş, oyun herşeyi işe yarar, size gün boyunca geçme ve herşeye değecek kadar kötü bir kod olsa bile trudging yapma hedefi verir.


0

Michael Feathers'ın "Eski Kod ile Etkili Çalışması" yardımcı olabilir.

Onları değiştirdiğinizde işleri kırmaktan endişe ediyorsanız, önce bazı testler yazın, değişikliklerinizi yapmadan önce ve sonra geçtiklerinden emin olun. Testi yazmak, verilen bir kodun ne yaptığını özetlemeniz ve anlamanız için size yardım etmeli ve güvenle düzenlemenize olanak sağlayacaktır.


Ne yazık ki, bu SharePoint projesi, neredeyse denenemez anlamına geliyor. Geçmişte Microsoft Moles'i kullanarak SharePoint için harika bir sanal alan yazdım ancak çok fazla ek çalışma gerektiriyor.
Dan
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.