Mythical man bulan 10 baris per hari pengembang - seberapa dekat pada proyek besar? [Tutup]

129

Semua orang selalu mengatakan bahwa mereka dapat mengalahkan "10 baris per pengembang per hari" dari "Mythical Man Month", dan memulai sebuah proyek, saya biasanya bisa mendapatkan beberapa ratus baris dalam sehari.

Tetapi di perusahaan saya sebelumnya, semua pengembang sangat tajam, tetapi itu adalah proyek besar, lebih dari satu juta baris kode, dengan persyaratan sertifikasi yang sangat berat, dan berinteraksi dengan beberapa juta proyek lini lainnya. Pada titik tertentu, sebagai latihan dengan rasa ingin tahu, saya merencanakan garis kode dalam produk pengiriman dalam grup saya (tidak termasuk alat yang kami kembangkan), dan tentu saja, secara bertahap, ia mencapai sekitar 12 baris penambahan bersih per pengembang per hari. Tidak menghitung perubahan, kode pengujian, atau fakta bahwa pengembang tidak bekerja pada kode proyek aktual setiap hari.

Bagaimana kabar orang lain? Dan persyaratan seperti apa yang Anda hadapi (saya bayangkan itu faktornya)?

Matthias Wandel
sumber
13
harus berupa komunitas wiki.
Malfist
24
Jika "10" berada dalam biner, itu akan lebih dekat dengan tanda.
geofftnz
2
Pertanyaan yang sangat menarik. :)
Emil H
9
Saya menemukan kutipan yang bagus ini, "Mengukur kemajuan pemrograman berdasarkan baris kode seperti mengukur kemajuan pembangunan pesawat terbang berdasarkan beratnya." di situs web ini [tautan] ( devtopics.com/101-great-computer-programming-quotes )
mm24
2
@ Greg Bacon, Bill the Lizard: Saya ingin pertanyaan ini dibuka lagi. Ini mungkin tidak persis sesuai dengan aturan SO, tapi itu pasti menarik pengunjung. (35875 pemirsa sejauh ini)
Skippy Fastol

Jawaban:

46

Saya pikir jumlah baris yang ditambahkan sangat tergantung pada keadaan proyek, tingkat penambahan proyek baru akan jauh lebih tinggi daripada tingkat proyek awal.

Pekerjaannya berbeda antara keduanya - pada proyek besar Anda biasanya menghabiskan sebagian besar waktu mencari hubungan antara bagian-bagian, dan hanya sedikit untuk benar-benar mengubah / menambah. sedangkan dalam proyek baru - Anda kebanyakan menulis ... sampai cukup besar dan nilainya menurun.

Liran Orevi
sumber
Memang. Di awal proyek mengatakan iklan bersih itu jauh lebih besar.
Matthias Wandel
1
Jadi, ini menopang teori untuk membagi proyek besar menjadi banyak bagian independen (mungkin bahkan proyek independen) - untuk decoupling.
sergzach
108

Pada salah satu proyek saya saat ini, dalam beberapa modul, saya bangga telah berkontribusi menghitung garis negatif ke basis kode. Mengidentifikasi bidang kode mana yang mengalami kompleksitas yang tidak perlu dan dapat disederhanakan dengan desain yang lebih bersih dan jelas adalah keterampilan yang berguna.

Tentu saja beberapa masalah pada dasarnya kompleks dan membutuhkan solusi yang kompleks, tetapi pada sebagian besar proyek besar yang persyaratannya tidak jelas atau berubah cenderung memiliki solusi yang terlalu rumit dengan jumlah masalah per baris yang lebih tinggi.

Diberi masalah untuk dipecahkan, saya lebih suka solusi yang mengurangi jumlah baris. Tentu saja, pada awal proyek kecil saya dapat menghasilkan lebih dari sepuluh baris kode per hari, tetapi saya cenderung tidak memikirkan jumlah kode yang saya tulis, hanya apa yang dilakukannya dan seberapa baik kerjanya. Saya tentu tidak akan bertujuan untuk mengalahkan sepuluh baris per hari atau menganggapnya sebagai pencapaian untuk melakukannya.

