Saya akan menawarkan sedikit berbeda dalam hal ini. Pustaka inti, dalam banyak kasus, adalah ide bagus!
Jika Anda memiliki dua proyek terpisah, mereka harus berada dalam dua repositori kode terpisah. Sekarang mereka bergantung pada fungsi umum. Mari kita pertimbangkan misalnya aplikasi pemrosesan paket. Fungsi umum dapat mencakup:
- Pengalokasi memori
- Protokol resolusi alamat
- Pohon AVL
- Kode serialisasi untuk protokol biner
- Array dinamis
- Daftar hash gaya kernel Linux dengan head yang terhubung sendiri dan node tengah yang terhubung ganda
- Meja hash
- Kode pemrosesan tajuk TCP / IP
- Daftar tertaut biasa dengan kepala tertaut ganda dan simpul tengah tertaut ganda
- Perpustakaan logging
- Lain-lain (percayalah, Anda perlu ini untuk hal-hal kecil dan sepele atau jumlah modul Anda yang berbeda akan sama dengan 100!)
- Pustaka paket capture
- Paket I / O antarmuka perpustakaan
- Struktur data paket
- Memblokir antrian untuk komunikasi antar-thread
- Generator angka acak
- Pohon merah-hitam
- Beberapa jenis implementasi timer
Sekarang, aplikasi pemrosesan paket yang berbeda mungkin memerlukan subset yang berbeda. Haruskah Anda menerapkan satu pustaka inti dengan satu repositori kode sumber, atau haruskah Anda memiliki 18 repositori berbeda untuk masing-masing modul ini? Ingat bahwa modul-modul ini mungkin memiliki inter-dependensi, jadi sebagian besar modul ini mungkin bergantung pada mis. Modul lain-lain.
Saya akan mengklaim bahwa memiliki satu perpustakaan inti adalah pendekatan terbaik. Ini mengurangi overhead dari banyak repositori kode sumber. Ini mengurangi neraka ketergantungan: versi tertentu dari pengalokasi memori mungkin memerlukan versi tertentu dari modul lain-lain. Dan bagaimana jika Anda ingin pengalokasi memori versi 1.7 tergantung pada 2.5 aneka dan AVL tree versi 1.2 tergantung pada aneka 2.6? Anda mungkin tidak dapat menautkan Miscellaneous 2.5 dan Miscellaneous 2.6 secara bersamaan ke program Anda.
Jadi, lanjutkan dan terapkan struktur berikut:
- Repositori perpustakaan inti
- Repositori proyek # 1
- Repositori proyek # 2
- ...
- Repositori #N proyek
Saya telah melihat bahwa beralih ke struktur semacam ini dari struktur:
- Repositori proyek # 1
- Repositori proyek # 2
- ...
- Repositori #N proyek
Telah menyebabkan berkurangnya pemeliharaan dan peningkatan pembagian kode melalui mekanisme non-copypaste.
Saya juga melihat proyek menggunakan struktur berikut:
- Repositori pengalokasi memori
- Repositori protokol resolusi alamat
- Gudang pohon AVL
- Kode serialisasi untuk repositori protokol biner
- Repositori array dinamis
- Daftar hash gaya kernel Linux dengan kepala yang terhubung sendiri dan repositori node tengah yang terhubung ganda
- Repositori tabel hash
- Repositori kode pemrosesan tajuk TCP / IP
- Daftar tertaut biasa dengan kepala tertaut ganda dan repositori simpul tengah tertaut ganda
- Mencatat repositori perpustakaan
- Repositori lain-lain (percayalah, Anda memerlukan ini untuk hal-hal kecil dan sepele atau jumlah modul berbeda Anda akan sebesar 100!)
- Repositori perpustakaan capture paket
- Paket I / O repositori pustaka antarmuka
- Repositori struktur data paket
- Memblokir antrian untuk repositori komunikasi antar utas
- Repositori generator nomor acak
- Repositori pohon merah-hitam
- Beberapa jenis repositori implementasi pengatur waktu
- Repositori proyek # 1
- Repositori proyek # 2
- ...
- Repositori #N proyek
... dan neraka ketergantungan dan proliferasi jumlah repositori telah menjadi masalah nyata.
Sekarang, haruskah Anda menggunakan pustaka sumber terbuka yang ada alih-alih menulis pustaka Anda sendiri? Anda perlu mempertimbangkan:
- Masalah lisensi. Kadang-kadang hanya persyaratan untuk memberikan kredit kepada penulis dalam dokumentasi yang disediakan mungkin terlalu banyak, karena 20 perpustakaan biasanya akan memiliki 20 penulis yang berbeda.
- Dukungan versi sistem operasi yang berbeda
- Ketergantungan perpustakaan tertentu
- Ukuran perpustakaan tertentu: apakah terlalu besar untuk fungsi yang disediakan? Apakah ini menyediakan terlalu banyak fitur?
- Apakah tautan statis mungkin? Apakah penautan dinamis diinginkan?
- Apakah antarmuka perpustakaan itu yang Anda inginkan? Perhatikan bahwa dalam beberapa kasus menulis pembungkus untuk menyediakan antarmuka yang diinginkan mungkin lebih mudah daripada menulis ulang seluruh komponen sendiri.
- ... dan banyak, banyak hal lain yang belum saya sebutkan dalam daftar ini
Saya biasanya menggunakan aturan bahwa semuanya di bawah 1000 baris kode yang tidak memerlukan sesuatu di luar keahlian programmer harus diimplementasikan sendiri. Catatan: 1000 baris termasuk unit test. Jadi saya tentu tidak akan menganjurkan menulis 1000 baris kode sendiri jika diperlukan 10.000 baris tambahan untuk tes unit. Untuk program pemrosesan paket saya, ini berarti satu-satunya komponen eksternal yang saya gunakan adalah:
- Semuanya disediakan oleh distribusi Linux standar, karena begitu banyak baris kode sehingga tidak masuk akal untuk mengimplementasikan kembali Linux. Bagian dari implementasi ulang Linux juga akan melampaui tingkat keahlian saya.
- Bison / fleksibel karena penguraian LALR berada di luar tingkat keahlian saya dan lebih dari 1000 baris kode. Saya tentu bisa menulis parser keturunan rekursif sendiri, tetapi Bison / flex sangat berguna saya melihat mereka sebagai berguna.
- Netmap, karena lebih dari 1000 baris dan di luar tingkat keahlian saya
- Lewati penerapan pengatur waktu berbasis daftar dari DPDK, karena melampaui tingkat keahlian saya meskipun kurang dari 1000 baris kode (meskipun saya memiliki implementasi pengatur waktu alternatif yang tidak menggunakan daftar lompatan)
Beberapa hal yang saya implementasikan sendiri karena sederhana termasuk bahkan hal-hal seperti:
- MurMurHash
- SipHash
- Mersenne Twister
... karena implementasi khusus ini dapat memungkinkan inlining berat, yang mengarah ke peningkatan kinerja.
Saya tidak melakukan kriptografi; jika saya melakukannya, saya akan menambahkan beberapa jenis perpustakaan kripto dalam daftar, karena menulis algoritma kripto Anda sendiri mungkin rentan terhadap serangan waktu cache bahkan jika Anda dapat dengan pengujian unit menyeluruh menunjukkan bahwa mereka kompatibel dengan algoritma resmi.