Bagaimana cara tim mencegah penulisan ulang di file sumber? [Tutup]

26

Terlintas dalam benak saya kemungkinan bahwa sementara, misalnya mesin gim, sedang dikerjakan secara simultan oleh banyak orang bagaimana mencegah penulisan ulang?

Katakanlah pengembang satu sedang bekerja Audio.cppdan pengembang dua juga bekerja Audio.cpp, bagaimana ini umumnya dikelola dalam tim besar untuk memerangi penimpaan? (Dengan kata lain untuk menghentikan pengembang dua dari membuka file sampai pengembang satu selesai)

Ethan Webster
sumber
84
Salah satu tag yang Anda pilih sudah menjadi jawabannya.
Philipp
18
Bahkan, 3 dari 4 tag jawaban, tapi satu yang jawabannya.
MSalters
1
Terkait: gamedev.stackexchange.com/q/480
moooeeeep

Jawaban:

69

Sebagian besar tim pengembangan perangkat lunak (tidak hanya dalam pengembangan game) menyelesaikan masalah ini menggunakan perangkat lunak kontrol versi . Contohnya adalah

Semua alat ini memiliki beberapa perbedaan, tetapi alur kerja dasarnya biasanya seperti ini: Ada satu repositori pusat untuk proyek dengan basis kode lengkap. Ketika seorang pengembang ingin bergabung dengan proyek, mereka melakukan "checkout". Perangkat lunak kontrol versi menyalin basis kode ke mesin lokal mereka. Perangkat lunak mengingat versi saat ini ("revisi") dari basis kode. Ketika seorang pengembang membuat perubahan dan ingin menempatkannya di repositori utama, mereka melakukan "komit". Perubahannya diunggah ke repositori pusat, dan nomor revisi baru dibuat.

Ketika pengembang lain sekarang ingin melakukan perubahan mereka tetapi revisi yang pernah mereka periksa tidak lagi yang terbaru, sistem kontrol versi tidak akan membiarkannya. Pengembang pertama-tama perlu "menarik" revisi yang terjadi sementara itu. Ini memperbarui salinan lokal mereka ke versi terbaru di repositori pusat. Ketika ada konflik (revisi menengah membuat perubahan pada file yang juga mereka ubah), perangkat lunak mungkin meminta mereka untuk menyelesaikan konflik dengan mengedit file yang bertentangan secara manual ("gabungan") jika tidak berhasil melakukannya secara otomatis. Setelah mereka melakukan itu, mereka dapat melakukan perubahan sebagai revisi baru.

Philipp
sumber
18
Perhatikan bahwa Git dan Mercurial adalah sistem kontrol versi terdistribusi , yang bekerja sedikit berbeda: mereka tidak memerlukan repositori pusat tunggal, tetapi secara teoritis memungkinkan setiap pengembang untuk menarik pembaruan langsung dari orang lain. Tentu saja, dalam praktiknya, masih umum untuk memiliki satu repositori (sering berlokasi di host publik seperti GitHub) mendeklarasikan "resmi", dan menggunakan repositori kurang lebih seperti pusat dalam sistem kontrol versi yang tidak didistribusikan.
Ilmari Karonen
18
Jawaban ini juga menyiratkan bahwa penggabungan selalu dilakukan secara manual. Namun sebagian besar waktu, perangkat lunak kontrol versi dapat menggabungkan perbedaan secara otomatis, dan hanya memerlukan pekerjaan manual untuk perubahan yang sangat sulit.
jhocking
Harap hindari diskusi panjang dalam komentar, kawan. Ini bukan forum diskusi. Gunakan Obrolan Pengembangan Game jika Anda ingin melakukannya. Saya telah membersihkan beberapa utas komentar tangensial.
Josh
Juga, idealnya setiap anggota tim akan bertanggung jawab atas modul spesifik hampir secara eksklusif, dan hanya dalam kasus yang jarang terjadi lebih dari satu orang akan memodifikasi file sumber yang sama dalam waktu singkat, karena alur kerja ini meminimalkan kebutuhan untuk menggabungkan perubahan yang bertentangan. Namun itu tidak selalu terjadi.
Nicolas Miari
13

Pengembang tidak menggunakan file yang sama .

Setiap pengembang memiliki versi file sendiri, dan mereka menggunakan jenis perangkat lunak khusus untuk mengelola pekerjaan mereka. Jika mereka berdua melakukan perubahan, yang mencoba menimpa perubahan yang dilakukan oleh pengembang lain akan menemui konflik yang harus diselesaikan, jika tidak, perangkat lunak yang saya bicarakan mulai mengeluh. Dengan kata lain, pengembang yang menyebabkan konflik, perlu menggabungkan pekerjaan mereka dengan pekerjaan pengembang lain, dan hanya dengan demikian file tersebut dapat "disimpan".

