Basamaklı refactoringleri nasıl önleyebilirim?


52

Bir projem var. Bu projede bir özellik eklemek için yenilemek istedim ve özelliği eklemek için projeyi yeniden düzenledim.

Sorun şu ki, bittiğinde, uyum sağlamak için küçük bir arayüz değişikliği yapmam gerektiği ortaya çıktı. Ben de değişikliği yaptım. Ve sonra tüketici sınıf, yeni arayüzle mevcut arayüzüyle uygulanamaz, bu yüzden de yeni bir arayüze ihtiyacı var. Şimdi üç ay sonra ve hemen hemen hiç ilgisiz sorunları çözmek zorunda kaldım ve şu andan itibaren bir yıl boyunca yol haritası çeken sorunları çözmeye bakıyorum ya da bir şey derlenmeden önce zorluk nedeniyle çözmeyeceği için listeleniyor tekrar.

Gelecekte bu tür basamaklı yeniden yapılandırmalardan nasıl kaçınabilirim? Birbirimize çok sıkı bağlı olarak önceki sınıflarımın bir belirtisi mi?

Kısaca düzenleme: Bu durumda, refactor oldu refactor kodun belirli bir parçasının uzanabilirliliğinin arttığını ve bazı bağlantı azalmış beri özellik. Bu, dış geliştiricilerin daha fazlasını yapabileceği anlamına geliyordu, ki bu sunmak istediğim özellikti. Bu yüzden, orijinal refraktörün kendisi işlevsel bir değişiklik olmamalıydı.

Beş gün önce söz verdiğim daha büyük düzenleme:

Bu yeniden yansıtıcıya başlamadan önce, bir arayüze sahip olduğum bir sistem vardı, ancak uygulamada, dynamic_castgönderdiğim tüm olası uygulamalar aracılığıyla basitçe . Bu, açıkçası, sadece bir şey için arayüzden miras alamayacağınız ve ikincisi, bu arayüzü uygulamak için uygulama erişimi olmayan herkesin imkansız olacağı anlamına geliyordu. Bu yüzden, bu sorunu çözmek ve kamu tüketimine yönelik arayüzü açmak istediğime karar verdim, böylece herkesin bunu uygulayabilmesi ve ara yüzün uygulanmasının gerekli olan sözleşmenin tamamı olduğu açıkça görülüyordu.

Bunu yaptığım bütün yerleri bulup ateşle öldürürken, belli bir problem olduğu kanıtlanan bir yer buldum. Tüm çeşitli türetme sınıflarının uygulama detaylarına ve daha önce uygulanmış fakat başka bir yerde daha iyi olan çoğaltılmış fonksiyonelliğe dayanıyordu. Bunun yerine kamu arayüzü açısından uygulanabilir ve bu işlevselliğin mevcut uygulamasını yeniden kullanabilirsiniz. Düzgün çalışması için belirli bir bağlam parçası gerektirdiğini keşfettim. Kabaca konuşursak, önceki çağrının uygulanması gibi görünüyordu

for(auto&& a : as) {
     f(a);
}

Ancak, bu bağlamı elde etmek için, onu daha çok benzer bir şeye dönüştürmem gerekiyordu

std::vector<Context> contexts;
for(auto&& a : as)
    contexts.push_back(g(a));
do_thing_now_we_have_contexts();
for(auto&& con : contexts)
    f(con);

Bu, eskiden bir parçası olan tüm işlemlerde, bir kısmının bağlamsız çalışan fyeni bir işlevin gbir parçası yapılması ve bir kısmının şimdi ertelenen kısmın bir kısmından yapılması gerektiği anlamına gelir f. Ancak, tüm yöntemlerin fbu içeriğe ihtiyaç duymadığını ya da istemeyeceğini - bazılarının ayrı yollarla elde ettikleri farklı bir içeriğe ihtiyaçları olduğunu söyleyin. Yani her şey için f(kabaca hemen hemen, konuşma hangi çağıran biter herşey ), onlar onu almalısınız ve eski onları bölmek nasıl nerede bağlam onlar gerekli varsa belirlemek zorunda fyeni içine fve yeni g.

Ve şimdi olduğum yerde böyle bitirdim. Devam etmemin tek nedeni, bu yeniden düzenlemeye zaten başka nedenlerle ihtiyaç duymamdı.


