Tôi đang làm việc trong một dự án phần mềm lớn được tùy biến cao cho nhiều khách hàng khác nhau trên toàn thế giới. Điều này có nghĩa là chúng tôi có thể có 80% mã phổ biến giữa các khách hàng khác nhau, nhưng cũng có rất nhiều mã phải thay đổi từ khách hàng này sang khách hàng khác. Trước đây, chúng tôi đã phát triển các kho lưu trữ riêng biệt (SVN) và khi một dự án mới bắt đầu (chúng tôi có ít, nhưng khách hàng lớn) đã tạo một kho lưu trữ khác dựa trên bất kỳ dự án nào trong quá khứ có cơ sở mã tốt nhất cho nhu cầu của chúng tôi. Điều này đã hoạt động trong quá khứ, nhưng chúng tôi gặp phải một số vấn đề:
- Lỗi được cố định trong một kho lưu trữ không được vá trong các kho khác. Đây có thể là một vấn đề của tổ chức, nhưng tôi cảm thấy khó khắc phục và vá một lỗi trong 5 kho lưu trữ khác nhau, hãy nhớ rằng nhóm duy trì kho lưu trữ này có thể ở một nơi khác trên thế giới và chúng tôi không có môi trường thử nghiệm của họ , không biết lịch trình của họ hoặc những yêu cầu họ có ("lỗi" ở một quốc gia có thể là "tính năng" ở một quốc gia khác).
- Các tính năng và cải tiến được tạo cho một dự án, cũng có thể hữu ích cho một dự án khác bị mất hoặc nếu chúng được sử dụng trong dự án khác thường gây ra những cơn đau đầu lớn khi hợp nhất chúng từ cơ sở mã này sang cơ sở mã khác (vì cả hai chi nhánh có thể được phát triển độc lập trong một năm ).
- Tái cấu trúc và cải tiến mã được thực hiện trong một nhánh phát triển hoặc bị mất hoặc gây hại nhiều hơn là tốt nếu bạn phải hợp nhất tất cả các thay đổi này giữa các nhánh.
Bây giờ chúng tôi đang thảo luận về cách giải quyết những vấn đề này và cho đến nay đã nảy ra những ý tưởng sau đây về cách giải quyết vấn đề này:
Giữ sự phát triển trong các nhánh riêng biệt nhưng tổ chức tốt hơn bằng cách có một kho lưu trữ trung tâm nơi các sửa lỗi chung được hợp nhất và có tất cả các dự án hợp nhất các thay đổi từ kho lưu trữ trung tâm này thành cơ sở thường xuyên (ví dụ hàng ngày). Điều này đòi hỏi kỷ luật rất lớn và rất nhiều nỗ lực để hợp nhất giữa các chi nhánh. Vì vậy, tôi không tin rằng nó sẽ hoạt động và chúng ta có thể giữ kỷ luật này, đặc biệt là khi áp lực thời gian đặt vào.
Từ bỏ các nhánh phát triển riêng biệt và có một kho lưu trữ mã trung tâm nơi tất cả các mã của chúng tôi sống và thực hiện tùy chỉnh của chúng tôi bằng cách có các mô-đun có thể cắm và các tùy chọn cấu hình. Chúng tôi đã sử dụng các thùng chứa Dependency Injection để giải quyết các phụ thuộc trong mã của chúng tôi và chúng tôi đang theo mẫu MVVM trong hầu hết các mã của chúng tôi để tách biệt logic nghiệp vụ khỏi UI của chúng tôi.
Cách tiếp cận thứ hai có vẻ thanh lịch hơn, nhưng chúng ta có nhiều vấn đề chưa được giải quyết trong phương pháp này. Ví dụ: làm thế nào để xử lý các thay đổi / bổ sung trong mô hình / cơ sở dữ liệu của bạn. Chúng tôi đang sử dụng .NET với Entity Framework để có các thực thể gõ mạnh. Tôi không thấy cách chúng tôi có thể xử lý các thuộc tính cần thiết cho một khách hàng nhưng vô dụng đối với một khách hàng khác mà không làm lộn xộn mô hình dữ liệu của chúng tôi. Chúng tôi đang nghĩ đến việc giải quyết vấn đề này trong cơ sở dữ liệu bằng cách sử dụng các bảng vệ tinh (có một bảng riêng trong đó các cột bổ sung của chúng tôi cho một thực thể cụ thể sống với ánh xạ 1: 1 đến thực thể ban đầu), nhưng đây chỉ là cơ sở dữ liệu. Làm thế nào để bạn xử lý này trong mã? Mô hình dữ liệu của chúng tôi sống trong một thư viện trung tâm mà chúng tôi sẽ không thể mở rộng cho mỗi khách hàng sử dụng phương pháp này.
Tôi chắc chắn rằng chúng tôi không phải là nhóm duy nhất đấu tranh với vấn đề này và tôi bị sốc khi tìm thấy quá ít tài liệu về chủ đề này.
Vì vậy, câu hỏi của tôi là như sau:
- Bạn có kinh nghiệm gì với phần mềm tùy biến cao, bạn đã chọn phương pháp nào và cách thức hoạt động cho bạn?
- Cách tiếp cận nào bạn đề nghị và tại sao? Có một cách tiếp cận tốt hơn?
- Có bất kỳ cuốn sách hay bài viết hay về chủ đề mà bạn có thể giới thiệu?
- Bạn có đề xuất cụ thể cho môi trường kỹ thuật của chúng tôi (.NET, Entity Framework, WPF, DI) không?
Chỉnh sửa:
Cảm ơn tất cả những lời đề nghị. Hầu hết các ý tưởng phù hợp với những ý tưởng mà chúng tôi đã có trong nhóm của chúng tôi, nhưng thật sự hữu ích khi thấy trải nghiệm bạn có với chúng và các mẹo để thực hiện chúng tốt hơn.
Tôi vẫn không chắc chắn chúng tôi sẽ đi theo con đường nào và tôi sẽ không đưa ra quyết định (một mình), nhưng tôi sẽ vượt qua điều này trong nhóm của mình và tôi chắc chắn rằng nó sẽ hữu ích.
Tại thời điểm này, kỳ hạn dường như là một kho lưu trữ duy nhất sử dụng các mô-đun cụ thể của khách hàng. Tôi không chắc kiến trúc của chúng tôi phụ thuộc vào điều này hay chúng tôi phải đầu tư bao nhiêu để làm cho nó phù hợp, vì vậy một số thứ có thể sống trong các kho riêng biệt trong một thời gian, nhưng tôi nghĩ đó là giải pháp dài hạn duy nhất sẽ hoạt động.
Vì vậy, cảm ơn một lần nữa cho tất cả các câu trả lời!