Bagaimana Anda mengelola refactoring dengan basis kode besar dan banyak pengembang?

13

Saya ingin mencegah situasi di mana dua pengembang refactor kode yang sama secara bersamaan tanpa membicarakannya terlebih dahulu, mungkin menggunakan alat semacam, mungkin plug-in Eclipse. Bisakah kamu menolong?

Kami memiliki 4,5 juta baris kode, dan lebih dari 20 tim pengembang di empat benua.

Idealnya saya ingin yang kedua dari pengembang yang disebutkan sebelumnya memperhatikan bahwa orang lain sedang mengerjakan potongan kode yang sama dan berbicara dengan yang pertama sebelum memodifikasi apa pun.

Apakah Anda tahu solusinya?

Roger CS Wernersson
sumber
1
Tidak tahu tentang plug-in Eclipse ... sepertinya lebih seperti pekerjaan untuk sistem kontrol versi.
SL Barth - Reinstate Monica
Mengapa Anda ingin mencegahnya? Apakah itu untuk menghindari komplikasi (bug) atau untuk menghemat waktu pengembang? Solusinya sangat tergantung pada jawaban IMO ini.
KaptajnKold
Mengapa Anda tidak mencoba beberapa SVN, Apache Subversion atau Tortoise svn akan baik-baik saja untuk ini.
1
Mengapa dua puluh tim mengedit sumber yang sama?
Kami memiliki VCS. Kami baru saja berubah dari ClearCase ke Git.
Roger CS Wernersson

Jawaban:

14

Banyak sistem kontrol sumber generasi ke-2 bekerja menggunakan "checkout" yang terhubung yang memberi tahu server bahwa Anda bermaksud memodifikasi file. Contohnya termasuk TFS, SourceGear Vault, dan banyak lainnya. Dengan cara ini, Anda secara teknis dapat memenuhi kebutuhan Anda. Seperti yang Adam Butler tunjukkan, jenis alat ini datang dengan masalah mereka sendiri (tanpa masuk ke perdebatan panjang - dukungan terbatas untuk pekerjaan offline, dan umumnya alur kerja pembangunan yang kontraproduktif).

Saya pasti akan menyarankan semacam pendekatan hierarkis untuk mengalokasikan pekerjaan refactoring. Pengembang dapat secara logis dikelompokkan ke dalam sub-tim, masing-masing bertanggung jawab untuk area spesifik dari kode. Bergantung pada bagaimana Anda ingin menyusun tim, masing-masing dapat memiliki peran "pemimpin" yang bertanggung jawab atas desain tingkat tinggi area tim. Struktur ini harus diketahui oleh pengembang, dan harus menyederhanakan komunikasi untuk refactoring. Saya yakin bahwa pendekatan ini tampaknya terlalu formal dan mundur untuk beberapa, tetapi saya pikir itu sangat disukai untuk memiliki 20+ pengembang menggunakan pendekatan "gratis untuk semua" untuk refactoring sistem yang besar. Beberapa refactor akan dilakukan pada level tinggi (mis. Bagaimana modul X berkomunikasi dengan modul Y), dalam hal ini Anda akan membutuhkan orang yang dapat melakukan panggilan pada tingkat yang sesuai. Tidak semua pengembang dalam tim harus membuat keputusan arsitektur, jadi hierarki hampir dipaksakan dalam hal apa pun, bahkan jika seseorang memilih untuk tidak mengetahuinya.

Jadi pada dasarnya, ada alat untuk memenuhi persyaratan dasar yang Anda ajukan, tetapi tidak ada alat yang akan menggantikan komunikasi yang tepat dan memiliki sejumlah kecil orang yang menggerakkan arsitektur umum proyek Anda.

Daniel B
sumber
Sebagian besar perubahan vertikal; memodifikasi GUI, protokol jaringan, basis data, karya-karya. Kami membutuhkan alat untuk membantu kami mengkomunikasikan refactoring. Kami mencoba memperbarui kode pada setiap check-in untuk meningkatkan keterbacaan dan mengurangi biaya perawatan.
Roger CS Wernersson
@RogerWernersson - Saya mengerti, saya hanya tidak berpikir ada cara yang baik untuk mencapai ini. Itu sebabnya jawaban saya merekomendasikan penataan tim dan tanggung jawab serta budaya perusahaan sehingga langkah kaki diminimalkan. Mencoba melakukan retro-fit checkout bersamaan di atas git akan menyakitkan, dan mungkin memiliki semua kelemahan dari sistem kontrol revisi terpusat. Saya yakin seseorang telah melakukannya, Anda harus dapat menemukan beberapa implementasi spesifik, sekarang Anda telah menyebutkan bahwa Anda menggunakan git.
Daniel B
7
  1. Pastikan pengembang ditugaskan modul tertentu.
  2. Memiliki sistem pelacakan tugas / bug yang melacak setiap perubahan refactoring. Tetapkan setiap masalah hanya untuk satu pengembang
  3. Beberapa sistem kontrol versi memiliki kemampuan untuk mengunci file sehingga hanya satu pengembang yang dapat memiliki hak pembaruan atas file tersebut. Saya belum pernah menggunakan fitur itu tetapi jika pengembang terus-menerus saling melangkah, ini adalah sesuatu yang mungkin ingin Anda pertimbangkan.
  4. Lakukan uji unit sehingga meskipun pengembang bekerja pada file yang sama, Anda tahu perubahannya tidak merusak aplikasi dengan cara apa pun.
  5. Semua hal di atas akan membantu jika refactoring Anda terkandung dalam modul. Namun, jika seseorang melakukan refactoring pada masalah lintas sektoral seperti pencatatan atau keamanan, itu akan memengaruhi banyak file menurut definisi. Itu perlu ditangani dengan hati-hati terutama jika Anda belum memanfaatkan pendekatan sebelumnya.