67
"Bir özellik eklemek için projeyi yeniden yapılandırdınız" derken, tam olarak ne demek istiyorsunuz? Yeniden düzenleme, programların davranışını, tanımı gereği, bu ifadeyi kafa karıştırıcı yapan değiştirmez.
Jules

5
@Jules: Açıkçası, özellik, diğer geliştiricilerin belirli bir uzantı türü eklemesine izin vermekti.
DeadMG

5
Her kitapta ve refactoring hakkında konuşulan makalelerde tartışıldığını düşündüm. Kaynak kontrolü kurtarmaya gelir; Bunu A adımını yapmak için bulursanız, önce B adımını yapmanız, sonra A'yı sıyrıp B'yi yapmanız gerekir.
saat

4
@DeadMG: Bu benim ilk yorumumda ilk alıntı olarak alıntı yapmak istediğim kitap : "Oyun" toplama çubukları ", Mikado Metodu için iyi bir metafordur. sistem - uygulaması kolay bir kurallar dizisini izleyerek. Projeyi çökertmeden, merkezi sorunu ortaya çıkana kadar iç içe geçmiş her bir bağımlılığı dikkatlice çıkarın. "
rwong

2
Hangi programlama dili hakkında konuştuğumuzu açıklayabilir misiniz? Tüm yorumlarınızı okuduktan sonra, size yardımcı olmak için bir IDE kullanmak yerine elle yaptığınız sonucuna vardım. Bu yüzden, size bazı pratik önerilerde bulunup bulunamayacağımı bilmek istiyorum.
thepacker

Yanıtlar:


69

Geçen sefer, öngörülemeyen sonuçları olan bir yeniden düzenleme başlatmaya çalıştım ve yapıyı ve / veya testleri bir gün sonra dengeleyemedim , kod tabanını yeniden yapılanmadan önceki noktaya geri getirdim

Sonra neyin yanlış gittiğini analiz etmeye başladım ve yeniden düzenlemenin daha küçük adımlarla nasıl yapılacağı konusunda daha iyi bir plan geliştirdim. Bu yüzden basamaklı yeniden düzenlemelerden kaçınmak için tavsiyem sadece: ne zaman duracağını bilmek , işlerin sizin kontrolünüzden çıkmasına izin verme!

Bazen mermiyi ısırmanız ve tam bir iş günü atmanız gerekebilir - kesinlikle üç aylık çalışmayı atmaktan daha kolaydır. Eğer gevşek günde en az nasıl öğrendiniz, boşuna tamamen yok değil sorunu yaklaşım. Ve deneyimlerime göre, yeniden yapılanmada küçük adımlar atma olasılıkları her zaman vardır .

Not : üç aylık çalışmayı feda etmeye ve yeni (ve umarım daha başarılı) bir yeniden düzenleme planıyla tekrar başlamak isteyip istemediğinize karar vermek zorunda olduğunuz bir durumda gibi görünüyorsunuz. Bunun kolay bir karar olmadığını düşünebilirim, ama kendinize sorun, yalnızca yapıyı dengelemek için değil , son üç aydır tekrar yazdığınız sırada muhtemelen öngörüldüğü tüm öngörülemeyen hataları düzeltmek için üç aya ihtiyaç duyma riskinizin ne kadar yüksek olduğunu sorun. ? "Yeniden yazma" yazdım, çünkü yaptığınız şey budur, "yeniden yapılanma" değil. Projenizin derlediği son revizyona dönüp tekrar gerçek bir refactoring ile başlayarak mevcut probleminizi daha çabuk çözmeniz pek mümkün değil .


53

Birbirimize çok sıkı bağlı olarak önceki sınıflarımın bir belirtisi mi?

Elbette. Sayısız değişikliğe neden olan bir değişiklik, eşleştirmenin tanımı.

Basamaklı refraktörleri nasıl önleyebilirim?

En kötü kod bazlarında, tek bir değişiklik artmaya devam eder ve sonunda her şeyi değiştirmenize neden olur. Yaygın kaplin bulunan herhangi bir refaktörün bir kısmı üzerinde çalıştığınız parçayı izole etmektir. Yalnızca yeni özelliğinizin bu koda dokunduğu yeri değil, diğer her şeyin bu koda dokunduğu yeri yeniden gözden geçirmeniz gerekir.

