Apakah komentar yang sudah ketinggalan zaman merupakan mitos urban?

38

Saya terus-menerus melihat orang-orang membuat klaim bahwa "komentar cenderung menjadi ketinggalan zaman." Masalahnya, saya pikir saya telah melihat mungkin dua atau tiga komentar usang sepanjang karir saya. Informasi yang sudah ketinggalan zaman dalam dokumen terpisah terjadi setiap saat, tetapi dalam pengalaman saya komentar yang ketinggalan zaman dalam kode itu sendiri sangat jarang.

Apakah saya baru saja beruntung dengan siapa saya bekerja? Apakah industri tertentu lebih rentan terhadap masalah ini daripada yang lain? Apakah Anda memiliki contoh spesifik dari komentar lama yang baru saja Anda lihat? Atau komentar usang lebih dari masalah teoritis daripada yang sebenarnya?

Karl Bielefeldt
sumber
30
Sepakat. Kode usang dibuat menjadi komentar, sekarang itu adalah sesuatu yang saya lihat banyak - dan ingin melihat lebih sedikit.
pyvi
8
Saya melihat lebih sedikit komentar sama sekali. Dikombinasikan dengan konvensi penamaan yang buruk itu adalah kesenangan yang mencoba untuk membaca beberapa hal yang saya kerjakan.
P.Brian.Mackey
2
Saya telah melihat banyak komentar yang sudah ketinggalan zaman, beberapa di antaranya hanyalah JAHAT yang menyesatkan. Jelas tidak ada mitos, tetapi sebagian besar berlaku untuk proyek yang dikelola oleh banyak orang dan / atau untuk waktu yang lama, diperkuat oleh kompleksitas. Namun saya belajar mempercayai kode, bukan komentar (saya hampir tidak pernah membacanya jika melebihi lebih dari satu dua baris).
MaR
Saya sebagian besar telah bekerja dengan kode warisan yang sangat lama sepanjang karier saya. Sudah ada sekitar belasan kali ketika saya memiliki beberapa masalah parah terkait dengan komentar usang dalam kode Fortan77 yang berusia 30 tahun yang aneh, tapi itu hampir nol persen dari kode di mana komentar cukup. Jadi saya setuju, skala masalah pasti dilebih-lebihkan.
SK-logic
Hanya keberuntungan saya, saya sudah melihat beberapa tahun sejak saya memposting ini. Saya kira saya secara tidak sadar telah belajar untuk tidak memercayai mereka, kemudian untuk memperbaikinya dan melanjutkan, tanpa cukup memikirkannya untuk dimasukkan ke dalam memori jangka panjang saya.
Karl Bielefeldt

Jawaban:

33

Selalu

Aku benar-benar tidak percaya aku satu-satunya yang berenang di komentar usang dan menyesatkan. Jika hal ini membantu pemahaman:

Mungkin yang paling penting tergantung pada usia kode. Faktor selanjutnya adalah pergantian staf.

Saya melakukan bagian R&D yang sama dan pekerjaan pemeliharaan. R&D adalah kode baru, umumnya hal-hal yang sedikit keluar jalur. Banyak kolega saya percaya untuk memberikan banyak komentar ketika mencoba sesuatu yang belum ada perpustakaan di sana. Karena rasio komentar dengan kode lebih tinggi dari biasanya, ada lebih banyak peluang untuk hal-hal yang tidak sinkron.

Kode pemeliharaan ... Saya adalah pengelola aktif pada sistem yang berumur lebih dari 10 tahun dan lainnya yang lebih dari 5. Kode dan komentar berumur 10 tahun itu mengerikan, seperti yang Anda harapkan. Lebih dari 10 tahun Anda mendapatkan banyak tangan dalam basis kode dan tidak ada yang tahu bagaimana semuanya bekerja lagi. Kode dan komentar berusia 5 tahun cukup bagus karena omset tim sudah sangat rendah.

Saya mengerjakan hampir semua layanan, bahkan produk kami sangat disesuaikan untuk pelanggan tertentu.

