Apakah kepemilikan kode bau kode?

27

Ini adalah sesuatu yang telah saya pikirkan sejak saya membaca jawaban ini di utas opini pemrograman kontroversial :

Pekerjaan Anda adalah membuat diri Anda tidak bekerja.

Saat Anda menulis perangkat lunak untuk atasan Anda, perangkat lunak apa pun yang Anda buat harus ditulis sedemikian rupa sehingga dapat diambil oleh pengembang mana pun dan dipahami dengan sedikit usaha. Ini dirancang dengan baik, ditulis dengan jelas dan konsisten, diformat dengan bersih, didokumentasikan di mana perlu, dibangun setiap hari seperti yang diharapkan, diperiksa ke dalam repositori, dan versi yang sesuai.

Jika Anda tertabrak bus , diberhentikan, dipecat, atau keluar dari pekerjaan, majikan Anda harus dapat menggantikan Anda dengan pemberitahuan sesaat, dan orang berikutnya dapat masuk ke peran Anda, mengambil kode Anda dan bangun dan berjalan dalam seminggu puncak. Jika dia tidak bisa melakukan itu, maka Anda telah gagal total.

Menariknya, saya menemukan bahwa memiliki tujuan itu telah membuat saya lebih berharga bagi majikan saya. Semakin saya berusaha menjadi disposable, semakin berharga saya bagi mereka.

Dan sudah dibahas sedikit dalam pertanyaan lain, seperti yang ini , tapi saya ingin membahasnya lagi untuk membahas dari sudut pandang yang lebih kosong " ini bau kode !! " - yang belum benar-benar dibahas. belum mendalam.

Saya telah menjadi pengembang profesional selama sepuluh tahun. Saya mempunyai satu pekerjaan di mana kode itu ditulis dengan cukup baik untuk diambil relatif cepat oleh pengembang baru yang layak, tetapi dalam kebanyakan kasus di industri, tampaknya tingkat kepemilikan yang sangat tinggi (baik kepemilikan individu maupun tim) adalah norma. Sebagian besar basis kode tampaknya tidak memiliki dokumentasi, proses, dan "keterbukaan" yang memungkinkan pengembang baru mengambilnya dan bekerja dengan cepat. Tampaknya selalu ada banyak trik dan peretas kecil yang tidak tertulis yang hanya diketahui oleh seseorang yang mengetahui basis kode dengan baik ("memiliki" itu).

Tentu saja, masalah nyata dengan ini adalah: bagaimana jika orang itu berhenti atau "ditabrak bus"? Atau di tingkat tim: bagaimana jika seluruh tim keracunan makanan ketika mereka pergi makan siang tim mereka, dan mereka semua mati? Apakah Anda dapat mengganti tim dengan serangkaian pengembang acak baru yang relatif tanpa rasa sakit? - Dalam beberapa pekerjaan masa lalu saya, saya tidak bisa membayangkan itu terjadi sama sekali. Sistemnya begitu penuh trik dan peretasan sehingga Anda " hanya perlu tahu ", bahwa setiap tim baru yang Anda sewa akan membutuhkan waktu lebih lama daripada siklus bisnis yang menguntungkan (mis., Rilis stabil baru) untuk membuat semuanya berjalan kembali. Singkatnya, saya tidak akan terkejut jika produk tersebut harus ditinggalkan.

Jelas, kehilangan seluruh tim sekaligus akan sangat jarang. Tetapi saya pikir ada hal yang lebih halus dan menyeramkan dalam semua ini - yang merupakan titik yang membuat saya berpikir untuk memulai utas ini, karena saya belum pernah melihatnya membahasnya dalam istilah-istilah ini sebelumnya. Pada dasarnya: Saya pikir kebutuhan yang tinggi untuk kepemilikan kode sangat sering merupakan indikator hutang teknis . Jika ada kekurangan proses, komunikasi, desain yang baik, banyak trik kecil dan peretasan dalam sistem yang Anda "hanya perlu tahu", dll. - itu biasanya berarti bahwa sistem semakin masuk ke hutang teknis yang semakin dalam dan semakin dalam.