Bu, eski kodun eski kod gibi görünen ve hareket eden bir şeyle çalışmasına yardımcı olmak için bazı bağdaştırıcıların kullanılması anlamına gelir, ancak yeni uygulama / arabirim kullanır. Ne de olsa, yaptığınız tek şey arayüzü / uygulamayı değiştirmek ancak bağlantıyı terketmek ise, hiçbir şey kazanamayacaksınız. Domuzdaki ruj.


33
+1 Bir refactoring ne kadar kötü olursa, refactoring o kadar yaygınlaşacaktır. Bu, olayın doğasıdır.
Paul Draper,

4
Yine de gerçekten yeniden yönlendirme yapıyorsanız , diğer kodun derhal değişikliklerle ilgili olması gerekmez. (Tabii ki sonunda diğer parçaları temizlemek isteyeceksiniz ... ancak bu hemen gerekli olmamalı.) Uygulamanın geri kalanında "basamaklanan" bir değişiklik yeniden yapılanmadan daha büyük - bu noktada temel olarak yeniden tasarlama veya yeniden yazma.
cHao

+1 Bir adaptör, tam olarak ilk önce değiştirmek istediğiniz kodu izole etmenin yoludur.
Ocak'ta 15:15

17

Refactoring'iniz çok iddialıydı. Bir yeniden düzenleme, her biri (örneğin) 30 dakika içerisinde - veya en kötü senaryoda, en fazla bir günde - tamamlanabilen, küçük adımlar halinde uygulanmalı ve projenin inşa edilebilir kalmasını ve tüm testlerin devam etmesini sağlar.

Her bir bireysel değişikliği minimumda tutarsanız, yeniden yapılanmanın yapıyı uzun süre kırması gerçekten mümkün olmamalıdır. En kötü durum, muhtemelen, parametreleri yeni kullanılan bir parametre eklemek için, yaygın olarak kullanılan bir arayüzde bir yönteme değiştirmektir. Ancak bunun sonucunda ortaya çıkan değişiklikler mekaniktir: her uygulamada parametrenin eklenmesi (ve yok sayılması) ve her çağrıda varsayılan bir değer eklenmesi. Yüzlerce referans olsa bile, böyle bir yeniden düzenlemenin yapılması bir gün sürmemelidir.


4
Böyle bir durumun nasıl ortaya çıktığını anlamıyorum. Bir yöntemin arayüzünün makul bir şekilde yeniden yapılandırılması için, çağrının davranışının değişiklikten önceki ile aynı olmasına neden olacak, kolayca belirlenebilecek yeni bir parametre seti olmalıdır.
Jules

3
Asla böyle bir yeniden ateşleme yapmak istemediğim bir durumda olmadım, ancak bana çok sıradışı geldiğini söylemeliyim. Arayüzden işlevselliği kaldırdığını mı söylüyorsun? Eğer öyleyse, nereye gitti? Başka bir arayüze mi? Veya başka bir yerde?
Jules

5
Sonra bunu yapmanın yolu, daha sonra değil, kaldırmaya başlamadan önce kaldırılacak özelliğin tüm kullanımlarını kaldırmaktır. Bu, üzerinde çalışırken kod oluşturmaya devam etmenizi sağlar.
Jules

11
@DeadMG: garip sesler: söylediğiniz gibi, artık gerekmeyen bir özelliği kaldırıyorsunuz. Ancak öte yandan, "proje tamamen işlevsel olmaz hale gelir" yazıyorsunuz - bu aslında özelliğin kesinlikle gerekli olduğunu söylüyor. Lütfen açıkla.
Doktor Brown

26
@DeadMG Bu gibi durumlarda normalde yeni özelliği geliştirir, çalıştığından emin olmak için testler ekler, yeni arayüzü kullanmak için varolan kodu geçirir ve sonra (şimdi) gereksiz eski özelliğini kaldırırsınız. Bu şekilde, işlerin kırıldığı bir nokta olmamalıdır.
sapi

12

Gelecekte bu tür kademeli refraktörlerden nasıl kaçınabilirim?

Arzulu Düşünme Tasarımı

Amaç, yeni özellik için mükemmel OO tasarımı ve uygulamasıdır. Yeniden yapılanmanın önlenmesi de bir amaçtır.

Sıfırdan başlayın ve istediğiniz yeni özellik için bir tasarım yapın . İyi yapmak için zaman ayırın.

