“Buna ihtiyacınız olmayacak” ve “Şimdi hiç olmadığı kadar iyi” birlikte nasıl oynar?


17

Bir tasarımın KURU halini ilerlettiğimde kendimi “şimdi hiç olmadığı kadar iyi” kucaklarken sık sık bulurum. Tipik olarak, diğer bilgi parçaları sistemi bağlamında bir bilgi parçası için Tek Yetkili Konum hakkında bir anlayış geliştirmem gerektiğini buluyorum. Böylece sistemi 'şimdi' tasarlama eğilimindeyim.

Tersine, bu uygulama İhtiyacım Olmayacağı makul bir şansa rağmen, oldukça önceden inşa etmeme neden oluyor.

Bu iki model nasıl kare?

İyi oynamasını sağlamak için hangi uygulamaları kullanıyorsunuz?

Karışıklık yaratmadan onlara nasıl birlikte öğretiyorsunuz?


2
Zıplamadan önce Bak. Ama tereddüt eden kişi kaybolur.
mmyers

Yanıtlar:


26

Ben de çok ileriyi düşünmeye çalışıyorum, ama genellikle kodda değil. Beyin fırtınası yapıyorum ve notlar alıyorum, umarım her şeyi onlara geri dönebilmem için yeterince iyi organize ederim.

Kodla ilgili olarak "buna ihtiyacınız olmayacak", ama tasarımla "şimdi hiç olmadığı kadar iyidir" e daha çok eğildim.

Yeni bir sistem kurmaya başlarken, şimdi her şeyi inşa etmek istemek caziptir, ancak aynı zamanda momentumunuzu ve moralinizi de azaltabilir. Genel tasarımı düşünmeye ve doğrudan bir çizgi çizmeye çalışıyorum - uçtan uca bir iskelet mimarisi bul ve önce inşa et, daha sonra geliştirebilmem ve daha sonra getirebilmem için ses tasarım ilkelerini uygulayarak yeni özellikler.

Çalışabilecek sistemin en basit uçtan uca sunumunu oluşturun; önce bunu yapın, sonra üzerinde düşünmeniz gereken bir şey var. Bu, tüm bu belirsiz “ne olur” sorusunu kristalleştirmeye ve daha sonra inşa etmeniz gerekenleri çivilemeye yardımcı olma eğilimindedir.


3
Tasarımda bir şey için yer bırakmak +1, başlangıçta çoğunu inşa etmeniz gerektiği anlamına gelmez. Çok fazla insan, mutlakçı bir tekme atmadan, hiçbir şey talep edilmeden önce düşünülmeli ve her şeyi müşteri girişi olmadan inşa etmiş olmasından çok daha kötü bir durumda bırakmalıdır.
Bill

9

YAGNI, işlerin daha önce değil, yapılması gerektiği zaman yapıldığı anlamına gelir . Bu, asla ihtiyaç duyulmadıkları sürece değil, asla bitmeyecekleri anlamına gelmez . Bu, yalnızca müşteriye anında iş değeri veren şeyi yaptığınız anlamına gelir . Acil iş değerinin anlamı her müşteri ve her proje için özneldir.

Her iki durumda da, YAGNI ile hiçbir şeyi kaybedemezsiniz .

Diğer durumda, hiç kullanılmayan kod yazma ve asla kullanılmayan kodlar için testler yazma ve hiç kullanılmayan kodlar için doküman yazma ve hiç kullanılmayan kodların bakımını yapma, bu kodun ne yaptığını merak eden insanlar ve eğer kullanılırsa, ad nauseum.

Misal

Bir prototip / kavram kanıtı veya bir uygulamanın 1.0 sürümü üzerinde çalışıyorsam , Facebook seviyesine göre ölçeklenecek bir tasarıma ihtiyacım yok. Cehennem Facebook'a göre ölçeklendirilecek bir tasarıma ihtiyacım yok , bu tür bir trafiğe sahip olduğumu görmeye başlayana kadar .

Sizce Zuckerberg, Facebook'un ilk sürümünü 500 Milyon kullanıcıya ölçeklendirecek şekilde tasarladı mı? Hayır, sadece yapması gereken ve daha fazlasını istemeyecek şekilde tasarladı ve yaptı. İlk günden itibaren 500 Milyon kullanıcı için tasarımı şelale etmeye çalışsaydı, Facebook muhtemelen hiçbir zaman serbest bırakılmayacaktı.

