Metodologi untuk mendokumentasikan basis kode yang ada

35

Saya bekerja sebagai bagian dari tim pada aplikasi yang sudah ada yang tidak memiliki dokumentasi sebaris, juga tidak memiliki dokumentasi teknis. Karena saya telah mengerjakan berbagai laporan bug pada aplikasi, saya telah menulis semacam jejak remah roti untuk saya sendiri - nomor bug di berbagai tempat sehingga pengembang selanjutnya dapat merujuk ke nomor bug itu untuk melihat apa yang sedang terjadi.

Pertanyaan saya adalah:

Apa metode yang paling efisien untuk mendokumentasikan kode ini? Haruskah saya mendokumentasikan saat saya menyentuh area (metode virus, jika Anda mau), atau haruskah saya mendokumentasikan dari setiap bagian sendiri, dan tidak mengikuti jalur yang bercabang ke area lain dari aplikasi? Haruskah saya memasukkan komentar sebaris di mana sebelumnya tidak ada (dengan takut bahwa saya mungkin salah mengidentifikasi kode apa yang dilakukan)?

Metode apa yang akan Anda gunakan untuk secara akurat dan cepat mendokumentasikan aplikasi yang agak besar yang tidak memiliki dokumentasi inline yang ada, atau referensi inline untuk dokumentasi eksternal?

George Stocker
sumber
1
+1 Cara mengelolanya sama pentingnya dengan cara melakukannya.
1
Sebagian besar kode yang saya lihat tidak didokumentasikan. Saya mencoba untuk membersihkan kode orang lain, dan berteriak untuk itu DAN itu muncul di ulasan tahunan saya. Jika Anda memiliki semua waktu di dunia, atau mereka tidak peduli bagaimana Anda menghabiskan 50 jam kerja Anda, maka pertanyaannya tentu harus "Bagaimana saya melakukannya?". Namun, apakah Anda yakin ingin melakukannya? Banyak tergantung pada budaya perusahaan, seberapa putus asa mereka untuk meningkatkan penjualan, seberapa baik mereka memahami bisnis perangkat lunak, ... bahasa apa dan alat yang mereka gunakan. Untuk C # ada alat bagus yang disebut StyleCop serta GhostDoc. Alat ada tetapi waktu langka.
Ayub
1
Sudahkah Anda mempertimbangkan menerima jawaban untuk pertanyaan ini? Jika bukan jawaban kami yang Anda cari, mungkin Anda dapat memperbarui pertanyaan Anda. Saya kemudian dengan senang hati akan memperbarui jawaban saya agar lebih sesuai dengan pertanyaan Anda.
Mark Booth

Jawaban:

18

Mendokumentasikan basis kode warisan

Saya sangat merekomendasikan mengikuti aturan scout dengan basis kode lama. Mencoba mendokumentasikan proyek warisan secara mandiri tanpa mengerjakannya tidak akan pernah terjadi.

Dokumentasi dalam kode

Yang paling penting adalah menggunakan fasilitas dokumentasi di lingkungan pengembangan yang Anda pilih, sehingga itu berarti pydoc untuk python, javadoc di java atau komentar xml dalam C #. Ini memudahkan untuk menulis dokumentasi pada saat yang sama dengan menulis kode.

Jika Anda mengandalkan untuk kembali dan mendokumentasikan sesuatu nanti, Anda mungkin tidak menyiasati hal itu, tetapi jika Anda melakukannya saat Anda menulis kode, maka apa yang perlu didokumentasikan akan menjadi segar dalam pikiran Anda. C # bahkan memiliki opsi untuk mengeluarkan peringatan kompilasi jika dokumentasi XML tidak lengkap atau tidak konsisten dengan kode aktual.

Tes sebagai dokumentasi

Aspek penting lainnya adalah memiliki integrasi yang baik dan pengujian unit.

Seringkali dokumentasi berkonsentrasi pada apa yang dilakukan kelas dan metode secara terpisah, melompati cara mereka digunakan bersama untuk menyelesaikan masalah Anda. Tes sering menempatkan ini ke dalam konteks dengan menunjukkan bagaimana mereka berinteraksi satu sama lain.

Demikian pula, tes unit sering menunjukkan ketergantungan eksternal secara eksplisit melalui mana hal-hal yang perlu diejek .

Saya juga menemukan bahwa menggunakan pengembangan yang digerakkan oleh Test, saya menulis perangkat lunak yang lebih mudah digunakan, karena saya menggunakannya langsung dari kata go. Dengan kerangka pengujian yang baik, membuat kode lebih mudah untuk diuji dan membuatnya mudah digunakan seringkali merupakan hal yang sama.

Dokumentasi tingkat tinggi