Ancak, buradaki anahtarın "bir özellik ekle" olduğunu unutmayın. Yeni şeyler, kod tabanının mevcut yapısını büyük ölçüde görmezden gelmemize izin veriyor. Arzulu düşünme tasarımımız bağımsızdır. Ama sonra iki şeye daha ihtiyacımız var:

  • Refactor sadece yeni özelliğin kodunu enjekte etmek / uygulamak için gerekli bir dikişi yapacak kadar refactor.
    • Yeniden yapılanmaya direnç, yeni tasarımı sürmemelidir.
  • Yeni özelliği ve varolan kodunu birbirinden mutlu bir şekilde görmezden tutan bir API ile müşteriye dönük bir sınıf yazın.
    • Nesneleri, verileri ve sonuçları ileri geri almak için çevirir. En az bilgi ilkesi lanet olsun. Var olan kodun yaptığından daha kötü bir şey yapmayacağız.

Sezgiler, Alınan Dersler vb.

Yeniden düzenleme, mevcut bir yöntem çağrısına varsayılan bir parametre eklemek kadar basitti; veya statik bir sınıf yöntemine tek bir çağrı.

Mevcut sınıflardaki genişletme yöntemleri, yeni tasarımın kalitesinin mutlak minimum riskle korunmasına yardımcı olabilir.

"Yapı" her şeydir. Yapı, Tek Sorumluluk İlkesinin gerçekleştirilmesidir; işlevselliği kolaylaştıran tasarım. Kod, sınıf hiyerarşisine kadar kısa ve basit kalacaktır. Test, yeniden çalışma ve eski kod ormanda zorla girmekten kaçınmak için yeni tasarım zamanı oluşturulur.

Arzulu düşünme sınıfları eldeki göreve odaklanır. Genel olarak, mevcut bir sınıfı genişletmeyi unutun - refactor kaskadını tekrar başlatıyorsunuz ve "ağır" sınıf "ek yükü ile uğraşmak zorundasınız.

Bu yeni işlevsellik kalıntılarını varolan koddan temizleyin. Burada, eksiksiz ve iyi kapsüllenmiş yeni özellik işlevselliği yeniden düzenlemeyi önlemekten daha önemlidir.


9

(Harika) kitabından , Michael Feathers'ın Eski Koduyla Etkili Çalışma :

Eski kurallardaki bağımlılıkları kırdığınızda, genellikle estetik duygunuzu biraz askıya almak zorunda kalırsınız. Bazı bağımlılıklar temiz bir şekilde kırılıyor; diğerleri ise tasarım açısından idealden daha azına bakıyor. Cerrahideki insizyon noktaları gibidirler: işten sonra kodunuzda bir iz kalmış olabilir, ancak altındaki her şey daha iyi olabilir.

Daha sonra bağımlılıkları kırdığınız noktanın etrafındaki kodu gizleyebilirsiniz, bu yara izini de iyileştirebilirsiniz.


6

Görünüşe göre (özellikle yorumlardaki tartışmalardan) bu "küçük" değişimin, yazılımın yeniden yazılmasıyla aynı miktarda iş olduğu anlamına gelen kendinden empoze edilmiş kurallarla kendinizi kutladınız.

Çözüm, "o zaman yapma" olmalı . Gerçek projelerde olan budur. Eski API'lerin birçoğu, sonuç olarak çirkin arayüzlere veya terkedilmiş (her zaman boş) parametrelere veya DoThisThing2 () adlı, tamamen farklı bir parametre listesine sahip olan fonksiyonlara sahiptir. Diğer yaygın hileler, geniş bir çerçeve yığınını gizlice sokmak için küresel veya etiketli işaretçilere bilgi yerleştirmeyi içerir. (Örneğin, ses arabelleğinin yarısının yalnızca 4 baytlık bir sihirli değeri içerdiği bir projem var, çünkü bu bir kütüphanenin ses kodeklerini nasıl çağırdığını değiştirmekten çok daha kolaydı.)

Belirli bir kod olmadan belirli bir tavsiye vermek zordur.


3

Otomatik testler TDD zealotu olmanıza gerek yok, ne de% 100 kapsama ihtiyacınız yok, ancak otomatik testler güvenle değişiklik yapmanızı sağlayan şeydir. Ek olarak, çok yüksek bağlantıya sahip bir tasarıma sahipmişsiniz gibi görünüyor; Yazılım tasarımında bu tür bir konuyu ele almak için özel olarak formüle edilmiş SOLID ilkeleri hakkında okumalısınız.