Contoh spesifik:

  • Komentar yang menjelaskan peningkatan kinerja untuk metodologi tertentu, seperti menghindari salinan dalam memori. Masalah besar ketika mesin kelas atas di Pentium 2 dengan MB RAM, tetapi sekarang bukan masalah.

  • TODO

  • Blok-blok kode yang disalin termasuk komentar. Komentar mungkin masuk akal di lokasi aslinya, tetapi hampir tidak masuk akal di sini

  • Blok komentar di atas kode yang dikomentari (Siapa yang tahu berapa tahun sudah ada di sana).

Dalam semua ini Anda melihat tren tidak mempertahankan komentar dan kode pada tingkat yang sama dengan perangkat lunak. IDE dan kebiasaan dasar pengembang tidak membantu dengan ini, mata saya telah dilatih untuk melewatinya. Saya pikir komentar yang ketinggalan jaman relatif murah untuk dihindari dalam bidang hijau dan proyek aktif. Jika Anda dapat menjaga rasio kode / komentar tetap tinggi, bukan masalah besar untuk tetap memperbaruinya. Agak sulit untuk membenarkan memburu hal-hal ini ketika Anda dianggarkan x jam untuk perbaikan bug pada sistem produksi.

Steve Jackson
sumber
Jadi pada dasarnya Anda mengatakan Anda mengabaikan komentar sama sekali karena sudah terlalu berantakan, hanya membuat situasi Anda lebih buruk. Sangat mengejutkan.
Steven Jeuris
5
@ Seven - Saya pribadi, tidak. Saya sangat percaya pada peningkatan bertahap. Saya telah melihat geraman kode yang benar-benar tidak dapat dipahami berubah menjadi sesuatu yang cukup baik dengan upaya bertahap yang cukup. Tapi, mengabaikan tentu saja merupakan norma dalam pengalaman saya. Ini sangat bisa dimengerti ketika Anda menjumpai beberapa kelas baris yang saling terkait 10.000 dengan masalah berminggu-minggu untuk katalog, bahwa komentar usang cenderung jatuh ke bagian bawah daftar prioritas.
Steve Jackson
1
@Steve: Dalam situasi Anda, saya hanya akan membuat skrip yang menghapus semua komentar kemudian, dan mulai berkomentar dari awal di mana diperlukan. :)
Steven Jeuris
1
basis kode utama tempat saya dulu bekerja adalah setidaknya setengah komentar dan kode jarang berkomentar. Komentar yang ketinggalan zaman adalah fakta kehidupan, komentar yang benar sangat jarang dan saya bahkan tidak akan mulai berkomentar tentang dokumentasi !!! melihat ... Setelah pekerjaan ini saya belajar bahwa kurang bagus, jika Anda kode perlu komentar, mungkin perlu refactor untuk membuat hal-hal lebih jelas ...
Newtopian
4
Saya telah melihat beberapa contoh mengerikan Blocks of copy-pasted code including comments. Comment may have made sense in its original location, but hardly makes sense here. Komentar tingkat kelas berbicara tentang kelas yang berbeda, misalnya.
Peter Taylor
18

"Komentar cenderung menjadi usang."

Saya telah melihat ini terjadi cukup sering untuk mengetahui ini bisa menjadi masalah.

Masalahnya, saya pikir saya telah melihat mungkin dua atau tiga komentar usang sepanjang karir saya.

Saya percaya itu harus sangat mungkin untuk bekerja di lingkungan di mana semua orang cukup memperhatikan komentar dan mempertahankannya. Hanya sedikit usaha ekstra untuk melihat komentar di dekat kode yang sedang Anda edit dan memperbaruinya bila perlu. Jika komentarnya begitu jauh sehingga Anda tidak segera melihatnya, itu adalah komentar yang buruk, dan seharusnya tidak ditambahkan di tempat pertama (atau setidaknya tidak ada di sana).

