Tôi có hai ứng dụng, được gọi là A và B. Phiên bản hiện tại của các ứng dụng này là 7.x (một số khách hàng chạy 7.1, một số khác chạy 7.2, ...). Cả hai ứng dụng đều sử dụng cùng một khung chung (hãy gọi C này), như thế này:
+---+ +---+
| A | | B |
+---------+
| C |
+---------+
Vì một số khách hàng mới quan trọng, tôi muốn có chức năng của A và B trong một ứng dụng lớn. Việc hợp nhất A và B vào một ứng dụng là không thể, vì vậy bây giờ tôi đang cố gắng tích hợp chức năng của A vào B. Cho đến nay vẫn tốt, nhưng tôi bắt đầu gặp phải một số vấn đề.
Trước hết, khách hàng chỉ sử dụng chức năng cơ bản của B không quan tâm đến tất cả các chức năng mới của A được thêm vào (và điều này gây ra thêm chi phí cho họ). Họ chỉ muốn nâng cấp phiên bản B của họ với sự hỗ trợ cho các phiên bản Windows mới, ... và có thể cũng muốn tất cả các chức năng hay được thêm vào C (khung chung).
Thứ hai, khách hàng hiện đang sử dụng ứng dụng A, không muốn trực tiếp chuyển sang ứng dụng B, mặc dù chức năng kết hợp của A + B sẽ giúp họ lâu dài. Để nâng cấp dễ dàng, họ muốn gắn bó với A và thậm chí xem một số cải tiến trong C.
Thứ ba, tất cả các phát triển tôi đang làm ở B có thể có tác động đến lớp CEg chung để cải thiện hiệu suất của mô-đun trong B, tôi phải cấu trúc lại một mô-đun trong C, nhưng vì C cũng được sử dụng trong A, Tôi cần phải làm nhiều công việc hơn. Ngoài ra, A là một ứng dụng cũ hơn, ít cấu trúc hơn và mọi thay đổi trong C có thể làm cho A không ổn định hơn.
Câu hỏi là làm thế nào để tiến hành? Tôi hiện đang suy nghĩ về việc tách B trong bản phát hành 7.x (tôi vẫn có thể thực hiện một số phát triển nhỏ ở đây và phát hành 7.3, 7.4 trong những năm tới nếu cần) và bản phát hành 8.x (sẽ chứa tất cả chức năng mới) . Để giải quyết vấn đề của lớp chung, tôi cũng có thể chia C thành C cũ (7.x) và C mới (8.x). Điều này cho kết quả như sau:
+-------+ +-------+ +-------+
| A 7.x | | B 7.x | | B 8.x |
+-----------------+ +-------+
| C 7.x | | C 8.x |
+-----------------+ +-------+
Ứng dụng A sẽ không phát triển nữa và sẽ dính vào phiên bản 7.x của lớp chung C.
Tách C có nghĩa là tất cả các phát triển trong C sẽ không được nhìn thấy trong A và B cũ (vẫn sẽ được phát hành 7.x) hoặc nếu chúng phải được thực hiện trong phiên bản 7.x của A và B, sẽ yêu cầu thực hiện phát triển trong cả hai phiên bản.
Một giải pháp thay thế có thể là tách B thành B 7.x và B 8.x, nhưng điều này sẽ hạn chế khả năng tái cấu trúc trong C, và thực tế chỉ giải quyết được hai vấn đề đầu tiên.
Có ai có bất kỳ kinh nghiệm với một loại thay đổi phát hành lớn như vậy? Còn ý tưởng nào khác không?