Charles Bailey
sumber
49
+1 untuk berkontribusi garis negatif. Saya pernah bekerja pada proyek kecil di mana saya menyusutkan jumlah baris dari 15K ke 5K sambil menambahkan fitur baru (dan sangat mengurangi jumlah bug dan meningkatkan kecepatan).
rmeador
55

Saya suka kutipan ini:

Jika kita ingin menghitung baris kode, kita tidak boleh menganggapnya sebagai "baris yang diproduksi" tetapi sebagai "garis yang dihabiskan". - Edsger Dijkstra

Beberapa kali Anda berkontribusi lebih banyak dengan menghapus kode daripada menambahkan

rlovtang
sumber
30

Anda harus berhenti menggunakan metrik ini, sebagian besar tidak ada artinya. Kohesi, kopling, dan kompleksitas adalah metrik yang lebih penting daripada baris kode.

Otávio Décio
sumber
25
Saya tidak menggunakannya sebagai metrik produktivitas. Ini adalah latihan pribadi untuk keingintahuan saya sendiri.
Matthias Wandel
3
Cukup adil. Meski begitu sulit untuk menjawab tanpa definisi yang lebih tepat tentang apa yang dianggap sebagai baris kode.
Otávio Décio
1
@Matthias: Saya harus mengeditnya di OP jika saya jadi Anda, saya akan kurang ... agresif: P
annakata
28

Bagaimana kabar orang lain?

Saya satu-satunya pengembang penuh waktu di perusahaan kami dan telah menulis 500.000 baris kode OCaml dan F # selama 7 tahun terakhir, yang setara dengan sekitar 200 baris kode per hari. Namun, sebagian besar kode itu adalah contoh tutorial yang terdiri dari ratusan proyek terpisah yang masing-masing panjangnya beberapa ratus baris. Juga, ada banyak duplikasi antara OCaml dan F #. Kami tidak memelihara basis kode internal yang lebih besar dari 50kLOC.

Selain mengembangkan dan memelihara perangkat lunak kami sendiri, saya juga telah berkonsultasi untuk banyak klien di industri selama 7 tahun terakhir. Untuk klien pertama , saya menulis 2.000 baris OCaml selama 3 bulan yaitu 20 baris kode per hari. Untuk klien berikutnya , empat dari kami menulis kompiler yang menghasilkan jutaan baris kode C / C ++ / Python / Java / OCaml serta dokumentasi dalam 6 bulan yang merupakan 2.000 baris kode per hari per pengembang. Untuk klien lain, saya mengganti 50kLOC dari C ++ dengan 6kLOC dari F # dalam 6 bulan yaitu -352 baris kode per hari. Untuk klien lain , saya menulis ulang 15kLOC OCaml di F # yang akan memiliki ukuran yang sama sehingga 0 baris kode per hari.

Untuk klien kami saat ini , saya akan mengganti 1.600.000 baris kode C ++ dan Mathematica dengan ~ 160kLOC dari F # dalam 1 tahun (dengan menulis kompiler dipesan lebih dahulu) yang akan menjadi -6.000 baris kode per hari. Ini akan menjadi proyek saya yang paling berhasil hingga saat ini dan akan menghemat jutaan dolar bagi klien kami dalam biaya yang berkelanjutan. Saya pikir semua orang harus bertujuan untuk menulis -6.000 baris kode per hari.

