Saya telah membaca catatan Martin Fowler tentang Integrasi Berkelanjutan dan ia mencantumkan sebagai keharusan "Setiap Orang Berkomitmen Untuk Mainline Setiap Hari".
Saya tidak suka melakukan kode kecuali bagian yang saya kerjakan selesai dan dalam praktiknya saya melakukan kode saya setiap tiga hari: satu hari untuk menyelidiki / mereproduksi tugas dan membuat beberapa perubahan awal, hari kedua untuk menyelesaikan perubahan , dan hari ketiga untuk menulis tes dan membersihkannya ^ untuk pengiriman. Saya tidak akan merasa nyaman mengirimkan kode lebih cepat.
Sekarang, saya menarik perubahan dari repositori dan mengintegrasikannya secara lokal biasanya dua kali sehari, tetapi saya tidak sering melakukan itu kecuali saya dapat mengukir sebagian kecil dari pekerjaan.
Pertanyaan: apakah melakukan setiap hari suatu praktik yang baik sehingga saya harus mengubah alur kerja saya untuk mengakomodasinya, atau tidak disarankan?
Sunting: Saya kira saya seharusnya mengklarifikasi bahwa maksud saya "komit" dalam makna CVS tentang itu (alias "push") karena kemungkinan itulah yang dimaksud Fowler pada tahun 2006 ketika ia menulis ini.
^ Urutannya lebih arbitrer dan tergantung pada tugasnya, maksud saya adalah menggambarkan rentang waktu dan kegiatan, bukan urutan yang tepat.
sumber
Jawaban:
Saya tidak setuju dengan aturan ini dan saya setuju dengan apa yang dikatakan Mason Wheeler . Saya ingin menambahkan beberapa ide.
Saya mencoba untuk melakukan setiap kali saya memiliki perubahan yang berarti untuk melakukan: ini bisa beberapa kali sehari jika saya memperbaiki beberapa bug kecil, atau seminggu sekali jika saya bekerja pada perangkat lunak yang lebih besar yang tidak dapat digunakan oleh sisa dari kode dengan cara apa pun yang berarti sampai mencapai kondisi yang konsisten.
Juga, saya menafsirkan komitmen sebagai penerbitan revisi yang bermakna yang menyumbangkan fungsionalitas baru ke basis kode. Saya pikir seseorang harus mencoba untuk membersihkan kode sebelum melakukan sehingga pengembang lain dapat memahami arti dan tujuan perubahan ketika mereka melihat sejarah revisi. Semakin sedikit perubahan yang dilihat pengembang lain dalam riwayat, semakin baik: ketika saya melihat riwayat revisi, saya ingin melihat peningkatan yang menambahkan beberapa fungsi yang berarti; Saya tidak tertarik pada setiap ide kecil yang dimiliki masing-masing pengembang dan ingin mencoba sebelum mereka mencapai solusi.
Selain itu, saya tidak berpikir itu ide yang baik untuk menggunakan server SVN (atau sistem kontrol versi apa pun) sebagai fasilitas cadangan yang snapshot saat ini dari kode tersebut dilakukan (asalkan dikompilasi): Anda dapat menggunakan stik USB atau USB-drive eksternal atau disk jaringan untuk mencerminkan kode Anda saat ini sehingga tidak hilang jika komputer Anda rusak. Kontrol revisi dan cadangan data adalah dua hal yang berbeda. Menerbitkan revisi tidak sama dengan menyimpan snapshot kode Anda.
Akhirnya, saya berpikir bahwa itu seharusnya tidak menjadi masalah untuk dilakukan setiap sekarang dan kemudian (yaitu hanya ketika seseorang benar-benar puas dengan keadaan kode saat ini) dan menghindari penggabungan konflik bukanlah pembenaran yang baik untuk melakukan terlalu sering. Banyak konflik menggabungkan terjadi ketika orang yang berbeda bekerja pada file yang sama pada saat yang sama, yang merupakan praktik buruk (lihat misalnya artikel ini , poin 7). Menggabungkan konflik harus dikurangi dengan memecah proyek menjadi modul dengan antarmuka yang jelas dan ketergantungan sesedikit mungkin, dan dengan mengoordinasikan pekerjaan pengembang sehingga kode yang mereka kerjakan tumpang tindih sesedikit mungkin.
Hanya 2 sen saya.
SUNTING
Alasan lain terhadap komitmen prematur yang muncul di benak saya adalah bahwa versi (sangat) kereta tidak dapat diuji. Jika Anda berkomitmen pada trunk dan tim pengujian Anda menguji setiap hari, mereka mungkin tidak memiliki versi yang dapat diuji selama beberapa jam (atau selama sehari). Bahkan jika Anda tidak mencoba untuk memperbaiki bug dan hanya mengembalikan perubahan Anda, pembangunan kembali dapat memakan waktu beberapa jam. Dengan, katakanlah, lima penguji yang bekerja di tim Anda, Anda telah menyia-nyiakan waktu 5 x 2 = 10 jam karena kurangnya aktivitas. Itu terjadi pada saya sekali jadi saya benar-benar mencoba untuk menghindari komitmen prematur atas nama komit sesegera mungkin .
sumber
Revision control and data backup are two different things
Ya, saya pasti merasakan hal ini.Saya melakukan kode beberapa kali sehari . Setiap kali saya mencapai titik di mana kode tersebut cukup lengkap untuk dikompilasi dan tidak merusak hal-hal lain, itu masuk.
Anda harus mempertimbangkan untuk memecah pekerjaan Anda sehingga Anda dapat dengan aman check-in beberapa kali sehari.
Alasan untuk ini adalah dua:
sumber
Berpegang teguh pada metodologi atau praktik apa pun tanpa memahami alasan di baliknya tidak pernah merupakan ide yang baik. Di situlah pemrograman kargo-kultus berasal.
Karena itu, "Saya harus berkomitmen setiap hari karena Martin Fowler berkata begitu" adalah hal yang bodoh. Dan terkadang itu juga tidak praktis. Jika Anda mengerjakan fitur baru yang rumit, Anda mungkin tidak akan mencapai titik di mana layak untuk dicek sampai Anda telah mengerjakannya selama beberapa hari.
Ini tidak berarti Anda harus memastikan semuanya sempurna sebelum memeriksanya. Itu cara yang baik untuk kehilangan pekerjaan jika terjadi kesalahan. Hal yang benar untuk dilakukan adalah mengembangkan dan menggunakan penilaian yang baik tentang masalah tersebut. Aturan praktis hanya bisa sangat membantu Anda.
sumber
Oded memberi dua alasan penting untuk melakukan kode sesering mungkin. Saya akan menambahkan beberapa lagi:
Saat mengerjakan bagian kode Anda, yang lain mungkin memerlukan beberapa fungsi pada kode itu. Mereka seharusnya tidak menunggu 6 hari untuk mendapatkannya. Dalam hal ini kolega saya biasanya membuat prototipe di bagian kode saya, komit, saya tambahkan tubuh dan komit lagi. Dan ini biasanya dilakukan dalam beberapa jam.
Kode 'umum' adalah untuk semua orang melihat setiap perubahan secepat mungkin. Jika potongan kode yang Anda kerjakan benar-benar terpisah dari pekerjaan orang lain dan Anda tidak akan meminta mereka menunggu, maka disarankan untuk membuat cabang untuk Anda kerjakan, dan kemudian, jika semuanya berhasil, gabungkan menjadi jalur utama.
sumber
Saya sangat percaya dalam melakukan setiap perubahan logis yang layak dijaga. Berkomitmen sering, dan jika kode tidak layak disimpan, kembalikan ke keadaan bersih. Semakin lama Anda menunggu untuk mendorong / mempublikasikan kode Anda kembali, semakin sulit untuk diterapkan, dan semakin banyak masalah yang akan Anda hadapi. Anda juga akan mendapatkan umpan balik tentang kontribusi Anda lebih cepat:
Perubahan kecil jauh lebih mudah untuk dikelola.
Juga, perlu dicatat perbedaan antara sistem kontrol versi yang berbeda. Beberapa, seperti Git (didistribusikan), akan memungkinkan Anda untuk melakukan dan mengendalikan seluruh riwayat Anda secara lokal, hanya mendorong ketika Anda siap untuk menerbitkan. Lainnya, seperti SVN (terpusat), akan menggabungkan dua langkah membuat komitmen kecil sangat tidak efisien.
Jangan lupa bahwa komit Anda pada dasarnya mengubah dokumentasi. Ketika ada yang salah, Anda akan senang memiliki lebih banyak sejarah daripada tidak cukup. Satu komitmen untuk pekerjaan minggu tampaknya tidak berguna bagi saya. Saya baru saja berakhir membaca setiap baris kode berubah daripada ringkasan setiap potongan logis.
sumber
Saya pikir sebagian besar jawaban di sini melewatkan salah satu poin utama dalam pernyataan Martin Fowlers. Ini terkait dengan Integrasi Berkelanjutan . Kode yang tidak dicentang (didorong / dipublikasikan / digabungkan) ke jalur utama tidak diuji.
Ini tidak boleh dibaca sebagai dorongan untuk melakukan kode apa pun yang Anda miliki di mesin lokal Anda kapan pun saatnya meninggalkan kantor. Seperti yang ditunjukkan oleh beberapa orang lain di sini bahwa itu akan menjadi buruk, akan merusak bangunan dan menyebabkan arus utama tidak stabil.
Namun, merupakan dorongan untuk mencoba membuat perubahan Anda dalam langkah-langkah kecil yang dapat diperiksa ke jalur utama tanpa menyebabkan masalah. Ini mendorong evolusi kode alih-alih merobeknya dan menulis ulang.
Sekarang, apa gunanya cara kerja ini?
Tentu saja tidak semua perubahan mendukung pendekatan ini. Seperti yang ditunjukkan orang lain, tidak ada aturan yang mutlak. Namun, untuk perubahan yang diharapkan untuk tetap berada di luar jalur utama untuk waktu yang lama, buat jalur utama alternatif dengan skema integrasi berkelanjutannya sendiri dan ikuti pendekatan yang sama ke arah itu. Dengan VCS yang didistribusikan hari ini, hal itu cukup mudah dilakukan.
sumber
Argumen untuk check-in setiap hari:
Argumen terhadap check-in setiap hari:
Saya tidak percaya ada alasan bagus untuk check in kurang dari setiap hari terlepas dari kemalasan atau kekacauan. Tidak ada yang lebih buruk daripada melihat kode yang berjalan di lingkungan pengembangan tidak cocok dengan kode di cabang pengembangan karena seseorang 'belum selesai' dan karenanya belum masuk.
Saya ingin salah dalam hal ini jadi tolong beri tahu saya argumen yang sah terhadap check-in harian.
sumber
Jika Anda bermaksud "komit" sebagai "bergabung menjadi arus utama", maka Anda seharusnya tidak melakukan itu setiap hari pada proyek perangkat lunak yang dirilis ke pelanggan. Anda harus menggabungkan perubahan yang dilakukan dan diuji, sehingga garis utama selalu berfungsi dan dapat dirilis, dan tidak dalam kondisi rusak dengan fitur setengah jadi.
Namun, kemewahan bekerja dengan kontrol versi terdistribusi hari ini adalah bahwa Anda berdua dapat menjaga garis utama stabil, dan pada saat yang sama melakukan
git/hg/whatever commit
setiap kali Anda merasa ingin mempertahankan keadaan. Saya melakukan ini sekali setiap beberapa jam dan pasti pada akhir setiap hari.Dengan DVCS, Anda dapat mempublikasikan pekerjaan Anda, berkolaborasi dengannya dengan orang lain di tim Anda, dan tetap memperbarui dengan perubahan di cabang jalur utama. Anda dapat melakukan semua ini tanpa mencemari stabilitas kode yang diandalkan oleh pelanggan Anda dan / atau tim lain.
Pada saat Subversion adalah teknologi terbaru dan tidak ada cara untuk memotong dan menggabungkan cabang fitur tanpa rasa sakit yang luar biasa, memiliki garis utama di mana beberapa fitur berbeda dalam konstruksi simultan mungkin merupakan pendekatan terbaik. Tetapi superioritas ini tidak melampaui skala 2010.
sumber
Di Team Foundation Server Anda dapat 'Shelve' yang tidak sama dengan check-in, tetapi hanya membuat cadangan kode Anda sehingga jika mesin Anda mati Anda tidak kehilangan perubahan.
Saya juga melihat rumah perangkat lunak yang memiliki 'garis pengembang' dan 'garis utama'. Pengembang bebas untuk masuk ke jalur pengembang kapan pun mereka anggap cocok dan hanya pemimpin tim yang memiliki akses ke jalur utama sehingga mereka bertanggung jawab untuk menyalin kode dari pengembang ke utama ketika sudah siap produksi.
sumber