Ben de bu kitapları öneriyorum.

  • Eski Kodlarla Etkin Çalışma , Tüyler
  • Yeniden düzenleme , Fowler
  • Testler , Freeman ve Pryce Rehberliğinde Büyüyen Nesneye Dayalı Yazılımlar
  • Temiz Kod , Martin

3
Sorunuz, "gelecekte bu [başarısızlıktan] nasıl kaçınırım?" Cevap, şu anda "CI" ve testlere sahip olsanız bile, bunları doğru şekilde uygulamıyor olmanızdır. Yıllar içinde on dakikadan fazla süren bir derleme hatası almadım, çünkü derlemeyi "ilk ünite testi" olarak görüyorum ve kırıldığında, onu düzeltirim, çünkü testten geçen testleri görmem gerekiyor Kod üzerinde daha fazla çalışıyorum.
asthasr

6
Eğer yoğun olarak kullanılan bir arayüzü yeniden düzenliyorsam, bir altlık eklerim. Bu ayar, varsayılan ayarları kullanır, böylece eski aramalar çalışmaya devam eder. Ben yüzün arkasındaki arayüz üzerinde çalışıyorum, daha sonra onunla işim bittiğinde, yüzüğü tekrar kullanmak yerine arayüzü kullanmak için sınıfları değiştirmeye başlıyorum.
asthasr

5
Yapı bozulmasına rağmen refaktöre devam etmek ölü hesaplaşma gibi bir şeydir . Son çare olan bir seyir tekniği . Yeniden düzenleme işleminde, yeniden düzenleme yönünün sadece düz olması olasıdır ve bunun kesin belirtilerini zaten gördünüz (derlemeyi bıraktığı an, yani hava hızı göstergeleri olmadan uçmak), ancak basmaya karar verdiniz. Sonunda uçak radardan düşer. Neyse ki yeniden düzenleme için kara kutuya veya araştırmacılara ihtiyacımız yok: her zaman "son bilinen iyi duruma geri dönebiliriz".
rwong

4
@DeadMG: "Benim durumumda, önceki aramalar artık sadece anlamsız" yazıyordu, ama sorunuzda " küçük bir arayüz değişimi barındırmak için". Dürüst olmak gerekirse, bu iki cümleden sadece biri doğru olabilir. Sorun tanımınıza göre, arayüz değişiminin kesinlikle küçük olmadığı açıkça anlaşılıyor . Değişiminizi geriye dönük olarak daha uyumlu hale getirme konusunda gerçekten, gerçekten çok daha fazla düşünmelisiniz. Tecrübelerime göre, bu her zaman mümkün, ama önce iyi bir plan yapmalısın.
Doktor Brown

3
Bu durumda @DeadMG, sana ne yaptığını sanıyorsun olamaz makul çok basit bir dizi adım gibi tasarım değişiklikleri uygulamak için temel nokta olan, yeniden düzenleme çağrılabilir.
Jules

3

Birbirimize çok sıkı bağlı olarak önceki sınıflarımın bir belirtisi mi?

Büyük olasılıkla evet. Gereksinimler yeterince değiştiğinde oldukça hoş ve temiz bir kod tabanıyla benzer efektler elde etmenize rağmen

Gelecekte bu tür basamaklı yeniden yapılandırmalardan nasıl kaçınabilirim?

Eski kod üzerinde çalışmayı bırakmanın dışında, ben korkmam. Ancak, günlerce, haftalarca, hatta aylarca çalışma koduna sahip olmamanın etkisinden kaçınan bir yöntem kullanıyor olabilirsiniz.

Bu yöntemin adı "Mikado Yöntemi" ve şöyle çalışıyor:

  1. bir kağıda ulaşmak istediğiniz hedefi yazın

  2. sizi bu yöne götüren en basit değişikliği yapın.

  3. Derleyiciyi ve test takımınızı kullanarak çalışıp çalışmadığını kontrol edin. 7. adımla devam ederse, aksi halde 4. adımla devam edin.

  4. Makalenizde, geçerli değişikliğinizin çalışması için değiştirilmesi gerekenleri not edin. Geçerli görevinizden yenilere, okları çizin.

  5. Değişikliklerinizi geri alın Bu önemli bir adımdır. Karşı sezgiseldir ve başlangıçta fiziksel olarak acıtır, ama basit bir şey denediğiniz için aslında o kadar da kötü değil.

  6. giden hataları olmayan (bilinen bağımlılıkları olmayan) görevlerden birini seçin ve 2'ye dönün.

  7. değişikliği yapın, ödevinizi kağıt üzerinde çizin, giden hataları olmayan (bilinen bağımlılıklar olmadan) bir görev seçin ve 2'ye dönün.