JD
sumber
1
Saya suka jawaban Anda dan saya mengerti sarkasme. Sama seperti rasa ingin tahu, bisakah Anda menjelaskan mengapa menulis ulang kode dalam F # akan menghemat uang untuk klien Anda? Saya terbiasa dengan OCaml dan memang menulis penerjemah dalam bahasa itu dan tidak menyentuh bahasa itu sejak beberapa tahun, dan sekarang saya terus mendengar F # (jadi saya benar-benar ingin tahu tentang hal ini)
mm24
7
@ mm24 "bisakah Anda menjelaskan mengapa menulis ulang kode dalam F # akan menghemat uang untuk klien Anda". Pertama, mereka benar-benar dikacaukan oleh Wolfram Research yang menagih mereka £ 1 juta kontrak konsultasi untuk memperbaiki masalah yang sengaja mereka perkenalkan dalam upgrade Mathematica, misalnya mengubah semantik dari [LongDash]. Kedua, mereka dapat mengkonsolidasikan dua basis kode (Mathematica & C ++) yang saat ini dipertahankan bersama menjadi satu basis kode F #, mengurangi tidak hanya upaya duplikasi tetapi banyak interaksi terkait pembaruan produk dan perbaikan yang diidentifikasi dalam pengujian.
JD
7
@ mm24 Ketiga, otomatisasi. Mereka melakukan banyak hal dengan tangan yang sudah ada .NET tools untuk mengotomatisasi atau .NET membuatnya mudah untuk membuat alat tersebut. Tugas termasuk menginstruksikan kode dengan penghitung waktu untuk mengukur kinerja (menggunakan profiler), menulis serializer dengan tangan (menggunakan perpustakaan), menyalin nama nilai kunci dengan tangan (menggunakan refleksi) dan pembaruan penting untuk sistem hidup yang diajukan oleh bisnis ditindaklanjuti oleh orang-orang di TI dengan tangan (tulis alat agar bisnis bisa melakukan perubahan secara langsung).
JD
7
@ mm24 Keempat, peningkatan kinerja besar-besaran. F # adalah urutan besarnya lebih cepat dari Mathematica dan kode pembuktian konsep mereka dalam F # adalah 5x lebih cepat dari kode C ++ produksi mereka. Ini berarti bahwa pengujian dilakukan dalam hitungan detik, bukan jam, pada saat pengujian menjadi bagian integral dari pengembangan, secara dramatis meningkatkan produktivitas.
JD
7
@ mm24 Kelima, peningkatan kemampuan. Mereka ingin melakukan penghapusan kode mati dan mengukur cakupan kode dari tes mereka, tetapi mereka tidak dapat melakukan ini dengan alat yang mereka gunakan. Pindah ke .NET membuat ini (dan banyak lagi!) Mudah.
JD
13

Tanpa benar-benar memeriksa salinan "The Mythical Man-Month" (semua orang yang membaca ini harus benar-benar memiliki salinannya), ada bab di mana Brooks melihat produktivitas berdasarkan baris yang ditulis. Poin yang menarik, baginya, bukanlah jumlah baris yang sebenarnya ditulis per hari, tetapi fakta bahwa itu tampaknya kira-kira sama di assembler dan di PL / I (saya pikir itu adalah bahasa tingkat tinggi yang digunakan).

Brooks tidak akan mengeluarkan angka produktivitas sewenang-wenang, tetapi dia bekerja dari data pada proyek nyata, dan untuk semua yang saya ingat mereka mungkin rata-rata 12 baris / hari.

Dia menunjukkan bahwa produktivitas dapat bervariasi. Dia mengatakan bahwa kompiler tiga kali lebih keras dari program aplikasi, dan sistem operasi tiga kali lebih keras dari kompiler. (Dia tampaknya suka menggunakan pengganda tiga untuk memisahkan kategori.)

Saya tidak tahu apakah dia menghargai perbedaan individual antara produktivitas programmer (walaupun dalam argumen urutan-besarnya dia memang mendalilkan faktor tujuh perbedaan), tetapi seperti yang kita tahu produktivitas superior bukan hanya masalah menulis lebih banyak kode, tetapi juga menulis kode yang tepat untuk melakukan pekerjaan itu.

Ada juga pertanyaan tentang lingkungan. Brooks berspekulasi sedikit tentang apa yang akan membuat pengembang lebih cepat atau lebih lambat. Seperti banyak orang, ia mempertanyakan apakah mode saat ini (debugging interaktif menggunakan sistem pembagian waktu) lebih baik daripada cara-cara lama (perencanaan yang matang untuk pengambilan gambar dua jam menggunakan seluruh mesin).

Mengingat itu, saya akan mengabaikan angka produktivitas aktual yang ia dapatkan sebagai tidak berguna; nilai berkelanjutan dari buku ini adalah pada prinsip-prinsip dan pelajaran yang lebih umum bahwa orang-orang tetap tidak belajar. (Hei, jika semua orang telah mempelajarinya, buku itu hanya akan menarik sejarah, seperti semua argumen Freud bahwa ada sesuatu seperti pikiran bawah sadar.)

