Bagaimana saya bisa memperbaiki basis kode sementara yang lain dengan cepat berkomitmen untuk itu?

18

Saya sedang mengerjakan proyek pribadi yang pada akhirnya akan menjadi open source. Kami memiliki beberapa anggota tim, cukup berbakat dengan teknologi untuk membangun aplikasi, tetapi bukan pengembang berdedikasi yang dapat menulis kode bersih / cantik dan yang paling penting dalam jangka panjang.

Saya telah memulai untuk memperbaiki basis kode, tetapi agak sulit karena seseorang dalam tim di negara lain yang saya tidak sering hubungi dapat memperbarui hal yang benar-benar terpisah ini.

Saya tahu satu solusi adalah berkomunikasi dengan cepat atau mengadopsi praktik PM yang lebih baik, tapi kami belum sebesar itu. Saya hanya ingin membersihkan kode dan menggabungkan dengan baik apa yang telah dia perbarui. Apakah menggunakan cabang merupakan rencana yang cocok? Penggabungan usaha terbaik? Sesuatu yang lain

Penyamaran
sumber

Jawaban:

35

Satu hal yang sering gagal dipertimbangkan orang adalah arsitektur yang bersih tidak hanya mempercepat perawatan jangka panjang, tetapi juga mempercepat pengembangan saat ini . Jangan mencoba untuk mengisolasi perubahan Anda dari kolega Anda sampai mereka "selesai." Perubahan Anda akan membantu mereka menjadi lebih produktif dan lebih rentan terhadap bug.

Kesalahan yang paling sering dilakukan orang ketika melakukan refactor besar adalah tidak cukup sering bergabung, alih-alih mencoba melakukannya dalam satu "big bang". Cara yang tepat untuk melakukannya adalah membuat refactor sekecil mungkin yang Anda bisa, mengujinya, kemudian menggabungkannya ke cabang kolega Anda, dan mengajarinya tentang perubahan sehingga ia dapat memasukkannya ke depan. Idealnya Anda melakukan satu penggabungan per hari, atau setidaknya satu per minggu.

Karl Bielefeldt
sumber
17
Ya ya ya. Tahan keinginan untuk melakukan solo tour-de-force selama sebulan hanya untuk menemukan bahwa basis kode yang seharusnya Anda refactor telah berubah sepenuhnya dan Anda harus memulai dari awal lagi. Lebih baik lakukan selangkah demi selangkah.
tdammers
Benar sekali! Refactoring besar tidak menghasilkan apa-apa (lihat Netscape 6 , atau Project Pyramid )
Andomar
8

Anda tidak pernah "tidak cukup besar untuk berkomunikasi". Jika jari Anda dapat melakukan pengetikan, bibir Anda juga dapat berbicara. Pada akhirnya peningkatan teknologi adalah komunikasi 85% dan teknis 15%. Hanya karena Anda lebih suka duduk di sana coding daripada melakukan percakapan yang sulit dengan seseorang ... tidak berarti itu ide yang baik. Komunikasi sebenarnya adalah bagian sulit dari apa yang Anda coba, tetapi jangan hanya menghindarinya.

Michael Durrant
sumber
Ini sebenarnya bukan kesulitan berkomunikasi, itu karena saya tidak ingin pengembang saat ini melambat. Sebenarnya, saya bahkan tidak yakin dia perlu belajar dengan cara yang benar asalkan bisa direactored. Dia bukan programmer pertama, dia seorang ilmuwan di bidang lain.
Incognito
+1. Anda tidak dapat berbagi basis kode dengan seseorang tanpa berkomunikasi
MarkJ
4

Ya, cabang adalah solusi yang bagus untuk ini.

Saya akan menyarankan Anda mulai mengerjakan ini pada cabang dan memastikan itu berlaku bersih di atas arus Anda saat ini HEAD(yaitu, buatlah tes ulang dan penggabungan secara berkala untuk memastikan Anda dapat menerapkan perubahan Anda dengan mudah dan tes Anda masih lulus - - juga mencarigit rerere bantuan dari gitini). Kemudian setelah Anda selesai rebase dan gabungkan perubahan Anda ke dalam HEAD.

Semakin cepat Anda mulai mengerjakan ini semakin baik sejak mengubah arsitektur menjadi semakin banyak pekerjaan semakin dingin kode yang didapat. Juga, mungkin ada banyak contoh kode handcod yang tersebar di seluruh basis kode di mana mis. Fungsi pembantu baru dan shiner Anda mungkin telah membuat segalanya lebih sederhana.

