Çevik yöntemler kullanırken iyi tasarım nasıl elde edilir?


15

Yaklaşık üç yıldır çevik bir metodoloji (SCRUM) kullanıyorum ve özellikle birçok seviyedeki kısa vadeli geri bildirimlerde (erken erişime sahip müşterilerden, özellikleri test edebilen test cihazlarından) belirli avantajlar görüyorum. uygulandığında, yeni kod hakkında inceleme yoluyla çok erken geri bildirim sağlayabilen diğer geliştiricilerden vb.

Öte yandan, birincisi bu soruda açıklamaya çalışacağım iki açık sorunum var.

Sorun: İyi bir tasarım elde etmekte zorluk

Kod dağınık olur olmaz refactoring yapmaya çalışıyorum (ben genel olarak ve özellikle yeniden düzenleme zaman hataları önlemek için yardımcı olur) mümkün olduğunca birim testleri yazıyorum . Öte yandan, günlük taahhütlerle küçük artışlarla bazı karmaşık özellikler geliştirmek ve yapılandırılmadan kodu sürekli olarak yeniden düşünmek gerçekten iyi bir tasarım üretmeme izin vermiyor.

Son zamanlarda üretebildiğim tek iyi tasarlanmış modül farklı bir yaklaşımla elde ettim: Sorunu birkaç gün boyunca analiz ettim (gerçekten ciddiyetle çalışmaya başlamadan önce birkaç ay boyunca sorunum vardı) ), ilgili tüm sınıfların ve ilişkilerinin birkaç gün daha ayrıntılı bir taslağını çizdi ve daha sonra kendimi ofisime kilitledim ve yaklaşık üç hafta boyunca kesintisiz çalışarak tüm kodu yazdı. Sonuç, bir süredir ürettiğim en iyi şeydi, bulunması ve düzeltilmesi oldukça kolay olan çok az hata ve o zamandan beri ilgili değişiklikler gerektirmeyen çok net bir tasarımdı.

Şimdiye kadar, büyük resmin büyülü bir şekilde süreçte ortaya çıkması umuduyla küçük artışlarla kod yazmaya başlamaktan önce yapmak istediğim şeyin genel bir resmini elde etmeyi çok daha etkili buldum. En iyi çabamla, küçük artış geliştirme yaklaşımı beni her zaman daha kötü tasarıma götürdü.

Soru : Benzer bir deneyim yaşadı mı? SCRUM'u yanlış mı uyguluyorum ya da küçük artışlarla geliştirmek ve yine de iyi tasarlanmış bir yazılım parçası bulmak istiyorsam nelere dikkat etmeliyim? Yoksa gerçek kodlamaya başlamadan önce bir tasarım kullanıcı hikayesi mi planlamalıyım ? En azından ortalamadan daha karmaşık özellikler için bu iyi bir uygulama mıdır?

DÜZENLE - NOT

İyi tasarımın mutlak bir şey olmadığı ve kendi başına bir değeri olmadığı gerçeğinin farkındayım, ancak bağlama bağlı ve kişinin eldeki problem için yeterince iyi bir tasarıma yönelik olması gerekiyor .

Örneğin, (1) mümkün olan en kısa sürede hazır olması gereken, (2) sadece bir kez kullanılacak, (3) kullanılmayacak basit bir bileşen uygulamak zorunda kalırsam iyi tasarımı önemsemiyorum (çok fazla) sistemin diğer parçaları (YAGNI) tarafından kullanılır.

Bir bileşen (1) birkaç kez kullanıldığında ve bir ürünün birkaç farklı sürümünde (2) zaman içinde bakımı ve uzatılması gerektiğinde iyi bir tasarıma önem veriyorum, (3) buna bağlı olarak çok sayıda başka bileşeni var .


