Böylece müşteriniz sizden bazı kodlar yazmanızı istiyor. Daha sonra, beklediğiniz gibi, sizden gelen özellikleri değiştirir ve yeni özelliklerini iyi bir küçük çocuk gibi özenle uygularsınız. Dışında ... yeni özellikler eski özellikleri ile çatışma tür, bu yüzden şimdi kod bir karışıklık. Sen gerçekten geri dönüp düzeltmek istiyorsun, ama yeni şeyler talep etmeye devam ediyor ve her şeyi bir temizlemeyi bitirdiğinde, yine bir karmaşa sarıyor.
Ne yaparsın? Bir OKB manyak olmayı bırak ve sadece ne yaparsan yap, kodunun bir karmaşa yaratacağını kabul et ve sadece bu canavarlığın özelliklerine tahammül etmeye devam et? Sürüm 2 temizliği kaydedilsin mi?
Başka bir iş bul ve diğer insanların bununla baş etmesine izin ver. Muahahahhahahaa.
.....
Sadece şaka. :)
Ama ciddiyetle: tahmin dolgus arkadaşın. Genellikle iyi bir gerçekçi tahmin yaparım, sonra iki katına çıkar. Bu aşırı gelebilir ve bazen öyledir, ancak bazen biraz fazla tahmin etmek ve hatta biraz yavaş görünmek daha iyidir - buggy kodunu çıkararak ve her zaman tahminlerinizi üfleyerek kötü izlenimler bırakmaktan daha iyidir. Ve elbette, kod tabanının hileli olmasına izin vererek teknik borca giriyorsunuz.
Başka bir (ilgili) ipucu: Her zaman küçük gözüküyor, iyi boyutta bir bloğa beyin görevi yok. Diyelim ki - neredeyse emin olduğunuz bir öğe sadece bir satır 30 saniyelik bir değişiklik olacaktır - 1 saat verin (veya zaman çizelgenizde veya CR sisteminizde en düşük zaman bloğu ne olursa olsun, örneğin 15 dakika/0.25 saat) . Ve biraz daha büyük ama yine de nispeten önemsiz öğeler için yarım günlük veya 1 günlük bloklar verin.
Bunun nedeni esas olarak psikolojiktir: Küçük değişiklikleri hızlı bir şekilde hackleme alışkanlığına sahip olursanız, işin acele ettiğini ve asla geri çekilmeyi, stok almayı ve yeniden düzenlenmesi gereken şeyleri yeniden düzenlemeyi bulmazsınız. Ayrıca, pratik düzeyde: küçük ama önemsiz olmayan değişiklikler bazen patlar ve programın gerisinde olduğunuzu ve böcek yangınlarını söndürdüğünüzü sürekli hissetmek istemezsiniz. Bu, kod tabanlarının zaman içinde neden hacklendiğinin bir parçası ve parselidir.
Son olarak, insanların tahminlerinizi biraz doldurmak zorunda olmadıklarını her zaman bilmek zorunda olmadığını unutmayın. Yetkin bir geliştirici olduğunuz ve iyi bir hızda çalışmayı sürdürdüğünüz sürece, bu dolgu fark edilmeyecektir. yani PHB'ye "İlk tahminim iki saat sürecek, ama bana yarım gün vereceğim" demeyin. Sadece ona "Sanırım yarım gün sürecek" söyle. ve orada bırakın.
Bir sonraki özellikleriniz için gereken zamanı kasten fazla tahmin edin. Temizlemek için bu ekstra zamanı kullanın.
Asla bakımı haklı çıkaramazsınız ve müşteri ne olursa olsun ona ihtiyaç duyar, bu yüzden onlara daha iyi olabilmeleri için acı ilacı (bir sonraki özellikler için biraz daha yüksek maliyetler) verin.
Yeni özellikleri entegre ederken uygun yeniden tasarımı yapmaya çalışın. Daha sonra yok. Yeniden tasarım olmadan, daha fazla değişiklik ve yeni özellik için sürekli olarak daha fazla sürtünme ekliyorsunuz.
Bir noktada, her şeyin yaşlandığı durma noktasına yakın bir öğütmeye geleceksiniz. Çoğu şirket muhtemelen bu noktada büyük yeniden yazma için gidiyoruz, sürüm 2. Oldukça zayıf bir ekonomiye sahiptir ve müşterinizin eğimli hissetmeleri halinde farklı bir geliştirme partisi denemesi için iyi bir andır.
Uygun yeniden tasarım/yeniden düzenleme, müşterilerinizin yatırımlarını koruyabilir ve işleri sürdürülebilir tutabilir. Bunu inşa etmeniz gerekir. Değişim için optimize edin, seyahat ışığı yapın.
Aşırı tahmin ile ilgili tüm yorumlarla, kaçırılmayacak kadar küçük bir nokta (iyi fırsat) olduğunu düşünüyorum.
Bu, yapılan zamanı tahmin etmekle ilgili değil (sadece) ve sonra da bazılarını ekleyerek, kodun (refactor!) Değişikliğin güvenli bir şekilde yapılabileceği bir noktaya getirilmesi için gereken süreyi tahmin etmekle ilgili değişim (muhtemelen birlikte biraz munged). Tamam, bu aynı şey anlamına geliyor ... ama şekerleme, esneme veya aşırı tahmin sorunu yok, sadece bunu yapmak için ilk önce bunu yapmam gerektiğini ve bunun ne kadar süreceğini toplamda. Burada önemli olan, sistemin değişime bağlı olduğu ve daha fazlasına bağımlı olmayan kısımları üzerinde çalışmanızdır - başka bir yerde korkunç kod varsa ... zor, oradayken yakalayın.
Biraz orijinal soruya geri dönmek için - uzun yıllar sonra bu benim için aşağıya iner, siz bil (inanmıyorum, beklemeyin (şüpheli?), Düşünmediğiniz sürece bir şey uyguladığınızda ancak bilmek) ek şeyler de gereklidir, o zaman bu gereksinimi uygulamak için ihtiyacınız olanı yapmalısınız ve mümkün olduğunca düzenli ve zarif bir modaya gerek yok.
Bir sonraki şeyi uygulamaya başladığınızda - bir süre sonra - kod tabanını (ve veritabanını ve her şeyi), bu işlevselliği olabildiğince düzenli ve zarif bir şekilde uygulamak için gereken duruma getirmek için gerekli adımları atıyorsunuz. Bu yeniden düzenleme, bir proje geliştikçe doğal olarak ortaya çıkan karışıklıkla uğraştığınız yerdir - ve umarım daha fazla karışıklık yaratmaktan kaçının (veya en azından seviyeyi tutarlı tutun).
Buradaki tartışma alanlarından biri "Teknik Borç" - kredili mevduat hesabı gibi, geri ödemelisiniz ve ne kadar uzun süre bırakırsanız (bu durumda düzeltmek için gereken süre) tahakkuk eder - bu size iyi bir fikir verir zamanınızın bir kısmını teknik borcu asgariye indirmek için harcadığınız iddiası.
Bu aynı zamanda, birim testi ve diğer otomatik testlerin gelmeye başladığı yerdir (eğer yapabilirsem, daha mutlu bir insan olacağımdan oldukça emin olduğumu söyleyebilirim!), (En azından bazılarını çalıştırabilen) testleriniz). Bunlarla birlikte - ama kendileri içindeki bir değer - bağımlılık enjeksiyonu ve kontrolün ters çevrilmesi (asla bu "ne" ne kadar olduğundan emin değilsiniz) kalıplardır, çünkü sıhhi tesisatın değiştirilmesini kolaylaştırır ve böylece izolasyon.
Son olarak - unutmayın, eğer kırılmazsa tamir etmeyin. Kodunuzu tamamen toplama uğruna toplamak, may tatmin edici olmakla birlikte, aynı zamanda hataları tanıtmak için bir fırsattır, bu yüzden değiştirmeniz gerekmiyorsa ve üzerine inşa etmiyorsanız acı verici olabilir bazı topakları yalnız bırakmak daha iyi olabilir - düzeltme veya değiştirme fırsatı sonunda dönecektir!
1) ygun değişiklik kontrolü arkadaşınızdır
Müşteri iyi şartnameyi değiştirirse, bu onun hakkıdır, ancak bu bir değişikliktir ve (veya proje yapısı/ilişkisi için uygun olan her şekilde ücretlendirilmesi gerekir).
Bu değişikliğin tahmini, gerekli yeniden düzenleme maliyetini içermelidir. Müşteri, yüksek bir maliyet gibi görünen şeylere hayret edebilir, ancak bu noktada ona, kod zaten yarı yazıldığından, gelecekte sağlam ve desteklenebilir olmasını sağlamak için yeniden yazılması gereken unsurlar olduğunu ve yapılmazsa, gelecekteki destek veya değişikliklerin daha da pahalı hale gelmesiyle ilgili sorunlar yaşayacaktır.
2) Yeniden Düzenleme Müşteriye Orijinal Uzun Vadeli Fayda Sağlayacak Şekilde Yapılmalıdır
Yeniden düzenleme yapmayı düşünürken her zaman gerçekte neye ihtiyaç duyulduğunu ve neyin önemli olduğunu düşünmeniz ve yeniden düzenleme çalışmasının para için gerçek uzun vadeli değer sağladığından emin olmanız gerekir.
Sonuçta, bunları yapmak zorundayız, böylece kod, teorik mükemmellik için herhangi bir dürtüden ziyade müşterinin yatırımının geçerli kalmasını sağlamak için orta/uzun vadede genişletilebilir ve desteklenebilir kalmalıdır. Yeniden düzenleme çalışmaları (ve buna karşılık gelen tahminler), sadece şimdi bunu yapmanın biraz daha iyi bir yolu olabileceğini düşündüğünüz için değil, kapsam olarak yapılmalıdır.
Bazı programcılar, istemcilerle bu sorunu kontrol etmenin bir yolunun, istemci imzalaması ve ilk belirtimi yetkilendirmesi olduğunu önerir. Daha sonra, ilk spesifikasyonda olmayan bir gereksinim değişikliği talep ettiklerinde, ek maliyetleri ve zaman gecikmelerini hesaplamak için sözleşmeyi ve proje zaman çizelgesini geçmeniz ve ardından sözleşmeye bir ek yapmanız gerektiğini söylersiniz. Görünüşe göre, müşterilerin yeni (öngörülemeyen) özelliklerde ısrar etmelerini önlemede harikalar yaratıyor.
Şu anda üzerinde çalıştığım bir kod tabanında aşağıdaki yorumu var:
/* * Every time I see this function, I want to take a shower. */
Tanımladığınız durumu çok iyi biliyorum. Yaptığım şey, işlerim düzelene ve her türlü 'sünme' yapacağı her şeyi 'sünnet' edene kadar beklemek (elimden geleni). O zamana kadar, muhtemelen kullanılabilir bir şey yayınladınız ve işleri temizlemek ve biraz farklı şeyler uygulamak için biraz zaman ayırabilirsiniz.
Tekrar tekrar küçük karışıklıkları temizlemek için koşturmak olamaz. Bu sadece işinizi ve hayal kırıklığınızı üç katına çıkarır. Daha büyük, ama zor hareket eden bir karmaşa olmasını bekleyin ve sonra bu konuda bir şeyler yapabilirsiniz.
Öncelikle bu durumdan kaçınmak.
Her şey özellikleri nasıl okuduğunuza bağlıdır. Onları taş tabletler olarak düşünmek kolaydır, ancak gerçekte çoğu özellik değişir. Kodunuzu tasarlarken, spesifikasyonun her bölümünün değişme olasılığına bir göz atın. Zamanla, bunu tahmin etmede oldukça iyi olacaksınız.
Dağınıklığa, deneyime ve yargıya girmek çok önemlidir. Bu spagetti kodundan dolayı yeni hatalar mı yazıyorsunuz? Uygulanması daha uzun sürüyor mu? bunlar taktiksel bir refactor yapmaya işaret eder.
gelecek için, müşterinizle ortak çalışmanız gerektiği anlaşılıyor. Onlara "bak, bu ürün orijinal spesifikasyonun çok ötesine genişliyor. Orijinal tasarım bu seviye için iyi olsa da, X yönünde ve Y yönlerinde genişletmek, tasarımda biraz yeniden yapılandırmaya ihtiyaç duyuyor" ve hatta müşteri ödemek.
Saatte şarj edin ve değişiklik isterse iyi olduğunu söyleyin, ancak denkleme iyi kod yazmak için gereken zamanı ekleyin. Ayrıca bakım kodunu yazmanın, bunu korumak zorunda kaldığınızda uzun vadede işe yaradığını unutmayın. Şimdi zaman kazanmak size daha sonra mal olabilir.
Yazma yazılımlarının iş ihtiyaçları ile el ele gitmesi gerektiğini düşünüyorum. Bu bir ıskarta proje ise (bir hafta içinde yapılması gereken bir prototip gibi, her gün yeni girdiler geliyor), kodun sürdürülebilirliği ve diğer şeyler hakkında endişelenmenize gerek yoktur - zaman çok önemlidir ve sadece yapmanız gerekir Kodunuzu olabildiğince hızlı şekilde kapıdan dışarı doğru itin.
Ancak uzun vadeli bir uygulama yazıyorsanız, tüm bunları dikkate almak mantıklıdır, çünkü yeni özellikler oluşturmanın, mevcut hataları düzeltmenin, diğer uygulamalara ve diğer şeylere entegre olmanın ne kadar sürdüğü üzerinde büyük bir etkisi vardır - ve bu, iş etkisi anlamına gelir (daha sonra daha fazla zaman ve daha fazla maliyet nedeniyle).
Bu nedenle, karar vericiyi gerektiğinde kodu yeniden düzenlememenin gerçek maliyetlerine duyarlı hale getirmek daha iyidir - deneyimlerime göre, her iki seçeneğin maliyetleri ve zaman etkisi karar sahibine ölçülebilir terimlerle açıklanırsa, karar bir beyinsiz. İnsanların size 'evet devam edin, iki kat daha fazla zaman almasına ve bana ekstra fayda sağlamamasına rağmen güzel kod yazmasını' beklemeyin. Sadece bu şekilde çalışmaz.
Bunu sürecinizin bir parçası haline getirin, buna "aşırı yeniden düzenleme" diyorum ve büyük olacak! ;) Sadece hızlıca bir şeyler yapın ve skar dokusu olan yeterli yeni özellikler eklendiğinde, onu yeniden düzenleyin. Kendinize sürekli "Şimdi sıfırdan başlasaydım, bunu nasıl yapardım?"
Önde her şeyi tasarlayabileceklerini ve düşünebileceklerini düşünen insanlar çoğunlukla kendilerini kandırıyorlar, siz (ve müşteriniz) her zaman ilerlerken bir şeyler öğreniyorsunuz. Bu dersleri kullanın.
Siz iyi bir programcı olduğunuz için oldukça hızlı bir şekilde yeniden düzenleme yapabileceksiniz ve bunu sürekli olarak yaptığınızda kod "doğru formu" almaya başlayacaktır, yani daha az bağımlılıkla daha esnek hale gelecektir.
Müşteriler bir şeyler üzerinde çalışarak "zaman israfı" yaptığınızı bildiklerinde miffed olabilirler, böylece sormak/anlatmamak ve bu konuda gerçekten hızlı olmanıza yardımcı olur.
Bu şekilde geliştirilen kod, sonunda size zaman kazandıracak ve yeni özellikler eklemeyi giderek daha kolay hale getirecektir.
Kötü kodun en büyük nedenlerinden birinin, bazı programcıların daha büyük yapısal yeniden düzenleme yapma korkusu olduğunu ve ne kadar uzun beklerseniz o kadar kötüleştiğini söyleyebilirim.
Daha Yüksek Bir Güce Güvenin
Dua etmek istemiyorum. Yani, sizinle müşteri arasında dolgu olarak yerleştirebileceğiniz bir iş adamı (yani proje yöneticisi veya eşdeğeri) olduğundan emin olun. Müşteri çok fazla talepte bulunuyorsa, iş adamı ayağa kalsın ve "bunu yapabilir, ancak bunun şartname kapsamına uyup uymadığından emin değilim, [iş adamı]" na bakın.
Normal bir proje akışında, ciddi gelişme gerçekleşmeden önce genel şartname dondurulmalıdır.
Pek çok müşteri, izin verdiğiniz sürece değişiklik/iyileştirme/iyileştirme yapmaya devam edecektir. Birçoğu bu yeteneği maksimuma kötüye kullanacak, çünkü paralarını en iyi şekilde değerlendiriyor gibi hissettiriyor (projenizi sabote etse bile).
Şartnameyi erkenden mükemmelleştirmeye ve dondurmaya ve daha sonra uygulamaya zorlamaya adamış bir kişiye sahip olun.
Müşteri ile iyi bir karma için biraz fazlalık yapmakta yanlış bir şey yoktur, ancak kontrolden çıktıklarında daha yüksek bir güce ertelemeye hazır olun. Şartname saçma bir miktar değişiklik gerektiriyorsa, belki de iş döngüsüne geri dönüp sözleşmeyi yeniden değerlendirmenin ve/veya sözleşmeye eklemelerin eklenmesi (adil parasal tazminat ile).
Bu sorunu yaşıyor olmanızın nasıl kodladığınızla ilgisi yoktur. Proje yöneticinizin projede yetersiz kullanıldığının bir işareti (bu sizin hatanız, onun hatası veya her ikisi).
Diğerlerinin birçok cevapta söyledikleri gibi, herhangi bir projede olasılıklar için bir zaman tamponu eklemek de gereklidir, ancak şartname dondurulmadan ve PM tarafından müşteriye teslim edilmeden önce kapalı kapılar ardında karar verilmesi gerektiğinin belirlenmesi.
En basit cevap. Şu an tam olarak ne istediğine dair son bir spesifikasyona sahip olana kadar her türlü kodlamayı bırakardım.
Daha sonra, şu anda hangi öğelerin olması gerektiğini ve hangilerinin daha sonra yapılabileceğini onaylamak için bu özelliklerin listesine vb. Öncelik vermeleri gerekir.
Her bir özelliğin zamanını/maliyetini belirlemek için deneyimlerinizi kullanarak ve daha sonra bunu isterse, x miktarında zaman ve para alacaktır.
Özellik kapsamının büyük suçuyla uğraşmanız ve hiçbir şey yapılmayana veya çok kötü yapılmayana kadar sürekli olarak özellikler eklemeye devam edecektir.
Son listeye sahip olduktan sonra, tercih ettikleri gibi gelecekte değişiklikler yapacağınızı, ancak şu anda sahip olmaları gereken ilk 15/20'ye odaklanmanız gerektiğini söyleyin.
Daha sonra, tamamlanma zamanına dayanarak, bu yayınlandıktan sonra, bir sonraki sürümü tartışmaya/beyin fırtınası yapmaya açık olacağınızı söyleyin.
Mevcut sürüm için ne yapılacağı konusunda nihai bir karar verildikten sonra, tüm tartışmalar/fikirler/öneriler% 100 durdurulmalıdır.
Fikirleri sonsuza dek alırsa, bir sonraki sürümün özellik listelerinde yazmasını söyleyin ve şimdi istedikleri en önemli özellikleri sunmaya odaklanmanıza izin verin.
Eğer zaman kaybetmeye devam ederse zihinlerini değiştirmeye devam et. Sonra kararlarını kesinleştirinceye kadar proje üzerinde çalışmayı bırakıp başka projeler üzerinde çalışardım.
Yapması zor, ancak özellik kapsamı sürünmesi zaman, enerji, motivasyon ve açık düşünmeyi çok yıkıcı.
Projenin tam perspektifinden:
Ekibinizle koddan öğrenin, bir dahaki sefere nelerin yeniden düzenlenip yeniden kullanılabileceğini görün, sonra bir bira içmeye gidin.
Geliştirme aşamasında bir bakış açısıyla:
Gelişimin neden durduğunu sabırla açıklayın ve tüm spesifikasyonlar masaya gelene ve anlaşılana kadar neden devam edemeyeceğini açıklayın. O zaman git, bir bira iç.
Planlama açısından:
Tüm spesifikasyonları isteyin ve geliştirme yolunu net olarak anlamak için herkesle birlikte çalışın. Herkesin aynı sayfada olduğundan emin olmak için müşteri/paydaşları mümkün olduğunca yakından dahil edin. O gecenin ilerleyen saatlerinde herkese bira getir. Yarın projeyi başlatın.
Ateşle öldür.
Aka refactor en kısa zamanda: örneğin çirkin kod bir son tarih için acele ettiğinde, son tarihten sonra refactor olurum çünkü mevcut kod korunana kadar daha fazla özellik ekleyemezsiniz (veya en azından etmemelisiniz), aksi takdirde gelecekteki kodlarda hata ayıklamayı çok daha zorlaştıracaktır.
İlk uygun tasarım sorunun önlenmesine yardımcı olamaz. Ve gelecekteki tüm "belki" gereklilikleri göz önünde bulundurmak neredeyse imkansız (veya çok zor). Bir süre sonra Büyük Yeniden Faktoring gelecektir. Ve en iyi çözüm her şeyi yeniden yazmaktır.
Birkaç kelimeyle: kırmızı Ferrari'ye bir taret yerleştirmek yerine, gereksinimleri yeniden düşünün ve bir tank inşa edin.
Mevcut durumu test eden projeleriniz için birim testleri yazın ve sonra zamanınız olduğunda yeniden düzenleme yapın, böylece projenizi temizlemeye çalışırken kırılmayı önlersiniz.