Saran model percabangan untuk beberapa klien proyek yang sama

11

Kami memiliki proyek yang sangat besar yang mencakup beberapa aplikasi yang bertindak sebagai basis untuk klien yang berbeda.

Setiap klien memiliki personalisasi produknya sendiri, tonggak sejarah yang berbeda, persyaratan yang berbeda dan seterusnya, dan dengan demikian setiap proyek akan berkembang secara mandiri berdasarkan kebutuhannya sendiri.

Inti dari proyek, adalah serupa (tetapi tidak sama) di setiap proyek dan organisasi dibuat sehingga ada tim yang menangani setiap klien secara mandiri (tetapi dengan komunikasi di antara mereka sesuai kebutuhan). Sejauh ini, saya belum dapat menemukan skema yang sesuai dengan kebutuhan kita, baik dengan mencari di internet atau mencari ide cemerlang :)

Sejauh ini, kami telah bekerja dengan mendapatkan produk sesuai kebutuhan semua, dengan cabang khusus untuk perubahan yang diperlukan tetapi, meskipun produk memiliki arsitektur yang baik, perlahan-lahan menjadi masalah besar. Berikut adalah masalah utama yang kita hadapi:

  • Tonggak yang berbeda untuk setiap klien: Yang berarti setiap tim harus menghasilkan versi sebagai waktu yang berbeda tanpa komitmen lainnya yang mempengaruhi stabilitas atau produk mereka.
  • Persyaratan yang berbeda, yang mungkin atau mungkin tidak mempengaruhi inti sistem dalam beberapa kasus.
  • Tim besar (20+ anggota tim)
  • Menangani bug dalam sistem: Apa yang Anda lakukan jika tim menemukan bug dalam proyeknya yang mungkin memengaruhi klien lain?

Catatan: Kita berbicara tentang proyek yang memiliki 10 + M LOC.

Catatan: Kami menggunakan Sistem Foundation Team, Visual Studio 2008 dan C # (terutama).

Adakah saran, sumber, atau ide tentang cara mengatasi situasi ini? Apakah ada model di pasar yang memiliki masalah serupa?

Jorge Córdoba
sumber

Jawaban:

9

Sebenarnya, saya akan menyarankan bahwa Anda tidak memerlukan model percabangan, melainkan pendekatan komprehensif lengkap untuk menangani kendala multi-dimensi yang berkaitan dengan sistem tanpa bercabang. Dalam praktiknya, saya percaya akan selalu menjadi masalah untuk mempertahankan beberapa sistem yang memiliki beberapa kesamaan tetapi akan berkembang secara berbeda di cabang-cabang, jadi lebih baik mengubah segala sesuatu menjadi satu sistem yang akan berkembang secara keseluruhan, tetapi terdiri dari konfigurasi yang berbeda. Ini mungkin tampak terlalu sederhana, tetapi ada penelitian yang luas di bidang ini, dengan banyak aplikasi industri yang sukses.

Nama untuk pendekatan ini adalah Lini Produk Perangkat Lunak atau kadang-kadang Rekayasa Lini Produk . Dari halaman Lini Produk Perangkat Lunak CMU SEI :

Lini produk perangkat lunak (SPL) adalah seperangkat sistem intensif peranti lunak yang berbagi serangkaian fitur umum yang dikelola yang memuaskan kebutuhan spesifik segmen pasar atau misi tertentu dan yang dikembangkan dari serangkaian aset inti bersama dengan cara yang ditentukan. .

Gagasan utamanya adalah bahwa setiap persyaratan, setiap tonggak, setiap fitur (istilah kunci dalam domain ini) adalah bagian dari sistem lengkap di tingkat tertinggi. Sistem aktual yang digunakan di berbagai pelanggan pada dasarnya adalah kumpulan fitur. Namun setiap fitur bukan hanya komponen fisik yang dihaluskan ke dalam sistem, itu didefinisikan sebagai tergantung pada atau diaktifkan oleh fitur lain (sehingga dengan memilih fitur, Anda dapat secara otomatis menyertakan dependensinya, dll.)

Daripada mempertahankan semua cabang ini, Anda akhirnya memelihara satu sistem bersama dengan satu set konfigurasi khusus pelanggan.

Mungkin sulit atau bahkan tidak mungkin dalam praktiknya untuk bermigrasi ke suatu pendekatan dengan sistem yang sangat besar, tetapi bahkan kemudian akan berguna untuk menyelidiki pendekatan yang digunakan dalam SPL untuk menilai pendekatan apa yang paling tidak ada (sebagian) terintegrasi dalam pekerjaan Anda.

Beberapa tautan bermanfaat tambahan:

Deckard
sumber
11

Ketika saya mulai pada pekerjaan pertama saya, saya bekerja pada proyek yang sama (tetapi dengan skala yang lebih kecil) dan kami menghadapi masalah yang sama. Kami juga mulai dengan persyaratan penanganan solusi umum untuk semua klien, tetapi itu hanya mungkin pada titik yang sama di mana persyaratan menjadi saling bertentangan. Kami melakukan apa yang Anda sarankan dan mulai versi terpisah untuk setiap klien. Bahkan ini menyelesaikan masalah dengan persyaratan dan penyesuaian itu menjadi mimpi buruk pemeliharaan untuk menyelesaikan bug dan perubahan global.

Karena kode dalam aplikasi hanya mirip, menggabungkan perubahan dari satu versi pelanggan ke versi yang lain sangat kompleks dan diperlukan pengujian ulang setiap versi secara terpisah (kami tidak memiliki tes otomatis!). Seringkali menyebabkan bug regresi dalam versi yang berbeda. Dalam skenario Anda, ini bisa lebih buruk karena satu tim akan menyelesaikan bug dalam versi mereka dan tim lain harus menggabungkan perubahan itu dari versi yang tidak sepenuhnya mereka pahami (kami adalah satu tim yang mengerjakan semua versi).

Kecuali Anda memiliki inti global bersama, Anda akan memiliki masalah yang sama. Sebelum saya meninggalkan perusahaan, kami menemukan bahwa pendekatan kami salah. Untuk mendukung skenario pengembangan tersebut, kami membutuhkan inti yang dapat diperluas yang diperluas dan model data yang akan dapat dikonfigurasi dari lapisan aplikasi yang dapat disesuaikan. Inti ini harus digunakan sebagai dasar untuk setiap kustomisasi khusus pelanggan dan dikelola oleh tim terpisah. Ini akan mencakup beberapa komplikasi manajemen karena beberapa manajer proyek akan membutuhkan sumber daya dari tim yang sama tetapi itu adalah satu-satunya cara untuk membuat arsitektur konsisten, mengendalikan seluruh proses dan menjaga versi tetap sinkron.

Ladislav Mrnka
sumber
2

Saya mungkin cara dasar, tetapi saya pikir apa yang Anda hadapi dengan inti sistem Anda adalah masalah yang sama yang dihadapi semua orang yang menggunakan komponen dan kebutuhan untuk mempertahankan dan mendukung rilis yang berbeda dari perangkat lunak mereka dan rilis yang berbeda itu masing-masing memerlukan set yang berbeda versi komponen.

Sebagai contoh

  • rilis 1.0 membutuhkan Library A 1.0, Library B 2.0, Library C 5.6
  • rilis 2.0 membutuhkan Library A 1.0, Library B 3.7, Library C 5.7
  • rilis 3.0 membutuhkan Library A 1.2, Library B 3.7, Library C 5.8

Cara kami memecahkan masalah komponen adalah dengan memiliki semua versi perpustakaan di sistem kontrol versi kami (kami membangunnya berdasarkan sumber) dan membuat setiap proyek menggunakan versi perpustakaan yang tepat dengan mengubah jalur pencarian mereka (jalur referensi?).

Dalam Delphi ini mudah dilakukan melalui file konfigurasi proyek (di bawah kendali sumber) jika Anda tidak memerlukan perpustakaan pada waktu desain, jika tidak masih bisa dilakukan tetapi menjadi sedikit lebih menyebalkan karena Anda perlu mengganti IDE Delphi untuk menggunakan versi yang benar juga (pendaftaran (.reg) file di bawah kontrol versi dapat datang ke penyelamatan di sini).

Solusi untuk sistem inti Anda mungkin memperlakukannya sebagai pustaka tempat Anda mempertahankan versi yang berbeda. Yang intinya berarti Anda perlu mengatur cabang yang berbeda untuk setiap versi. Aplikasi klien kemudian dapat menggunakan "versi" yang tepat dari sistem inti Anda dengan merujuk folder cabang sistem inti yang tepat.

Di mana dependensi untuk sistem inti Anda kemudian akan menyerupai contoh di atas, dependensi untuk aplikasi klien Anda kemudian "hanya" memiliki referensi tambahan: versi sistem inti Anda.

Keuntungan tambahan dengan beberapa aplikasi klien di sini adalah Anda dapat memilih kapan mulai menggunakan versi spesifik sistem inti Anda dan bahwa Anda tidak terpengaruh oleh perubahan pada sistem inti yang belum siap digunakan untuk aplikasi klien tertentu.

Marjan Venema
sumber