Tetapi masalahnya adalah - kepemilikan kode sering disajikan sebagai semacam "kesetiaan" kepada proyek dan perusahaan, sebagai bentuk positif dari "mengambil tanggung jawab" untuk pekerjaan Anda - sehingga tidak populer untuk langsung mengutuknya. Tetapi pada saat yang sama, sisi utang teknis dari persamaan sering berarti bahwa basis kode semakin tidak terbuka, dan lebih sulit untuk dikerjakan. Dan terutama ketika orang pindah dan pengembang baru harus mengambil tempat mereka, biaya utang teknis (yaitu pemeliharaan) mulai melonjak.

Jadi dalam arti tertentu, saya benar-benar berpikir bahwa itu akan menjadi hal yang baik untuk profesi kita jika tingkat kebutuhan kepemilikan kode yang tinggi secara terbuka dilihat sebagai bau pekerjaan (dalam imajinasi programmer populer). Alih-alih dipandang sebagai "mengambil tanggung jawab dan kebanggaan" dalam pekerjaan, itu harus dilihat lebih sebagai "membudidayakan diri sendiri dan menciptakan keamanan kerja buatan melalui utang teknis".

Dan saya pikir tes (percobaan pikiran) pada dasarnya harus: bagaimana jika orang (atau memang, seluruh tim) akan menghilang dari muka bumi besok. Apakah ini akan menjadi cedera besar - mungkin fatal - pada proyek, atau apakah kita dapat membawa orang baru, membuat mereka membaca dokumen dan membantu file dan bermain-main dengan kode selama beberapa hari - dan kemudian kembali bisnis dalam beberapa minggu (dan kembali ke produktivitas penuh dalam sebulan atau lebih)?

Tabel Bobby
sumber
3
Apa pertanyaan Anda? Juga, apa itu "bau kode"?
CamelBlues
2
@CamelBlues: " Bau kode adalah gejala apa pun dalam kode sumber program yang mungkin menunjukkan masalah yang lebih dalam." (Wikipedia) Lihat pencarian ini untuk beberapa dari banyak pertanyaan di situs ini mengenai bau kode.
Carson63000
4
Bukankah kepemilikan kode adalah hasil dari bau kode, bukankah kepemilikan kode adalah bau kode? Saya pikir ini masih pertanyaan yang sama dengan yang lain, termasuk yang ini: programmers.stackexchange.com/questions/48697/…
Rei Miyasaka
1
Bagi saya "mengambil tanggung jawab / kepemilikan"! = "Kepemilikan kode", saya baru-baru ini berdebat dengan manajer bahwa kepemilikan kode agak buruk dan tidak sama dengan membiarkan orang untuk melepaskan tanggung jawab. Untuk kepemilikan kode manajer ini berarti sama dengan bertanggung jawab.
Thomas James
1
Ya, saya tidak pernah menganggap kepemilikan kode berarti apa yang didefinisikan Q ini sebagai. Mengambil kepemilikan kepada saya berarti orang yang menggantikan saya setelah hal bus mengerikan dapat membaca kode saya karena saya bangga padanya seperti itu adalah bayi pribadi saya sendiri.
Erik Reppen

Jawaban:

32

Saya pikir kita harus membuat perbedaan antara kepemilikan kode:

  • dari sudut pandang tanggung jawab,
  • dari sudut pandang gaya kode / retasan dll.

Yang pertama harus didorong. Jika tidak ada yang bertanggung jawab untuk kode kualitas rendah dan bug, hal-hal buruk akan terjadi . Itu tidak berarti bahwa bug yang terkait dengan kode Anda sendiri harus diberikan setiap kali kepada Anda: jika kode ditulis dengan benar, siapa pun dapat memperbaiki bug di bagian mana pun dari kode. Tetapi jika Anda tidak memiliki umpan balik tentang bug yang Anda lakukan, Anda akan menghasilkan bug yang sama berulang kali .

