Dalam artikel ini, penulis menganalisis jumlah waktu yang dihabiskan untuk menulis buku atau kode program, dan sampai pada pola yang menarik. Ini dapat digunakan untuk menjadwalkan pekerjaan proyek.Hukum Hofstadter: Bisnis apa pun selalu bertahan lebih lama dari yang diharapkan, bahkan jika Anda memperhitungkan hukum Hofstadter.
- Douglas Hofstadter, Gรถdel, Asher, Bach
Menulis prosa dan kode memiliki banyak kesamaan. Tetapi kemiripan yang paling mencolok adalah bahwa baik penulis maupun programmer tidak dapat menyelesaikan pekerjaan mereka tepat waktu. Penulis terkenal karena melanggar tenggat waktu. Programmer telah mendapatkan reputasi orang-orang yang hasilnya selalu sangat berbeda dari perhitungan awal. Muncul pertanyaan: mengapa?
Hari ini saya punya ide bagaimana menjawabnya. Dan temuan saya membuat saya takjub.
Mempelajari buku saya
Kedua buku saya,
Halo, startup dan
Terraform: kami meluncurkan dan bekerja , saya menulis di lingkungan pembuatan buku
Atlas , yang menyediakan untuk mengelola semua konten menggunakan Git. Ini berarti bahwa setiap baris teks, setiap pengeditan dan setiap perubahan telah dikomit ke log commit Git.
Mari kita periksa berapa banyak usaha yang dihabiskan untuk menulis dua buku.
Hai startupMari kita mulai dengan buku pertama saya.
Halo startup . Ini memiliki 602 halaman dan sekitar 190 ribu kata. Saya menjalankan
cloc
di repositori
Hello, Startup git dan mendapatkan hasil berikut
(untuk kesederhanaan, bagian pecahan dibuang):

602 halaman berisi 26.571 baris teks. Bagian terbesar ditulis dalam
AsciiDoc , mirip dengan Markdown. Ini digunakan oleh Atlas untuk menulis hampir semua konten. Menggunakan HTML dan CSS, Atlas mendefinisikan tata letak dan struktur buku. Selain mereka, ada bahasa pemrograman lain (Java, Ruby, Python dan tidak hanya), di mana berbagai contoh ditulis untuk topik yang dibahas dalam buku ini.
Tetapi 602 halaman dan 26.571 baris hanyalah hasil akhirnya. Mereka tidak mencerminkan sekitar 10 bulan penulisan, perubahan, pengeditan, pengoreksian, penyesuaian gaya, penelitian, catatan, dan pekerjaan lain yang berkontribusi pada penerbitan buku. Oleh karena itu, untuk mendapatkan ide yang lebih berguna, saya menggunakan
git-quick-stats
untuk menganalisis seluruh log komit buku.

Jadi, saya menambahkan 163.756 baris dan menghapus 131.425, yang secara total memberikan 295.181 baris bahan olahan. Artinya, ternyata saya menulis atau menghapus total 295 181 baris, di mana 26 571 baris tetap sebagai hasilnya. Rasio ini sedikit di atas 10: 1. Untuk mendapatkan setiap baris yang dipublikasikan, saya harus menulis 10 lainnya terlebih dahulu!
Saya akui bahwa menghitung jumlah baris yang ditambahkan dan dihapus dari Git tidak dapat dianggap sebagai metrik yang ideal untuk proses pengeditan. Tetapi, setidaknya, ini memungkinkan kita untuk memahami bahwa perhitungan sederhana tidak cukup untuk mengevaluasi pekerjaan yang dilakukan. Sebagian besar dari proses tidak tercermin sama sekali dalam log komit Git. Misalnya, beberapa bab pertama ditulis dalam Google Documents sebelum saya pindah ke Atlas, dan banyak pengeditan dilakukan di komputer saya tanpa komitmen.
Terlepas dari kenyataan bahwa data ini jauh dari ideal, saya percaya bahwa rasio keseluruhan "bahan teks asli" untuk diterbitkan adalah 10: 1.
Terraform: kami mulai dan bekerjaMari kita periksa apakah proporsi ini berlaku untuk buku kedua saya
Terraform: kami meluncurkan dan bekerja , yang berisi 206 halaman dan sekitar 52 ribu kata.
Output sederhana dari
cloc
:

