Dünyadaki çeşitli müşteriler için özel olarak uyarlanmış büyük bir yazılım projesi üzerinde çalışıyorum. Bunun anlamı, çeşitli müşteriler arasında ortak olan% 80'lik bir koda sahip olduğumuz anlamına gelir, aynı zamanda bir müşteriden diğerine değişmesi gereken çok sayıda koda sahip olduğumuz anlamına gelir. Geçmişte gelişimimizi ayrı depolarda (SVN) yaptık ve yeni bir proje başladığında (az sayıda fakat büyük müşterimiz var), geçmiş projenin ihtiyaçlarımız için en iyi kod temeline sahip olmasına dayanarak başka bir depo oluşturduk. Bu geçmişte çalıştı, ancak birkaç sorunla karşılaştık:
- Bir depoda sabitlenen hatalar diğer depolarda yamalı değildir. Bu bir organizasyon sorunu olabilir, ancak 5 depoda bir hatayı düzeltmeyi ve düzeltmeyi zor buluyorum, bu deposu sürdüren ekibin dünyanın başka bir yerinde olabileceğini ve onların test ortamına sahip olamayacağımızı aklımda tutuyorum. ne programlarını ne de ne istediklerini bilmiyorlar (bir ülkedeki "hata", başka bir ülkede "özellik" olabilir).
- Bir proje için yapılan, başka bir proje için de yararlı olabilecek özellikler ve iyileştirmeler kaybedilir veya başka bir projede kullanılırlarsa, sık sık onları bir kod tabanından diğerine birleştiren büyük baş ağrısına neden olurlar (çünkü her iki dal da bir yıl boyunca bağımsız olarak geliştirilebilmektedir) ).
- Bir geliştirme branşında yapılan yeniden yapılanmalar ve kod iyileştirmeleri , şubeler arasında tüm bu değişiklikleri birleştirmek zorunda kalırsanız ya kaybolur ya da daha fazla zarara neden olur.
Şimdi bu problemlerin nasıl çözüleceğini tartışıyoruz ve şimdiye kadar bunun nasıl çözüleceğine dair aşağıdaki fikirleri ortaya çıkardık:
Ayrı branşlarda gelişmeyi sürdürün ancak genel hata düzeltmelerinin birleştirildiği merkezi bir depoya sahip ve tüm projelerin bu merkezi depodaki değişiklikleri düzenli olarak (örneğin günlük olarak) kendi başlarına birleştirmelerini sağlayarak daha iyi organize edin . Bu da büyük disiplin ve dallar arasında birleşme için çok çaba gerektirir. Bu yüzden işe yarayacağına ikna olmadım ve bu disiplini, özellikle zaman baskısı ortaya çıktığında tutabiliriz.
Ayrı gelişim kollarını terk edin ve tüm kodlarımızın yaşadığı ve takılabilir modüller ve konfigürasyon seçenekleri kullanarak özelleştirmemizi sağlayan merkezi bir kod deposuna sahip olun. Kodumuzdaki bağımlılıkları çözmek için zaten Bağımlılık Enjeksiyonu konteynerlerini kullanıyoruz ve işletme mantığını kullanıcı arayüzümüzden temiz bir şekilde ayırmak için çoğu kodumuzdaki MVVM modelini takip ediyoruz.
İkinci yaklaşım daha zarif görünüyor, ancak bu yaklaşımda birçok çözülmemiş sorunumuz var. Örneğin: modelinizdeki / veritabanınızdaki değişiklikleri / eklemeleri nasıl ele alırsınız. Güçlü bir şekilde yazılmış varlıklara sahip olmak için .NET'i Entity Framework ile kullanıyoruz. Veri modelimizi karıştırmadan bir müşteri için gerekli olan ancak başka bir müşteri için yararsız olan özellikleri nasıl kullanabileceğimizi anlamıyorum. Bunu veritabanında çözmeyi düşünüyoruz (uyduları kullanarak (belirli bir varlık için fazladan sütunlarımızın 1: 1 ile eşlendiği orijinal varlık ile eşleştirilen ayrı bir tabloya sahip), ancak bu sadece veritabanı. Bunu kodda nasıl ele alıyorsunuz? Veri modelimiz, bu yaklaşımı kullanarak her bir müşteri için uzatamayacağımız merkezi bir kütüphanede yaşıyor.
Bu sorunla mücadele eden tek takım olmadığımızdan eminim ve konuyla ilgili çok az malzeme bulmaktan şok oluyorum.
Yani benim sorum şu:
- Son derece özelleştirilmiş yazılım konusunda ne gibi deneyimleriniz var, hangi yaklaşımı seçtiniz ve sizin için nasıl çalıştı?
- Hangi yaklaşımı öneriyorsunuz ve neden? Daha iyi bir yaklaşım var mı?
- Konuyla ilgili önerebileceğin iyi kitaplar veya makaleler var mı?
- Teknik ortamımız için özel önerileriniz var mı (.NET, Entity Framework, WPF, DI)?
Düzenle:
Tüm önerileriniz için teşekkürler. Fikirlerin çoğu, zaten ekibimizde sahip olduğumuz fikirlerle eşleşiyor, ancak onlarla birlikte edindiğiniz deneyimi ve bunları daha iyi uygulamak için ipuçlarını görmek gerçekten yararlı.
Hala hangi yöne gideceğimizden emin değilim ve karar vermiyorum (yalnız), ama bunu takımımda geçireceğim ve bunun yardımcı olacağından eminim.
Şu anda, tenor müşteriye özel modülleri kullanarak tek bir havuz gibi görünüyor. Mimarimizin buna bağlı olduğundan veya uygun hale getirmek için ne kadar yatırım yapmamız gerektiğinden emin değilim, bu nedenle bazı şeyler bir süre ayrı depolarda yaşayabilir, ancak işe yarayacak tek uzun çözüm olduğunu düşünüyorum.
Yani, tüm cevaplar için tekrar teşekkürler!