Sriram
sumber
Saya setuju menggunakan kunci pada prinsipnya, tetapi apa yang harus dilakukan jika alat Anda (misalnya Eclipse) mengubah banyak file secara otomatis melalui refactoring. Haruskah semua file yang diubah dikunci secara otomatis? Jumlah file yang dikunci bisa tumbuh sangat cepat. Haruskah kunci diperoleh secara bertahap? Bagaimana cara menangani deadlock?
Giorgio
Jika Anda mengubah metode tanda tangan dan itu mempengaruhi banyak file, Anda harus mendapatkan kunci pada semua file. Dalam hal, orang lain memiliki kunci, Anda dapat memperoleh kunci secara paksa (svn mengizinkan ini) jika refactoring Anda lebih diprioritaskan.
Sriram
Bisakah ini otomatis (dengan menyimpan prioritas dan menyelesaikan konflik kunci secara otomatis)? Atau setiap pengembang memutuskan apakah refactoring mereka memiliki prioritas lebih tinggi?
Giorgio
Saya kira jika prioritas disimpan dalam aplikasi tugas mgmt dengan api yang layak, Anda bisa mengotomatiskannya. Saya belum pernah mencobanya tetapi saya tidak mengerti mengapa itu tidak mungkin dilakukan.
Sriram
Saya tidak ingin meningkatkan bug untuk setiap refactoring. Pendekatannya adalah membersihkan kode yang Anda ubah. Mengajukan laporan bug untuk setiap file terdengar seperti terlalu banyak pekerjaan.
Roger CS Wernersson
6

Ada / ada sistem kontrol versi yang membuat kode checkout pengembang sebelum mereka dapat mengedit tetapi ini memiliki masalah sendiri. Praktik yang lebih baik adalah membuat pengembang sering berkomitmen dan memperbarui. Satu pengembang kemudian dapat menandai kelas sebagai didepresiasi dan berkomitmen kemudian jika pengembang lain memperbarui sebelum mereka memulai refactor mereka, mereka akan melihat maksudnya.

Adam Butler
sumber
3
+1: Berkomitmen dan memperbarui sering kali juga berarti bahwa perubahan kecil dan mudah dikelola, membuat konflik lebih mudah dikelola.
Bringer128
Berkomitmen sering akan membantu. Sayangnya, saya tidak bisa mengubahnya. Saya mencari alat untuk membantu kami berkomunikasi.
Roger CS Wernersson
3

Teknologi tidak bisa menyelesaikan masalah sosial. Anda perlu membuat pengembang Anda berbicara satu sama lain dan mengoordinasikan pekerjaan mereka. Dengan 20 tim, beberapa struktur dan aturan akan sangat penting. Anda akan ingin mendukung mereka dengan solusi teknologi, tetapi orang-orang yang diutamakan.

quant_dev
sumber
3
Dia berbicara tentang 20 tim, bukan tim 20.
Ingo
1
+1 untuk teknologi tidak dapat menyelesaikan masalah sosial. Tetapi lakukan edit jawaban untuk mengatakan "Dengan 20 tim, beberapa struktur dan aturan akan sangat penting"
MarkJ
Beberapa orang tidur sementara yang lain bekerja. Kami memiliki tim di empat benua.
Roger CS Wernersson
0

Jika Anda pergi notice that someone else is working on the same piece of code and talk to the first one before modifying anything, sesuai apa yang Anda katakan, Anda memerlukan sistem kontrol versi (CVS / SVN / GIT). Saya tidak yakin, tetapi jika Anda ingin memasukkan itu juga, Anda akan memerlukan beberapa hal lanjut (semacam mekanisme pemicu / beberapa hal khusus mungkin).

c0da
sumber
Kami punya Git. Sebelum itu kami memiliki ClearCase. VCS bukanlah solusi. Kami membutuhkan mekanisme pemicu.
Roger CS Wernersson
0

Pengembang mengunci file di kontrol sumber harus menyelesaikan masalah Anda dengan mudah, tapi kemudian saya pikir Anda mungkin memiliki masalah yang lebih besar.

4,5 Juta LOC's adalah kotak pasir besar untuk dimainkan sehingga dalam solusi yang dirancang dan dirancang dengan baik Anda seharusnya jarang mengalami situasi di mana beberapa tim pengembang saling menginjak kaki masing-masing. Fakta bahwa ini terjadi lebih dari kebetulan adalah menceritakan beberapa cacat desain potensial serius yang harus dilihat.

maple_shaft
sumber
Sebagian besar perubahan bersifat vertikal; GUI, protokol jaringan, basis data. Setiap tim gesit dan fokus dalam memberikan nilai pelanggan di setiap sprint. Kami tidak dapat memiliki satu tim di basis data, satu di GUI, dll. Akan lebih mudah jika kodenya lebih bersih. Tetapi jalan menuju kode bersih dieja "banyak refactoring kecil".
Roger CS Wernersson
0

Beberapa hal:

  1. Pisahkan modul untuk dikerjakan
  2. Berbicara tentang perubahan sebelum dibuat [dengan semua devs]
  3. Pengujian unit [untuk verifikasi dan menghindari melanggar hal-hal terkait]
  4. Seperti yang lainnya disebutkan VCS
biksu
sumber
1. keras ketika masing-masing tim bekerja secara vertikal 2. keras karena beberapa tim tidur sementara yang lain bekerja 3. tidak mengatasi masalah 4. Di mana di Git sekarang, sebelumnya di ClearCase.
Roger CS Wernersson