206 halaman terdiri dari 8410 baris teks. Sekali lagi, sebagian besar teks ditulis dalam AsciiDoc, meskipun buku ini mengandung lebih banyak contoh kode yang ditulis terutama dalam HCL, bahasa utama Terraform. Selain dia, ada banyak penurunan harga yang saya gunakan untuk mendokumentasikan contoh HCL.
Kami akan menggunakan
git-quick-stats
untuk memeriksa riwayat revisi buku ini:

Selama hampir lima bulan, saya menambahkan 32.209 dan menghapus 22.402 baris, total 54.611 baris daur ulang. Keakuratan mengevaluasi proses penyuntingan buku ini semakin menderita, ketika pekerjaan dimulai sebagai
serangkaian posting blog yang melalui revisi nyata sebelum dipindahkan ke Atlas dan Git. Volume posting blog ini mengambil setidaknya setengah dari buku, jadi akan logis untuk meningkatkan tingkat akhir teks yang diproses sebesar 50%. Artinya, itu akan menghasilkan 54611 * 1,5 = 81 916 baris teks yang dapat diedit, menghasilkan total 8410 baris.
Dan lagi, rasio sekitar 10: 1 diamati!
Tidak mengherankan bahwa penulis tidak memenuhi tenggat waktu. Jika jadwal seharusnya menyerahkan buku 250 halaman, maka dalam praktiknya ternyata dalam prosesnya kita akan menulis 2.500 halaman.
Bagaimana dengan pemrograman?
Bagaimana perkembangannya? Saya memutuskan untuk memeriksa beberapa repositori open source git dari berbagai tingkat kematangan: dari beberapa bulan hingga 23 tahun.
terraform-aws-couchbase (2018)terraform-aws-couchbase adalah seperangkat modul untuk menyebarkan dan mengelola Couchbase di AWS, kode sumber yang dibuka pada 2018.
Output sederhana dari
cloc
:

Dan inilah hasil dari memeriksa
git-quick-stats
:

Kami mendapatkan sebanyak 37.693 baris kode kerja, menghasilkan 7481 baris kode akhir dalam rasio 5: 1. Bahkan dalam repositori di bawah 5 bulan, saya harus menulis ulang setiap baris lima kali! Tidaklah mengherankan bahwa mengevaluasi pengembangan perangkat lunak itu rumit: kita bahkan tidak membayangkan bahwa untuk mendapatkan 7,5 ribu baris kode akhir, kita benar-benar harus menulis 35 ribu
Mari kita lihat bagaimana keadaan dengan produk yang lebih tua.
Terratest (2016)Terratest adalah pustaka sumber terbuka yang dibuat pada 2016 untuk menguji kode infrastruktur.
Output sederhana dari
cloc
:

Hasil dari
git-quick-stats
:

Ini adalah 49 126 baris kode yang berfungsi, yang berubah menjadi 6140 baris teks akhir. Untuk repositori dua tahun, rasionya adalah 8: 1. Tapi Terratest masih sangat muda, jadi mari kita lihat repositori yang lebih tua.
Terraform (2014)Terraform adalah pustaka sumber terbuka yang dibuat pada tahun 2014 untuk mengelola infrastruktur menggunakan metode pemrograman.
Output sederhana dari
cloc
:

Hasil dari
git-quick-stats
:

Kami mendapatkan 12.945.966 baris kode, yang menghasilkan 1.371.718 baris dari hasil akhir. Rasio 9: 1. Terraform sudah ada selama hampir 4 tahun, tetapi perpustakaan belum dirilis, sehingga bahkan dengan rasio ini, basis kode belum dapat disebut dewasa. Mari kita melihat lebih jauh ke masa lalu.
Express.js (2010)Express adalah kerangka kerja JavaScript sumber terbuka populer yang dirilis untuk pengembangan web pada 2010.
Output sederhana dari
cloc
:

Hasil dari
git-quick-stats
:

Kami mendapatkan 224 211 baris kode yang berfungsi, dikurangi menjadi 15 325 baris akhir. Hasil 14: 1. Express berusia sekitar 8 tahun, versi terbarunya adalah nomor 4.x. Ini dianggap sebagai kerangka kerja web yang paling populer dan teruji untuk Node.js.
Tampaknya begitu rasio mencapai level 10: 1, kami dapat dengan yakin mengatakan bahwa basis kode sudah "matang". Mari kita periksa apa yang terjadi jika Anda melangkah lebih jauh ke masa lalu.
jQuery (2006)jQuery adalah pustaka JavaScript open source populer yang dirilis pada tahun 2006.
Output sederhana dari
cloc
:

Hasil dari
git-quick-stats
:

Total 730.146 baris kode kerja, menghasilkan 47.559 baris hasil akhir. Rasio 15: 1 untuk repositori berusia hampir dua belas tahun.
Mari kita lanjutkan sepuluh tahun yang lalu.
MySQL (1995)MySQL adalah database relasional open source populer yang dibuat pada tahun 1995.
Output sederhana dari
cloc
:

Hasil dari
git-quick-stats
:

Kami mendapatkan 58 562 999 garis kerja, 3 662 869 baris dari kode final dan rasio 16: 1 untuk repositori berusia hampir dua puluh tiga tahun. Wow! Setiap baris kode MySQL telah ditulis ulang sebanyak 16 kali.
Kesimpulan
Hasil umum untuk buku saya adalah sebagai berikut:
Judul
| Garis kerja
| Garis ringkasan
| Rasio
|
Hai startup
| 295 181
| 26.571
| 11: 1
|
Terraform: Kami mulai dan bekerja
| 81 916
| 8410
| 10: 1
|
Dan di sini adalah tabel ringkasan untuk berbagai proyek pemrograman:
Judul
| Tahun pembuatan
| Garis kerja
| Garis ringkasan
| Rasio
|
terraform-aws-couchbase
| 2018
| 37.693
| 7481
| 5: 1
|
Terratest
| 2016
| 49 126
| 6140
| 8: 1
|
Bentuk Terra
| 2014
| 12 945 966
| 1 371 718
| 9: 1
|
Ekspres
| 2010
| 224 211
| 15 325
| 14: 1
|
jQuery
| 2006
| 730.146
| 47 559
| 15: 1
|
MySQL
| 1995
| 58 562 999
| 3 662 869
| 16: 1
|
Apa arti semua angka-angka ini?
Aturan 10: 1 dalam Prosa dan PemrogramanKarena kumpulan data saya terbatas, saya hanya dapat membuat beberapa kesimpulan awal:
- Rasio "bahan baku" ke "produk akhir" untuk buku adalah sekitar 10: 1. Ingatlah hal ini ketika Anda mendiskusikan dengan editor jadwal untuk mengirimkan materi. Jika Anda perlu menulis buku 300 halaman, maka sebenarnya Anda harus menulis sekitar 3 ribu halaman.
- Aturan serupa dapat disimpulkan untuk perangkat lunak yang matang dan non-sepele: rasio volume kode yang diproses dengan total setidaknya 10: 1. Ingatlah hal ini ketika seorang manajer atau klien meminta Anda untuk memperkirakan biaya waktu. Aplikasi 10 ribu baris akan mengharuskan Anda untuk menulis sekitar 100 ribu baris.
Temuan ini dapat diringkas sebagai
aturan 10: 1 untuk penulisan dan pemrograman :
Menulis perangkat lunak atau teks yang baik mengharuskan setiap baris ditulis ulang rata-rata 10 kali.
Langkah selanjutnya
Tentu saja, baris kode dan baris teks tidak dapat dianggap sebagai ukuran ideal. Tetapi, saya percaya, jika Anda mengumpulkan jumlah data yang cukup, Anda dapat menentukan apakah aturan 10: 1 bersifat universal dan berguna untuk menentukan tenggat waktu penyelesaian proyek.
Beberapa pertanyaan yang ingin saya terima jawabannya:
- Apakah mungkin menggunakan rasio baris kode yang diproses ke baris akhir sebagai metrik cepat untuk mengevaluasi kematangan perangkat lunak tertentu? Sebagai contoh, dapatkah kita mempercayai solusi masalah infrastruktur utama untuk basis data, bahasa pemrograman, atau sistem operasi jika bagi mereka rasio ini telah mencapai setidaknya 10: 1?
- Apakah volume teks yang berfungsi tergantung pada jenis perangkat lunak? Sebagai contoh, Bill Scott menemukan bahwa di Netflix hanya sekitar 10% dari kode antarmuka pengguna hidup hingga satu tahun , dan 90% sisanya saat ini sepenuhnya ditulis ulang. Berapa kecepatan penggantian kode untuk backend, database, utilitas baris perintah, dan jenis program lainnya?
- Berapa persentase kode yang diproses setelah rilis awal? Artinya, berapa persen pekerjaan yang dapat dianggap "dukungan perangkat lunak"?
Jika Anda seorang penulis buku dan dapat melakukan analisis serupa, saya akan senang mengetahui hasil Anda. Dan jika seseorang memiliki waktu untuk mengotomatisasi analisis semacam itu, akan sangat bagus untuk mempelajari hubungan yang ditemukan dalam berbagai proyek sumber terbuka.
Pembaruan 13 AgustusDiskusi posting tentang
Hacker News dan
Reddit r / programming mengungkapkan dua hal menarik lainnya:
- Rupanya, aturan 10: 1 yang serupa berlaku untuk film , jurnalisme, musik, dan fotografi! Siapa yang akan berpikir?
- Pembaca meninggalkan banyak komentar yang mengubah bahkan satu karakter dapat dihitung di Git sebagai memasukkan atau menghapus garis, sehingga indikator 100 ribu baris yang diubah tidak berarti bahwa setiap baris telah mengalami pemrosesan.
Komentar terakhir itu benar, tetapi, seperti yang saya tulis di atas, data saya tidak memperhitungkan jenis perubahan lain:
- Saya tidak membuat komitmen untuk setiap baris terpisah. Saya dapat mengubahnya sepuluh kali, tetapi hanya membuat satu komit.
- Situasi yang dijelaskan dalam paragraf sebelumnya bahkan lebih relevan untuk pemrograman. Selama pengujian kode, saya dapat mengubah satu baris 50 kali, sementara hanya membuat satu komit.
- Banyak siklus pengeditan dan penulisan dilakukan di luar Git (beberapa bab ditulis dalam Google Documents atau Medium, dan pengeditan gaya dibuat dalam PDF).
Saya pikir semua faktor ini mengkompensasi kekhasan akuntansi untuk penyisipan atau penghapusan garis dalam Git. Tentu saja, perkiraan saya mungkin tidak akurat, dan rasio sebenarnya adalah 8: 1 atau 12: 1. Namun secara umum, perbedaannya tidak terlalu besar, dan 10: 1 lebih mudah diingat.
Pembaruan 14 AgustusGithub
Decagon membuat repositori yang disebut
hofs-churn dengan skrip bash untuk dengan mudah menghitung
berapa banyak kode yang telah dikerjakan di repositori Anda. Dia juga menggunakannya untuk menganalisis sejumlah repositori, seperti React.js, Vue, Angular, RxJava dan banyak lainnya, dan hasilnya cukup menarik.