Kepemilikan kode dapat banyak membantu manajer dan pengembang, terutama pengembang. Jika saya tahu bahwa 80% bug dalam produk ada dalam kode saya sementara kami tiga pengembang mengerjakan proyek, dan 75% bug itu terkait dengan SQL Injection, saya akan lebih hati-hati menulis kode di waktu berikutnya, dan membuat upaya ekstra untuk menulis kueri basis data dengan benar.


Yang kedua (kepemilikan kode dari gaya kode / peretasan, dll.) Sebagian besar adalah hal yang buruk. Apa yang dibawanya ke produk? Itu tidak meningkatkan kualitas produk, tetapi mengurangi keseragaman kode sumber dan membuatnya sulit untuk mempertahankannya akhir-akhir ini .

Untuk banyak proyek besar, orang tidak tinggal seumur hidup mengerjakan potongan kode yang sama. Dan di sini, saya bahkan tidak berbicara tentang hal-hal mengerikan seperti pengembang ditabrak bus: Saya tidak berpikir kepemilikan kode adalah masalah pertama dalam kasus ini. Tetapi banyak hal kecil yang terjadi: orang bermigrasi dari pengembangan ke manajemen atau pekerjaan lain, atau memilih proyek lain, atau mengerjakan hal lain, atau mulai menggunakan bahasa lain (jika beberapa bahasa digunakan di dalam proyek), dll.

Sepotong kode proyek juga dapat digunakan kembali di proyek lain, dan pengembang yang mengerjakan proyek lain ini ingin memodifikasi beberapa bagian dari kode agar sesuai dengan kebutuhan baru, tanpa meminta nasihat dari mantan penulis kode.

Apakah ini bau kode? Yah, itu tergantung pada apa yang Anda maksud dengan kode bau. Bagi saya, ini semua tentang koherensi keseluruhan proyek dan manajemen yang benar . Dalam proyek yang bagus,

  • pedoman gaya kode ditegakkan untuk membantu memahami kode lebih mudah nanti,
  • pengembang yang lebih berpengalaman tidak melanggar prinsip KISS, sehingga membantu pemahaman kode sumber nantinya oleh rekan yang kurang berpengalaman.

Untuk menyimpulkan, kepemilikan kode harus dilacak melalui kontrol versi, tetapi Anda tidak boleh bisa mengatakan bahwa sepotong kode ditulis oleh Anda atau orang lain dalam tim .

Arseni Mourzenko
sumber
9

Pertama kita perlu mendefinisikan apa itu "kepemilikan kode".


Ketika sepotong (bagian) kode sedang dalam proses awal pengembangan, seringkali perlu menunjuk satu atau dua orang sebagai "pemilik" karena:

  • Pada awalnya tidak ada spesifikasi atau persyaratan yang jelas, dan pengembang perlu mengumpulkan informasi sendiri. Ada perbedaan waktu antara pengumpulan dan dokumentasi dari temuan-temuan itu.
  • Hindari pengeditan yang bertentangan ketika potongan kode dimodifikasi secara aktif.
  • "Pemilik" adalah orang yang dapat melaporkan perkembangan pengembangan fitur.

Biasanya ada satu pemilik untuk setiap tugas. Pemilik ganda dimungkinkan dengan Pair-programming. Tidak akan praktis untuk melakukannya tanpa "kepemilikan kode" yang ditentukan secara sempit.

Catatan:
Silakan lihat jawaban @ MainMa untuk masalah lain selama pengembangan. Dalam kasus tersebut, "kepemilikan kode" adalah gejala dari masalah yang lebih besar, yaitu: pilihan arsitektur yang kurang optimal, ketidakkonsistenan gaya pengkodean, dan umumnya kurangnya kualitas kode.