5
The only well-designed module I could produce recently I obtained by taking a different approach- Kendi sorunuzu cevapladınız. Yine de bazı ön tasarımlara ihtiyacınız var ; iyi bir tasarımın organik olarak yeniden düzenlemeden büyümesini bekleyemezsiniz. Bu şekilde çalışmaz.
Robert Harvey

1
Hayır. Çünkü belki SCRUM'u doğru uygulamıyorum.
Giorgio

3
"Doğru SCRUM" diye bir şey yoktur. Sadece istenen sonucu üreten bir süreç vardır.
Robert Harvey

1
Bu yüzden onlara "kurallar" denir :) Her neyse, her gün taahhüt, kısa (1 haftadan 1 aya kadar) sprintleri var, bunun gibi kurallar tasarım için hiç konuşmuyor. Hala tasarıma sahip olmalısın.
Robert Harvey

Yanıtlar:


13

Öte yandan, günlük taahhütlerle küçük artışlarla bazı karmaşık özellikler geliştirmek ve yapılandırılmadan kodu sürekli olarak yeniden düşünmek gerçekten iyi bir tasarım üretmeme izin vermiyor.

Öyleyse yapma.

Her şey güzel çevik kutuya uymuyor. Çoğu zaman bir ürün, bireylere yetiştirilemeyen ve süratle herhangi bir aklı başında tamamlanamayan birkaç karmaşık şeye sahip olacaktır. Onları bu kutuya zorlamak sadece sorun yaratacaktır. Ancak bunlar az ve çok olmalıdır. Bileşenlerinizin çoğunun böyle olduğunu fark ederseniz, ürün sahibinizin işleri daha iyi (ekibinizle) parçalamak için çalışması gerekir. Yaptığınız gibi iyiyim: hikayeyi alın, tasarlayın, sonra birkaç hafta süreceği beklentisiyle ASAP'ı çekiçleyin.

Daha genel bir durumda, Agile'da iyi bir tasarım elde etmek için gördüğüm 3 şey var:

  • Aslında tasarım yap - Gördüğüm birçok yer sprint'lerini başlatıyor ve sadece kovboy kovmaya başlıyor. Bu şekilde kötü bir tasarım elde edeceksiniz. Agile, plan - kod - test - sürümünün geliştirme sürecini değiştirmez, sadece daha ayrıntılı parçalara kısaltır. Sprint başlangıcında, gerektiği gibi oturun ve aslında çözümünüzü tasarlayın.

  • Bir mimar / liderlik yapın - Projeniz yeterince büyük olduğunda, uygulamanın farklı parçaları üzerinde çalışan birden fazla scrum ekibiyle sonuçlanacaksınız. Ana işi tüm ekiplerin tasarım açısından ne yaptığını bilmek olan birinin (veya uygulamanın büyüklüğüne bağlı olarak birden fazla kişinin) olması çok yararlıdır. Soruları cevaplayabilir ve takımları daha uyumlu bir aşırı kemerli tasarıma doğru yönlendirebilirler. Her scrum takımının, diğer takımların neler yaptığını bilen bir ipucu olması da gördüm ve çok etkili oldum.

  • Bir pragmatist olun - bunu yukarıda ele aldım. Çevik bir araçtır ve herhangi bir araç gibi; tüm problemler için geçerli değildir. Bazı bileşenlere başvurmak mantıklı değilse, oraya uygulama. Amacınız iyi yazılım göndermek; unutma.


3
+1 (birden fazla oyum olsaydı +10!) "Onları bu kutuya zorlamak sadece sorun yaratacaktır."
Giorgio

17

Küçük artışlarla uygulamak ve iyi yapılandırılmış bir bakım kodu ile son derece mümkündür. Teorik olarak, çok basittir: her değişiklikten sonra kodun iyi yapılandırıldığından emin olursanız, her zaman iyi yapılandırılmış olacaktır. Yeniden düzenleme yaparken kod eklemeye devam ettiğiniz için kodunuz kötü yapılandırılıyor.