Selain itu biasanya bersama dengan pernyataan bahwa komentar cenderung menjadi ketinggalan zaman, mengikuti pernyataan bahwa ini mengurangi keterbacaan dan membingungkan orang. Ini adalah sesuatu yang belum saya alami. Setiap kali saya menjumpai komentar yang kedaluwarsa, saya melihat dengan jelas apa yang berubah dan hanya memperbarui komentar yang sesuai untuk mewakili kode yang lebih baru, meskipun dengan upaya ekstra.


Sebuah studi terbaru oleh Roehm et al. 2012 mengamati hal-hal berikut:

21 peserta [dari 28] melaporkan bahwa mereka mendapatkan informasi utama dari kode sumber dan komentar inline sedangkan hanya empat yang menyatakan bahwa dokumentasi adalah sumber utama informasi mereka.

Ini sesuai dengan kecurigaan Anda bahwa komentar dalam kode itu sendiri umumnya masih dianggap sangat berguna. Ini menunjukkan bahwa garis yang jelas harus ditarik antara dokumentasi yang ketinggalan jaman dan komentar yang ketinggalan zaman .

Roehm, T., Tiarks, R., Koschke, R., & Maalej, W. (2012, Juni). Bagaimana pengembang profesional memahami perangkat lunak? Dalam Prosiding Konferensi Internasional 2012 tentang Rekayasa Perangkat Lunak (hlm. 255-265). IEEE Press.

Steven Jeuris
sumber
Ketika saya menjadi lebih baik, saya menemukan saya perlu lebih sedikit komentar untuk memahami kode apa yang dilakukan dalam kode plug and chug khas.
Paul Nathan
3
@ Paul Nathan, komentar tidak boleh menggambarkan apa yang dikerjakan kode - kode menjelaskan lebih baik. Ada komentar untuk menjelaskan, mengapa kode melakukan apa yang dilakukannya.
SK-logic
2
@ SK-logika: Meskipun saya mengerti argumen saya percaya itu terlalu luas. Komentar dari suatu fungsi (atau kode paragraf / blok) dapat mengklarifikasi lebih banyak (dan lebih cepat) apa fungsi yang dilakukan daripada namanya. Ini sangat diperlukan untuk fungsi publik. Semudah membaca kode, membaca penjelasan dua baris kode 10-liner masih lebih cepat. Bayangkan bekerja dengan API favorit Anda yang tidak memiliki dokumentasi "apa" . Anda akan jauh kurang yakin tentang fungsinya.
Steven Jeuris
ya, saya tidak memasukkan dokumentasi (misalnya, Javadoc) - terlalu terstruktur untuk disebut hanya " komentar ".
SK-logic
17

Komentar yang ketinggalan jaman adalah bau pekerjaan. Ini seperti memiliki unit test yang ketinggalan jaman atau diabaikan - ini menunjukkan bahwa proses bagus yang dulunya aktif di toko berubah menjadi pengkodean koboi. "Budaya rekayasa" yang tepat dalam meluangkan waktu untuk melakukan berbagai hal dengan benar telah hancur. Proyek / perusahaan kemungkinan masuk ke hutang teknis.

Singkatnya, ya, Anda beruntung. Jika Anda memiliki serangkaian toko yang dikelola dengan cukup baik sejauh ini dalam karir Anda, sangat mungkin untuk tidak melihat sebanyak ini. Tetapi di toko-toko yang lebih tipikal dan kurang dikelola dengan baik, ini berjalan paralel dengan kekacauan lainnya.

Tabel Bobby
sumber
"Komentar ketinggalan jaman adalah bau pekerjaan." Sangat bagus! Demikian juga diri mendokumentasikan kode hanya tanpa komentar bukan solusi, tapi 'hack' malas.
Steven Jeuris
10

Komentar seperti tes, mereka sangat baik ketika mereka up to date, tetapi dapat membuatnya lebih sulit untuk memahami kode jika tidak ada.

Jika Anda tidak pernah melihat komentar yang ketinggalan zaman, Anda sangat beruntung.