Bir şeyleri yapmanın pratik yolu, onu nasıl yaptığıdır. PHP ve MySQL ile başladı ve iş değerine göre yeniden tasarlandı ve gerektiğinde yeniden yazıldı , milyonlarca kullanıcıya ölçeklendirme muazzam iş değerine sahipti, ancak 0. günde değil. 0. günde sadece bir şey başlatmak muazzam iş değeriydi.

O planlanmış yeniden tasarlama ve yeniden üzerinde. Bu, mutfak lavabosunu planlamaktan farklı bir zihniyettir ve asla tam olarak yararlı bir şey geliştirmez veya teslim etmez.

Bir kod tabanı ve yeniden yazma işlemleri için kullanım ömrünü planlamak Çevik ve geleceğin kanıtıdır. Tanımlanmamış bir "esnek" hedef bulmaya çalışmak her seferinde başarısızlıkla sonuçlanır. Hiç ihtiyaç duymadan tasarlarsınız ve asla kullanılmayacak özellikler hakkında hayal kurmak yerine iş değeri olan şeyi geliştiriyor olabilirsiniz .


2
Tasarımınız kötüyse (örn. Esnek olmayan) YAGNI ile çok şey kaybedebilirsiniz.
EricSchaefer

1
@EricSchaefer - eğer hedeflere ulaşırsa ve işe değer kazandırırsa ve çok fazla zamanınız yoksa, asla tamamlanmayacak ve gönderilmeyecek büyülü sonsuz esnek sisteminizi sunmaktan daha az kaybedersiniz. ve eğer varsa, bir konfigürasyon kabusu olacaktır.

6

Python Zen şekilde diyor ki:

Şimdi hiç olmadığı kadar iyi. Her ne kadar asla şu andan daha iyi olmasa da.

Fikir şu ki, şimdi yapmanız gereken bir şeyi tanımlayabileceğiniz için değil. Şimdi ihtiyacın var mı?

  • Evet: şimdi yap!
  • Hayır: yapma! İhtiyacı bekleyin! YAGNI!

Bunun daha az belirgin olduğu durumlar, yeniden düzenleme davalarındadır. Her yapabildiğimde KURU uygulamam gerekir mi? Cevap açık değildir, çünkü KURU uygulamasının çoğaltma işleminden daha fazla zaman harcadığı (zaman içinde) zamanlar vardır. Bununla birlikte, uzun vadede, teknik / performans nedenleriniz olmadıkça DRY uygulamak her zaman iyidir.

Yani, YAGNI yapana kadar, ŞİMDİ YAP. Bekleme!


3

Birlikte oynadıklarını sanmıyorum. Sanırım ya şu ya da bu şekilde yalın. Ve YAGNI'ya yaslanıyorum.

Ama buna değer olarak, ikinci öneriye katılmıyorum, "Şimdi hiç olmadığı kadar iyidir." Bir gereksinim önemliyse, yapılması gerekecek. Yani "asla" bir olasılık değildir. Eğer önemli değilse, "şimdi" daha iyi değil - "asla" daha iyi değildir.

Sadece iki sentim.


Ve şimdi milyon dolarlık soru: "Önemli" ne anlama geliyor?
Aaronaught

1
"Önemli" bir kabul testidir.
16'da kindall

önemli, müşteri orada olmadığında uğradığı anlamına gelir.
Paul Nathan

2
Önemli, müşteri orada değilse ödeme yapmaz demektir.
Christopher Mahan

@Christopher, profesyonelleşmeyi teşvik edici olarak yorumlanabilir. Örneğin, SQL enjeksiyonuna karşı koruma, müşteri ne olduğunu bilmese ve ödemeden önce kesinlikle test etmese bile önemlidir.
Peter Taylor

2

Bu iki model nasıl kare?

Diktirler ve birbirleriyle hiçbir ilgileri yoktur.

İyi oynamasını sağlamak için hangi uygulamaları kullanıyorsunuz?

Um. İkisi de mi? Daha ne olabilir?

Karışıklık yaratmadan onlara nasıl birlikte öğretiyorsunuz?

YAGNI, kullanıcıların gördüğü özellikleri açıklar. Fantezi olmana gerek yok.

Şimdi süreci asla tanımlamamaktan daha iyidir. Testleri şimdi yazın. Şimdi kodu yazın. Tasarım alternatiflerini düşünürken saatlerce uğraşmayın. Bir şey inşa etmekten bahsetmektense bir şeyler inşa edin.