Tasarımda ne kadar zaman geçirirseniz geçirin, sonunda gereksinimler beklenmedik bir şekilde değişecek ve orijinal tasarıma uymayan bir kod yazmanız gerekecektir. O zaman artımlı bir değişiklik yapmanız gerekecektir. İyi bir birim test kümeniz varsa ve yeniden düzenleme konusunda yetenekli iseniz, yeni gereksinimleri karşılarken kodu iyi yapılandırılmış tutabilirsiniz.


+1: Tamam. Bu yüzden bir ihtiyaç olduğunu düşündüğümde yeniden düzenleme hikayesi planlamalıyım ve tekrar yeterince iyi bir tasarıma sahip olana kadar yeni özellikler eklememeliyim. Muhtemelen sürecimizde eksik olan şey budur (IMO'nun, geliştirdiğimiz artışların genellikle çok küçük olmasına ek olarak).
Giorgio

2
aslında eklemek gerekir teknik borç hikaye ve aslında Ürün Sahibi ile üzerinde hareket etmek, bu ne anlama geldiğini olduğunda tartışmak teknik borcu .

4
Kod kalitesi sorumluluğunu, "teknik borç" hikayeleri veya benzerlerini oluşturarak ürün sahibinin eline bıraktığınız yerlerde gördüğüm tüm projeler, kod kalitesine her zaman hız ve morale ciddi zarar verecek kadar düşük öncelik vermiştir. Ekibin, kod kalitesinin sorumluluğunu üstlenen kuruluş olduğuna inanıyorum. Ekip hikayeleri tahmin etmeli, böylece korunmuş veya gerekirse azaltılmış teknik borç ile dağıtım için yer var.
Buhb

4
"Yeniden düzenleme hikayesi" veya "Teknik borç hikayesi" gerçekleşmemelidir. Asla. Yeniden düzenleme maliyeti, gelişimin bir parçasıdır ve ayrı bir görev olmamalıdır. Gerçekte, hikayelerden sonra planlanmamış, küçük adımlarla sürekli yapılmalıdır. Bunu biliyorum, ekibimiz yeniden düzenleme hikayelerini denedi, kötü. 'Anında' yeniden düzenleme yapmaya başladığınızda, yeniden düzenleme işleminin kodlama stilinizin bir parçası haline geldiğini ve yapılacak ayrı bir görev olmadığını göreceksiniz.
Patkos Csaba

1
Kod tabanının, önemli bir yeniden yapılandırma / yeniden yazma olmadan X öyküsünü rahatlıkla işleyemeyeceğine inanıyorsanız, bu yeniden yapılandırma X öyküsünün bir parçası olmalı ve X öyküsü tahmin edilirken bu yeniden yapılandırma için gereken çalışma dikkate alınmalıdır.
Buhb

6

"İyi tasarlanmış" özneldir

Ne gelmez "iyi tasarlanmış" Size ortalama? Ürün Sahibine? müşteriye?

Is "iyi tasarlanmış bir ürün sahibinin golü"? müşteri hedefi? ya da sadece sen?

Böyle mi siz düşünün "iyi tasarlanmış değil" hala Ürün Sahipleri beklentilerinin karşılanması ve müşteri mutlu etmeye? Sonra bu oldukça "iyi tasarlanmış" .

Yeterince İyi ve YAGNI

Çoğu Çevik metodolojisinde hiçbir şey "iyi tasarlanmış" dan bahsetmez, çünkü Ürün Sahibinin hikayeleri eksiksiz olarak kabul ettiği ve müşterilerin gereksinimlerini karşıladığına inandığı herhangi bir sistem "iyi tasarlanmış" dır .

Edilir beklenen geliştiriciler profesyoneliz ve olacağı pragmatik özellikleri ve hikayeleri uygulamak için en iyi uygulamaları, uygun tasarımlar ve deyimleri kullanır.

Bir geliştirici problemi olan şeyleri doğru bir şekilde yapmak için faktoring yapmıyorsanız, Ürün Sahibi bunların yapılabileceği daha kısa sürede bir şeyler talep ediyorsa, bunu yapmak ayrıcalıktır ve bunları eğitmek sizin sorumluluğunuzdur. borçlanma hikayeleri şeklinde sonuçları .

SCRUM

Yazılabilir Çevik Metodoloji, Çevik Metodoloji değildir. "- Jarrod Roberson

SCRUM'un bir yazılım ürününün toplam yaşam döngüsünü yönetmek için bir araç çerçevesi olduğu varsayılmaktadır. Katı bir şey kümesi değil, sadece başlamak ve umarım geliştirmek için iyi bir yer olması gerekiyordu.

Çalıştığım çoğu dükkanda, ürünün genel mimarisini veya temasını çizmek için ekibin üst düzey üyeleri için Sprint ZERO, Sprints denir.

20'den büyük olan hikayeler genellikle birkaç 3 - 5 nokta Hikaye olana kadar parçalanır. Bu hikayelerden biri, "Bir ekip olarak bu özelliği nasıl tasarlayacağımızı tartışmak için toplanmamız gerekiyor, böylece ayrılan zaman göz önüne alındığında mümkün olduğunca az teknik borcumuz olacak."

genellikle

Genel olarak "iyi tasarlanmış" bir sistem yeterlidir ve YAGNI'yı takip eder.

Agile ve özellikle SCRUM, Agile'nin bir uygulaması olarak, bir ürünün Ürün Sahibi / Sponsorları için mümkün olduğunca şeffaf bir şekilde nasıl üretileceği hakkında daha fazladır .

Teknik tasarım / mimari açısından akıllıca bir şey değil . Bu daha çok müşterilerin ihtiyaç ve beklentilerini karşılayan yazılım sunma yaklaşımına yaklaşmaktır. "İyi tasarlanmış" parçalar dediğin şey yoksa , bu felsefenin temel bir parçası olmadığı için kendi başına başarısız olmaz.


2
"İyi tasarlanmış" bir ürün sahibinin hedefi: Doğrudan bir hedef değil. Dolaylı olarak, evet: iyi tasarlanmış, hata ayıklama ve bakımı daha kolay anlamına gelir. Dağınık, kötü tasarlanmış kod kritik hatalar (uygulama çöktü) bulma hafta geçirmek zorunda kaldı.
Giorgio

3
Ne iç karartıcı bir cevap. Temel olarak gezegeni gri bir goo
Robert Harvey

@Giorgio bu bir hedef değil, zımni bir beklenti.

@RobertHarvey Big Ball of Mud videosunu gördüğünüzü ve Gazeteyi okuduğunuzu biliyorum . Bu gerçek hayattır, özellikle SCRUM, BBOM'un bir kabulüdür ve entropiyi sürecin bir parçası olarak kabul ederek ve onu belgelemeye (teknik çıkış) ve yavaşlatmaya (yeniden düzenleme) çalışarak yöneterek metodolojide benimser. Evet, toplam BBOM / Entropy'den çok uzakta başlamalısınız, ancak gerçek hayatta her zaman böyle değildir.

1
Tamam, ama bir "zımni beklenti" yiyemezsin. Bu sadece el sallıyor. "İyi mimar olacak çünkü ben bir profesyonelim ve ne yaptığımı biliyorum." (en iyi Bill Murray sesimi kullanarak) Evet, doğru.
Robert Harvey

3

Scrum ile birkaç aydır çalışıyoruz ve sorununuzla ilgili deneyimlerimi paylaşmak istiyorum.

Birkaç ay önce bana uygulaması için büyük bir parça verildi. Tüm spesifikasyonları hazırladım, bu yüzden yeni özellikleri uygulamaya koymak zorunda kaldım. Görev (tahmin ettiğim gibi) yaklaşık 5-6 hafta sürmekti. İlk haftayı sadece tasarım üzerinde çalıştım. Görev biraz karmaşıktı: şartnameden çıkardığım gibi 15 farklı duruma sahip olan bir ana nesne vardı ve UI her eyalet için farklı davranışlara sahip olacaktı.

Daha sonra tüm iş akışını, DB yapısını ve sınıflarını tasarladım.

Benim durumumda başka bir yaklaşım görmüyorum. Bir kerede kodlamaya dalmış olsaydım, sonunda büyük bir iğrenç karmaşa olurdu _ korumak neredeyse imkansız ve daha fazla değişiklik yapmak son derece zor. Ancak değişiklikler önümüzdeki 2 hafta içinde geldi, bu yüzden kodu yeniden çalışmak zorunda kaldım. İlk düşünce tasarımı ile bu artık kolaydı. Bu zamanımızı, paramızı ve sinirlerimizi kurtardı.

Bu deneyimden sonra, başlangıçta kabul edilebilir bir tasarım yapmaya değeceğinden kesinlikle eminim, biraz mucize ile sonunda elde edeceğinizi umuyoruz.


1
+1: Çok ilginç bir cevap. Çevik taraftarlar size 6 haftalık öykünüzü daha küçük öykülere ayırmanız gerektiğini söylerdi. Bir zamanlar benzer bir tavsiyede bulundum ve altı adet 1 haftalık hikayemin birbirleri arasında çok fazla bağımlılığı olacağını söyledi: çünkü çalışma planımı değiştirsem bile sorun alanını değiştiremem. Bu konuda hiçbir cevabım yok: Agile genellikle çalışmanızı küçük, bağımsız hikayeler üzerinde parçalayabileceğinizi varsayar, ancak gerçek dünyada bu her zaman böyle değildir.
Giorgio

1

Arka görüş 20-20. Eğer projenin başlangıcında herşeyi anlamak ve birkaç hafta içinde kodu yazmak için elinizde bilgi varsa, bunu yapmanızı öneririm.

Kazandığınız tüm içgörülere, denenmiş ve başarısız / değiştirilmiş yaklaşımlara yeterli miktarda kredi vermiyorsunuz ve müşterinin / kullanıcıların ihtiyaç duydukları krediyi sağlama yeteneğinin artması.

Neden başarılı su düşüşü projeleri olan bir kimse çevik bir metodolojiye geçsin?


"Neden başarılı su düşüşü projeleri olan herkes çevik bir metodolojiye geçsin?": Çok iyi gözlem (+1). Şelale ve çevik arasındaki seçimin, yapılması gereken projelerle ilgili olması gerektiğini düşünüyorum: sık prototiplere ihtiyaç duyan ve prototipin nihai ürün haline geleceği kötü tanımlanmış gereksinimleri olan projeler için çeviklik uygun olabilir. Gereksinimlerin daha kararlı olduğu ve sağlamlığın ve istikrarın daha önemli olduğu bir proje için şelale (veya bazı varyasyonlar) muhtemelen daha iyi bir seçimdir.
Giorgio

0

Nihai hedefin ne olması gerektiği ve bir projeye başlamadan önce hangi özelliklerin ve ne zaman uygulanması gerektiğini gösteren daha büyük bir resme ihtiyacınız vardır. Hikayeler üzerinde atomik görevler üzerinde çalışmak sorun istiyor. Gelecekteki gereksinimleri olabildiğince aklınızda tutmanız gerekir.


Bir tasarım kullanıcı hikayesi planlamak iyi bir uygulama mı?
Giorgio

@Giorgio: Bu muhtemelen gereksizdir, ancak Ürün Sahibi en azından ekibine, proje başlamadan önce müşterinin projenin beklentileri hakkında bir genel bakış ve nasıl olduğu konusunda bir açıklama yapmalıdır.
James

1
Birisi downvotes lütfen bir sebep verin
James

Downvoters nadiren neden downvote olduklarını açıklamak için zaman ayırırlar. Çok sinir bozucu buluyorum.
Giorgio
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.