Az önce yayınladığınız makaleyi okudum, Fowler'ın çok iyi noktalar ve söylediği birçok şey yaptığını söylemeliyim, ekibimizle yıllardır savunuyorum.
IMO, eğer iyi bir tasarım yaparsanız, çıkmaz bir durum olarak kabul edilecek şeylere girmemelisiniz. Yazılımı her zaman yapı taşlarından oluşmuş olarak gördüm . Hala bazı ön tasarıma inanıyorum, ancak asıl amaç tüm ürünü tasarlamak değil, genel mimari / yön sağlamaktır, böylece ekibiniz hepimizin üzerinde çalıştığımız ortak bir resmi görselleştirebilir. Bir sürü küp ve üçgen parçanız varsa, parçaları birbirine tokatlamaya başlamadan önce bir kalenin nasıl bir araya getirileceğini çizmek yardımcı olur.
OO topraklarından geldiğim için, bana göre her blok bir sınıftır ve bu bloğun yüzey alanı genel arayüzdür (dışsal veya türetici sınıflar tarafından görülebilir). İyi SOLID ilkelerini izlerseniz, her bloğun son derece basit ve sezgisel bir genel arayüze sahip olduğundan emin olursunuz. Benzetmeme geri dönersek, kodunuzun yalnızca basit şekiller oluşturduğundan emin olmak istersiniz. Ne zaman çok karmaşık (birçok işlev, birçok değişken) sınıflar oluşturduğunuzda, gereksinimler değiştiğinde yeniden kullanılması zor şekiller oluşturursunuz.
Fowler ile hemfikirim; evrimsel tasarım için en büyük risk / zorluk, tasarım kararlarını kodlama zamanına bırakmanız ve her bir geliştiricinin bu kararları almasını beklemenizdir. Uygun geri bildirim mekanizmalarınız yoksa sistem arızalanabilir. Yeni bir özellik istendiğinde, genişletilmesi gereken işlevi bulmak, içine bir tür koşul koymak ve sadece bu işlevin içine bir sürü kod eklemek son derece caziptir. Ve bazen, tüm ihtiyaç duyulan bu olabilir, ancak bu aynı zamanda çıkmaz bileşenlere yol açan en yaygın tek uygulamadır. Bunun evrimsel tasarımla bir ilgisi yok. Buna "tasarım yok" denir.
Geri adım atmaya ve diyelim ki, bir dakika bekle, bu sınıfın zaten 15 üye değişkeni var, bunlardan 6'sını çıkarmama ve kendi müstakil sınıflarına koymama izin verdiğinizde, yazılımınız çok hafif olacak -ağır, esnek ve tekrar kullanılabilir yapı taşları. Eğer PM'ler gelir ve ürün gereksinimlerinizin yarısını değiştirirse, bazı bloklarınızı çıkarmanız, rafa geri koymanız ve yeni olanlar çizmeniz gerekebilir (tıpkı bir kale inşa ederken olduğu gibi, hepsini kullanamayabilirsiniz) silindirleriniz). Ama bu noktada, bu sadece iş yapmanın bir parçası. Gereksinimler değişti ve kodunuzu esnek ve modüler tutarak, ürününüzü yeni iş yönünüze uyacak şekilde değiştirebilmelisiniz.
Tasarımdaki bu evrimsel yaklaşımın her seviyede mühendisin becerisiyle çalıştığına inanıyorum. Şahsen, çok uzun bir süre yazılım yaptım ve ekibimiz çevik bir metodolojiye geçmeden önce, dev PC'mden birkaç ana bileşeni neredeyse hiç KG ile neredeyse doğrudan müşteriye göndermekten sorumluydum. Aynı zamanda bu bileşenler her zaman esnek ve bakım yapılabilir kalmıştır.
Sadece yazılım tasarlarken kendimi nispeten iyi göreceğimi söylemeye çalışıyorum. Aynı zamanda, 100 sayfalık bir tasarım belgesi yazmamı, bir kodlayıcıya vermesini ve çalışmasını beklemenizi istediyseniz, muhtemelen kendimi bir kağıt torbadan tasarlayamadım. Çalışmaya başlarken, bazen birkaç UML benzeri (çok basitleştirilmiş, tam dil değil) diyagramları çizerdim, ancak kodlamaya başladığımda, gerektiğinde yeniden düzenlerim ve son kodum asla çizdiğim gibi görünmezdi. Her küçük ayrıntıyı düşünmek için bir iki ay geçirsem bile, başka birisinin diyagramlarımı alabildiğini ve tasarımı kodlarken tasarımını değiştirmeden sağlam bir yazılım parçası bulabildiğini hayal edemiyorum.
Spektrumun diğer ucunda, şu anda ekibimde (şimdi çevik ve bunu tam olarak destekliyorum), son 15 yıldır sadece C yaptıkları gömülü topraklardan bize katılan birkaç adamımız var. Açıkçası bazı başlangıç planlama ve ders verme konusunda yardımcı oldum, ancak aynı zamanda SOLID ve tasarım ilkelerinin uygulamalarını tartıştığımız düzenli kod incelemeleri ve beyin fırtınası oturumlarını takip etmeyi de sağladım. Biraz kandırmak için bazı spagetti kodları ürettiler, ama benden sadece hafif bir dürtme ile, zaten üretilenleri yeniden düzenlemeye başladılar ve komik kısım bunlardan birinin bana birkaç gün sonra geri gelip diyor ki, nefret ediyorum ancak bu kodu çıkardıktan sonra çok daha okunabilir ve anlaşılır görünüyor. Çıkmaz önlendi. Nokta I ' Yapmaya çalışıyorum, OO için tamamen yeni olan birisinin bile, daha fazla deneyime sahip bir akıl hocası olduğu sürece, ona "evrimsel tasarım" ın "tasarım" ile aynı şey olmadığını hatırlatmak için iyi bir kod üretebileceğidir. Ve hatta bazı "daha karmaşık" sınıfları bile o kadar korkutucu değil çünkü her sınıfın o kadar fazla sorumluluğu yok (yani o kadar fazla kod değil), o kadar kötüsü daha da kötüleşiyor, eğer o sınıf "çıkmaz sokaklar" ise, chuck ve aynı ortak arayüze sahip bir yedek sınıf yazmak (şimdiye kadar yazdım bir şeyde bu beklenmedik bir ihtiyaç görmedim ve haftada iki kez kod değerlendirmeleri yapıyorum).
Son bir not olarak, aynı zamanda tasarım belgelerine de inanıyorum (en azından mevcut ekibimin iş koşulları için), ancak tasarım dokümanlarımızın temel amacı Organizasyonel Bellek , bu yüzden kod üretildikten sonra gerçek belgeler yazılıyor ve refactored. Kodlamadan önce, genellikle peçeteler / mspaint / visio üzerine sınıflar çizdiğimiz hızlı (bazen çok hızlı olmayan) bir tasarım aşamasına sahibiz ve insanlara her zaman bu aşamanın bir plan değil, takip edecek bir yol ürettiğini ve kodlamaya başladıklarını hatırlatırım, mantıklı olmayan herhangi bir şey değiştirilmelidir. Bu hatırlatıcılarla bile, yeni çocuklar, kendileri için bile ne kadar doğal hissettirse de, kodu orijinal tasarıma geri koyma eğilimindedir. Bu genellikle kod incelemelerinde ortaya çıkar.
Dang, çok yazdım. Bunun için üzgünüm.