Setelah sepotong ditulis dan diterima ke dalam basis kode ("selesai"), pertanyaan "kepemilikan kode" yang lebih umum muncul.

  • Siapa pakar yang dapat menjawab semua pertanyaan tentang kode ini / bagian dari fungsi ini?
  • Apakah pengetahuan ini telah ditangkap dalam artefak berwujud, seperti dokumen persyaratan, tes unit, tes penerimaan, log perubahan, wiki proyek dll?

Akan selalu ada beberapa bagian dari pengetahuan domain (pemahaman diam-diam tentang persyaratan pelanggan, masalah kompatibilitas dengan sistem misterius, dll) yang sulit untuk diformalkan menjadi spesifikasi tertulis. Karena itu, ketika ada peristiwa bencana, beberapa kehilangan pengetahuan domain harus diharapkan.

Seiring dengan hilangnya pengetahuan domain, Anda juga akan kehilangan penjawab ahli yang dapat menjelaskan detail sistem. Dalam aspek ini, kehilangan ahli adalah hal yang secara universal buruk. Pengetahuan itu seharusnya sudah ditangkap sebelumnya.

Ini tidak berarti bahwa keberadaan "para ahli" itu buruk: Anggaplah para ahli sebagai "cache" dari pengetahuan tertulis. Para ahli sering dapat menjawab pertanyaan lebih cepat daripada harus mencari dan mencerna pengetahuan tertulis.


Namun, kadang-kadang "kepemilikan kode" mengacu pada hambatan yang dibuat oleh pengembang aktif proyek untuk mencegah orang luar mengubah kode.

  • Siapa yang dapat mengubah kode ini?
    • Untuk memperbaiki bug yang jelas?
    • Untuk membuat kode memenuhi beberapa persyaratan lain?
    • Untuk sepenuhnya menulis ulang kode sesuai selera seseorang?

Ada hambatan baik dan buruk:

  • Hambatan yang bagus
    • Pengetahuan domain - seberapa baik Anda memahami persyaratan dan gaya arsitektur / pengkodean
    • Keterampilan pemrograman dan desain - apakah Anda memiliki keterampilan untuk meningkatkan desain dan kualitas kode proyek
  • Hambatan buruk
    • Anda bukan anggota tim pengembang asli, jadi Anda tidak diizinkan melakukan perubahan.
    • Hanya perbaikan bug yang diterima. Penyempurnaan fitur tidak diterima.

Dalam hal ini, hak istimewa untuk mengedit kode sumber proyek lain tidak boleh didasarkan pada kepemilikan kode, tetapi harus berbasis prestasi.


Akhirnya, jawaban @Graham Lee menunjukkan fragmentasi pengetahuan dan arsitektur yang disebabkan oleh departemen.

Dalam hal ini, "kepemilikan kode" adalah salah satu gejala dari departemenisasi. Gejala kedua adalah "kurangnya minat pada proyek tim lain". Sebagai sebuah organisasi, para manajer perlu mengambil langkah-langkah untuk mendorong transfer pengetahuan dan kolaborasi lintas tim dan departemen.

rwong
sumber
7

Lebih berbahaya lagi, beberapa perusahaan (saya pernah bekerja pada satu) mengatur struktur manajemen mereka di sekitar tim fungsional: Anda mengelola pengembang klien Windows, dia mengelola tim pemasang, ia mengelola para pengembang backend dan sebagainya. Hal ini tidak hanya mengarah pada kepemilikan kode yang kuat yang Anda gambarkan, tetapi juga menjadikannya sebagai cara kerja bisnis. Ternyata arsitektur perangkat lunak menjadi pertarungan politik.

Apakah ini masalah? Itu adalah jika arsitekturnya adalah-atau menjadi-suboptimal. Tidak mungkin untuk mengatakan (misalnya) bahwa installer akan bekerja lebih baik atau lebih murah untuk dikembangkan jika itu hanya kasus penggunaan klien, karena itu mengambil alih kendali dari sebuah tim dan manajernya. Pembagian antara modul fungsional telah menjadi fakta tentang cara departemen teknik dijalankan, dan dibutuhkan banyak pergolakan untuk mengubah fakta-fakta tersebut.