Ini adalah penjelasan sederhana untuk bagian dari konsep kontrol versi yang tidak terlalu sederhana .


sumber
6
Mereka juga melakukan hal baru yang disebut berkomunikasi dan perangkat lunak ini tidak ditulis dalam ruang hampa. Jadi jika mereka tidak memahami konflik, mereka berbicara dengan orang lain atau berkoordinasi sebelumnya.
Brian
9

Selain poin yang diajukan dalam jawaban lain tentang kontrol versi dan penanganan konflik dengan penggabungan, ada setidaknya dua cara lain yang anggota tim dapat hindari menimpa pekerjaan masing-masing:

  • Beberapa sistem kontrol versi (misalnya SVN) memungkinkan penguncian file. Ini berarti bahwa satu anggota tim dapat mengambil kepemilikan eksklusif atas suatu file untuk jangka waktu yang lama, mencegah anggota tim lainnya dari melakukan pengeditan yang bertentangan (atau, benar-benar, setiap pengeditan) sampai file tersebut kemudian dibuka.

    Namun, ini umumnya jarang digunakan, karena dapat menyebabkan sejumlah masalah. Ini dapat mengurangi produktivitas (dengan membatasi siapa yang dapat mengerjakan file pada waktu tertentu), dan dapat menyebabkan masalah jika seseorang lupa membuka kunci file. Juga, setidaknya untuk SVN (saya tidak yakin tentang VCS lainnya), mengunci file tidak mencegah orang lain membuat perubahan pada copy pekerjaan mereka, itu hanya mencegah mereka melakukan perubahan - ini dapat mengakibatkan usaha yang sia-sia jika pengembang memodifikasi file hanya untuk menemukan mereka tidak dapat melakukan perubahan karena terkunci.

  • Tim dapat mencoba untuk menetapkan tugas kepada pengembang sedemikian rupa sehingga mereka tidak memiliki lebih dari satu orang yang mengerjakan file tertentu pada waktu tertentu. Misalnya, masing-masing pengembang dapat bertanggung jawab atas bagian tertentu dari proyek (misalnya rendering 3D, jaringan, audio, dll) - jika basis kode dimodulasi dengan baik, maka pengembang yang ditugaskan ke kode jaringan harus memiliki sedikit kebutuhan untuk menyentuh file. berurusan dengan audio.

    Tentu saja, akan selalu ada beberapa tumpang tindih yang harus dikelola dengan cara lain.

Mac
sumber
2
Di sisi positifnya, penguncian adalah satu-satunya cara Anda dapat mengedit .JPEG atau file non-teks biasa. Ini bukan batasan teoretis, hanya saja alat penggabung biasanya menyedot.
MSalters
2
@ MSalters Bukan karena alat menghisap, hanya saja sebagian besar alat gabungan dibuat untuk teks, bukan untuk data biner. Dan bagaimana Anda menyelesaikan konflik jika dua perubahan memodifikasi piksel yang sama dalam sebuah file? Atau bahkan lebih buruk, bagaimana Anda memfaktorkan perubahan yang disebabkan oleh kompresi JPEG? Ini adalah masalah yang sangat kompleks yang bahkan mungkin tidak memiliki solusi tunggal yang baik, jadi alasan sebagian besar alat penggabungan tidak mendukung adalah karena kebutuhan untuk itu sangat jarang dan fungsionalitasnya sulit untuk diimplementasikan.
Maurycy
3
@ MaurycyZarzycki: Mengubah huruf yang sama mirip dengan mengubah piksel yang sama: yang membutuhkan penyelesaian manual. JPEG mungkin adalah contoh yang buruk, sekarang saya sadar, karena seniman tidak bekerja pada format lossy. Tetapi masalah penggabungan juga ada dengan .PNG. Paling tidak, Anda akan menghargai jika menggabungkan alat akan dapat menggabungkan XML tanpa merusaknya.
MSalters
@ MSalters Tentu, dengan itu saya bisa setuju lebih banyak.
Maurycy
1
@xorsyst: Coba dengan cara ini: periksa dari SVN di dua lokasi. Kemudian kunci file dari lokasi 1. Lokasi 2 tidak akan tahu file terkunci hingga komit atau diperbarui.
Zan Lynx