Benjamin Bannier
sumber
1
-1: Tidak. Lihat jawaban @Karl Bielefeldt.
Jim G.
Iya? Saya tidak setuju dengan Karl, itu sebabnya saya membuat poin tentang memulai dengan cepat.
Benjamin Bannier
Dan saya berkata, "Jangan bercabang dan kemudian bergabung kembali". Paling-paling, usaha itu sia-sia. Paling buruk, Anda akan membuat kekacauan besar.
Jim G.
3

Sudahkah Anda mempertimbangkan opsi "Jangan lakukan itu"?

Sementara melakukan pekerjaan ini di cabang terpisah mungkin merupakan pendekatan terbaik, Anda mempersiapkan diri untuk penggabungan besar-besaran yang menyakitkan.

Orang lain mungkin menambahkan banyak fungsi baru, mengubah fungsi yang ada dan mungkin menghapus beberapa fungsi.

Setelah dev utama bekerja sedikit melambat di beberapa titik di masa depan, maka Anda bisa berada dalam posisi yang jauh lebih mudah untuk melakukan refactor.

ozz
sumber
+1. Jika basis kode Anda dalam fluks besar, itu mungkin bukan waktu terbaik untuk mencoba menulis ulang besar. Pilih waktu dalam siklus pengembangan Anda ketika semuanya lebih tenang.
anon
2

tl; dr - Kedengarannya sudah waktunya untuk naik ke liga besar. Menempatkan lipstik pada babi tidak membuatnya lebih cantik, kecuali Anda menyukai hal-hal seperti itu ...

Masalah orang

Masalah pertama adalah sinkronisasi komit. JIKA Anda memiliki banyak orang yang bekerja pada kode yang sama pada saat yang sama Anda hanya perlu satu aturan untuk mencegah masalah:

Rule 1: Always pull before you merge/rebase

Ketika datang ke DVCS, sulit untuk membuat perubahan ke cabang jauh (yaitu repositori utama) dan sangat mudah untuk membuat perubahan ke lokal. Setiap orang bertanggung jawab untuk membuat penambahan kode mereka sendiri sesuai dengan keseluruhan yang lebih besar tanpa masalah. Kecuali 2 orang yang berkomitmen pada saat yang bersamaan, Anda seharusnya tidak mengalaminya. Akses komit ke master asal / jarak jauh harus dibatasi hanya untuk beberapa pengembang dan mereka harus menarik perubahan dari pengembang lain melalui cabang pelacakan jarak jauh.

Masalah kode

Bagaimana Anda tahu bahwa perubahan yang Anda lakukan tidak merusak kode?

Jawaban sederhana ... Tulis tes untuk membuktikan tidak. Jika Anda mengabaikan aliran pemikiran TDD (Test Driven Design), inti dari tes ini adalah untuk menambahkan tingkat verifikasi yang memungkinkan Anda untuk mengubah kode tanpa merusaknya.

Rule 2: Don't make assumptions, write proofs (ie tests).

Selain itu, tes penuh harus dijalankan sebelum Anda mendorong ke master asal / jauh.

Pertahankan komitmen Anda sekecil dan seringkas mungkin. Dengan begitu, jika Anda perlu mundur perubahan yang merusak sesuatu di kemudian hari, Anda akan menghemat dari keharusan mengimplementasikan kembali bagian-bagian yang tidak melanggar kode.

Anda mungkin perlu melakukan restrukturisasi organisasi terlebih dahulu

Jika solusi di atas tidak mudah diterapkan, mungkin ada beberapa masalah dengan struktur pengembangan yang perlu ditangani terlebih dahulu.

Pemilik proyek harus menjadi penjaga gerbang. Jika ada masalah penyelarasan komit, mungkin ada terlalu banyak orang dengan akses komit. Bahkan pada proyek besar seperti kernel Linux, hanya segelintir pengembang yang melakukan akses ke repositori master asli / jauh. Sebenarnya ada beberapa level repositori untuk mengelola komit. Alih-alih model komit lapisan tunggal di mana semua orang mendorong perubahan mereka ke asal, model hierarkis memiliki penjaga gerbang yang menarik perubahan dan memverifikasi kualitas mereka sebelum dimasukkan ke dalam proyek. Model komit hierarkis dapat berskala jauh lebih besar dan lebih efektif daripada model lapisan tunggal tanpa mengorbankan kualitas.

