ฉันกำลังทำงานในโครงการซอฟต์แวร์ขนาดใหญ่ซึ่งได้รับการปรับแต่งอย่างดีสำหรับลูกค้าที่หลากหลายทั่วโลก ซึ่งหมายความว่าเราอาจมีรหัส 80% ซึ่งเป็นเรื่องปกติระหว่างลูกค้าหลายราย แต่ยังมีรหัสจำนวนมากที่ต้องเปลี่ยนจากลูกค้ารายหนึ่งเป็นลูกค้ารายอื่น ในอดีตที่ผ่านมาเราทำการพัฒนาของเราในที่เก็บแยกต่างหาก (SVN) และเมื่อโครงการใหม่เริ่มต้น (เรามีน้อย แต่ลูกค้าขนาดใหญ่) สร้างพื้นที่เก็บข้อมูลอื่นตามโครงการที่ผ่านมามีพื้นฐานรหัสที่ดีที่สุดสำหรับความต้องการของเรา สิ่งนี้ได้ผลในอดีต แต่เราพบปัญหาหลายประการ:
- ข้อบกพร่องที่ได้รับการแก้ไขในที่เก็บหนึ่งจะไม่ได้รับการแก้ไขในที่เก็บอื่น ๆ นี่อาจเป็นปัญหาขององค์กร แต่ฉันพบว่ามันยากที่จะแก้ไขและแก้ไขข้อบกพร่องในที่เก็บ 5 แห่งที่แตกต่างกันโดยคำนึงว่าทีมที่ดูแลพื้นที่เก็บข้อมูลนี้อาจอยู่ในอีกส่วนหนึ่งของโลกและเราไม่มีสภาพแวดล้อมการทดสอบ ไม่ทราบกำหนดการหรือข้อกำหนดที่ต้องมี ("ข้อบกพร่อง" ในประเทศหนึ่งอาจเป็น "คุณสมบัติ" ในอีกประเทศหนึ่ง)
- คุณสมบัติและการปรับปรุงที่ทำไว้สำหรับโครงการหนึ่งซึ่งอาจเป็นประโยชน์สำหรับโครงการอื่นหายไปหรือหากใช้ในโครงการอื่นมักทำให้เกิดอาการปวดหัวขนาดใหญ่รวมจากรหัสฐานหนึ่งไปยังอีกโครงการหนึ่ง (เนื่องจากทั้งสองสาขาอาจได้รับการพัฒนาอย่างอิสระเป็นเวลาหนึ่งปี )
- Refactorings และการปรับปรุงรหัสที่ทำในสาขาการพัฒนาหนึ่งอาจสูญหายหรือก่อให้เกิดอันตรายมากกว่าดีถ้าคุณต้องรวมการเปลี่ยนแปลงทั้งหมดเหล่านี้ระหว่างสาขา
ขณะนี้เรากำลังพูดถึงวิธีการแก้ปัญหาเหล่านี้และในขณะนี้ได้มีแนวคิดต่อไปนี้เกี่ยวกับวิธีการแก้ไขปัญหาดังกล่าว:
ทำการพัฒนาในสาขาที่แยกกันแต่จัดระเบียบได้ดีขึ้นด้วยการมีที่เก็บส่วนกลางที่มีการแก้ไขข้อบกพร่องทั่วไปและรวมโครงการทั้งหมดเข้าด้วยกันการเปลี่ยนแปลงจากที่เก็บส่วนกลางนี้เป็นของตัวเองเป็นประจำ (เช่นทุกวัน) เรื่องนี้ต้องมีวินัยอย่างมากและมีความพยายามอย่างมากในการผสานระหว่างสาขา ดังนั้นฉันไม่มั่นใจว่ามันจะทำงานได้และเราสามารถรักษาวินัยนี้โดยเฉพาะอย่างยิ่งเมื่อเวลากดดัน
ละทิ้งการพัฒนาแยกสาขาและมีที่เก็บรหัสกลางที่รหัสของเราทั้งหมดอยู่และทำการปรับแต่งของเราโดยมีโมดูลที่เสียบได้และตัวเลือกการกำหนดค่า เรากำลังใช้คอนเทนเนอร์การพึ่งพาการพึ่งพาเพื่อแก้ไขการพึ่งพาในรหัสของเราและเรากำลังติดตามรูปแบบ MVVM ในรหัสส่วนใหญ่ของเราเพื่อแยกตรรกะทางธุรกิจออกจาก UI ของเราอย่างหมดจด
วิธีที่สองดูเหมือนจะสง่างามกว่า แต่เรามีปัญหาที่ยังไม่คลี่คลายในแนวทางนี้ ตัวอย่างเช่นวิธีจัดการกับการเปลี่ยนแปลง / การเพิ่มเติมในแบบจำลอง / ฐานข้อมูลของคุณ เราใช้. NET กับ Entity Framework เพื่อพิมพ์เอนทิตีอย่างยิ่ง ฉันไม่เห็นวิธีที่เราสามารถจัดการคุณสมบัติที่จำเป็นสำหรับลูกค้ารายหนึ่ง แต่ไร้ประโยชน์สำหรับลูกค้ารายอื่นโดยไม่เกะกะโมเดลข้อมูลของเรา เรากำลังคิดที่จะแก้ปัญหานี้ในฐานข้อมูลโดยใช้ตารางดาวเทียม (มีตารางแยกต่างหากที่คอลัมน์พิเศษของเราสำหรับเอนทิตีที่เจาะจงอยู่ด้วยการแมป 1: 1 กับเอนทิตีดั้งเดิม) แต่นี่เป็นเพียงฐานข้อมูล คุณจัดการเรื่องนี้ในรหัสได้อย่างไร แบบจำลองข้อมูลของเราอาศัยอยู่ในห้องสมุดกลางซึ่งเราไม่สามารถขยายให้ลูกค้าแต่ละรายใช้วิธีการนี้ได้
ฉันแน่ใจว่าเราไม่ใช่ทีมเดียวที่ต้องดิ้นรนกับปัญหานี้และฉันก็ตกใจที่พบเนื้อหาในหัวข้อนี้น้อยมาก
ดังนั้นคำถามของฉันมีดังต่อไปนี้:
- คุณมีประสบการณ์ใดบ้างกับซอฟต์แวร์ที่ปรับแต่งได้เองคุณเลือกวิธีการแบบใดและมันทำงานอย่างไรให้คุณ
- คุณแนะนำวิธีใดและทำไม มีแนวทางที่ดีกว่านี้ไหม?
- มีหนังสือหรือบทความดีๆในหัวข้อที่คุณสามารถแนะนำได้หรือไม่?
- คุณมีคำแนะนำเฉพาะสำหรับสภาพแวดล้อมด้านเทคนิคของเรา (.NET, Entity Framework, WPF, DI) หรือไม่
แก้ไข:
ขอบคุณสำหรับคำแนะนำทั้งหมด. ความคิดส่วนใหญ่ตรงกับแนวคิดที่เรามีอยู่ในทีมของเรา แต่มันมีประโยชน์จริง ๆ ที่จะเห็นประสบการณ์ที่คุณมีกับพวกเขาและเคล็ดลับเพื่อนำไปใช้ให้ดีขึ้น
ฉันยังไม่แน่ใจว่าเราจะไปทางไหนและฉันไม่ได้ตัดสินใจ (คนเดียว) แต่ฉันจะผ่านมันไปในทีมของฉันและฉันแน่ใจว่ามันจะเป็นประโยชน์
ในขณะนี้เทเนอร์ดูเหมือนจะเป็นแหล่งเก็บข้อมูลเดียวโดยใช้โมดูลเฉพาะลูกค้าที่หลากหลาย ฉันไม่แน่ใจว่าสถาปัตยกรรมของเราขึ้นอยู่กับสิ่งนี้หรือเราต้องลงทุนเพื่อให้เหมาะสมดังนั้นบางสิ่งบางอย่างอาจอาศัยอยู่ในที่เก็บแยกต่างหากในขณะที่ แต่ฉันคิดว่ามันเป็นทางออกระยะยาวเท่านั้นที่จะทำงาน
ดังนั้นขอขอบคุณอีกครั้งสำหรับคำตอบทั้งหมด!