2

"Asla", "şimdi değil" in anlamı ise, tasarımınız kusurludur.

Verdiğiniz yerel kararlar sistemin geri kalanına şeffaf olmalıdır.
Eğer bir bileşen varsa Örneğin, CookieSourcebu bir ihtiyaç CookieFactoryçevirmek CookieRecipeso içine bilir Cookies, sonra senin bazı girdi parametrelerine dayalı, CookieSourcegerek ve böylece nasıl bağlı olmamalıdır CookieFactoryuygulanmaktadır ve nasıl CookieRecipestemsil edilir.
Eğer CookieFactorygerçek a içindedir Bakery, yani herhangi alabilir Recipegöre içine Pastrymeselesi olmamalı. Ve bu işlevselliğe ihtiyacınız olmadığı sürece, onu uygulamaya gerek yoktur. Ve dünyada, daha sonra ekleyememeniz için hiçbir neden yoktur, ancak CookieSourcekullandığı servisler arasında açık bir soyutlama engeli yoksa .

Yazılım oluştururken, gerektiği gibi işlevsellik ekleyin ve aldığınız kararlara kilitlenmemeye çalışın. Bunun yerine kararı uygun bir soyutlamaya kilitleyin .


1

Bulduğum en basit çözüm, kodu önceden yazarken değişiklik beklemektir. Bir işleve biraz bool geçirirken, genellikle bir bayrağı / numaralandırmayı en kısa zamanda değiştiririm, böylece a) daha okunabilir ve b) genişletilmesi kolaydır. Benzer şekilde, bir yere daha ihtiyacım var gibi koktuğu bir sürü parametre geçirdiğimi fark edersem, genellikle özel bir yapı oluştururum. Umut YAGNI bunu, ama bir noktada yaparsanız, hemen tüm kullanıcıları korkunç bir şekilde kırmaz ve "homurdanma işi" zaten yapılır. Genellikle, / * gelecekteki eklemeler buraya * / veya benzeri bazı yorumlar da ekleyebilirsiniz, bu yüzden henüz uygulanmadığı açıktır, ancak ekleyeceğiniz yer burasıdır. Arayüz yeniden düzenleme daha sonra en çok zaman alıcı bulduğum için bu genellikle en çok yardımcı olur.


Prensip olarak bu felsefeyi seviyorum, ama pratikte göçlerin beni iki kez düşündürecek kadar acı verici olduğunu görüyorum. Modellerinizi taşımanın, değişiklik beklemenin önünde olduğunu hiç buldunuz mu?
Justin Myles Holmes

Bu yaklaşımla ilgili iyi olan şey, değişikliklerin daha az acı verici olmasıdır; hala çok iş var. Göç eden modellerle ne demek istediğinizden emin değilim - kesinlikle YAGNI tarafındayım, ama en kötüsüne
hazırım

0

Gelecekteki uzantıları göz önünde bulundurarak tasarlayın, ancak ihtiyacınız olana kadar bu uzantıları uygulamayın.

Akılda kalan örnek, Netflix ilk başladığında, her bir hesapla yalnızca bir kuyruğunuz olabilir. Daha sonra çoklu kuyruk desteğini hacklediler. En başından beri bu şekilde tasarlanmadığından, bakımı gittikçe zorlaştı, bu yüzden bu özelliği bırakmaya karar verdiler. Bir müşteri kargaşasından sonra mermiyi ısırdılar ve birden fazla kuyruğu düzgün bir şekilde entegre etmek için yeniden tasarladılar.

Başlangıçta biri daha sonra birden fazla kuyruk isteyebileceği olasılığına izin vermiş olsaydı, çok az ek kısa vadeli çaba için kendilerini çok uzun süreli kederden kurtarabilirdi. Aslında hemen birden fazla kuyruk uygulamak zorunda kalmadılar, sadece yaptıklarında büyük bir yeniden yazma veya sürdürülemez bir kesmek gerektirmeyeceğinden emin olun.

Yüzeyde, gelecekteki gereksinimleri tahmin etmek için bir falcı benzeri yetenek gerektirecek gibi görünüyor, ancak pratikte böyle bir şey, bir şeyi zor kodladığını fark ettiğinde veya bir veritabanı tablosunun iyi bir programcıya bağlı kalma eğilimindedir. yalnızca belirsiz bir şekilde alakalı sütunlar topluyor.

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.