Kebanyakan basis kode yang telah saya kerjakan penuh dengan komentar yang sudah ketinggalan zaman, dan biasanya saya mengabaikan komentar sepenuhnya karena biasanya merupakan sumber kebingungan alih-alih bantuan.

Kim.Net
sumber
Dapatkah saya bertanya di industri mana Anda bekerja? Saya bertanya-tanya apakah ini lebih umum pada beberapa daripada yang lain.
Karl Bielefeldt
Saya telah bekerja di 3 negara berbeda di Eropa, sebagian besar sebagai konsultan untuk perusahaan besar dan kecil. Akhir-akhir ini di rumah pengembangan SaaS.
Kim.Net
lihat juga: "Komentar adalah bau kode"
agas
10

Komentar yang kedaluwarsa sering muncul di JavaDoc:

  • Daftar argumen yang sudah tidak ada
  • Tidak menjelaskan semua argumen (yang hilang kemungkinan ditambahkan kemudian)
  • Hal serupa untuk pengecualian, dll.

Selain itu, terkadang komentar menyatakan hal-hal seperti "lakukan ini di sini untuk kinerja" ketika sebagian besar pertimbangan kinerja cenderung menjadi basi bahkan lebih cepat daripada kode itu sendiri.

Deckard
sumber
3
(Bukan kritik - hanya menyajikan solusi) Peringatan IDE dapat membantu mencegah hal ini. Jika diperlukan tindakan yang lebih drastis, gagal membangun pada javadoc build warning / error.
Michael K
1
Ini bisa menjelaskan mengapa saya belum melihat banyak. Saya belum pernah bekerja di suatu tempat yang menggunakan komentar gaya JavaDoc.
Karl Bielefeldt
4
@Michael, peringatan IDE sangat membantu dalam kasus-kasus ringan. Basis kode warisan kami menghasilkan lebih dari 20.000 peringatan Checkstyle, itu jauh melebihi batas di mana Anda berhenti memperhatikan: - (((IDE, bila digunakan dengan buruk, dapat berkontribusi pada kesengsaraan Javadoc secara signifikan. Sebagian besar omong kosong Javadoc di basis kode kami jelas di-autogenerasi)
Péter Török
4

Saya berurusan dengan komentar usang dari waktu ke waktu. Jelas itu bukan mitos urban. Orang-orang menyebutkannya dalam daftar praktik terburuk bukan karena sangat sering menyerang Anda, tetapi karena ketika melakukannya, biasanya Anda harus menghabiskan banyak waktu dan usaha.

Dalam basis kode kami, sebagian besar komentar yang ketinggalan zaman disebabkan oleh penggunaan pola (anti) untuk menggambarkan perilaku metode di dekat panggilannya dan bukan di dekat deklarasi metode. Itu terjadi ketika seseorang mengekstraksi potongan panjang kode ke dalam metode yang hanya dipanggil sekali pada saat itu dan kemudian mengomentari pemanggilan metode. Jadi Anda berakhir dengan sesuatu seperti ini:

featureList = GetFeatures();

// Sorting features and deleting empty ones from the list...
ProcessFeatures(featureList);

Dan metode ini dinyatakan di suatu tempat di bawah ini tanpa komentar. Orang-orang mengotak-atik metode ini selama bertahun-tahun berurusan dengan perubahan spesifikasi dan memperbaiki bug, dan akhirnya Anda berakhir dengan metode yang tidak mengurutkan daftar dan melempar pengecualian ketika menemukan fitur kosong. Jadi komentar di atas adalah komentar usang yang pada akhirnya akan membebani Anda waktu dalam debugger. Ini memang terjadi di beberapa basis kode.

Dyppl
sumber
3

Tanyakan pada diri sendiri ini Pernahkah Anda mengubah sebaris kode dan tidak mengubah komentar terkait atau menambahkan yang baru?

Saya telah bekerja dengan banyak kode lawas dan komentarnya kadang-kadang tidak mendekati yang relevan.

Bill Leeper
sumber
2

Sebagian besar, pengalaman saya cocok dengan Anda, tetapi saya telah menemukan satu kasus di mana itu benar di seluruh basis kode. Itu adalah aplikasi yang telah ditulis bertahun-tahun sebelumnya oleh toko konsultan yang tidak lagi "berhubungan baik" dengan klien.

Perusahaan melakukan pekerjaan luar biasa mengomentari kode, tetapi programmer yang mempertahankannya sejak handoff asli adalah bagian dari pola pikir "hanya mengubah apa yang benar-benar perlu diubah" yang dengan sendirinya tidak buruk. Sayangnya, mereka menjaga sikap yang sama terhadap komentar, yang mengarah ke pemutusan yang cukup besar antara komentar dan kode dari waktu ke waktu.

Dave Wise
sumber
2

Saya tidak melihat terlalu banyak komentar deskriptif yang ketinggalan zaman, tetapi saya melihat banyak komentar TODO yang telah ada selama bertahun-tahun. Saya berharap mereka seperti kapsul waktu dan mengatakan sesuatu seperti ini:

//TODO: In 15 years AND NO SOONER... actually implement this method.
Morgan Herlocker
sumber
1
Masalah dalam hal ini mungkin adalah penyalahgunaan TODO. Saya percaya TODO hanya boleh digunakan ketika kode sebenarnya fungsional tetapi perbaikan bisa dibuat nanti, jadi TODO: implementjenis komentar tidak boleh ada dan fakta bahwa tidak ada yang benar-benar kembali tidak masalah banyak. Sayangnya, tidak banyak orang yang mematuhi aturan ini dan saya sepenuhnya setuju saya ingin melihat komentar seperti Anda diposting di beberapa kode produksi di beberapa titik. Itu akan membuat hari saya.
pwny
1
Di C # saya menggunakan NotImplementedException untuk keperluan itu.
Steven Jeuris
2
@pwny, saya hanya menggunakan TODO pada hal-hal yang saya rencanakan untuk ditulis sebelum saya check-in, untuk memastikan saya menutupinya. Menurut saya, istilah apa pun yang lebih panjang dari itu termasuk dalam pelacak bug.
Karl Bielefeldt
@ Karl Bielefeldt Itu masuk akal juga.
pwny
2

3 proyek terakhir yang saya kerjakan. Saya menghabiskan beberapa hari untuk masing-masing menghapus komentar usang, menyesatkan, dan hanya berguna dari basis kode. Bila mungkin dan perlu, saya menggantinya dengan komentar yang lebih tepat, tetapi lebih sering daripada tidak, itu hanya pertanyaan menghapus komentar dan melanjutkan.

Saya telah melakukan hal yang sama pada hampir semua basis kode yang pernah saya ambil dari orang lain, biasanya setelah itu tidak dipelihara untuk sementara waktu dan pemilik aslinya telah lama pergi dan / atau tidak mau atau tidak mampu melakukan penyerahan yang tepat.

jwenting
sumber
1

Bisa jadi itu adalah penurunan dalam penggunaan komentar. Berapa banyak kode siapa pun yang memenuhi syarat? Untuk satu, seseorang benar-benar harus memasukkan komentar untuk menjadi ketinggalan zaman Kedua, kode yang dikomentari harus diubah. Tidak yakin persentase tinggi kode memenuhi syarat.

Anda hanya perlu mengandalkan satu komentar buruk untuk merusak sebagian besar aplikasi dan menghabiskan banyak waktu Anda.

JeffO
sumber
0

Dalam organisasi yang mengeluarkan banyak kode, sulit untuk menjaga komentar tetap sinkron. Cara terbaik untuk memahami apa yang terjadi adalah dengan menggunakan perangkat lunak yang menggambar diagram alir kontrol dari modul yang sedang Anda kerjakan. Itulah satu-satunya cara untuk tetap merasakan apa yang dilakukan perangkat lunak.

Gaurav Sehgal
sumber