Untuk para pengembang yang tidak mendapatkan akses komit, mereka harus belajar membuat cabang pelacakan jarak jauh mereka sendiri (git dan gitorious bagus untuk ini) sehingga para pengembang yang melakukan telah melakukan akses dapat dengan mudah menarik / mengintegrasikan cabang ke asal. Jika perubahannya kecil, tambalan akan bekerja juga.

Kemampuan untuk melakukan perubahan sebelum melakukan penggabungan / rebase mengasumsikan bahwa Anda tidak berkembang di cabang master lokal Anda. Cara mudah untuk menangani ini adalah dengan melakukan tarikan awal sebelum Anda mulai kode, lalu lakukan semua pekerjaan Anda di cabang itu. Cara yang sulit adalah menaburkannya tepat sebelum menggabungkan dan memutar kembali master.

Tentukan gaya pengkodean untuk keseluruhan proyek dan buat devs mengikutinya. Para dev yang berkontribusi harus menulis kode yang sesuai dengan standar / norma proyek untuk meminimalkan pembersihan. Gaya pengkodean bisa menjadi penghalang ego besar dalam proyek terbuka. Jika tidak ada standar yang ditetapkan, semua orang akan membuat kode dengan gaya pilihan mereka sendiri dan basis kode akan menjadi sangat jelek sangat cepat.

Mitos "The Mythical Man Month"

Percaya atau tidak, proyek open source yang lebih besar / lebih sukses tidak berjalan seperti demokrasi. Mereka dijalankan sebagai hierarki. Menyatakan bahwa proyek tidak dapat tumbuh secara efektif di luar 8-10 pengembang adalah naif. Jika itu benar maka mega proyek seperti Linux Kernel tidak akan ada. Masalah yang lebih dalam adalah bahwa memberikan akses kepada semua orang hanya membuat komunikasi yang efektif terlalu sulit untuk ditangani.

Masalah bulan pria mitos sebenarnya bisa diatasi. Anda hanya perlu menjalankan proyek Anda seperti militer. Ada banyak tingkatan dalam hierarki karena sudah menjadi rahasia umum bahwa individu hanya benar-benar efektif dalam mengelola komunikasi dengan segelintir orang. Selama tidak ada satu orang pun yang bertanggung jawab untuk mengelola pekerjaan lebih dari 5-7 orang, sistem tersebut dapat menskala tanpa batas.

Mungkin membatasi pengembang terbaik / berpengalaman untuk melakukan lebih banyak integrasi dan desain / perencanaan tingkat yang lebih tinggi, tetapi itu bukan hal yang buruk. Bagian dari peningkatan adalah membuat langkah untuk memutuskan bahwa proyek tersebut membutuhkan rencana jangka panjang. Orang-orang di tingkat tertinggi yang memiliki investasi terbesar (waktu juga merupakan sumber daya) dalam proyek di masa depan harus dituntut untuk membuat keputusan besar.

Sangat menyenangkan untuk mendengar tentang proyek open source melalui rasa sakit yang tumbuh. Selamat dan semoga berhasil.

Evan Plaice
sumber
-1

bersih / cantik dan kode terpelihara jangka panjang yang paling penting.

Dalam pengalaman saya bersih / cantik adalah musuh yang bisa dipelihara. Kode cantik sering:

  • Memiliki lapisan pada kerangka yang memperkenalkan tingkat abstraksi yang lebih tinggi
  • Optmizes untuk menggunakan kembali kode, menghasilkan banyak dependensi
  • Mencoba memecahkan masalah generik alih-alih yang spesifik

Di sisi lain, kode yang dapat dipelihara:

  • Ditulis langsung pada framework, sehingga semua pengembang dapat membacanya
  • Mengoptimalkan jumlah dependensi yang rendah, sehingga perubahan di satu area tidak memengaruhi area lainnya
  • Tidak mencoba memecahkan lebih banyak masalah daripada yang seharusnya
Andomar
sumber
Deskripsi kode cantik Anda dapat berjalan beriringan dengan kode yang dapat dipelihara juga karena ketika Anda memperkenalkan tingkat abstraksi yang lebih tinggi dan mengoptimalkan kode Anda untuk digunakan kembali, itulah yang lebih mudah dipertahankan.
Karthik Sreenivasan
Kecuali bahwa abstraksi tidak akan bertahan dalam ujian waktu. Dan setiap masalah dengan abstraksi mengangkat perbaikan lokal ke perbaikan yang berpotensi memiliki dampak di seluruh aplikasi.
Andomar