Akhirnya ada apa yang harus dilakukan tentang tingkat sistem dan dokumentasi arsitektur. Banyak yang menganjurkan menulis dokumentasi seperti itu di wiki atau menggunakan Word atau pengolah kata lain, tetapi bagi saya tempat terbaik untuk dokumentasi tersebut juga di samping kode, dalam format teks biasa yang ramah sistem kontrol versi.

Sama seperti dengan dokumentasi dalam-kode, jika Anda menyimpan dokumentasi tingkat yang lebih tinggi dalam repositori kode Anda, maka Anda akan cenderung memperbaruinya. Anda juga mendapatkan manfaat bahwa ketika Anda mengeluarkan versi XY kode, Anda juga mendapatkan versi XY dokumentasi. Selain itu, jika Anda menggunakan format ramah VCS, maka itu berarti mudah untuk bercabang, berbeda, dan digabungkan, seperti halnya kode Anda.

Saya sangat suka pertama , karena mudah untuk menghasilkan halaman html dan dokumen pdf dari itu, dan jauh lebih ramah daripada LaTeX , namun masih dapat menyertakan ekspresi matematika LaTeX saat Anda membutuhkannya.

Mark Booth
sumber
4
+1 untuk pramuka, tetapi lebih karena Anda satu-satunya orang yang menyebutkan tes. Tes memvalidasi asumsi Anda tentang kode, adalah lingua franca untuk pengembang dan tidak pernah keluar dari sinkronisasi (asalkan Anda membiarkannya berlalu).
earcam
16

Pertanyaan rumit. Pada dasarnya, saya akan menggunakan metode "refactoring", yang akan saya nyatakan sebagai "jika Anda menyentuh kode, mendokumentasikannya".