David Thornley
sumber
3
Sebuah pemikiran tentang produktivitas programmer yang berbeda - Dalam pengalaman saya, seorang programmer biasa-biasa saja akan membutuhkan waktu x kali lebih lama untuk menyelesaikan masalah yang diberikan, tetapi juga, sayangnya, menulis kode x kali lebih banyak saat melakukannya. Jadi dengan "baris kode per hari" yang sederhana, programmer yang biasa-biasa saja sama produktifnya.
Matthias Wandel
11

Sangat mudah untuk mendapatkan beberapa ratus baris kode per hari. Tetapi cobalah untuk mendapatkan beberapa ratus baris kode berkualitas per hari dan itu tidak mudah. Ditambah lagi dengan debugging dan melewati hari-hari dengan sedikit atau tanpa baris baru per hari dan rata-rata akan turun dengan cepat. Saya telah menghabiskan berminggu-minggu men-debug masalah yang sulit dan jawabannya adalah 1 atau 2 baris kode.

Jeffrey Hines
sumber
Memang. Tapi Anda akan lebih sering mengenai skenario itu karena proyek semakin besar. Saya telah menulis program 10 baris sempurna yang tidak memiliki bug. Ini semua masalah skala.
Matthias Wandel
1
Tidak ada program yang tidak memiliki bug.
Daniel Moura
14
Bah! tata bahasa Anda memiliki bug ...
RAL
3
@DanielMoura Oh, saya tidak setuju dengan itu ... Program "halo dunia" mungkin tidak terlalu berguna, tetapi Anda akan bisa mengatakan dengan penuh percaya diri bahwa tidak ada bug :)
WendiKidd
10

Akan jauh lebih baik untuk menyadari bahwa berbicara tentang garis fisik kode sangat tidak berarti. Jumlah fisik Garis Kode (LoC) sangat tergantung pada gaya pengkodean yang dapat bervariasi dari satu urutan besarnya dari satu pengembang ke yang lain.

Di dunia .NET ada cara mudah untuk menghitung LoC. Titik urutan . Titik urutan adalah unit debugging, itu adalah bagian kode yang disorot dalam warna merah-gelap saat meletakkan titik istirahat. Dengan titik urutan kita dapat berbicara tentang LoC logis , dan metrik ini dapat dibandingkan di berbagai bahasa .NET. Metrik kode LoC logis didukung oleh sebagian besar alat .NET termasuk metrik kode VisualStudio, NDepend atau NCover.

Misalnya, berikut adalah metode 8 LoC (titik urutan kurung awal dan akhir tidak diperhitungkan):

teks alternatif

Produksi LoC harus dihitung dalam jangka panjang. Beberapa hari Anda akan meludah lebih dari 200 LoC, beberapa hari lain Anda akan menghabiskan 8 jam memperbaiki bug dengan bahkan tidak menambahkan LoC tunggal. Beberapa hari Anda akan membersihkan kode mati dan akan menghapus LoC, beberapa hari Anda akan menghabiskan seluruh waktu Anda untuk merecode kode yang ada dan tidak menambahkan LoC baru ke total.

Secara pribadi, saya menghitung satu LoC di skor produktivitas saya sendiri hanya ketika:

  1. Itu dicakup oleh unit-tes
  2. ini terkait dengan semacam kontrak kode (jika mungkin, tidak semua LoC tentu saja dapat diperiksa oleh kontrak).

Dalam kondisi ini, skor pribadi saya selama 5 tahun terakhir dengan mengkode alat NDepend untuk pengembang .NET rata-rata 80 fisik LoC per hari tanpa mengorbankan kualitas kode . Ritme dipertahankan dan saya tidak melihatnya menurun dalam waktu dekat. Secara keseluruhan, NDepend adalah basis kode C # yang saat ini memiliki bobot sekitar 115K fisik LoC

Bagi mereka yang benci menghitung LoC (saya melihat banyak dari mereka dalam komentar di sini), saya membuktikan bahwa setelah dikalibrasi secara memadai, menghitung LoC adalah alat estimasi yang sangat baik . Setelah pengkodean dan pengukuran lusinan fitur yang dicapai dalam konteks pengembangan khusus saya, saya mencapai titik di mana saya dapat memperkirakan secara tepat ukuran setiap fitur TODO di LoC, dan waktu yang diperlukan untuk mengirimkannya ke produksi.

