전 세계의 다양한 고객을 위해 고도로 맞춤화 된 대형 소프트웨어 프로젝트를 진행하고 있습니다. 이것은 우리가 다양한 고객들 사이에서 공통적 인 80 % 코드를 가질 수 있음을 의미하지만, 한 고객에서 다른 고객으로 변경해야하는 많은 코드도 있습니다. 과거에는 개별 리포지토리 (SVN)에서 개발을 수행했으며 새로운 프로젝트가 시작될 때 (대규모 고객은 많지만 대규모 프로젝트) 우리의 요구에 가장 적합한 코드 기반의 과거 프로젝트를 기반으로 다른 리포지토리를 만들었습니다. 이것은 과거에 효과가 있었지만 몇 가지 문제가 발생했습니다.
- 한 리포지토리에서 수정 된 버그 는 다른 리포지토리에서 패치되지 않습니다. 이것은 조직의 문제 일 수 있지만 5 개의 다른 리포지토리에서 버그를 수정하고 패치하기가 어렵습니다.이 리포지토리를 유지 관리하는 팀은 다른 지역에있을 수 있으며 테스트 환경이 없다는 것을 명심하십시오. 일정이나 요구 사항을 모릅니다 (한 국가의 "버그"는 다른 국가의 "기능"일 수 있음).
- 한 프로젝트를 위해 만들어 졌거나 다른 프로젝트에 유용 할 수있는 기능 및 개선 사항은 다른 프로젝트에서 유용하거나 다른 프로젝트에서 사용되는 경우 종종 한 코드베이스에서 다른 코드베이스로 병합하는 데 큰 두통을 유발합니다 (두 지점이 1 년 동안 독립적으로 개발 되었기 때문에) ).
- 하나의 개발 브랜치에서 수행 된 리팩토링 및 코드 개선 은 브랜치간에 이러한 모든 변경 사항을 병합해야하는 경우 손실되거나 이익보다 더 큰 피해를 야기합니다.
우리는 이제 이러한 문제를 해결하는 방법을 논의하고 있으며 지금까지이 문제를 해결하는 방법에 대한 다음 아이디어를 생각해 냈습니다.
일반적인 버그 수정이 통합 된 중앙 리포지토리를 보유하고 모든 프로젝트가이 중앙 리포지토리의 변경 사항을 정기적으로 (예 : 매일) 병합함으로써 개발을 개별 지점으로 유지 하지만 더 효과적으로 구성 할 수 있습니다. 이를 위해서는 엄청난 훈련과 지점 간 합병에 많은 노력이 필요합니다. 그래서 나는 그것이 효과가있을 것이라고 확신하지 못하며, 특히 시간 압력이 가해질 때이 훈련을 유지할 수 있습니다.
별도의 개발 지점을 포기하고 플러그 가능한 모듈 및 구성 옵션을 통해 모든 코드가있는 중앙 코드 저장소를 사용하고 사용자 지정을 수행하십시오. 우리는 이미 코드의 종속성을 해결하기 위해 Dependency Injection 컨테이너를 사용하고 있으며 대부분의 코드에서 MVVM 패턴을 따라 비즈니스 로직과 UI를 명확하게 분리하고 있습니다.
두 번째 방법은 더 우아해 보이지만이 방법에는 해결되지 않은 많은 문제가 있습니다. 예 : 모델 / 데이터베이스에서 변경 / 추가를 처리하는 방법 Entity Framework와 함께 .NET을 사용하여 강력한 형식의 엔터티를 갖습니다. 데이터 모델을 어지럽히 지 않고 한 고객에게는 필요하지만 다른 고객에게는 쓸모없는 속성을 처리하는 방법을 알 수 없습니다. 우리는 위성 테이블을 사용하여 데이터베이스 에서이 문제를 해결하려고 생각합니다 (특정 엔티티에 대한 추가 열이 원래 엔티티에 1 : 1 매핑되어있는 별도의 테이블이 있음). 이것은 데이터베이스 일뿐입니다. 이것을 코드에서 어떻게 처리합니까? 우리의 데이터 모델은이 방법을 사용하여 각 고객에 대해 확장 할 수없는 중앙 라이브러리에 있습니다.
나는 우리가이 문제로 어려움을 겪고있는 유일한 팀이 아니라고 확신하며 주제에 대한 자료가 거의 없다는 사실에 놀랐습니다.
그래서 내 질문은 다음과 같습니다.
- 고도로 맞춤화 된 소프트웨어에 대한 경험은 무엇이며, 어떤 접근 방식을 선택했으며 어떻게 작동합니까?
- 어떤 접근법을 추천하고 왜 그럴까요? 더 나은 접근 방법이 있습니까?
- 추천 할만한 주제에 관한 좋은 책이나 기사가 있습니까?
- 기술 환경 (.NET, Entity Framework, WPF, DI)에 대한 특정 권장 사항이 있습니까?
편집하다:
모든 제안에 감사드립니다. 대부분의 아이디어는 우리 팀에서 이미 가지고있는 아이디어와 일치하지만 아이디어를 경험 한 경험과 더 나은 구현을위한 팁을 보는 것이 실제로 도움이됩니다.
나는 우리가 어떤 길로 갈지 확신하지 못하고 결정을 내릴 수 없지만 (단독), 나는 이것을 팀에서 전달할 것이며 도움이 될 것이라고 확신합니다.
현재 테너는 다양한 고객 별 모듈을 사용하는 단일 저장소 인 것 같습니다. 아키텍처가 이것에 달려 있는지 또는 확실하게 만들기 위해 얼마나 투자해야하는지 확신하지 못하므로 일부는 별도의 저장소에 잠시 살 수 있지만 그것이 유일한 장기 해결책이라고 생각합니다.
모든 답변에 다시 한번 감사드립니다!