Я працюю над великим програмним проектом, який дуже налаштований для різних клієнтів у всьому світі. Це означає, що у нас, можливо, 80% код, який є загальним для різних клієнтів, але також багато коду, який повинен змінюватися від одного клієнта до іншого. Раніше ми займалися розробкою в окремих сховищах (SVN), і коли розпочався новий проект (у нас мало, але великих клієнтів), було створено ще одне сховище, засноване на тому, що минулий проект має кращу основу коду для наших потреб. Це працювало в минулому, але ми зіткнулися з кількома проблемами:
- Помилки, які виправлені в одному сховищі, не виправлені в інших сховищах. Це може бути проблемою організації, але мені важко виправити та виправити помилку у 5 різних сховищах, маючи на увазі, що команда, яка підтримує це сховище, може бути в іншій частині світу, і у нас немає їх тестового середовища , не знаю їх розкладу чи вимог, які вони пред'являють ("помилка" в одній країні може бути "функцією" в іншій)
- Особливості та вдосконалення для одного проекту, які також можуть бути корисні для іншого проекту, втрачаються або якщо вони використовуються в іншому проекті часто викликають великі головні болі, зливаючи їх з однієї бази коду в іншу (оскільки обидві гілки могли розроблятися незалежно протягом року ).
- Переробки та покращення коду, зроблені в одній галузі розвитку, або втрачаються, або приносять більше шкоди, ніж користі, якщо вам доведеться об'єднати всі ці зміни між гілками.
Зараз ми обговорюємо, як вирішити ці проблеми, і поки що придумали такі ідеї, як вирішити цю проблему:
Продовжуйте розробку в окремих гілках, але краще організовуйте їх за допомогою центрального сховища, де загальні виправлення помилок об'єднуються у них, і всі проекти регулярно (наприклад, щодня) об'єднують зміни з цього центрального сховища у свої власні. Для цього потрібна величезна дисципліна та багато зусиль для злиття між гілками. Тож я не переконаний, що це спрацює, і ми можемо дотримуватися цієї дисципліни, особливо коли тисне час.
Відмовитися від окремих гілок розробки та мати центральне сховище коду, де живе весь наш код, і робимо наше налаштування, маючи підключаються модулі та параметри конфігурації. Ми вже використовуємо контейнери для введення залежностей для вирішення залежностей у нашому коді, і ми дотримуємося схеми MVVM у більшості нашого коду, щоб чітко відокремити бізнес-логіку від нашого інтерфейсу.
Другий підхід здається більш елегантним, але в нас є багато невирішених проблем. Наприклад: як обробляти зміни / доповнення у вашій моделі / базі даних. Ми використовуємо .NET з Entity Framework, щоб мати чітко набрані сутності. Я не бачу, як ми можемо обробляти властивості, необхідні для одного клієнта, але марні для іншого клієнта, не захаращуючи нашу модель даних. Ми думаємо вирішити це в базі даних, використовуючи супутникові таблиці (маючи окремі таблиці, де живуть наші додаткові стовпці для конкретного об'єкта з відображенням 1: 1 до вихідної сутності), але це лише база даних. Як ви справляєтесь з цим у коді? Наша модель даних живе в центральній бібліотеці, яку ми не змогли б розширити для кожного клієнта, використовуючи такий підхід.
Я впевнений, що ми не єдина команда, яка бореться з цією проблемою, і я шокована тим, що знайшла так мало матеріалів на цю тему.
Тож мої запитання такі:
- Який у вас досвід роботи з високоіндивідуальним програмним забезпеченням, який підхід ви обрали і як це працювало для вас?
- Який підхід ви рекомендуєте і чому? Чи є кращий підхід?
- Чи є якісь хороші книги чи статті на тему, які ви можете порекомендувати?
- Чи є у вас конкретні рекомендації щодо нашого технічного середовища (.NET, Entity Framework, WPF, DI)?
Редагувати:
Дякую за всі пропозиції. Більшість ідей відповідають тим, які ми вже мали у нашій команді, але дуже корисно побачити досвід, який ви мали з ними, та поради щодо їх кращої реалізації.
Я досі не впевнений, яким шляхом ми підемо, і я не приймаю рішення (поодинці), але я передам це в своїй команді і впевнений, що це буде корисно.
На даний момент тенор, здається, є єдиним сховищем, використовуючи різні модулі, визначені клієнтом. Я не впевнений, що наша архітектура відповідає цьому чи скільки ми повинні вкласти, щоб пристосувати її, тому деякі речі можуть деякий час жити в окремих сховищах, але я думаю, що це єдине довгострокове рішення, яке буде працювати.
Тож ще раз дякую за всі відповіді!