Patrick dari tim NDepend
sumber
1
Posting Anda sangat mendasar dan layak mendapatkan lebih banyak upvotes.
Skippy Fastol
9

Tidak ada yang namanya peluru perak.

Metrik tunggal seperti itu tidak berguna dengan sendirinya.

Sebagai contoh, saya memiliki perpustakaan kelas saya sendiri. Saat ini, statistik berikut ini benar:

Total baris: 252.682
Baris kode: 127.323
Komentar: 99.538
Baris kosong: 25.821

Anggap saja saya tidak menulis komentar sama sekali, yaitu, 127.323 baris kode. Dengan rasio Anda, pustaka kode itu akan membawa saya sekitar 10610 hari untuk menulis. Itu 29 tahun.

Saya jelas tidak menghabiskan 29 tahun untuk menulis kode itu, karena semuanya C #, dan C # belum ada selama itu.

Sekarang, Anda dapat berargumen bahwa kode tidak terlalu baik, karena jelas saya pasti telah melampaui 12 baris Anda metrik sehari, dan ya, saya akan setuju untuk itu, tetapi jika saya akan membawa timeline ke ketika 1.0 dirilis (dan saya tidak mulai benar-benar membuatnya sampai 2.0 dirilis), yaitu 2002-02-13, sekitar 2600 hari, rata-rata adalah 48 baris kode sehari.

Semua baris kode itu bagus? Heck no. Tetapi turun ke 12 baris kode sehari?

Heck no.

Semuanya tergantung.

Anda dapat meminta programmer membuat kode dengan urutan ribuan baris per hari, dan programmer menengah membuat kode dalam urutan ratusan baris per hari, dan kualitasnya sama.

Dan ya, akan ada bug.

Total yang Anda inginkan adalah saldo. Jumlah kode berubah, versus jumlah bug yang ditemukan, versus kompleksitas kode, versus kesulitan memperbaiki bug tersebut.

Lasse V. Karlsen
sumber
Amin! (ditambah spasi untuk memenuhi 15 karakter)
Nate
Catatan, statistik tersebut dihitung oleh DPack ( usysware.com/dpack ).
Lasse V. Karlsen
5
Mungkin aturan 10 baris per hari tidak berlaku untuk sesuatu yang lebih kecil, seperti perpustakaan kelas yang Anda tulis (saya berasumsi sendiri). Sebagian besar angka Brooks berasal dari proyek-proyek besar (IBM OS360), yang pada skala berbeda secara mendasar dari perpustakaan kelas Anda. Dugaan saya adalah bahwa pengamatan Brooks (sering) valid untuk proyek besar yang membutuhkan banyak orang dan jaringan komunikasi manusia yang signifikan, tetapi tidak valid untuk proyek yang lebih kecil.
J. Polfer
6

Steve McConnell memberikan statistik yang menarik dalam bukunya "Estimasi Perangkat Lunak" (hal. 62 Tabel 5.2) Ia membedakan antara jenis proyek (Avionik, Bisnis, Telco, dll.) Dan ukuran proyek 10 kLOC, 100 kLOC, 250 kLOC. Angka-angka diberikan untuk setiap kombinasi di LOC / StaffMonth. EG Avionic: 200, 50, 40 Sistem Intranet (Internal): 4000, 800, 600 Sistem Tertanam: 300, 70, 60

Yang berarti: mis. untuk proyek Avionic 250-kLOC ada 40 (LOC / Bulan) / 22 (Hari / Bulan) == <2LOC / hari!

Valentin Heinitz
sumber
1
250 Terra Lines of Code? Apa yang salah dengan KLoC?
fadedbee
4

Saya pikir ini berasal dari hari-hari pengembangan air terjun , di mana fase pengembangan sebenarnya dari sebuah proyek bisa hanya 20-30% dari total waktu proyek. Ambil total baris kode dan bagi dengan seluruh waktu proyek dan Anda akan mendapatkan sekitar 10 baris / hari. Bagi dengan hanya periode pengkodean, dan Anda akan lebih dekat dengan apa yang orang kutip.

