Tôi nghĩ rằng đây thực sự là hai câu hỏi trong một - tôi sẽ cố gắng trả lời cả hai.
1) Làm thế nào để chúng tôi giảm mã trùng lặp trong một cơ sở mã.
Nó giúp nhắc nhở bản thân về lợi ích của việc này: nó dẫn đến ít lỗi hơn do logic kinh doanh trùng lặp và cần ít mã hơn. Cách tốt nhất để giảm điều này xảy ra là thông qua giao tiếp - như đã đề cập trong các câu trả lời khác. Tôi hoàn toàn đồng ý với khuyến nghị sử dụng các đánh giá mã với sự cảnh báo thêm rằng bạn nên chia sẻ trách nhiệm xem xét mã như nhau để truyền bá kiến thức đúng cách. Bạn cũng nên sử dụng các bản dựng đứng hàng ngày để các nhà phát triển thường nhận ra khi ai đó đang cố gắng giải quyết vấn đề có mã hữu ích hiện có. Bạn cũng nên xem xét việc ghép mã vì nó làm tăng chia sẻ kiến thức và giúp giữ cho các lập trình viên có kỷ luật.
Tôi cũng khuyên bạn nên để các nhà phát triển của mình càng gần nhau càng tốt, tốt nhất là trong cùng một phòng. Với rất nhiều bảng trắng và không gian chia sẻ. Sau đó gửi chúng ra cho bữa ăn cùng nhau. Càng nhiều nhà phát triển của bạn "liên kết", họ sẽ càng giao tiếp với nhau tốt hơn.
Tôi không đồng ý với khuyến nghị sử dụng wiki hoặc tương tự như mã tài liệu. Bất kể các nhà phát triển có kỷ luật cố gắng trở thành tài liệu sẽ trôi dạt từ mã gốc như thế nào. Một cách tiếp cận hiệu quả hơn sẽ là sử dụng đặc tả bằng các thử nghiệm kiểu mẫu. Các tài liệu này mã theo cách làm cho nó rõ ràng cách sử dụng nó và các thử nghiệm của bạn sẽ thất bại nếu ai đó thay đổi mã mà không thay đổi các ví dụ.
Bạn đã có một cơ sở mã lớn với rất nhiều mã trùng lặp, vì vậy bạn có thể nên làm việc để tái cấu trúc điều này. Có thể khó tìm mã trùng lặp không bị cắt và dán. Vì vậy, thay vì làm điều đó tôi đề nghị bạn phân tích lịch sử thay đổi của bạn. Tìm kiếm các tập tin thường thay đổi cùng một lúc. Điều này có thể sẽ chỉ ra các vấn đề với việc đóng gói nếu nó không chỉ ra mã trùng lặp thực tế và dù sao cũng đáng để làm sạch. Nếu bạn cũng có thể phân tích lịch sử sửa lỗi của mình theo các thay đổi mã của bạn, bạn có thể tìm thấy các điểm nóng cụ thể trong đó các bản sửa lỗi thường là cần thiết. Phân tích các điểm nóng này và có thể bạn sẽ thấy nhiều trong số chúng là do logic kinh doanh trùng lặp mà nhà phát triển chỉ thay đổi ở một nơi không nhận ra rằng nó cần thay đổi hai lần.
2) Làm thế nào chúng ta nên tiếp cận việc tạo các widget, thành phần, thư viện, vv mà sau đó có thể được sử dụng trong các dự án khác .
Trong trường hợp này, bạn không nên cố gắng bọc logic kinh doanh mà chia sẻ mã khung hữu ích. Đây có thể là một sự cân bằng khó khăn vì chi phí tạo và duy trì một bộ các thành phần được chia sẻ có thể khá lớn và có thể khó dự đoán trong trường hợp nào đáng để thực hiện. Cách tiếp cận tôi đề nghị ở đây là một quy tắc đình công ba. Đừng lo lắng về việc viết một đoạn mã tương tự hai lần nhưng khi bạn cần thực hiện lại lần thứ ba, nó sẽ tái cấu trúc thành một thành phần được chia sẻ. Tại thời điểm này, bạn có thể chắc chắn chắc chắn rằng nó sẽ hữu ích và bạn có một ý tưởng tốt về các yêu cầu rộng hơn cho thành phần. Rõ ràng, giao tiếp giữa các nhà phát triển là rất quan trọng ở đây.
Xem xét làm cho càng nhiều nguồn mở thành phần được chia sẻ của bạn càng tốt. Đó không phải là logic kinh doanh nên sẽ không mang lại cho đối thủ của bạn nhiều lợi thế nhưng điều đó có nghĩa là bạn sẽ nhận được thêm người đánh giá và người bảo trì miễn phí.