[BTW kalau-kalau diskusi di atas tidak membuatnya jelas, jawaban saya untuk pertanyaan Anda adalah ya. Kepemilikan kode adalah bau kode, karena dapat menghentikan orang pintar dengan ide bagus — atau bahkan hanya orang yang tersedia saat Anda membutuhkannya — mengerjakan kode. Jelas memiliki kontrol untuk menghentikan perubahan yang berubah-ubah adalah hal yang baik, tetapi jika Anda memiliki insinyur yang dapat melihat cara memperbaiki bug dan memiliki waktu untuk melakukannya, Anda tidak boleh memblokir insinyur itu hanya karena orang lain menulis kode kereta. ]


sumber
6

Mengatasi pertanyaan Anda dari sudut pandang yang sedikit berbeda, kepemilikan kode BUKAN aroma kode. Ini bukan bau manajemen dan sumber daya .

Pikirkan tentang apa arti bau kode. Ini adalah metafora yang memberi tahu Anda ketika Anda melihat kode Anda, bahwa ada sesuatu yang tidak beres dengan kode dan / atau desain perangkat lunak, tetapi masalahnya mungkin tidak begitu jelas untuk dapat menempatkan jari Anda pada apa yang masalah sebenarnya mungkin tetapi Anda mungkin punya ide bagus. Di rumah Anda, jika sesuatu berbau busuk, Anda mengikuti hidung Anda sampai Anda menemukan sumber masalahnya, dan kemudian Anda melakukan sesuatu tentang hal itu. Dengan cara yang sama, jika kode memiliki masalah Anda menyelidiki dan mengubahnya hingga menjadi kurang masalah, atau seperti yang mungkin dikatakan, cantik atau dibuat dengan baik .

Kepemilikan kode di sisi lain bisa menjadi masalah serius. Ini menunjukkan kurangnya pengawasan, dan risiko bahwa jika pemilik kode meninggalkan, bahwa pengetahuan tentang kode dan masalah spesifik yang dipecahkannya tidak akan lagi tersedia bagi perusahaan. Ini tidak ada hubungannya dengan kode aktual itu sendiri. Ini pada dasarnya bermuara pada situasi manajemen risiko dengan cara yang sama yang mengarahkan kita untuk menyimpan cadangan data kita, dan berlaku sama untuk kepemilikan tugas, atau mendokumentasikan kepemilikan di area lain perusahaan.

Saya pikir tidak masalah untuk menggambarkan masalah bisnis lainnya sebagai bau , tetapi tentu saja tidak menyiratkan bahwa hanya karena ada bau , yang secara khusus berkaitan dengan kode.

S.Robins
sumber
1

Saya mendefinisikan Kepemilikan Kode sebagai mengambil tanggung jawab pribadi untuk kode yang Anda tulis, dengan pengertian bahwa orang lain akan bekerja dalam kode Anda di masa mendatang . Jika Anda memikirkan hal-hal dengan cara ini, Anda akan cenderung menulis peretasan karena a) bug dalam modul itu dapat ditelusuri kembali kepada Anda, dan b) anggota tim kemungkinan akan mengalami kesulitan memodifikasi kode di masa mendatang. .

Saya menulis posting blog pada beberapa bulan yang lalu, di mana saya berpendapat bahwa tanpa kepemilikan kode, seperti yang saya definisikan, basis kode sering menjadi mangsa Tragedi Commons .

Menurut definisi kepemilikan kode Anda, saya setuju bahwa memiliki kode yang buruk hanya dapat dilakukan oleh penulis.

jewewlett
sumber
Terdengar lebih seperti "code-tending", atau "code-sitting (a la baby-sitting)". Saya setuju dengan semua jawaban Anda.
Mawg