Kontrol versi harus berisi kode dan konfigurasi yang diperlukan untuk membangun aplikasi.
Ini berarti:
Barang sementara yang diperkenalkan dalam waktu singkat (waktu yang dibutuhkan untuk menentukan lokasi bug, atau untuk bereksperimen dengan fitur bahasa, misalnya) tidak boleh dalam kontrol versi: simpanlah hingga Anda membutuhkannya itu, maka cukup hapus ketika melakukan komit .
File lokal yang sesuai untuk mesin tertentu dapat disimpan di cabang.
Saya akan menghindari menyimpannya secara lokal, karena terlalu menyakitkan untuk mengulang semua hal ini ketika laptop Anda dicuri atau virus memaksa Anda untuk menginstal ulang OS (dan, omong-omong, Anda menemukan bahwa cadangan terakhir Anda dilakukan dua tahun lalu) .
Di sisi lain, hati-hati dengan struktur file: konfigurasi lokal OK, sampai menjadi luar biasa, dan memaksa Anda untuk membuat perubahan tunggal di setiap file dari setiap 42 pengembang yang berpartisipasi dalam proyek.
Perhatikan peluang untuk menghapus kekhasan di antara mesin-mesin tersebut. Itu mungkin berarti:
Memberikan akses ke server SQL dev untuk mengganti instance lokal pada mesin pengembang,
Menggunakan layanan distribusi paket seperti Pypi atau npm untuk paket publik dan rekanan pribadi mereka untuk paket internal,
Minta anggota tim untuk menginstal versi perangkat lunak yang sama,
Buat pembaruan perangkat lunak setransparan mungkin,
Atau memungkinkan untuk menggunakan OS dan perangkat lunak yang diperlukan pada mesin dalam satu klik (ditambah waktu untuk setiap pengembang untuk menginstal Vim vs Emacs pilihannya, Chrome vs Firefox, dll.)
Begitu:
File proyek. Jalur mungkin perlu diedit untuk mencerminkan tata letak pada PC saat ini.
Mengapa tidak menggunakan tata letak yang sama pada setiap PC? Jalur dalam proyek harus relatif terhadap file proyek, yang berarti bahwa tidak masalah di mana proyek tersebut berada. Versi perangkat lunak dan pustaka lebih baik sama untuk menghindari bug samar yang hanya muncul di beberapa mesin, dan tidak mungkin direproduksi untuk anggota tim lainnya.
Contoh:
Dalam proyek yang dibuat dengan Visual Studio, Anda mungkin menemukan:
File itu sendiri. Jalur menjadi relatif, tidak masalah apakah pada mesin saya, proyek ini terletak di H:\Development\Hello World Project\
sementara anggota tim lainnya memeriksa proyek C:\Work\HelloWorld\
.
Ketergantungan, yaitu perpustakaan pihak ketiga dan in-house. Kedua jenis ini harus ditangani oleh NuGet yang membuat semua diskusi terkait konflik menjadi usang. Jika Anda tidak memiliki versi perpustakaan yang sama dengan yang saya miliki, minta NuGet untuk memperbarui dependensi. Sesederhana itu (ketika itu bekerja dengan baik, yang tidak selalu terjadi).
Perhatikan bahwa sangat penting untuk menjaga perpustakaan tetap di NuGet pribadi juga. Memiliki banyak perpustakaan yang disimpan di folder bersama atau dikirim melalui email di seluruh tim mengarah ke server CI yang anarki dan depresi.
Pengaturan. Sangat penting bahwa tim berbagi pengaturan yang sama. Jika setengah dari tim memutuskan untuk memperlakukan peringatan sebagai kesalahan dan setengah dari tim menjaga peringatan apa adanya, anggota bagian pertama dari tim akan menghabiskan waktu mereka menghilangkan peringatan yang dihasilkan oleh pengembang dari bagian kedua tim.
Pengaturan terkait utilitas. Itu rumit, karena beberapa anggota tim mungkin telah menginstal beberapa utilitas, sementara yang lain belum.
Sangat disarankan untuk menginstal perangkat yang sama. Jika beberapa programmer ingin menggunakan StyleCop, tetapi yang lain tidak, tim tidak akan menyelesaikan pekerjaan. Jika beberapa menggunakan kontrak Kode tetapi yang lain tidak, mereka akan memiliki masalah yang sama.
Makefiles. Misalnya optimasi mungkin perlu dimatikan saat debugging, tetapi tidak untuk server CI.
Simpan beberapa makefile di kontrol versi. Sudah lazim untuk membangun versi debug pada server CI juga dan mendorongnya ke klien yang mengalami bug yang rumit.
Retas buruk kotor. Misalnya mengembalikan 7 di tengah fungsi, untuk menguji sesuatu, tergantung pada fungsinya, dan diduga rusak pada nilai 7.
Saya akan menghindari kode seperti itu di tempat pertama. Untuk menguji sesuatu, gunakan unit test. Jika benar-benar membutuhkan waktu beberapa detik untuk menukar beberapa kode untuk keperluan debugging , maka lakukan, tetapi Anda akan menghapus kode ini dalam beberapa menit saja, jadi tidak perlu melakukan itu.
Saat Anda menggambarkannya, Anda harus menulis tes. Misalnya, jika Anda ingin memastikan bahwa:
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
melempar pengecualian ketika temperature
lebih rendah dari AbsoluteZero
konstan, Anda tidak boleh bermain dengan kode itu sendiri. Sebagai gantinya, buat unit test yang akan:
- dokumentasikan sendiri kode Anda,
- meningkatkan keandalan kode Anda,
- memastikan bahwa pengelola dapat mengandalkan pengujian regresi saat memodifikasi metode di atas,
- melayani pengembang lain dari tim Anda yang mungkin perlu melakukan tes yang sama.