pgs
sumber
3

Basis kode kami adalah sekitar 2.2MLoC selama sekitar 150 upaya man-tahun. Itu membuatnya sekitar 75 baris c ++ atau c # per pengembang per hari, selama seluruh proyek.

Steve Cooper
sumber
2

Saya pikir ukuran proyek dan jumlah pengembang yang terlibat adalah faktor besar dalam hal ini. Saya jauh di atas ini selama karir saya tetapi saya telah bekerja sendirian sepanjang waktu sehingga tidak ada kerugian untuk bekerja dengan programmer lain.

Loren Pechtel
sumber
1
Proyek kecil membantu, dan begitu juga soliter. Saya awalnya terkejut melihat bahwa kami mengenai tokoh sejarah ini, setidaknya secara bertahap. Pada awal proyek tersebut, produktivitas saya setidaknya 10 kali lebih tinggi.
Matthias Wandel
2

Perencanaan yang baik, desain yang bagus dan programmer yang baik. Anda mendapatkan semua togheter itu dan Anda tidak akan menghabiskan 30 menit untuk menulis satu baris. Ya, semua proyek mengharuskan Anda untuk berhenti dan merencanakan, memikirkan, membahas, menguji dan men-debug tetapi pada dua baris per hari setiap perusahaan akan membutuhkan pasukan untuk membuat tetris bekerja ...

Intinya, jika Anda bekerja untuk saya pada 2 baris per jam, Anda sebaiknya mendapatkan saya banyak kopi dan memijat kaki saya sehingga Anda tidak dipecat.

lcabral
sumber
1

Seseorang mencurigai permen manajer yang abadi ini diciptakan ketika semuanya adalah aplikasi sys yang ditulis dalam C karena jika tidak ada yang lain, angka ajaib akan bervariasi berdasarkan urutan besarnya tergantung pada bahasa, skala dan sifat aplikasi. Dan kemudian Anda harus diskon komentar dan atribut. Dan pada akhirnya siapa yang peduli dengan jumlah baris kode yang ditulis? Apakah Anda seharusnya selesai ketika Anda sudah mencapai 10 ribu baris? 100rb? Sangat sewenang-wenang.

Percuma saja.

annakata
sumber
Bagaimana Anda menggambarkan ukuran proyek itu?
Matthias Wandel
1
Jika itu dari "The Mythical Man-Month", itu mendahului C dengan cara yang panjang. Dalam buku itu, Brooks melihat gagasan bahwa output programmer dalam baris / hari cukup konstan terlepas dari bahasanya, dan menduga bahwa menulis dalam bahasa yang lebih ekspresif (lebih sedikit baris per unit fungsionalitas) akan menghasilkan programmer yang lebih produktif. Dia sadar bahwa jumlahnya akan sangat bervariasi (aturan praktisnya adalah bahwa sistem operasi sekitar 9 kali lebih keras daripada program aplikasi).
David Thornley
2
Unit kode terpisah, titik konektivitas (yaitu, unit interaksi), tingkatan, kelas (dalam OOP) ... ada sekitar sejuta cara. KLOCs sebenarnya bukan ukuran yang baik selain sebagai unit kompleksitas yang potensial . (EG, "ini butuh 3 minggu untuk debug karena saya harus mencari 4 KLOC untuk menemukannya!")
John Rudy
2
@ David: Saya tahu dari mana asalnya, saya bisa membaca pertanyaan dan saya punya buku di depan di rak di depan saya sekarang. Menariknya, tanggal publikasi pertama juga mengatakan bahwa itu adalah posting C dalam 3 tahun. Maksud saya - jelas dibuat dengan buruk - adalah bahwa itu kuno, dan lebih jauh lagi konsep itu tidak berguna. Hah! Itu benar-benar alkitabiah.
annakata
Yah, kami punya banyak titik konektivitas dan semacamnya. Tetapi bagaimana Anda menghitungnya? Kapan sesuatu menjadi titik konektivitas? Kapan kelas penting? Ukuran kode yang dikompilasi mungkin merupakan metrik yang lebih baik dalam sistem dan bahasa yang diberikan, tetapi bervariasi di seluruh sistem.
Matthias Wandel