Bu sayede kısa aralıklarla çalışma koduna sahip olursunuz. Ayrıca takımın geri kalanından değişiklikleri birleştirebileceğiniz bir yer. Ve hala yapmak zorunda olduğunuzu bildiğiniz şeyin görsel bir temsiline sahip olursunuz, bu endevour ile devam etmek isteyip istemediğinize veya bunu durdurup durmamaya karar vermenize yardımcı olur.


2

Yeniden düzenleme , sizin uygun gördüğünüz gibi kod temizleme işleminden ayrı, yapılandırılmış bir disiplindir. Başlamadan önce birim testleri yaptırmanız gerekir ve her adım, işlevsellikte hiçbir değişiklik yapmaması gerektiğini bildiğiniz belirli bir dönüşümden oluşmalıdır. Ünite testleri her değişiklikten sonra geçmelidir.

Elbette, yeniden yapılanma işlemi sırasında, kırılmaya neden olabilecek değişiklikleri doğal olarak keşfedeceksiniz. Bu durumda, yeni çerçeveyi kullanan eski arayüz için bir uyumluluk düzenlemesi uygulamak için elinizden geleni yapın. Teoride, sistem hala eskisi gibi çalışmalı ve birim testleri geçmelidir. Uyumluluk şimini kullanım dışı bir arayüz olarak işaretleyebilir ve daha uygun bir zamanda temizleyebilirsiniz.


2

... Özelliği eklemek için projeyi değiştirdim.

Dediği gibi @Jules, Yenileme ve özellikleri ekleme iki çok farklı şeylerdir.

  • Yeniden düzenleme, davranışını değiştirmeden programın yapısını değiştirmekle ilgilidir.
  • Öte yandan, bir özellik eklemek, davranışını artırıyor.

... ama gerçekten de, bazen eşyalarınızı eklemek için içsel çalışmalarınızı değiştirmeniz gerekebilir, ancak yeniden düzenlemekten ziyade bunu değiştirmeye çağırırım.

Barındırmak için küçük bir arayüz değişikliği yapmam gerekiyordu

İşlerin dağıldığı yer orası. Arayüzler, uygulamayı kullanım şeklinden izole etmek için sınırlar olarak adlandırılır. Arayüzlere dokunur dokunmaz, her iki taraftaki (uygulayan veya kullanan) her şeyin de değişmesi gerekecektir. Bu yaşadıkça yayılabilir.

o zaman tüketici sınıfı mevcut arayüzüyle yenisi için uygulanamaz, bu yüzden yeni bir arayüze de ihtiyacı var.

Bir ara yüzün bir değişiklik gerektirdiği iyi geliyor ... diğerine yayılması, daha da yayılması gereken değişiklikleri ima ediyor. Bir tür girdi / veri biçiminin zincirden aşağıya akmasını gerektiriyor gibi geliyor. Bu böyle mi?


Konuşmanız çok soyut, bu yüzden anlamak zor. Bir örnek çok yardımcı olacaktır. Genellikle, ara yüzler birbirlerinden oldukça sağlam ve bağımsız olmalıdır, böylece diğer bölümlere zarar vermeden sistemin bir kısmını değiştirmeyi mümkün kıl ... arayüzler sayesinde.

... aslında, basamaklı kod değişikliklerinden kaçınmanın en iyi yolu tam olarak iyi arayüzlerdir. ;)


-1

Bence bir şeyleri olduğu gibi tutmak istemediğiniz sürece genellikle yapamazsınız. Ancak, sizinkine benzer durumlar olduğunda, ekibin bilgilendirilmesinin ve daha sağlıklı gelişime devam etmek için neden bazı yeniden düzenlemelerin yapılması gerektiğini onlara bildirmenin daha iyi olacağını düşünüyorum. Sadece gidip işleri kendi başıma tamir etmem. Scrum toplantıları sırasında (onlara sahip olduğunuzu varsayarsak) konuşur ve diğer geliştiricilerle sistematik olarak ele alırdım.


1
Bu, önceki 9
cevapta

@gnat: Belki değil, ama cevapları basitleştirdi.
Tarik
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.