Saya sedang mengerjakan proyek perangkat lunak besar yang sangat disesuaikan untuk berbagai pelanggan di seluruh dunia. Ini berarti bahwa kami mungkin memiliki kode 80% yang umum di antara berbagai pelanggan, tetapi juga banyak kode yang harus diubah dari satu pelanggan ke pelanggan lainnya. Di masa lalu kami melakukan pengembangan dalam repositori terpisah (SVN) dan ketika sebuah proyek baru dimulai (kami memiliki sedikit, tetapi pelanggan besar) menciptakan repositori lain berdasarkan proyek apa pun yang memiliki basis kode terbaik untuk kebutuhan kita, apa pun proyek masa lalu. Ini telah berhasil di masa lalu, tetapi kami mengalami beberapa masalah:
- Bug yang diperbaiki dalam satu repositori tidak ditambal dalam repositori lain. Ini mungkin masalah organisasi, tapi saya merasa sulit untuk memperbaiki dan menambal bug di 5 repositori yang berbeda, mengingat bahwa tim yang mengelola repositori ini mungkin ada di bagian lain dunia dan kami tidak memiliki lingkungan pengujian mereka , tidak tahu jadwal mereka atau persyaratan apa yang mereka miliki ("bug" di satu negara mungkin merupakan "fitur" di negara lain).
- Fitur dan perbaikan yang dibuat untuk satu proyek, yang mungkin juga berguna untuk proyek lain hilang atau jika mereka digunakan dalam proyek lain sering menyebabkan sakit kepala besar menggabungkan mereka dari satu basis kode ke yang lain (karena kedua cabang mungkin telah dikembangkan secara mandiri selama satu tahun ).
- Perbaikan dan peningkatan kode yang dibuat dalam satu cabang pengembangan hilang atau menyebabkan lebih banyak kerugian daripada manfaat jika Anda harus menggabungkan semua perubahan ini di antara cabang-cabang.
Kami sekarang sedang mendiskusikan bagaimana menyelesaikan masalah ini dan sejauh ini muncul dengan ide-ide berikut tentang bagaimana menyelesaikannya:
Pertahankan pengembangan di cabang-cabang terpisah tetapi kelola lebih baik dengan memiliki repositori pusat tempat perbaikan bug umum digabungkan ke dalam dan mintalah semua proyek menggabungkan perubahan dari repositori pusat ini ke milik mereka sendiri secara teratur (misalnya setiap hari). Ini membutuhkan disiplin besar dan banyak upaya untuk bergabung di antara cabang-cabang. Jadi saya tidak yakin itu akan berhasil dan kita bisa menjaga disiplin ini, terutama ketika tekanan waktu masuk.
Abaikan cabang pengembangan yang terpisah dan miliki repositori kode pusat tempat semua kode kita hidup dan lakukan kustomisasi kita dengan memiliki modul pluggable dan opsi konfigurasi. Kami sudah menggunakan wadah Dependency Injection untuk menyelesaikan dependensi dalam kode kami dan kami mengikuti pola MVVM di sebagian besar kode kami untuk memisahkan logika bisnis dari UI kami.
Pendekatan kedua tampaknya lebih elegan, tetapi kami memiliki banyak masalah yang belum terpecahkan dalam pendekatan ini. Misalnya: bagaimana menangani perubahan / penambahan dalam model / basis data Anda. Kami menggunakan .NET dengan Entity Framework untuk memiliki entitas yang sangat diketik. Saya tidak melihat bagaimana kami dapat menangani properti yang diperlukan untuk satu pelanggan tetapi tidak berguna untuk pelanggan lain tanpa mengacaukan model data kami. Kami berpikir untuk menyelesaikan ini dalam database dengan menggunakan tabel satelit (memiliki tabel terpisah di mana kolom tambahan kami untuk entitas tertentu hidup dengan pemetaan 1: 1 ke entitas asli), tetapi ini hanya database. Bagaimana Anda menangani ini dalam kode? Model data kami tinggal di perpustakaan pusat yang kami tidak akan dapat memperluas untuk setiap pelanggan menggunakan pendekatan ini.
Saya yakin bahwa kami bukan satu-satunya tim yang berjuang dengan masalah ini dan saya terkejut menemukan begitu sedikit materi tentang topik ini.
Jadi pertanyaan saya adalah sebagai berikut:
- Pengalaman apa yang Anda miliki dengan perangkat lunak yang sangat khusus, pendekatan apa yang Anda pilih dan bagaimana cara kerjanya untuk Anda?
- Pendekatan apa yang Anda rekomendasikan dan mengapa? Apakah ada pendekatan yang lebih baik?
- Apakah ada buku atau artikel bagus tentang topik yang dapat Anda rekomendasikan?
- Apakah Anda memiliki rekomendasi khusus untuk lingkungan teknis kami (.NET, Entity Framework, WPF, DI)?
Edit:
Terima kasih atas semua sarannya. Sebagian besar ide cocok dengan yang sudah kami miliki di tim kami, tetapi sangat membantu untuk melihat pengalaman yang Anda miliki dengan mereka dan tips untuk menerapkannya dengan lebih baik.
Saya masih tidak yakin ke arah mana kita akan pergi dan saya tidak membuat keputusan (sendirian), tetapi saya akan meneruskan ini dalam tim saya dan saya yakin itu akan membantu.
Saat ini tenor tampaknya menjadi repositori tunggal menggunakan berbagai modul khusus pelanggan. Saya tidak yakin arsitektur kami mencapai ini atau berapa banyak yang harus kami investasikan untuk membuatnya cocok, jadi beberapa hal mungkin tinggal di repositori terpisah untuk sementara waktu, tetapi saya pikir itu satu-satunya solusi jangka panjang yang akan bekerja.
Jadi, terima kasih sekali lagi untuk semua tanggapan!