Tapi tepatnya; ketika masalah muncul, dan karena Anda harus terbiasa dengan kode untuk memperbaiki bug yang terjadi, saya akan mengatakan Anda harus menggunakan keakraban itu untuk menulis komentar pada kode itu secara khusus; pada dasarnya, motivasi untuk memperbaiki bug pada saat itu memaksa Anda untuk cukup terbiasa dengan kode untuk dapat mendokumentasikannya. Dan untuk alasan itu, saya akan curiga mengikuti cabang yang tidak terkait ATAU mendokumentasikan fungsi yang tidak terkait, karena pada saat itu, jika Anda tidak melakukan pengujian kode secara aktif (untuk memverifikasi perbaikan bug Anda), maka sulit untuk sepenuhnya yakin bahwa Anda mengerti persis apa yang kode lakukan dan mengapa. (Saya tidak masuk ke masalah yang juga bisa sulit untuk mengetahui dengan tepat apa dan mengapa kode melakukan apa yang dilakukannya bahkan ketika menguji perbaikan bug; Anda

Pendekatan ini harus cenderung memaksimalkan keakuratan, dengan pengorbanan kecepatan keseluruhan, tetapi tidak memengaruhi kebutuhan Anda untuk mempertahankan kode terlalu parah pada saat yang sama. Jika tugas perbaikan bug Anda kecil, tentu saja, Anda dapat menjelajah ke "wilayah yang tidak dikenal" dan mulai mendokumentasikan di sana, tetapi jika Anda (seperti kebanyakan dari kita) tidak dapat menemukan cukup waktu dalam sehari untuk memperbaiki kode dan mendokumentasikannya, ini adalah kompromi yang bagus.

Satu hal yang perlu diperhatikan juga; Anda harus memiliki dokumentasi eksternal yang baik. Anda mengatakan bahwa kode Anda tidak memiliki referensi ke dokumentasi eksternal; Saya harap demi Anda bahwa dokumentasi eksternal semacam itu ada. Jika tidak, saya akan benar-benar menulis dokumentasi eksternal itu sebagai prioritas utama Anda; sesuatu pada tingkat spesifikasi fungsional, saya pikir, sangat penting untuk semua proyek perangkat lunak besar. Alasannya adalah bahwa spesifikasi fungsional, atau dokumentasi tingkat tinggi dari formulir itu, dapat membantu mencegah "fitur creep" atau "fitur drift" dalam perangkat lunak apa pun; dan penyimpangan fitur (khususnya) dapat merusak dokumentasi karena dapat menyebabkan dokumentasi menjadi usang. (Saya mendefinisikan creep fitur sebagai penambahan progresif (dan menjengkelkan) fitur ke perangkat lunak; drift fitur, di sisi lain, adalah tempat serangkaian tindakan yang oleh perangkat lunak lambat berubah seiring waktu. Creep fitur bersifat ADDITIVE, artinya biasanya melibatkan peningkatan set fungsionalitas perangkat lunak; fitur drift, di sisi lain, adalah zero-sum; satu per satu, satu fungsi tepi terdefinisi untuk melakukan sesuatu yang berbeda, sampai perangkat lunak melakukan sesuatu yang sama sekali berbeda dari yang semula dimaksudkan. Penyimpangan fitur jarang terjadi, tetapi MATI untuk dokumentasi.)

Paul Sonier
sumber
Bisakah Anda tahu lebih banyak tentang penyimpangan fitur? Saya mengerti bahwa ini mematikan untuk dokumentasi; karena dokumentasi dan perangkat lunak cenderung menyimpang. Tetapi apakah fitur drift sesuatu yang harus dihindari? Sisi positifnya adalah bahwa perangkat lunak berkembang dengan perubahan persyaratannya. Kita dapat membuat desain kita memperhitungkan fitur: arsitektur bottom-up ditambahkan untuk mengarah pada peranti lunak yang dapat diubah: misalnya Emacs dan TeX memiliki arsitektur atas. Apa saja aspek buruk dari pergeseran fitur untuk perangkat lunak?
Kasper van den Berg
4

Satu aplikasi yang saya kembangkan bersama selama dua tahun memiliki kekurangan dokumentasi yang serius. Pada titik tertentu menjadi jelas bahwa kami akan mengirimkan aplikasi ke pengembang lain yang akan memeliharanya sejak saat itu, jadi kami harus mendokumentasikan kodenya.

Untuk menangani ruang lingkup raksasa dari proses dokumentasi, saya akan mencoba dan mendokumentasikan semua kode dalam fitur tertentu atau bagian dari aplikasi pada hari tertentu. Saya tidak memiliki pola tertentu, tetapi desakan untuk melakukan beberapa hal setiap hari, dan mendapatkan rasa penyelesaian dengan mendokumentasikan seluruh file atau bagian dari aplikasi setiap hari.

Butuh berbulan-bulan untuk mendokumentasikan seluruh aplikasi, tetapi dalam setengah jam (maks) sehari itu tidak pernah benar-benar memakan jadwal proyek dan menghindari banyak kebosanan yang sejalan dengan dokumentasi.

Kami menggunakan dokumentasi XML dalam C #, dan menyediakan cukup fitur dan struktur untuk membuat dokumentasi mudah. Bahkan jika Anda tidak mendokumentasikan aplikasi C #, pola memiliki ringkasan pendek pertama diikuti oleh komentar sangat tidak berguna.

NigelTufnel
sumber
3

Saya akan mendokumentasikan ketika saya menambahkan / memodifikasi kode. Selain itu saya juga akan mendokumentasikan API publik atau antarmuka antar modul. Jika Anda mendokumentasikan semua kode, Anda mungkin tidak melihat ROI untuk waktu yang dihabiskan. Mungkin bermanfaat untuk menggunakan sesuatu seperti wiki untuk mengatur dokumentasi eksternal saat Anda mengembangkannya. Dokumen paling berguna yang saya rujuk ketika saya memulai proyek terakhir saya adalah dokumen arsitektur. Ini termasuk informasi tentang teknologi yang digunakan dan memberikan pandangan tingkat tinggi tentang bagaimana aplikasi itu berlapis.


sumber
2

Saya akan menggunakan komentar Doxygen. Doxygen memiliki lebih banyak format output yang kebanyakan format gratis lainnya dan mudah dipelajari.

Anda bahkan dapat mempertimbangkan untuk menyewa kontraktor untuk melakukan ini, karena sebagian dari kita melakukannya untuk mencari nafkah. Namun, dengan pilihan ini Anda masih harus berkomitmen untuk meninjau dokumen.

Teknik umum lainnya adalah untuk menetapkan pengembang baru untuk mendokumentasikan kode. Kemudian mintalah setiap orang baru melewatinya saat mereka bangun dengan kecepatan. Ketahuilah bahwa beberapa devs memandang ini sebagai mendapatkan saluran akar - hanya diperlukan dalam kasus langsung, LOL.

SnoopDougieDoug
sumber
1

Sebelum Anda mulai mendokumentasikan apa pun, kembangkan standar. Ini bisa sesederhana memastikan Anda menulis beberapa baris di atas fungsi atau kelas header ke sesuatu yang lebih resmi dan verbose (seperti javadoc). Sebelum siapa pun dapat memeriksa kode, dokumentasinya harus memenuhi standar itu.

Apa yang saya temukan berfungsi dengan baik adalah menambahkan komentar yang ditulis dengan baik sebelum header fungsi ke fungsi yang saya buat yang sebelumnya tidak didokumentasikan, dan menambahkan komentar sebaris untuk apa pun yang saya tambahkan. Anda ingin menghindari mendokumentasikan kode yang belum Anda sentuh. Lebih buruk memiliki komentar buruk daripada tidak ada komentar, dan jika Anda mendokumentasikan ini dengan 'cepat', Anda mungkin akan menulis komentar buruk.


sumber